Corrections
Reviewed correction write-back. Records a feedback source note, a correction claim, an extracted-from edge, and a supersedes edge to a reviewed target.
POST /v1/feedback/corrections
Marrow does not silently mutate facts. A correction is its own claim with provenance. The original target stays in the graph but is now marked as superseded, so AI tools can choose whether to surface the original, the correction, or both.
Authentication
API key with scope correction.
Request body
{
"text": "Do not say Avery led the rollout strategy. Say Avery led cross-functional delivery and launch.",
"claim": "Avery led cross-functional delivery and launch of the Northstar onboarding rollout; the rollout strategy came from the Product, Design, and Operations partner teams.",
"supersedes": { "type": "claim", "id": "1f0e…" },
"facets": ["onboarding-rollout", "correction"],
"language": "en",
"datedAt": "2026-05-14",
"rationale": "Resume tailor mis-attributed strategy to Avery; user corrected.",
"confidenceScore": 1,
"confirm": false
}
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
text |
string | yes | The raw correction text. Stored as a feedback source note |
|
claim |
string | no | The corrected claim text. If omitted, no replacement claim is written | |
supersedes |
object | yes | The reviewed target: { "type": "note" | "claim" | ..., "id": uuid } |
|
facets |
string[] | no | [] |
Retrieval facets for the new records |
language |
string | no | "en" |
ISO language code |
datedAt |
string | yes | YYYY-MM-DD. When the correction was made |
|
rationale |
string | no | Free-form note explaining the correction | |
confidenceScore |
number | no | 1 |
[0, 1] |
confirm |
boolean | no | false |
When false, returns a write plan and does not persist anything |
Response: 200 OK (dry-run)
{
"schemaVersion": "marrow-feedback-correction-plan-v1",
"mode": "dry-run",
"plan": {
"feedbackNote": { "text": "Do not say Avery led the rollout strategy. …", "facets": ["correction"] },
"correctionClaim": { "text": "Avery led cross-functional delivery …", "facets": ["onboarding-rollout", "correction"] },
"edges": [
{ "predicate": "extracted-from", "source": "<new claim>", "target": "<feedback note>" },
{ "predicate": "supersedes", "source": "<new claim>", "target": "claim:1f0e…" }
]
}
}
Response: 201 Created (written)
{
"schemaVersion": "marrow-feedback-correction-v1",
"mode": "written",
"feedbackNote": { "id": "ab12…", "sourceKind": "feedback", "sourceRunId": "c0e8…" },
"correctionClaim": { "id": "cd34…", "sourceKind": "feedback", "sourceRunId": "c0e8…" },
"edges": [
{ "id": "ed56…", "predicate": "extracted-from" },
{ "id": "ed78…", "predicate": "supersedes" }
]
}
Errors
| Code | error.code |
Reason |
|---|---|---|
| 401 | unauthorized |
Missing or invalid API key |
| 403 | forbidden |
API key lacks scope correction |
| 404 | not_found |
The supersedes target does not exist for this account |
| 422 | validation_error |
Body failed validation |
| 429 | rate_limit_exceeded |
Rate limit hit |
CLI mapping
npm run dev -- feedback correction \
--supersedes claim:1f0e… \
--text "Do not say Avery led the rollout strategy. …" \
--claim "Avery led cross-functional delivery and launch of the Northstar onboarding rollout; …" \
--facets onboarding-rollout,correction
Add --yes to commit. Without it, the CLI prints the same plan structure the API returns for confirm: false.