[macOS][Codex App][Plugins/Hooks] Removed plugin Stop hook keeps running until full app restart

Open 💬 1 comment Opened Aug 13, 2026 by 1320209572
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

What version of the Codex App are you using (From “About Codex” dialog)?

26.803.41515 (build 6321)

What subscription do you have?

Pro

What platform is your computer?

Darwin 25.4.0 arm64 arm

What issue are you seeing?

Summary

After a plugin that provides lifecycle hooks was removed, an already-running
Codex Desktop session continued invoking the plugin's previously loaded
Stop hook.

The disposable plugin source directory and its launcher had already been
removed. Nevertheless, after every subsequent assistant response, Codex tried
to execute the deleted launcher again and displayed the same ENOENT error.

The stale hook stopped running only after I fully quit and restarted Codex
Desktop.

Observed error

The original path has been redacted:

python: can't open file '/private/tmp/[REDACTED_PLUGIN_ROOT]/[REDACTED_PLUGIN]/recall_gate_a_launcher.py': [Errno 2] No such file or directory

The same error was emitted repeatedly by the cached Stop hook after subsequent turns.

Important context

The same error was emitted repeatedly by the cached Stop hook after
subsequent turns.
Important context
The plugin hook command referenced a launcher under a disposable local
marketplace directory. I understand that relying on an ephemeral absolute path
was a defect in the plugin packaging.
The Codex App behavior I am reporting is separate: after the plugin was
removed and its source directory was cleaned up, the active Desktop process
continued executing the previously loaded hook without warning that a restart
was required.
This left the plugin in a confusing partially removed state:
The plugin and its source directory had been removed.
The current Desktop process still invoked its old Stop hook.
The same missing-file error appeared after every response.
A full Codex Desktop restart was the only way to clear the stale hook.
Impact
Removing a plugin does not appear to fully deactivate its hooks in existing
Desktop sessions.
Users receive repeated hook errors after every turn.
The UI does not explain that a full app restart is required.
It is unclear whether other capabilities from the removed plugin remain
active in memory.
Workaround
Fully quit Codex Desktop, make sure the process has exited, and reopen it.
Related issue
This may be related to hook-registry reload behavior discussed in:
https://github.com/openai/codex/issues/17636

What steps can reproduce the bug?

What steps can reproduce the bug?

1. Create or install a local Codex plugin that provides a command-based
   `Stop` hook.

2. Enable the plugin and trust its hooks.

3. Start a new task in Codex Desktop and confirm that the plugin's `Stop` hook
   runs after a response.

4. Keep Codex Desktop running and keep the existing task open.

5. Remove the plugin and its local marketplace entry, then clean up the
   disposable plugin source directory containing the hook launcher.

6. Send another message in the existing task and wait for the response to
   finish.

7. Observe that Codex Desktop still invokes the removed plugin's cached
   `Stop` hook and reports that the launcher file no longer exists.

8. Send another message. Observe that the same stale-hook error is emitted
   again.

9. Fully quit Codex Desktop and reopen it.

10. Observe that the stale hook is no longer invoked after the restart.

No account credentials, network access, or external services are required to
reproduce this behavior.

### What is the expected behavior?

After a plugin is removed or disabled, its hooks should not continue running
for subsequent events.

Any of the following behaviors would be acceptable:

1. Codex invalidates or rebuilds the effective hook registry when the plugin is
   removed or disabled.

2. Codex keeps the plugin files alive until every session using its loaded
   hooks has ended, then safely removes them.

3. If live hook unloading is intentionally unsupported, Codex clearly informs
   the user that a full application restart is required before plugin removal
   is complete.

4. If a previously loaded plugin hook can no longer be resolved, Codex disables
   that stale handler after a bounded failure instead of reporting the same
   missing-file error after every turn.

The app should not silently remain in a state where the plugin appears removed
but its cached lifecycle hooks continue executing.

### Additional information

I would be happy to provide a focused regression test, additional diagnostics,
or a potential implementation outline if that would help.

I understand that unsolicited pull requests are not accepted and will wait for
an explicit maintainer invitation before submitting any code changes.

View original on GitHub ↗

1 Comment

github-actions[bot] contributor · 15 days ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #38307

Powered by Codex Action