Skip to content

ApprovalRefusalLift

ApprovalRefusalLift = { description: string; origin: "session" | "persisted"; outcome: "lifted"; stillConfigured: boolean; stillSaved: boolean; } | { description: string; outcome: "configured"; } | { count: number; index: number; outcome: "unknown"; }

Defined in: _worktrees/docs-release/gaunt-sloth/packages/core/src/config/shell-policy.ts:1327

[[EXT-107]] — what /approvals undeny <n> did, so the notice describes what actually happened rather than what was asked for.

stillConfigured is the case that would otherwise mislead: a command can be refused by a saved entry and by a line in approvals.deny, and lifting the first leaves the second refusing it. Reporting the removal without saying so would tell the user they had lifted a refusal that is still in force.

stillSaved is the same failure one layer down ([[EXT-149]]): the lift is real for this session and the file rewrite that was meant to make it permanent did not land, so the entry returns in the next session. It is the difference between lifted and lifted for good, and the store is the only thing that knows which happened.

{ description: string; origin: "session" | "persisted"; outcome: "lifted"; stillConfigured: boolean; stillSaved: boolean; }

description: string

origin: "session" | "persisted"

outcome: "lifted"

stillConfigured: boolean

Whether the user’s own approvals.deny still matches this entry.

stillSaved: boolean

Whether the project’s saved-refusals file still holds this entry — true only when the removal could not be written, which is what brings it back in the next session.


{ description: string; outcome: "configured"; }


{ count: number; index: number; outcome: "unknown"; }