v0.19.0 — agent-operable baseline + runward wire
Making "an AI agent can discover, install and operate runward with no human at the keyboard" true — without leaning on a detection layer that can only ever be partial (ADR-0030).
- Neutral baseline by default.
initwith no explicit--toolswrites only the vendor-neutral core (AGENTS.md+.agents/skills/);--yesno longer defaults to theclaudeprofile and the wizard pre-checks nothing. No harness is privileged — a channel is an opt-in the operator adds afterward. Closes a standing vendor-neutrality breach. runward wire— best-effort harness detection. Detects the AI harness running the command via a verified runtime signal (CLAUDECODEfor Claude Code and Cowork,GEMINI_CLI,CURSOR_AGENT), falling back to a config-file marker, thenundetermined. It recommends the matching auto-trigger channel and points at the inert sample — it never wires anything (wires:falseinvariant, ADR-0012) and never prompts, so an agent run never hangs. Onundetermined, the doctrine (AGENTS.md + the plugin SKILL.md) tells the agent to ask the operator which tool they use rather than guess.check --json— a machine contract. A stable, deterministic JSON verdict (current gate, deliverable states, conformance gaps) so an agent drives on data, not scraped text. Hook output is routed to stderr under--jsonso a subprocess can't corrupt the object.- Hardened non-interactivity.
isNonInteractive()also returns true when stdin is not a TTY orCIis set — an autonomous run never hangs on a prompt it cannot answer. - Guards. New unit tests for detection (signal precedence, per-family config detection,
undetermined, thewires:falseinvariant) and smoke assertions forwire --jsonandcheck --json[ --strict]. Self-gate strict green; 65 unit tests.