01 · Prevent

Refuse the action
before it lands.

Mycelium claims the transition, validates the tool, and either executes once or returns the stored result. Duplicate charges, emails, and writes stop at the boundary.

HomePrevent·Resolve·Verify

What this stops

The expensive mistake,
not the wrong answer.

Failure catalog

Named boundaries.
Not a count.

Each class maps to a runtime surface. Configure only what the workflow needs.

Core path

Claim, then execute.

A ledgered tool gets a side-effect class and a transition key. The next dispatch resolves the existing transition instead of charging again.

Full actions reference →

send_payment.py

from mycelium import load_config

config = load_config("mycelium.yaml")

@config.apply
def send_payment(amount: float, recipient: str) -> dict:
    return gateway.charge(amount, recipient)

send_payment(amount=100.0, recipient="acct_123", tool_call_id="call_pay")
duplicate dispatch returns the stored resultNO SECOND CHARGE

Next

Then resolve
what the crash left open.