basecamp connect hands each trusted request to your Claude session

Merged
RO
19d ago
+1030-597

Problem

basecamp connect tried to do too much. For every request it started its own locked-down Claude: none of your settings, no MCP servers, its own idea of which folder to work in, and nobody steering it. That made it too limited to be useful day to day, and it's not how people want to work. The legacy connector had your own Claude session in charge, through the /basecamp-connect skill: it acknowledged each request, handed it to a subagent in the right repo, and you could keep using the session.

Solution

basecamp connect now only listens. It reads the event feed and checks who may give the agent work and which projects it serves, as before. For each trusted request it prints one line to stdout and is done with it:

{"type":"request","event_id":123,"trigger":"mentioned",
 "recording":{"bucket_id":456,"project_name":"BC5 Calendar","recording_id":789,"type":"Comment","title":"…","url":"…"},
 "reply_to":{"kind":"comment","recording_id":700},
 "requester_id":1001,"requester_name":"Jorge Manrubia","acknowledge":true,
 "content":"<p>the request, with the agent's own mention removed</p>"}

It starts no workers and posts nothing itself: no 👀, holding replies or completion notices. A request made before the connector started isn't picked up (with a minute's grace), since nobody was there to take it.

The /basecamp-connect skill is rewritten as the orchestrator, ported from the legacy skill with Zacharias's worker playbook folded in. You run it from your own Claude session, in plain language. It sets the agent up if needed, starts the connector, and for each request:

  • boosts in its own words;
  • picks the repo for the project;
  • hands the request to a background subagent, which uses your own settings, MCP servers and skills, reads the thread and the project's AGENTS.md, does the work, and replies through the CLI as the agent.

Admission now keeps the project name and, when they wrote the recording, the requester's name with what it stores, so the session never has to look them up as the agent.

Not in this PR

  • The worker code (dispatcher, drivers, token handover, the worker's MCP server, the outbox's lifecycle messages, dangerous mode, connect service) is no longer used. It comes out in a follow-up, which keeps this one readable.
  • Setup still checks that Claude Code starts. That's harmless, and goes with the cleanup.
  • bc3-side asks from the card (agents inheriting their owner's access, avatars, names) are separate.

Summary by cubic

basecamp connect now only listens: it prints each trusted request as one JSON line to stdout, and your own Claude session orchestrates the work through the rewritten /basecamp-connect skill. The connector no longer starts its own locked-down Claude per request.

  • The connector starts no workers and posts nothing itself: no acknowledgements, holding replies, or completion notices. A request made before it started isn't picked up (a minute's grace).
  • The skill now acknowledges each request within seconds, picks the repo for the project, and hands it to a background subagent that uses your settings, MCP servers, and skills and replies as the agent; delivery questions are answered from the connector's output file, not status.
  • Each request line now carries the project name and, when they wrote the recording, the requester's name, so the session never has to look them up as the agent. Every feed-controlled field on the line is stripped of terminal control sequences, and a record with nothing to hand off is discarded as unreadable, never marked handed off.
  • A request can print twice if the connector crashes right after printing it, so the skill skips an event_id it has already handled. A task a worker-era crash left open no longer blocks a request on its conversation.
  • A subagent commits only with the repo's own git identity, never the person's; a reply (holding replies included) that Basecamp refuses for mentioning someone is reposted without the mention, telling the main session so it can tell the person directly.
  • The disconnected worker code — dispatcher, drivers, outbox lifecycle messages, dangerous mode, connect service — is no longer used and is removed in a follow-up that keeps this PR readable.