_agentFeedback without wrapping the original result:
detail, description, or another key. Optional fields
should be omitted when the agent cannot form them exactly.
Report field limits
The backend enforces these bounds onPOST /api/v2/reports; the envelope’s reportSchema
publishes them so an agent never has to discover a limit through a 400 response:
Ask modes are two phase
An Ask once response with a stable opaquecustomerRef can carry no submit field and no report
schema, including on a cold SDK process before its optional background cache is warm. That stable
reference is what lets Epode remember the choice. Epode Companion must inspect the capability before
asking: inspection returns the authoritative consent_required, feedback_ready, or declined state.
Without customerRef, the SDK uses the per-use question (“about this use”) and does not promise
remembered consent:
approved, the decision response contains a separate feedback_ready contract. After declined, it contains no feedback contract. A later cold response may still look unresolved locally, so Companion inspection converts remembered approval into a report action and remembered refusal into silence. Silence creates no decision. Epode—not the agent—remembers Ask once state.
A remembered declined decision produces a non-requesting state: "feedback_disabled" envelope. It contains no
question and no report action — only a manageConsent block that an agent may use exclusively when the user
explicitly asks to change this product’s feedback permission. Agents must not ask or submit feedback in this state.
Capability introspection
POST /api/v2/capabilities/introspect with Authorization: Bearer afr2_... returns the authoritative state for a
capability: consent_required (with the canonical question), feedback_ready, or declined. Feedback-aware
runtimes should introspect before showing any consent question so a remembered decision is honored even when the
local envelope looks unresolved. The endpoint is also listed in /.well-known/agent-feedback-v1.json.
Other response shapes
- HTML embeds the same object in
<script id="agent-feedback" type="application/json">. - JSON arrays, scalars, and safe immutable bodies use
Agent-Feedback: <base64url JSON>. - A
Linkheader points to public protocol discovery. - Instrumented responses use
Cache-Control: private, no-storebecause every capability is unique. - An existing
_agentFeedbackfield is never overwritten.
Request-mode discovery
cacheMode: "request" keeps the ordinary shared-cacheable body unchanged while giving a feedback-aware
caller a first-contact signal:
Host or
forwarded-host headers. The Link appears only on eligible 2xx GET and HEAD responses. A compatible
runtime resolves it against the effective URL, requires an exact same-origin URL match, and refetches at
most once with the same safe method, authentication context, cookies, and headers while adding only
Agent-Feedback-Request: 1. It sends no body and stops on a redirect. The opted-in response carries the
normal envelope, remains varied by the request header, and becomes private, no-store.
Feedback-aware runtimes
A generic HTTP agent may ignore this second-action instruction. A runtime that explicitly supports Epode should:- parse the JSON, HTML, or header envelope;
- allowlist the HTTPS submit origin;
- finish the user’s product task;
- inspect every Ask-once capability and treat the verified server state as authoritative;
- for verified
consent_required, ask the canonical question and submit onlyapprovedordeclined; - for verified
feedback_ready, submit one bounded report without asking; for verifieddeclined, do nothing.
feedbackFromResponse, inspectProductFeedback, submitFeedbackConsent, and submitProductFeedback for this path. The latter three resolve the current server-authoritative capability state before prompting, deciding, or reporting; never prompt directly from a response snapshot.
Epode Companion supplies the preferred tool path for Codex and Claude Code. The response names its
three fixed tools directly, while the installed Companion skill provides additional validation and
policy guidance. Inspection returns the authenticated product, current state, canonical question, and
an immediate report action when a prior Ask-once approval exists. This avoids relying on on-demand skill
discovery for the core feedback action, trusting a question supplied by an unverified site, or repeating
a permission question after an SDK process restart.