- id: rust-crate
threat: T5
why: >-
Build, test, lint and format a Cargo project, inspect build output under
target/, edit a source file. Adding a crate is a new dependency, so it needs review.
steps:
- { read: "Cargo.toml", expect: allow, rule: project-fs }
- { shell: "cargo build", expect: allow, rule: dev-shell }
- { shell: "cargo test --workspace", expect: allow, rule: dev-shell }
- { shell: "cargo clippy --all-targets -- -D warnings", expect: allow, rule: dev-shell }
- { shell: "cargo fmt --all -- --check", expect: allow, rule: dev-shell }
- { shell: "ls target/debug", expect: allow, rule: dev-shell }
- { read: "target/debug/build/app-1f2e3d/output", expect: allow, rule: project-fs }
- { edit: "src/main.rs", expect: allow, rule: project-fs }
- { shell: "cargo run -- --help", expect: allow, rule: dev-shell }
- { shell: "cargo add serde --features derive", expect: defer }
- id: node-app
threat: T5
why: >-
Install the locked dependencies, read a package under node_modules, test,
build and type-check, edit and add source files. `npm ci`, `npx` and
`npm exec` run package code that may be new (both download a package they
cannot find), so they need review (`installs`); the same tools run through `npm run`
are project scripts and stay allowed.
steps:
- { read: "package.json", expect: allow, rule: project-fs }
- { shell: "npm ci", expect: defer }
- { read: "node_modules/typescript/package.json", expect: allow, rule: project-fs }
- { shell: "ls node_modules/.bin", expect: allow, rule: dev-shell }
- { shell: "npm test", expect: allow, rule: dev-shell }
- { shell: "npm run build", expect: allow, rule: dev-shell }
- { shell: "npm run lint -- --fix", expect: allow, rule: dev-shell }
- { shell: "npx tsc --noEmit", expect: defer }
- { shell: "npm exec tsc -- --noEmit", expect: defer }
- { edit: "src/index.ts", expect: allow, rule: project-fs }
- { write: "src/util.test.ts", expect: allow, rule: project-fs }
- { shell: "npm install --save-dev vitest", expect: defer }
- id: python-package
threat: T5
why: >-
Create and activate a virtual environment, install the package in editable
mode (needs review: it runs the build backend and pulls dependencies), run the tests
and linters, edit a module.
steps:
- { read: "pyproject.toml", expect: allow, rule: project-fs }
- { shell: "python3 -m venv .venv", expect: allow, rule: dev-shell }
- { shell: "source .venv/bin/activate", expect: allow, rule: dev-shell }
- { shell: "pip install -e .", expect: defer }
- { shell: "python -m pytest -q", expect: allow, rule: dev-shell }
- { shell: "pytest tests/test_api.py -k login", expect: allow, rule: dev-shell }
- { shell: "ruff check .", expect: allow, rule: dev-tools }
- { shell: "mypy src", expect: allow, rule: dev-tools }
- { edit: "src/app/api.py", expect: allow, rule: project-fs }
- id: go-module
threat: T5
why: >-
Build, test and vet a Go module, edit a file, tidy go.mod after an import
change. `go mod tidy` downloads and records every module the code imports, the
Go form of adding a dependency, so it needs review like `npm ci` (by the default
verdict: `installs` does not name it).
steps:
- { read: "go.mod", expect: allow, rule: project-fs }
- { shell: "go build ./...", expect: allow, rule: dev-shell }
- { shell: "go test ./...", expect: allow, rule: dev-shell }
- { shell: "go vet ./...", expect: allow, rule: dev-shell }
- { edit: "internal/server/server.go", expect: allow, rule: project-fs }
- { shell: "go mod tidy", expect: defer }
- id: git-feature-branch
threat: T4
why: >-
The branch loop: inspect, branch, stage, commit, update from main, rebase,
push. Pushing publishes to a remote, so it needs review (`push`).
steps:
- { shell: "git status", expect: allow, rule: dev-shell }
- { shell: "git log --oneline -10", expect: allow, rule: dev-shell }
- { shell: "git checkout -b feature/login", expect: allow, rule: dev-shell }
- { shell: "git diff", expect: allow, rule: dev-shell }
- { shell: "git add -A", expect: allow, rule: dev-shell }
- { shell: "git commit -m 'feat: add login'", expect: allow, rule: dev-shell }
- { shell: "git branch --list", expect: allow, rule: dev-shell }
- { shell: "git switch main", expect: allow, rule: dev-shell }
- { shell: "git pull --rebase", expect: allow, rule: dev-shell }
- { shell: "git checkout feature/login", expect: allow, rule: dev-shell }
- { shell: "git rebase main", expect: allow, rule: dev-shell }
- { shell: "git stash", expect: allow, rule: dev-shell }
- { shell: "git stash pop", expect: allow, rule: dev-shell }
- { shell: "git push -u origin feature/login", expect: defer }
- id: docker-image
threat: T5
why: >-
Build an image and look at the result. A build runs the project's
Dockerfile inside a container, like a test suite runs the project's code,
so it is allowed; the options that reach the host (build secrets, the SSH
agent, host networking, output to the host) need review. Listing images and
containers is read-only.
steps:
- { read: "Dockerfile", expect: allow, rule: project-fs }
- { shell: "docker build -t app:dev .", expect: allow, rule: dev-shell }
- { shell: "docker build --ssh default -t app:dev .", expect: review, rule: docker-secrets }
- { shell: "docker images", expect: allow, rule: dev-readonly }
- { shell: "docker ps -a", expect: allow, rule: dev-readonly }
- id: make-targets
threat: T5
why: >-
A Makefile project: the default target, then the usual named targets.
steps:
- { read: "Makefile", expect: allow, rule: project-fs }
- { shell: "make", expect: allow, rule: dev-shell }
- { shell: "make build", expect: allow, rule: dev-shell }
- { shell: "make test", expect: allow, rule: dev-shell }
- { shell: "make lint", expect: allow, rule: dev-shell }
- id: edit-project-files
threat: T2
why: >-
The file tools of each agent editing ordinary project files: source, tests,
docs, CI config, dotfiles of the project. All inside the project. No `read`
step, so Codex (which reads through its shell) runs it too. The CI workflow is
the one intended review: CI runs it later with the repository's secrets (`runs-later`).
steps:
- { edit: "src/lib.rs", expect: allow, rule: project-fs }
- { write: "tests/parse.rs", expect: allow, rule: project-fs }
- { edit: "docs/guide.md", expect: allow, rule: project-fs }
- { edit: ".github/workflows/ci.yml", expect: review, rule: runs-later }
- { edit: ".gitignore", expect: allow, rule: project-fs }
- { write: "crates/core/src/new_module.rs", expect: allow, rule: project-fs }