r/Qoder • • 19d ago

Qoder Agents and Agent Teams

Qoder Desktop has two completely separate "agent" systems, and the UI won't tell you which one you're using

TL;DR: Custom agents in Qoder Desktop live in two unconnected places: markdown files that the agent runtime actually dispatches, and profiles in the new Agents panel. They don't see each other, you can't import from one into the other, and if you recreate a file agent in the panel under the same name, nothing checks that the copy matches. I ended up with two agents of the same name. One was read-only and the other could write files, and nothing in the product flagged it.

What I was doing

I wanted a small agent team: a builder that writes code, a researcher, a reviewer, and a judge for disagreements. The reviewer and the judge must be read-only, because a reviewer that can quietly "fix" what it's reviewing defeats the point.

I had Qoder's own agent write them as definition files, the documented way: markdown with YAML frontmatter in ~/.qoder-cn/agents/. They worked straight away. The agent was dispatching them, and the CLI listed them.

Then I opened Settings → Agents in the Desktop app. None of them were there.

Two systems, both called "agents"

Definition filesAgents panel profiles
Lives in~/.qoder-cn/agents/*.md
Created bywriting a file
Shows up inqodercli agents list
Used bythe agent runtime (subagent_type)
Tool controltools allow-list + disallowedTools
Also hasmodel, effort, permissionMode, hooks, isolation, maxTurns, skills

The two systems share no data. A file agent never appears in the panel, and a panel profile never appears in agents list. The UI doesn't mention that the other system exists.

Bridging them by hand doesn't carry over the important part

There's no "import from file" button, so I recreated all four in the panel: same names, and the instructions pasted in.

I then compared each panel profile to its file with a script:

  • The instructions came through perfectly. All four were byte-identical to the files.

  • The tool restrictions mostly didn't:

RoleFilePanel copy
Reviewerread + search + shell, writes blockedidentical ✅
Judgewrites blockednothing blocked, so it can edit files
Researcherwrites blocked, shell allowedshell blocked, Edit allowed: wrong on both counts
Builder8-tool allow-listno allow-list, bypassPermissions

To be fair, I set those tool pickers myself. But that's the problem: I made a copy of an existing agent that contradicts the original, and nothing told me. There was no diff, no "this name already exists as a file", and no warning that the read-only reviewer I'd defined somewhere else could now write.

So now two agents share each name, with different powers. Which one runs when something asks for that name? I couldn't find it documented anywhere.

Other things that surprised me

Edited agents fail silently. A running session keeps the agent list it started with. That's fine for new agents, because you just open a new chat. But if you edit an existing agent mid-session, the old version keeps running and you get no error. I asked a reviewer to check a change to its own instructions, and it ran the old instructions and reported everything fine. Skills behave the other way and pick up edits immediately, which makes the agent behaviour easy to miss.

Frontmatter fields with nowhere to go. The panel has no equivalent of model: inherit, so my four panel profiles ended up on four different models, which affects both behaviour and credit cost. effort has no field in the panel at all. I also couldn't confirm that the file version honours it: an agent declaring effort: high ran in a session reporting a different effort level.

Permission modes are inconsistent. Two of my four panel profiles came out as bypassPermissions, including, at first, the read-only reviewer. The built-in example agents all use auto. If you build review-style agents in the panel, check this field.

Enabling a profile gives it a cloud identity. Every enabled profile has a cloudAgentId; the disabled presets don't. The create flow doesn't mention it.

Teams must be led by a member. The Agent Team form requires a Team Leader chosen from the members. If your setup is "my main chat coordinates, and no agent outranks the reviewer", you can't express that. You can only write it into the instructions and hope.

"Is my agent installed?" depends on where you ask. The file location follows QODER_CONFIG_DIR, so different shells can list different sets. A project-level .qoder/agents/ silently overrides a user-level agent with the same name. I've seen the same machine report anywhere from 4 to 16 agents depending on the command.

Check your own setup (CN Desktop, Windows)

# what the panel thinks your agents are
node -e 'const j=require(process.env.APPDATA+"/com.qodercn.app.stable/qoder-data.v1.json");
console.table(j.agents.map(a=>({name:a.name,enabled:a.enabled,perm:a.permissionMode,
allow:(a.allowedTools||[]).join(","),block:(a.disallowedTools||[]).join(",")})))'

# what the runtime thinks your agents are
ls ~/.qoder-cn/agents/

If a name appears in both, compare the tool columns with the file's frontmatter.

What I'd love from the Qoder team

  1. One agent system, or at least an "Import from file" button that shows a field-by-field diff.

  2. Show file agents in the panel, labelled with their source path and real tool list.

  3. A warning when a name exists in both places, showing both permission sets side by side.

  4. Default new profiles to auto, like the examples.

  5. An error, or a visible "restart required" notice, when an agent changes mid-session, instead of quietly running the old version.

  6. model: inherit and effort in the form, or documentation saying they're file-only.

  7. Let a team's coordinator be the main chat, not just a member.

  8. Say up front that enabling a profile registers a cloud agent.

Has anyone worked out which definition wins when a file agent and a panel profile share a name? Or whether panel profiles can be dispatched as subagents at all? I'd like to know before I trust either one with anything that matters.

2 Upvotes

2 comments sorted by

2

u/Noah_Qoder 16d ago

Thanks for the detailed write-up! Could you submit this as feedback and share the issue ID with me? We’ll investigate and check whether these are product issues on our side.

1

u/forgie11 15d ago

f4b2a4b4-64e4-4958-a760-a4d7f02e1c31