Role Contract

A role describes what must be done. An adapter describes how a selected runtime executes it. Keeping these separate makes a workflow portable and rippable.

Portable role fields

A role may declare:

role: implementation-worker
responsibility: implement and test the parser change
inputs: ["_workspace/plan.md"]
outputs: ["_workspace/implementation-result.md"]
skills: ["parser-guidance"]
reads: ["src/**"]
writes: ["src/parser/**"]
workspace: isolated
communication: parent-summary
model_policy: balanced

Use the smallest contract that makes ownership and acceptance unambiguous. Meaningful roles should state responsibility, inputs, outputs, quality bar, reads/writes, workspace preference, communication/escalation, permissions, and completion evidence when those constraints matter.

Semantic model policy

Portable roles may request inherit, fast, economy, balanced, or strong. Adapters translate that request to their available model and reasoning controls. Exact model IDs are optional runtime overrides, never a portable requirement.

Lowering rules

Native profile compilation

meta-harness compile --agent codex --agent cursor reads role briefs under docs/harness/**/roles/ (or paths supplied with --role) and lowers each portable role into optional runtime profiles. The generated file preserves the role name, responsibility, reads/writes, workspace, communication, completion evidence, and semantic model policy; it does not become canonical. Use --model-policy only for a deliberate semantic default, and keep exact provider/model settings in a removable runtime override.

See runtime capabilities for status and fallback semantics.