Skip to content

Generic subagent dispatch cannot select a named worker profile on Devin #1734

Description

@GodsBoy

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):

# .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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions