Security fixes are applied to the latest release and the main branch.
Use GitHub’s Security → Report a vulnerability flow to submit a private security advisory. Include reproduction steps, impact, affected versions, and a minimal synthetic fixture when useful.
Do not include real goal databases, thread IDs, access tokens, account details, or unredacted logs. Please allow maintainers time to confirm and fix the issue before public disclosure.
GoalPulse:
- reads the local Codex goal database through
sqlite3 -readonly; - starts a short-lived status-only Codex backend, sends no thread-load request, and closes it before continuation;
- sends a goal-status request only after confirming that the target still has the watched
blockedor explicitly opted-inpausedstate; - routes Turn start to the existing Codex Desktop owner through the current user’s local IPC socket;
- does not answer command, file-change, or other permission prompts on Codex Desktop’s behalf;
- exposes no listening network service and sends no telemetry;
- does not use macOS Accessibility or UI-scripting APIs.
The Codex plugin variant:
- uses the official
UserPromptSubmitandStoplifecycle events; - reads matching Goal rows through Python's read-only SQLite mode;
- stores its own counters under
PLUGIN_DATAand never updates Codex tables; - runs only after the user reviews and trusts its command hook in
/hooks.
GoalPulse executes under the current macOS user and inherits the behavior of the user’s Codex installation. Automatically continued tasks can consume quota and continue actions already permitted for that task. Per-goal retry limits are a safety boundary, not a sandbox.
The local database schema, status-only app-server call, and Desktop IPC protocol are compatibility interfaces, not security boundaries. Treat unexpected messages and schema changes as errors.