{
  "lexicon": 1,
  "id": "net.bisks.grudgebook.entry",
  "defs": {
    "main": {
      "type": "record",
      "description": "One grudge: a subject, a note explaining it, and the links that back it up. Written to the signed-in user's own repo — a private-in-spirit but technically public ledger, same as any other atproto record. Editing an entry deletes the old record and creates a new one (this site only has create+delete scope, not update) but keeps the original createdAt. Written and read by grudgebook (https://grudgebook.bisks.net).",
      "key": "tid",
      "record": {
        "type": "object",
        "required": ["subject", "createdAt"],
        "properties": {
          "subject": {
            "type": "string",
            "maxLength": 300,
            "maxGraphemes": 150,
            "description": "Who or what the grudge is about — a person, an org, an institution, a situation. Free text, not a resolved atproto identity."
          },
          "body": {
            "type": "string",
            "maxLength": 3000,
            "maxGraphemes": 3000,
            "description": "The note: what happened and why it's still owed."
          },
          "links": {
            "type": "array",
            "maxLength": 50,
            "items": {
              "type": "string",
              "format": "uri"
            },
            "description": "Source links documenting the grudge — receipts. Capped at 50 as a sanity bound on one write, not a read limit."
          },
          "severity": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "How deep it cuts, 1 (mild annoyance) to 5 (blood feud). Flavor, not load-bearing."
          },
          "tags": {
            "type": "array",
            "maxLength": 10,
            "items": {
              "type": "string",
              "maxLength": 40
            },
            "description": "Freeform tags for filtering, e.g. 'work', 'family', 'internet stranger'."
          },
          "createdAt": {
            "type": "string",
            "format": "datetime",
            "description": "When the grudge was first logged, as an ISO 8601 datetime."
          }
        }
      }
    }
  }
}
