You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- spec: ActionSchema gains `requiredPermissions: string[]` (mirrors App/Object).
- runtime: http-dispatcher.handleActions enforces it BEFORE executing — resolves
the action def from the object schema and rejects (403) when the caller's
systemPermissions don't cover requiredPermissions. isSystem bypasses; an
unauthenticated caller (no caps) is denied. One declaration gates both surfaces
(objectui ActionRunner derives the UI hide/disable from the same field — separate
PR), removing the "UI-gated but server-open" footgun.
- liveness ledger: classify action.requiredPermissions (live). api-surface unchanged.
- Tests: spec (+2) + full-dispatcher gate (+5: deny/allow/system-bypass/ungated/anon).
Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
"note": "ADR-0066 D4 dual-surface action gate. Server is source of truth: handleActions rejects (403) when the caller's systemPermissions don't cover action.requiredPermissions; objectui ActionRunner derives the same UI hide/disable. Unit-proven in packages/runtime/src/http-dispatcher.test.ts + packages/spec/src/ui/action.test.ts."
0 commit comments