How pull requests are gated for workers in this monorepo.
Sources of truth: .github/workflows/ci.yml,
.github/scripts/discover_changed_workers.py,
.github/scripts/validate_worker.py.
discover job runs discover_changed_workers.py comparing the PR to its base.
A directory is a worker when it contains iii.worker.yaml at its root.
docs/ is not discovered (no manifest).
Outputs:
| Key | Meaning |
|---|---|
all |
Every changed worker folder |
source_changed |
Workers with non-metadata file changes |
rust / node / python |
Language buckets from iii.worker.yaml |
vscode_changed |
iii-lsp-vscode/ changed (special-case job) |
Harness fan-out: when harness/ changes, in-repo deps listed in
harness/iii.worker.yaml dependencies join the rust matrix (version-bump
gates still apply only to workers the PR author edited).
Metadata-only PRs: if a worker's only changes match
iii.worker.yaml, README.md, Cargo.toml, Cargo.lock, AGENTS*.md,
version/tests/README gates downgrade to GitHub notices.
README.mdexists and is non-emptyiii.worker.yamlparses with required fields- Manifest version ≥ version on base branch
tests/exists and is non-empty- Bootstrap workers (
shell,iii-directory):skills/SKILL.mdpresent, non-empty, ≤ 256 KiB
| Language | Lint | Test |
|---|---|---|
| Rust | cargo fmt --check, clippy -D warnings |
cargo test --all-features |
| Node | biome ci |
npm test (if tests/ exists) |
| Python | ruff check, ruff format --check |
pytest (if tests/ exists) |
Workers with web/package.json (e.g. console) pre-build the SPA before cargo
in both rust and interface-smoke jobs.
Why it exists: release publish boots the worker on a clean runner with no
data/ directory. A worker can compile and pass unit tests yet crash at publish
when SQLite parent dirs or sidecars are missing (#104 / database/v0.2.6).
Flow:
cargo build(default features — same as release binary)- Install
iiiCLI + start engine - Start worker from
./target/debug/<bin>(with--config config.collect.yamlwhen shipped) collect_worker_interface.py— 120 s wait, assert non-empty interface
Opt-out: interface_smoke: false in iii.worker.yaml (e.g. iii-lsp).
Some workers have harness-level e2e beyond unit tests:
| Workflow | Worker |
|---|---|
shell-e2e.yml |
shell |
database-e2e.yml |
database |
storage-e2e.yml |
storage |
Add a dedicated workflow when integration with the full harness stack is release-blocking and too slow for the per-PR matrix.
.github/scripts/tests/ — pytest for release/discovery helpers. Runs on every PR.
- New worker expectations:
../sops/new-worker.md§4–§5 - Release interface collection:
../sops/release.md