[Backlog] Safety tools: Lines & Veils registry and anonymous topic flag #121

Closed
opened 2026-07-14 19:55:06 +00:00 by claude-bot · 2 comments
Collaborator

Context / Motivation

Research/product brief. Quest Board has no safety-tools surface. A campaign-level Lines & Veils registry plus an anonymous concern channel is the standard, low-ceremony toolset for long-running groups. Prior art (conceptual grounding, not code): the TTRPG Safety Toolkit (Kienna Shaw & Lauren Bryant-Monk), the X-Card (John Stavropoulos).

Spec (starting sketch)

Registry

  • SafetyEntry: campaign_id, kind: line (hard limit, never in play) | veil (fade-to-black), text, created_at. GM-editable (add/edit/remove); visible to all campaign members on the campaign page.
  • Anonymous player suggestions: members can suggest an entry anonymously. True anonymity is a schema decision, not a UI promise: the suggestion table stores no author FK and no request metadata — just campaign_id, suggested kind, text, created_at. Document this explicitly in the model docstring so a later "who suggested this" feature can't be bolted on quietly.
  • GM reviews suggestions (accept → becomes a registry entry; dismiss → deleted).

Anonymous concern flag

  • A "flag a concern to the GM" action on the session page (and optionally a bot DM command, e.g. /concern, delivering via DM so nothing appears in channel): free-text, delivered to the GM (web notification/inbox on the campaign page; optionally bot DM to the GM), stored with no identity — same no-author rule.
  • Rate-limit per session per client to blunt abuse without identifying anyone (accept the tension; note it in the issue).

UI placement: campaign page "Safety" panel (registry + suggest box); session page flag button; GM sees pending suggestions/flags with a badge.

Out of scope

  • Enforcement/automation (e.g. scanning transcripts for registry topics).
  • Per-session opt-in consent flows (the project's consent model is standing consent — do not add consent gates).

Open questions

  • Should the pre-session reminder include a "check the safety registry" line when the registry is non-empty (pairs with the recap-in-reminder work)?
  • Does the bot DM path add enough value over web-only to justify the surface (DM permissions, user lookup)?
  • Should flags auto-expire/archive after the session completes?

Acceptance criteria (for when this is pulled)

  • Registry CRUD (GM) + member-visible rendering; suggestions and flags verifiably store no author identity (schema-level test: no author column exists).
  • Anonymous suggestion → GM review → registry entry flow works end to end.
  • Flag reaches the GM without identity in any log line (check request logging).

References

  • webapp/backend/app/routers/campaigns.py:3172-3390 (campaign-scoped panel CRUD pattern to follow)
  • bot/questboard_bot/cogs/sessions.py (slash-command precedent for an optional /concern)
  • CLAUDE.md consent model (standing consent; announcement-only — no consent gates)

Filed from the July 2026 full-project review.

## Context / Motivation Research/product brief. Quest Board has no safety-tools surface. A campaign-level Lines & Veils registry plus an anonymous concern channel is the standard, low-ceremony toolset for long-running groups. Prior art (conceptual grounding, not code): the TTRPG Safety Toolkit (Kienna Shaw & Lauren Bryant-Monk), the X-Card (John Stavropoulos). ## Spec (starting sketch) **Registry** - `SafetyEntry`: `campaign_id`, `kind`: `line` (hard limit, never in play) | `veil` (fade-to-black), `text`, `created_at`. GM-editable (add/edit/remove); visible to **all** campaign members on the campaign page. - **Anonymous player suggestions**: members can suggest an entry anonymously. True anonymity is a schema decision, not a UI promise: the suggestion table stores **no author FK and no request metadata** — just `campaign_id`, suggested `kind`, `text`, `created_at`. Document this explicitly in the model docstring so a later "who suggested this" feature can't be bolted on quietly. - GM reviews suggestions (accept → becomes a registry entry; dismiss → deleted). **Anonymous concern flag** - A "flag a concern to the GM" action on the session page (and optionally a bot DM command, e.g. `/concern`, delivering via DM so nothing appears in channel): free-text, delivered to the GM (web notification/inbox on the campaign page; optionally bot DM to the GM), stored with **no identity** — same no-author rule. - Rate-limit per session per client to blunt abuse without identifying anyone (accept the tension; note it in the issue). **UI placement**: campaign page "Safety" panel (registry + suggest box); session page flag button; GM sees pending suggestions/flags with a badge. ## Out of scope - Enforcement/automation (e.g. scanning transcripts for registry topics). - Per-session opt-in consent flows (the project's consent model is standing consent — do not add consent gates). ## Open questions - Should the pre-session reminder include a "check the safety registry" line when the registry is non-empty (pairs with the recap-in-reminder work)? - Does the bot DM path add enough value over web-only to justify the surface (DM permissions, user lookup)? - Should flags auto-expire/archive after the session completes? ## Acceptance criteria (for when this is pulled) - Registry CRUD (GM) + member-visible rendering; suggestions and flags verifiably store no author identity (schema-level test: no author column exists). - Anonymous suggestion → GM review → registry entry flow works end to end. - Flag reaches the GM without identity in any log line (check request logging). ## References - `webapp/backend/app/routers/campaigns.py:3172-3390` (campaign-scoped panel CRUD pattern to follow) - `bot/questboard_bot/cogs/sessions.py` (slash-command precedent for an optional `/concern`) - CLAUDE.md consent model (standing consent; announcement-only — no consent gates) _Filed from the July 2026 full-project review._
claude-bot changed title from [Backlog] Safety tools: Lines & Veils registry and anonymous topic flag to [Backlog] Safety tools: Lines & Veils registry and anonymous topic flag 2026-07-14 19:55:16 +00:00
Author
Collaborator

Placement decided (owner, 2026-09-15; decision D2 in the surface catalogue, #659):

  • The registry: the lines and veils registry and its anonymous suggestion box get their own "Table rules & safety" entry in the campaign's Contents (catalogue surface CAMP-18). They are visible to every member.
  • The flag: "flag a concern to the GM" is a button in Table mode (TABLE-1, TABLE-2) and on This week (CAMP-1), so it can be reached at the table as well as between sessions.

The no-author-stored rule in this issue is unchanged. Discussions (#654) stays separate, precisely so that rule isn't weakened.

**Placement decided (owner, 2026-09-15; decision D2 in the surface catalogue, #659):** - **The registry:** the lines and veils registry and its anonymous suggestion box get their own **"Table rules & safety"** entry in the campaign's Contents (catalogue surface CAMP-18). They are visible to every member. - **The flag:** "flag a concern to the GM" is a button in **Table mode** (TABLE-1, TABLE-2) and on **This week** (CAMP-1), so it can be reached at the table as well as between sessions. The no-author-stored rule in this issue is unchanged. Discussions (#654) stays separate, precisely so that rule isn't weakened.
Author
Collaborator

Closing: built in lane 7 (#733). Checked against main on 1 Oct.

  • Table rules & safety (CAMP-18): GMs keep lines and veils; every member reads them.
  • Anonymous suggestions and concerns: the table that holds them has no column that could name a sender. Tests check the model, the live schema and the migration, and that no log line (the app's, uvicorn's or nginx's) and no notification row names who sent it. Sending is rate-limited without identifying anyone.
  • The GM's side: a quiet count and a bell row that say nothing of the content; accept a suggestion into the lists in the GM's own words, or dismiss it.
  • The flag is on the session page, in Table mode and on This week; the bot has a private /concern.
  • The lists travel in an export; the queue never does. Nothing expires a submission (D175).

Not built: a line in the pre-session reminder pointing at the lists. This issue raised it as an open question, not a requirement, so it is not filed.

Closing: built in lane 7 (#733). Checked against main on 1 Oct. - **Table rules & safety** (CAMP-18): GMs keep lines and veils; every member reads them. - **Anonymous suggestions and concerns:** the table that holds them has no column that could name a sender. Tests check the model, the live schema and the migration, and that no log line (the app's, uvicorn's or nginx's) and no notification row names who sent it. Sending is rate-limited without identifying anyone. - **The GM's side:** a quiet count and a bell row that say nothing of the content; accept a suggestion into the lists in the GM's own words, or dismiss it. - **The flag** is on the session page, in Table mode and on This week; the bot has a private `/concern`. - The lists travel in an export; the queue never does. Nothing expires a submission (D175). Not built: a line in the pre-session reminder pointing at the lists. This issue raised it as an open question, not a requirement, so it is not filed.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Quest-Board#121
No description provided.