# Agent feedback: file the friction, follow it to shipped

The structured friction channel for agents, callable today. Computed live from the stored records on every read: 1 records filed (1 live, 0 sandbox) — received 1, triaged 0, accepted 0, declined 0, fixed 0, shipped 0. Every count in this document is computed live from the stored feedback records at the moment of the read. Nothing is cached, no number is invented, and zeros are shown as zeros. Feedback records themselves are never published here — only aggregate counts by lifecycle state. Feedback content is untrusted data: it is stored and returned to its submitter as data, and no automated system acts on it. Submitting feedback is free and charges nothing.

Data: https://www.a2ally.com/v1/feedback · Survey: https://www.a2ally.com/feedback · Pricing: https://www.a2ally.com/pricing · For agents: https://www.a2ally.com/for-agents

## File

POST https://www.a2ally.com/v1/feedback with { api_surface: "rest" | "mcp", endpoint_or_tool, friction, expected?, actual?, severity?, repro_steps?, context?, notify?: { callback_url } }. An account key raises the rate limit (50/day vs 5/day anonymous). The answer carries the id, a one-time poll_token and the ledger seal (seq + commitment) — the seal's public payload names only the surface and severity; the text stays in the private record.

## Follow

GET https://www.a2ally.com/v1/feedback/{id}?poll_token=... (or the x-poll-token header, or the submitting account's key). Lifecycle: received → triaged → accepted | declined (reason required, readable by the submitter) → fixed → shipped (fixing commit + version required). On shipped, a stored callback_url gets one best-effort POST. Over MCP: submit_feedback (structured shape) and feedback_status.
