# social.dracome.library.review

> Published by [dracome.social](https://lexicon.garden/identity/did:plc:66dyrt2bmghwlmdteyizs5l3)

✓ This is the authoritative definition for this NSID.

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:66dyrt2bmghwlmdteyizs5l3/social.dracome.library.review)
- [Documentation](https://lexicon.garden/lexicon/did:plc:66dyrt2bmghwlmdteyizs5l3/social.dracome.library.review/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:66dyrt2bmghwlmdteyizs5l3/social.dracome.library.review/examples)

## Definitions

### `social.dracome.library.review`

**Type**: `record`

A review of one edition by an actor. Duplicate convention: the rkey is a TID minted once at first create and never changes. Several records may exist for one actor and edition (for example from out-of-band writers); consumers SHOULD treat the record with the greatest `updatedAt` (falling back to `createdAt`) as the winner and break ties by the lowest TID, ignoring the others. This is a convention, not an enforced contract: AppViews MUST tolerate a differing winner, and may see a record's catalogTarget change over time.

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `catalogSnapshot` | `ref` → `social.dracome.work.defs#catalogSnapshot` | Yes | Point-in-time catalog metadata for the reviewed work or edition, captured when this record was last written. Refreshed on every update. |
| `catalogTarget` | `ref` → `social.dracome.work.defs#catalogTarget` | Yes | The work and edition that this review is about. Mutable. |
| `createdAt` | `string` (datetime) | Yes | Canonical UTC instant serialized as ISO 8601 with a trailing Z suffix. |
| `images` | `ref` → `social.dracome.embed.defs#images` | No | Optional attached images: an optional primary image plus up to 4 secondary images (5 total). Images are independently addable/removable. |
| `language` | `string` (language) | No | Optional language code the review text is written in, if different from or more specific than the actor's default language. |
| `rating` | `integer` | Yes | Scale-relative rating value. Valid range depends on ratingScale: 1-5 for 1 (whole stars), 1-10 for 2 (half stars), 1-20 for 4 (quarter stars). Interpretation: stars = rating / ratingScale. Runtime validation MUST enforce per-scale limits. |
| `ratingScale` | `integer` | Yes | The rating granularity divisor used at write time: divide rating by this value to recover stars. 1 = whole stars, 2 = half stars, 4 = quarter stars. Reflects whichever scale was in effect the last time rating was written on this record. |
| `reviewCopy` | `boolean` | No | True when the posted review discloses that the actor received or owns a review copy of this work or edition. |
| `text` | `string` | No | Optional review text. When provided, must be non-empty after trimming. |
| `updatedAt` | `string` (datetime) | No | Canonical UTC instant serialized as ISO 8601 with a trailing Z suffix. |

## Raw Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "A review of one edition by an actor. Duplicate convention: the rkey is a TID minted once at first create and never changes. Several records may exist for one actor and edition (for example from out-of-band writers); consumers SHOULD treat the record with the greatest `updatedAt` (falling back to `createdAt`) as the winner and break ties by the lowest TID, ignoring the others. This is a convention, not an enforced contract: AppViews MUST tolerate a differing winner, and may see a record's catalogTarget change over time.",
      "key": "tid",
      "record": {
        "properties": {
          "catalogSnapshot": {
            "description": "Point-in-time catalog metadata for the reviewed work or edition, captured when this record was last written. Refreshed on every update.",
            "ref": "social.dracome.work.defs#catalogSnapshot",
            "type": "ref"
          },
          "catalogTarget": {
            "description": "The work and edition that this review is about. Mutable.",
            "ref": "social.dracome.work.defs#catalogTarget",
            "type": "ref"
          },
          "createdAt": {
            "description": "Canonical UTC instant serialized as ISO 8601 with a trailing Z suffix.",
            "format": "datetime",
            "type": "string"
          },
          "images": {
            "description": "Optional attached images: an optional primary image plus up to 4 secondary images (5 total). Images are independently addable/removable.",
            "ref": "social.dracome.embed.defs#images",
            "type": "ref"
          },
          "language": {
            "description": "Optional language code the review text is written in, if different from or more specific than the actor's default language.",
            "format": "language",
            "type": "string"
          },
          "rating": {
            "description": "Scale-relative rating value. Valid range depends on ratingScale: 1-5 for 1 (whole stars), 1-10 for 2 (half stars), 1-20 for 4 (quarter stars). Interpretation: stars = rating / ratingScale. Runtime validation MUST enforce per-scale limits.",
            "maximum": 20,
            "minimum": 1,
            "type": "integer"
          },
          "ratingScale": {
            "description": "The rating granularity divisor used at write time: divide rating by this value to recover stars. 1 = whole stars, 2 = half stars, 4 = quarter stars. Reflects whichever scale was in effect the last time rating was written on this record.",
            "enum": [
              1,
              2,
              4
            ],
            "type": "integer"
          },
          "reviewCopy": {
            "description": "True when the posted review discloses that the actor received or owns a review copy of this work or edition.",
            "type": "boolean"
          },
          "text": {
            "description": "Optional review text. When provided, must be non-empty after trimming.",
            "maxGraphemes": 10000,
            "maxLength": 40000,
            "type": "string"
          },
          "updatedAt": {
            "description": "Canonical UTC instant serialized as ISO 8601 with a trailing Z suffix.",
            "format": "datetime",
            "type": "string"
          }
        },
        "required": [
          "catalogTarget",
          "catalogSnapshot",
          "rating",
          "ratingScale",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "social.dracome.library.review",
  "lexicon": 1
}
```
