Five places independently declare which agent backends exist, and they disagree.
Each disagreement is a live bug class rather than untidiness, and adding a fourth
native backend widens all five at once.
| Name |
Resolver.@providers |
Selector.@backend_table |
ExecutorConfig.@type backend |
grok_native |
yes |
yes |
missing |
cursor |
missing |
yes |
yes |
codex |
no |
reserved, intentional |
yes |
And in raxol_symphony, Runner.resolve_from_config/1 (runner.ex:99-115)
resolves "raxol_agent_session" and "noop", while
Config.Schema.@supported_runner_kinds (config/schema.ex:23) lists neither,
so both resolve and then fail their own preflight.
Consequences today
grok_native is absent from the typespec, so Dialyzer cannot see it.
cursor is absent from @providers. @by_string (resolver.ex:164) is
derived from @providers, so harness_from_string/1 cannot name it: cursor
is selectable in code and unreachable from /login, from --backend string
resolution, and from .raxol/config.json.
- The docs drift the same way:
AGENT_FRAMEWORK.md:206 omits grok_native and
cursor, CODING_AGENT.md:93-94 omits all three native backends.
Proposed direction
Derive the tables from one declaration rather than merging them by hand, with
Resolver.@providers becoming a filter over the catalog so cursor is declared
and selectable rather than absent. ADR-0034 argues this should land alongside
the next name added rather than after it.
Recorded in docs/adr/0034-foreign-coding-agent-seams.md, gap 4.
Five places independently declare which agent backends exist, and they disagree.
Each disagreement is a live bug class rather than untidiness, and adding a fourth
native backend widens all five at once.
Resolver.@providersSelector.@backend_tableExecutorConfig.@type backendgrok_nativecursorcodexAnd in raxol_symphony,
Runner.resolve_from_config/1(runner.ex:99-115)resolves
"raxol_agent_session"and"noop", whileConfig.Schema.@supported_runner_kinds(config/schema.ex:23) lists neither,so both resolve and then fail their own preflight.
Consequences today
grok_nativeis absent from the typespec, so Dialyzer cannot see it.cursoris absent from@providers.@by_string(resolver.ex:164) isderived from
@providers, soharness_from_string/1cannot name it:cursoris selectable in code and unreachable from
/login, from--backendstringresolution, and from
.raxol/config.json.AGENT_FRAMEWORK.md:206omitsgrok_nativeandcursor,CODING_AGENT.md:93-94omits all three native backends.Proposed direction
Derive the tables from one declaration rather than merging them by hand, with
Resolver.@providersbecoming a filter over the catalog socursoris declaredand selectable rather than absent. ADR-0034 argues this should land alongside
the next name added rather than after it.
Recorded in
docs/adr/0034-foreign-coding-agent-seams.md, gap 4.