AX Engineering Console

Policies

AX engineering is about controlled capability, not maximum autonomy. Reads are broad, writes are narrow and reviewed, and the highest-impact actions belong to people. 2 of 8 roles may change a file.

12 of 19 capabilities are checked by an AX command. The quality executor checks run_tests; ax git, ax pr, ax ci and ax deploy check the delivery capabilities before touching git, GitHub, or a provider. The rest are declarations. Nothing here constrains a tool used outside AX: git or gh typed into a shell is unaffected, so this is a boundary only for work that goes through AX.

Delivery workflows

Git workflow

ax git: new working branch, exact files, non-forced push.

  • create_branchImplementedNew prefixed working branch; never the default or a reserved name.
  • commit_worktreeImplementedNamed files only; secret paths and private-key content refused.
  • push_working_branchImplementedOne explicit non-forced refspec to a non-mirror remote.
  • direct_main_pushDeniedA default or reserved branch is refused at plan time.
  • force_pushDeniedNo forced or lease-forced push can be constructed.

PR workflow

ax pr: one approval per repository, head, base, and commit. No merge.

  • github_readImplementedRepository metadata and open pull requests through gh.
  • create_pull_requestRequires approvalApproval bound to repository, head, base, commit, title, and body.

CI inspection

ax ci: pending and absent CI are never reported as passed.

  • read_ciImplementedCheck runs and statuses for one exact commit.

Deployment

ax deploy: exact pushed commits to declared targets. Production denied.

  • preview_deployImplementedDeclared preview/development targets with an adapter.
  • staging_deployRequires approvalApproval bound to target and commit; CI must have passed.
  • production_deployDeniedEvery production target is refused before any adapter is consulted.

Capability matrix

Which role holds which capability, as the policy declares it. Holding one is not the same as an AX command enforcing it.
CapabilityBackend EngineerDatabase ReviewerFrontend EngineerIntegration ReviewerInvestigatorPlannerQA ReviewerSecurity Reviewer
read_codeRead repository codeBackend Engineer holds read_codeDatabase Reviewer holds read_codeFrontend Engineer holds read_codeIntegration Reviewer holds read_codeInvestigator holds read_codePlanner holds read_codeQA Reviewer holds read_codeSecurity Reviewer holds read_code
read_docsRead documentation and contextBackend Engineer holds read_docsDatabase Reviewer holds read_docsFrontend Engineer holds read_docsIntegration Reviewer holds read_docsInvestigator holds read_docsPlanner holds read_docsQA Reviewer holds read_docsSecurity Reviewer holds read_docs
github_readRead GitHub metadataBackend Engineer holds github_readDatabase Reviewer holds github_readFrontend Engineer holds github_readIntegration Reviewer holds github_readInvestigator holds github_readPlanner holds github_readQA Reviewer holds github_readSecurity Reviewer holds github_read
database_metadataRead database metadataBackend Engineer holds database_metadataDatabase Reviewer holds database_metadataFrontend Engineer does not hold database_metadataIntegration Reviewer does not hold database_metadataInvestigator holds database_metadataPlanner does not hold database_metadataQA Reviewer does not hold database_metadataSecurity Reviewer does not hold database_metadata
run_testsRun declared quality commandsBackend Engineer holds run_testsDatabase Reviewer does not hold run_testsFrontend Engineer holds run_testsIntegration Reviewer does not hold run_testsInvestigator holds run_testsPlanner does not hold run_testsQA Reviewer holds run_testsSecurity Reviewer does not hold run_tests
edit_worktreeEdit an isolated worktreeBackend Engineer holds edit_worktreeDatabase Reviewer does not hold edit_worktreeFrontend Engineer holds edit_worktreeIntegration Reviewer does not hold edit_worktreeInvestigator does not hold edit_worktreePlanner does not hold edit_worktreeQA Reviewer does not hold edit_worktreeSecurity Reviewer does not hold edit_worktree
create_branchCreate a working branchBackend Engineer holds create_branchDatabase Reviewer does not hold create_branchFrontend Engineer holds create_branchIntegration Reviewer does not hold create_branchInvestigator does not hold create_branchPlanner does not hold create_branchQA Reviewer does not hold create_branchSecurity Reviewer does not hold create_branch
commit_worktreeCommit selected filesBackend Engineer holds commit_worktreeDatabase Reviewer does not hold commit_worktreeFrontend Engineer holds commit_worktreeIntegration Reviewer does not hold commit_worktreeInvestigator does not hold commit_worktreePlanner does not hold commit_worktreeQA Reviewer does not hold commit_worktreeSecurity Reviewer does not hold commit_worktree
push_working_branchPush a working branchBackend Engineer holds push_working_branchDatabase Reviewer does not hold push_working_branchFrontend Engineer holds push_working_branchIntegration Reviewer does not hold push_working_branchInvestigator does not hold push_working_branchPlanner does not hold push_working_branchQA Reviewer does not hold push_working_branchSecurity Reviewer does not hold push_working_branch
read_ciRead CI statusBackend Engineer holds read_ciDatabase Reviewer does not hold read_ciFrontend Engineer holds read_ciIntegration Reviewer does not hold read_ciInvestigator does not hold read_ciPlanner does not hold read_ciQA Reviewer holds read_ciSecurity Reviewer does not hold read_ci
comment_issue_or_prComment on an issue or pull requestBackend Engineer holds comment_issue_or_prDatabase Reviewer holds comment_issue_or_prFrontend Engineer holds comment_issue_or_prIntegration Reviewer holds comment_issue_or_prInvestigator does not hold comment_issue_or_prPlanner does not hold comment_issue_or_prQA Reviewer holds comment_issue_or_prSecurity Reviewer holds comment_issue_or_pr
create_pull_requestRequires human approvalBackend Engineer holds create_pull_requestDatabase Reviewer does not hold create_pull_requestFrontend Engineer holds create_pull_requestIntegration Reviewer does not hold create_pull_requestInvestigator does not hold create_pull_requestPlanner does not hold create_pull_requestQA Reviewer does not hold create_pull_requestSecurity Reviewer does not hold create_pull_request
database_writeDenied to every roleBackend Engineer does not hold database_writeDatabase Reviewer does not hold database_writeFrontend Engineer does not hold database_writeIntegration Reviewer does not hold database_writeInvestigator does not hold database_writePlanner does not hold database_writeQA Reviewer does not hold database_writeSecurity Reviewer does not hold database_write
direct_main_pushDenied to every roleBackend Engineer does not hold direct_main_pushDatabase Reviewer does not hold direct_main_pushFrontend Engineer does not hold direct_main_pushIntegration Reviewer does not hold direct_main_pushInvestigator does not hold direct_main_pushPlanner does not hold direct_main_pushQA Reviewer does not hold direct_main_pushSecurity Reviewer does not hold direct_main_push
force_pushDenied to every roleBackend Engineer does not hold force_pushDatabase Reviewer does not hold force_pushFrontend Engineer does not hold force_pushIntegration Reviewer does not hold force_pushInvestigator does not hold force_pushPlanner does not hold force_pushQA Reviewer does not hold force_pushSecurity Reviewer does not hold force_push
preview_deployDeploy to a preview environmentBackend Engineer does not hold preview_deployDatabase Reviewer does not hold preview_deployFrontend Engineer does not hold preview_deployIntegration Reviewer does not hold preview_deployInvestigator does not hold preview_deployPlanner does not hold preview_deployQA Reviewer does not hold preview_deploySecurity Reviewer does not hold preview_deploy
staging_deployRequires human approvalBackend Engineer does not hold staging_deployDatabase Reviewer does not hold staging_deployFrontend Engineer does not hold staging_deployIntegration Reviewer does not hold staging_deployInvestigator does not hold staging_deployPlanner does not hold staging_deployQA Reviewer does not hold staging_deploySecurity Reviewer does not hold staging_deploy
production_deployDenied to every roleBackend Engineer does not hold production_deployDatabase Reviewer does not hold production_deployFrontend Engineer does not hold production_deployIntegration Reviewer does not hold production_deployInvestigator does not hold production_deployPlanner does not hold production_deployQA Reviewer does not hold production_deploySecurity Reviewer does not hold production_deploy
secrets_accessDenied to every roleBackend Engineer does not hold secrets_accessDatabase Reviewer does not hold secrets_accessFrontend Engineer does not hold secrets_accessIntegration Reviewer does not hold secrets_accessInvestigator does not hold secrets_accessPlanner does not hold secrets_accessQA Reviewer does not hold secrets_accessSecurity Reviewer does not hold secrets_access

Denied to every role

  • database_write — Insert, update, delete, or migrate data. Denied in v1; database access is metadata-only.
  • direct_main_push — Denied in v1. Changes reach the default branch through a reviewed pull request. ax git refuses a branch that is the default or a reserved name.
  • force_push — Denied in v1, because it can destroy history that other people depend on. ax git never constructs a forced or lease-forced push.
  • production_deploy — Denied in v1. Deployment to production stays a human action outside the harness, and ax deploy refuses every production target whatever the flags.
  • secrets_access — Denied in v1. Credentials never enter configuration, context, agent output, or diagnostics.

These use the same identifiers as the five permissions a project declaration forces to false, and a test asserts the two sets stay identical.

Requires human approval

  • create_pull_request — Propose changes for review. High impact because it asks other people to act. ax pr requires an approval bound to repository, head, base, and commit.
  • staging_deploy — Start a declared staging deployment of one exact, pushed, verified commit. Requires an approval bound to target and commit. Enforced by ax deploy.

Approval is a property of the capability, not a per-role exception, and it cannot unlock anything the policy denies outright.

policy / default
{
  "schemaVersion": 1,
  "id": "default",
  "description": "Default AX Harness capability vocabulary. Reads are broad, writes are narrow and reviewed, and the five high-impact capabilities are denied to every role.",
  "capabilities": [
    {
      "id": "read_code",
      "title": "Read repository code",
      "description": "Read source, tests, and configuration in the working repository.",
      "tool": "codebase",
      "risk": "low",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "read_docs",
      "title": "Read documentation and context",
      "description": "Read the Markdown context a project declares, plus repository documentation.",
      "tool": "docs",
      "risk": "low",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "github_read",
      "title": "Read GitHub metadata",
      "description": "Read GitHub repository metadata, the default branch, and pull requests. Executed by ax pr and ax doctor through the GitHub adapter.",
      "tool": "github",
      "risk": "low",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "database_metadata",
      "title": "Read database metadata",
      "description": "Inspect schema, tables, columns, indexes, and constraints. Never row data, and never writes.",
      "tool": "database",
      "risk": "medium",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "run_tests",
      "title": "Run declared quality commands",
      "description": "Run the build, lint, typecheck, or test commands the project declared. No other command is implied.",
      "tool": "codebase",
      "risk": "medium",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "edit_worktree",
      "title": "Edit an isolated worktree",
      "description": "Modify files on a working branch. Never on the default branch, and never in someone else's checkout.",
      "tool": "codebase",
      "risk": "medium",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "create_branch",
      "title": "Create a working branch",
      "description": "Create and switch onto a new local feature branch. Never the default branch or a reserved name. Enforced by ax git; pushing is push_working_branch.",
      "tool": "codebase",
      "risk": "medium",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "commit_worktree",
      "title": "Commit selected files",
      "description": "Stage an explicit list of files on a working branch and commit them. Never git add of a whole tree, never a secret path. Enforced by ax git.",
      "tool": "codebase",
      "risk": "medium",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "push_working_branch",
      "title": "Push a working branch",
      "description": "Push a feature branch to a declared remote without force. Never the default branch, never a tag or another ref. Enforced by ax git.",
      "tool": "codebase",
      "risk": "medium",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "read_ci",
      "title": "Read CI status",
      "description": "Read check runs and commit statuses for one exact commit. Pending, absent, and unreadable are never reported as passed. Executed by ax ci through the GitHub adapter.",
      "tool": "github",
      "risk": "low",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "comment_issue_or_pr",
      "title": "Comment on an issue or pull request",
      "description": "Add review comments. Comments are visible to others, so they are a write, not a read.",
      "tool": "github",
      "risk": "medium",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "create_pull_request",
      "title": "Open a pull request",
      "description": "Propose changes for review. High impact because it asks other people to act. ax pr requires an approval bound to repository, head, base, and commit.",
      "tool": "github",
      "risk": "high",
      "humanApproval": true,
      "deniedToAllAgents": false
    },
    {
      "id": "database_write",
      "title": "Write to a database",
      "description": "Insert, update, delete, or migrate data. Denied in v1; database access is metadata-only.",
      "tool": "database",
      "risk": "high",
      "humanApproval": false,
      "deniedToAllAgents": true
    },
    {
      "id": "direct_main_push",
      "title": "Push directly to the default branch",
      "description": "Denied in v1. Changes reach the default branch through a reviewed pull request. ax git refuses a branch that is the default or a reserved name.",
      "tool": "github",
      "risk": "high",
      "humanApproval": false,
      "deniedToAllAgents": true
    },
    {
      "id": "force_push",
      "title": "Force push",
      "description": "Denied in v1, because it can destroy history that other people depend on. ax git never constructs a forced or lease-forced push.",
      "tool": "github",
      "risk": "high",
      "humanApproval": false,
      "deniedToAllAgents": true
    },
    {
      "id": "preview_deploy",
      "title": "Deploy to a preview environment",
      "description": "Start a declared preview or development deployment of one exact, pushed, verified commit through a provider adapter. Enforced by ax deploy.",
      "tool": "none",
      "risk": "medium",
      "humanApproval": false,
      "deniedToAllAgents": false
    },
    {
      "id": "staging_deploy",
      "title": "Deploy to staging",
      "description": "Start a declared staging deployment of one exact, pushed, verified commit. Requires an approval bound to target and commit. Enforced by ax deploy.",
      "tool": "none",
      "risk": "high",
      "humanApproval": true,
      "deniedToAllAgents": false
    },
    {
      "id": "production_deploy",
      "title": "Deploy to production",
      "description": "Denied in v1. Deployment to production stays a human action outside the harness, and ax deploy refuses every production target whatever the flags.",
      "tool": "none",
      "risk": "high",
      "humanApproval": false,
      "deniedToAllAgents": true
    },
    {
      "id": "secrets_access",
      "title": "Read secrets",
      "description": "Denied in v1. Credentials never enter configuration, context, agent output, or diagnostics.",
      "tool": "none",
      "risk": "high",
      "humanApproval": false,
      "deniedToAllAgents": true
    }
  ]
}