Skip to content

Permission gate: honor .claude/settings.json allow/ask/deny, serializ… - #17

Open
Revmagi wants to merge 1 commit into
jaredrhod:mainfrom
Revmagi:settings-json-auto-allow
Open

Permission gate: honor .claude/settings.json allow/ask/deny, serializ…#17
Revmagi wants to merge 1 commit into
jaredrhod:mainfrom
Revmagi:settings-json-auto-allow

Conversation

@Revmagi

@Revmagi Revmagi commented Aug 30, 2026

Copy link
Copy Markdown

…e concurrent asks, exit cleanly on hangup

Reads, lookups and other tools already covered by an "allow" rule in .claude/settings.json (user, project, and project-local) now skip the spoken permission ask entirely; a "deny" rule blocks silently; everything else still asks out loud as before.

A second tool call needing a decision while one is already pending used to overwrite the first's pending future, orphaning it to time out no matter what the user said. An asyncio lock now serializes concurrent asks so only one question is ever live at a time.

Two remaining QUIT_PHRASES comparisons still used text.lower() instead of _norm_speech(), missed by an earlier pass; fixed to match.

asyncio.run()'s own shutdown (cancelling stray tasks, closing the default executor) can hang on native-library threads (torch/kokoro) after our own cleanup is already done; os._exit(0) skips that teardown on both the normal and KeyboardInterrupt exit paths.

…e concurrent asks, exit cleanly on hangup

Reads, lookups and other tools already covered by an "allow" rule in
.claude/settings.json (user, project, and project-local) now skip the
spoken permission ask entirely; a "deny" rule blocks silently;
everything else still asks out loud as before.

A second tool call needing a decision while one is already pending used
to overwrite the first's pending future, orphaning it to time out no
matter what the user said. An asyncio lock now serializes concurrent
asks so only one question is ever live at a time.

Two remaining QUIT_PHRASES comparisons still used text.lower() instead
of _norm_speech(), missed by an earlier pass; fixed to match.

asyncio.run()'s own shutdown (cancelling stray tasks, closing the
default executor) can hang on native-library threads (torch/kokoro)
after our own cleanup is already done; os._exit(0) skips that teardown
on both the normal and KeyboardInterrupt exit paths.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant