| reason | No | Optional structured error-mode reason: 'wrong_number', 'bad_citation', 'missing_data', 'wrong_company', 'formatting', 'hallucinated_fact', 'tool_error', 'coverage_gap', or 'other'. | |
| context | No | Optional free-form context object (stored as JSON), e.g. { tool: 'get_company_fundamentals', ticker: 'AAPL', request_id: 'abc123' }. Avoid secrets. | |
| fact_id | No | Optional disputed `fact_id` (for wrong_number / bad_citation feedback). | |
| message | Yes | The feedback body (1–4000 chars). Be specific: what you expected, what happened, and any reproduction steps. May contain the user's own words — it is stored for triage and never used for arithmetic. | |
| subject | No | Optional short title (≤140 chars) summarizing the feedback. | |
| surface | No | Optional product surface the feedback concerns: 'mcp', 'workspace', 'sdk', 'dashboard', or 'api'. | |
| category | Yes | What kind of feedback this is: 'bug' (something broke), 'feature_request' (something missing), 'experience' (UX / clarity / docs), 'data_quality' (a wrong/missing/stale figure), or 'other'. | |
| severity | No | Optional impact classification: 'low', 'medium', or 'high'. | |
| sentiment | No | Optional sentiment of this feedback: 'positive' (worked well), 'negative' (something was wrong), or 'correction' (you are supplying the right value). | |
| target_id | No | Optional id of the artifact this feedback targets (e.g. a report or thesis id). | |
| request_id | No | Optional `_meta` request id of the turn that produced the artifact, for correlation. | |
| target_type | No | Optional kind of artifact the feedback targets: 'chat_message', 'report', 'thesis', 'claim', 'tool_call', 'schema', or 'other'. | |
| expected_value | No | Optional caller-asserted correct value, in your own words. Stored verbatim for triage — NEVER computed or trusted as data. | |
| idempotency_key | No | Optional client-supplied key (1–64 chars). For authenticated callers, reusing the same key files the feedback exactly once — safe to retry on a network error. Ignored for guest/sample callers (no account to scope dedup to). | |