Repository navigation
Conversation
Agents that hit a confusing error, a misleading doc or a missing feature had no way to tell us, so that friction never reached the team. This adds one path for it, shared by the CLI and MCP. Gateway: - POST /api/v1/feedback/:workspaceId stores a report in a new feedback table (migration 064) and sends a feedback.submitted event to the operator's event callbacks only. Reports are about the platform, so they never go to workspace event history or webhooks. - A report has a kind, a summary (required, at most 300 characters), whether it blocked the task, the command, error code and message, details, a suggested improvement, the model and the environment. The caller and agent session come from the attribution headers. - Text is scrubbed before it is stored: the caller's own token, private keys, URL credentials, bearer values, key=value secrets, known token formats and long random strings. - Bodies are capped at 64 KiB. A workspace can send 30 reports an hour and an agent session (else a token) 10; past that the gateway answers 429 and tells the agent to continue. An idempotency key, or the same reporter repeating a summary within a day, returns the earlier report. MCP: send_feedback posts through the same route and is listed whatever ?features=, ?tools= or ?readonly= a connection sets. The server instructions say when to use it. CLI: `feedback -m "..." --kind bug`, with --blocked, --details, --suggest, --command, --model and --last-error. The CLI remembers the error that ended its last run, with the command and option names but never option values, so --last-error can attach it. Server failures now get their own INTERNAL code (HTTP 500, gRPC INTERNAL and DATA_LOSS), and their JSON errors carry a `feedback` field with the command to report them; HTTP 429 maps to RATE_LIMITED. BETA9_NO_FEEDBACK=1 turns reports off and hides send_feedback from the local MCP bridge. The agent skill gains a Feedback section. Bumps the SDK to 0.1.293. Against Postgres 14, every migration applies to a fresh database, a repeated idempotency key returns the first report, and 064 rolls back. `pytest tests`: 858 passed, 2 skipped. Co-authored-by: Cursor <cursoragent@cursor.com>
luke-lombardi
requested changes
Oct 31, 2026
Contributor
There was a problem hiding this comment.
This does not belong in the OSS layer - we shouldn't have a feedback table in the control plane. cc @mernit. If we need this, the feedback should live in beam-client + internal-api
Contributor
Author
|
Closing: feedback doesn't belong in the open-source control plane. It now lives in Beam's own code: |
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.
Agents that hit a confusing error, a misleading doc or a missing feature had no way to tell us, so that friction never reached the team. This adds one path for it, shared by the CLI and MCP.
Gateway.
POST /api/v1/feedback/:workspaceIdstores a report in a newfeedbacktable (migration 064). It then sends afeedback.submittedevent to the operator's event callbacks only. Reports are about the platform, so they never go to workspace event history or webhooks.bug,error_message,missing_capability,docs,performance,praise,other) and a summary (required, at most 300 characters). It can also say whether the problem blocked the task, and carry the command, the error code and message, details, a suggested improvement, the model and the environment. The caller and agent session come from the attribution headers.key=valuesecrets, known token formats (AWS, GitHub, Slack, OpenAI, Stripe, Hugging Face, Google, JWTs) and long random strings. Paths, hex digests, UUIDs,max_tokensandtokenizersurvive.MCP.
send_feedbackposts through the same route, so validation, scrubbing and limits live in one place. It is listed whatever?features=,?tools=or?readonly=a connection sets, and the server instructions say when to use it: when Beam seems at fault or a doc or tool description misled the agent, never for the user's own errors.CLI.
beam feedback -m "..." --kind bug, with--blocked,--details,--suggest,--command,--modeland--last-error.--last-errorcan attach it. It keeps the command and option names but never option values.INTERNALcode (HTTP 500, gRPCINTERNALandDATA_LOSS). Their JSON errors carry afeedbackfield with the command to report them.RATE_LIMITED.BETA9_NO_FEEDBACK=1turns reports off and hidessend_feedbackfrom the local MCP bridge.Bumps the SDK to 0.1.293.
Rollout
beta9AWS secret (events.callbacksinconfig.yaml). If the internal-api callback listseventTypes, addfeedback.submittedto it. Until then, reports are stored in Postgres and go nowhere else.slackformat callback at an incoming webhook witheventTypes: [feedback.submitted].Worth a look
send_feedbackover MCP, as with every MCP tool, but can still use the REST route and the CLI.ERRORfor server failures now seeINTERNAL. gRPCUNKNOWNstaysERROR, because the gateway returns plain Go errors asUNKNOWN.Testing
go test ./pkg/...passes apart from twopkg/workertests: one also fails onmainlocally (it needs Linux), and the other is timing-sensitive and passes when run alone.token_id, and 064 rolls back and reapplies.pytest testsgives 858 passed, 2 skipped (871 with Attribute CLI and MCP calls to the coding agent that made them #2087 merged).uv lock --checkandruff check .pass.Independent of #2087; the two merge cleanly in either order.