Skip to main content

Bulla

Create, verify, and reconcile portable receipts for consequential agent actions.

Glyph defines a portable receipt for consequential agent actions. Bulla is the Python reference implementation. It creates and verifies ActionReceipts locally and computes coverage against a separately supplied action record.

Receipt verification detects changes in the records supplied to the verifier. Coverage reports actions in a supplied action record that have no matching receipt. These checks answer different questions and remain separate.

Install

Bulla supports Python 3.10 and later. Core receipt creation and digest verification require no hosted service.

python -m pip install bulla

Verify one receipt

Download the canonical payment receipt and verify it locally:

curl -fsSLo payment-authorization-v0.2.json \
  https://glyphstandard.com/examples/payment-authorization-v0.2.json
bulla receipt verify payment-authorization-v0.2.json --format json

The receipt records a USD 125.00 charge under a structured USD 200.00 maximum. The checked result is:

integrity            VERIFIED
authenticity         UNVERIFIED
authority            UNAUTHENTICATED
scope                 CONFORMS
grounding             SELF_ASSERTED
recourse              NAMED
reachability          UNVERIFIED
reliance_decision     NOT_COMPUTED

The same receipt is available offline at spec/vectors/payment-authorization.json. Its expected result is pinned in spec/vectors/expected.json and recomputed in CI.

Change amount_minor from 12500 to 12501 without recomputing the hashes. The verifier returns nonzero, reports a content-hash mismatch, and suppresses content-dependent conclusions.

Create one receipt

bulla receipt create \
  --type demo.write \
  --subject path=/tmp/example.txt \
  --forum-endpoint https://example.invalid/challenge \
  --forum-root fixture:independently-pinned-root \
  --out receipt.json
bulla receipt verify receipt.json --format json

The unsigned result reaches the digest verification rung. It does not authenticate the authority or compute a reliance decision.

Check coverage

event_coverage compares valid receipts with an action record supplied outside the receipt set:

from bulla.action_receipt import verify_receipt
from bulla.coverage import event_coverage
from bulla.wrap import receipt_for

receipt = receipt_for("network.egress", {"event_id": "action-001"})
assert verify_receipt(receipt).ok

complete = event_coverage([{"id": "action-001"}], [receipt])
assert complete["coverage"] == 1.0
assert complete["unreceipted_delta"] == []

with_gap = event_coverage(
    [{"id": "action-001"}, {"id": "action-002"}],
    [receipt],
)
assert with_gap["coverage"] == 0.5
assert with_gap["unreceipted_delta"] == ["action-002"]

Receipt integrity remains unchanged in the second comparison. The supplied action record contains one action with no matching receipt.

Where Bulla fits

  • Payments: record authorization, amount bounds, evidence, and recourse.
  • Permissions and writes: bind a consequential operation to its principal and policy.
  • Gateways and provider handoffs: retain the action and authority references that crossed the boundary.

ActionReceipt v0.2 remains the normative and default format. ActionReceipt v0.4 is available as an opt-in experimental draft. Source-only research profiles remain inspectable on GitHub but are excluded from the installed package unless the distribution policy explicitly lists them as released.

Limits

  • Receipt integrity does not establish the truth of every recorded field.
  • Coverage is relative to the supplied action record.
  • Bulla does not establish that the supplied action record is complete.
  • Unsigned receipts remain unauthenticated.
  • Reliance remains NOT_COMPUTED unless a reliance policy is supplied.

Multidimensional verification results reject Boolean coercion. Callers must inspect the named dimensions or apply an explicit reliance policy.

Documentation

License and security

Bulla is licensed under the Apache License 2.0. Report vulnerabilities privately through GitHub Security Advisories or the security policy.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bulla-0.44.4.tar.gz (5.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bulla-0.44.4-py3-none-any.whl (735.2 kB view details)

Uploaded Python 3

File details

Details for the file bulla-0.44.4.tar.gz.

File metadata

  • Download URL: bulla-0.44.4.tar.gz
  • Upload date:
  • Size: 5.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for bulla-0.44.4.tar.gz
Algorithm Hash digest
SHA256 2cbe2038c86d0cf64f6cefa89ac0c2e52b104c83388f2d31a7425e45f83375f5
MD5 693c8dbc7e51667f0b0b94e46e5b8883
BLAKE2b-256 299f840da64927dea7047eeac811f8b6184eecfb5e530da1c77bb9c75e9494bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for bulla-0.44.4.tar.gz:

Publisher: publish.yml on jkomkov/bulla

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bulla-0.44.4-py3-none-any.whl.

File metadata

  • Download URL: bulla-0.44.4-py3-none-any.whl
  • Upload date:
  • Size: 735.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for bulla-0.44.4-py3-none-any.whl
Algorithm Hash digest
SHA256 8bdab3a4f7668d93f325d7e8cc016768925da0a02bb75765dcde7d932fea25ff
MD5 6219f8df7d3ae8b9921c804f59156de8
BLAKE2b-256 2672f0054b679b40a32ef0fad226f4a39ffb483f5e0ce59f72ea8692927a06b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for bulla-0.44.4-py3-none-any.whl:

Publisher: publish.yml on jkomkov/bulla

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.48.0

2 files

0.47.1

2 files

0.46.0

2 files

0.45.1

2 files

This release

0.44.4 This release

2 files

0.44.1

2 files

0.44.0

2 files

0.43.0

2 files

0.42.0

2 files

0.41.0

2 files

0.40.0

2 files

0.37.0

2 files

0.36.0

2 files

0.35.0

2 files

0.34.0

2 files

0.33.0

2 files

0.32.0

2 files

0.24.0

2 files

0.23.0

2 files

0.22.0

2 files

0.21.0

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.16.0

2 files

0.15.0

2 files

0.8.0

2 files

0.7.1

2 files

0.7.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page