Skip to content

Commit f1aceed

Browse files
committed
chore(spec): classify minApprovals' omitted threshold in the empty-state registry
Making the omitted-threshold contract explicit put a permissive-shaped sentence in front of the empty-state scanner ("Omitted ⇒ all resolvable approvers …"). The gate is right to demand a decision, and the decision is `closed`: an omitted threshold lands on the STRICTEST reading — every resolvable approver under `quorum` — so careless authoring lands on least privilege, not on the widest grant. Registered with the runtime enforcement site as evidence rather than reworded around the scanner. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GDA48PuRFrHyRfdkBz8m21
1 parent acaeaa5 commit f1aceed

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

packages/spec/scripts/liveness/empty-state-registry.mts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,16 @@ export const EMPTY_STATE_REGISTRY: EmptyStateEntry[] = [
117117
'packages/core/src/security/resolve-authz-context.ts (resolveAuthzContext.hasPlatformAdminGrant — the single source of truth) and packages/plugins/plugin-security/src/explain-engine.ts (the identical predicate, replicated so the panel cannot overstate)',
118118
},
119119

120+
{
121+
file: 'packages/spec/src/automation/approval.zod.ts',
122+
property: 'minApprovals',
123+
semantics: 'closed',
124+
rationale:
125+
"The approval threshold of a `quorum` / `per_group` node, and a case where the permissive-looking word is the restrictive one. Omitted under `quorum` the runtime requires EVERY resolvable approver — the threshold falls back to the resolved approver count, so a node whose author never wrote the key blocks until all of them sign, the least-privilege direction rather than the widest. Under `per_group` omission means one approval per group, and every group must still reach it. The `all` in the declared text therefore names APPROVERS REQUIRED, never access granted. Registered rather than reworded around the scanner because that sentence is the only place an author learns the omitted threshold is not 1 — which is precisely the drift this classification exists to keep visible.",
126+
evidence:
127+
'packages/plugins/plugin-approvals/src/approval-service.ts (ApprovalService.isApprovalSatisfied — the omitted-threshold fallbacks and their clamp to the resolvable count)',
128+
},
129+
120130
// ---- Scope selectors ---------------------------------------------------
121131

122132
{

0 commit comments

Comments
 (0)