{
"_comment": "Single source of truth for the ACDP SDK public surface. test_parity.py asserts BOTH the Python (acdp-py) and Node (acdp-node) bindings expose exactly these classes and methods, with names normalized to snake_case (Node's camelCase is converted). Adding a method to one binding without the other — or without updating this file — fails the parity test in `make interop` and CI. When you intentionally add/remove public API, update this file in the same change.",
"classes": {
"AcdpProducer": [
"agent_did",
"build_publish_request",
"build_supersede_request",
"from_seed",
"from_seed_did_key",
"generate",
"generate_did_key",
"key_id",
"public_key_b64",
"seed_bytes",
"sign_challenge"
],
"AcdpP256Producer": [
"agent_did",
"build_publish_request",
"build_supersede_request",
"did_verification_method",
"from_seed",
"from_seed_did_key",
"generate",
"generate_did_key",
"key_id",
"public_key_jwk",
"public_key_sec1_b64",
"seed_bytes",
"sign_challenge"
],
"AcdpVerifier": [
"build_log_leaf",
"build_witness_cosignature",
"canonical_preimage",
"classify_under_revocation",
"evaluate_witness_quorum",
"explain_hash_mismatch",
"fingerprint_ed25519_b64",
"parse_key_revocation",
"verify_body_offline",
"verify_content_hash",
"verify_ctx_id_binding",
"verify_lifecycle_event",
"verify_lineage_head_receipt",
"verify_log_checkpoint",
"verify_log_consistency",
"verify_log_inclusion",
"verify_publish_request_offline",
"verify_receipt",
"verify_signature",
"verify_signature_p256",
"verify_witness_cosignature"
],
"AcdpCanonicalizer": [
"canonicalize",
"content_hash"
],
"AcdpMerkle": [
"leaf_hash",
"node_hash",
"root_hash"
],
"AcdpSsrfPolicy": [
"allow_test_loopback",
"check_ip",
"check_redirect_authority",
"check_url",
"production"
],
"AcdpDid": [
"strip_fragment",
"web_to_url"
],
"AcdpDidDocument": [
"id",
"key_for_algorithm",
"parse",
"receipt_key_for_algorithm"
]
},
"arity": {
"_comment": "Required and total parameter arity for every `classes` entry, as [required, total] (property getters are recorded as the literal string \"property\", never [0, 0] — there is no arity concept for a getter). Sources, one per binding, never Function.length: Python via inspect.signature (excluding self/cls and any *args/**kwargs — none occur here); Node via bindings/acdp-node/index.d.ts, expanding a parameter whose declared type names an `export interface` in that same file into the interface's own fields (required keys off the trailing `?` on a field, NEVER off a `| null` union — a non-trailing Option<T> carries no `?`); wasm via bindings/acdp-wasm/pkg/acdp_wasm.d.ts, anchored on `^export function` (never the InitOutput block, which re-declares every export at its raw wasm-ABI arity), covering only the methods wasm.class_map actually maps to a real export. These are reviewed literals verified against the live signatures, not a dump of extractor output — see test_parity.py's A1-A5.",
"AcdpProducer": {
"agent_did": "property",
"build_publish_request": [2, 19],
"build_supersede_request": [1, 15],
"from_seed": [3, 3],
"from_seed_did_key": [1, 1],
"generate": [2, 2],
"generate_did_key": [0, 0],
"key_id": "property",
"public_key_b64": "property",
"seed_bytes": [0, 0],
"sign_challenge": [1, 1]
},
"AcdpP256Producer": {
"agent_did": "property",
"build_publish_request": [2, 19],
"build_supersede_request": [1, 15],
"did_verification_method": [2, 2],
"from_seed": [3, 3],
"from_seed_did_key": [1, 1],
"generate": [2, 2],
"generate_did_key": [0, 0],
"key_id": "property",
"public_key_jwk": "property",
"public_key_sec1_b64": "property",
"seed_bytes": [0, 0],
"sign_challenge": [1, 1]
},
"AcdpVerifier": {
"build_log_leaf": [1, 1],
"build_witness_cosignature": [4, 4],
"canonical_preimage": [1, 1],
"classify_under_revocation": [2, 3],
"evaluate_witness_quorum": [5, 6],
"explain_hash_mismatch": [2, 2],
"fingerprint_ed25519_b64": [1, 1],
"parse_key_revocation": [1, 2],
"verify_body_offline": [1, 1],
"verify_content_hash": [2, 2],
"verify_ctx_id_binding": [2, 2],
"verify_lifecycle_event": [3, 3],
"verify_lineage_head_receipt": [3, 6],
"verify_log_checkpoint": [2, 5],
"verify_log_consistency": [3, 3],
"verify_log_inclusion": [3, 3],
"verify_publish_request_offline": [1, 1],
"verify_receipt": [6, 6],
"verify_signature": [3, 3],
"verify_signature_p256": [3, 3],
"verify_witness_cosignature": [3, 5]
},
"AcdpCanonicalizer": {
"canonicalize": [1, 1],
"content_hash": [1, 1]
},
"AcdpMerkle": {
"leaf_hash": [1, 1],
"node_hash": [2, 2],
"root_hash": [1, 1]
},
"AcdpSsrfPolicy": {
"allow_test_loopback": [0, 0],
"check_ip": [1, 1],
"check_redirect_authority": [2, 2],
"check_url": [1, 1],
"production": [0, 0]
},
"AcdpDid": {
"strip_fragment": [1, 1],
"web_to_url": [1, 1]
},
"AcdpDidDocument": {
"id": "property",
"key_for_algorithm": [2, 2],
"parse": [2, 2],
"receipt_key_for_algorithm": [2, 2]
}
},
"wasm": {
"_comment": "Flat #[wasm_bindgen] surface of bindings/acdp-wasm (25 free functions, no classes). `functions` pins the full export list in snake_case. `class_map` classifies every `classes` entry against wasm: a class mapped to \"absent\" has no wasm counterpart at all; a present class's methods default to the identical snake_case name, with `aliases` naming the exceptions (value = wasm function name, or null = this one method has no wasm counterpart). `wasm_only` lists exports with no class counterpart. Renaming a shipped npm export is BREAKING — divergences live here as aliases forever (or until an acdp-wasm major).",
"functions": [
"build_log_leaf",
"build_witness_cosignature",
"canonical_preimage",
"classify_under_revocation",
"evaluate_witness_quorum",
"explain_hash_mismatch",
"fingerprint_ed25519",
"merkle_leaf_hash",
"merkle_node_hash",
"merkle_root_hash",
"parse_key_revocation",
"resolve_did_key",
"verify_body_offline",
"verify_content_hash",
"verify_ctx_id_binding",
"verify_lifecycle_event",
"verify_lineage_head_receipt",
"verify_log_checkpoint",
"verify_log_consistency",
"verify_log_inclusion",
"verify_publish_request_offline",
"verify_receipt",
"verify_signature_ed25519",
"verify_signature_p256",
"verify_witness_cosignature"
],
"class_map": {
"AcdpCanonicalizer": "absent",
"AcdpDid": "absent",
"AcdpDidDocument": "absent",
"AcdpMerkle": {
"aliases": {
"leaf_hash": "merkle_leaf_hash",
"node_hash": "merkle_node_hash",
"root_hash": "merkle_root_hash"
}
},
"AcdpP256Producer": "absent",
"AcdpProducer": "absent",
"AcdpSsrfPolicy": "absent",
"AcdpVerifier": {
"aliases": {
"verify_signature": "verify_signature_ed25519",
"fingerprint_ed25519_b64": "fingerprint_ed25519"
}
}
},
"wasm_only": ["resolve_did_key"]
}
}