Bulla examples.
Create one transaction record, check it locally, and compare the receipt set with a separate action log.
Run these examples with Bulla 0.48.0. Each command reports checks over supplied files; systems that performed or observed an action must supply evidence about occurrence.
1. Run the complete product loop
Start with a fixed local action and one ActionReceipt. An amount-only edit fails its integrity check, while a separate action log identifies a second action with no receipt.
$ python -m pip install "bulla==0.48.0"
$ bulla demo --out first-action
receipt emitted pay_demo_042
changed copy FAILED
coverage before 1/1
coverage after 1/2
unreceipted action pay_demo_043Receiver records are constructed. This demonstration does not establish that funds moved, and it computes no reliance or payment-eligibility decision. Follow the complete quickstart.
2. Create and verify one receipt
$ bulla receipt create --type demo.write --subject path=/tmp/example.txt --principal did:web:example.invalid:agent --policy policy://demo-v1 --forum-endpoint https://example.invalid/challenge --forum-root fixture:independently-pinned-root --out receipt.json
$ bulla receipt verify receipt.json --format jsonWhat the receipt check does not prove
This checks the receipt file. Evidence from the systems that performed or observed the action is still needed to establish what happened.
3. Check the file without a hosted service
Run Bulla beside the checker included in the verification kit while network access is denied. Drill output separates file checks from claims that require another record or trusted key.
$ bulla receipt drill first-action/receipts/pay_demo_042.json --format jsonRetain the verification kit and its detached digest with the receipt set.
4. Add Bulla where your application acts
from bulla import wrap_action
with wrap_action("payments.charge", {"amount": 200, "currency": "USD"}) as act:
act.set_result("sha256:...")
act.add_evidence("counterparty_ack", "sha256:...", "counterparty_signed")
receipt = act.receiptSupply the action and declared context from application code; Bulla writes the receipt JSON. Models do not need to know about the receipt. Continue with the Python integration guide.
5. Compare receipts with an action log
$ bulla coverage --anchor pypi --receipts releases/Bulla reports actions in the supplied log that have no matching receipt. It cannot find actions missing from that log. Open the coverage walkthrough.
Limits of the comparison
Bulla can find actions in the supplied action log that have no matching receipt. It cannot find actions missing from that log.
Composition and research archive
Research examples sit outside the stable package path. Their canonical pages retain the current evidence boundaries and reproduction material.
- Recourse gateSigned deeds, independently grounded inclusion, and relying-party policy.
- Conflicting registry historyPinned roots and the boundary between publisher assertions and relying-party grounding.
- Semantic seam diagnosisScoped bridges and finite composition diagnostics.
- Exact and downgraded repairThe finite-model conditions for exact, surrogate, and unresolved repairs.
- MCP proxy researchObserve-and-advise integration behavior and its execution limits.
- Routed inferenceDraft handoff evidence, fault injections, and current reproduction limits.
- BABEL challengeThe separate empirical benchmark for structural composition methods.
Limits of this evidence
- A host's assertion about its own root is not independent grounding; the relying party must obtain or anchor the root separately.
- The coherence fee measures undisclosed conventions in a pinned composition model; it is not Bulla's safety foundation or an execution-failure predictor.
- Exact means minimum-cost within the pinned finite repair model; it is not proof of safe execution or a universal real-world cost.
- The demonstrated proxy advises and records; it does not silently modify traffic or verify underlying tool execution.
Source and status
Stable commands are documented from Bulla 0.48.0. Experimental availability and external evidence counts remain on the generated status page.