Commit scope
Choose at most one optional scope for <type>[optional scope][!]: <description>.
Canonical scopes
meta core error pdu str bulk graphics config input connector session driver
svc dvc cliprdr rdpdr rdpsnd rdpeai displaycontrol rdpei echo egfx rdpeudp rdpeusb rdpemt rdcleanpath
tls mstsgu vmconnect
client viewer agent daemon rpc activex server web ffi replay
xtask fuzz release pr-automation agents
Most scopes match an ironrdp-* component after removing the prefix.
Use these aggregate mappings:
meta: the ironrdp meta crate.
graphics: ironrdp-graphics and ironrdp-nscodec.
config: ironrdp-cfg, ironrdp-propertyset, and ironrdp-rdpfile.
input: ironrdp-input and ironrdp-ainput.
driver: ironrdp-async, ironrdp-blocking, ironrdp-tokio, and ironrdp-futures.
dvc: DRDYNVC infrastructure, the COM plugin, and the pipe proxy, but not specific dynamic channels.
cliprdr, rdpdr, and rdpsnd: each protocol and its format or native support crates.
rdpeai: MS-RDPEAI audio input protocol and related client capture wiring.
server: ironrdp-acceptor and ironrdp-server.
web: WASM bindings, the Rust web helper, and everything under web-client.
ffi: the Rust FFI and generated or manual .NET bindings, but not ActiveX.
replay: ironrdp-replay-client.
fuzz: fuzz targets, harnesses, corpora, and fuzzing automation.
release: changelog, packaging, publishing, and release automation.
pr-automation: automated PR classification and review infrastructure.
agents: agent instructions and reusable skills.
Selection rules
- Scope the contract or behavior being changed, not every touched path.
- When another component owns the change, ignore supporting tests, documentation, generated files, manifests, lockfiles, and call-site adaptations.
- Prefer the component defining the behavior over components that merely consume it.
- Split independent contract changes when practical.
- Omit the scope when an indivisible change has multiple equal owners.
- Never combine scopes or invent a catch-all scope; explain secondary effects in the body.
- Add a new scope only for a distinct contract that does not fit an existing aggregate.
Use the component scope with any applicable type:
fix(cliprdr): reject invalid file ranges
feat(driver): expose multitransport handoff
ci(release): sign binary artifacts
build(web): update frontend dependencies
Do not use types or cross-cutting aspects as scopes.
This excludes ci, test, docs, build, deps, perf, tooling, automation, workspace, protocol, channels, native, security, and api.
Use no scope for genuinely repository-wide changes.
Tests
Use test by default.
Use only test(core) for core-tier tests, generators, fuzzing, and fixtures, or test(extra) for extra-tier integration infrastructure.
Do not use component scopes with test.
A production change accompanied by tests keeps its production type and scope.
Outside the test type, core means ironrdp-core.
extra is valid only in test(extra).
1---2name: commit-scope3description: Derive and validate the canonical scope for IronRDP Conventional Commit and pull-request titles. Use whenever composing, reviewing, correcting, or checking a commit or PR title, especially when several crates or product surfaces intersect.4---56# Commit scope78Choose at most one optional scope for `<type>[optional scope][!]: <description>`.910## Canonical scopes1112```text13meta core error pdu str bulk graphics config input connector session driver14svc dvc cliprdr rdpdr rdpsnd rdpeai displaycontrol rdpei echo egfx rdpeudp rdpeusb rdpemt rdcleanpath15tls mstsgu vmconnect1617client viewer agent daemon rpc activex server web ffi replay1819xtask fuzz release pr-automation agents20```2122Most scopes match an `ironrdp-*` component after removing the prefix.23Use these aggregate mappings:2425- `meta`: the `ironrdp` meta crate.26- `graphics`: `ironrdp-graphics` and `ironrdp-nscodec`.27- `config`: `ironrdp-cfg`, `ironrdp-propertyset`, and `ironrdp-rdpfile`.28- `input`: `ironrdp-input` and `ironrdp-ainput`.29- `driver`: `ironrdp-async`, `ironrdp-blocking`, `ironrdp-tokio`, and `ironrdp-futures`.30- `dvc`: DRDYNVC infrastructure, the COM plugin, and the pipe proxy, but not specific dynamic channels.31- `cliprdr`, `rdpdr`, and `rdpsnd`: each protocol and its format or native support crates.32- `rdpeai`: MS-RDPEAI audio input protocol and related client capture wiring.33- `server`: `ironrdp-acceptor` and `ironrdp-server`.34- `web`: WASM bindings, the Rust web helper, and everything under `web-client`.35- `ffi`: the Rust FFI and generated or manual .NET bindings, but not ActiveX.36- `replay`: `ironrdp-replay-client`.37- `fuzz`: fuzz targets, harnesses, corpora, and fuzzing automation.38- `release`: changelog, packaging, publishing, and release automation.39- `pr-automation`: automated PR classification and review infrastructure.40- `agents`: agent instructions and reusable skills.4142## Selection rules43441. Scope the contract or behavior being changed, not every touched path.452. When another component owns the change, ignore supporting tests, documentation, generated files, manifests, lockfiles, and call-site adaptations.463. Prefer the component defining the behavior over components that merely consume it.474. Split independent contract changes when practical.485. Omit the scope when an indivisible change has multiple equal owners.496. Never combine scopes or invent a catch-all scope; explain secondary effects in the body.507. Add a new scope only for a distinct contract that does not fit an existing aggregate.5152Use the component scope with any applicable type:5354```text55fix(cliprdr): reject invalid file ranges56feat(driver): expose multitransport handoff57ci(release): sign binary artifacts58build(web): update frontend dependencies59```6061Do not use types or cross-cutting aspects as scopes.62This excludes `ci`, `test`, `docs`, `build`, `deps`, `perf`, `tooling`, `automation`, `workspace`, `protocol`, `channels`, `native`, `security`, and `api`.63Use no scope for genuinely repository-wide changes.6465## Tests6667Use `test` by default.68Use only `test(core)` for core-tier tests, generators, fuzzing, and fixtures, or `test(extra)` for extra-tier integration infrastructure.69Do not use component scopes with `test`.70A production change accompanied by tests keeps its production type and scope.7172Outside the `test` type, `core` means `ironrdp-core`.73`extra` is valid only in `test(extra)`.