Configuration
fleet.json is the declarative desired state for the fleet. It answers three
questions:
- Which workflow profiles exist?
- Which upstream source ref pins each profile?
- Which repositories receive which profiles, extras, exclusions, and overrides?
File model
Section titled “File model”gh-aw-fleet reads up to two config files from the working directory:
fleet.json: the committed base config. This repository ships a public dogfood example that tracks onlyrshade/gh-aw-fleet.fleet.local.json: a gitignored private overlay for real fleet state, private repositories, and personal overrides.
When both files exist they are merged. Local profiles, repos, and defaults add to
or override base entries. When only one file exists, that file is used directly.
The CLI prints the loaded mode on stderr, for example
(loaded fleet.json + fleet.local.json).
The loader also accepts .hujson variants before .json, so comments and
trailing commas are allowed in fleet config files. Having both
fleet.hujson and fleet.json for the same base is rejected as ambiguous.
Top-level shape
Section titled “Top-level shape”{ "version": 1, "defaults": { "engine": "copilot" }, "profiles": { "default": { "description": "Baseline every tracked repo gets.", "tier": "standard", "sources": { "github/gh-aw": { "ref": "v0.79.2" }, "githubnext/agentics": { "ref": "96b9d4c39aa22359c0b38265927eadb31dcf4e2a" } }, "workflows": [ { "name": "audit-workflows", "source": "github/gh-aw" }, { "name": "ci-doctor", "source": "githubnext/agentics" } ] } }, "repos": { "acme/widgets": { "profiles": ["default"], "engine": "copilot", "extra": [], "exclude": [], "cost_center": "platform" } }}version
Section titled “version”version is the on-disk fleet config schema version. The current value is 1.
It is independent from the JSON output envelope schema used by command output.
defaults
Section titled “defaults”defaults holds fleet-wide defaults used when a repo does not override a value.
The common field is engine, such as copilot.
profiles
Section titled “profiles”A profile is a named workflow bundle. Repos opt into profiles through their
profiles list.
Profile fields:
description: human-readable purpose and operating notes.tier: optional advisory cost tier such asminimal,standard, orpremium. The tool accepts any string and does not enforce behavior from it.sources: upstream repositories and refs used by workflows in the profile.workflows: workflow names and the source key each name resolves through.
The built-in default profile mirrors profiles/default.json. Keep those files
in sync when changing the default profile.
sources
Section titled “sources”Each source key maps to a ref:
"sources": { "github/gh-aw": { "ref": "v0.79.2" }, "githubnext/agentics": { "ref": "96b9d4c39aa22359c0b38265927eadb31dcf4e2a" }}github/gh-aw production pins must use tagged releases, not main. The
githubnext/agentics library may pin to main or to a commit until the library
tags releases, but a commit SHA is more repeatable.
Path conventions differ by source:
githubnext/agenticsuses workflow names under its implicitworkflows/directory.github/gh-awuses.github/workflows/<name>.md.
gh-aw-fleet owns that resolution and passes the final spec to gh aw add.
workflows
Section titled “workflows”Each workflow entry names a workflow and the source key that provides it:
{ "name": "daily-malicious-code-scan", "source": "githubnext/agentics" }Bumping one source ref in a profile re-pins every workflow in that profile from that source.
Repo keys are owner/name strings.
Repo fields:
profiles: required list of profile names to apply.engine: optional per-repo engine override.compile_strict: optional boolean override forgh aw compile --strict.extra: optional workflows outside any profile.exclude: optional workflow names to omit from the resolved profile set.overrides: optional map of workflow name to a custom path, for when the upstream path does not match the source’s convention.cost_center: optional free-form billing tag used bygh-aw-fleet consumption --by cost-center.
extra can reference local workflows or upstream sources. Local extras point at
workflow markdown already present in the target repository.
Compile-strict resolution
Section titled “Compile-strict resolution”deploy and upgrade run gh aw compile --strict on the clone after gh aw add / gh aw upgrade, before staging changes. The compile_strict field
controls whether that strict compile runs, resolved in this order:
- Explicit override — a
compile_strictvalue infleet.json/fleet.local.jsonwins; the visibility lookup is skipped. - Auto-detect from visibility — when
compile_strictis absent, the tool reads the repo’svisibilityviagh api /repos/<owner>/<repo>.publicturns strict on;private,internal, or anything else turns it off. - Fail-secure — if the visibility lookup fails (HTTP error, network failure,
malformed JSON), the resolver defaults to strict on and logs one
warnline.
The --output json envelope for deploy and upgrade reports the outcome in
three fields:
compile_strict_applied(bool) — true only when the strict compile ran and exited0this invocation; always false in dry-run.compile_strict_effective(bool) — the resolver’s verdict regardless of whether compile ran (the “would apply on--apply” signal in dry-run).compile_strict_source(string) —explicit,auto-public,auto-private,auto-fallback, or"".
This is separate from the per-invocation --strict security gate (see
Reconcile workflow): compile-strict validates the generated
GitHub Actions YAML, while the security gate blocks on scanner findings.
Overlay granularity
Section titled “Overlay granularity”Merging is per profile or repo entry, not per field. If fleet.local.json
redefines profiles.default, that local object replaces the base
profiles.default object wholesale. Include optional fields like tier in the
local copy if you still want them after the overlay.