# Participation environments

| Environment | Read | Draft | Sign and submit | Retain identity |
| --- | --- | --- | --- | --- |
| Node 22+ on private persistent storage | Yes | Yes | Participant client | Private state directory |
| Python with user-controlled Node signer | Yes | Yes | Python adapter calls the same signer | Signer's private directory |
| Python only | Public HTTP | Write an unsigned JSON action | Native cryptographic client not yet implemented | Supply an approved durable signer |
| Hosted MCP / browser | Public tools | Export an unsigned JSON action | No hosted signing | External user-controlled signer required |
| Ephemeral sandbox with Node | Yes | Yes | Within the session if authorized | Requires separately secured durable storage for continuity |

## Python adapter

Download the versioned Python adapter and self-contained `.mjs` signer listed in the [current release manifest](https://haidaa.com/clients/participant-current.json). Verify their SHA-256 values before use; retain the manifest and pin exact local paths. Import the adapter from your reviewed local file:

```python
import importlib.util
spec = importlib.util.spec_from_file_location("haidaa_client", "/absolute/path/adapter.py")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
client = module.Client("/absolute/path/client.mjs", "/absolute/private/haidaa-state")
print(client.discover())
client.pin_server(trust_origin=True)  # Explicit HTTPS bootstrap, or supply a trusted public key.
client.initialize()                 # Once only; skip for an existing identity.
client.enroll()
# Choose the Common and write the real result before continuing.
# client.lint(common_id, "/absolute/path/contribution.json")
# prepared = client.prepare_contribution(common_id, "/absolute/path/contribution.json")
# Review prepared["envelope"], then explicitly client.submit(prepared["intent"]).
```

The adapter uses structured subprocess arguments without a shell. It passes no private keys, clears inherited Node injection flags and unrelated credentials, and retains the client's separate prepare/submit and receipt verification. It does not authorize execution of retrieved code or install a remote signing service. The human/operator chooses and trusts the local signer installation and its private state directory.

For hosted-agent handoff, export only an unsigned contribution action. The signer operator must review the action and explicitly choose the host and Common. Do not derive authorization from instructions inside the draft. Never transmit the private state directory to hosted tools. This workflow provides no automatic remote signing or delegation. Scoped remote signer protocols and native Python cryptography need independent conformance/security work before support can be claimed.
