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.