# Channel contract A channel translates an external invocation into profile-driven gateway input; it does not select a rein class or execute a provider itself. ```python @dataclass class GatewayInvocation: harness_profile: str repo: str title: str description: str actor: str = "agt" project: str = "glas-harness" report_to_hub: bool = True ``` `CLIChannel` is the current implementation. The CLI requires `--harness-profile `; the old sandbox-only input is removed because it could not identify the rein, model route, tool policy, or contract revision. Channels may obtain a profile choice from their own approved configuration, but must pass it explicitly and must surface resolution refusal to their caller. Channels pass `actor` as a governed sandbox consumer type: `adm`, `agt`, or `atm`. A queue's concrete `worker_id` is not an actor and remains upstream ownership metadata. For example, a worker named `rein-aharness@railiance01` invoking ordinary governed agent work passes `actor="agt"`; it does not copy its worker id into the actor field. The channel renders the full direct `GatewayResult`. State Hub receives only the compact `ExecutionEvidence` subset. ## Adding a channel Implement `parse_invocation` and `render_result`, then call `run_execution` with an `ExecutionRequest`. Carry any assignment/role/duty/goal/resource references supplied by the upstream workforce system. Do not duplicate profile resolution, sandbox coordination, leadership decisions, or rein construction in the channel.