## Problem
A skill that appears while a session is open — a new `SKILL.md`, a new
symlink into `.agents/skills`, or a link whose target changed — did not
show up in the slash-command completion until the next completed turn.
The app-server sends `skills/changed` for exactly this, and documents it
as "Treat this as an invalidation signal and re-run `skills/list`". The
adapter listed it among the ignored notifications, so nothing re-ran.
The only re-list was the post-turn publish, which is why the skill
eventually appeared — one turn late.
## Change
- `CodexAcpServer` handles `skills/changed` on both the baseline turn
tracker and the prompt subscription, and asks the command registry to
publish for that session.
- `CodexCommands.publishOnSkillsChanged` debounces the publish by 300
ms, so one burst of file changes lists the skills once. The timer is
`unref`'d, and a session that closed in the meantime publishes nothing.
- `CodexEventHandler` gives `skills/changed` its own case instead of
leaving it in the ignored block — the change itself is no session
update.
- The stale comment at the post-turn publish ("Codex sends no
notification for a new skill file.") is corrected; that publish stays as
the catch-all for a notification missed during a turn.
## Tests
Two cases in `CodexAcpClient.test.ts`: a burst of skill changes
publishes once after it settles and publishes again when the list
actually differs; a session that closed while its change settled never
lists.
`npx tsc --noEmit` is clean. The three failures in a full `vitest run`
(`CodexHomeWatcher`) reproduce on untouched `main` on this machine.