Skip to content

connect: chat lines in Pings (Circles) are never handed off — blocked as read_unresolved #903

Open

Description

@jeissonneira

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

  1. basecamp connect setup -P bot --serve <project id> and run basecamp connect -P bot.
  2. From a trusted person, send the bot a Ping (1:1 or group).
  3. Watch connect's log / ledger.
  4. 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.created row 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)

Proposed approach

  1. 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.
  2. 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.
  3. Docs: until then, a line in the README/skill saying connect serves project content only and Ping lines will block as read_unresolved would 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

  1. jeissonneira commented on Oct 14, 2026

    @jeissonneira
    Author

    A follow-up on the diagnosis: on a live account GET /chats.json returns 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:

    1. A bc3 endpoint that lists Ping Campfires (e.g. under /circles), added to the SDK as a third discovery source. Cleanest, but needs server support.
    2. The Campfire (or parent) id on the chat.line.created feed row.
    3. A stopgap from Ping notifications (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 connect serves projects only and Ping lines block as read_unresolved. Which of these would you like?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions