Generic subagent dispatch cannot select a named worker profile on Devin

Author: GodsBoyCreated Sep 17, 2026Updated Sep 17, 2026

Summary

CE skills dispatch generic subagents for reviewers, scouts, researchers, fixers, and similar workers. On Devin (CLI and Devin Local), run_subagent selects a worker by named profile, not by raw model id. The two built-in profiles are subagent_explore (read-only tools, no exec, no file writes) and subagent_general (full tool set, always inherits the parent model).

The plugin has no configuration surface that maps a generic CE dispatch to a named profile. Any CE worker that needs more than read-only tools already lands on subagent_general, so it runs the parent model at parent cost. A cheaper or stronger profile can only be requested by hand-editing every dispatch site.

Two authority classes

CE's generic workers split into two authority classes:

  • Read-only workers: reviewers, scouts, researchers, validators. They never mutate tracked project content; per-run scratch artifacts (dossiers, reviewer JSON, run logs) stay in this class.
  • Write-capable workers: implementers and fixers that mutate tracked project content.

The split matters because a cheaper profile must never silently gain write authority.

Proposed configuration

Two optional keys under the existing .compound-engineering/ cascade (config.local.yaml then config.yaml):

yaml
# .compound-engineering/config.yaml
subagent_read_profile: ce-explorer    # generic dispatches that do not mutate tracked content
subagent_write_profile: ce-worker     # generic dispatches that do

Semantics:

  • Profile names are opaque host-defined strings. The plugin never invents, validates, or defaults one.
  • The authority class is chosen per dispatch call, from the work the child actually needs.
  • Keys apply only where the host's generic dispatch primitive accepts a named worker profile (on Devin, run_subagent's profile argument). Typed or registered-agent selectors are out of scope.
  • On hosts with no such selector the keys are inert and dispatch is unchanged. Unset keys are a strict no-op everywhere, so existing Claude Code model-selector behaviour is preserved.
  • A resolved profile supersedes the surface's model selection for that dispatch class; a profile and a model override are never passed together.
  • Unknown, rejected, or unresolvable names follow the surface's ordinary dispatch-failure or degradation path, are named in coverage or degradation notes, and are never reported as having run.

Distinction from #1301

#1301 concerns model and effort selectors for the high-stakes adversarial code-review pass. This proposal covers the generic worker dispatch used across most CE skills: a different mechanism (run_subagent profile versus model flags), different consumers, and a different risk model. The two are complementary.

Tested environment

  • Devin CLI 3000.10.31 on Linux x86_64: devin doctor reports pass custom subagent profiles 1 profile(s) loaded for a profile authored to the documented .devin/agents/<name>/AGENT.md shape.
  • Installed docs for Devin CLI 3000.10.27 (subagents.mdx, models.mdx, reference/configuration/config-file.mdx) describe the two built-in profiles, the profile argument, custom profile locations, and allowed-tools as a hard restriction.
  • Known limit: the subagent panel shows profile, status, and tool-call count but not the running model, so profile-to-model attribution is not machine-verifiable from the CLI. The implementation verifies the mechanical contract plus devin doctor and claims nothing further.

Request for comment

A draft implementation exists on a branch and will be proposed as a PR shortly. Feedback on the host-neutral shape is welcome: are subagent_read_profile/subagent_write_profile the right key names, and is the two-key authority split the right granularity? Implementation is not conditional on a response.

Source: EveryInc/compound-engineering-plugin