Write

log_curation_decision

Records explicit curation decisions — proposals, rejections, swaps, and rationale — that passive write-tool capture misses, grounding future agent work in the creator's accumulated taste.


Parameters

NameTypeRequiredDescription
outlineIdstringOutline ID to record decisions against. Defaults to the authenticated creator's own outline.
decisionsarray of decision objectsYes1–50 curation decisions to record. Each object carries: eventType (enum), entity (enum), optional entityRef (stable card/stack ID), optional value (the chosen value or rejected alternative), and optional rationale (why the creator chose this — the richest taste signal).
decisions[].eventTypeenum: proposed | accepted | rejected | swapped | edited | reordered | cover_set | cover_rejectedYesThe decision kind. Use proposed, rejected, swapped, and cover_rejected for signal that final state alone does not capture.
decisions[].entityenum: card | cover | copy | sequence | stack | profile | social | seoYesWhat domain the decision was about.
decisions[].entityRefstringStable ID of the specific card or stack the decision concerns, when applicable.
decisions[].valueanyThe chosen value; for rejected or swapped events, include the alternative(s) alongside the winner. Must be an object, array, or null — NOT a bare string or number (Payload json field rejects top-level scalars).
decisions[].rationalestringWhy the creator chose this. The richest taste signal available; keep it concise.

Response

FieldTypeWhat it means
outlineIdstringThe outline ID the decisions were logged against.
loggednumberNumber of events successfully persisted to the database. May be less than received if any individual inserts failed.
receivednumberNumber of decision objects the tool received in the request.

Example

Request

json
{ "outlineId": "42", "decisions": [ { "eventType": "rejected", "entity": "cover", "entityRef": "card-88", "value": { "rejected": "https://cdn.outli.ne/img/pose-1.jpg", "chosen": "https://cdn.outli.ne/img/pose-3.jpg" }, "rationale": "Pose 1 felt stiff; pose 3 shows more personality" }, { "eventType": "swapped", "entity": "copy", "entityRef": "card-88", "value": { "original": "Book a session today", "chosen": "Let's make something" }, "rationale": "Creator wanted less salesy, more inviting" }, { "eventType": "reordered", "entity": "sequence", "value": { "before": ["card-91", "card-88", "card-95"], "after": ["card-88", "card-95", "card-91"] }, "rationale": "Lead with the strongest portfolio piece" } ] }

Response

json
{ "outlineId": "42", "logged": 3, "received": 3 }

When to use

Call this at the end of any curation pass — after add_card, update_card, reorder_cards, or a cover-selection round — to record what the creator rejected or swapped and why. It is most valuable when the agent proposed alternatives the creator evaluated, because that decision signal never reaches the write tools.


Gotchas

Watch out

  • The value field must be an object, array, or null — a bare string or number causes a Payload json-field validation error and the event is silently dropped, so logged will be less than received.
  • This is a dumb pipe — Outline stores exactly what the agent reports and runs no inference. Accuracy and richness of rationale is entirely up to the agent.
  • outlineId defaults to the authenticated creator's own outline; only pass it explicitly when acting on a different outline that the user owns.
  • Passive write-tool capture (add_card, update_card, reorder_cards) records accepted final outcomes automatically; call this tool specifically for what it cannot see: proposals, rejections, swaps, and the reasoning behind them.