causalontology-py
The second implementation of the Causalontology standard — the proof of language independence. (The first is the PrologAI reference implementation.)
Zero dependencies — Python standard library only:
| Module | Implements |
|---|---|
causalontology.canonical |
RFC 8785 (JSON Canonicalization Scheme) serialization, identity-bearing field filtering, SHA-256 content-addressed identify() |
causalontology.ed25519 |
pure-Python Ed25519 (RFC 8032), verified against the RFC's known-answer test |
causalontology.signing |
record-level sign_record() / verify_record() over canonical identity-bearing bytes |
causalontology.schema |
validation against the seventeen JSON Schemas in spec/schema/ |
causalontology.semantics |
the 21 semantic rules: temporal admissibility (fixed constants), formal conflict, refinement validity, bridged reachability, stratal classification, the skip decision, enrichment field/shape rules, and the token-tier coherence checks |
causalontology.store |
an in-memory conformant store: idempotent immutable puts, signed add-only records, materialized enrichment views with contributors, retraction and succession lineage, the resolve minimum, the deterministic cycle-breaking view rule, and the stigmergy gaps() read |
Conformance
$ python3 tests/run_conformance.py
...
107/107 vectors passed
causalontology-py is CONFORMANT to the suite (vectors frozen at specification 2.0.0).
The vectors are frozen at specification 2.0.0 (2026-07-13): they carry concrete identifiers, real keys, and a real verifying signature. The harness's old normalization now simply passes frozen values through.
Thirty-second taste
from causalontology import identify, InMemoryStore, keypair_from_seed, sign_record
import hashlib
store = InMemoryStore()
press = store.put({"type": "occurrent", "label": "press_button", "category": "action"})
light = store.put({"type": "occurrent", "label": "light_on", "category": "state_change"})
claim = store.put({"type": "causal_relation_object", "causes": [press], "effects": [light]})
print(store.gaps("missing_field")) # the degenerate claim is a visible invitation
sk, source = keypair_from_seed(hashlib.sha256(b"alice").digest())
store.put_record(sign_record({"type": "assertion", "about": claim,
"source": source, "evidence_type": "imported",
"confidence": 0.5,
"timestamp": "2026-07-13T00:00:00Z"}, sk))
License: "The attribution always; no profit, no problem license." — see the
repository LICENSE and NOTICE.
Metadata
Release files for causalontology 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| causalontology-2.0.0.tar.gz | 18.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| causalontology-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.2 kB
Release files / causalontology-2.0.0.tar.gz
| Download URL | causalontology-2.0.0.tar.gz |
|---|---|
| Size | 18.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f61e342faf44c4c4bd52ef2a20898b66b80aee0eb2371696f203ea838b3d0458
|
|
BLAKE2b-256 checksum How to use checksums |
730e6a05d1ac3b8666f872670023a0dc7a21a317b350c88d212a33c8fe0747fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / causalontology-2.0.0-py3-none-any.whl
| Download URL | causalontology-2.0.0-py3-none-any.whl |
|---|---|
| Size | 20.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7779d28f00ead519b1715b2948fd596ba828fa2530d07648659664ed70f36010
|
|
BLAKE2b-256 checksum How to use checksums |
c47f069a92fb18e59afe47a059ac58af68fb909c7d88557d1fe97bb3b1821f3e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|