click.aligned.chat.message

aligned.click

Schema Diff

+7 -2

From

CID
bafyreigvs6ir7ov...
Indexed At
2026-07-29 06:38 UTC
View this version

To

CID
bafyreiakkz7noad...
Indexed At
2026-08-09 07:48 UTC
View this version

Compatibility Analysis

Backward Compatible

Backward compatible. 2 non-breaking changes.

Non-Breaking Changes (2)
  • AddedVertex AddedVertex { vertex_id: "click.aligned.chat.message:body.withheld" }
  • AddedEdge AddedEdge { src: "click.aligned.chat.message:body", tgt: "click.aligned.chat.message:body.withheld", kind: "prop", name: Some("withheld") }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "click.aligned.chat.message:body.withheld" }

Additional Notes

  • Non-breaking: AddedEdge { src: "click.aligned.chat.message:body", tgt: "click.aligned.chat.message:body.withheld", kind: "prop", name: Some("withheld") }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "main": {
5 -
      "description": "One turn of a published conversation with an agent. Records are created as the conversation happens and never rewritten, so the record key's TID ordering is the reading order.",
5 +
      "description": "One turn of a published conversation with an agent. Records exist only for a conversation somebody published; within one, every turn has a record, in order, so the record key's TID ordering is the reading order.",
6 6
      "key": "tid",
7 7
      "record": {
8 +
        "description": "One turn of a conversation, in the repo of the person who had it. Written when they publish some part of that conversation, carrying its content only if this turn was one of the parts — so within a conversation that is public at all, the shape is public and the words are by decision.",
8 9
        "properties": {
9 10
          "createdAt": {
10 11
            "description": "When the turn happened.",
11 12
            "format": "datetime",
12 13
            "type": "string"
13 14
          },
14 15
          "mentions": {
15 16
            "description": "atproto accounts this turn is about, as DIDs. Deliberately not strongRefs to their profile records: a person is not a version of their bio, and pinning one would make a turn about someone go stale the next time they change their avatar. A DID is the identity, and it is the identity that was being discussed.",
16 17
            "items": {
17 18
              "format": "did",
18 19
              "type": "string"
19 20
            },
20 21
            "maxLength": 50,
21 22
            "type": "array"
22 23
          },
23 24
          "model": {
24 25
            "description": "The model that produced an assistant turn, e.g. 'greenpt/minimax-m2.5'. Present on assistant turns so a reader never has to guess whether they are reading a person or a machine, and can tell which machine.",
25 26
            "type": "string"
26 27
          },
27 28
          "refs": {
28 29
            "description": "Records this turn is about, as strong references. Pointed at, never copied: a copy would survive the author deleting the original, and it should not. A strongRef pins the CID, so a reader gets the version that was actually discussed and can tell when it has since changed — which is what you want for a post, whose text is the thing.",
29 30
            "items": {
30 31
              "ref": "com.atproto.repo.strongRef",
31 32
              "type": "ref"
32 33
            },
33 34
            "maxLength": 50,
34 35
            "type": "array"
35 36
          },
36 37
          "role": {
37 38
            "description": "Who is speaking.",
38 39
            "knownValues": [
39 40
              "user",
40 41
              "assistant"
41 42
            ],
42 43
            "type": "string"
43 44
          },
44 45
          "session": {
45 46
            "description": "The click.aligned.chat.session this turn belongs to. A plain at-uri, deliberately not a strongRef: the session may be retitled later, and a strongRef would pin a CID that then no longer exists.",
46 47
            "format": "at-uri",
47 48
            "type": "string"
48 49
          },
49 50
          "steps": {
50 51
            "description": "The tools the agent called on this turn, in order. Published because the point of a conversation like this is usually *how* the answer was reached; a reply with the working removed is the least interesting part of it.",
51 52
            "items": {
52 53
              "ref": "#step",
53 54
              "type": "ref"
54 55
            },
55 56
            "maxLength": 100,
56 57
            "type": "array"
57 58
          },
58 59
          "text": {
59 -
            "description": "What was said. The assistant's own words, so they are stored rather than referenced — there is nowhere else they exist.",
60 +
            "description": "What was said. The assistant's own words, so they are stored rather than referenced — there is nowhere else they exist. Runs of █ are redactions: spans the author covered rather than withhold the whole turn over, of a fixed width so the bar does not say how long the words were. The covered words were never published and are not recoverable from this record; a viewer that does nothing special shows the bars as text, which is the honest reading.",
60 61
            "maxGraphemes": 15000,
61 62
            "maxLength": 60000,
62 63
            "type": "string"
64 +
          },
65 +
          "withheld": {
66 +
            "description": "This turn happened and its content was not published. Every turn of a published conversation gets a record, so one published in part has visible holes rather than invisible ones — an answer to a question that was held back would otherwise read as an answer to whatever came before it. A conversation nobody published has no records at all, withheld ones included: a record saying only that somebody spoke at a time is a hole in nothing. Stated rather than inferred from an empty `text`, so a reader never has to guess whether a turn was withheld or simply empty. Absent means published.",
67 +
            "type": "boolean"
63 68
          }
64 69
        },
65 70
        "required": [
66 71
          "session",
67 72
          "role",
68 73
          "text",
69 74
          "createdAt"
70 75
        ],
71 76
        "type": "object"
72 77
      },
73 78
      "type": "record"
74 79
    },
75 80
    "step": {
76 81
      "description": "One tool call. The name and a short summary of what it was for — never the output, which is often large, often private, and reproducible by anyone holding the same tools.",
77 82
      "properties": {
78 83
        "failed": {
79 84
          "description": "Whether the call errored. Published rather than hidden: a workflow that shows only the calls that worked is a misleading picture of working with an agent.",
80 85
          "type": "boolean"
81 86
        },
82 87
        "summary": {
83 88
          "description": "One line on what it was called for or what came back.",
84 89
          "maxGraphemes": 250,
85 90
          "maxLength": 1000,
86 91
          "type": "string"
87 92
        },
88 93
        "tool": {
89 94
          "description": "Tool name as the agent called it, e.g. 'search-posts'.",
90 95
          "maxGraphemes": 64,
91 96
          "maxLength": 320,
92 97
          "type": "string"
93 98
        }
94 99
      },
95 100
      "required": [
96 101
        "tool"
97 102
      ],
98 103
      "type": "object"
99 104
    }
100 105
  },
101 106
  "id": "click.aligned.chat.message",
102 107
  "lexicon": 1
103 108
}

Compare Other Versions

Lexicon Garden

@