Keeping it honest
What it cannot see
The list that costs you when nobody writes it down. Measured on 30 August 2026.
A harness is not a surface. The same agent reaches this Mac through several programs, and they do not all speak to the panel in the same way, so the honest unit is the surface rather than the vendor.
| Surface | Discovered | State it can show | A click raises |
|---|---|---|---|
| Claude Code in VS Code | yes | everything | the window, and the tab |
| Claude Code in a terminal | yes | everything | the tab |
| Claude Code over an ssh tunnel | yes | everything | the Remote-SSH window |
| Claude desktop, local | index and transcript | derived: never amber, never red | the app |
| Claude desktop, cloud | no | ||
| Codex, command line | open rollout | hooks; never red | the tab |
| Codex in VS Code | open rollout | hooks; never red | the window |
| Codex in the ChatGPT app | open rollout | presence only | the app |
Codex has no error event
Not StopFailure, not Error, not TurnFailed. Checked against its published event table rather than assumed.
A turn that fails simply stops emitting hooks, and silence does not distinguish a crash from a model thinking for a long time. So a Codex row never turns red, and every card on a Codex row carries that line.
Codex says what it is asking for, and Claude Code does not
That difference is this app's doing rather than a difference between the two agents. Both publish a permission event carrying the tool and its arguments. What differs is which hooks LampBoard is willing to register.
On Claude Code the amber state already arrives through a passive notification, so registering the hook that decides would buy only the text of the question. Codex has no such passive notification, so refusing the same hook there would not cost a sentence, it would cost the amber state itself. It is registered there, and the command comes with it.
Only five fields are ever shown: command, file_path, path, url, description. A patch's input carries the contents of the file being written, and this panel floats above screens that get shared.
A Codex session is found, not announced
Codex inside the ChatGPT app registers the hooks, marks them trusted, runs a whole session and sends nothing at all. Measured here, with eight events configured and not one line in the log.
So the evidence runs the other way: a live Codex process holds its rollout file open, that file says which session and which folder, and the binary behind the process says which surface. Nothing has to be sent.
An open rollout is a conversation loaded, not a model working. The editor extension was seen holding one open whose last record was a year old. A session found this way and never heard from carries presence and focus and no colour it cannot prove.
What an open endpoint is not allowed to do
The route that receives hook signals refuses a token that is present and wrong, and still takes a request with none, for hooks an older version installed without one. Such a signal can change a row's colour, and nothing more.
So everything arriving there is treated as untrusted. The transcript path it carries is opened for reading, so it is accepted only under the agent's own directory, with .. resolved first and a sibling directory whose name merely starts the same refused.
A row cannot be conjured out of nothing either: it needs an editor window open on that folder, or a live session file.