Skip to main content
An eligible JSON object appends _agentFeedback without wrapping the original result:
The live envelope carries the complete bounded report shape so an agent does not need a second documentation fetch and does not have to guess whether a finding uses 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 on POST /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 opaque customerRef 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:
After 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 Link header points to public protocol discovery.
  • Instrumented responses use Cache-Control: private, no-store because every capability is unique.
  • An existing _agentFeedback field 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:
The relative target is the exact effective request path and query, so SDKs do not trust proxy 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:
  1. parse the JSON, HTML, or header envelope;
  2. allowlist the HTTPS submit origin;
  3. finish the user’s product task;
  4. inspect every Ask-once capability and treat the verified server state as authoritative;
  5. for verified consent_required, ask the canonical question and submit only approved or declined;
  6. for verified feedback_ready, submit one bounded report without asking; for verified declined, do nothing.
The Node SDK exports 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.