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: FieldSchema.requiredPermissions: string[] (passes through Field.* builders).
- plugin-security: a field whose requiredPermissions aren't all held by the caller's
systemPermissions is masked on read and denied on write (AND-gate, strictest-wins
over permission-set field grants). getObjectSecurityMeta now reads per-field
requiredPermissions; foldFieldRequiredPermissions folds unmet ones into the
FieldMasker map as {readable:false,editable:false}, reusing maskResults +
detectForbiddenWrites — no masker signature change.
- liveness: classify field.requiredPermissions (live). api-surface unchanged.
- Tests: spec field (+3) + middleware read-mask/write-deny (+4).
D5 (package-seeded admin-maintainable per-object secure defaults) needs no new
code: stack.permissions already seeds sys_permission_set (incl. per-object +
per-field grants), admin-editable in Setup — it composes with D2 (private) + D1
(capability seeding). cloud sys_license is the worked example. Delegated admin (#9)
remains future per the ADR.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
hidden: z.boolean().default(false).describe('Hidden from default UI'),
556
556
readonly: z.boolean().default(false).describe('Read-only in UI'),
557
+
558
+
/**
559
+
* [ADR-0066 D3] Capabilities required to READ/EDIT this field. A field
560
+
* declaring `requiredPermissions` is masked on read and denied on write unless
561
+
* the caller holds ALL listed capabilities — an AND-gate that is strictest-wins
562
+
* over permission-set field grants. Enforced by plugin-security's FieldMasker.
563
+
*/
564
+
requiredPermissions: z.array(z.string()).optional().describe('[ADR-0066 D3] Capabilities required to read/edit this field (mask on read, deny on write; AND-gate).'),
557
565
system: z.boolean().optional().describe('Auto-injected system/audit field (e.g. created_at, updated_by, organization_id). Tools that surface system fields separately from author-declared business fields should branch on this flag.'),
558
566
sortable: z.boolean().optional().default(true).describe('Whether field is sortable in list views'),
559
567
inlineHelpText: z.string().optional().describe('Help text displayed below the field in forms'),
0 commit comments