feat(types): add devin (Cognition CLI) as an agent type - #197
Conversation
|
Thanks for this — and for running it on real hardware rather than reasoning about it. We want it. I've reviewed the substance and it's the right shape: registry entries plus the existing type machinery, no new subsystems. I checked the Two things in your diff I want to call out, because they're better than the equivalents in our own code:
Both of your findings in #196 are real and are now filed as defects against our code, credited to you:
One ask, and an apology for the cause. The branch is conflicting because we shipped twelve versions today, so it's nine behind. Could you rebase onto current Please drop the I'll merge on green rather than sitting on it. If anything in the rebase looks like our mess rather than yours, say so and I'll take it. |
a5ac8bb to
dc5256b
Compare
|
Rebased onto 0.16.10 — your churn didn't actually touch any of my anchor points, so it re-applied clean. One commit now, no version bump. Two things I hit running it on real hardware since your review: devin blocks on its own workspace-trust prompt on first boot in a fresh workdir, so it now launches with Still draft — I want one clean round-trip on my box before I call it ready. Should be today. |
|
Validated on my box — Ubuntu 24.04, devin 3000.2.17 on a Pro sub. install → auth login → create → send all work. Trust bypass holds (footer shows 'bypass permissions on', boots straight to the composer) and the ❭ marker fix too — sends land instantly now instead of eating the 45s timeout. One caveat worth knowing: Ready for review. |
dc5256b to
6f0247e
Compare
|
Rebased again (0.16.11). My side is scripted now, so re-syncing takes me under a minute — if it goes red again before you get to it, just say so and I'll bump it. |
…— a stray binary on PATH suppressed the install forever (DIVE-2075, fixes #196) (#205) * install: TYPE_INSTALL gates on the exact TYPE_BIN path, not `command -v` — a stray binary on PATH could suppress the install forever (DIVE-2075) Reported by A-MO7SEN (github #196), filed as a defect in our code while adding devin in #197, and hit live during `5dive init` on a box carrying an old npm-global claude. `command -v claude` answers "is something named claude on PATH". The question the recipe has to ask is "is the binary I am about to hand to the systemd unit present" — TYPE_BIN, an exact path. On a box with a stray claude anywhere on PATH the two answers diverge: the gate is satisfied, the recipe no-ops in 0s, ~/.local/bin/claude is never created, and cmd_install fails with "install reported success but $bin still missing". Permanently — the gate can never flip, so retrying `5dive init` or `agent create` cannot recover the box. The codebase already documented the trap on the line directly below claude's, for codex. Same primitive as DIVE-2061, shipped the same morning, where `command -v 5dive` resolved the INSTALLED CLI instead of the bundle under test and graded the wrong artifact. Two instances in one codebase in one day, found independently inside and outside the team, so this sweeps every `command -v` rather than the one line that was reported. claude, antigravity and grok move to the exact-path gate (opencode, hermes, pi and codex already had it). antigravity keeps its DIVE-901 post-install `command -v agy` fallback: there the question genuinely is "where did the installer put it". grok's gate mattered doubly — a suppressed install left ~/.grok/bin/grok absent, so the symlink branch no-oped too and the recipe still exited 0 via its trailing `rm -f`. opencode_catalog and pi_catalog took `command -v` FIRST with TYPE_BIN only as a fallback, so a stray copy on the caller's PATH (root's, usually) would have us validate --model against a different binary's catalog than the agent unit runs. Order reversed; PATH stays as the fallback. tests/type_install_gate_dimension_unit.sh measures the GATE'S OWN DECISION — did the install action run — under two environments per type: stray-on-PATH with TYPE_BIN absent (must install) and TYPE_BIN present (must not). It observes the guard rather than whether a binary appeared, because observing the binary would be defeated by the harness's own stubs. Against the pre-fix header it reds with 3 graded failures naming claude, antigravity and grok while the other 5 recipes stay green; post-fix 8/8 on both environments. Two findings from the sweep are out of this PR's concern and filed separately: DIVE-2080 (`proof scorecard` re-resolves `command -v 5dive` and shells `digest` into the installed bundle, re-opening DIVE-2061 one call deeper) and DIVE-2081 (`--upgrade` reports "upgraded" while 6 of 8 recipes ignore FORCE_INSTALL). * chore(release): 0.16.12 — TYPE_INSTALL guards keyed off TYPE_BIN (DIVE-2075) Assigns the release number and CHANGELOG entry at merge time per CONTRIBUTING; the branch was correctly left unversioned at main's 0.16.11 by its author. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
6f0247e to
2924fb9
Compare
2924fb9 to
c988b4b
Compare
|
Green again on 0.16.22. Third rebase — no complaints, but you might want to know why it keeps happening: the committed bundle means any PR from outside conflicts within an hour or two of being opened, no matter how small the src change is. Mine touches 5 source lines and 44k lines of generated artifact. If it helps, I'm happy to strip the bundle from the commit and let you rebuild at merge — then the diff is just src/ and the README, and it stops going red between when you look at it and when you press the button. Say the word and I'll repush that way. |
lodar
left a comment
There was a problem hiding this comment.
Reviewed properly — sorry it took a day. Two things went wrong on our side and neither is about the code: CI never ran because first-time-contributor workflow approval sat unactioned (approved now), and #196 got auto-closed out from under you when an unrelated fix carried a fixes #196 trailer. Reopened with an explanation.
The work itself is good, and specifically good in ways I want to name because they're not the default for a new-type PR:
TYPE_INSTALLuses an exact-xpath guard rather thancommand -v. You didn't just report that trap in #196, you avoided it here. Landed as DIVE-2075 in #205.TYPE_CHANNELS=0explicit rather than omitted, with the DIVE-2076 note cited. That's the ticket you filed, applied to your own code.TYPE_PROBEis file-presence with the reasoning stated (devin -pspins a full session, too slow for a 5s probe). That's the right call and the comment saves the next person from re-deriving it.- Version-stamped empirical claims (
credentials.tomlsentinel,3000.2.17) rather than claims from docs.
One question, on the only line that carries real risk:
- grep -qE '❯|›|\? for shortcuts|esc to cancel' <<<"${1:-}"
+ grep -qE '❯|›|❭|\? for shortcuts|esc to cancel' <<<"${1:-}"❭ (U+276D) and claude's ❯ (U+276F) are two codepoints apart and render near-identically in most terminal fonts. The collision-free claim is the load-bearing one here, and it's load-bearing in a direction worth being paranoid about: this predicate decides whether we type into a pane. A false positive means we type into something that isn't a chat input — which is exactly the failure you reported in #214, from the other end. If you have a pane sample from the live box, tests/heartbeat_idle_marker_unit.sh takes real pane fixtures with no tmux; adding devin's would make the claim checkable instead of trusted. That's the one thing I'd ask for before merge.
Everything else reads as ready. The config.json seed carrying shell.setup_complete=true so the first-run wizard can't block an unattended session is the kind of detail that usually gets found in production instead of in the PR.
Needs a rebase on current main — rebuild the bundle with ./build.sh rather than resolving the generated 5dive artifact by hand. That conflict is our merge queue serialising on a committed build output (DIVE-2091), not anything you did.
On the type itself: yes. It fits the registry with no new machinery, and shipping it without a telegram bridge is the right scope — say so in the README row and it's honest.
|
Heads-up so you don't chase this: GitHub now shows this as conflicting again. That's the committed Don't rebase just to clear the red. Push whatever you're doing on the review notes, and I'll rebuild the bundle against whatever |
|
Yes — strip the bundle. Please repush that way. That's the right answer and you shouldn't have had to ask twice. Your diff being 5 source lines and 44k lines of generated artifact is the whole problem stated in one sentence, and "the PR goes red between when a maintainer looks at it and when they press the button" is a better description of the failure than the one in our own ticket. I've quoted it into DIVE-2091. To be concrete so you're not guessing at our conventions: drop Three other things I owe you. Your PR has been ready since 13:02 yesterday and nobody said so. You marked it ready, you'd validated it on real hardware, and it sat. lodar said "I'll merge on green rather than sitting on it" and then we sat on it. No excuse worth typing. CI. Workflow approval for outside contributors is a manual tap here, and it wasn't being tapped — several of your pushes have runs stuck at The Reviewed the code substantively in my other comment — one question there about the |
|
Status on the conflicts here, and a split of what's ours vs what needs you. Ours, and we'll handle it: Needs a judgement call, and it's genuinely yours or a maintainer's: Two options, your pick:
Worth knowing: lodar picked devin as the theme for v0.17, so this PR is wanted. It's not sitting because anyone deprioritised it. One caveat I'd rather state than have you discover: I verified the conflict by actually running the cherry-pick, not by trusting a predictor — |
Registry entries (TYPE_BIN/AUTH/INSTALL/PROBE, explicit TYPE_CHANNELS=0 to declare no-bridge intent per DIVE-2076), `agent auth login devin` TTY handoff, init wizard entry, README type-table rows, and 5dive-agent-start launch support: --permission-mode dangerous --respect-workspace-trust false (devin's trust dialog blocks an unattended session on first boot — verified live), cross-provider UNSET_CREDS hygiene, and per-agent credential + config seeding from the shared /home/claude login (config carries shell.setup_complete=true, suppressing devin's first-run wizard). Prompt markers verified live against devin 3000.2.17 on Ubuntu 24.04: composer glyph is ❭ (U+276D), collision-free with claude ❯ / codex › — added to _agent_pane_input_ready and _hb_idle_marker. Closes 5dive-ai#196. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
c988b4b to
579ba7f
Compare
|
Rebased and conflict-resolved for you, pushed to the branch. It's mergeable now and CI is approved and running. Your commit and authorship are unchanged. The conflict turned out to be adjacency, not disagreement — which is the good case, so nothing of yours was dropped. Since you branched, Verified after resolving: your devin block present, main's helpers present, One optional follow-up, and it's a nice loop back to your own report. The helpers that landed in that spot are the fix for your gh#214 — Also worth knowing: lodar picked devin as the theme for v0.17, so this is wanted rather than tolerated. Heads-up on a rough edge that's ours, not yours: force-pushing a rebase resets CI to needs maintainer approval on outside-contributor PRs, so a PR can sit at zero checks looking fine. I approved both of yours by hand. If you ever see no checks at all, that's us, not you — ping and we'll tap it. |
…the glyph lodar asked for a fixture behind the collision-free claim on ❭ (U+276D) vs claude's ❯ (U+276F). Writing it found a worse problem than the one being guarded against, so the marker changed rather than just gaining a test. devin draws ❭ for BOTH the composer AND menu selections — its workspace-trust dialog is literally '❭ 1 Yes, trust <path>'. So a glyph marker doesn't just risk confusion with claude's ❯; it reports a TRUST PROMPT as a chat composer, and the send path then types the next inter-agent message into it. That is the gh#214 failure shape from the other end, which is exactly the direction the review said to be paranoid about. devin now keys off its composer placeholders instead — 'Ask Devin' (idle) and 'Guide Devin' (mid-turn). Both are prose, so no codepoint collision is possible and no menu row can match. Fixtures in tests/heartbeat_idle_marker_unit.sh, from live devin 3000.2.17 panes: idle reads idle and input-ready; mid-turn does not read idle; the trust dialog reads neither; and both cross-checks (devin pane vs claude's marker, claude pane vs devin's) fail as they should. 31 assertions, all passing. Also adopted cred_seed_failed in the devin seed block, per the review note — so a failed devin seed leaves the same breadcrumb every other type now does (DIVE-2137 / gh#214) instead of a stderr line nobody reads. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Fixture added — and you were right to be paranoid about that line, though not for the reason either of us had in mind. Writing the fixture found that the collision I should have worried about isn't ❭ vs ❯ at all. devin draws ❭ for menu selections too — its workspace-trust dialog is literally So the marker is gone rather than tested. devin keys off its composer placeholders now —
Also took the On the bundle: you'd already rebuilt it in your rebase, so I kept it in sync ( Thanks for the rebase and the conflict write-up — 'adjacency, not disagreement' with the verification listed was more than I'd have asked for. |
|
Taking you up on the offer: my push landed zero checks — CI is sitting at needs-approval again. Also gone red on the bundle since main moved, which you said to leave to you, so I have. |
…e rather than resolving 5dive.sha256 by hand) # Conflicts: # 5dive.sha256
# Conflicts: # 5dive.sha256
…287) A seat that inlines the whole fence — <5dive-r:ab12> pong from the seat </5dive-r:ab12> — gets dropped. The extractor requires the opening marker alone on its line (is_marker rejects anything word-like after it), so the reply is discarded and the caller sees a bare timeout. It cannot distinguish 'the seat said nothing' from 'the seat answered and we could not parse it', which is the fail-silent shape of gh#211 and gh#214. Measured on devin 3000.2.17 (SWE-1.7), but this is not devin-specific: any weaker model does it, and the same seat formats correctly on the next attempt, so it presents as a flaky ask rather than a parser bug. This does NOT reopen the scraping fallback that DIVE-1901 iteration 2 deleted. It is strictly a fence match: both unique per-message markers must be present AND closed on that line, and the inner text must be non-empty. The echoed instruction can never qualify — its markers are adjacent (<5dive-r:id></5dive-r:id>), so the inner text is empty. A mid-write frame has no closing marker and cannot match either. Scanned newest-first so a retry beats an earlier answer. tests/ask_capture_unit.sh gains three cases: the same-line reply returns, the echoed instruction still returns nothing, and a half-typed same-line fence still returns nothing. Reported in the validation notes on #197; filing the fix rather than leaving it as a comment. Co-authored-by: A-MO7SEN <ahmed.mohsen@see.com.co> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Closes #196.
Adds Cognition's
devinCLI as a first-class agent type. It has the same shape as claude/codex — an interactive TUI that tmux hosts, subscription OAuth, an official curl installer — so this is registry wiring, no new machinery.What's included
src/header.sh— registry entries:TYPE_BIN(~/.local/bin/devinsymlink, grok/opencode convention),TYPE_AUTH(credentials.tomlsentinel, verified against devin 3000.2.17),TYPE_INSTALL(officialcli.devin.aiinstaller with an exact-xpath guard, notcommand -v— avoiding the stray-binary short-circuit the codex comment documents),TYPE_PROBE(file-presence;devin -pspins a full session, too slow for a 5s probe),TYPE_CHANNELS=0.src/cmd_auth.sh—agent auth login devinTTY handoff (hermes pattern).src/cmd_init.sh— wizard menu entry.5dive-agent-start— launch dispatch (--permission-mode dangerous, parity with claude's--dangerously-skip-permissions), cross-providerUNSET_CREDShygiene, and per-agent seeding ofcredentials.toml+config.jsonfrom the shared/home/claudelogin (mtime-newer re-seed, mirrors the codex block). Theconfig.jsonseed carriesshell.setup_complete=trueso devin's first-run wizard never blocks the unattended session../build.sh.Deliberately not included
TYPE_CHANNELS=0keeps the key bound (every reader does a bare${TYPE_CHANNELS[$type]}underset -u; omission crashesagent types— found this the hard way) while--channels=telegramfails with the proper validation error. The agent is reachable viaagent send/ask, the task queue, and sibling agents.TYPE_API_FILE/TYPE_API_VARentries — devin is OAuth-only here, same absent-shape as hermes/openclaw.Testing
./build.sh && bash -n 5dive && bash -n 5dive-agent-startclean;agent types --jsonlists devin withchannels:false.agent install devin→auth login→create→agent askround-trip. Will update with results and flip to ready.🤖 Generated with Claude Code