intership
What it does: Cosmetic-only plugin. A SessionStart hook (hooks/session-start.sh) reads data/ships.txt, applies canonical/generated filters from data/config.json, and writes spinnerVerbs = {“mode”:“replace”,“verbs”:[…]} into ~/.claude/settings.json (jq, with a python3 fallback; fail-open via trap ‘exit 0’ ERR). One slash command /intership:setup offers interactive customization (filter by book, add/remove ships, toggle source sets). data/generator-prompt.md is a v6 prompt for generating more Banksian names. A structural pytest suite exists. Net effect: replaces Claude Code’s ‘Thinking…’ spinner verbs with Iain M. Banks Culture ship names. Registers zero MCP tools, zero subagents.
Rationale: Mature, single-purpose, intentionally cosmetic (‘joy in the waiting experience’ per PHILOSOPHY.md). It is well-structured (hook + command + curated data + generator prompt + structural tests), bash-3.2 compatible, fail-open on error, and deduplicates input. SOTA agentic findings simply do not apply to a static spinner-verb writer — forcing modernization here would be miscalibrated. However the code surfaced two real doc/behavior drifts worth a quick fix: (1) the SessionStart hook hardcodes “mode”:“replace” (session-start.sh line 73) while both README and setup.md step 4 advertise a ‘replace vs append’ toggle that the hook never honors and config.json has no key for — the append mode is documented vanity; (2) README, AGENTS.md, and PHILOSOPHY.md all state ‘237 names (56+181)’ but the deduped count is 253 (56 canonical + 197 generated). These are small, in-session fixes, not a modernization.
SOTA gap: none — the 2025-2026 frontier themes (orchestration topology, multi-tier agent memory, MCP tool-selection-at-scale/progressive disclosure, context engineering, eval reliability, security sandboxing) are categorically out of scope for a static cosmetic spinner-verb writer. The only tangential SOTA touchpoint is the agent supply-chain/skill-poisoning finding (a SessionStart hook with write access to global ~/.claude/settings.json is the flagged surface class), but intership’s write is narrow, single-key, fail-open, and operates on human-curated text — actual risk is minimal and does not justify modernization.
Redundancy: No functional overlap. AGENTS.md correctly delineates: intername = agent identity naming, interline = statusline, intership = cosmetic spinner verbs. Each owns a distinct UI surface. The only shared resource is that intership and other UI plugins both write to ~/.claude/settings.json, which is a last-writer-wins coordination hazard on a global file (already acknowledged in AGENTS.md Known Constraints) but not capability redundancy.
Actions:
- Resolve the replace/append drift: either implement an append mode (read a ‘mode’ key from config.json and pass {“mode”: $mode} in session-start.sh line 73) or, if append is unwanted, remove the ‘Toggle mode’ option from setup.md step 4 and the README ‘replace to append’ claim so docs match the hardcoded replace behavior.
- Correct the stale name count: update README.md, AGENTS.md, and PHILOSOPHY.md from ‘237 (56 + 181)’ to the actual deduped 253 (56 canonical + 197 generated), or add a tiny test/CI assertion so the count can’t silently drift again.
- Add a structural test asserting the documented name count matches grep -vc ’^#’ data/ships.txt (deduped), preventing future README/data divergence.
- Optional hardening for the shared-settings write: have session-start.sh skip the jq write when the existing spinnerVerbs verbs array is byte-identical, to avoid needless rewrites of the global ~/.claude/settings.json each session and reduce the last-writer-wins window with other UI plugins.