@hypercerts-org/lexicon 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/CHANGELOG.md +205 -0
  2. package/README.md +371 -388
  3. package/SCHEMAS.md +533 -75
  4. package/dist/exports.d.ts +900 -10
  5. package/dist/exports.d.ts.map +1 -1
  6. package/dist/generated/exports.d.ts +900 -10
  7. package/dist/generated/exports.d.ts.map +1 -1
  8. package/dist/generated/lexicons.d.ts +2683 -1093
  9. package/dist/generated/lexicons.d.ts.map +1 -1
  10. package/dist/generated/types/app/bsky/richtext/facet.d.ts +44 -7
  11. package/dist/generated/types/app/bsky/richtext/facet.d.ts.map +1 -1
  12. package/dist/generated/types/app/certified/badge/award.d.ts +2 -3
  13. package/dist/generated/types/app/certified/badge/award.d.ts.map +1 -1
  14. package/dist/generated/types/app/certified/badge/definition.d.ts +3 -3
  15. package/dist/generated/types/app/certified/badge/definition.d.ts.map +1 -1
  16. package/dist/generated/types/app/certified/badge/response.d.ts +2 -2
  17. package/dist/generated/types/app/certified/badge/response.d.ts.map +1 -1
  18. package/dist/generated/types/app/certified/link/evm.d.ts +45 -0
  19. package/dist/generated/types/app/certified/link/evm.d.ts.map +1 -0
  20. package/dist/generated/types/org/hypercerts/claim/activity.d.ts +6 -3
  21. package/dist/generated/types/org/hypercerts/claim/activity.d.ts.map +1 -1
  22. package/dist/generated/types/org/hypercerts/collection.d.ts +11 -5
  23. package/dist/generated/types/org/hypercerts/collection.d.ts.map +1 -1
  24. package/dist/generated/types/org/hypercerts/context/attachment.d.ts +5 -3
  25. package/dist/generated/types/org/hypercerts/context/attachment.d.ts.map +1 -1
  26. package/dist/generated/types/org/hypercerts/context/evaluation.d.ts +6 -6
  27. package/dist/generated/types/org/hypercerts/context/evaluation.d.ts.map +1 -1
  28. package/dist/generated/types/org/hypercerts/defs.d.ts +11 -0
  29. package/dist/generated/types/org/hypercerts/defs.d.ts.map +1 -1
  30. package/dist/generated/types/org/hypercerts/funding/receipt.d.ts +17 -5
  31. package/dist/generated/types/org/hypercerts/funding/receipt.d.ts.map +1 -1
  32. package/dist/generated/types/pub/leaflet/blocks/blockquote.d.ts +13 -0
  33. package/dist/generated/types/pub/leaflet/blocks/blockquote.d.ts.map +1 -0
  34. package/dist/generated/types/pub/leaflet/blocks/bskyPost.d.ts +13 -0
  35. package/dist/generated/types/pub/leaflet/blocks/bskyPost.d.ts.map +1 -0
  36. package/dist/generated/types/pub/leaflet/blocks/button.d.ts +12 -0
  37. package/dist/generated/types/pub/leaflet/blocks/button.d.ts.map +1 -0
  38. package/dist/generated/types/pub/leaflet/blocks/code.d.ts +13 -0
  39. package/dist/generated/types/pub/leaflet/blocks/code.d.ts.map +1 -0
  40. package/dist/generated/types/pub/leaflet/blocks/header.d.ts +14 -0
  41. package/dist/generated/types/pub/leaflet/blocks/header.d.ts.map +1 -0
  42. package/dist/generated/types/pub/leaflet/blocks/horizontalRule.d.ts +10 -0
  43. package/dist/generated/types/pub/leaflet/blocks/horizontalRule.d.ts.map +1 -0
  44. package/dist/generated/types/pub/leaflet/blocks/iframe.d.ts +12 -0
  45. package/dist/generated/types/pub/leaflet/blocks/iframe.d.ts.map +1 -0
  46. package/dist/generated/types/pub/leaflet/blocks/image.d.ts +21 -0
  47. package/dist/generated/types/pub/leaflet/blocks/image.d.ts.map +1 -0
  48. package/dist/generated/types/pub/leaflet/blocks/math.d.ts +11 -0
  49. package/dist/generated/types/pub/leaflet/blocks/math.d.ts.map +1 -0
  50. package/dist/generated/types/pub/leaflet/blocks/orderedList.d.ts +31 -0
  51. package/dist/generated/types/pub/leaflet/blocks/orderedList.d.ts.map +1 -0
  52. package/dist/generated/types/pub/leaflet/blocks/page.d.ts +11 -0
  53. package/dist/generated/types/pub/leaflet/blocks/page.d.ts.map +1 -0
  54. package/dist/generated/types/pub/leaflet/blocks/poll.d.ts +12 -0
  55. package/dist/generated/types/pub/leaflet/blocks/poll.d.ts.map +1 -0
  56. package/dist/generated/types/pub/leaflet/blocks/text.d.ts +14 -0
  57. package/dist/generated/types/pub/leaflet/blocks/text.d.ts.map +1 -0
  58. package/dist/generated/types/pub/leaflet/blocks/unorderedList.d.ts +29 -0
  59. package/dist/generated/types/pub/leaflet/blocks/unorderedList.d.ts.map +1 -0
  60. package/dist/generated/types/pub/leaflet/blocks/website.d.ts +14 -0
  61. package/dist/generated/types/pub/leaflet/blocks/website.d.ts.map +1 -0
  62. package/dist/generated/types/pub/leaflet/pages/linearDocument.d.ts +54 -1
  63. package/dist/generated/types/pub/leaflet/pages/linearDocument.d.ts.map +1 -1
  64. package/dist/generated/types/pub/leaflet/richtext/facet.d.ts +97 -0
  65. package/dist/generated/types/pub/leaflet/richtext/facet.d.ts.map +1 -0
  66. package/dist/index.cjs +4486 -1807
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.mjs +4407 -1804
  69. package/dist/index.mjs.map +1 -1
  70. package/dist/lexicons.cjs +927 -35
  71. package/dist/lexicons.cjs.map +1 -1
  72. package/dist/lexicons.d.ts +2683 -1093
  73. package/dist/lexicons.d.ts.map +1 -1
  74. package/dist/lexicons.mjs +927 -35
  75. package/dist/lexicons.mjs.map +1 -1
  76. package/dist/tests/validate-external-lexicons.test.d.ts +2 -0
  77. package/dist/tests/validate-external-lexicons.test.d.ts.map +1 -0
  78. package/dist/tests/validate-funding-receipt.test.d.ts +2 -0
  79. package/dist/tests/validate-funding-receipt.test.d.ts.map +1 -0
  80. package/dist/tests/validate-link-evm.test.d.ts +2 -0
  81. package/dist/tests/validate-link-evm.test.d.ts.map +1 -0
  82. package/dist/tests/validate-rights.test.d.ts +2 -0
  83. package/dist/tests/validate-rights.test.d.ts.map +1 -0
  84. package/dist/types/app/bsky/richtext/facet.d.ts +44 -7
  85. package/dist/types/app/bsky/richtext/facet.d.ts.map +1 -1
  86. package/dist/types/app/certified/badge/award.d.ts +2 -3
  87. package/dist/types/app/certified/badge/award.d.ts.map +1 -1
  88. package/dist/types/app/certified/badge/definition.d.ts +3 -3
  89. package/dist/types/app/certified/badge/definition.d.ts.map +1 -1
  90. package/dist/types/app/certified/badge/response.d.ts +2 -2
  91. package/dist/types/app/certified/badge/response.d.ts.map +1 -1
  92. package/dist/types/app/certified/link/evm.d.ts +45 -0
  93. package/dist/types/app/certified/link/evm.d.ts.map +1 -0
  94. package/dist/types/org/hypercerts/claim/activity.d.ts +6 -3
  95. package/dist/types/org/hypercerts/claim/activity.d.ts.map +1 -1
  96. package/dist/types/org/hypercerts/collection.d.ts +11 -5
  97. package/dist/types/org/hypercerts/collection.d.ts.map +1 -1
  98. package/dist/types/org/hypercerts/context/attachment.d.ts +5 -3
  99. package/dist/types/org/hypercerts/context/attachment.d.ts.map +1 -1
  100. package/dist/types/org/hypercerts/context/evaluation.d.ts +6 -6
  101. package/dist/types/org/hypercerts/context/evaluation.d.ts.map +1 -1
  102. package/dist/types/org/hypercerts/defs.d.ts +11 -0
  103. package/dist/types/org/hypercerts/defs.d.ts.map +1 -1
  104. package/dist/types/org/hypercerts/funding/receipt.d.ts +17 -5
  105. package/dist/types/org/hypercerts/funding/receipt.d.ts.map +1 -1
  106. package/dist/types/pub/leaflet/blocks/blockquote.d.ts +13 -0
  107. package/dist/types/pub/leaflet/blocks/blockquote.d.ts.map +1 -0
  108. package/dist/types/pub/leaflet/blocks/bskyPost.d.ts +13 -0
  109. package/dist/types/pub/leaflet/blocks/bskyPost.d.ts.map +1 -0
  110. package/dist/types/pub/leaflet/blocks/button.d.ts +12 -0
  111. package/dist/types/pub/leaflet/blocks/button.d.ts.map +1 -0
  112. package/dist/types/pub/leaflet/blocks/code.d.ts +13 -0
  113. package/dist/types/pub/leaflet/blocks/code.d.ts.map +1 -0
  114. package/dist/types/pub/leaflet/blocks/header.d.ts +14 -0
  115. package/dist/types/pub/leaflet/blocks/header.d.ts.map +1 -0
  116. package/dist/types/pub/leaflet/blocks/horizontalRule.d.ts +10 -0
  117. package/dist/types/pub/leaflet/blocks/horizontalRule.d.ts.map +1 -0
  118. package/dist/types/pub/leaflet/blocks/iframe.d.ts +12 -0
  119. package/dist/types/pub/leaflet/blocks/iframe.d.ts.map +1 -0
  120. package/dist/types/pub/leaflet/blocks/image.d.ts +21 -0
  121. package/dist/types/pub/leaflet/blocks/image.d.ts.map +1 -0
  122. package/dist/types/pub/leaflet/blocks/math.d.ts +11 -0
  123. package/dist/types/pub/leaflet/blocks/math.d.ts.map +1 -0
  124. package/dist/types/pub/leaflet/blocks/orderedList.d.ts +31 -0
  125. package/dist/types/pub/leaflet/blocks/orderedList.d.ts.map +1 -0
  126. package/dist/types/pub/leaflet/blocks/page.d.ts +11 -0
  127. package/dist/types/pub/leaflet/blocks/page.d.ts.map +1 -0
  128. package/dist/types/pub/leaflet/blocks/poll.d.ts +12 -0
  129. package/dist/types/pub/leaflet/blocks/poll.d.ts.map +1 -0
  130. package/dist/types/pub/leaflet/blocks/text.d.ts +14 -0
  131. package/dist/types/pub/leaflet/blocks/text.d.ts.map +1 -0
  132. package/dist/types/pub/leaflet/blocks/unorderedList.d.ts +29 -0
  133. package/dist/types/pub/leaflet/blocks/unorderedList.d.ts.map +1 -0
  134. package/dist/types/pub/leaflet/blocks/website.d.ts +14 -0
  135. package/dist/types/pub/leaflet/blocks/website.d.ts.map +1 -0
  136. package/dist/types/pub/leaflet/pages/linearDocument.d.ts +54 -1
  137. package/dist/types/pub/leaflet/pages/linearDocument.d.ts.map +1 -1
  138. package/dist/types/pub/leaflet/richtext/facet.d.ts +97 -0
  139. package/dist/types/pub/leaflet/richtext/facet.d.ts.map +1 -0
  140. package/lexicons/app/bsky/richtext/facet.json +51 -0
  141. package/lexicons/app/certified/badge/award.json +2 -2
  142. package/lexicons/app/certified/badge/definition.json +10 -2
  143. package/lexicons/app/certified/badge/response.json +2 -2
  144. package/lexicons/app/certified/link/evm.json +88 -0
  145. package/lexicons/org/hypercerts/claim/activity.json +8 -4
  146. package/lexicons/org/hypercerts/collection.json +19 -5
  147. package/lexicons/org/hypercerts/context/attachment.json +16 -5
  148. package/lexicons/org/hypercerts/context/evaluation.json +9 -6
  149. package/lexicons/org/hypercerts/defs.json +21 -0
  150. package/lexicons/org/hypercerts/funding/receipt.json +30 -10
  151. package/lexicons/pub/leaflet/blocks/blockquote.json +22 -0
  152. package/lexicons/pub/leaflet/blocks/bskyPost.json +19 -0
  153. package/lexicons/pub/leaflet/blocks/button.json +19 -0
  154. package/lexicons/pub/leaflet/blocks/code.json +21 -0
  155. package/lexicons/pub/leaflet/blocks/header.json +27 -0
  156. package/lexicons/pub/leaflet/blocks/horizontalRule.json +11 -0
  157. package/lexicons/pub/leaflet/blocks/iframe.json +21 -0
  158. package/lexicons/pub/leaflet/blocks/image.json +37 -0
  159. package/lexicons/pub/leaflet/blocks/math.json +15 -0
  160. package/lexicons/pub/leaflet/blocks/orderedList.json +54 -0
  161. package/lexicons/pub/leaflet/blocks/page.json +15 -0
  162. package/lexicons/pub/leaflet/blocks/poll.json +16 -0
  163. package/lexicons/pub/leaflet/blocks/text.json +26 -0
  164. package/lexicons/pub/leaflet/blocks/unorderedList.json +50 -0
  165. package/lexicons/pub/leaflet/blocks/website.json +27 -0
  166. package/lexicons/pub/leaflet/pages/linearDocument.json +98 -0
  167. package/lexicons/pub/leaflet/richtext/facet.json +149 -0
  168. package/package.json +3 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,210 @@
1
1
  # @hypercerts-org/lexicon
2
2
 
3
+ ## 0.11.0
4
+
5
+ The v0.11.0 release introduces EVM identity linking, stronger type safety across badge and funding schemas, vendored Leaflet lexicons for runtime validation, and a set of schema refinements based on real-world usage from the first month of v0.10.0 adoption. All changes listed below are merged to `main` and will ship together as a single coordinated release.
6
+
7
+ ```bash
8
+ npm install @hypercerts-org/lexicon@0.11.0
9
+ ```
10
+
11
+ ---
12
+
13
+ ### New lexicons
14
+
15
+ #### EVM identity linking
16
+
17
+ `app.certified.link.evm`
18
+
19
+ A new record type for creating verifiable links between ATProto identities and EVM wallet addresses. Each record contains a cryptographic proof — currently EIP-712 typed data signatures for EOA wallets — that binds a DID to an Ethereum address onchain.
20
+
21
+ The `proof` field is an open union, so future signature methods (ERC-1271, ERC-6492) can be added without breaking existing records.
22
+
23
+ ```jsonc
24
+ {
25
+ "address": "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",
26
+ "proof": {
27
+ "$type": "app.certified.link.evm#eip712Proof",
28
+ "signature": "0x...",
29
+ "message": {
30
+ "did": "did:plc:abc123",
31
+ "evmAddress": "0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B",
32
+ "chainId": "1",
33
+ "timestamp": "1711929600",
34
+ "nonce": "0",
35
+ },
36
+ },
37
+ "createdAt": "2026-04-03T00:00:00.000Z",
38
+ }
39
+ ```
40
+
41
+ #### Vendored Leaflet and richtext lexicons
42
+
43
+ `pub.leaflet.*` · `pub.leaflet.richtext.facet`
44
+
45
+ The package now ships the full set of Leaflet block and richtext facet lexicon JSON files (17 files). Previously, these external schemas were shimmed at the TypeScript type level via `@atcute` packages, which caused `LexiconDefNotFoundError` at runtime when validating records with `description` or facet fields. Vendoring them fixes runtime validation and removes the `@atcute/leaflet` and `@atcute/bluesky` dependencies.
46
+
47
+ This is a **packaging change**, not a schema change. No record structures are affected.
48
+
49
+ ---
50
+
51
+ ### Breaking changes
52
+
53
+ This release includes three breaking schema changes. All were identified early enough in adoption that the team decided the long-term gains outweigh the migration cost.
54
+
55
+ #### Evaluation scores are now strings
56
+
57
+ `org.hypercerts.context.evaluation`
58
+
59
+ The `min`, `max`, and `value` fields on evaluation scores changed from `integer` to `string`. ATProto has no native decimal type, and integer-only scores made use cases like "3.7 out of 5" impossible.
60
+
61
+ ```diff
62
+ // Before
63
+ - { "min": 0, "max": 10, "value": 7 }
64
+ + // After
65
+ + { "min": "0", "max": "10", "value": "7.5" }
66
+ ```
67
+
68
+ **Who needs to update:**
69
+
70
+ | Consumer | Action |
71
+ | -------- | ---------------------------------------------------------------------------------------------------------------------- |
72
+ | Indexers | Change column type from `INTEGER` to `TEXT`. Backfill existing records. Update any numeric sorting or filtering logic. |
73
+ | AppViews | Parse scores as strings. Use `parseFloat()` for numeric display where appropriate. |
74
+ | Frontend | Handle both numeric strings (`"3.7"`) and potentially non-numeric strings (`"A+"`) in display components. |
75
+
76
+ #### Badge references are now strong refs
77
+
78
+ `app.certified.badge.award` · `app.certified.badge.response`
79
+
80
+ Badge awards and responses now reference their parent records via `com.atproto.repo.strongRef` instead of plain lexicon refs. Strong references include both a URI and a content hash (CID), pinning the reference to a specific version of the badge definition. This prevents the meaning of an award from drifting if the underlying badge definition is later modified.
81
+
82
+ ```diff
83
+ // Before
84
+ - "badge": "at://did:plc:abc/app.certified.badge.definition/123"
85
+
86
+ // After
87
+ + "badge": {
88
+ + "uri": "at://did:plc:abc/app.certified.badge.definition/123",
89
+ + "cid": "bafyrei..."
90
+ + }
91
+ ```
92
+
93
+ **Who needs to update:**
94
+
95
+ | Consumer | Action |
96
+ | ------------- | ----------------------------------------------------------------------------------------------------------------- |
97
+ | Indexers | Update parsing to expect `{ uri, cid }` objects instead of plain URI strings for `badge` and `badgeAward` fields. |
98
+ | AppViews | Update resolution logic. Dereference using both `uri` and `cid` for content verification. |
99
+ | SDK consumers | Regenerate types. Any code constructing badge awards or responses must supply the full strong ref. |
100
+
101
+ #### Funding receipt fields normalized
102
+
103
+ `org.hypercerts.funding.receipt`
104
+
105
+ The `from`, `to`, and `for` fields have been reworked for consistency and stronger type safety.
106
+
107
+ | Field | Before (v0.10.0) | After |
108
+ | ------ | ----------------- | ------------------------------------------------------------------------------------------ |
109
+ | `from` | Required, DID ref | **Optional**, union of `#text` \| `app.certified.defs#did` \| `com.atproto.repo.strongRef` |
110
+ | `to` | Plain string | Union of `#text` \| `app.certified.defs#did` \| `com.atproto.repo.strongRef` |
111
+ | `for` | AT-URI string | `com.atproto.repo.strongRef` (pins to a specific record version) |
112
+
113
+ The `from` and `to` fields were asymmetric — `from` required an AT Protocol identity while `to` accepted any string. Now both are three-way unions that accept a free-text string (`#text` — for display names, wallet addresses, or other identifiers), a DID, or a strong reference. This treats senders and recipients uniformly while preserving the ability to reference non-ATProto participants. `from` is also optional, properly supporting anonymous funding. `for` is now a strong ref, ensuring the receipt always points to the exact version of the activity it funded.
114
+
115
+ ```diff
116
+ // Before
117
+ - "from": { "$type": "app.certified.defs#did", "did": "did:plc:sender" },
118
+ - "to": "did:plc:recipient",
119
+ - "for": "at://did:plc:abc/org.hypercerts.claim.activity/123"
120
+
121
+ // After — with a DID
122
+ + "from": { "$type": "app.certified.defs#did", "did": "did:plc:sender" },
123
+ + "to": { "$type": "app.certified.defs#did", "did": "did:plc:recipient" },
124
+
125
+ // After — with a free-text identifier
126
+ + "to": { "$type": "org.hypercerts.funding.receipt#text", "value": "0xAb58...eC9B" },
127
+
128
+ // After — for field
129
+ + "for": {
130
+ + "uri": "at://did:plc:abc/org.hypercerts.claim.activity/123",
131
+ + "cid": "bafyrei..."
132
+ + }
133
+ ```
134
+
135
+ **Who needs to update:**
136
+
137
+ | Consumer | Action |
138
+ | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
139
+ | Indexers | Update parsing for `from`, `to` (now unions with `$type` discriminator — handle all three variants), and `for` (now `{ uri, cid }`). Allow `NULL` for `from`. |
140
+ | AppViews | Update resolution logic for all three fields. `for` requires dereferencing via both URI and CID. Handle `#text` variants for display. |
141
+ | SDK consumers | Regenerate types. Code constructing receipts must supply union-typed `to` and strong ref `for`. |
142
+ | Frontend | Update forms to construct proper union objects for sender/recipient. Handle `#text` for non-ATProto participants. Handle missing `from` for anonymous display. |
143
+
144
+ ---
145
+
146
+ ### Schema changes
147
+
148
+ > **A note on "optional" fields:** Even new optional fields require attention from indexers and AppViews. If an indexer doesn't store a new field, that data is silently lost for every downstream consumer. The changes below are non-breaking in the strict sense — existing records remain valid — but ignoring them means incomplete data.
149
+
150
+ #### Known values
151
+
152
+ Several free-text string fields now declare `knownValues` — a set of canonical values that establish interoperability conventions across the ecosystem. Custom values are still permitted. Think of these as Schelling points, not constraints.
153
+
154
+ | Lexicon | Field | Known values |
155
+ | ----------------------------------- | ------------- | -------------------------------------------------------------------------------------------------- |
156
+ | `org.hypercerts.collection` | `type` | `favorites` · `project` · `portfolio` · `program` |
157
+ | `org.hypercerts.context.attachment` | `contentType` | `report` · `audit` · `evidence` · `testimonial` · `methodology` |
158
+ | `app.certified.badge.definition` | `badgeType` | `endorsement` · `verification` · `participation` · `certification` · `affiliation` · `recognition` |
159
+
160
+ **Action:** Indexers should index these values for filtering and categorization. AppViews and frontends can use them for dropdowns, search facets, and display grouping. No schema migration required — the underlying field type is still a string.
161
+
162
+ #### Badge icon is now optional
163
+
164
+ `app.certified.badge.definition`
165
+
166
+ The `icon` field moved from `required` to optional. Not all badges have a visual representation — endorsements, participation records, and text-based certifications can now omit the icon entirely.
167
+
168
+ **Action:** Indexers should allow `NULL` in the icon column. Frontend developers must add a fallback or placeholder when rendering badges without an icon — apps that assume `icon` is always present will crash or render broken UI.
169
+
170
+ #### Contributors array is uncapped
171
+
172
+ `org.hypercerts.claim.activity`
173
+
174
+ Removed the `maxLength: 1000` constraint on the `contributors` array. ATProto records have a natural 1 MB size limit (~2,000–4,000 contributors), making the artificial cap unnecessary.
175
+
176
+ **Action:** Indexers and AppViews with hardcoded length limits matching the old max should remove them. Frontends should implement pagination or lazy loading for large contributor lists to avoid performance issues.
177
+
178
+ #### Rich text on collection short descriptions
179
+
180
+ `org.hypercerts.collection`
181
+
182
+ Added `shortDescriptionFacets` — an optional array of rich text facets (mentions, URLs, hashtags) that annotate the `shortDescription` field. This brings collections in line with activity claims, which already supported facets.
183
+
184
+ **Action:** Indexers must store the new field when present — without it, rich text annotations (links, mentions) are permanently lost. AppViews should include facets in API responses. Frontends can render rich text using the standard ATProto facet model.
185
+
186
+ ---
187
+
188
+ ### Documentation improvements
189
+
190
+ - **Contributor and item defs** now have descriptions, improving TypeScript IntelliSense and AI code generation.
191
+ - **`occurredAt` vs `createdAt`** semantics clarified on funding receipts. `occurredAt` is when the funding happened in the real world; `createdAt` is when the record was written to the PDS.
192
+ - **Stale references** in board and measurement lexicon descriptions have been corrected.
193
+ - **README** rewritten with an ASCII namespace map and structured reference tables.
194
+ - **AI agent skill** added for downstream developers. Install via `npx skills add hypercerts-org/hypercerts-lexicon`.
195
+
196
+ ---
197
+
198
+ ### Upgrading
199
+
200
+ ```bash
201
+ npm install @hypercerts-org/lexicon@0.11.0
202
+ ```
203
+
204
+ The source of truth for lexicon definitions is the [NPM package](https://www.npmjs.com/package/@hypercerts-org/lexicon) and the published ATProto repository. The `main` branch on GitHub is a development branch — do not build production applications against it.
205
+
206
+ After upgrading, regenerate your TypeScript types and run your validation suite against the updated schemas. The package includes all lexicon JSON files and pre-built type definitions.
207
+
3
208
  ## 0.10.0
4
209
 
5
210
  ### Minor Changes