You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Founder, 2026-09-10: "i'm also confused by us having both 'fleets' and 'agents' and labels for it — i think that's the huge issue here", then: "we should probably just rip out fleets altogether and rebuild it just using agents?", then, after seeing what Fleet does: "but then we still use the term /fleet - i like it - and there is stuff that it lets us do."
The conclusion moved twice. Recording the evidence so it does not move a third time.
Both layers are load-bearing
Fleet is 34,372 lines of runtime, not a config format:
Dispatch, scheduling, worker lifecycle, a usage ledger. Operate mode runs on it. Deleting it means rebuilding a scheduler and a ledger that work today.
Agent profiles are not redundant either.AgentProfile (fleet/profile.rs:71) carries description, requires (closed capability requirements), profile: FleetProfile and origin — behaviour and authority. The fleet shortlist carries none of that; FleetModel (fleet/members.rs:25) is only provider, model, roles, fleet.
The intended split is stated in members.rs:1-8: "A person builds their fleet by adding models from the providers they have configured; the operator model later picks sub-agent routes from that list only. Shortlist rows carry no role; the roles a model fills are the executable member rows that pin it."
So: Fleet = which routes are available. Agent profile = what a role does. That is also the local-config half of #6028's capability / Fleet / policy separation.
What is actually wrong
Three small things, none of which justify a rewrite:
The same field has two names.agents/*.toml calls it role_hint; fleet members call it role. Pick one.
A member duplicates profile fields rather than referencing the profile. On a real machine scout exists in both with identical id, model, provider and instructions, free to drift. FleetMember already supports the fix — omit model/provider and it inherits — but the code paths that write members do not use it (see the sibling over-pinning issue).
The roster merges three layers — [fleet.profiles] in config.toml, personal $CODEWHALE_HOME/agents/*.toml, workspace .codewhale/agents/*.toml (fleet/roster.rs:10-12). That is reasonable, but nothing surfaces which layer won, so a project profile silently shadowing a personal one is invisible. doctor_operate_fleet_report_json already computes the losing paths (Fleet config has one layer too many — and silent shadowing between the rest #5098) — surface it in the fleet view too.
Decision
Keep both. Keep the /fleet name. Work the three items above rather than a rewrite.
Rejected, with reasons
Delete Fleet, keep agents — throws away 34k lines of working orchestration to fix a field-duplication bug.
Delete agents, keep Fleet — loses description, requires and profile authority, which the shortlist has no place for.
The question
Founder, 2026-09-10: "i'm also confused by us having both 'fleets' and 'agents' and labels for it — i think that's the huge issue here", then: "we should probably just rip out fleets altogether and rebuild it just using agents?", then, after seeing what Fleet does: "but then we still use the term /fleet - i like it - and there is stuff that it lets us do."
The conclusion moved twice. Recording the evidence so it does not move a third time.
Both layers are load-bearing
Fleet is 34,372 lines of runtime, not a config format:
Dispatch, scheduling, worker lifecycle, a usage ledger. Operate mode runs on it. Deleting it means rebuilding a scheduler and a ledger that work today.
Agent profiles are not redundant either.
AgentProfile(fleet/profile.rs:71) carriesdescription,requires(closed capability requirements),profile: FleetProfileandorigin— behaviour and authority. The fleet shortlist carries none of that;FleetModel(fleet/members.rs:25) is onlyprovider,model,roles,fleet.The intended split is stated in
members.rs:1-8: "A person builds their fleet by adding models from the providers they have configured; the operator model later picks sub-agent routes from that list only. Shortlist rows carry no role; the roles a model fills are the executable member rows that pin it."So: Fleet = which routes are available. Agent profile = what a role does. That is also the local-config half of #6028's capability / Fleet / policy separation.
What is actually wrong
Three small things, none of which justify a rewrite:
agents/*.tomlcalls itrole_hint; fleet members call itrole. Pick one.scoutexists in both with identicalid,model,providerand instructions, free to drift.FleetMemberalready supports the fix — omitmodel/providerand it inherits — but the code paths that write members do not use it (see the sibling over-pinning issue).[fleet.profiles]inconfig.toml, personal$CODEWHALE_HOME/agents/*.toml, workspace.codewhale/agents/*.toml(fleet/roster.rs:10-12). That is reasonable, but nothing surfaces which layer won, so a project profile silently shadowing a personal one is invisible.doctor_operate_fleet_report_jsonalready computes the losing paths (Fleet config has one layer too many — and silent shadowing between the rest #5098) — surface it in the fleet view too.Decision
Keep both. Keep the
/fleetname. Work the three items above rather than a rewrite.Rejected, with reasons
description,requiresand profile authority, which the shortlist has no place for.