## Public contract
The published manifest reference says `[env.NAME] direction = "read"` captures launch-time values and makes `{NAME}` available when echo, digest, or Psyche children spawn. It explicitly shows an echo command referencing `{CLAUDE_CONFIG_DIR}` and states captured values are available to Psyche.

Source: https://sabermage.github.io/spt-releases/harness-contract/manifest.html

## Reproduction
With spt 0.31.0, declare:

```toml
[session.echo_commune]
command = "helper --profile {OMP_PROFILE}"
keys = ["id", "session_id", "OMP_PROFILE"]

[env.OMP_PROFILE]
direction = "read"
value = "__UNSET__"
```

Then run:

```console
spt adapter add manifest.toml
```

Observed:

```text
ADAPTER_ADD_FAIL: manifest invalid: [session.echo_commune] command: `{OMP_PROFILE}` is not a substitution key spt-core can fill for this role
```

The same rejection occurs for `session.psyche_init` and `session.psyche_resume`. JSON-schema validation passes; registration rejects the manifest.

## Impact
A public-surface-only adapter cannot preserve the endpoint's named harness profile/config root across the daemon boundary for echo/Psyche, despite the documented contract. Please either restore role-specific read-env substitution support or amend the published contract with the supported transport.
