Effective-permissions inspector #57

Closed
opened 2026-07-04 14:52:28 +02:00 by fable-5 · 1 comment
Collaborator

Context

Admins must be able to answer 'what can X actually see/do here?' — load-bearing for trust in the grant system (permissions.md §UI obligations).

Scope

Pond settings tool: pick a member (or 'public'/'signed-in') and optionally a page → show the resolved outcome (read/write/none) with the deciding grant highlighted ('page-level deny on Salaries') and the full decision chain; powered by a dedicated API endpoint returning the resolution trace (extend the shared algorithm with an explain mode).

Acceptance criteria

  • for every worked example from permissions.md the inspector shows the correct outcome AND the correct deciding rule
  • explain mode is pure and unit-tested alongside the algorithm
  • pond admins can inspect only their pond; the endpoint is pond_admin-guarded

Technical notes

  • permissions.md §UI obligations.

Dependencies

Depends on #51, #55.

Size: ~1 day


Conventions: English code/comments, clear human-readable code, no hard-coded UI strings (ADR 0012, add de and en), permission checks only via the shared guard (docs/architecture/permissions.md). Read the referenced ADRs before starting.

## Context Admins must be able to answer 'what can X actually see/do here?' — load-bearing for trust in the grant system (permissions.md §UI obligations). ## Scope Pond settings tool: pick a member (or 'public'/'signed-in') and optionally a page → show the resolved outcome (read/write/none) with the deciding grant highlighted ('page-level deny on *Salaries*') and the full decision chain; powered by a dedicated API endpoint returning the resolution trace (extend the shared algorithm with an explain mode). ## Acceptance criteria - [ ] for every worked example from permissions.md the inspector shows the correct outcome AND the correct deciding rule - [ ] explain mode is pure and unit-tested alongside the algorithm - [ ] pond admins can inspect only their pond; the endpoint is pond_admin-guarded ## Technical notes - permissions.md §UI obligations. ## Dependencies Depends on #51, #55. **Size**: ~1 day --- *Conventions: English code/comments, clear human-readable code, no hard-coded UI strings (ADR 0012, add `de` **and** `en`), permission checks only via the shared guard (docs/architecture/permissions.md). Read the referenced ADRs before starting.*
fable-5 added this to the M5 — Permissions & quotas milestone 2026-07-04 14:52:28 +02:00
fable-5 added the
backend
frontend
auth
labels 2026-07-04 14:52:28 +02:00
Collaborator

Umgesetzt in f5f1310 (Claude Opus 4.8), Pipeline komplett grün (CI + CD: Deploy Test, Smoke, Int-Promotion). Live auf Int verifiziert.

Was #57 liefert

  • shared: Explain-ModeexplainPageCapability liefert die Entscheidungskette (entscheidende Ebene + der einzelne entscheidende Grant) und teilt sich einen Codepfad mit dem booleschen resolvePageCapability (jetzt dünner Wrapper), sodass der Trace nie von echtem Zugriff abweichen kann. Unit-getestet gegen die permissions.md-Worked-Examples (inkl. „Trace-Outcome == boolescher Resolver").
  • api: GET /ponds/:id/effective-permissions?subjectType=&subjectId=&pageId= (pond_admin-gated, nur der eigene Teich) löst als gewähltes Subjekt auf (User mit echtem Site-Admin-Flag / alle Angemeldeten / Öffentlichkeit), optional gegen eine Seite, und liefert read+write-Outcome plus den entscheidenden Grant angereichert um Subjekt-/Scope-Namen.
  • web: EffectivePermissionsInspector in den Teich-Einstellungen — Subjekt + optional Seite wählen → aufgelöstes Lese-/Bearbeiten-Verdikt, die entscheidende Ebene, und die entscheidende Regel als de/en-Satz (nutzt den #55-Satz-Renderer). Für Nicht-Admins ausgeblendet.

Acceptance criteria

  • Für die permissions.md-Worked-Examples zeigt der Inspector das korrekte Outcome UND die korrekte entscheidende Regel (shared-Unit + api-DB-Test durch den Endpoint).
  • Explain-Mode ist pur und wird neben dem Algorithmus unit-getestet.
  • Pond-Admins können nur ihren eigenen Teich inspizieren; der Endpoint ist pond_admin-guarded.

Live-Checks (Int): ben (Editor) → read/write allow (pond-level); public → read deny (default).

Tests: Explain-Unit-Tests; inspector.e2e.db.test.ts (entscheidende Label-Regel, Pond-Basis, Public default-closed, pond_admin-Gating); Browser-Assertion im access-rules-Pack.

Umgesetzt in `f5f1310` (Claude Opus 4.8), Pipeline komplett grün (CI + CD: Deploy Test, Smoke, Int-Promotion). Live auf Int verifiziert. **Was #57 liefert** - **shared: Explain-Mode** — `explainPageCapability` liefert die Entscheidungskette (entscheidende Ebene + der einzelne entscheidende Grant) und teilt sich **einen** Codepfad mit dem booleschen `resolvePageCapability` (jetzt dünner Wrapper), sodass der Trace nie von echtem Zugriff abweichen kann. Unit-getestet gegen die permissions.md-Worked-Examples (inkl. „Trace-Outcome == boolescher Resolver"). - **api**: `GET /ponds/:id/effective-permissions?subjectType=&subjectId=&pageId=` (pond_admin-gated, nur der eigene Teich) löst als gewähltes Subjekt auf (User mit echtem Site-Admin-Flag / alle Angemeldeten / Öffentlichkeit), optional gegen eine Seite, und liefert read+write-Outcome plus den entscheidenden Grant angereichert um Subjekt-/Scope-Namen. - **web**: `EffectivePermissionsInspector` in den Teich-Einstellungen — Subjekt + optional Seite wählen → aufgelöstes Lese-/Bearbeiten-Verdikt, die entscheidende Ebene, und die entscheidende Regel als de/en-Satz (nutzt den #55-Satz-Renderer). Für Nicht-Admins ausgeblendet. **Acceptance criteria** - [x] Für die permissions.md-Worked-Examples zeigt der Inspector das korrekte Outcome UND die korrekte entscheidende Regel (shared-Unit + api-DB-Test durch den Endpoint). - [x] Explain-Mode ist pur und wird neben dem Algorithmus unit-getestet. - [x] Pond-Admins können nur ihren eigenen Teich inspizieren; der Endpoint ist pond_admin-guarded. **Live-Checks (Int):** ben (Editor) → read/write allow (pond-level); public → read deny (default). **Tests:** Explain-Unit-Tests; `inspector.e2e.db.test.ts` (entscheidende Label-Regel, Pond-Basis, Public default-closed, pond_admin-Gating); Browser-Assertion im access-rules-Pack.
Sign in to join this conversation.
No project
No Assignees
2 Participants
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: stwaidele/dorfteich#57
No description provided.