---
path: /trust-safety/maya-anticheat
surface: admin
domain: safety
auth: signed-in (admin) + scope:admin:workspace:trust-safety
source: apps/oshun/admin/src/app/trust-safety/maya-anticheat/page.tsx
status: drafted
last_walked: 'not yet walked'
---

# Safety · Maya anti-cheat moderation

## Purpose

Read-only moderation dashboard for competitive-session reports, appeals,
tribunal votes, and active bans. It projects a deterministic
`MayaAnticheatModerationSystem` snapshot so reviewers can inspect policy shape
and evidence density without implying that the seeded rows are live cases.

## Entry points

- Direct route `/trust-safety/maya-anticheat`.
- Missing session redirects with `reason=missing-session`; a session without
  Trust & Safety workspace access redirects with `reason=forbidden-workspace`.
- Renders inside `AdminShell` with `currentWorkspaceId="trust-safety"`.

## Layout regions

- **Header**: Maya Nexus identity, concise purpose, generated time, and explicit
  “seeded control snapshot” source label.
- **KPIs**: active bans, priority report targets, open tribunal cases, and
  pending appeals.
- **Report aggregation**: suspected target, independent reporters, category mix,
  evidence ids, and priority-review state.
- **Appeals**: appeal/ban identity, scope, reason, state, and reviewer
  resolution.
- **Tribunal**: required vote progress, per-reviewer verdicts, and final
  outcome.
- **Active bans**: player, scope, reason, issue/expiry times, and evidence.

## States

- [ ] **Authorized** — exact seeded dashboard counts and all four evidence
      sections render.
- [ ] **Missing session** — protected data does not render before redirect.
- [ ] **Forbidden workspace** — sessions outside the Trust & Safety scopes are
      denied before dashboard creation.
- [ ] **Priority aggregation** — independent-report threshold is exposed in both
      row data and visual treatment.
- [ ] **Pending / resolved appeal** — reviewer identity appears only when a
      resolution exists.
- [ ] **Open / decided tribunal** — vote count and verdict remain explicit.
- [ ] **Mobile** — all tables scroll within their wrappers while the page itself
      remains overflow-free.

## Interactions

- [x] The dashboard is intentionally read-only; no row or button suggests that a
      reviewer can issue a ban, resolve an appeal, or cast a vote here.
- [ ] Table and list traversal announces headers, verdicts, reviewer identity,
      dates, and evidence in a coherent reading order.

## Data & contracts

- **Reads**: `createSeedMayaAnticheatDashboardData`, which instantiates
  `MayaAnticheatModerationSystem` from `@maya/anticheat`, submits seeded
  reports, registers reviewers, opens tribunals, casts votes, issues bans, and
  creates appeals before taking the snapshot.
- **Writes / realtime / persistence**: none.
- **Injection seam**: `bindMayaAnticheatDashboardLoader` can replace the seeded
  loader in-process; no production binding is visible in the route.

## Cross-references

- Dashboard:
  `apps/oshun/admin/src/app/trust-safety/maya-anticheat/MayaAnticheatModerationDashboard.tsx`
- Seed projection:
  `apps/oshun/admin/src/app/trust-safety/maya-anticheat/data.ts`
- Unit coverage:
  `apps/oshun/admin/src/app/trust-safety/maya-anticheat/maya-anticheat-dashboard.test.tsx`
- Browser coverage:
  `apps/oshun/admin/e2e/maya-anticheat-moderation-dashboard.spec.ts`

## Open questions / known gaps

- [ ] Replace the module-level loader seam with a tenant-aware BFF read and
      explicit loading, empty, unavailable, and stale states.
- [ ] Keep adjudication mutations on a separately scoped, rationale-gated
      workflow with immutable audit evidence rather than adding casual row
      actions to this overview.
