镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

feat(acp): add a generic ACP agent type at parity with the other harnesses - #1251

Open
wpfleger96 wants to merge 1 commit into
mainfrom
hayt/generic-acp-runtime
Open

wpfleger96 wants to merge 1 commit into
mainfrom
hayt/generic-acp-runtime

Conversation

@wpfleger96

@wpfleger96 wpfleger96 commented Oct 16, 2026 •

Copy link
Copy Markdown
Member

🤖 Adds buzz.acp, an agent type for long-tail harnesses that speak the Agent Client Protocol (Cursor, OpenCode, Amp, Gemini CLI, Devin, Grok Build, Kimi Code, Oh My Pi), at parity with Goose, Claude Code and Codex wherever the harness advertises the matching ACP capability. An owner picks a preset or types a command, args and env, confirms the exact launch, and the agent runs turns in that harness. No per-harness JS plugin and no harness-specific code.

Rule for every feature: a stable ACP mechanism is used only when the harness advertises it; otherwise behavior falls back to a plain new session. Goose sets none of the new shared-client options, and nothing under src/bundled/goose/ changes.

Shared client additions (src/features/agent-harness/acp/)

All opt-in through new SessionsOptions / process hooks:

  • Pinned sessions and launch generations: each session pins its settings (pin), conversation owner epoch and launch generation before its first await, and opens only on that generation's process. A generation hold (hold(g) → release()) keeps an old process alive until every opening and running prompt on it has finished (session.idle()), then it stops.
  • Retirement: an accepted local save (reconfigure) or restart() retires sessions. A retired session takes no new messages and writes nothing to the saved record. Its record is kept only if it was fully open and idle; one still opening or mid-turn has its record dropped first, so a replacement never resumes it.
  • Routing: route ignores retired sessions; an exact-thread route (RouteMatch.exact) beats a channel route.
  • Resume: with a saved record whose context matches, the session reopens with session/resume when advertised, else session/load with the replay swallowed for that session only. A mismatch or a failed reopen drops the record and opens fresh.
  • Saved record: id/covered advance only from a prompt's own successful response, and only if nothing else committed since that prompt was built. covered is a Mark of { at, ids }: the newest second plus the event ids delivered, so distinct messages sharing a second stay distinct (an older numeric record loads as { at, ids: [] }). Prompts are built when dequeued (build), from the session's covered boundary, so a failed message is carried again by the next prompt.
  • Model and effort: read from configOptions; model is set before effort via session/set_config_option, using the whole state each response returns. A turn left on the harness default never runs on a session Buzz moved off it: behind a busy turn that sets the field, or on a session already overridden there, it keeps its place in arrival order, reopens fresh when it reaches the front, and Stop clears it like any queued message. Cancelling a waiting message never lets later ones overtake earlier ones, and the line and its Stop control last while anyone still waits; a queue of default-only turns stays on its session. Option updates during a session/load replay are kept (without callbacks), and a load answer without configOptions leaves them in place. onState(state, pinned) reports every live state replacement, never a replay's.
  • Sign-in reconnect: reconnect() fails live sessions, keeps their records, and calls the process's restart; initialize's authMethods are kept and surfaced on failure.
  • Transcripts: readTranscript replays a saved session in a short-lived process with session/load, never prompting, under one 20s deadline with turn, item and UTF-8 byte limits enforced even for a single remaining turn (agent and user message ids, text, markers, tool kind/status and a per-entry cost for each diff, path and plan entry all counted; a turn that loses content is marked partial); threadOf sees only a 4 KiB prompt prefix. probeOptions reads a fresh session's options for Check.

The ACP agent type (src/bundled/acp/)

Settings and launch confirmation

  • presets.ts: eight presets as data, all marked unverified.
  • config.ts: per-agent config (preset, command, args, env, workspace, instructions, model, effort, scope), validation (non-empty command not starting with - or containing =, no NUL, valid env names, BUZZ_*/NOSTR_* rejected), and a SHA-256 approval over ["buzz.acp/approval/1", command, args, sortedEnv, workspace].
  • Settings tab: preset/command/args/env/workspace, Model and Thinking pickers, Sessions scope (each thread, or one session per channel), instructions, a confirmation dialog showing the exact argv, workspace, env names and PATH only, and Check. It notes that the harness also loads its own configured MCP servers next to the Buzz tools, and shows "Set up on this device" when a synced preset has no local command yet.
  • Create adds harness, command, workspace and instructions to the New agent dialog; the agent is saved unconfirmed and runs only once the owner confirms the command in Settings. CreateModel, summary (the picked model, else the preset), models and describeMigration (Model, Thinking, Sessions) are registered.
  • Synced settings: preset, model, effort and scope only (syncedSettings, withSynced). A synced field the accepted copy leaves out takes the plugin default. Command, args, env, workspace, approval, resume pointers and the model cache stay on the device.
  • Registered with enabledByDefault: false, macOS and Linux only (the launch runs POSIX env).

Runtime

  • Each conversation is one ACP session in the agent's harness, started with env <command> <args…>; Buzz tools reach it over HTTP MCP. A harness without mcpCapabilities.http is refused.
  • Launch approval: every start reads the stored config once and recomputes the approval from that same read; a mismatch refuses with "Confirm this agent's command in its settings."
  • Per membership: the runtime keys its entry, sessions, saved sessions, owed messages and relay lookups by community membership (AgentKey), as Goose does; pubkeys are used only for protocol identity, so a session keeps the handle of the community it opened in.
  • Per-session snapshots: each session runs on the config it opened with. Standalone wakes (unaddressed watches and timers) run on the same pinned model and effort as messages. A thinking level synced from another device is checked like Goose's: unless the message picks its own, a level the harness doesn't offer refuses the turn. A changed launch starts a new process generation for new sessions while busy ones finish on their own process; other saved changes close idle sessions and retire busy ones after their turn. Each session's Buzz tools default to the place of its own current turn, so a replacement session on the same conversation never moves a retired session's replies.
  • Saved conversations (buzz.acp.sessions.v1, per agent, device-only): last active time, plus the harness session id, coverage (by event id, the newest 256, so a same-second or late older message is still delivered after resume; only context the prompt actually rendered counts as covered) and a context digest (launch approval, workspace, instructions, team, name, added tools, scope; no env values). A saved session resumes only while that digest matches. Listed through sessions.
  • Owed messages (buzz.acp.owed.v1, device-only, IDs only, newest 256 per conversation and 64 conversations): every trigger is recorded as owed before its turn starts, and it is cleared only once a committed prompt's coverage includes it, so a failed, refused or stopped turn, or one that settled early through its final Buzz send, leaves it owed. Every later prompt, including a successor already waiting, carries owed messages as context even below the saved mark, ahead of other messages; more than 12 go out in batches across successful prompts, newest first. They are fetched from the relay by ID for every trigger and checked against the channel, and against the thread only when the session is thread-scoped, so a channel-wide session recovers them from any thread or top-level post, and recovery after a restart doesn't depend on the thread's newest 200 replies. A waiting delivery cancelled through its own signal posts nothing and stays owed.
  • Model cache (buzz.acp.models.v1, per confirmed launch and workspace): fed by each session's option state and by Check, which opens one extra session in its own process with no Buzz tools. Efforts are recorded only for a model that was actually selected. A harness with a model control and no effort control (Cursor) gets a models-only picker.
  • History tab: the agent's conversations with status and last active time; each opens its transcript in the shared transcript view when the harness advertises loadSession, otherwise it says the harness can't replay transcripts. Opened from agent activity, it shows that conversation's transcript (its thread's, else its channel's) through the shared useOpenTranscript. Opening a transcript moves keyboard focus to Back; Back returns it to that row's Transcript action, else the first remaining one, else the list or its empty state.
  • Sign-in: when a turn fails with -32000, Settings shows the preset's sign-in guidance and the harness's advertised methods, labelled as text from the harness. Nothing is run. Recheck restarts the harness with bounded retries.
  • Failure messages: a failed turn posts only ⚠️ I couldn't finish that. Details are in my activity., plus at most one of our own hints (unconfirmed command, missing program, or the preset's sign-in command on a new session's first turn). The full error goes to local activity, which keeps the whole error (up to 8,000 characters) as local-only detail for every agent type.
  • Instructions go in session/new's systemPrompt only when advertised, otherwise they lead a new session's first prompt once. Mid-turn messages queue for the next turn. session/close is sent only when advertised. Stop cancels every turn still running in the conversation with session/cancel, including one on a session retired by a settings change (local or synced) until that session closes. Owner authorization follows the Goose runtime.

@wpfleger96 wpfleger96 changed the title feat(acp): run ACP agents' turns in the owner's confirmed harness feat(acp): add a generic ACP agent type that runs any ACP harness Oct 16, 2026
@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from 68e990f to d0f37d1 Compare October 16, 2026 16:46
@wpfleger96
wpfleger96 changed the base branch from main to duncan/acp-shared-client October 16, 2026 16:46
@wpfleger96
wpfleger96 marked this pull request as ready for review October 18, 2026 20:17
@wpfleger96
wpfleger96 requested a review from a team as a code owner October 18, 2026 20:17

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord automated source review via Wes's account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) reviews.

Reviewed head d0f37d1 against base/merge-base 59030eb. Scope: the 22-file feature diff and relevant shared ACP, agent settings, runtime and host callers, with the stacked #1227 interface in view. One actionable P2 is inline. Assessment: 8/10; fixing confirmation failure feedback is needed to reach the repository's 9/10 correctness bar. The existing shared ACP owners are reused; no additional actionable launch-approval, environment-boundary or lifecycle defect was established.

Optional UX improvements, not required fixes:

  • In src/bundled/acp/tabs.tsx:198–223, distinguish each environment row's accessible names and provide a predictable focus destination when the focused Remove button disappears; consider focusing the new Name field after Add.
  • At tabs.tsx:256–275, Check drives the Save spinner while Check itself only disables. Put pending feedback on Check and distinguish its failure result from readiness, even though the returned text already explains the failure.
  • At tabs.tsx:118,241–254, consider touched/submitted validation so a trailing newline during argument entry does not immediately announce an error, and clarify that unsaved launch edits will require confirmation after Save. The current approval text describes the stored launch.
  • At runtime.ts:219–268, replacing the launch while conversation context is loading disposes the captured entry, so the pending message reports that the agent stopped. This fails closed and is consistent with cancelling old work; consider explaining that settings changed and the message needs retrying. Do not revive a removed agent or reuse the stale launch just to avoid that message.

Validation: immutable source inspection and diff whitespace check only; no PR code, tests, builds, apps, or third-party harnesses executed. One hosted check snapshot showed all non-skipped checks successful; Windows native validation and browser flake checks were skipped. All eight presets are explicitly unverified. Live authentication/tool calls, performance, native focus, screen-reader behavior, rendered themes/viewports and human acceptance remain unverified. Public PR description and commit messages inspected; no attached images in the description and no actionable disclosure finding identified. This COMMENT is neither approval nor merge authorization.

Comment thread src/bundled/acp/tabs.tsx Resolved
@wpfleger96
wpfleger96 force-pushed the duncan/acp-shared-client branch from 59030eb to 82f8fad Compare October 19, 2026 17:27
@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from d0f37d1 to e8e4060 Compare October 19, 2026 17:38

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord automated source review via Wes's account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) follow-up reviews.

No new actionable findings. The previous P2 confirmation-error finding is resolved in source: failed confirmation saves now expose an alert inside the dialog and retain retry, while pending saves prevent dismissal. The follow-up also gives environment rows distinct names and predictable Add/Remove focus, separates Check feedback, delays validation per field, and explains launch changes during conversation loading.

Reviewed head 523aa602c76f3cea45e29ca59b03f35f5e4c14ce against base/merge-base 82f8fadeba1dfb9ab8490a054d9e8734af1ac62f, comparing the follow-up with previously reviewed d0f37d1. Scope: prior findings, the five changed ACP feature files, and shared ACP/Goose integration and callers within the 23-file PR diff. Solo Canvas uses the existing bounded owner-checked reader; tool authorities come from the agent's community snapshot. Launch approval and settings replacement preserve their existing owners. Source assessment: 9/10; no additional repair requested.

Validation: immutable source and regression-test inspection plus diff whitespace check; no PR code, tests, builds, apps, or harnesses executed. One hosted-check snapshot had 7 successful, 22 in progress and 2 skipped checks; CI completion is not established. Live harness authentication/tool calls, performance, rendered themes/viewports, assistive technology and human acceptance remain unverified. In particular, success-dialog focus restoration to the now-disabled confirmation trigger needs runtime validation; this predates the follow-up and was not established as a new defect. Public PR description and feature commit messages inspected; no description attachments or actionable disclosure findings identified. This COMMENT is not approval or merge authorization.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord automated source review via Wes's account.

No actionable findings in this documentation follow-up. The README now uses the registered “ACP agent” harness label and correctly separates agent creation from configuring the launch in Settings, saving it, and confirming the saved command. Source assessment for this delta: 9/10.

Reviewed head a7dab5bddf35f3cbbf53c6d1493169b4132d01c4 against base 82f8fadeba1dfb9ab8490a054d9e8734af1ac62f, incrementally from previously reviewed 523aa602c76f3cea45e29ca59b03f35f5e4c14ce. The endpoint diff changes only src/bundled/acp/README.md (4 insertions, 3 deletions); all implementation and test files are unchanged. This uses the small unchanged-follow-up solo exception; the preceding review included independent Rocket, Mantis and Groot lanes. I checked the instructions against registration, creation and settings source, including the existing confirmation failure/retry path. No fresh team review of the unchanged implementation is claimed.

Validation: source and diff-whitespace inspection only; no PR code, tests, builds, apps or harnesses executed. One hosted-check snapshot showed 9 successful, 20 in progress and 2 skipped checks. CI completion, live harness operation, rendered accessibility/focus (including the previously noted confirmation-success focus), and human acceptance remain unverified. Public PR description and the new commit message inspected; no description attachments or actionable disclosure finding identified. This COMMENT is not approval or merge authorization.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord automated source review via Wes's account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security), and Groot (product/accessibility) lanes.

No required changes found in this follow-up. Source assessment: 9/10. The two new ACP commits remove automatic publication of unsent harness text and use Buzz-owned failure messages, while preserving first-turn sign-in hints. The previous confirmation-error fix remains present. One optional recovery-wording suggestion is inline.

Reviewed head fe97ae5c068451027d53123611098bdbed0a3bfb, base 42746a037125ecc9df8e88d4b5f7c2a58b53d06c; follow-up compared with a7dab5bddf35f3cbbf53c6d1493169b4132d01c4 and checked against the feature's current callers. The PR description and commit messages were inspected; no attached images or new public-material disclosure issue found.

Source-only: no PR code, tests, builds, app or live harness executed. One CI snapshot still had browser, JavaScript and Rust jobs running, with Windows native validation skipped. Native lifecycle, rendered focus/accessibility, performance and human acceptance remain unverified. This is a non-blocking COMMENT review, not approval.

Comment thread src/bundled/acp/runtime.ts Resolved

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account.

No new actionable findings in this follow-up; assessment: 9/10 for minimalness, elegance, and source-level correctness. Compared with the previously reviewed fe97ae5c068451027d53123611098bdbed0a3bfb, only acp-testing.ts and runtime.test.ts change; production code and the base are unchanged. Reviewed the fake harness response controls, reporting completion barrier, and queued sign-in-error/refusal case against the runtime and shared ACP session lifecycle. The documented small-follow-up solo exception applies; this is not a new four-reviewer pass.

Head: 0b37a0f1aec789f37a1de01bf37a54affa7d9877
Base: 42746a037125ecc9df8e88d4b5f7c2a58b53d06c

Source-only: no tests, builds, app launches, or live harness execution. CI status, test timing/cost, rendered focus/accessibility, and runtime acceptance were not verified. The public PR description has no attached images; the description and new commit message were inspected with no new disclosure finding. This COMMENT is not approval or merge authorization.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, with independent Rocket, Mantis and Groot review lanes.

No actionable findings in this follow-up. Assessment: 9/10 for minimalness, clarity and correctness within the reviewed scope.

Compared previously reviewed 0b37a0f1aec789f37a1de01bf37a54affa7d9877 to head 57e2b5ddc3379872d27bcb3df9bb95639c504bf8, with unchanged base 42746a037125ecc9df8e88d4b5f7c2a58b53d06c: two files, 24 insertions and one deletion. The model-failure notice now names the actual Arguments and Environment controls in the agent’s Settings. Fixed application text preserves the existing boundary that keeps raw harness errors out of channel messages. The added regression test covers the model-error path and sentinel exclusion. Existing Settings guidance explains saving and confirming changed launch settings before retrying. No broader feature areas were reopened.

Reviewed the public PR description and follow-up commit message; no attached images or disclosure finding. Validation is source-only: no tests, builds, app launches or live harness recovery were run. One hosted-CI snapshot still had JavaScript, Rust and browser lanes running; Windows validation was skipped. Rendered focus/accessibility and live recovery remain unverified. This COMMENT is not approval or merge authorization.

@wpfleger96
wpfleger96 force-pushed the duncan/acp-shared-client branch from 42746a0 to 3cfa0b7 Compare October 19, 2026 21:44
@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from 57e2b5d to dfe68ff Compare October 19, 2026 21:50

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) lanes.

One P2 integration finding: the numeric error code can survive a later refusal, causing incorrect sign-in advice when two messages arrive during cold session opening. Details and the smallest repair are inline. Source assessment: 8/10 pending that correction.

Reviewed head dfe68ff9b49ccc898cadb7ebded870a138ccc194 against base 3cfa0b7. Compared the prior reviewed feature stack ending at 57e2b5ddc3379872d27bcb3df9bb95639c504bf8: 20 patches unchanged, three adapted, and two failure-message patches removed. Review focused on those adaptations and their shared-client integration; unchanged feature areas were not broadly reopened.

The revised description accurately documents truncated raw harness failures and the absence of automatic unsent-reply publication. This revision no longer provides the prior sanitized-error behavior; matching the base Goose behavior does not establish that arbitrary harness errors are safe to share. No separate disclosure defect was established from the reviewed public description and commit messages; there are no attached images.

Source-only validation: no tests, builds, app launches, live harness recovery, or hosted CI verification. Runtime ordering, performance, rendered focus/accessibility, and human acceptance remain unverified. This COMMENT is not approval or merge authorization.

Comment thread src/bundled/acp/runtime.ts Resolved
@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch 2 times, most recently from 915836c to b600f76 Compare October 19, 2026 22:08

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord automated source review via Wes's account, with independent Rocket (systems/lifecycle), Mantis (correctness/concurrency), and Groot (product/error flows) coverage.

No actionable findings in this follow-up. Source assessment: 9/10; no changes requested.

The previous refusal/sign-in finding is addressed by the new base: the shared session now stores error text and its code together, so a later refusal cannot inherit an earlier authentication code. The added cold-opening regression covers two messages arriving before session/new resolves. Generic ACP explicitly enables diagnoseStartup, preserving preset install hints for exit 126/127 in both Check and runtime launches; Goose retains the base behavior.

Scope: follow-up from dfe68ff9b49ccc898cadb7ebded870a138ccc194. Range comparison shows 22 unchanged feature patches, one launch-hook adaptation, and one added regression-test commit. Shared client changes in the endpoint comparison are inherited from the new base. This is not a fresh exhaustive review of the unchanged feature. The public PR description was checked and contains no attached images.

Reviewed head: 915836c2550bae731d77c6b8b481a228e416512c
Base: c8cbbbe

Validation: immutable source and caller/lifecycle analysis only; no PR code, tests, builds, apps, or harnesses executed. The single hosted-check snapshot still had JavaScript, Rust and browser checks running; Windows validation was skipped. Native lifecycle/performance, rendered focus/accessibility, test timing and human acceptance remain unverified. This COMMENT is not approval or merge authorization.

@salman1993 salman1993 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Findings from Salman's AI agent:

  1. [P1] Raw harness errors can expose credentials in Buzz. report() publishes the first 500 characters of the harness error directly into the conversation. A focused runtime probe with a synthetic API key in a provider error confirmed that the key was published. An authentication or startup diagnostic containing a credential therefore exposes it to conversation readers. Use a fixed public failure message and retain detailed diagnostics in owner-only activity. src/bundled/acp/runtime.ts:360

  2. [P2] Steering is never enabled for the generic agent. Its hooks supply neither steering nor capability negotiation, so every message arriving mid-turn queues until the current turn finishes. A correction such as “stop, use another approach” cannot steer the running work, unlike Goose. Against the requested behavior, enable steering by default where the harness supports it, retaining queueing as the unsupported fallback. src/bundled/acp/harness.ts:23

  3. [P2] Transcript support is entirely absent, including for capable harnesses. History always renders “History isn't available for ACP agents.” There is no session/list integration or transcript reader, so owners cannot inspect the harness conversation through this view. Capability-gate session discovery and transcript reading, reuse the existing transcript renderer, and show unavailable only when the harness lacks support. Listing discovers sessions; reading their contents also needs supported replay or export. src/bundled/acp/tabs.tsx:416

  4. [P2] The generated session title is discarded. The runtime computes and passes Agent · #channel · thread, but the shared client transmits the title only through newSessionMeta, which the generic agent never supplies. A focused runtime probe confirmed that no title reaches the harness at creation or afterward. Sessions therefore lose the Buzz agent/channel naming Goose provides. Carry the title through supported naming behavior and make the unsupported fallback explicit. src/bundled/acp/runtime.ts:285

@wpfleger96
wpfleger96 force-pushed the duncan/acp-shared-client branch from 926ba1c to f81e71b Compare October 20, 2026 17:14
@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from b600f76 to 24d8dda Compare October 20, 2026 17:35

@salman1993 salman1993 left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Salman has confirmed that steering is the only remaining blocker. Transcripts and session naming are non-blocking.

Follow-up on the prior findings at 1ec4a48ab00e23da1cd0f0f48ed316e885dae6d3:

  1. Addressed: raw harness errors no longer reach Buzz. Public failure posts now use fixed text, with hints carried only from Buzz's own typed failures or fixed preset text. The original synthetic-credential reproduction confirms the secret stays in the local outcome and is absent from the published message. The new local Details path retains longer diagnostics.

  2. [P2] Remaining blocker: steering. Generic hooks still have no steering implementation or capability negotiation, so messages arriving mid-turn always wait for the current turn to end. Use supported steering by default where available and retain queueing for harnesses without it. src/bundled/acp/harness.ts:32

  3. Non-blocking follow-up: transcripts. History remains an unavailable placeholder, with no capability-gated session listing or transcript reader. This can be addressed separately. src/bundled/acp/tabs.tsx:416

  4. Non-blocking: session naming. The unused title argument has been removed, and the PR explicitly documents the limitation. ACP has no standard title-setting field. Harness-specific naming support can be considered separately.

@wpfleger96
wpfleger96 force-pushed the duncan/acp-shared-client branch from fff8f34 to 3c6f0c5 Compare October 27, 2026 15:17
@wpfleger96

Copy link
Copy Markdown
Member Author

🤖 On steering (review, item 2): Buzz already steers all three first-class harnesses, each through its own mechanism: Goose's _goose/unstable/session/steer ACP extension, Codex's app-server turn/steer, and Claude Code's stream-json input. Plain ACP has no steering request, and the v2 prompt RFD explicitly leaves it unspecified, so the generic agent queues mid-turn messages instead. Steering for a specific harness belongs in its first-class plugin, as it does for those three. Happy to add it to the generic agent once ACP standardizes it.

@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from 1ec4a48 to 673f648 Compare October 27, 2026 15:25
@wpfleger96 wpfleger96 changed the title feat(acp): add a generic ACP agent type that runs any ACP harness feat(acp): add a generic ACP agent type at parity with the other harnesses Oct 27, 2026
Base automatically changed from duncan/acp-shared-client to main October 27, 2026 18:53
@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from 06567d4 to 8cfe8f0 Compare October 27, 2026 19:02

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Two reproducible blockers: ACP Settings crashes on opening, and Stop loses the running turn after session retirement.

Comment thread src/bundled/acp/tabs.tsx Resolved

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 The previous Settings/History crash and retired-session cancellation failures are repaired. One new Stop regression remains, detailed inline.

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 One remaining cancellation race reproduced at this head.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket, Mantis and Groot lanes.

Two P2 fixes are requested inline: standalone turns ignore saved Model/Thinking, and History transcript navigation loses keyboard focus. Source assessment: 8/10 pending those corrections.

Head: 6e64522; base: bfaf0cb. Reviewed the new ACP parity behavior, shared-client integration and prior fixes. Public description, changed files and feature commit messages were inspected; no description attachments.

Source-only: no tests, apps or harnesses executed; CI, rendered accessibility, performance and live preset compatibility remain unverified. This is a non-blocking COMMENT review.

Comment thread src/bundled/acp/tabs.tsx Resolved
@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from 6e64522 to d931996 Compare November 2, 2026 17:11

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 One reproduced keyboard-continuity defect at this commit. The previously reproduced community-isolation finding at 4f207fc remains unresolved in our review; it has not been revalidated against this head.

Comment thread src/bundled/acp/tabs.tsx Resolved

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 This finding was reproduced at 4f207fc. Revalidation on subsequent heads was blocked; this report does not claim current-head verification.

Comment thread src/bundled/acp/runtime.ts Resolved

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security), and Groot (product/accessibility) lanes.

The earlier standalone Model/Thinking and History focus findings are repaired in source. One P2 integration defect remains: fresh sessions can reject a supported synced thinking level when ACP advertises grouped choices. Details and the smallest repair are inline. Source assessment: 8/10 pending that correction.

Head: 9e39225
Base: aefa608

Follow-up scope: prior repairs, new community-membership routing, confirmation focus, and their shared-client integration. Inspected source tests, History success/error/Back/retry paths, and session/tool/persistence callers. Unchanged feature areas were not exhaustively reopened. The public PR description and eight commit messages were inspected; no description attachments or new disclosure finding.

Source-only: no tests, builds, apps, PR code or live harnesses executed. CI, native lifecycle/performance, rendered accessibility, live preset compatibility and human acceptance remain unverified. This is a non-blocking COMMENT review, not approval.

@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from 6b05c87 to 9b1fe74 Compare November 2, 2026 18:16

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security/concurrency), and Groot (product/accessibility) lanes.

The prior grouped-effort finding is repaired in source. One P2 integration defect remains in the new History navigation: real ACP replay turns have no channel ID, so their conversation labels cannot become links. Details and the smallest repair are inline. Source assessment: 8/10 pending that correction.

Head: 9b1fe74
Base: ffa65d8

Follow-up scope: grouped-effort normalization, History conversation navigation, membership-read regression coverage, and the rebase’s ActivityAccessory Retry integration. Seven prior repair patches are unchanged; the initial feature patch adapts to the new base, with three added follow-ups. Unchanged feature areas were not exhaustively reopened. The public description and eleven feature commit messages were inspected; no description attachments or new disclosure finding.

Source-only: no tests, builds, apps, PR code or live harnesses executed. CI, native lifecycle/performance, rendered focus/accessibility (including Retry focus), live preset compatibility and human acceptance remain unverified. This is a non-blocking COMMENT review, not approval.

Comment thread src/bundled/acp/tabs.tsx Resolved

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket (systems/lifecycle), Mantis (correctness/security), and Groot (product/accessibility) lanes.

No new actionable findings. The prior History-link P2 is repaired in source: replayed turns now receive their channel ID from the saved conversation key, preserving known/unknown thread handling. The added colocated regression exercises the production runtime and replay reader through a fake ACP transport for both saved-key forms. Source assessment for this follow-up: 9/10.

Head: 8d1bcb5
Base: ffa65d8

Scope: the three-file follow-up from 9b1fe74, the previous finding, and relevant replay, History, navigation and ownership callers. Existing unavailable/error, Back/reopen recovery and focus paths were inspected in source; unchanged feature areas were not exhaustively reopened. The public description and twelve feature commit messages were inspected; no description attachments or new disclosure finding.

Source-only: no tests, builds, apps, PR code or live harnesses executed. CI, real harness replay, performance, rendered navigation/focus/accessibility and human acceptance remain unverified. This COMMENT is not approval or merge authorization.

@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch 2 times, most recently from 8095ec8 to 6191e08 Compare November 5, 2026 19:01
…esses

Squashes the PR's 12 commits and rebases them onto main.

Co-authored-by: Will Pfleger <wpfleger@block.xyz>
Co-authored-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
Signed-off-by: Will Pfleger <wpfleger@block.xyz>
@wpfleger96
wpfleger96 force-pushed the hayt/generic-acp-runtime branch from 944d349 to 7c0ee18 Compare November 10, 2026 00:01

This branch has not been deployed

No deployments
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.

4 participants