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
| Name | Type | Required | Description |
|---|---|---|---|
| outlineId | string | — | Outline ID to record decisions against. Defaults to the authenticated creator's own outline. |
| decisions | array of decision objects | Yes | 1–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[].eventType | enum: proposed | accepted | rejected | swapped | edited | reordered | cover_set | cover_rejected | Yes | The decision kind. Use proposed, rejected, swapped, and cover_rejected for signal that final state alone does not capture. |
| decisions[].entity | enum: card | cover | copy | sequence | stack | profile | social | seo | Yes | What domain the decision was about. |
| decisions[].entityRef | string | — | Stable ID of the specific card or stack the decision concerns, when applicable. |
| decisions[].value | any | — | The 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[].rationale | string | — | Why the creator chose this. The richest taste signal available; keep it concise. |
Response
| Field | Type | What it means |
|---|---|---|
| outlineId | string | The outline ID the decisions were logged against. |
| logged | number | Number of events successfully persisted to the database. May be less than received if any individual inserts failed. |
| received | number | Number 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
valuefield must be an object, array, ornull— a bare string or number causes a Payload json-field validation error and the event is silently dropped, sologgedwill be less thanreceived. - This is a dumb pipe — Outline stores exactly what the agent reports and runs no inference. Accuracy and richness of
rationaleis entirely up to the agent. outlineIddefaults 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.