Repository navigation
Description
Summary
Thanks for connect, it's working great for project @mentions (sub-second pickup from the feed socket). One gap: a message sent to the agent in a Ping (1:1 or group Circle, outside any project) is seen on the feed instantly, but admission blocks it with state=blocked reason=read_unresolved and it is never handed off. There's also no way to serve Pings: connect setup --serve <circle bucket id> returns 404 because a Circle isn't a project.
For a personal/team agent, Pings are the most natural way people ask it for things, so it would be great if connect could handle them (opt-in is fine).
Environment
- basecamp-cli v0.13.2 (basecamp-sdk/go v0.24.0), Linux
- Agent identity: a regular Basecamp user account used as a bot (agent accounts aren't available on our account yet)
Steps to reproduce
basecamp connect setup -P bot --serve <project id>and runbasecamp connect -P bot.- From a trusted person, send the bot a Ping (1:1 or group).
- Watch connect's log / ledger.
- Optionally:
basecamp connect setup -P bot --serve <circle bucket id>.
Expected
The Ping line from a trusted person is admitted as a request (or at least there is a documented opt-in to serve Pings).
Actual
- The
chat.line.createdrow arrives on the live feed immediately. - Admission records
state=blocked reason=read_unresolved(retried every 10 min for a day, never resolves). - Step 4 fails with 404 — the Circle can't be served.
Why (code refs at v0.13.2 / sdk go/v0.24.0)
- Admission reads every pointer through
Summarize; a chat line must be located under a Campfire, and an unresolved one maps toread_unresolved:- https://github.com/basecamp/basecamp-cli/blob/v0.13.2/internal/connector/admission/verdict.go#L341-L368 (incl.
chat.line.created && summary.CampfireID <= 0) - https://github.com/basecamp/basecamp-cli/blob/v0.13.2/internal/connector/admission/verdict.go#L727-L728
- https://github.com/basecamp/basecamp-cli/blob/v0.13.2/internal/connector/admission/matrix.go#L131-L132 — "a chat line found under no visible Campfire"
- https://github.com/basecamp/basecamp-cli/blob/v0.13.2/internal/connector/admission/verdict.go#L341-L368 (incl.
- The SDK discovers the Campfire from (1) the bucket's project dock and (2) the account-wide Campfire listing filtered by bucket. A Circle has no project dock, and (as far as we can tell) Ping Campfires aren't in that listing, so no candidate exists:
- Even if the read resolved, routing is per served project; a record in an unserved bucket is
no_route: - README/skill describe serving only in terms of projects (
--serve 12345 # ... which projects); Pings aren't mentioned as unsupported or supported.
Proposed approach
- SDK: let chat-line discovery resolve Ping lines — e.g. add Circles/Pings as a third candidate source (the API's ping/circle Campfire listing), or resolve a line by bucket id when the bucket is a Circle.
- CLI: add an opt-in serve target, e.g.
connect setup --serve pings(or--serve-pings), treated like a served project with these rules:- a Ping line is a request only if the agent is a participant of that Circle and the author is on the trust list (1:1 Pings are inherently addressed to the agent; group Pings could additionally require an @mention);
- routed to a default/ping work directory.
- Docs: until then, a line in the README/skill saying
connectserves project content only and Ping lines will block asread_unresolvedwould save people some debugging.
Happy to help test, or to attempt a PR if you'd be open to one and can say which direction you prefer.
Activity
jeissonneira commentedon Oct 14, 2026
A follow-up on the diagnosis: on a live account
GET /chats.jsonreturns only project Campfires (all 15 are in Project buckets), so the account-wide listing can't supply a Ping's Campfire, and a Circle has no dock either. The SDK comments suggest the listing was expected to include pings, so that looks like a gap rather than intended behaviour.I'd be glad to put together a PR but wanted to check direction first, since the blocking piece seems to be where the Ping Campfire id comes from:
/circles), added to the SDK as a third discovery source. Cleanest, but needs server support.chat.line.createdfeed row.section=pings), which we can do today, but only covers recently active Pings and I'm not sure agents receive them.On the CLI side I'd keep it opt-in (
connect setup --serve pings, off by default). Only the operator and the allowlist could drive the agent from a Ping, not "any member" under project trust, and a group Ping would need an @mention. Does that match what you want?Separately, I can send a small docs PR now saying
connectserves projects only and Ping lines block asread_unresolved. Which of these would you like?