{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/getoneprofile-ai/json-schema/getoneprofile-ai-thumbs-down-read-schema-schema.json",
  "title": "ThumbsDownReadSchema",
  "description": "What a thumbs down did.",
  "x-generated": "2026-11-10",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/getoneprofile-ai-agent-learnings-api-openapi.yml#/components/schemas/ThumbsDownReadSchema",
  "properties": {
    "action": {
      "$ref": "#/$defs/LearningAction",
      "description": "`added` a learning, or `updated` one about the same thing."
    },
    "agent_name": {
      "description": "The agent that learned it.",
      "title": "Agent Name",
      "type": "string"
    },
    "event_id": {
      "description": "The thumbs down, for Undo.",
      "format": "uuid",
      "title": "Event Id",
      "type": "string"
    },
    "learning": {
      "anyOf": [
        {
          "$ref": "#/$defs/AgentLearningReadSchema"
        },
        {
          "type": "null"
        }
      ],
      "description": "The learning as written; null on a replay whose learning was deleted since."
    },
    "more": {
      "description": "A table agent's other learnings it wrote, one for each other point the reason made, in order; empty when it made one. Always empty on an outbound message, whose changes `proposal.changes` lists. Undo takes them all back.",
      "items": {
        "$ref": "#/$defs/LearnedPartReadSchema"
      },
      "title": "More",
      "type": "array"
    },
    "previous_text": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "What the updated learning said before; null for an added one.",
      "title": "Previous Text"
    },
    "proposal": {
      "anyOf": [
        {
          "$ref": "#/$defs/ProposalReadSchema"
        },
        {
          "type": "null"
        }
      ],
      "description": "The feedback session it opened or refined: the changes it proposes, not saved yet; `learning` is null then. A further thumbs down on the same message, cells or Preview example refines it (the latest note wins). Null on a replay of a session saved or thrown away since."
    },
    "redo": {
      "$ref": "#/$defs/RedoReadSchema"
    },
    "subject_key": {
      "description": "What the thumbs down was given on, as `list_thumbs_downs` takes it, so a screen that gave it elsewhere (the AI Assistant's card) can follow its note.",
      "title": "Subject Key",
      "type": "string"
    },
    "surface": {
      "$ref": "#/$defs/LearningSource",
      "description": "Where it was given; `hand_edit` for a learning a person's own edit proposed, whose card dismisses it and keeps the edit."
    }
  },
  "required": [
    "event_id",
    "action",
    "learning",
    "previous_text",
    "agent_name",
    "redo",
    "subject_key",
    "surface"
  ],
  "type": "object",
  "$defs": {
    "AgentLearningReadSchema": {
      "description": "One learning: a one-line rule the agent follows on every output.",
      "properties": {
        "all_sequences": {
          "default": false,
          "description": "Whether every sequence's writer follows it, rather than one agent.",
          "title": "All Sequences",
          "type": "boolean"
        },
        "batch_id": {
          "anyOf": [
            {
              "format": "uuid",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The release that wrote it, for a learning split from a long prompt (`simplified`) or carried over from old feedback (`carried`): undoing that event (POST /agent-learnings/thumbs-downs/{event_id}/revert/ with this id) is Put back the original prompt. Null for a learning a thumbs down taught.",
          "title": "Batch Id"
        },
        "created_at": {
          "format": "date-time",
          "title": "Created At",
          "type": "string"
        },
        "created_by_user_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Who taught it, or null for a release.",
          "title": "Created By User Id"
        },
        "id": {
          "format": "uuid",
          "title": "Id",
          "type": "string"
        },
        "last_event_id": {
          "anyOf": [
            {
              "format": "uuid",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The latest thumbs down that wrote it, for Undo (POST /agent-learnings/thumbs-downs/{event_id}/revert/); null when none did or the learning was only read.",
          "title": "Last Event Id"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "What the person said in the thumbs down that last wrote it (`last_event_id`), every note of a refined one joined, one per line; null when no thumbs down did, and once its feedback session closed: a saved, discarded or undone session keeps none of the person's notes.",
          "title": "Note"
        },
        "note_surface": {
          "anyOf": [
            {
              "$ref": "#/$defs/LearningSource"
            },
            {
              "type": "null"
            }
          ],
          "description": "Where the thumbs down that last wrote it (`last_event_id`) was given, which `note` and `source_text` come from; it can differ from `source` once a later thumbs down on another surface changed it. Null when no thumbs down did."
        },
        "noted_at": {
          "anyOf": [
            {
              "format": "date-time",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "When that thumbs down was given; null when no thumbs down wrote it.",
          "title": "Noted At"
        },
        "notes": {
          "description": "The same notes one by one, oldest first, each whole: the thumbs down's own, then each further note in its session. Empty when no thumbs down wrote it, and once its feedback session closed.",
          "items": {
            "type": "string"
          },
          "title": "Notes",
          "type": "array"
        },
        "repeats": {
          "default": 0,
          "description": "How often a later Needs work asked for it again, as it stood, once saved; 0 when none did.",
          "title": "Repeats",
          "type": "integer"
        },
        "source": {
          "$ref": "#/$defs/LearningSource",
          "description": "Where it was taught: the surface whose thumbs down added it, `simplified` when a long prompt was split into a goal and learnings, `carried` when old feedback was carried over."
        },
        "source_text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The message that thumbs down was given on, as it read then; null when none was kept (a table agent's, or a learning a release wrote).",
          "title": "Source Text"
        },
        "step_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The one step of the sequence it holds for, by the step's agent prompt slot; null when it holds for every message the agent writes.",
          "title": "Step Key"
        },
        "step_label": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "That step as the sequence names it now, e.g. \"Step 2 · Follow up\"; null when it holds for every message, or the step is gone.",
          "title": "Step Label"
        },
        "text": {
          "description": "The rule, one line.",
          "title": "Text",
          "type": "string"
        },
        "updated_at": {
          "format": "date-time",
          "title": "Updated At",
          "type": "string"
        }
      },
      "required": [
        "id",
        "text",
        "source",
        "created_at",
        "updated_at",
        "created_by_user_id",
        "last_event_id",
        "batch_id"
      ],
      "title": "AgentLearningReadSchema",
      "type": "object"
    },
    "ChangeKind": {
      "description": "What one change of a feedback session does to the learnings (F2).",
      "enum": [
        "add",
        "update",
        "delete",
        "keep",
        "instruction",
        "link",
        "fact"
      ],
      "title": "ChangeKind",
      "type": "string"
    },
    "ChangeOutcome": {
      "description": "What saving a session did with one of its changes (F2).",
      "enum": [
        "applied",
        "skipped_full",
        "skipped_changed",
        "pending",
        "undo_pending",
        "undone",
        "left",
        "left_out"
      ],
      "title": "ChangeOutcome",
      "type": "string"
    },
    "ChangeVersionReadSchema": {
      "description": "How a session's change read before a later note rewrote it.",
      "properties": {
        "find": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "An instruction edit's words it replaced.",
          "title": "Find"
        },
        "note": {
          "description": "The note that made this version.",
          "title": "Note",
          "type": "integer"
        },
        "replace_with": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "What the instruction edit put in their place.",
          "title": "Replace With"
        },
        "text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The learning, link or fact's answer as it read.",
          "title": "Text"
        }
      },
      "required": [
        "note",
        "text",
        "find",
        "replace_with"
      ],
      "title": "ChangeVersionReadSchema",
      "type": "object"
    },
    "LearnState": {
      "description": "Whether a session's learner turned its notes into changes (F3, F5).",
      "enum": [
        "ok",
        "failed"
      ],
      "title": "LearnState",
      "type": "string"
    },
    "LearnedPartReadSchema": {
      "description": "One more learning a thumbs down wrote, for another point its reason made.",
      "properties": {
        "action": {
          "$ref": "#/$defs/LearningAction",
          "description": "`added` a learning, or `updated` one about the same thing."
        },
        "learning_id": {
          "anyOf": [
            {
              "format": "uuid",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The learning; null once it was deleted.",
          "title": "Learning Id"
        },
        "previous_text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "What the updated learning said before; null for an added one.",
          "title": "Previous Text"
        },
        "text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The learning as the thumbs down wrote it.",
          "title": "Text"
        }
      },
      "required": [
        "action",
        "learning_id",
        "text",
        "previous_text"
      ],
      "title": "LearnedPartReadSchema",
      "type": "object"
    },
    "LearningAction": {
      "description": "What one event did to an agent's learnings.",
      "enum": [
        "added",
        "updated",
        "split",
        "carried",
        "skipped",
        "seeded",
        "session",
        "deleted"
      ],
      "title": "LearningAction",
      "type": "string"
    },
    "LearningSource": {
      "description": "Where a learning came from: the surface a thumbs down was given on, or a release pass.\n\nAlso the ``surface`` of the event that wrote it.",
      "enum": [
        "table_cells",
        "agent_preview",
        "task",
        "writing_preview",
        "reply_draft",
        "sent_message",
        "hand_edit",
        "simplified",
        "carried",
        "template",
        "hand"
      ],
      "title": "LearningSource",
      "type": "string"
    },
    "PointGoesTo": {
      "description": "Where one point of a session's notes belongs (F7).",
      "enum": [
        "rule",
        "this_message",
        "instruction",
        "link",
        "fact",
        "sender",
        "research",
        "pending"
      ],
      "title": "PointGoesTo",
      "type": "string"
    },
    "ProposalPointReadSchema": {
      "description": "One thing a feedback session's notes ask for, as its learner read them.",
      "properties": {
        "covered": {
          "description": "Whether a change learns it.",
          "title": "Covered",
          "type": "boolean"
        },
        "goes_to": {
          "$ref": "#/$defs/PointGoesTo",
          "description": "Where it belongs: `rule` (a learning), `this_message` (only this message: the rewrite follows it, nothing is kept), `instruction` (a step's or the reply's instruction), `link` (the sequence's call-to-action link), `fact` (the business Q&A), `sender` (a sender's own setting, changed on Senders) or `research` (the sequence's research settings). `sender` and `research` are never written."
        },
        "note": {
          "description": "The note it is in, from 1, oldest first (see `notes`).",
          "title": "Note",
          "type": "integer"
        },
        "number": {
          "description": "From 1, across every note: what a change's `points` name.",
          "title": "Number",
          "type": "integer"
        },
        "quote": {
          "description": "The note's own words for it; empty when the learner's quote was not found.",
          "title": "Quote",
          "type": "string"
        },
        "reason": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Why it is not learned (it names this contact, say); null when it is.",
          "title": "Reason"
        },
        "said": {
          "description": "The point in a few words.",
          "title": "Said",
          "type": "string"
        }
      },
      "required": [
        "number",
        "note",
        "quote",
        "said",
        "covered",
        "reason",
        "goes_to"
      ],
      "title": "ProposalPointReadSchema",
      "type": "object"
    },
    "ProposalReadSchema": {
      "description": "What a feedback session will learn, before a person saves it.\n\nSaved by Save (POST .../save/), by approving the rewritten task or reply, or by Looks\ngood on the rewritten Preview contact, the cells or the Preview example; thrown away by\nUndo, a rejection or a discard. A table agent's changes are its own, at `sequence` scope.\n`changes` lists every change; the fields beside it describe the first add or rewrite.",
      "properties": {
        "auto_rewrites": {
          "description": "How many messages written ahead (Tasks cards, messages waiting to send on their own, and waiting reply drafts) were written again once it was saved.",
          "title": "Auto Rewrites",
          "type": "integer"
        },
        "changes": {
          "description": "Every change it makes to the learnings, in the learner's order.",
          "items": {
            "$ref": "#/$defs/ProposedChangeReadSchema"
          },
          "title": "Changes",
          "type": "array"
        },
        "learn_detail": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Why it failed, said on the card; null when ok.",
          "title": "Learn Detail"
        },
        "learn_state": {
          "$ref": "#/$defs/LearnState",
          "description": "`ok`, or `failed` when the learner could not work out what to learn from the last note: nothing new is learned until Retry, and the changes before it stand."
        },
        "moved_from_text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Once saved for every sequence: this sequence's learning it took the place of, which Undo puts back.",
          "title": "Moved From Text"
        },
        "points": {
          "description": "What the notes ask for, as its learner read them; each change names its own. Empty once the session closed: they go with its notes.",
          "items": {
            "$ref": "#/$defs/ProposalPointReadSchema"
          },
          "title": "Points",
          "type": "array"
        },
        "replaces_scope": {
          "anyOf": [
            {
              "$ref": "#/$defs/ProposedScope"
            },
            {
              "type": "null"
            }
          ],
          "description": "Whose learning the first change rewrites: this sequence's, or every sequence's. A rewrite of every sequence's learning kept at `sequence` scope saves a new learning for this sequence instead (Replaces in this sequence)."
        },
        "replaces_text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The saved learning the first change rewrites, as it read when proposed (Replaces: ...); null when it adds one.",
          "title": "Replaces Text"
        },
        "rev": {
          "description": "The revision of `changes`: it moves on every refine or edit of them.",
          "title": "Rev",
          "type": "integer"
        },
        "saved_learning_id": {
          "anyOf": [
            {
              "format": "uuid",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The learning the first change saved, once saved; null while it waits or once thrown away.",
          "title": "Saved Learning Id"
        },
        "scope": {
          "$ref": "#/$defs/ProposedScope",
          "description": "The first change's scope. `sequence`: this sequence only (the default). `account`: every sequence's writer, its emails, LinkedIn messages and replies."
        },
        "text": {
          "description": "The first change's learning as it would be saved, one line.",
          "title": "Text",
          "type": "string"
        }
      },
      "required": [
        "changes",
        "rev",
        "text",
        "scope",
        "replaces_text",
        "replaces_scope",
        "saved_learning_id",
        "moved_from_text",
        "auto_rewrites",
        "points",
        "learn_state",
        "learn_detail"
      ],
      "title": "ProposalReadSchema",
      "type": "object"
    },
    "ProposedChangeReadSchema": {
      "description": "One change a feedback session makes: a learning, an instruction, the link or a fact.",
      "properties": {
        "find": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "An instruction edit's words it replaces.",
          "title": "Find"
        },
        "history": {
          "description": "How it read before later notes rewrote it, oldest first.",
          "items": {
            "$ref": "#/$defs/ChangeVersionReadSchema"
          },
          "title": "History",
          "type": "array"
        },
        "id": {
          "description": "Stable within its session: `c1`, `c2`...",
          "title": "Id",
          "type": "string"
        },
        "kind": {
          "$ref": "#/$defs/ChangeKind",
          "description": "`add` a learning, `update` (rewrite) one, `delete` one, or `keep` one that already says what a point asks (nothing is written); `instruction`: edit a step's or the reply's instruction (`find` becomes `replace_with`); `link`: the sequence's call-to-action link becomes `text`; `fact`: keep `question` and its answer `text` in the business Q&A."
        },
        "note": {
          "description": "The note of the session (`thread[].number`) that last made or rewrote it; 0 for one made before notes were threaded.",
          "title": "Note",
          "type": "integer"
        },
        "off": {
          "description": "A person left it out: the page's yes saves every change still on, never this one.",
          "title": "Off",
          "type": "boolean"
        },
        "outcome": {
          "anyOf": [
            {
              "$ref": "#/$defs/ChangeOutcome"
            },
            {
              "type": "null"
            }
          ],
          "description": "Null while it waits. Once saved: `applied`, `skipped_full` (its list was full) or `skipped_changed` (what it changes was edited meanwhile); an instruction, link or fact is `pending` until written, a moment after the save. Once undone: `undo_pending`, then `undone`, or `left` when it was changed since."
        },
        "points": {
          "description": "The numbers of the points it learns (`points`).",
          "items": {
            "type": "integer"
          },
          "title": "Points",
          "type": "array"
        },
        "question": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A fact's question.",
          "title": "Question"
        },
        "replace_with": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "What an instruction edit puts in their place; empty removes them.",
          "title": "Replace With"
        },
        "replaces_scope": {
          "anyOf": [
            {
              "$ref": "#/$defs/ProposedScope"
            },
            {
              "type": "null"
            }
          ],
          "description": "Whose learning it rewrites: this sequence's, or every sequence's."
        },
        "replaces_text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The saved learning it rewrites or deletes, as it read when proposed; null for an add.",
          "title": "Replaces Text"
        },
        "saved_learning_id": {
          "anyOf": [
            {
              "format": "uuid",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The learning it saved, once applied; null for a delete or while it waits.",
          "title": "Saved Learning Id"
        },
        "scope": {
          "$ref": "#/$defs/ProposedScope",
          "description": "`sequence`: this sequence only. `account`: every sequence's writer. For a delete, whose learning goes."
        },
        "step_label": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "An instruction edit's step, e.g. \"Step 2 · Follow up\", or \"Replies\"; for an add or an update, the one step the learning holds for, null for every message.",
          "title": "Step Label"
        },
        "text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The learning as it would read; a link change's new link; a fact's answer. Null for a delete, a keep or an instruction edit.",
          "title": "Text"
        },
        "words": {
          "description": "How many words its learning has (a learning aims at 5 to 10); 0 for a change with no learning.",
          "title": "Words",
          "type": "integer"
        }
      },
      "required": [
        "id",
        "kind",
        "text",
        "step_label",
        "find",
        "replace_with",
        "question",
        "scope",
        "replaces_text",
        "replaces_scope",
        "outcome",
        "saved_learning_id",
        "points",
        "note",
        "off",
        "history",
        "words"
      ],
      "title": "ProposedChangeReadSchema",
      "type": "object"
    },
    "ProposedScope": {
      "description": "Which writers a proposed learning reaches once saved.",
      "enum": [
        "sequence",
        "account"
      ],
      "title": "ProposedScope",
      "type": "string"
    },
    "RedoReadSchema": {
      "description": "How the redo a thumbs down asked for went.",
      "properties": {
        "detail": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Why it was refused, as the screen shows it.",
          "title": "Detail"
        },
        "state": {
          "$ref": "#/$defs/RedoState",
          "description": "`none` where nothing is redone (a sent message), `started` while it runs, `written` once the new output is there, `refused` when it could not run."
        }
      },
      "required": [
        "state",
        "detail"
      ],
      "title": "RedoReadSchema",
      "type": "object"
    },
    "RedoState": {
      "description": "How the redo a thumbs down asked for went.",
      "enum": [
        "none",
        "started",
        "written",
        "refused"
      ],
      "title": "RedoState",
      "type": "string"
    }
  }
}