# Harness presets

Audience: AI coding agents first.

Validate every preset against `presets.schema.json`. Resolve fallback at runtime with `resolveBindingChain`; schema validation cannot detect reference targets, identity cycles, or nested hop count.

## Bindings

- Bind every seat to `wrapper`; wrapper MUST be repo-relative and MUST NOT contain `..`.
- Set `model` when wrapper accepts `--model`.
- Set `provider` when wrapper path does not uniquely identify provider. Omitted `provider` normalizes to wrapper path.
- Use `low`, `medium`, and `high` only as tier keys. Reference tier binding as `<seat>.<tier>`.

## Fallback

- Set `fallback` to one seat reference, one inline binding, or ordered array of references and inline bindings.
- Ordered arrays preserve declared order. Runtime resolves and validates whole chain before dispatch.
- Runtime permits fallback only for `engine-down` and `timeout-repeated`. NEVER fall back for task, review, code, scope, or gate failure.
- Runtime rejects unknown reference, invalid binding, repeated `{wrapper, model, provider}` identity, and fifth binding hop. Maximum chain length: four bindings.

```json
{
  "seats": {
    "coder": {
      "wrapper": "wrappers/coder.sh",
      "model": "model-a",
      "provider": "provider-a",
      "fallback": ["backup", { "wrapper": "wrappers/last.sh", "model": "model-c", "provider": "provider-c" }]
    },
    "backup": { "wrapper": "wrappers/backup.sh", "model": "model-b", "provider": "provider-b" }
  }
}
```

## Reviewer independence

- Supply healthy reviewer bindings to `resolveIndependentReviewer`.
- Select reviewer whose provider/model pair differs from coder binding.
- Refuse review when no independent healthy binding exists. NEVER self-review.
