Ask a person only what they can answer when connecting an agent

Merged
RO
3d ago
+48-23

Why

Someone connecting their agent from My › Agent got asked by Claude to pick a lowercase profile name, and whether an older agent on their computer was the one they meant. The connect skill told it to: "Agree a profile name" in first-time setup, and "read last.json and confirm it" when no profile is named. Its trust options also reached people under their internal names (operator, allowlist, project).

What

In skills/basecamp-connect/SKILL.md:

  • First-time setup, step 1. Use the profile the person names. Otherwise pick one yourself from the agent's name, and don't ask them to choose or confirm it.
  • Invocation, step 1. Asked to connect a new agent, or one no profile here is connected as, go straight to first-time setup and don't ask about other agents' profiles.
  • A taken name. If you chose a name that turns out to hold a person's login, pick another instead of asking.
  • Who may give it work. Not asked. It's the operator alone unless they said otherwise, and the closing summary tells them so and that they can just ask to let others. When they do ask, each choice gets a plain sentence without the mode names. Setup runs once they've named the projects, without another confirmation.
  • Plain words. Starting the connector, Claude tells the person their agent picks up work while this session is open, and leaves the connector, watcher, monitor and profiles unnamed.
  • Identity, right after approval. The person chose the agent on the approval page, so Claude tells them its name and goes on instead of asking whether it's the right one. A profile that already held a credential still needs their word (unconfirmed-identity.yml).
  • Projects. A personal agent is already in all of its owner's projects (Basecamp adds it on approval), so Claude serves every project the agent is in without asking, tells the person it picks up their requests in all of them and that they can ask it to skip some, and lists again after a moment if none show yet. Only an agent that isn't personal gets asked to be added somewhere. A project it joins later needs the person to ask. Ids stay out of what Claude says. When the agent can't list projects, Claude uses a profile that isn't an agent's, never another agent's. Before, Claude called the computer's other agent "your own login".

basecamp/bc3#13948 makes the matching change to the bootstrap that the My › Agent line points at. Its description has before and after transcripts of the whole flow.

Verification

  • bin/ci passes, including skill drift.
  • The model evals (make -C skill-evals eval-connect) didn't run, because they need ANTHROPIC_API_KEY. first-time-setup.yml names its profile in its context, which "Use the profile the person names" still honors.

Summary by cubic

Stops the Basecamp connect skill from asking people questions they can't answer, so connecting an agent from My › Agent no longer prompts them to pick a CLI profile name, confirm the agent they meant on this computer, or choose who may give it work.

  • Claude picks the profile name itself from the agent's name, unless the person names one, and picks the next name (build-bot-2, then -3) if that one already holds another agent's or a person's login.
  • Asked to connect a new agent, it goes straight to first-time setup and leaves other agents' profiles alone.
  • Since the person chose the agent on the approval page, it names the agent and goes on instead of asking.
  • Who may give the agent work isn't asked: unless the person already said otherwise, only the operator can, and setup runs once projects are named, without a final confirm.
  • A personal agent is already a member of its owner's projects, so it serves all of them without asking and the owner's project list stands in when it can't list its own; for any other agent, it asks which of the projects it's in and the owner adds it where they want it. A project it joins later isn't served until the person asks.
  • Starting the connector, it says the agent picks up work while this session is open, and leaves the connector, watcher, monitor and profiles unnamed.