AIR Workbench
Keep SKILL.md as the native executable and distributable artifact. AIR is the
portable, editable interchange view:
SKILL.md ⇄ AIR workflow ⇄ visual graph
Resolve all script paths relative to this Skill directory. Do not install a global command:
node scripts/air.mjs --help
AIR is a project-defined format, not an IANA or standards-body format.
agents/air-workbench/ is the current physical package path, renamed from
agents/workflow-studio/; “Workflow Studio” identifies only
scripts/workflow-studio.mjs, its compatibility commands, and legacy
artifacts.
1. Open the current AIR Workbench editor
Start AIR Workbench without an input to discover installed and project-local Skills automatically:
node scripts/air.mjs workbench
The catalog scans standard project, user, system, repository, and authoritative
enabled Codex plugin Skill roots with finite read-only bounds and exposes only
opaque item IDs through the local API. Explicit enabled configuration and
valid remote-install markers are authority; cache presence alone is ignored.
It opens the first discovered Skill, or an empty document when none is
available. The four-region shell keeps Resources, the React Flow canvas,
Properties / Run setup, and Problems / Evidence / Source / Diff in one
workspace. Use the Resources filter, Quick Open (Command/Ctrl+P), and
manual Refresh resources as needed. Never accept a browser-supplied path,
root, glob, URL, or output destination.
The local catalog/OpenAPI contract is version 1.2.0; AIR artifacts and
/air/v1 remain unchanged. A catalog Skill may carry a display-only
relative_path label, relative to the root that observed it, so a Skill can be
found by the directory a reader knows it by even when its frontmatter name
differs; it is never absolute, never escapes that root, is omitted when it
cannot be formed, and is never accepted as input. Skill content edits rotate
opaque IDs. Use only an
explicit replaces_id produced by a complete, mutually unique server-private
same-source relation to offer Keep/Cancel/Reload. It covers only the
immediately preceding successful generation and is not a route alias. Omit it
for unchanged, split, merge, swap, incomplete, unreadable, or truncated scans;
never match by public name, hash, source label, or path.
Open a specific Skill or AIR artifact by supplying one input:
node scripts/air.mjs workbench /path/to/skill/SKILL.md
node scripts/air.mjs workbench /path/to/workflow.air.json
Discovery is enabled at launch. It is snapshot-based: do not claim a watcher, live follow, provider signal, or managed run. Modified documents are isolated in memory, and a resource switch requires Keep, Discard, or Cancel instead of silently replacing edits.
Default binding is loopback. An explicit --host 0.0.0.0 is informed consent
to expose the same token-protected, read-only catalog over plaintext HTTP to
reachable IPv4 networks:
node scripts/air.mjs workbench \
--host 0.0.0.0
Tell the user to replace 0.0.0.0 in the printed URL with
http://<LAN-IP>:PORT/?token=TOKEN, preserving the port and token. Use a
trusted network/firewall, keep the token URL private, and stop the process
after review. Do not describe 0.0.0.0 as local-user-only.
2. Inspect metadata-only Codex and Claude sessions
The default Resources catalog includes bounded Codex rollout streams and
Claude main/subagent streams. Selecting a session creates an in-memory,
read-only AIR trace snapshot. Its graph and Evidence timeline contain
observed record envelopes plus separately inferred temporal order.
hidden_reasoning_recovered is always false.
All public surfaces omit raw prompts, messages, reasoning, commands and arguments, results, stdout/stderr, attachments, file content, environment and credentials, branches, filesystem paths, and provider identifiers. Use only opaque server-instance session/snapshot IDs. The artifact must retain the metadata-only privacy manifest and omission counts. Require every published catalog row to have a unique opaque session ID that resolves to exactly one server-private source authority. Never reissue a public snapshot ID during one server registry lifetime, even after its private continuation handle expires.
Refresh resources takes another bounded catalog snapshot and, for the
selected session, requests continuation from the last server-owned cursor.
Incomplete trailing JSONL remains uncommitted until a later manual refresh.
If a continuation source was truncated, replaced, rotated, or rewritten,
report the source change instead of joining histories. Even when no prior
snapshot handle is supplied, verify the server-owned last-published bounded
continuity high-water before reusing an epoch or event IDs. Revalidate that
high-water at every later publication cut and do not lower it when a fresh
capture accepts a shorter prefix; start a new epoch with disjoint event IDs
after a mismatch. Provider lifecycle evidence is asymmetric; unknown is
correct when no authoritative evidence exists.
Session graphs are evidence, not editable workflows. Do not enable step/edge editing, plan setup, Markdown export, source, or diff for them, and never expose raw provider JSONL to the browser.
3. Choose the AIR representation
.air.jsonis the complete AIR 1 artifact forworkflow,plan, andtrace..air.mdis the lossless workflow-only Markdown carrier defined by the AIR codec. Lossless does not mean byte-identical: the carrier is the source bytes as an exact prefix plus an appended inertair:v1metadata comment, so it is always larger than the source. Never tell a user thatair convertreturns their original bytes. The byte-preserving render isworkflow-studio exporton an unedited import..air.mdcontains valid Agent Skill Markdown, but Codex and Claude do not discover it merely from that extension. To activate or distribute it as a native Skill, place the reviewed bytes at<skill-directory>/SKILL.md— after confirming with the user which of the two outputs they want there.- Plans and traces use
.air.json; Markdown reports of them are non-lossless views, not AIR carriers.
Use the AIR CLI to import, validate, or convert without overwriting an existing output:
node scripts/air.mjs import /path/to/skill/SKILL.md \
--out /path/to/workflow.air.json
node scripts/air.mjs validate /path/to/workflow.air.json
node scripts/air.mjs convert /path/to/workflow.air.json \
--out /path/to/workflow.air.md
4. Migrate legacy artifacts explicitly
AIR Workbench reads Workflow IR 1.0, exact workflow-studio:v1 Skill
metadata, plain SKILL.md, and saved legacy workflow/plan/trace artifacts.
It does not silently rewrite them.
Migration is deterministic, no-overwrite, and new-output-only. A migrated legacy plan loses executable approval because AIR binds different bytes; any old approval is historical, non-authorizing provenance. Require a fresh AIR approval before any future AIR-native execution path.
node scripts/air.mjs migrate /path/to/legacy.json \
--to air/1 \
--out /path/to/migrated.air.json
5. Review and edit a workflow
Keep the graph canvas, semantic outline, selection inspector, source, and diff in one review context:
- select a step or dependency on the React Flow canvas or keyboard-operable outline;
- edit step titles/bodies and supported dependency properties;
- add, reorder, or delete steps and connect/reconnect dependencies;
- use bounded undo/redo for semantic graph edits; and
- review source and the full diff before downloading an artifact or Markdown draft.
Canvas positions, viewport, focus, and selection are presentation state and must never enter AIR, legacy Workflow IR, plan hashes, approvals, or promoted Skills. Mount the interactive canvas only at or below 1,000 nodes and 1,000 edges. Above either limit, use the bounded first-100-rows-per-kind fallback while preserving validation, diagnostics, source truth, and downloads.
For a real repository smoke test:
node scripts/workflow-studio.mjs import \
../background-implementer/SKILL.md \
--out /tmp/background-implementer.workflow.json
node scripts/workflow-studio.mjs studio \
/tmp/background-implementer.workflow.json
An unchanged Skill round-trip must preserve its source bytes exactly. Unsupported or ambiguous Markdown remains opaque rather than being guessed.
6. Use the legacy native-run compatibility path
The established Workflow IR 1.0 native-run commands remain available
unchanged while AIR-native plan/run support is developed:
node scripts/workflow-studio.mjs plan /path/to/workflow.json \
--agent codex \
--cwd /path/to/workspace \
--prompt-file /path/to/prompt.txt \
--safety read-only \
--out /path/to/plan.json
node scripts/workflow-studio.mjs approve /path/to/plan.json \
--out /path/to/approved-plan.json
node scripts/workflow-studio.mjs run /path/to/approved-plan.json \
--trace /path/to/trace.json
Use --agent claude for Claude Code. Default to read-only;
workspace-write requires a separate explicit choice. Browser review is not
CLI authorization. Any prompt, graph, agent, working-directory, safety, or
command change requires new approval.
The browser's Run setup prepares and downloads a reviewed plan; it is not a Run control and does not grant native approval. Before a native run, state that the graph is supplied to the selected CLI but is not enforced node by node. A trace includes observable provider events and explicitly inferred sequence, not hidden reasoning or causal truth. Missing CLIs fail explicitly; never install, silently fall back, add bypass flags, or accept arbitrary passthrough arguments.
7. Promote a reviewed legacy plan or trace
Promotion always writes a new Skill draft and never overwrites a source:
node scripts/workflow-studio.mjs promote /path/to/plan-or-trace.json \
--name reviewed-workflow \
--description "Run the reviewed workflow." \
--out /path/to/reviewed-workflow
Review generated instructions and provenance warnings. Trace-derived steps describe observed history, not guaranteed future behavior.
Compatibility and limits
- AIR 1 uses
format: "air",air_version: "1.0.0", thehttps://open330.github.io/air/project origin, and canonical/air/v1read-only discovery routes. /api/artifact, Workflow IR1.0,workflow-studio:v1, andscripts/workflow-studio.mjsremain explicit compatibility boundaries.- The server has no browser file-write, Skill-install, or agent-run endpoint.
- Native execution remains delegated to installed Codex and Claude CLIs; AIR Workbench is not a managed node-by-node orchestrator.
- The default Resources catalog discovers bounded Skills plus metadata-only Codex rollout and Claude main/subagent sessions. Session snapshots and timelines are read-only and refresh manually; there is no watcher or live follow.
- The installed runtime uses checked-in same-origin assets and needs no npm, CDN, registry, telemetry, remote service, or global executable.
- Import coverage is partial and shape-based. Only the recognized document
shapes become steps; anything else imports to zero nodes and zero edges with
a
workflow.nonewarning, which is a normal result and not an error. The bottom rung chains ordinary##sections in document order and marks the resultheuristicconfidence withinferrededge provenance — say so instead of presenting an inferred order as the author's declared sequence.README.mdlists the rungs and theirconfidence.rule_idvalues. - This Skill is not part of the
coreinstall profile. Install it explicitly withagt skill install -g --from jiunbae/agent-skills/agents/air-workbenchor./install.sh agents/air-workbench.
See README.md and spec/AIR-1.0.0.md for the complete contract, safety
model, build instructions, and compatibility matrix.