Repository navigation
fix(permission): ask once when approving a worker's frozen call - #1567
TheGreatAxios merged 1 commit into
Conversation
TheGreatAxios
left a comment
There was a problem hiding this comment.
Fleet review verdict: REQUEST CHANGES
PR: #1567 — fix(permission): ask once when approving a worker's frozen call (CL-10768)
Convergence: swarm → defect / quality / solve convergence → all three converged request-changes.
Blocker — confirmed, must fix
Operator approval of a declined worker's frozen call is vetoed by the stale decline cache.
- The
approve_worker_callpath reachesPermissionGate.evaluateApprovedWorkerCall(frozenCall). - That seam answers an ordinary ask directly, but it consults the denial-aware
decide()first, so a cached decline from the same turn still returns{ allowed: false }. - Verified with a temporary repro (decline → cached denial; approve-via-seam → still denied;
clearDenials()→ allowed). Temporary test deleted; no permanent edits made.
Net effect: an operator's approval is converted into a denial, and the worker stays blocked until the denial cache clears.
Required change to merge
Clear / override the cached decline on the approval path (approval supersedes a prior decline), while keeping the cache as a same-turn retry guard only.
Why it matters
The PR's core success criterion — approving a pending worker call once — is unachievable after a decline in the same turn.
Verification status
- Unit: approve-worker-call suite green; decline-then-approve repro confirmed the defect.
- Live QA: not rerun here (inference credentials unavailable in the swarm environment).
The approve_worker_call prompt shows the worker's frozen call and prompts on every use: it offers no standing grant, and a saved rule for it is ignored. On the top-level parent, approving it answers the frozen call's ordinary ask, so the operator is asked once per worker action. A forced ask (a sensitive or restricted target, or a plugin-policy ask) still prompts on its own, and a deny still blocks. A nested orchestrator's approve_worker_call runs without an operator prompt, so there the frozen call keeps its full evaluation.
84130e2 to
5cf5e9e
Compare
|
Operator approval of a declined worker's frozen call is vetoed by the stale decline cache: fixed. |
|
Resolved findings at
|
TheGreatAxios
left a comment
There was a problem hiding this comment.
Re-reviewed at 5cf5e9e. Approving a frozen worker call now supersedes a same-turn cached decline, and the decline still blocks an unapproved retry. Approving.
|
Triage: Pass No changes needed from you. A maintainer will review this pull request. |
Summary
approve_worker_callprompt shows the worker's frozen call (tool, arguments, and which worker) and prompts on every use. It offers no standing grant, and a saved rule for it is ignored with a warning in the log.approve_worker_callruns without an operator prompt, so its frozen call keeps full evaluation.Verification
bun run checkpasses (lint, typecheck, dead exports, build, 9468 tests)codex/plus/gpt-5.6-terrawith this commit stacked:approve_worker_callprompted on 6 of 6 uses; 2 ordinary worker actions needed one prompt each; 3 commands touching~/.corbitsraised the sensitive-path second prompt. Details are on the Linear issue.Fixes CL-10768