AI-Q Release QA
Use this skill to validate a change in the AI-Q repository before opening or
merging a pull request. The goal is to run the narrowest set of checks that
covers what you touched, then broaden only when a change crosses shared
boundaries — not to run every command every time.
Start Here
- Identify which surfaces the change touches: backend Python (
src/,
sources/, tests/), web UI (frontends/ui/), docs (docs/), or evals
(frontends/benchmarks/).
- Run the scoped checks for those surfaces first (see the matrix below).
- Broaden to the full suite only when the change crosses shared boundaries
(for example editing
src/aiq_agent/common/ or a config many agents load).
- Capture the exact commands and their output —
aiq-prepare-pr requires this
as validation evidence.
- Never paste secrets or
deploy/.env values into command output you share.
Authoritative References
- AGENTS.md: the "Build, test, and validation commands"
section is the source of truth for every command below.
- CONTRIBUTING.md: "Local Validation" — the exact
commands to run and the requirement to include their output in the PR.
pyproject.toml and uv.lock: root Ruff config (line length 120, rule sets
E,F,W,I,PL,UP) and the root dev environment.
mcp/pyproject.toml and mcp/uv.lock: the independent MCP runtime and dev
environment. MCP is not a root dependency group.
frontends/ui/package.json: the real scripts (lint, type-check,
test:ci, build) — use these names, do not invent npm scripts.
For the full per-surface command list and expected results:
- references/validation-matrix.md
Workflow
- List the changed paths (
git status, git diff --name-only) and map them to
surfaces.
- Run the scoped Python, UI, docs, or eval checks for those surfaces.
- If the change touches shared code or config, broaden to the full suite for
that surface.
- Re-run until lint, format, type, and tests all pass; fix failures rather than
skipping checks.
- Record the exact commands and their output for the PR description.
Validation
Pick the block that matches the change. Run the narrowest first.
Backend Python (run from the repo root; the project uses uv):
uv run ruff check <changed paths> # lint
uv run ruff format --check <changed paths> # format check
uv run pytest <scoped test paths> # tests
MCP server (run from the repo root):
uv sync --project mcp --extra dev
uv run ruff check mcp
uv run ruff format --check mcp
uv run --project mcp --extra dev pytest mcp/tests
Broaden to the whole tree when the change crosses shared boundaries:
uv run ruff check .
uv run ruff format --check .
uv run pytest
uv run --project mcp --extra dev pytest mcp/tests
Frontend (from frontends/ui/):
npm run lint
npm run type-check
npm run test:ci
Expected: Ruff reports no lint or format failures, tests pass, and the frontend
lint/type-check/test commands exit cleanly. For docs and eval changes, see the
matrix reference.
Common Mistakes
- Running both complete root and MCP test suites for a one-package change
instead of scoping to the touched paths first — slow, and it buries the
relevant signal.
- Running MCP tests in the root environment; use
uv run --project mcp so the
check consumes the isolated MCP lock and dev extra.
- Skipping
ruff format --check and pushing unformatted code that fails CI.
- Hand-reformatting unrelated code; only the changed code should move.
- Forgetting that
nat eval needs deploy/.env; run evals via
dotenv -f deploy/.env run nat eval ... (see the matrix reference).
- Inventing npm scripts; stick to the canonical checks
lint, type-check,
test:ci, and build defined in frontends/ui/package.json.
Related Skills
aiq-prepare-pr
aiq-add-tool
aiq-add-data-source
1---2name: aiq-release-qa3description: Use when validating an AI-Q change before opening or merging a PR — choosing and running the right Python, frontend, docs, or eval checks for the surfaces you touched instead of one fixed command list.4license: Apache-2.05---67# AI-Q Release QA89Use this skill to validate a change in the AI-Q repository before opening or10merging a pull request. The goal is to run the **narrowest set of checks that11covers what you touched**, then broaden only when a change crosses shared12boundaries — not to run every command every time.1314## Start Here1516- Identify which surfaces the change touches: backend Python (`src/`,17 `sources/`, `tests/`), web UI (`frontends/ui/`), docs (`docs/`), or evals18 (`frontends/benchmarks/`).19- Run the scoped checks for those surfaces first (see the matrix below).20- Broaden to the full suite only when the change crosses shared boundaries21 (for example editing `src/aiq_agent/common/` or a config many agents load).22- Capture the exact commands and their output — `aiq-prepare-pr` requires this23 as validation evidence.24- Never paste secrets or `deploy/.env` values into command output you share.2526## Authoritative References2728- [AGENTS.md](../../../AGENTS.md): the "Build, test, and validation commands"29 section is the source of truth for every command below.30- [CONTRIBUTING.md](../../../CONTRIBUTING.md): "Local Validation" — the exact31 commands to run and the requirement to include their output in the PR.32- `pyproject.toml` and `uv.lock`: root Ruff config (line length 120, rule sets33 `E,F,W,I,PL,UP`) and the root dev environment.34- `mcp/pyproject.toml` and `mcp/uv.lock`: the independent MCP runtime and dev35 environment. MCP is not a root dependency group.36- `frontends/ui/package.json`: the real `scripts` (`lint`, `type-check`,37 `test:ci`, `build`) — use these names, do not invent npm scripts.3839For the full per-surface command list and expected results:4041- [references/validation-matrix.md](references/validation-matrix.md)4243## Workflow44451. List the changed paths (`git status`, `git diff --name-only`) and map them to46 surfaces.472. Run the scoped Python, UI, docs, or eval checks for those surfaces.483. If the change touches shared code or config, broaden to the full suite for49 that surface.504. Re-run until lint, format, type, and tests all pass; fix failures rather than51 skipping checks.525. Record the exact commands and their output for the PR description.5354## Validation5556Pick the block that matches the change. Run the narrowest first.5758Backend Python (run from the repo root; the project uses `uv`):5960```bash61uv run ruff check <changed paths> # lint62uv run ruff format --check <changed paths> # format check63uv run pytest <scoped test paths> # tests64```6566MCP server (run from the repo root):6768```bash69uv sync --project mcp --extra dev70uv run ruff check mcp71uv run ruff format --check mcp72uv run --project mcp --extra dev pytest mcp/tests73```7475Broaden to the whole tree when the change crosses shared boundaries:7677```bash78uv run ruff check .79uv run ruff format --check .80uv run pytest81uv run --project mcp --extra dev pytest mcp/tests82```8384Frontend (from `frontends/ui/`):8586```bash87npm run lint88npm run type-check89npm run test:ci90```9192Expected: Ruff reports no lint or format failures, tests pass, and the frontend93lint/type-check/test commands exit cleanly. For docs and eval changes, see the94matrix reference.9596## Common Mistakes9798- Running both complete root and MCP test suites for a one-package change99 instead of scoping to the touched paths first — slow, and it buries the100 relevant signal.101- Running MCP tests in the root environment; use `uv run --project mcp` so the102 check consumes the isolated MCP lock and dev extra.103- Skipping `ruff format --check` and pushing unformatted code that fails CI.104- Hand-reformatting unrelated code; only the changed code should move.105- Forgetting that `nat eval` needs `deploy/.env`; run evals via106 `dotenv -f deploy/.env run nat eval ...` (see the matrix reference).107- Inventing npm scripts; stick to the canonical checks `lint`, `type-check`,108 `test:ci`, and `build` defined in `frontends/ui/package.json`.109110## Related Skills111112- `aiq-prepare-pr`113- `aiq-add-tool`114- `aiq-add-data-source`