{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/getoneprofile-ai/json-schema/getoneprofile-ai-learning-request-read-schema-schema.json",
  "title": "LearningRequestReadSchema",
  "description": "A learning request given in the background, and where it stands.",
  "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/LearningRequestReadSchema",
  "properties": {
    "answer": {
      "anyOf": [
        {
          "$ref": "#/$defs/ThumbsDownReadSchema"
        },
        {
          "type": "null"
        }
      ],
      "description": "Once `done`: what it did, as `POST /agent-learnings/thumbs-downs/` answers; for a Retry or a change, the proposed learning it acted on, as it now stands. On a proposal from an edit, `proposal` is null when the words came back to the agent's and the learning proposed from an earlier edit was dismissed."
    },
    "error": {
      "anyOf": [
        {
          "$ref": "#/$defs/LearningRequestErrorReadSchema"
        },
        {
          "type": "null"
        }
      ],
      "description": "Once `failed`: why."
    },
    "kind": {
      "$ref": "#/$defs/LearningRequestKind",
      "description": "What it runs, as it was sent."
    },
    "request_id": {
      "description": "The key it was sent under, to ask again by.",
      "format": "uuid",
      "title": "Request Id",
      "type": "string"
    },
    "state": {
      "$ref": "#/$defs/LearningRequestState",
      "description": "`running` while the agent learns (ask again in a couple of seconds), then `done` with `answer`, or `failed` with `error`."
    }
  },
  "required": [
    "request_id",
    "kind",
    "state",
    "answer",
    "error"
  ],
  "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"
    },
    "LearningRequestErrorCode": {
      "description": "Why a learning request failed: what the one-request route it stands for refuses.",
      "enum": [
        "reason_required",
        "nothing_learned",
        "not_found",
        "event_not_found",
        "refused",
        "limit_reached",
        "unavailable",
        "timed_out",
        "error"
      ],
      "title": "LearningRequestErrorCode",
      "type": "string"
    },
    "LearningRequestErrorReadSchema": {
      "description": "Why a learning request given in the background failed.",
      "properties": {
        "code": {
          "$ref": "#/$defs/LearningRequestErrorCode",
          "description": "`reason_required` or `nothing_learned` (about the reason), `not_found` (what it was given on is gone), `event_not_found` (the proposed learning it acts on is gone), `refused` (it can't be done here, the sentence says why), `limit_reached` (today's free rewrites are spent), `unavailable` (the agent could not read a hand edit right now), `timed_out` (the agent didn't finish learning within two minutes; nothing was saved) or `error`. Every one can be sent again with the same `request_id`."
        },
        "detail": {
          "description": "The sentence to show.",
          "title": "Detail",
          "type": "string"
        },
        "reason_error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The sentence to show under the reason box; null when not about the reason.",
          "title": "Reason Error"
        },
        "status": {
          "description": "The HTTP status the one-request route it stands for answers it with.",
          "title": "Status",
          "type": "integer"
        }
      },
      "required": [
        "code",
        "status",
        "detail",
        "reason_error"
      ],
      "title": "LearningRequestErrorReadSchema",
      "type": "object"
    },
    "LearningRequestKind": {
      "description": "What a learning request given in the background runs: each one-request route it stands for.\n\nThe learner can take longer than the load balancer keeps a request open (30 seconds), so\nevery press of the dashboard's that asks it goes through a request instead.",
      "enum": [
        "thumbs_down",
        "hand_edit",
        "regenerate",
        "proposal_change"
      ],
      "title": "LearningRequestKind",
      "type": "string"
    },
    "LearningRequestState": {
      "description": "Where a learning request given in the background stands.",
      "enum": [
        "running",
        "done",
        "failed"
      ],
      "title": "LearningRequestState",
      "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"
    },
    "ThumbsDownReadSchema": {
      "description": "What a thumbs down did.",
      "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"
      ],
      "title": "ThumbsDownReadSchema",
      "type": "object"
    }
  }
}