Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .agents/skills/hypercerts-api/references/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@
"org.hypercerts.context.acknowledgement.main": {"type":"record","description":"Acknowledges a record (subject) or its relationship in a context. Created in the acknowledging actor's repo to form a bidirectional link. Examples: a contributor acknowledging inclusion in an activity, an activity owner acknowledging inclusion in a collection, or a record owner acknowledging an evaluation."},
"org.hypercerts.api.defs.acknowledgementView": {"type":"object","description":"Acknowledgement record with its publisher actor.","required":["uri","cid","indexedAt","did","author","record"],"properties":{"uri":{"type":"string","format":"at-uri"},"cid":{"type":"string","format":"cid"},"indexedAt":{"anyOf":[{"type":"string","format":"datetime"},{"type":"null"}]},"did":{"type":"string","format":"did"},"author":{"$ref":"#/components/schemas/org.hypercerts.api.defs.actorView"},"record":{"$ref":"#/components/schemas/org.hypercerts.context.acknowledgement.main"}}},
"org.hypercerts.context.getAcknowledgement.output": {"type":"object","required":["acknowledgement"],"properties":{"acknowledgement":{"$ref":"#/components/schemas/org.hypercerts.api.defs.acknowledgementView"}}},
"org.hypercerts.context.attachment.main": {"type":"record","description":"An attachment providing commentary, context, evidence, or documentary material related to a hypercert record (e.g. an activity, project, claim, or evaluation)."},
"org.hypercerts.context.attachment.main": {"type":"record","description":"An attachment providing commentary, context, evidence, or documentary material related to a hypercert record (e.g. an activity, project, claim, or evaluation) or related to an account profile."},
"org.hypercerts.context.getAttachment.attachmentView": {"type":"object","description":"Attachment with its hydrated publisher and unchanged source record; subject, content, and location references are not expanded, and external files are not fetched. Missing publisher sidecars are null; query or hydration failures fail the request.","required":["uri","cid","indexedAt","did","author","record"],"properties":{"uri":{"type":"string","format":"at-uri"},"cid":{"type":"string","format":"cid"},"indexedAt":{"anyOf":[{"type":"string","format":"datetime"},{"type":"null"}]},"did":{"type":"string","format":"did"},"author":{"$ref":"#/components/schemas/org.hypercerts.api.defs.actorView"},"record":{"$ref":"#/components/schemas/org.hypercerts.context.attachment.main"}}},
"org.hypercerts.context.getAttachment.output": {"type":"object","required":["attachment"],"properties":{"attachment":{"$ref":"#/components/schemas/org.hypercerts.context.getAttachment.attachmentView"}}},
"org.hypercerts.context.evaluation.main": {"type":"record","description":"An evaluation of a hypercert record (e.g. an activity and its impact)."},
Expand All @@ -205,7 +205,7 @@
"org.hypercerts.entity.defs.featureView": {"type":"object","description":"Indexed feature record with its hydrated author actor.","required":["uri","cid","indexedAt","did","author","record"],"properties":{"uri":{"type":"string","format":"at-uri"},"cid":{"type":"string","format":"cid"},"indexedAt":{"anyOf":[{"type":"string","format":"datetime"},{"type":"null"}]},"did":{"type":"string","format":"did"},"author":{"$ref":"#/components/schemas/org.hypercerts.api.defs.actorView"},"record":{"$ref":"#/components/schemas/org.hypercerts.entity.feature.main"}}},
"org.hypercerts.entity.getFeature.output": {"type":"object","required":["feature"],"properties":{"feature":{"$ref":"#/components/schemas/org.hypercerts.entity.defs.featureView"}}},
"org.hypercerts.entity.listFeatures.output": {"type":"object","required":["features"],"properties":{"features":{"type":"array","items":{"$ref":"#/components/schemas/org.hypercerts.entity.defs.featureView"}},"cursor":{"type":"string","description":"Opaque cursor for the next page; omitted when there is no next page."}}},
"org.hypercerts.funding.receipt.main": {"type":"record","description":"Records a funding receipt for a payment from one user to another user. It may be recorded by the recipient, by the sender, or by a third party. The sender may remain anonymous."},
"org.hypercerts.funding.receipt.main": {"type":"record","description":"Records a payment from a sender to a recipient. Any party may record it, and the sender may stay anonymous. When the sender chose the recipient, record one receipt to the final recipient even if platforms or hosts passed the funds on. When an intermediary chose (regranting), record the payment into it and each onward payment as separate receipts. A receipt may be updated in place under the same record key: its URI does not change, so references by URI keep resolving, but a strongRef (as likes and reposts use) still pins the earlier CID, and signatures bind to content and must be renewed. An earlier version cannot be recalled from readers that kept it."},
"org.hypercerts.funding.getReceipt.receiptView": {"type":"object","description":"Funding receipt with its publisher actor hydrated; the indexed record is unchanged, including its decimal-string amount, and party and funded-target references are not expanded. Missing publisher profile or organization sidecars are null; indexedAt is null when the index has no timestamp. A receipt is not proof of payment.","required":["uri","cid","indexedAt","did","author","record"],"properties":{"uri":{"type":"string","format":"at-uri"},"cid":{"type":"string","format":"cid"},"indexedAt":{"anyOf":[{"type":"string","format":"datetime"},{"type":"null"}]},"did":{"type":"string","format":"did"},"author":{"$ref":"#/components/schemas/org.hypercerts.api.defs.actorView"},"record":{"$ref":"#/components/schemas/org.hypercerts.funding.receipt.main"}}},
"org.hypercerts.funding.getReceipt.output": {"type":"object","required":["receipt"],"properties":{"receipt":{"$ref":"#/components/schemas/org.hypercerts.funding.getReceipt.receiptView"}}},
"org.hypercerts.funding.listReceipts.output": {"type":"object","required":["receipts"],"properties":{"receipts":{"type":"array","items":{"$ref":"#/components/schemas/org.hypercerts.funding.getReceipt.receiptView"}},"cursor":{"type":"string","description":"Opaque cursor for the next page; omitted when there is no next page."}}},
Expand Down
5 changes: 5 additions & 0 deletions .changeset/lexicon-1-6-0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@hypercerts-org/happyview-modules': minor
---

Validate records against `@hypercerts-org/lexicon` 1.6.0 (was 1.5.0). Records may now carry the optional `langs` field and `app.certified.signature.defs#createdVia` signatures, and funding receipts may omit `amount` and `currency`. Records using these are accepted and served unchanged; no record that validated before is rejected. Operators must reinstall the bundle for the running indexer to use the new Lexicons.
2 changes: 1 addition & 1 deletion docs/coverage.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"source": {
"apiManifest": "happyview-modules/manifest.json",
"pinnedLexiconPackage": "1.5.0"
"pinnedLexiconPackage": "1.6.0"
},
"runtimeValidation": "not-assessed",
"deploymentValidation": "not-assessed",
Expand Down
6 changes: 3 additions & 3 deletions docs/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -7887,7 +7887,7 @@
},
"org.hypercerts.context.attachment.main": {
"type": "record",
"description": "An attachment providing commentary, context, evidence, or documentary material related to a hypercert record (e.g. an activity, project, claim, or evaluation)."
"description": "An attachment providing commentary, context, evidence, or documentary material related to a hypercert record (e.g. an activity, project, claim, or evaluation) or related to an account profile."
},
"org.hypercerts.context.getAttachment.attachmentView": {
"type": "object",
Expand Down Expand Up @@ -8273,7 +8273,7 @@
},
"org.hypercerts.funding.receipt.main": {
"type": "record",
"description": "Records a funding receipt for a payment from one user to another user. It may be recorded by the recipient, by the sender, or by a third party. The sender may remain anonymous."
"description": "Records a payment from a sender to a recipient. Any party may record it, and the sender may stay anonymous. When the sender chose the recipient, record one receipt to the final recipient even if platforms or hosts passed the funds on. When an intermediary chose (regranting), record the payment into it and each onward payment as separate receipts. A receipt may be updated in place under the same record key: its URI does not change, so references by URI keep resolving, but a strongRef (as likes and reposts use) still pins the earlier CID, and signatures bind to content and must be renewed. An earlier version cannot be recalled from readers that kept it."
},
"org.hypercerts.funding.getReceipt.receiptView": {
"type": "object",
Expand Down Expand Up @@ -8498,6 +8498,6 @@
}
}
},
"x-hypercerts-source": "happyview-modules/manifest.json; @hypercerts-org/lexicon@1.5.0",
"x-hypercerts-source": "happyview-modules/manifest.json; @hypercerts-org/lexicon@1.6.0",
"x-hypercerts-unresolved-references": []
}
2 changes: 1 addition & 1 deletion docs/sources/index.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"apiManifest": "happyview-modules/manifest.json",
"pinnedLexiconPackage": "1.5.0",
"pinnedLexiconPackage": "1.6.0",
"sourcePolicy": "Explorer operations are the query/procedure Lexicons declared by modules in happyview-modules/manifest.json. Referenced schemas are resolved from that manifest and its pinned Lexicon package; no remote refs are fetched.",
"runtimeValidation": "not-assessed",
"deploymentValidation": "not-assessed",
Expand Down
9 changes: 9 additions & 0 deletions docs/sources/lexicons/app.certified.actor.organization.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,15 @@
],
"description": "Long-form description of the organization, such as its mission, history, or detailed project narrative. An inline string for plain text or markdown, a Leaflet linear document record embedded directly, or a strong reference to an existing document record."
},
"langs": {
"type": "array",
"description": "Human language(s) of this record's text fields, as BCP-47 language tags (e.g. 'es', 'pt-BR'); up to three for mixed-language text. Set by the writing app from the text the author wrote, with the author able to correct it; never from the interface language or a profile preference alone. A hint for readers, not a guarantee: consumers must not hide a record because it lacks this field.",
"maxLength": 3,
"items": {
"type": "string",
"format": "language"
}
},
"visibility": {
"type": "string",
"knownValues": [
Expand Down
9 changes: 9 additions & 0 deletions docs/sources/lexicons/app.certified.actor.profile.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,15 @@
"maxGraphemes": 20,
"maxLength": 200
},
"langs": {
"type": "array",
"description": "Human language(s) of this record's text fields, as BCP-47 language tags (e.g. 'es', 'pt-BR'); up to three for mixed-language text. Set by the writing app from the text the author wrote, with the author able to correct it; never from the interface language or a profile preference alone. A hint for readers, not a guarantee: consumers must not hide a record because it lacks this field.",
"maxLength": 3,
"items": {
"type": "string",
"format": "language"
}
},
"website": {
"type": "string",
"format": "uri",
Expand Down
26 changes: 23 additions & 3 deletions docs/sources/lexicons/app.certified.signature.defs.json
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
{
"lexicon": 1,
"id": "app.certified.signature.defs",
"description": "Common type definitions for cryptographic signatures attached to records, per the ATProtocol Attestation Specification.",
"description": "Common type definitions for cryptographic signatures attached to records, per the ATProtocol Attestation Specification. Each signature's `$type` says what it attests.",
"defs": {
"list": {
"type": "array",
"description": "Reusable array of cryptographic signatures attesting to a record's content. Open union of inline signatures and strong references to remote attestation proof records.",
"description": "Reusable array of cryptographic signatures on a record. Each entry's `$type` says what it attests. The union is open: other applications may define their own signature types, and consumers ignore types they do not recognize.",
"items": {
"type": "union",
"refs": [
"app.certified.signature.defs#inline",
"app.certified.signature.defs#createdVia",
"com.atproto.repo.strongRef"
]
}
},
"inline": {
"type": "object",
"description": "Inline attestation signature embedded directly in a record. Conforms to the ATProtocol Attestation Specification: the signed input is the 36-byte CIDv1 (dag-cbor + SHA-256) of the record with the `signatures` field removed and a temporary `$sig` metadata object (containing `$type` and the housing repository DID) inserted before canonical DAG-CBOR encoding. ECDSA with the low-S variant per BIP-0062 is required; the curve (P-256 or K-256) is determined by the multicodec prefix of the verification method's `publicKeyMultibase`.",
"description": "Inline attestation signature embedded directly in a record. Conforms to the ATProtocol Attestation Specification: the signed input is the 36-byte CIDv1 (dag-cbor + SHA-256) of the record with the `signatures` field removed and a temporary `$sig` metadata object (containing `$type`, `key` and the housing repository DID) inserted before canonical DAG-CBOR encoding. ECDSA with the low-S variant per BIP-0062 is required; the curve (P-256 or K-256) is determined by the multicodec prefix of the verification method's `publicKeyMultibase`.",
"required": [
"signature",
"key"
Expand All @@ -32,6 +33,25 @@
"maxLength": 512
}
}
},
"createdVia": {
"type": "object",
"description": "Inline signature by the application that wrote this version of the record. It does not mean the application endorses the content. A record should carry at most one `#createdVia` signature; applications enforce this, `#list` validation does not. Signed exactly like `#inline`: `$sig` is this signature entry without its `signature` field (so `$type` and `key`), plus `repository`, the DID of the repository that holds the record.",
"required": [
"signature",
"key"
],
"properties": {
"signature": {
"type": "bytes",
"description": "ECDSA signature bytes (raw r,s) over the 36-byte CID of the record. Low-S variant per BIP-0062 is mandatory."
},
"key": {
"type": "string",
"description": "DID verification method of the application's signing key. It should be in the application's own DID document, preferably a did:web on the application's domain, so that the DID names the application.",
"maxLength": 512
}
}
}
}
}
9 changes: 9 additions & 0 deletions docs/sources/lexicons/org.hypercerts.claim.activity.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,15 @@
],
"description": "Long-form description of the activity. An inline string for plain text or markdown, a Leaflet linear document for rich-text content, or a strong reference to an external description record."
},
"langs": {
"type": "array",
"description": "Human language(s) of this record's text fields, as BCP-47 language tags (e.g. 'es', 'pt-BR'); up to three for mixed-language text. Set by the writing app from the text the author wrote, with the author able to correct it; never from the interface language or a profile preference alone. A hint for readers, not a guarantee: consumers must not hide a record because it lacks this field.",
"maxLength": 3,
"items": {
"type": "string",
"format": "language"
}
},
"image": {
"type": "union",
"refs": [
Expand Down
9 changes: 9 additions & 0 deletions docs/sources/lexicons/org.hypercerts.collection.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,15 @@
],
"description": "Long-form description of the collection. An inline string for plain text or markdown, a Leaflet linear document for rich-text content, or a strong reference to an external description record."
},
"langs": {
"type": "array",
"description": "Human language(s) of this record's text fields, as BCP-47 language tags (e.g. 'es', 'pt-BR'); up to three for mixed-language text. Set by the writing app from the text the author wrote, with the author able to correct it; never from the interface language or a profile preference alone. A hint for readers, not a guarantee: consumers must not hide a record because it lacks this field.",
"maxLength": 3,
"items": {
"type": "string",
"format": "language"
}
},
"avatar": {
"type": "union",
"refs": [
Expand Down
19 changes: 17 additions & 2 deletions docs/sources/lexicons/org.hypercerts.context.attachment.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"defs": {
"main": {
"type": "record",
"description": "An attachment providing commentary, context, evidence, or documentary material related to a hypercert record (e.g. an activity, project, claim, or evaluation).",
"description": "An attachment providing commentary, context, evidence, or documentary material related to a hypercert record (e.g. an activity, project, claim, or evaluation) or related to an account profile.",
"key": "tid",
"record": {
"type": "object",
Expand All @@ -15,7 +15,7 @@
"properties": {
"subjects": {
"type": "array",
"description": "References to the subject(s) the attachment is connected to—this may be an activity claim, outcome claim, measurement, evaluation, or even another attachment. This is optional as the attachment can exist before the claim is recorded.",
"description": "References to the subject(s) the attachment is about: an activity claim, a collection, a measurement, an evaluation, another attachment (for a comment on it), or an account profile (app.certified.actor.profile). A standalone update by its author points at the author's own profile: it is an update about the author. Optional: omit it only when the attachment is recorded before the claim it will support.",
"items": {
"type": "ref",
"ref": "com.atproto.repo.strongRef"
Expand All @@ -26,6 +26,7 @@
"type": "string",
"description": "The type of attachment. Values beyond the known set are permitted.",
"knownValues": [
"update",
"report",
"audit",
"evidence",
Expand Down Expand Up @@ -74,6 +75,15 @@
],
"description": "Long-form description of the attachment. An inline string for plain text or markdown, a Leaflet linear document for rich-text content, or a strong reference to an external description record."
},
"langs": {
"type": "array",
"description": "Human language(s) of this record's text fields, as BCP-47 language tags (e.g. 'es', 'pt-BR'); up to three for mixed-language text. Set by the writing app from the text the author wrote, with the author able to correct it; never from the interface language or a profile preference alone. A hint for readers, not a guarantee: consumers must not hide a record because it lacks this field.",
"maxLength": 3,
"items": {
"type": "string",
"format": "language"
}
},
"location": {
"type": "ref",
"ref": "com.atproto.repo.strongRef",
Expand All @@ -88,6 +98,11 @@
"ref": "com.atproto.repo.strongRef"
}
},
"capturedAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared time when the attached material was captured (e.g. when a photo was taken), as distinct from createdAt. Omit if capture time is unknown, if only a local time without timezone offset or only a date is known, or if no single capture time applies. Not a coverage interval."
},
"createdAt": {
"type": "string",
"format": "datetime",
Expand Down
Loading
Loading