Fields on CreateApprovalInput that select CAPABILITY or ATTRIBUTION, and so
belong to the trusted computing base alone (security-threat-model.md, trust
boundary 6). A request body that names any of them is rejected outright:
connectors IS the minted grant — an approved record's connectors become
the requestContext grant the write gate checks.
runScoped turns a step-less record into a standing grant on every leg.
stepPath, suspendedAt, resumedAt, resumeCount select WHICH leg a
grant mints on. A step-keyed body with no suspendedAt would fall into
grants.ts's legacy decidedAt-after fallback and mint, so rejecting
connectors alone is insufficient — reject the whole set.
requestedBy is the field decide()'s separation-of-duties check compares
against; spoofing it lets one principal approve their own request.
Fields on CreateApprovalInput that select CAPABILITY or ATTRIBUTION, and so belong to the trusted computing base alone (security-threat-model.md, trust boundary 6). A request body that names any of them is rejected outright:
connectorsIS the minted grant — an approved record's connectors become the requestContext grant the write gate checks.runScopedturns a step-less record into a standing grant on every leg.stepPath,suspendedAt,resumedAt,resumeCountselect WHICH leg a grant mints on. A step-keyed body with nosuspendedAtwould fall into grants.ts's legacy decidedAt-after fallback and mint, so rejectingconnectorsalone is insufficient — reject the whole set.requestedByis the field decide()'s separation-of-duties check compares against; spoofing it lets one principal approve their own request.