# Legacy Fleet Class Aliases

Fleet class compatibility is intentionally narrow. The shared resolver accepts exactly three legacy
class names and converts them to canonical classes before persona lookup:

| Legacy value           | Canonical value | Migration action                                                                                                       |
| ---------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `implementer`          | `code`          | Replace class and tool-policy references with `code`.                                                                  |
| `reviewer`             | `review`        | Replace class and tool-policy references with `review`.                                                                |
| `operator-interaction` | `interaction`   | Replace class and roster-v2 tool-policy references with `interaction`. The legacy service artifact remains compatible. |

Alias support preserves existing inputs while provisioning and typed semantic output use canonical
identities. Requested and canonical class values remain separately observable during semantic
validation.

## Lookup and override behavior

Canonicalization precedes baseline and `roles.local` lookup. A legacy-named override such as
`roles.local/implementer.md` is not a separate authority and is not selected for an `implementer`
request. Customize the canonical role instead, for example `roles.local/code.md`.

The compatibility file `operator-interaction.md` remains shipped, but `interaction` is the canonical
role class. Tess is an example display name only.

## Unresolved and custom classes

No names are inferred from historical usage, instance names, or similar wording. `worker`, `analyst`,
`canary`, Tess, and Ultron are not aliases. An otherwise unknown class is accepted only if the shared
resolver can read an actual baseline or `roles.local` contract for that exact class. A `LIBRARY.md`
row without a readable contract fails semantic validation.

Custom classes receive no protected authority implicitly. Protected class/tool-policy mismatches
fail closed.

## Retirement guidance

New configuration should emit canonical values. Existing inputs may use the three aliases during the
compatibility period, but operators should migrate class and tool-policy fields together. Do not
create new legacy-named role overrides; move their intended content to the canonical filename and
validate the roster/profile before removing the old artifact.
