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
* feat(spec,hono): user-level export permission axis (#3544)
Make `export` a user-gated operation, not just "anyone who can list", wiring the
`userExportAllowed` slot reserved in #3391 P1.
- spec: ObjectPermissionSchema gains an optional `allowExport` bit — no default,
so it is a backward-compatible opt-out: unset inherits read (today's
can-list ⇒ can-export), false denies export while keeping read, true grants.
- plugin-hono-server: annotateEffectiveApiOperations derives
userExportAllowed = allowExport !== false and threads it into
resolveEffectiveApiMethods (export ⊆ list ∧ userExportAllowed). When the axis
removes export from an otherwise-open object, that object is now annotated
(effective set minus export) so the client hides Export; an open object with
export still allowed stays unannotated (default-allow).
- Regenerated content/docs/references/security/permission.mdx.
Zero change to the derivation table or the frontend (already consumes the
effective apiOperations). Existing permission sets keep today's behavior.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012L8EfEa157Pe6C73qRnaJH
* chore(spec): classify permission.objects.allowExport in liveness registry (#3544)
The new allowExport property on ObjectPermissionSchema is a governed-type
property and must carry a liveness classification. It is `live` — enforced
end-to-end via the hono /me/permissions annotate (userExportAllowed) → effective
apiOperations → REST export gate + UI. Fixes the "Spec property liveness" gate.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012L8EfEa157Pe6C73qRnaJH
---------
Co-authored-by: Claude <noreply@anthropic.com>
"evidence": "packages/plugins/plugin-hono-server/src/hono-plugin.ts (annotateEffectiveApiOperations: userExportAllowed = allowExport !== false) + packages/spec/src/data/api-derivation.ts (export derives from list ∧ userExportAllowed)",
55
+
"note": "#3544 — user-level export axis over read. Enforced end-to-end: the bit drives userExportAllowed, which removes `export` from the object's effective apiOperations on /me/permissions; the frontend hides Export and the REST export gate 405s. Optional/no-default = backward-compatible opt-out (unset inherits read); `false` denies export while keeping read."
0 commit comments