Generate Harness DSL
Create a standalone Harness as Code v0.3 document and prove the execution
contract with the package compiler and resolver.
Workflow
- Identify the host, the capabilities it must actually expose, and the real
control owner. Use
session for one host session. Use state-machine or
program only when a selected adapter explicitly implements that mode.
- Read the DSL contract. Start from
the minimal example; open
the standard example when callable
tools are required.
- Generate one self-contained document unless the user requests a fragment.
Include
language 0.3, every referenced declaration, a concrete runtime,
and a named deployment. Standard tools may remain implicit.
- Run
scripts/validate.mjs. Fix every compiler or resolution error and rerun.
A compile-only state machine is not an executable Qoder or Pi deployment.
- Return the DSL or saved file plus the harness id, deployment id, runtime,
resolution status, and any execution boundary the selected adapter cannot
satisfy.
Authoring Rules
- State only falsifiable requirements. Do not add permission, setting,
degradation, binding, input/output-name, or runtime-execution syntax; v0.3
intentionally has none.
- Match the requirement verb to its capability:
use skill, require tool,
or connect mcp.
- Only the standard tool ids in the contract may be undeclared. Every custom
tool declares a stable
contract id that the adapter exposure must match.
- Qoder and Pi descriptors run
session workflows only. A session workflow
names exactly the one agent role declared by each harness that uses it.
- State-machine outcomes are typed on agents. Every route emitter, outcome,
destination, entry, and stop must exist, and every agent must be reachable.
- A
program <language> <entry> workflow resolves only when the adapter lists
the same language in programmaticLanguages.
- Keep credentials out of source. Prefer
env.VARIABLE for MCP endpoints, but
remember that declaring an endpoint does not connect it; the adapter must do
that.
- Do not invoke host SDKs, install integrations, or claim native enforcement
while generating or validating DSL.
Validate
From this skill directory, run:
node scripts/validate.mjs /path/to/workflow.harness [harness-id ...]
The command prints JSON and exits non-zero when compilation or any selected
named deployment fails resolution. A successful exit is required before
calling generated DSL executable.
When editing this skill, build the package first so dist/ reflects the current
compiler:
npm run harness:build
1---2name: generate-harness-dsl3description: Generate, revise, or review complete Harness as Code `.harness` files when a coding-agent workflow, agent role, skill, tool contract, MCP connection, runtime, or deployment must be compiler-valid and resolvable with `@qoder-ai/harness`.4---56# Generate Harness DSL78Create a standalone Harness as Code v0.3 document and prove the execution9contract with the package compiler and resolver.1011## Workflow12131. Identify the host, the capabilities it must actually expose, and the real14 control owner. Use `session` for one host session. Use `state-machine` or15 `program` only when a selected adapter explicitly implements that mode.162. Read [the DSL contract](references/dsl-contract.md). Start from17 [the minimal example](../../examples/minimal.harness); open18 [the standard example](../../examples/standard-coding.harness) when callable19 tools are required.203. Generate one self-contained document unless the user requests a fragment.21 Include `language 0.3`, every referenced declaration, a concrete runtime,22 and a named deployment. Standard tools may remain implicit.234. Run `scripts/validate.mjs`. Fix every compiler or resolution error and rerun.24 A compile-only state machine is not an executable Qoder or Pi deployment.255. Return the DSL or saved file plus the harness id, deployment id, runtime,26 resolution status, and any execution boundary the selected adapter cannot27 satisfy.2829## Authoring Rules3031- State only falsifiable requirements. Do not add permission, setting,32 degradation, binding, input/output-name, or runtime-execution syntax; v0.333 intentionally has none.34- Match the requirement verb to its capability: `use skill`, `require tool`,35 or `connect mcp`.36- Only the standard tool ids in the contract may be undeclared. Every custom37 tool declares a stable `contract` id that the adapter exposure must match.38- Qoder and Pi descriptors run `session` workflows only. A session workflow39 names exactly the one agent role declared by each harness that uses it.40- State-machine outcomes are typed on agents. Every route emitter, outcome,41 destination, entry, and stop must exist, and every agent must be reachable.42- A `program <language> <entry>` workflow resolves only when the adapter lists43 the same language in `programmaticLanguages`.44- Keep credentials out of source. Prefer `env.VARIABLE` for MCP endpoints, but45 remember that declaring an endpoint does not connect it; the adapter must do46 that.47- Do not invoke host SDKs, install integrations, or claim native enforcement48 while generating or validating DSL.4950## Validate5152From this skill directory, run:5354```sh55node scripts/validate.mjs /path/to/workflow.harness [harness-id ...]56```5758The command prints JSON and exits non-zero when compilation or any selected59named deployment fails resolution. A successful exit is required before60calling generated DSL executable.6162When editing this skill, build the package first so `dist/` reflects the current63compiler:6465```sh66npm run harness:build67```