# page.cavu.forge.attribute

> One word in a project's own vocabulary for facts. Nothing about what can be said of an entity is predefined — a genderless species has no gender, a starship has a registry, a magic system has its own terms — so each project defines the attributes its facts use. Defining one says how its facts combine (one value at a time, or several) and whether its values point at other entities — an attribute that does is a relation (allegiance, sails under, married to), named from both sides. A fact whose attribute has no definition is read as single-valued text. Only `name` has a meaning readers rely on: it's what an entity is called.

- Kind: record
- Record key: tid
- Authority: forge.cavu.page
- Lexicon: 1
- Published by [cavu.page](https://lexicon.garden/identity/did:plc:citulkqjdzbnf7wd5xb6lled), not the NSID's authority

## Links

- [Documentation](https://lexicon.garden/lexicon/did:plc:citulkqjdzbnf7wd5xb6lled/page.cavu.forge.attribute)
- [Schema JSON](https://lexicon.garden/lexicon/did:plc:citulkqjdzbnf7wd5xb6lled/page.cavu.forge.attribute/schema.json)
- [Analytics](https://lexicon.garden/lexicon/did:plc:citulkqjdzbnf7wd5xb6lled/page.cavu.forge.attribute/analytics)

## Record (`page.cavu.forge.attribute`)

Type: record · key tid

### Properties

- `createdAt` (string · datetime, required)
- `description` (string): What it means in this story, for the writer and any assistant.
  - Constraints: maxLength: 3000, maxGraphemes: 300
- `kinds` (array): The entity kinds it's offered for. Absent: any.
  - Constraints: maxLength: 20
  - `items` (string)
    - Constraints: maxLength: 640, maxGraphemes: 64
- `multi` (boolean): Several values hold at once (aliases, allegiances, relationships) instead of a later fact replacing an earlier one. Absent means false.
- `name` (string, required): The key facts use, exactly: "species", "rank", "home world".
  - Constraints: maxLength: 640, maxGraphemes: 64
- `reverse` (string): For an attribute that points at entities: what the relation is called from the other side — "sails under" ↔ "crew", "allegiance" ↔ "members", "captain" ↔ "captain of". Readers use it to show a target's side of the relation and to head groups when entities are grouped by this attribute.
  - Constraints: maxLength: 640, maxGraphemes: 64
- `targets` (array): Present when the value points at another entity (fact.target): the entity kinds it may point at, or an empty list for any. A text value may go with it (a relationship's "wife").
  - Constraints: maxLength: 20
  - `items` (string)
    - Constraints: maxLength: 640, maxGraphemes: 64

## Schema

```json
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "One word in a project's own vocabulary for facts. Nothing about what can be said of an entity is predefined — a genderless species has no gender, a starship has a registry, a magic system has its own terms — so each project defines the attributes its facts use. Defining one says how its facts combine (one value at a time, or several) and whether its values point at other entities — an attribute that does is a relation (allegiance, sails under, married to), named from both sides. A fact whose attribute has no definition is read as single-valued text. Only `name` has a meaning readers rely on: it's what an entity is called.",
      "key": "tid",
      "record": {
        "properties": {
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "description": "What it means in this story, for the writer and any assistant.",
            "maxGraphemes": 300,
            "maxLength": 3000,
            "type": "string"
          },
          "kinds": {
            "description": "The entity kinds it's offered for. Absent: any.",
            "items": {
              "maxGraphemes": 64,
              "maxLength": 640,
              "type": "string"
            },
            "maxLength": 20,
            "type": "array"
          },
          "multi": {
            "description": "Several values hold at once (aliases, allegiances, relationships) instead of a later fact replacing an earlier one. Absent means false.",
            "type": "boolean"
          },
          "name": {
            "description": "The key facts use, exactly: \"species\", \"rank\", \"home world\".",
            "maxGraphemes": 64,
            "maxLength": 640,
            "type": "string"
          },
          "reverse": {
            "description": "For an attribute that points at entities: what the relation is called from the other side — \"sails under\" ↔ \"crew\", \"allegiance\" ↔ \"members\", \"captain\" ↔ \"captain of\". Readers use it to show a target's side of the relation and to head groups when entities are grouped by this attribute.",
            "maxGraphemes": 64,
            "maxLength": 640,
            "type": "string"
          },
          "targets": {
            "description": "Present when the value points at another entity (fact.target): the entity kinds it may point at, or an empty list for any. A text value may go with it (a relationship's \"wife\").",
            "items": {
              "maxGraphemes": 64,
              "maxLength": 640,
              "type": "string"
            },
            "maxLength": 20,
            "type": "array"
          }
        },
        "required": [
          "name",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "page.cavu.forge.attribute",
  "lexicon": 1
}
```
