dorfteich/packages/shared/i18n/de/access.json
Claude Opus 4.8 f5f1310eb2
All checks were successful
CD / Build and push images (push) Successful in 3m14s
CI / Lint, typecheck, test (push) Successful in 2m31s
CI / Auth e2e pack (push) Successful in 3m21s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 9s
CD / Smoke tests against Test (push) Successful in 1m12s
CD / Promote to Int (push) Successful in 11s
Add effective-permissions inspector (#57)
Pond Admins can answer "what can X actually see/do here?" — load-bearing for
trust in the grant system (permissions.md §UI obligations).

- shared: `explainPageCapability` — the resolver's decision chain (deciding
  level + the single deciding grant), sharing one code path with the boolean
  `resolvePageCapability` (now a thin wrapper), so the trace can never diverge
  from real access. Unit-tested against the permissions.md worked examples.
- api: `GET /ponds/:id/effective-permissions?subjectType=&subjectId=&pageId=`
  (Pond-Admin-gated, one pond only) resolves as the chosen subject (a user with
  their real Site-Admin flag, all signed-in users, or the public), optionally
  against a page, and returns the read + write outcome with the deciding rule
  enriched with subject/scope names.
- web: `EffectivePermissionsInspector` in Pond Settings — pick a subject and
  optionally a page → see the resolved read/edit verdict, the level that
  decided it, and the deciding rule spelled out as a de/en sentence (reusing
  the #55 sentence renderer). Hidden from non-admins.
- tests: explain-mode unit tests (worked examples + trace-matches-boolean);
  `inspector.e2e.db.test.ts` (deciding rule on a labelled page, pond-level base
  capability, public default-closed, Pond-Admin gating); a browser assertion in
  the access-rules pack.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwZ4jR4KFAPvpjWevfUGX1
2026-07-10 00:00:27 +02:00

60 lines
2.2 KiB
JSON

{
"title": "Zugriffsregeln",
"description": "Feingranulare Regeln zusätzlich zu den Basisrollen. Die spezifischere Regel gewinnt: eine Regel auf einer Seite schlägt eine auf einem Label, und die schlägt eine für den ganzen Teich.",
"subject": {
"user": "{{name}}",
"authenticated": "Angemeldete Personen",
"public": "Alle (öffentlich)"
},
"ability": {
"reader": "lesen",
"editor": "bearbeiten",
"pond_admin": "verwalten"
},
"scope": {
"pond": "alles in diesem Teich",
"label": "Seiten mit dem Label „{{name}}“",
"page": "die Seite „{{name}}“"
},
"sentence": {
"allow": "{{subject}} darf {{scope}} {{ability}}.",
"deny": "{{subject}} darf {{scope}} nicht {{ability}}."
},
"noRules": "Noch keine Regeln — es gelten nur die Basisrollen.",
"add": {
"title": "Regel hinzufügen",
"subject": "Wer",
"scopeType": "Wo",
"scopeLabel": "Label",
"scopePage": "Seite",
"role": "Recht",
"effect": "Wirkung",
"allow": "Erlauben",
"deny": "Verbieten",
"submit": "Regel hinzufügen",
"pickScope": "Wähle ein Label oder eine Seite.",
"shadowedWarning": "Eine spezifischere Regel für dieses Subjekt entscheidet hier bereits das Gegenteil — diese Regel bleibt womöglich wirkungslos.",
"publicWarning": "Damit werden Inhalte für alle im Internet sichtbar. Bist du sicher?",
"publicConfirm": "Ja, öffentlich machen"
},
"remove": "Entfernen",
"loadError": "Zugriffsregeln konnten nicht geladen werden.",
"inspector": {
"title": "Effektive Rechte",
"description": "Prüfe, was eine Person, alle Angemeldeten oder die Öffentlichkeit hier tatsächlich dürfen.",
"subject": "Wer",
"page": "Auf Seite (optional)",
"wholePond": "Der ganze Teich",
"read": "Lesen",
"write": "Bearbeiten",
"outcome": { "allow": "Erlaubt", "deny": "Verweigert" },
"decidedBy": {
"site-admin": "Site-Admin — umgeht alle Regeln",
"page": "entschieden durch eine Seiten-Regel",
"label": "entschieden durch eine Label-Regel",
"pond": "entschieden durch eine Teich-Regel",
"default": "keine Regel gewährt dies (Standard: verweigert)"
}
}
}