Repository navigation
Conversation
…you between computers (BRA-3274) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ent, and simplify the store Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, and never lose items on a failed read or write Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nswer as its next prompt (BRA-3276) berthd ask and the berth_ask MCP tool post the session's own attention item: a decision, an action, work ready to merge, or blocked. It returns at once, and a new ask replaces the last. The box refuses a kind it doesn't know, any field it doesn't name, and options on anything but a decision, so an ask is words with no link or command for a button to follow. When a person answers or closes it, the box types that into the agent, held until it is idle, with the item's revision as the idempotency key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e answer from a plugin as its next prompt (BRA-3276) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he agent is told without the person waiting (BRA-3276) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… an ask passes the session's send gate (BRA-3276) The settled ask keeps who settled it in telling until the box holds the prompt for the agent; the PATCH starts the telling and every sweep tries again what didn't go. A PATCH that would settle a session's own ask asks before:session.send for that session first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…3276) Delivery goes by when the ask settled, not its revision: the idempotency key and told both use it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@Stener1 is attempting to deploy a commit to the seanbrydonio's projects Team on Vercel. A member of the Team first needs to authorize it. |
…'s description says when to ask (BRA-3276) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…packages' ptr (BRA-3276) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #219 (attention items on the box): this branch is #219's three commits plus four of its own. Review the last four, or the diff against
5b1b834.Summary
A question form stops an agent until someone answers. For what needs a person but can wait (a PR ready to merge, a key only they can rotate), an agent now posts an ask and carries on. When the person answers or closes it, the box types that into the agent as its next prompt.
sequenceDiagram participant Agent participant Box as berthd participant App as Shipyard (a plugin on berth.attention) Agent->>Box: berth_ask / berthd ask {kind, title, details?, options?, recommended?} Box-->>Agent: {key: session:<name>, revision, status: open} (at once) Note over Agent: ends its turn, or keeps working App->>Box: PATCH /v1/attention/session:<name> {answer} Box->>Box: before:session.send gate, then save with telling = who settled it Box->>Agent: prompt held until idle, idem key attention:<key>@<settled> Box->>Box: told → telling cleared (each sweep retries until it is)An ask is words and nothing else: no link or command for a button to follow, and every kind but a decision gets the app's own buttons. The box refuses an unknown kind and any field it doesn't name, so an agent can't sneak in a
urlor acommand.Evidence
Live, real Claude Code on a dev box (
.claude/skills/verify-berthd/scripts/scenarios/ask-live.mjsondev-box.sh). Sessionaskerruns with only this build'sberthd mcp(--strict-mcp-config) and callsberth_ask. Sessionaskrunsbin/berthd ask. A small test plugin onberth.attentionshows both asks, and the scenario clicks in it:Each agent wrote the answer it got as its next prompt to a file, using its own Bash tool. The scenario reads the file back, and also the turn the box recorded (prompted by the person's laptop, under the ask's idempotency key).
Unit tests (
go test ./internal/box -run 'AnAgentsAsk|ASettledAsk|SettlingAnAsk|AnswerText',./internal/mcpserver -run AnAsk):reviewormark, an extra field (url,key, an option'scommand), options on aready, a session that isn't there.tellingsurvives a restart of the store, a snooze while the agent is being told doesn't send the answer twice, and a session that's gone lets it go.before:session.sendhook that refuses → the settling PATCH gets 403 and the ask stays open.go vet ./...andgo test -race ./...pass (onlyTestTheCatalogIsCappedfails here: it counts this machine's own commands and fails on main too). The app's checks,test,buildandtsc -p e2epass.docs-sitebuilds.cargo checkdidn't run: no Rust changed, and this machine has no GTK.Review: Codex
reviewandadversarial-reviewran once, plus one re-review. Fixed:tellingplus the sweep retries)Merge Danger
Door: two-way
Additive: one route, one MCP tool, one command, one optional field on attention items. Agents that never ask lose nothing, and reverting removes it all.
Blast Radius: small
New behaviour only runs when an agent posts an ask. One existing path changes: a
PATCHthat settles a session's own ask (session:<name>), even one a plugin posted, now types into that session and passes itsbefore:session.sendgate.decodeLimitnow sharesdecodeBodywithdecodeStrictand behaves as before.🤖 Generated with Claude Code
Open in [code]smith · Need help on this PR? Tag
@codesmith-botwith what you need.