Comparison with GitHub Agentic Workflows and gh-cao
gh-aw (GitHub Agentic Workflows) is the
source of the safe-output format, of the collector collect ports and
check runs here, and of the handlers apply runs.
gh-cao (GitHub Central Agentic Ops)
is a GitHub Next research prototype layered on gh-aw. It adds campaigns
across repositories, a catalog and a dashboard. This page compares
features. It is not deployment advice. The
README explains why this
project uses a host-user sandbox rather than gh-aw's container runtime.
The gh-aw descriptions come from its documentation and the release notes up to v0.92.6, a pre-release of 2026-10-20; the latest full release is v0.92.0 of 2026-10-15. The gh-cao descriptions come from its README of the same week. agentic-job pins gh-aw's setup action at v0.91.12 plus seven commits (safe-outputs.md). Statements about this repository were checked against its code when this page was written; the code wins where they differ. Issue numbers are the ones that tracked each gap. All of them are closed, even where part of the gap remains.
Shape of a workflow
gh-aw compiles Markdown with YAML frontmatter into a locked Actions workflow. Its compiler selects the engine, permissions, firewall, activation, detection and output jobs. It also lints workflows: v0.92.6 adds AST linters for checkout trust, prompt expressions and secret-leak taint. Imports compose prompts and configuration.
agentic-job has no compiler and no prompt language
(compiler.md). A caller writes ordinary YAML that calls the
reusable workflow at a pinned commit. Its bounds TOML files set the limits
check enforces. The caller supplies one standing task. The opt-in
workflows check enforces job shape: pins, no
persisted credentials, no secrets in secure-host jobs and no unsandboxed
agent actions. This repository runs it in its required ingress vet job.
Sandbox and network
gh-aw's default runtime is AWF, its Agent Workflow Firewall, a rootless
container with a domain allowlist. Two runtimes are in preview: a
cloud-hypervisor VM and the nvx microVM. AWF's API proxy holds the model
credential on the runner.
agentic-job uses no container: the agent shares the kernel of a disposable
host, and keeps rootless podman and host KVM. Under the reusable workflow,
secure-host first removes general root access and the metadata service,
and the agent then runs as the runner's user. That job holds nothing the
agent may not read: read-only permissions, no id-token and no secret but
the run token (workflow.md). The CLI's run without
--runner-home instead runs the agent as a second Unix user, with nftables
rules keyed on that user's uid (sandbox.md); the reusable
workflow does not offer that mode. [egress] write-policy, off by default,
holds the runner's user to the same egress policy
(egress write policy).
Egress goes through the binary's own Rust proxy
(the policy file). mitmproxy remains only
behind [egress] rust-proxy = false. By default, reads go to any host not
on a pinned threat feed, and writes need a [[write]] rule. gh-aw's style of
domain allowlist is opt-in: mode = "allowlist"
(opt-in domain allowlist).
gh-aw runs on private repositories as on public ones. Here runs are public-only, and the reusable workflow refuses a private target or caller whatever the bounds say. An agent job of the caller's own, with a second user, can opt in through every bounds file. It then also needs the allowlist, may target only the caller's own repository, and hands back no patch (private repositories).
Under the reusable workflow the model key never reaches the runner: it
stays with a broker on another machine. A register job of its own
registers the run with GitHub OIDC, and the agent's job, which has no
id-token, gets only a token for that one run
(the run token, inference.md).
plain and token-file registration also exist. The reusable workflow
refuses the CLI's provider-API-key mode, which would serve the key on the
runner.
Engines
gh-aw supports six engines: Copilot CLI (the default), Claude Code, Codex, Gemini CLI, Agy and Pi. Others, OpenCode and Goose among them, are unsupported samples, imported as Markdown engine definitions.
gh-aw marks Agy experimental and Gemini CLI soft-deprecated.
agentic-job drives every agent over ACP, with the commands in
agents.toml and versions
pinned where the policy and setup install them. The agents are Claude Code,
opencode, Mistral Vibe and a scripted fake agent for tests. Codex and
Gemini are not included. A new agent needs code, not a caller-supplied
command.
Triggers and admission
Both implement role and bot checks, fork restrictions, slash commands,
reactions and a status comment. Both consume a trigger label: agentic-job's
activate job removes the label, and the run does not start if removal
fails (events.md).
gh-aw has more triggers and guards: skip-if-match, search guards and
spending guards. Its work queues, which gained trusted dispatch in v0.92.0,
claim items for workers. The only time guard in agentic-job is a
stop-after deadline (events.md). Cooldowns and
per-user quotas were removed rather than shipped
(plan.md,
#466). A caller's concurrency group is not a quota.
Claims and budgets belong to agent-board, described below.
Event text written to the task file has its control characters, format
characters, ANSI escapes and line separators stripped. It is then capped and
fenced (context.rs). URLs
and mentions are left as written there. gh-aw's full sanitizer is applied
to outputs instead, by a Rust port of gh-aw's collector.
Tools available to the agent
gh-aw gives the agent a GitHub MCP server, or the gh CLI through its
proxy, and a gateway that holds the secrets of other MCP servers.
mcp-scripts and Playwright are also available.
agentic-job gives the agent the job's own read-only token as GH_TOKEN
(GitHub reads). It was chosen
over gh-aw's CLI proxy
(#112). That
proxy's startup is Docker-specific, and its command sidecar could not
safely run as the token holder. Its gateway forwards API paths, so it
cannot carry git's HTTPS reads. The
egress proxy refuses REST writes to GitHub. GraphQL POSTs pass, so GitHub's
refusal of a read-only token is what stops a mutation.
[mcp.NAME] serves one remote MCP server through a loopback proxy that
admits only an exact list of tools. The agent never holds that server's
credential (mcp.md). The reusable workflow does not accept it yet.
There are no stdio servers or Playwright.
Outputs
gh-aw's agent calls a safe-outputs MCP server, which validates each request as it is made. gh-aw has well over fifty types. Among them are Jira, Linear and Azure DevOps items, discussions, releases, workflow dispatch, code-scanning alerts and custom jobs.
In agentic-job, the agent writes JSONL to a file, and check validates it
on another machine after the run, with a port of the same pinned collector. There are
24 types: 21 actions plus noop, missing_tool and missing_data
(OUTPUT_TYPES). Each one is off
until the bounds enable it, and the bounds cap the count of each and, for
most actions, their targets (safe-outputs.md).
Additions of agentic-job's own:
- Patches are parsed strictly as git reads them, under byte and file caps. gh-aw's protected-file list is extended with paths that are always protected.
- Replacing a branch's commit series is off by default. Each commit is checked, and the push holds an exact head lease.
- A completion checkpoint decides draft or ready.
- Apply-time base and changed-path checks.
v0.92.0 ties gh-aw's apply to the validated bytes. Here, apply downloads the artifact by the ID and digest that check released.
Staged mode is gh-aw's staged mode as the apply-staged input
(trying a caller without writes).
gh-aw applies to GitHub, Jira, Linear and Azure DevOps. agentic-job applies
to GitHub with gh-aw's handlers, and posts add_comment and
create_pull_request to Forgejo with its own code
(publishing to Forgejo).
Threat detection, memory and conclusion
Threat detection. gh-aw's detection job is on by default. It asks the
workflow's engine for three flags (prompt_injection, secret_leak,
malicious_patch) and supports pre- and post-steps for scanners. In the
default warn mode, its reference says, both a detected threat and a
detection failure still let reviewable outputs apply, annotated with a warning, and a push to a
branch becomes a pull request for review. Strict mode blocks them.
agentic-job's detect job is off unless the repository variable
AGENTIC_JOB_DETECT_MODEL is set
(optional threat detection). It
sends one tool-less request through the broker, asking for the same three
flags. A flag, a malformed answer or a failed request blocks apply; there is
no warn mode. It runs after the deterministic check, which refuses private
keys and warns of other secret-shaped strings.
Memory. gh-aw has repo-memory, files kept on a Git branch and pushed
after detection, and cache-memory in the Actions cache. agentic-job checks a
handed-back memory.json against gh-aw's repo-memory defaults of 100
files and 100 KiB each, plus a 1 MiB total of its own. It does not yet
store that file or restore it for the next run, though
#119 is closed
(safe-outputs.md,
plan.md). It has no cache-memory.
Conclusion. gh-aw's conclusion job reports failures, as issues among
other ways. With notify: comment or notify: reaction (the default is
none), agentic-job's conclude job edits the run's one status comment,
or reacts, with the outcome; a missing_data run gets a comment even
without them. That covers the pull request or result link,
check's refusal reason, a stop at a limit, a secret found or the
missing_data reason. It opens no issues.
Steering. gh-aw's experimental steer: creates a steering issue for
each run. agentic-job's [session] watch-item forwards new comments on the
run's own item to the agent, and is off by default
(harness.md). An operator can also
give a run further prompts over the tailnet after its task's turn
(interactive.md). That needs an agent job
with a second user: the reusable workflow has a session input, but its
run --runner-home refuses a session.
Audit. gh aw logs and gh-aw's audit tooling read run history. The
offline agentic-job audit command reads one run's downloaded artifacts and
reports tool errors, denials, refusals and estimated cost
(auditing artifacts). Missing
evidence does not count as success. OpenTelemetry export is not implemented.
Apply credentials. gh-aw computes the union of the permissions its
output jobs need and can mint a GitHub App token. Here, apply uses the job
token or SAFE_OUTPUTS_PAT, which three output types require. Minting a
GitHub App token is not implemented
(the apply job and its token).
Across repositories: gh-cao and agent-board
gh-cao runs from one control repository. A Go gh extension handles setup,
authentication and diagnostics. Its Actions collect gh-aw run history into
SQLite snapshots and publish a dashboard to GitHub Pages. Agents can query
the evidence through gh cao query or a read-only MCP server. Campaigns
package recurring work over a set of target repositories, under gh-aw's
safe-output boundaries. A public catalog offers examples such as Repo
Assist. Its installer verifies signed build provenance.
agentic-job runs one task on one machine. Across repositories, it offers only operator dispatch of a single task, whose item may live in another repository (dispatch.md). It has no campaigns, catalog or dashboard. Its sibling agent-board takes the coordinator's role, using a Projects v2 board as its record. Its design calls for the following:
reconcile(snapshot, policy, now) -> planis a pure function.- One trusted job admits work, and records the claim before launch.
- Budgets are reserved in advance, and unknown usage holds admission.
- Each worker run goes through agentic-job.
That is a design. Its read commands work against a live board. Its README
lists what does not work yet, such as reconcile repairs that are previewed
but not applied. Where gh-cao starts by
observing runs and adds operations later, agent-board starts with
admission and has no dashboard beyond the board itself and the reports
of its CLI, such as supervise health. hive.md compares it with another
coordinator.
What to borrow
- A cross-run evidence store. Gather
agentic-job audit --jsonoutput from many runs and repositories into one queryable snapshot, as gh-cao does for gh-aw. Suggested issue: "audit: Aggregate run audits across repositories into one snapshot". - Read-only query access for a coordinator. Give agent-board's
coordinator that snapshot through a read-only tool, as
gh cao mcpdoes, instead of having it re-read job logs. Suggested issue (agent-board): "Query past run evidence read-only". - The model that answered. Since v0.92.0, gh-aw's Copilot engine
refuses a run whose configured model was silently swapped for another.
auditcould compare the model named in the inference responses with the configured one. Suggested issue: "audit: Report a run served by a model other than the configured one". - Deterministic scanners in detection. gh-aw's detection post-steps run
scanners such as TruffleHog alongside the model. A fixed, pinned scanner
in
detectwould not depend on a model's judgement. - Memory store and restore. Adopt gh-aw repo-memory's branch layout and
its compare-and-swap push so the checked
memory.jsonreaches the next run. Suggested issue: "apply: Store checked memory on a branch and restore it to the next run". - A catalog of caller examples. gh-cao's catalog shows each campaign's
scope and ceilings. The caller examples in
.github/workflows/could be listed with their bounds on the docs site.
Related gh-aw deployments
cgwalters-forge/gh-aw is an earlier fork with a host-user runtime. It is not the code agentic-job runs. bootc-dev/gh-agentic-workflows uses stock gh-aw, not this project.