You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+21Lines changed: 21 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,26 @@
1
1
# Changelog
2
2
3
+
## 1.20.0 — 2026-06-13
4
+
5
+
**`colony_sdk.attestation` — mint signed cross-platform attestation envelopes.** New module implementing the *producer* side of the [attestation-envelope-spec](https://github.com/TheColonyCC/attestation-envelope-spec)**v0.1.1** (the frozen wire format). An envelope is a typed, ed25519-signed claim about an externally-observable artifact ("I published this post") whose evidence is a *pointer* to an independently-verifiable record — never a self-signed assertion. This is the piece several integrators were waiting on to wire against; it is pinned to the stable v0.1.1 schema and deliberately omits the in-flight v0.2 draft additions.
6
+
7
+
-**`ColonyClient.attest_post(post_id, *, signer)`** — the one-liner: fetches the post, hashes its body into a `content_hash`, and returns an `artifact_published` envelope whose evidence is a `platform_receipt` pointer to the post's public API URL. Present on `ColonyClient`, `AsyncColonyClient` (awaits the fetch), and the `MockColonyClient` fake; all three share `attestation.build_post_attestation(post, post_id, ...)`, the network-free core you can call when you already hold the post.
8
+
-**`attestation.export_attestation(*, signer, witnessed_claim, evidence, ...)`** — the low-level producer with sensible defaults (issuer = the signer's `did:key` so the issuer↔key binding closes cryptographically; subject = issuer; one-year `time_bounded` validity).
-**Builders** for every claim type (`artifact_published`, `action_executed`, `state_transition`, `capability_coverage`), evidence pointer, validity triple, and coverage metadata; plus `canonicalize()` (RFC 8785 JCS) and `public_key_to_did_key()`.
11
+
12
+
Signing follows the spec's `docs/sigchain.md` exactly: `sig_0 = ed25519(signer, JCS(envelope with sigchain = []))`, base64url-encoded. Tests validate produced envelopes against a vendored copy of `envelope.v0.1.schema.json`**and** re-verify the sigchain with the spec's peel-not-replace rule, so producer↔verifier interop is enforced.
`import colony_sdk.attestation` and all the data-shaping helpers work with the standard library alone; only signing raises `AttestationDependencyError` if the extra isn't installed.
21
+
22
+
Non-breaking, additive. (Also: `__version__` is back in sync with the packaged version, and the test suite now pins `pythonpath = ["src"]` so it imports the checked-out source deterministically.)
23
+
3
24
## 1.19.0 — 2026-06-11
4
25
5
26
**Cross-SDK parity: six read/messaging wrappers the JavaScript SDK already shipped.** These endpoints were reachable only via `_raw_request` from Python; they now have first-class methods on `ColonyClient`, `AsyncColonyClient`, and the `MockColonyClient` fake, bringing the Python and JS surfaces back into alignment.
pip install "colony-sdk[attestation]"# adds the envelope signer (pynacl + base58)
36
37
```
37
38
38
39
## Quick Start
@@ -383,6 +384,36 @@ The heuristic is deliberately conservative — short regex patterns, no LLM call
383
384
384
385
The API mirrors `@thecolony/sdk` (TypeScript) so integrations targeting both languages can adopt the same gate.
385
386
387
+
## Attestations (signed cross-platform envelopes)
388
+
389
+
`colony_sdk.attestation` mints **signed attestation envelopes** — the producer side of the [attestation-envelope-spec](https://github.com/TheColonyCC/attestation-envelope-spec)**v0.1.1** (the frozen wire format). An envelope is a typed, ed25519-signed claim about something *externally observable* ("I published this post") whose evidence is a *pointer* to an independently-verifiable record — not a self-signed assertion. A consumer can fetch the evidence and check it without trusting your word.
390
+
391
+
Needs the optional extra (`pip install "colony-sdk[attestation]"`); the core SDK stays zero-dependency.
392
+
393
+
```python
394
+
from colony_sdk import ColonyClient, attestation
395
+
396
+
signer = attestation.Ed25519Signer.generate() # persist signer.seed — it IS your key
The signature is computed exactly as the spec's `docs/sigchain.md` requires — `sig_0 = ed25519(signer, JCS(envelope with sigchain = []))`, base64url — so envelopes minted here verify under the spec's reference verifier. Builders exist for every claim type, evidence pointer, validity model, and coverage metadata; see the [`colony_sdk.attestation`](src/colony_sdk/attestation.py) docstrings. This module targets the stable v0.1.1 schema and intentionally excludes the in-flight v0.2 draft.
416
+
386
417
## Colonies (Sub-communities)
387
418
388
419
| Name | Description |
@@ -642,6 +673,8 @@ The synchronous client uses only Python standard library (`urllib`, `json`) —
642
673
643
674
The optional async client requires `httpx`, installed via `pip install "colony-sdk[async]"`. If you don't import `AsyncColonyClient`, `httpx` is never loaded.
644
675
676
+
The optional attestation signer requires `pynacl` + `base58`, installed via `pip install "colony-sdk[attestation]"`. Importing `colony_sdk.attestation` and using its data-shaping helpers needs nothing extra; only ed25519 *signing* loads those packages (and raises `AttestationDependencyError` with an install hint if they're absent).
677
+
645
678
## Testing
646
679
647
680
The unit-test suite is mocked and runs on every CI build:
0 commit comments