Treeship
Get started

How it works

The four-step flow from first command to shareable proof URL.

The flow

Initialize

Create a Treeship -- a trust domain with a name and an Ed25519 keypair.

treeship init

One Treeship covers your entire workflow. Many agents, many workflows, one set of keys and one governance model.

Run your workflow

Wrap any command or attest any action. Issue approvals before sensitive steps.

treeship wrap -- python agent.py
treeship attest approval --approver human://rezo --description "approve payment"
treeship wrap -- node pay.js

Every step produces a signed artifact linked to the previous one via a content-addressed parent ID.

Share the proof

Bundle your artifacts and push to the Hub.

treeship bundle create --artifacts art_a1b2,art_c3d4 --tag deploy-v1.2
treeship dock push art_bundle_id
# -> https://treeship.dev/verify/art_xxx

What gets signed

Every artifact is a DSSE envelope containing a Treeship statement:

DSSE envelope
└── payloadType: application/vnd.treeship.action.v1+json
└── payload (base64):
    {
      type:          "treeship/action/v1",
      timestamp:     "2026-03-26T21:00:00Z",
      actor:         "agent://researcher",
      action:        "document.analyze",
      parentId:      "art_previousstep",
      approvalNonce: "nce_7f8e9d0a",    <- must match approval.nonce
      meta:          { ... }
    }
└── signatures:
    [{ keyid: "key_9f8e7d6c", sig: "base64url(ed25519_sig)" }]

How verification works

treeship verify art_f7e6d5c4

The verifier is deterministic and runs entirely on your machine. No network call, no server trust required.

The verifier:

  1. Derives the expected artifact ID from sha256(PAE_bytes)[..16]
  2. Compares against the stored ID -- tampered content fails immediately
  3. Verifies the Ed25519 signature
  4. Validates the statement schema
  5. Walks the parent chain recursively
  6. Checks action.approvalNonce == approval.nonce if present
  7. Returns pass / fail with reasons

Exit 0 = clean chain. Exit 1 = something failed.