Skip to content

feat(web): show analysts no control the API refuses them - #2552

Merged
Makisuo merged 10 commits into
observer/shellfrom
observer/read-only-pages
Nov 13, 2026
Merged

Makisuo merged 10 commits into
observer/shellfrom
observer/read-only-pages

Merge branch 'observer/shell' into observer/read-only-pages

ebf5352
Select commit
Loading
Failed to load commit list.
Maple Review Bot / Maple / review succeeded Nov 13, 2026 in 3m 30s

Confidence 10/10 · No issues found

🟢 Confidence 10/10 · safe to merge. All 59 files read; gates match the domain permission table and every page that reads grants fetches them, only the brief pre-session window differs from before.
no findings · tests covered · risk medium

Hides the dashboard's write controls wherever the viewer's grants lack the matching permission: errors list and issue, incident and anomaly pages, status page editor, investigations list. The gates read the same domain permission table the API enforces, and the new scene tests pin both the analyst and member views.

  • Errors list and issue drop every error_issues:triage control, with x/s/p inert.
  • Incident and anomaly pages gate acknowledge, resolve, link and investigate on incidents:respond and investigations:run.
  • Status page editor hides post, update, resolve and delete behind status_page_incidents:post.
  • The policy table gains five member-level permissions the pages now read.

Production impact

Production traffic of the changed files (last 7 days)
File Calls/day Busiest operations
apps/web/src/page/errors/hub/command.ts 20 FetchErrorsSummary 20/day, 0.0% err
What was checked
  • Each page that reads grants also fetches them (FetchHubSession, FetchIssueSession, FetchAnomalySession), so members keep their controls.
  • The new keys match packages/domain/src/policy/permissions.ts:17-21, including the Policy.has spellings in kit/session-grants.ts:39.
  • canTriage is in the memo row's dependency list, so rows re-render when grants answer late (errors/hub/view-list.ts:118).

ebf5352 · Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.