CLI verb surface
Common work path
fairway work is progressive disclosure over the existing task, session,
checkpoint, evidence, and review records. It is not a second workflow or store.
work start requires an explicit task ID. In one SQLite transaction it moves a
todo task to in_progress, attaches or refreshes a stable provider session,
and records an active checkpoint. Repeating the command for the same active
owner/session is safe. Blocked and terminal tasks fail closed; they require the
existing explicit status/reopen commands and their reasons or gates.
When --summary is supplied, Fairway retains the text and appends the stable
session identifier if needed so provider lifecycle reconciliation remains
deterministic.
work status gives the compact current task state and durable fact counts.
Without a task ID it uses only unambiguous existing task/session environment
inference. Human output leads with the deterministic current action, suggested
command, blocker, and boundary state. --explain adds durable counts, names the
underlying records, and gives the detailed inspection command. JSON includes
both recommendation and audit fields. Neither command records evidence, synthesizes reviews, or authorizes
merge, deploy, release, credentials, public exposure, or live operations.
Recommendations fail closed for ambiguous task state, missing or multiple active-session attachments, and target-scoped reconciliation findings. Required review domains become a current blocker only after validation evidence exists; before that, the current action remains verification rather than a misleading missing-review alarm. Advisory profiles remain advisory.
work verify records one bounded validation evidence row. It accepts a command
or check summary, result, optional duration, bounded notes, and an artifact
reference. It does not execute commands and has no raw-output input; command
output remains in the referenced artifact or CI system. Command summaries are
limited to 1024 bytes and notes to 4096 bytes so the common path cannot become
a transcript or log store.
Before recording the row, work verify compares current dirty and branch-diff
paths with task source_paths/target_paths and scope_added paths from
independently accepted current decisions. Text/JSON classify each path as
declared, accepted_decision, or unexplained and name its coarse ownership
domain. The evidence row stores bounded deterministic counts and unexplained
path names for later precision/false-positive measurement. This is advisory for
reversible work after the FW-295 pilot; it does not synthesize a rationale or
block closeout. Existing consequential review, security, live, deploy, release,
credential, public-exposure, migration, and irreversible gates remain blocking.
work close evaluates the existing merge-ready policy, terminal evidence and
handoff gates, and target-scoped active reconciliation findings before changing
state. The expected status_decision_required finding for the task being
closed is resolved by the command itself; every other finding remains a
blocker. When all gates pass, Fairway marks the task done with the current
commit and ends the unique attached provider session in one transaction. When
any gate fails, neither record changes and the command reports exact blockers.
It never synthesizes reviews or grants merge, deploy, release, credential,
public-exposure, or live-operation authority.
Material implementation choices use the task decision model documented in
task-decision-memory.md. Use decision record for
a concise doer-drafted explanation and decision assess for an independent
quality assessment. Task detail, work status, and context packets project the
same current and superseded rows. Do not store raw prompts, chain-of-thought,
transcripts, or tool bodies as a substitute for a decision.
decision record appends a structured task decision in draft quality state.
It requires a trigger, credible alternative, chosen option, concrete reason,
risk, validation reference, and supporting fact reference. --supersedes
links a replacement while preserving the earlier row as superseded history.
The canonical validator rejects raw-prompt, transcript, tool-body,
generated-content, credential, token, secret, and consequential-authority
markers.
decision assess appends an independent accepted or insufficient quality
assessment. The task owner or claimant cannot assess their own decision.
Acceptance means only that the explanation is concrete and consistent with the
diff and cited facts. It does not approve the task or grant merge, deploy,
credential, release, public-exposure, or live-operation authority. High-risk
and consequential task metadata reports that independent acceptance is
required; reversible work keeps draft/insufficient findings advisory during the
pilot.
fairway init [--refresh-agent-contract] # scaffold .fairway/config.toml + DB + .fairway/AGENTS.md
fairway agent-guide [--path | --output <path>] # print or write the embedded offline agent guide
fairway ready [--in <epic-id>] [--priority <n>] # list tasks ready for the caller's role (sorted by priority, sequence, created_at)
fairway claim <task-id> # transition todo → in_progress, assign owner
fairway claim --in <epic-id> # claim next ready descendant within an epic
fairway add <task-id> --title <t> [--kind <k>] [--parent <id>] [--priority <n>] [--sequence <n>] [--role <r>] [--acceptance <text>]... [--profile <p>] [--owning-domain <d>] [--owning-layer <l>] [--source-paths <csv>]... [--target-paths <csv>]... [--review-domains <csv>]... [--risk-level <r>] [--migration-type <t>]
fairway spawn --id <task-id> --title <t> [--kind <k>] [--child | --sibling | --parent <id> | --root] [--from-task <id>] [--priority <n>] [--force] [--acceptance <text>]... [--profile <p>] [--owning-domain <d>] [--owning-layer <l>] [--source-paths <csv>]... [--target-paths <csv>]... [--review-domains <csv>]... [--risk-level <r>] [--migration-type <t>]
fairway update <task-id> [--title <t>] [--notes <text>] [--kind <k>] [--parent <id>] [--priority <n>] [--sequence <n>] [--dependencies <a,b,c>] [--acceptance <text>]... [--profile <p>] [--owning-domain <d>] [--owning-layer <l>] [--source-paths <csv>]... [--target-paths <csv>]... [--review-domains <csv>]... [--risk-level <r>] [--migration-type <t>]
fairway tree <task-id> [--depth <n>] # print descendant tree
fairway list [--status <state[,state]>]... [--role <role>] [--ready] # list tasks by status with dependency readiness summary
fairway set-status <task-id> <state> [--reason <text>] [--commit <sha>] [--reopen]
fairway record evidence <task-id> --command-text <text> --result <pass|fail|partial|skipped|blocked> [--artifact <path>] [--artifact-type <type>] [--duration-seconds <n>] [--notes <text>]
fairway record outcome <task-id> --kind <incident|rollback|reopen|corrective|superseding_task> [--occurred-at <rfc3339>] [--source-ref <ref>] [--related-task <task-id>] [--transition-id <id>] [--notes <bounded-context>]
fairway record guard-report <task-id> --guard <name> [--mode <report_only|warning|blocking>] [--finding <text>]... [--false-positive <text>]... [--allowed-debt <text>]... [--graduation-criteria <text>] [--artifact <path>] [--result <result>]
fairway record handoff <task-id> --to <role> --payload <text-or-@file>
fairway record completion-handback <task-id> --to <role> --next-action <text> [--completion-state <state>] [--evidence <path>]... [--approval-boundary <text>] [--provider <name>] [--target <thread-or-adapter>] [--state <handoff_recorded|notification_delivered|thread_steered|notification_failed>] [--reason <text>]
fairway record completion-handback-supersede <task-id> --handoff-id <id> --reason <text> [--replacement-handoff-id <id>] [--evidence <path>]
fairway record review <task-id> --reviewer <role-or-user> [--domain <review-domain>] --verdict <approve|changes|reject> [--reason <text>] [--commit <sha>]
fairway record usage <task-id> --provider <name> [--session-id <id>] [--external-session-id <id>] [--role <role>] [--phase <phase>] [--source <provider_reported|derived_snapshot|manual|unknown>] [--confidence <exact|estimated|unknown>] [--input-tokens <n>] [--cached-input-tokens <n>] [--output-tokens <n>] [--total-tokens <n>]
fairway route review <task-id> [--reviewer <role>] [--path <path>]... [--reason <text>] # mark pending review
fairway route review-preflight [--task <task-id>] # explain review-domain routing coverage before waits are created
fairway merge-ready <task-id> [--base <ref>] # verify evidence/review/handoff/git/profile gates
fairway review checkout <task-id> [--source-role <role>] # create/reset named review branch
fairway review-waits list [--blocking] [--task <task-id>] [--stale] # read-only review wait projection
fairway review-waits wake [--task <task-id>] [--send] # fixed-template wake prompts for parked provider threads
fairway review-policy report [--profile <name>] # review profile overhead/outcome report
fairway work start <task-id> [--session-id <id>] [--role <role>] [--provider <name>] [--backend <name>] [--external-run-id <id>] [--summary <text>]
fairway work status [<task-id>] [--explain]
fairway work verify <task-id> --command-text <summary> --result <pass|fail|partial|skipped|blocked> [--artifact <reference>] [--artifact-type <type>] [--duration-seconds <n>] [--notes <bounded-summary>]
fairway work close <task-id> [--session-id <id>] [--base <ref>] [--reason <text>]
fairway decision record <task-id> --decision <text> --trigger <text> --alternative <text>... --chosen <text> --reason <text> [--scope-added <path-or-domain>]... --risk <text> --validation <ref>... --fact-ref <ref>... [--supersedes <id>]
fairway decision assess <task-id> --decision-id <id> --quality <accepted|insufficient> --reviewer <identity> --reason <text>
fairway decision list <task-id>
fairway session upsert --role <role> [--id <id>] [--lane <lane>] [--backend <name>] [--provider <name>] [--task-id <id>] [--pid <pid>] [--monitor-kind <kind>] [--automation-id <id>] [--external-run-id <id>] [--poll-command <cmd>] [--manual-until <date-or-rfc3339>]
fairway session status [--all]
fairway session end <session-id> [--status <ended|failed|stale>] [--reason <text>] [--exit-code <n>]
fairway session reconcile [--dry-run]
fairway lane start --role <role> [--session-id <id>] [--task-id <id>] [--backend <local|shell|tmux>] [--pid <pid>] [--tmux-pane <pane>] [--transcript <path>]
fairway lane status [--session-id <id>] [--all]
fairway lane logs --session-id <id> [--tail <n>]
fairway lane stop --session-id <id> [--status <ended|failed|stale>] [--reason <text>] [--exit-code <n>]
fairway reconcile active [--dry-run] # report stale/unattended active work across sessions, tasks, evidence, and checkpoints
fairway session launch --role <role> [--backend <shell|tmux|zellij>] [--provider <name>] [--task-id <id>] [--prompt-file <path>|--prompt <text>] [--transcript <path>] [--command <provider-command>] [--dry-run] # adapter; optional
fairway worktree setup | status | prune [--force]
fairway task-detail <task-id> # includes missing required review domains before merge-ready
fairway status-report | health-report | timing-report
fairway completion-handback-report [--include-closed] [--format human|markdown]
fairway coordinator plan [--ready-limit <n>] [--recommendation-limit <n>] [--allow-utility-monitor] # deterministic dry-run next-action plan
fairway coordinator tick [--completion-handback-wake] [--task <task-id>] [--send] # daily plan plus optional stale completion-handback wake prompts
fairway usage report [--by <provider|task|epic|role|day|kind|phase|model>] [--task-id <id>] [--since-duration <duration>]
fairway usage cost-report [--by <provider|task|epic|role|day|kind|phase|model>] [--task-id <id>] [--since-duration <duration>] [--forecast-days <n>] [--format human|markdown]
fairway delivery report --since <duration> [--profile <name>] [--format text|json] # read-only delivery velocity and process overhead report
fairway delivery resources [--type <type>] [--project <project>] [--stale] [--format text|json] # read-only typed delivery resource projection
fairway automation candidates --since <duration> [--threshold <n>] [--format text|json] # read-only repeated-work automation candidate report
fairway batch create <batch-id> --title <t> [--task <id>]... [--branch <b>] [--worktree <path>] [--validation-command <cmd>]... [--review-domain <domain>]... [--rollback-criteria <text>] [--split-criteria <text>] [--expected-ci <text>] [--deploy-run-id <id>] [--pipeline-id <id>]
fairway batch add <batch-id> <task-id>...
fairway batch remove <batch-id> <task-id>...
fairway batch evidence <batch-id> --command-text <cmd> --result <pass|fail|partial|skipped|blocked> [--artifact <path>] [--artifact-type <type>] [--notes <text>] [--map-to-tasks=false]
fairway batch link <batch-id> [--deploy-run-id <id>] [--pipeline-id <id>]
fairway batch show <batch-id>
fairway batch list
fairway dispatch-plan [--role <role>] [--limit <n>]
fairway git-check [--base <ref>]
fairway preflight [--role <role>] [--base <ref>] # validate current worktree before ready/claim
fairway doctor [--dashboard-read-only <addr>] [--dashboard-full <addr>] [--format text|json] # read-only local capability and runtime-network diagnostics
fairway workflow check [--mode <task|close|deploy>] [--task-id <id>] [--require-clean] [--require-pushed] # guard task/review/deploy workflow boundaries
fairway workflow closeout <task-id> [--dry-run] [--apply] [--preserve-branch-reason <reason>] # report lane branch/worktree/session closeout debt
fairway audit work-coverage [--since-ref <ref> | --since-duration <duration>] [--task-id <id>] [--dry-run] # advisory commit/task coverage, configured exclusions, structured outcomes, and 7/14/30-day post-promotion file-touch facts
fairway audit ci-learning [--task-id <id>] [--template] # classify failed CI/deploy/smoke/UAT evidence and follow-up coverage
fairway audit notifications [--task <task-id>] [--all] # read-only provider notification lifecycle audit across waits and handbacks
fairway audit docs-backlog [--doc <path>]... # advisory coordination docs-to-backlog coverage audit
fairway audit export --out <dir> --policy <id> --source-version <version> --trusted-time-source <source> --trusted-time-evidence <path> --retention-policy <id> --legal-hold <none|active> --external-target <ref> --signing-key-env <name> (--genesis | --previous <dir> --previous-trusted-public-key-env <name>)
fairway audit verify --dir <path> --trusted-public-key-env <name> [--previous <dir> --previous-trusted-public-key-env <name>] [--format text|json]
fairway advisory adapters [--include-disabled] # read-only configured advisory provider adapter list
fairway advisory validate <task-id> --action <action> --target-role <role> --confidence <0..1> --rationale <text> --cited-fact <fact>... [--provider <adapter>] [--requires-human] [--risk-flag <flag>]... [--record-evidence]
fairway notify notifiers [--include-disabled] # read-only configured external notifier list
fairway notify dry-run --notifier <name> --task <task-id> --domain <domain> [--template <name>] [--target <target>] [--record-intent]
fairway notify send --notifier <name> --task <task-id> --domain <domain> [--template <name>] [--target <label>]
fairway release verify --version <vX.Y.Z> --tag <vX.Y.Z> --ci-status <status> --docs-status <status> --signing-status <status> --notary-status <status> --release-state <public|draft> --asset <url=status> --homebrew-version <vX.Y.Z> --homebrew-tap-commit <sha> --brew-fetch-status <status>
fairway release rehearsal create --dir <path> --version <vX.Y.Z> --source-sha <sha> --builder-id <id> --policy-version <id> [--created-at <RFC3339>]
fairway release rehearsal verify --dir <path> --version <vX.Y.Z> --source-sha <sha> --builder-id <id> --policy-version <id>
fairway release rehearsal extract-assurance --dir <path> --version <vX.Y.Z> --out <path>
fairway release assurance export --out <dir> --version <vX.Y.Z> --source-sha <sha> --builder-id <id> --policy-version <id> --signing-key-env <name> --artifact <name=path>... --evidence <class=path>... [measured SLSA flags]
fairway release assurance verify --dir <path> --trusted-public-key-env <name> --expected-version <vX.Y.Z> --expected-source-sha <sha> --expected-builder-id <id> --expected-policy-version <id> [--format text|json]
fairway release offline export --out <dir> --current-assurance-dir <dir> --rollback-assurance-dir <dir> --trusted-public-key-env <name> --signing-key-env <name> --asset <class:name=path>... --current-version <version> --current-source-sha <sha> --current-builder-id <id> --current-policy-version <id> --rollback-version <version> --rollback-source-sha <sha> --rollback-builder-id <id> --rollback-policy-version <id> [--created-at <RFC3339>]
fairway release offline verify --dir <path> --trusted-public-key-env <name> --current-version <version> --current-source-sha <sha> --current-builder-id <id> --current-policy-version <id> --rollback-version <version> --rollback-source-sha <sha> --rollback-builder-id <id> --rollback-policy-version <id> [--format text|json]
fairway coordinator preflight | status | tick
fairway readiness report [--profile <name>] [--gap-limit <n>]
fairway readiness capabilities # compare binary/schema/features and runtime-network dependencies
fairway readiness crypto [--format text|json] # fail-closed sovereign cryptography/key evidence report
fairway readiness deployment --baseline <yaml> --observation <yaml> [--format text|json]
fairway adoption artifact [--catalog <path>] [--route <path>]... [--limit <n>] [--gap-limit <n>]
fairway parity artifact [--catalog <path>] [--route <path>]... [--limit <n>] [--gap-limit <n>]
fairway packet context <task-id> --goal <text> --owner <role> --acceptance <text>
fairway packet bugfix <task-id> --bug-summary <text> --root-cause <text> [--owning-layer <text>] --proof-command <cmd> --regression-coverage <text> [--residual-risk <text>]
fairway packet retry <task-id> --kind <preflight|live-operation> --source-sha <sha> --operator-surface <surface> --artifact-dir <path> --evidence-contract <text>... --allowed-action <text>... --forbidden-action <text>... --expires-at <time-or-window> --prior-failure-closure <text> [--next-action <text>]
fairway packet watcher <watch-id> --owner <role-or-lane> --process <text> --command <cmd> --success <text> --failure <text>
fairway packet release-run <task-id> --version <vX.Y.Z> --tag <vX.Y.Z> --source-sha <sha> --release-notes <path-or-status> --changelog-state <text> --ci-status <status> --docs-status <status> --signing-status <status> --notary-status <status> --release-url <url> --homebrew-tap-commit <sha> [--verification-command <cmd>]...
fairway packet template <name> <task-id> --field <key=value>... [--instantiate-waits] [--child-task <id=field>]...
fairway packet rules <task-id>
fairway packet architecture-map <task-id> --scope <text> --current-owner <role> --target-owner <role> --migration-risk <text> [--source-doc <path>]... --acceptance <text>
fairway packet boundary-guard <task-id> --guard-intent <text> [--finding <text>]... [--false-positive <text>]... --graduation-criteria <text> [--proof-command <cmd>]...
fairway packet vertical-slice <task-id> --target-seam <text> --old-path <path> --new-path <path> --adapter <text> [--proof-command <cmd>]... --rollback-plan <text>
fairway regression-pack list [--catalog <path>]
fairway regression-pack show <pack-id> [--catalog <path>]
fairway regression-pack validate [<catalog-path>]
fairway recipe extract --task <task-id> --name <name> [--output <path>] [--input <text>]... [--forbidden-action <text>]... [--closeout-rule <text>]...
fairway recipe render --recipe <path> --task <task-id> [--field <key=value>]... [--format markdown|json]
fairway recipe list [--dir <path>] [--format text|json]
fairway contract agent-output [--schema <schema-or-name>] [--format text|json]
fairway watcher start <watch-id> --task <task-id> [--owner <role-or-lane>] [--process <text>] [--command <cmd>] [--success <text>] [--failure <text>]
fairway watcher finish <watch-id> --result <pass|fail|blocked> [--artifact <path-or-url>] [--duration-seconds <n>] [--notes <text>]
fairway watcher status [--include-done]
fairway rules validate <rule-pack-dir> # validate local rule-pack metadata and report groups/findings
fairway rules evidence-types # list evidence types from loaded packs, profile gates, and recorded evidence
fairway rules match <task-id> # show selected, disabled, and non-applicable rules for a task
fairway checkpoint record <task-id> --summary <text> [--state <state>] [--owner <role-or-lane>] [--target-close-by <date>] [--artifact <path>]
fairway checkpoint status [--all]
fairway checkpoint stale [--before <date>] [--all]
fairway memory show [--track <track-id>]
fairway memory update --track <track-id> --owner <role-or-user> --review-by <YYYY-MM-DD|RFC3339> [--title <text>] [--purpose <text>] [--operating-mode <text>] [--active-scope <text>] [--current-objective <text>] [--decision <text>]... [--blocker <text>]... [--open-question <text>]... [--next-action <text>]... [--source-checkpoint-id <id>]... [--source-evidence-id <id>]... [--source-review-id <id>]...
fairway memory append --track <track-id> [fields]
fairway memory packet --track <track-id> [--for <provider-or-surface>]
fairway memory stale [--older-than <duration>]
fairway memory reconcile [--older-than <duration>]
fairway memory disposition --track <track-id> --state <active|promote|archived|superseded> --reason <text> [--promotion-target <path>] [--canonical-commit <sha>] [--superseded-by <track-id>]
fairway memory history --track <track-id>
fairway wait add --task <task-id> --track <track-id> --on <condition> [--kind <kind>] [--target <target>] [--deadline <time>] [--deadline-source <origin>] [--action <action>] [--reason <text>] [--suggested-command <cmd>]
fairway wait ack <wait-id> [--reason <text>] [--actor <role-or-track>]
fairway wait list [--task <task-id>] [--stale] [--kind <kind>] [--all]
fairway wait tick [--task <task-id>] [--stale] [--kind <kind>] [--all]
fairway wait resolve --task <task-id> --reason <text> [--kind <kind>] [--actor <role-or-track>] [--apply]
fairway wait wake [--task <task-id>] [--kind <kind>] [--send]
fairway live-window record <task-id> --phase <phase> [--next-owner <role>] [--next-action <action>] [--authorization-state <state>] [--prompt <text>] [--command <cmd>] [--missed-deadline-action <action>] [--target-close-by <date>] [--artifact <path>]
fairway live-window status [--task <task-id>]
fairway live-window control-room [--task <task-id>] [--stale]
fairway live-window retry-budget record <task-id> --meaningful-failures <n> --coordination-failures <n> --budget <n> [--reset-task <task-id>] [--reset-reason <text>]
fairway live-window retry-budget status [--task <task-id>]
fairway prune-stale # remove state rows for deleted task definitions
fairway db backup | export
fairway db migrate [--dry-run]
fairway db compat --backend postgres [--print-ddl | --apply-ddl]
fairway db rehearsal --backend postgres [--out <dir>] [--apply-dsn-env <env>] [--postgres-schema <schema>]
fairway import <yaml-or-json-path> [--state-once] # accepts a task list or {tasks: [...]} envelope; state-once seeds legacy status once
fairway config validate
fairway dashboard [--no-open] [--listen <addr>] [--multi] # foreground server
fairway dashboard start [--listen <addr>] [--multi] [--open] [--pid-file <path>] [--log-file <path>]
fairway dashboard stop [--pid-file <path>] [--log-file <path>]
fairway dashboard restart [--listen <addr>] [--multi] [--open] [--pid-file <path>] [--log-file <path>]
fairway dashboard status [--listen <addr>] [--multi] [--pid-file <path>] [--log-file <path>]
fairway server --read-only [--listen <addr>] # shared-team read-only API skeleton
fairway server --mode api-write-pilot --write # guarded shared-team write API pilot
fairway binary install --source <local-binary> [--cache-dir <path>] # verified user-cache install/upgrade
fairway binary status|rollback|cleanup [--cache-dir <path>] # exact managed binary lifecycle readback
fairway tui [--once] # interactive ready/claim/status/detail/status-update/evidence/readiness loop
fairway tracker providers
fairway tracker configure <plane|jira|linear> [--url <url>] [--workspace <slug>] [--project <id-or-slug>] [--team <key>] [--dry-run]
fairway tracker import <plane|jira|linear> [--query <filter>] [--parent <task-id>] [--dry-run]
fairway tracker link <task-id> --provider <plane|jira|linear> --external-id <id> [--url <url>]
fairway tracker links
fairway tracker export-status <task-id> [--provider <plane|jira|linear>] [--external-id <id>] [--dry-run]
fairway tracker resolve --provider <plane|jira|linear> [--external-id <id>] [--url <url>]
fairway tracker reconcile [--dry-run]
fairway tracker plane export [--task-id <task-id>] [--limit <n>]
fairway tracker plane import --fixture examples/tracker-adapters/plane/evaluation-workspace.yaml
fairway tracker plane comment --task-id <task-id> [--external-id <plane-issue-id>]
fairway register [--name <n>] # add current project to ~/.fairway/registry.toml
fairway unregister [<name>] # remove from registry
fairway projects # list registered projects
fairway version
fairway help, fairway -h, and fairway --help print a grouped command
summary by workflow area. fairway <command> --help exits successfully with
concise command usage for top-level commands, including file-taking commands
such as fairway import --help; longer examples live in fairway agent-guide
and the docs.
Granularity guardrail
fairway spawn --child prints a warning when invoked from a leaf-kind task (kind in {task, bug, spike}):
Warning: T-042 is a leaf task (kind=task). Children of leaf tasks usually
indicate execution sub-steps, which belong in your own notes rather than
fairway. If T-099 is genuinely new work the orchestrator should see,
prefer --sibling. To suppress this warning, pass --child --force.
The warning is informational, not blocking. See hierarchy.md for the granularity principle.
Conventions
- Task IDs are positional; never flagged.
- Default task IDs match
^[A-Z]+-[0-9]+$; v1 does not auto-generate IDs. --payload @path/to/filereads the file; otherwise the value is treated as inline text.- All commands respect
--db <path>and--config <path>overrides. - Commands exit non-zero on validation failure. Pass
--jsonfor machine-readable error output. - Grouped commands accept
help,-h, and--helpafter the group name, for examplefairway session --helporfairway dashboard help. - Do not infer noun-style subcommands that are not in the command summary.
Fairway currently keeps core task operations as top-level verbs such as
add,spawn,update,tree,ready, andtask-detail; there is no groupedtaskcommand. Dependency metadata is set withfairway update <task-id> --dependencies <a,b,c>and inspected throughfairway task-detail <task-id>,fairway tree, or readiness output. Watcher rows are inspected withfairway watcher status [--include-done]; there is nofairway watcher listcommand. fairway readyprints claimable ready tasks. If no ready tasks are claimable but todo tasks remain in the filtered scope, it prints a blocker summary by dependency-blocked, review-gated, approval-gated, profile-gated, session-gated, or unknown category with a suggested inspection command.fairway --json readyreturns a report object withtasks,claimable_count,non_ready_todo_count, andblocker_categories.- The caller's role is determined by (in order):
--as <role>flag,FAIRWAY_ROLEenv var, current worktree's configured role, prompt if ambiguous. - Evidence records are command-oriented.
artifactis optional so "no-op" checks, skipped checks, and blocked checks can still leave an auditable row. --state-onceis for legacy migration only. Subsequent imports update task definitions but never overwrite DB-owned execution state.- Task metadata flags (
--profile,--owning-domain,--source-paths,--tag, etc.) are stored on task definitions and also supported by YAML/JSON imports.--acceptance,--source-paths,--target-paths,--review-domains, and--tagare repeatable. List flags may also contain comma-separated values; repeated list flags are flattened in the order supplied and rendered as task metadata intask-detail. Tags are generic grouping metadata and may be simple strings such asproduction-readinessor key:value strings such asenvironment:cloudflare. session launchis an adapter command. The queue/session model works even when agents are launched manually. The shell-backed path can feed a prompt file into a provider command, record a transcript path, and upsert a session without claiming the task. Prompt and transcript paths are relative to the launch worktree unless absolute. Use--dry-runto inspect the command, prompt file, transcript, and session metadata without mutation.session reconcilehandles session-local cleanup such as missing PID/tmux panes and stale sessions attached to terminal tasks.reconcile activeis broader: it reports unattendedin_progresstasks, evidence without a status decision, stale checkpoints, parent tasks left active without direct rollup work, and monitor sessions without backing automation/process/external-run proof or a fresh bounded manual checkpoint. It also reportsmonitor_completion_resume_neededwhen monitors are complete, no active sessions/watchers remain, and ready work is waiting for the coordinator loop. Provider sessions attached to tasks must also have a matching lifecycle checkpoint:activefor started/running,awaiting_inputfor waiting, failed, stale, or no-progress, anddonefor completed.lane start|status|logs|stopis a bounded lifecycle surface for local or tmux provider/helper lanes.lane startupserts an existing session record and records anactivecheckpoint when--task-idis supplied; it does not launch a provider, send a prompt, claim review authority, or mutate project state beyond session/checkpoint facts.lane statusprojects process/pane readback such asrunning,missing_process,missing_tmux_pane,unsupported_remote, or terminal session state.lane logsreads a local transcript path from the session, requires the file to stay under the session worktree after symlink resolution, redacts common credential markers before display, and does not store log content.lane stoprecords session closeout and adonecheckpoint; it does not kill remote runtimes. Unknown remote backends fail closed until a later reviewed runtime adapter defines their trust boundary.reconcile activepermits bounded active evidence capture for approved live operations only while the task has a running session and a freshactivecheckpoint with--target-close-bystill open. This allows gate/runtime evidence during an operation window without treating it as abandoned work. It does not close the task: once the window expires, or if the session, checkpoint, or closeout marker is missing, evidence recorded after activation again reportsstatus_decision_requireduntil the operator sets the task todone,blocked,todo, or another configured closeout state.live-window recordis a typed checkpoint helper for repeated exact-window live-operation loops. It records compatibility phases such aspacket-prepared,reviews-routed,approvals-readback,gate-authorized,gate-running,closeout, andnext-decision, plus control-room phasespacket_ready,approvals_ready,execution_authorized,operator_running,closeout_required,done, andblocked. Rows can include the next owner, next action, authorization state, exact prompt or command, missed-deadline action, deadline, and artifact path. The command writes a normaltask_checkpointsrow; there is no second wait or phase store.live-window status,live-window control-room, andcoordinator planproject the latest phase so the control thread can see where the loop is parked without polling provider chat.control-room --stalefilters to missed-deadline handoffs such as approved-but-not-executed windows. This is intentionally a token-burn reduction surface: Fairway holds routine scheduling and handoff state so LLM/provider turns can focus on judgment, implementation, review, and exception handling. The canonical design model isdocs/design/live-operation-control-room.md.live-window retry-budget record|statusrecords the current bounded rerun state as a normal checkpoint. Meaningful live-operation failures count against the budget; coordination-only failures are visible but do not exhaust the product retry budget. Once meaningful failures reach the budget,packet retryfails closed until an existing Fairway causal reset task and reset reason are recorded. This does not authorize another live window; it only makes the retry/reset decision explicit.route review-preflightis a read-only project coverage check over review domains used by non-terminal tasks. It explains whether each domain resolves through an explicit provider target,[review_domain_aliases], an exact configured role, or a review route, lists the affected task ids, and fails withaction=configure_review_mappingfor missing coverage. It creates no review, wait, notification, provider delivery, or workflow state.coordinator preflightincludes the same coverage rows while retaining its task-levelmapping_requiredfailures for active review waits.review-policy reportsummarizes configured and built-in review-profile pilots and blocking policies. Built-in defaults distinguish reversible evidence-led work from irreversible, live, and release boundaries, and exposeprototype-firstfor uncertain reversible product/UX work. Prototype-first tasks should recordprototype-artifact,owner-usage-proof,prototype-gap-list, andstabilization-decisionevidence before stabilization or boundary exit. The report compares review overhead with Fairway outcome signals such as defects caught, rework-reduction signals, blocked tasks, completed tasks, and avoided unsafe actions. Advisory profiles with overhead but no useful outcomes should be narrowed or removed rather than promoted to blocking defaults. It also reports loop-detected causal-reset recommendations when repeated meaningful failures, same-layer fixes, or approvals without end-to-end flow progress show that another retry needs a failure chain, real unknowns, proof-before-retry, and a lighter safe-boundary review plan.record evidencetreatsartifact_typevaluesscreenshot,video,browser-trace, anduatas UX media evidence.task-detailreports aux media evidencesummary so operators can see whether user-visible work was actually exercised. These rows are references to redacted artifacts only: do not store raw secrets, auth tokens, provider-private transcripts, arbitrary prompt bodies, or unredacted user data in Fairway evidence.memory show|update|append|packet|staleprovides first-class track memory for coordinator and provider resume packets. Track memory stores curated operating summaries, blockers, decisions, next actions, and numeric Fairway source fact references. It does not store raw chat transcripts, prompt bodies, generated content, provider credentials, cookies, tokens, or private provider database state.memory packetrenders a compact packet from the memory row plus current Fairway tasks, sessions, and checkpoints so new provider attachments can resume without polling chat.- New active memory requires an accountable owner, a review date, and at least
one existing checkpoint, evidence, or review source fact. Legacy rows remain
readable and appear as findings instead of being rewritten silently.
memory reconcileis read-only and previews refresh, promote, archive, or supersede commands for stale or incomplete lifecycle state, conflicting source facts, and promotion debt.memory dispositionappends an auditable transition;memory historyexposes those immutable events. Promotion does not make memory canonical: the target document and commit remain authoritative. - Database export and disposable shared-store rehearsal include track memory and lifecycle events. SQLite backup readback proves local recovery without silently replacing the configured database.
wait add|ack|list|tick|resolve|wakemanages generic parked-work waits while keeping Fairway as the state source of truth.wait addrecords a structured checkpoint fact for parked work such as repeated handoffs, live-window closeout, non-review actor waits, or external control-loop waits. The wait checkpoint preserves the configured deadline anddeadline_sourceso stale output explains the ack-timeout origin.wait ackrecords an acknowledgement checkpoint without deleting history.wait list|tick|wakeprojects those durable wait checkpoints together with review waits, completion handbacks, provider/session and checkpoint plan actions, live-window handoffs, monitor actions, approvals, and stale track memory. The default list/tick projection shows open work only: resolved/cancelled review waits, acknowledged manual waits, superseded completion handbacks or memory, and terminal-task waits are suppressed.--allrestores those immutable historical rows.wait tickis a dry-run/operator visibility surface.wait resolveis task-scoped and previews by default. With--apply, it may record acknowledgement checkpoints for open manual waits and supersede evidence for completion handbacks only when the task is terminal or blocked. It refuses ineligible mixed batches before writing, never deletes evidence, and does not resolve review verdicts or arbitrary coordinator-derived waits.wait wakerenders fixed-template wake prompts for stale or failed task-backed waits and, with--send, records bounded delivery ornotification_failedevidence through existing task notification rows with a stable dedupe signature. Missing provider-target mappings are visible in dry-run output astarget_action=mapping_required;--sendrecordsnotification_failedwithaction=mapping_requiredinstead of claiming delivery. These commands do not run a durable timer, execute DAG steps, approve reviews, claim tasks, mutate environments, or perform live actions. Dashboard projections remain display-only; wake delivery stays in CLI/coordinator/provider-adapter surfaces.record completion-handbackis a typed closeout helper for delegated work. It writes a normal handoff plus a linked notification row. The handoff payload records the next actor, next safe action, optional completion outcome, evidence paths, and approval boundary; the notification state records whether provider/thread delivery was accepted, failed, or only recorded in Fairway. Supported completion outcomes aredone,reviewed,merge-ready,blocked-with-follow-up,monitor-completed,live-window-closeout, andlive-window-next-decision. Pending cross-role completion handbacks block terminal closeout until delivery or failure proof is recorded and age by[coordinator].notification_ack_timeoutincoordinator plan/task detail. Alive-window closeoutornext-decisioncheckpoint with no handback is projected as a closeout-to-next-owner wait so repeated live windows do not depend on polling chat. This does not authorize approval, merge, push, deploy, wake delivery, or any dashboard mutation.record completion-handback-supersederecords immutable evidence that an older completion handback is obsolete. It keeps the original handoff, notification rows, reason, replacement handoff id, evidence path, and timestamp visible in history while excluding the old handback from active coordinator and notification-audit waits. For non-terminal tasks, the command refuses to hide an unresolved handback unless a replacement handback is named or the task already has an explicitblockedstatus decision.coordinator tick --completion-handback-wakerenders fixed stale completion-handback wake prompts from the same coordinator plan projection. With--send, it records a boundedtask_notificationsrow on thecoordinatordomain using a stable wake signature, suppresses duplicate successful wake signatures, and reports missing provider-target mappings astarget_action=mapping_required. When sent, missing mappings recordnotification_failedwithaction=mapping_requiredrather than delivery. It selects only stale handbacks/closeouts and suppresses terminal tasks; fresh waits remain visible in plan/task detail without wake delivery. The dashboard remains read-only and never calls this send path.workflow checkcomposes git and active-work checks into the operating-model guard. It warns on dirty docs/code, unpushed commits, missing upstreams, and active reconciliation findings. Use--mode deploybefore deploy/UAT work; it requires a clean committed SHA and pushed commits so CI can run. Use--mode close --task-id <id>before moving a lane to new implementation work; it includes the lane closeout report for the task. Use--require-cleanor--require-pushedwhen the current boundary should fail instead of warn. Cleanliness output separates truedirty_pathsfromallowed_local_artifacts, which are configured or evidence-referenced untracked operational artifact paths.workflow closeout <task-id>is advisory by default. It reports task status, commit association, CI/deploy/UAT evidence, review-domain completeness, active sessions/watchers, branch merge state, remote branch presence, worktree cleanliness, and explicit branch preservation reasons.--applydeletes only a verified mergedorigin/<branch>remote branch when the closeout report has no blockers. It does not delete local branches or worktrees.set-statusrecordscommit_shafor terminal CLI transitions. Pass--commit <sha>to pin an explicit task commit; otherwise Fairway records the currentHEADwhen marking a task terminal.trackercommands are provider-neutral adapter contract surfaces.configure,import,export-status,resolve, andreconcileare dry-run/advisory until a provider adapter explicitly adds an apply path. Tracker planning mirrors must not mutate Fairway execution state, sessions, evidence, reviews, or merge gates.tracker planeis the first provider-specific adapter spike. It renders Plane issue payloads, fixture import previews, and execution-summary comments from local Fairway state.--applyis intentionally rejected in the spike; Plane credentials come fromPLANE_BASE_URL,PLANE_WORKSPACE,PLANE_PROJECT, and eventuallyPLANE_API_TOKEN.audit work-coverageis advisory by default. It compares commits since a base ref or duration window against Fairway task IDs, canonical task commit links, tasksource_paths/target_paths, evidence rows, and required review domains. It pins and returns the analyzed tip. Explicit commit linkage and path ownership are separate facts, so broad path metadata cannot inflate commit coverage. Use it before review, deploy, and release boundaries to catch real work that happened outside task/evidence/review coverage.audit ci-learningandaudit failure-routingare advisory by default. They share the same deterministic read model;failure-routinguses failure-routing help text and afailure_routing_okhuman status label for operator clarity. They classify failed CI, deploy, smoke, UAT, and known coordination evidence as missed local gate, missed review gate, CI-environment-only, flaky runner/cache, approval-gated blocker, artifact contract, provider API, browser surface, setup gate, callback missing, redaction finding, commit boundary, or undelivered handoff. The report recommends scoped follow-up task prefixes/kinds, owning domain/layer, evidence artifact paths, and forbidden actions until review; it does not create tasks unless an explicit operator/configured apply path does so. Use--templateto render a learning artifact for review or release notes. Routing is lifecycle-aware: a later pass for the same normalized command or artifact route, an existing scoped follow-up task, or terminal source-task state removes the historical failure from actionable findings. The original evidence remains innon_actionable_evidencewith a deterministicrouting_state(superseded_by_pass,follow_up_exists, orsource_task_terminal) so audit history is preserved without duplicate task recommendations. Passing closeout evidence never becomes a failure finding.audit notifications [--task <id>] [--all]is a read-only lifecycle report over existing review waits, completion handbacks, generic waits, coordinator plan rows, handoffs, andtask_notifications. It reports task, source, target domain or role, provider target, handoff id, latest notification id, stale age, expected next action, mapping-required target gaps, and a fixed-template recovery command. By default it suppresses terminal, resolved, delivered, superseded, and other non-actionable acknowledgement rows, but it still shows unresolved completion handbacks when their latest linked notification isacknowledged,review_acknowledged, orreview_recordedwithout delivery proof.--allincludes the suppressed historical rows for audit. The command does not send provider messages, approve reviews, close tasks, or create a second wait store.audit docs-backlog [--doc <path>]...is a read-only coordination docs-to-backlog coverage report. It scans coordination design docs for Fairway task ids, tasksource_paths/target_pathscoverage, documented command examples, and known coordination topics such as review waits, completion handbacks, live-operation control, track memory, safe iteration, process overhead, and repeated-work automation. Findings are advisory and do not change task, review, merge-ready, or release state. Text and current JSON output useconsumer_lessons; JSON also emits the deprecatedgpuaas_lessonscompatibility key for one migration window.delivery report --since <duration> [--profile <name>] [--format text|json]is a read-only delivery velocity and process overhead report. It uses existing task transitions, evidence, reviews, handoffs, notifications, and review-wait projections to report completed tasks, blocked time, review-wait time, first-evidence-to-done time, review approvals versus changes requested, notification/wake and handoff counts, approval loops, reopen/retry count, outcome-source buckets, defect-source rows, work-batch rollups, and loop signals.outcome_sourceis the broader evidence/source classifier;defect_sourceis populated only when a review requests changes/rejects or non-pass evidence (fail,blocked, orpartial) indicates where an issue was discovered. Passing tests, preflight, deploy, or UAT proof can contribute outcome evidence without being counted as defect discovery. Teams use these metrics to identify where extra review, preflight, UAT, tests, packet templates, or automation actually reduced defects or blocked time. It is advisory by default and does not approve reviews, mutate task status, merge, deploy, or gate release.delivery resources [--type <type>] [--project <project>] [--stale] [--format text|json]projects typed delivery resources from existing tasks and evidence. Resource classes include environments, dashboards, docs portals, binaries, release artifacts, CI pipelines, preflight packets, and rehearsal targets. Rows expose owner, state, provenance, last verified commit/version when evidence includes them, required evidence, blockers, and the next safe action. The command is read-only and does not deploy, restart dashboards, publish docs, cut releases, approve reviews, merge, or perform live operations. The detailed model is in delivery-resources.md.rough-edge add --task <task-id> --owner <role> --severity <low|medium|high|critical> --decision <fix-now|defer> --summary <text> [--expires <date>] [--artifact <path>]records a rough edge found while actually using the product as structuredrough-edgeevidence on the task. It captures owner, severity, fix-now/defer decision, optional expiry, summary, and a linked artifact reference without ingesting artifact contents. Expiry accepts RFC3339Nano, RFC3339, orYYYY-MM-DD; invalid expiry input is rejected rather than silently stored as non-expiring feedback.rough-edge list [--task <task-id>] [--owner <role>] [--expired] [--format text|json]projects the owner rough-edge queue from existing evidence rows. It is read-only and does not create backlog tasks, mutate status, approve reviews, send notifications, merge, deploy, or change dashboard authority.provenance report [--task <task-id>|--since <duration>] [--format text|markdown|json]is a metadata-only supply-chain provenance export over existing Fairway task metadata, evidence refs, review refs, checkpoints, sessions, usage counts, handoffs, commit refs, and release refs. It excludes raw prompts, private transcripts, raw tool bodies, generated-content dumps, credentials, and secrets, applying bounded redaction to sensitive-looking refs before rendering.provenance prompt-packet --task <task-id> [--format markdown|json]renders a bounded task packet from the same provenance read model. It carries objective, scope, acceptance, source facts, validation gates, evidence refs, review refs, and forbidden actions, but it does not authorize execution, review approval, merge, push, deploy, release, or dashboard mutation.explain code [<repo-path>] [--line <n>] [--symbol <name>] [--commit <ref>] [--task <task-id>] [--narrative-provider <adapter>] [--format packet|markdown|json]rendersfairway.explain-code.v1, a deterministic grounded packet over committed Git metadata and existing Fairway task, contract, decision, evidence, and review references. File, line, commit, and task entry points are supported; symbol resolution currently covers committed Go functions, methods, types, constants, and variables.packetandmarkdownrender the same Markdown form. The packet labels recorded facts, conflicts, and missing provenance separately and lists only cited references as bounded machine inference inputs. It excludes source bodies, raw prompts, private transcripts, raw tool bodies, generated-content dumps, and secret-like values. It does not invent historical rationale or grant workflow authority. When--narrative-providernames an enabledlocal_ollamaadvisory adapter, Fairway sends the redacted packet in memory to its loopback endpoint and validates the returnedfairway.explain-narrative.v1JSON. Each statement must be labeledrecorded,inferred, orunknown; recorded and inferred statements require citations present in the packet. Unknown citations, privacy-rejected output, redirects, non-loopback endpoints, and oversized responses fail closed. The narrative is display-only and is never recorded as evidence, a decision, or historical provenance.recipe extract|render|listpromotes completed tasks into reusable recipe/context packets. Recipes are JSON files, normally under.fairway/recipes, that reference source facts, evidence refs, validation gates, expected evidence, forbidden actions, and closeout rules. They reject unsupported schemas, raw prompts, transcripts, tool bodies, generated-content dumps, secret-like values, unsafe privacy warnings, unsafe substitution values, and recipes without source facts.recipe rendersubstitutes task-specific fields into a bounded Markdown or JSON packet; it does not create tasks, approve, merge, deploy, release, wake providers, or mutate dashboard state.provenance manifest --path <file>... [--format text|json]builds a content-free SHA-256 manifest over selected evidence or provenance exports. It reports missing artifacts, changed hashes, and privacy-rejected path names without embedding artifact contents. It is tamper-evidence for review and release packets, not proof that a change was benign or malicious.
Assurance profiles
fairway assurance profile validate <path> [--format text|json]
fairway assurance profile diff --from <path> --to <path> [--format text|json]
fairway assurance profiles list --dir <path> [--format text|json]
fairway assurance evidence map --profile <path> --task <task-id> [--at <RFC3339>] [--format text|json]
fairway assurance readiness --profile <path> --scope <project|task_set|release> [--scope-id <id>] [--task <id>]... [--at <RFC3339>] [--format text|json]
fairway assurance package export --profile <path> --product-version <version> --scope <project|task_set|release> --out <dir> [--scope-id <id>] [--task <id>]... [--at <RFC3339>] [--signing-key-env <name>]
fairway assurance package verify --dir <path> [--trusted-public-key-env <name>] [--format text|json]
fairway assurance claims validate --path <markdown-or-text-file>... [--format text|json]
The validator accepts one local YAML or JSON
fairway.assurance-profile.v1 file and reports profile/framework identity,
control count, evidence classes, and the evidence-only authority boundary.
Unknown fields and schemas, duplicate controls, remote or symlinked files,
unsafe text, unsupported vocabularies, invalid freshness, and incomplete claim
or action guards fail closed. Validation does not evaluate controls, infer
compliance, mutate workflow, or grant certification or operational authority.
profile diff compares two valid profiles and reports stable changed paths,
compatibility classification, and whether accountable review is required. A
compatible or additive report does not approve adoption; same-version content
changes and reduced assessment or authority boundaries are breaking.
The read-only evidence map projects existing task, evidence, review, and
decision metadata into normalized references. It excludes source text and
artifact contents and preserves stale, conflicting, superseded, unreviewed,
out-of-scope, and externally asserted boundaries instead of upgrading them to
supporting evidence. --at fixes the evaluation clock for reproducible
freshness calculations and byte-stable JSON; without it, current UTC time is
used and reported as evaluated_at.
profiles list validates every YAML/JSON profile in one local, non-symlinked
directory and fails closed if any candidate profile is invalid. readiness
aggregates normalized facts across an explicit project, task-set, or release
scope and reports only satisfied_by_recorded_evidence, partial, missing,
stale, conflicting, customer_responsibility,
external_assessment_required, exception_recorded, or
not_applicable_with_rationale. Gap rows name the control, evidence class,
owner, bounded next evidence action, source references, freshness rule, and
assessor boundary. These commands never create remediation tasks or infer a
certification or compliance result.
Project scope always covers every task in the configured Fairway project and
rejects task subsets. Task-set and release scopes require a stable --scope-id
and at least one explicit --task, preventing partial evidence from being
presented as an unidentified release or project-wide result.
package export creates a new bounded directory containing digest-manifested
JSON, Markdown, and CSV control views, metadata-only evidence/reference
indexes, responsibilities, gaps, verification instructions, an explicit
non-OSCAL bridge boundary, and a deterministic OSCAL 1.1.3 component
definition. Package v2 requires the exact product/source version and records a
review date derived from the fixed creation clock. Optional Ed25519 signing reads a base64 key from the
named environment variable; key material is not accepted in argv or written to
the package. See assurance packages.
package verify operates entirely on the local package. It validates strict
schemas, manifest digests, profile/scope/source-state consistency, evidence
references and freshness, exception linkage, fixed views, claim guards, and
optional Ed25519 signatures. The report keeps integrity_ok,
control_sufficiency, signature_status, and external_certification
separate and never writes findings back into Fairway.
claims validate reads only local non-symlink Markdown or text files and
rejects positive unsupported ISO, SOC, CUI, FedRAMP, FIPS, EU CRA, EUCC,
Common Criteria, EAL, national-cloud, sovereign-cloud, regulatory, or generic
Fairway certification/compliance/authorization wording. Direct grammatical
nonclaims and explicit claim-wording prohibitions remain valid; draft/example
labels, conditional caveats, and unrelated negation do not suppress a positive
claim. The guard reports line numbers without echoing document content and does
not replace qualified legal, assessor, certification-body, or public-wording
review.
See assurance profiles.
Restricted security advisories
fairway security advisory export --advisory <json> --patch-bundle <path> --out <dir> --signing-key-env <name>
fairway security advisory verify --dir <path> --expected-id <id> --expected-patch-bundle-id <id> --expected-rollback-bundle-id <id> --trusted-public-key-env <name> [--format text|json]
fairway security advisory acknowledge --dir <path> --expected-id <id> --expected-patch-bundle-id <id> --expected-rollback-bundle-id <id> --trusted-public-key-env <name> --customer-ref <id> --status <received|deferred|rejected> --at <RFC3339> --out <json>
fairway security rehearsal run --workspace <tmpfs-dir> --out <new-retained-dir> --project <id> --at <RFC3339> [--format text|json]
export validates strict fairway.security-advisory.v1 JSON and creates a new
signed exact-inventory directory containing deterministic machine/human views
and an opaque offline patch artifact. The manifest binds advisory, patch,
rollback, and signing-key identity. Private signing material is read only from
the named environment variable.
verify is DB/config/network independent and requires a separately pinned
Ed25519 public key plus exact advisory, patch, and rollback identifiers. It rejects
unknown or duplicate JSON, symlinks, unknown files, digest/size changes,
generated-view drift, key substitution, privacy markers, and identity mismatch.
It does not verify or import the nested offline distribution; run the release
offline verifier separately.
acknowledge first repeats pinned verification and then writes a local 0600
receipt tied to the manifest, signing key, patch digest, and exact rollback
bundle. Receipt status is
received, deferred, or rejected; it does not approve, import, install,
deploy, notify, accept risk, or change task/dashboard state. See
Restricted Advisory and LTS Patch Channel.
security rehearsal run is independent of advisory packaging. It requires an
actual Linux tmpfs workspace and a retained-output path on a distinct non-tmpfs mount, creates
distinct ephemeral identity/recovery/audit Ed25519 roots, exercises the real
sovereign authorization and audit-verification paths, retains only public
keys/fingerprints and a signed bounded report, and removes private files before
success. It does not issue reusable credentials or provide key-ceremony, HSM,
FIPS, certification, approval, deployment, release, public-exposure, or live
authority. See Sovereign Customer Key Rehearsal.
automation candidates --since <duration> [--threshold <n>] [--format text|json]is a read-only repeated-work report. It detects repeated deterministic command, evidence, and notification patterns, then reports frequency, recent task ids, representative commands/artifacts, likely owner, estimated coordination cost, suggested surface, and recommended action. It does not auto-create tasks or mutate workflow.advisory adapterslists configured advisory provider adapters. It is a read-only config inspection surface; it does not invoke providers, store prompts/transcripts, wake threads, approve work, or mutate task state.advisory validatechecks a structured recommendation before it is trusted or recorded. The contract containsprovider,action,task_id,target_role,confidence,requires_human,rationale,risk_flags, and cited Fairway facts. Allowed actions areinspect_task,route_review,record_evidence,refresh_memory,render_packet,create_follow_up,wake_provider,run_preflight, andrecord_checkpoint. When--providernames a configured adapter, validation also checks adapter mode andallowed_actions. Risk flags require--requires-human; cited facts must name Fairway facts such astask:<id>,evidence:<id>,review:<id>,checkpoint:<id>,session:<id>,handoff:<id>, ornotification:<id>.--record-evidencewrites only anadvisory-recommendationevidence row; it does not approve, merge, deploy, claim, wake providers, mutate environments, or replace review/gate checks.notify notifiers,notify dry-run, andnotify sendare the external notifier surfaces.notifiersis read-only config inspection.dry-runrenders a bounded notification request from a fixed template label. With--record-intent, it writes a notification row with stateintentand template metadata only.sendrequires an explicitly configuredmode = "send"notifier and recordssentfollowed bynotification_deliveredornotification_failed. Destinations and webhook bearer tokens are read from environment variables at send time and are not stored. The command does not approve, review, merge, deploy, wake providers outside the configured adapter, or give the dashboard send or mutation authority.batchcommands model shared implementation and validation units. A batch can contain multiple granular tasks that share one branch/worktree, validation command set, review domains, CI/deploy-run, and evidence set.batch evidencemaps shared evidence back to each member task by default so tasks still close independently while pointing to the same proof. Use--map-to-tasks=falseonly for batch-level notes that do not satisfy any task acceptance check.release verifyis an advisory release-readiness guard with a non-zero exit on release issues. It consumes observed evidence from commands such asgh release view,curl,brew info, andbrew fetch; it does not call provider APIs itself. It flags draft GitHub releases with matching Homebrew casks, missing release notes/changelog entries, failed asset URL checks, missing release status, and failed Homebrew fetch verification.release verify --helpexits zero with Fairway-style usage; normal verification failures remain non-zero.coordinator tickcomposes reports and recommendations. It does not claim, merge, or mutate tasks automatically.completion-handback-reportderives idle-time metrics from existing completion handbacks, notification rows, checkpoints, task status, and[coordinator].notification_ack_timeout. It reports task/workstream closeout latency, open/stale counts, and next-decision timing for retrospective evidence. It intentionally avoids per-person productivity scoring and excludes terminal tasks unless--include-closedis passed. Use global--jsonfor structured output or--format markdownfor a report artifact.- Utility adapters such as
examples/session-adapters/utility-event.shandexamples/session-adapters/ci-monitor.share shell-level conventions over existing Fairway commands, not new core subcommands. They should record provider-neutral utility sessions, checkpoints, evidence, watcher lifecycle, and handback output without making task status, review, or merge decisions. adoption artifactis the generic readiness report. It uses configured workstream profileroute_sampleswhen no--routeflags are provided and reports named profile gates plus evidence-backed gate evaluation.parity artifactremains a compatibility alias for legacy consumer comparisons.doctorruns read-only local capability diagnostics before or during agent work. It reports config and DB path checks, git worktree state, stale.git/index.lockguidance, Go cache posture, required CLI tools, dashboard reachability, Fairway session readback, the selected runtime profile, and every configured listener, identity, provider, notifier, rule-source, proxy, tracker, and adapter network edge as structured pass/warn/fail rows. Rows include owner, suggested command, evidence path where applicable, and boundary labels such as task work, release, dashboard restart, git boundary, provider capability probes, or shared-team pilot. The command does not mutate task state, start providers, approve work, push, deploy, restart dashboards, run live operations, or expose secrets. Use--jsonor--format jsonfor agent-consumed output.merge-readyevaluates profile gates and selected rule-pack requirements for the target task. Missingblockingprofile gates or blocking rule evidence fail readiness; missingadvisoryandreport_onlygates or advisory rule evidence are reported as warnings. If task metadata declaresreview_domains,merge-readyalso requires an approved review whose reviewer matches each domain.workflow check --mode close --task-id <id>reports the same selected rule evidence gaps during lane closeout.readiness reportevaluates configured profile gates across a workstream or all profiles. Missing blocking gates make the report fail in human mode;--jsonreturns the full report for automation.readiness capabilitiesreads[consumer_readiness]and reports the invoked Fairway binary/version, optional pinned binary/version, applied and available schema versions, selected runtime profile, redacted network-dependency inventory, and every required capability, command, or feature. Unknown or unavailable requirements are named explicitly in text/JSON and return a non-zero exit status. The command does not install, upgrade, migrate, restart, or mutate consumer state.readiness cryptoevaluates the five required sovereign cryptography boundaries (in_transit,at_rest,backup,evidence_export, andsigning) from[[sovereign_crypto_boundaries]]. It requires explicit owner, custodian, key/module/algorithm metadata, approval, custody, rotation, and recovery proof. Externally validated module posture additionally requires the exact local certificate and validated-configuration evidence. Missing or unsafe evidence exits non-zero. The report states that Fairway is not FIPS 140-3 validated and grants no certification or operational authority.readiness deploymentcompares one strict local observation packet with a versioned single-host, managed-service, or container/orchestration baseline. It reports sorted blocking and advisory deviations and exits non-zero on blocking gaps. It never probes, repairs, deploys, or mutates the observed system; a ready report is engineering evidence, not certification, compliance, approval, or risk acceptance.audit exportreads the existing orderedaudit_eventsfacts and writes a new local, mode-0700 directory containing canonical metadata-only JSONL, a SHA-256 record chain, a signed manifest, and no raw audit detail. Customer Ed25519 signing material is read only from the named environment variable. Each export must declare either--genesisor a previously pinned and verified checkpoint; the latter binds database continuity and detects deletion, insertion, reordering, divergence, or rollback behind the retained checkpoint. Trusted-time, retention, legal-hold, and external WORM/SIEM target fields are signed metadata. The command does not transmit or retain the package externally.audit verifyfails closed on unknown files, unsafe paths, malformed or trailing JSON, record/file/chain/signature mismatch, an unpinned key, absent trusted-time evidence binding, or missing previous-export continuity for a non-genesis package. Key rotation is supported by pinning the current and previous export keys independently. Verification proves package integrity and continuity only; it is not certification, compliance, authorization, or proof that an external retention system stored the package.dashboardwithout a subcommand runs in the foreground. Usedashboard start,dashboard stop,dashboard restart, anddashboard statusfor a detached local dashboard. Detached lifecycle commands do not open a browser unless--openis passed. They write.fairway/dashboard.pidand.fairway/dashboard.logby default; multi-project mode uses.fairway/dashboard-multi.*.server --read-onlyruns the first shared-team API skeleton. The FW-269 surface exposes only GET JSON endpoints:/api/v1/status,/api/v1/tasks,/api/v1/tasks/<task-id>, and/api/v1/reports/summary. It reuses the local Fairway store/read models and does not add server writes, dashboard writes, review approval, provider-send, merge, deploy, release, public exposure, or live-operation authority. Write mode flags and write-capable[server]config fail closed. Until FW-270 or a later reviewed identity/proxy boundary lands,fairway server --read-onlyrejects non-loopback listen addresses such as0.0.0.0, LAN/private, Tailscale, or public interfaces. FW-270 adds a request identity and command-authorization guard for the read-only API. Supported identity modes areno_edge_local,trusted_proxy_read_only,api_token,service_account, andmtls_service_account; service-account and mTLS modes are fail-closed placeholders. The implemented command scope isread:api, authorized forvieweroradminroles only. API-token roles must be supported server roles and included in[server].allowed_roles; bearer token failures return bounded errors and do not echo submitted or configured token values. This still does not add any shared write API.server start --read-only,server status,server logs,server stop, andserver restart --read-onlyprovide the bounded local lab lifecycle for that loopback read-only API. The lifecycle writes.fairway/server-read-only.pid.jsonand.fairway/server-read-only.logby default; explicit--pid-fileand--log-filepaths are supported. Status reports the binary, version, config, DB, address, and lifecycle paths. The JSON pid record includes a non-secret per-launch identity token, and stop or restart refuses to signal a process unless its command line matches that token, binary, and read-only server shape. Stale records are removed, while occupied addresses without a matching record remainunknownand fail closed. Managed lifecycle never accepts write mode or a non-loopback listen address.server --mode api-write-pilot --writeruns the shared-team write API pilot when[server]is configured forapi-write-pilot, API-token identity, and a command-scoped write role. FW-271 addedPOST /api/v1/tasks/<task-id>/evidenceandPOST /api/v1/tasks/<task-id>/checkpoints; FW-272 adds guardedPOST /api/v1/tasks/<task-id>/statusandPOST /api/v1/tasks/<task-id>/reviews. All writes require JSON,Idempotency-Key, project-scope matching, command-scoped authorization, and unsafe private-data marker rejection. Status writes requireexpected_status; review writes requireadminor matchingreviewer:<domain>. Reviewer-domain tokens cannot override the stored reviewer identity;adminmay explicitly record a reviewer override while audit remains bound to the authenticated admin actor. This still does not add dashboard-originated mutation, provider sends, merge, deploy, release, public exposure, or live-operation authority.packet bugfix,packet retry, platform-foundation packets,packet template,packet rules, andregression-packare quality surfaces. They render and validate review context; they do not execute product test suites or authorize live execution.packet retryrenders bounded preflight or live-operation retry packets from a task id, source SHA, operator surface, artifact directory, evidence contract, allowed actions, forbidden actions, expiry/window, and prior-failure closure. When alive-window retry-budgetcheckpoint exists, retry packets include the iteration count, meaningful failure count, coordination-only failure count, budget, and reset task/reference. If the budget is exhausted without an existing reset task and reset reason, packet rendering stops with a causal-reset requirement. Packet rendering explicitly grants no hidden approval.packet rules <task-id>renders selected and non-applicable rule-pack context, required evidence, recommended commands, review domains, rationale, and residual-risk/stop-condition fields; record that packet as evidence explicitly when it is used for review or handoff.packet template environment-deploy-preflightis available as a built-in reusable deploy rehearsal packet even when a project has not added a local template.--instantiate-waitsrecords genericenvironment-rehearsalwaits for route readback, worker access, smoke, rollback, and evidence-contract checks.--child-task <id=field>creates an explicit child workflow-guard task for a named check field. These instantiation modes record coordination state only; they do not run deploy commands, approve work, accept live authorization, mutate environments, or grant dashboard send/write authority. Projects may still configure their ownpacket templateentries for reusable deploy rehearsal packets such as environment-deploy-preflight.md.db compat --backend postgresprints or validates the reviewed compatibility DDL sketch for a future Postgres adapter.--apply-ddlremains intentionally unimplemented.db rehearsal --backend postgres --out <dir>creates a disposable rehearsal packet from the current SQLite store: SQLite backup, source/rehearsal exports, Postgres compatibility report/DDL, read-model equivalence report, manifest, and rollback instructions. It opens the SQLite backup as the rehearsal source and compares deterministic task/evidence/review/handoff/history counts. It does not switch the runtime store, restart dashboards, publish a release, or authorize public/shared write exposure. With--apply-dsn-env <env>, the command also usespsqlto drop and recreate only the named--postgres-schemainside the disposable Postgres database named by that environment variable, applies the compatibility DDL, imports a bounded snapshot of tasks/state/history/evidence/handoffs/reviews/sessions, and writespostgres-apply.sql,postgres-import.sql, andpostgres-readback.json. The schema must be a simplefairway_-prefixed name; reserved or common schemas such aspublic,pg_catalog,information_schema,pg_toast, and allpg_schemas are rejected before any drop statement is generated. The DSN value must be apostgres://orpostgresql://URL. It is read from the environment, split into libpq environment variables, not passed inpsqlargv, and not written to the manifest. This proof remains a disposable compatibility rehearsal, not adapter parity, production migration, cutover readiness, or shared-team store enablement.contract agent-outputprints the versioned JSON contract catalog for agent-consumed Fairway output. The first catalog schema isfairway.agent-output-contracts.v1and covers task packets, ready queues, waits, reviews, evidence requirements, lane status, and closeout handbacks. Each contract entry names its schema/version, source command, required fields, enum values, compatibility expectations, privacy exclusions, and authority limits. The command is read-only and does not create tasks, record evidence, approve reviews, send providers, mutate dashboard state, merge, deploy, release, or run live operations. Agents should consume--format jsonor global--json, ignore unknown fields unless a schema says otherwise, and treat human-formatted text as non-contractual.- See release-cuts.md for the subset of this surface that ships in each release.
Output
- Human format by default: tables, color when stdout is a TTY.
--jsonfor everything that lists or returns structured data.- Exit codes:
0success,1validation / config error,2runtime error (DB, git),3not found,4invariant violation. record outcomeappends an explicit task-linked outcome.incidentandrollbackrequire--source-ref;correctiveandsuperseding_taskrequire a different task through--related-task; andreopenrequires the ID of a matching terminal-to-active history row through--transition-id. Fairway never infers these links from notes or commit prose, and rejects secret-like retained content.