Skip to content

fix(executor): don't route a task whose project already pins a Claude profile - #697

Merged
bborn merged 2 commits into
mainfrom
fix/routing-respects-project-profile
Aug 29, 2026
Merged

fix(executor): don't route a task whose project already pins a Claude profile#697
bborn merged 2 commits into
mainfrom
fix/routing-respects-project-profile

Conversation

@bborn

@bborn bborn commented Aug 28, 2026

Copy link
Copy Markdown
Owner

routeTask only checked the per-task config dir, so a project that pins its own was silently overridden.

That's not cosmetic. A config dir carries the account's MCP connectors and their OAuth logins, and those logins are per-profile keychain entries — they can't be shared. On this machine influencekit pins ~/.claude-ik, which holds ~12 connector logins (InfluenceKit, Figma, Cloudflare, Linear-influencekit…); ~/.claude-offerlab has 2, and a different Linear workspace. Routing an influencekit task onto the other profile doesn't error — it runs without the servers it needs and the agent works around the gap. That's the shape of the incident where executors lost taskyou's MCP and started hacking the DB directly.

Syncing definitions across profiles wouldn't fix it either: the credentials don't travel, and a defined-but-unauthenticated server is no better than a missing one. So the project's own setting is the lever — pinning a project's config dir is now also how it opts out of routing.

Unpinned projects still route, so the feature is unaffected where profiles are interchangeable.

Tests

  • TestRouteTask_ProjectPinnedProfileIsNotOverridden — a pinned project is left alone.
  • TestRouteTask_UnpinnedProjectStillRoutes — the flip side, so the fix can't quietly disable routing.
  • Mutation-checked: deleting the guard fails the first and only the first.

Also: golang.org/x/crypto v0.52.0 → v0.55.0

GO-2026-6303 (callbacks in golang.org/x/crypto/ssh) turned red on this PR — published after main's last CI run, so main is green only by timing. It predates this branch, which touches neither go.mod nor go.sum, and the job is continue-on-error, so it was never blocking.

Fixed here anyway because govulncheck flags it as reachable, not merely present: internal/servercharmbracelet/sshgolang.org/x/crypto/ssh, i.e. ty's own SSH server. go mod tidy pulled x/sys, x/term and x/text forward with it. Verified locally: the finding is gone, and what remains is stdlib on go1.25.5 — CI uses 1.25.14 with check-latest: true, where those are already patched.

Follow-up to #690.

🤖 Generated with Claude Code

bborn and others added 2 commits August 28, 2026 12:58
routeTask only checked the per-task config dir, so a project that names its own
was silently overridden. That is worse than untidy: a config dir carries the
account's MCP connectors and their OAuth logins, and those logins are per-profile
keychain entries that cannot be shared. An influencekit task routed onto a
personal profile does not error — it runs without the Linear/InfluenceKit servers
it needs and the agent works around the gap, which is how we got executors
hacking the DB when taskyou's own MCP went missing.

Syncing the definitions across profiles would not have helped, since the
credentials do not travel and a defined-but-unauthenticated server is no better
than a missing one. So the project's choice is the lever: pinning a config dir is
now also how a project opts out of routing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
govulncheck flags this one as reachable, not merely present: the trace is
internal/server -> charmbracelet/ssh -> golang.org/x/crypto/ssh, which is ty's
own SSH server. The advisory covers callbacks in that package.

Pulled forward x/sys, x/term and x/text as go mod tidy required. The CI job is
continue-on-error, so this was not blocking the PR — it is here because a
reachable CVE in the SSH server we expose is worth fixing when we notice it,
not when something forces us to.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@bborn
bborn merged commit cf0de50 into main Aug 29, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant