feat: verify devin CLI as a harness adapter - #198
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Add devin CLI (v2026.8.18) as a firstmate harness adapter, empirically
verified via a supervised scout task. All supervision primitives work:
detection, locking, spawning, turn-end signaling, busy detection,
composer idle detection, interrupt, exit, and skill invocation.
Changes:
- fm-harness.sh: detect devin via process ancestry; fix basename dash
bug (comm may start with "-", e.g. "-zsh") by using ${comm##*/}
- fm-lock.sh: add devin to HARNESS_RE; same basename fix
- fm-spawn.sh: devin launch template (--prompt-file + --permission-mode
dangerous) and .devin/hooks.v1.json Stop hook for turn-end signaling
- fm-tmux-lib.sh: FM_TMUX_COMPOSER_IDLE_RE_DEFAULT with devin placeholder
patterns (devin uses RGB color, not SGR 2 dim, for placeholder text)
- harness-adapters skill: verified devin knowledge section
6ae9fdf to
d8b6146
Compare
|
thanks for this. quick note on process - i require PRs to come through no-mistakes, which is why the "PR must be raised via no-mistakes" check is red here (this was opened directly). the reason i ask for it: no-mistakes runs review, tests, lint, and docs on your branch before the PR is opened, so contributions arrive already validated. that keeps the quality bar high and keeps me from having to hand-review every change - i maintain this solo, so it's the only way i keep up. can you re-raise it through no-mistakes? running the pipeline on your branch opens/updates the PR through the gate and turns that check green. the change looks useful, it just needs to come through that path. ping me if the setup gives you trouble. |
Summary
Changes
basenamedash bug (commmay start with-, e.g.-zsh) by using${comm##*/}HARNESS_RE; samebasenamefix--prompt-file+--permission-mode dangerous) and.devin/hooks.v1.jsonStop hook for turn-end signalingFM_TMUX_COMPOSER_IDLE_RE_DEFAULTwith devin placeholder patterns (devin uses RGB colorESC[38;2;124;124;124m, not SGR 2 dim, for placeholder text)Key findings
Devin renders its composer placeholder text ("Ask Devin to build features...") using a dark 24-bit RGB color, not the SGR 2 dim/faint attribute that claude uses. The dim-aware ghost stripper in
fm-tmux-lib.shonly drops SGR 2 runs, so it cannot catch devin's placeholder. The newFM_TMUX_COMPOSER_IDLE_RE_DEFAULTprovides the targeted backstop.Devin reads Claude Code-compatible hooks from
.devin/hooks.v1.json, where the hooks object IS the entire file (no"hooks"wrapper key). TheStopevent fires at every turn boundary.Test plan
bash tests/fm-composer-ghost.test.sh- all 9 assertions passdevin-verify-4q, confirmed turn-end hook fires, busy detection works, composer idle detection works, worktree isolation guard passesbash -nsyntax check on all modified scripts