Skip to content

Create, check, decide, and reconcile.

An ActionReceipt is a portable transaction record the counterparty can keep. Bulla creates and checks the file locally, applies an explicitly supplied receiver policy, and compares receipt sets with independently supplied action records.

Bulla 0.47.1 · Python 3.10+ · Apache-2.0

Add Bulla to the application code that accepts or performs the action. The model does not need to generate JSON or know that a receipt is being created. The receipt is not the decision; it gives the next system a stable record from which to decide.

What checking the file cannot prove

This checks the receipt file. Evidence from the systems that performed or observed the action is still needed to establish what happened.

Technical evidence

Verification establishes only the reported digest, identity, or inclusion depth; it does not establish the truth of the underlying process.

$ python -m pip install "bulla==0.47.1"
$ bulla demo --out first-action
About the published package

The command shown here comes from the package published on PyPI, not from unreleased repository code.

Technical evidence

Commands labelled published are captured from the exact artifact accepted by PyPI; repository source is not substituted for it.

The fixed local scenario emits a receipt through wrap_action, checks it, and finds a second action in the customer log with no matching receipt.

The quickstart also shows a changed-copy integrity check. The action-log comparison is the separate step that exposes the missing receipt. The example does not contact a payment network.

$ bulla receipt drill first-action/receipts/pay_demo_042.json --format json

The drill runs Bulla and the packaged standalone checker with network operations denied. Its report separates checks made from the saved files from questions that require another source.

Download the retained verification kit or verify a receipt in the browser.

Verification kit details

Keep the archive and detached digest with the receipt set. The manifest checks the contents; the signed release receipt authenticates the published archive.

Kit SHA-256: 8f2cdd16bcbd1a1121f49545b6a6512872b188221ca30ec054dfd6b2fb2142ab

Create the receipt where the application acts.

python
from bulla import wrap_action

with wrap_action(
    "payments.charge",
    {"event_id": "pay-1", "amount_minor": 12500},
) as action:
    receiver.charge(amount_minor=12500)

receipt = action.receipt

Read the Python integration guide →

Primary tasks

  1. 01CreateEmit a portable transaction record where your application accepts or completes an external action.
  2. 02CheckRecompute a saved receipt locally without contacting the provider.
  3. 03DecideApply an explicitly supplied receiver policy before another consequential action.
  4. 04ReconcileCompare the receipt set with your action log and identify actions with no receipt.

Research and legacy

Source-only experiments, composition diagnostics, and legacy profiles remain separate from the stable ActionReceipt path. Their status and limitations are reported independently.