## Why
<!-- Required. 1-3 sentences on motivation. Link the issue: Closes #N or Refs #N -->

## How tested
<!-- Required. Commands run, scenarios verified. "Manual smoke on X" is acceptable.
     UI changes: browser/screenshot. Workflows: actionlint output. -->

<!-- ─────────────────────────────────────────────────────────────────────────
     Optional sections below — add the ones that carry signal, delete the rest.
     The changelog is enforced separately: add ONE file
     `changelog.d/<id>-<slug>.<kind>.md` (see changelog.d/README.md), or apply
     the `skip-changelog` label. Do not edit CHANGELOG.md — no note needed here.
     An upgrade note is likewise ONE file `upgrade.d/<id>-<slug>.md` whose first
     line is `### <headline>` (see upgrade.d/README.md). Do not edit UPGRADE.md.
     ───────────────────────────────────────────────────────────────────────── -->

## What
<!-- Bulleted list of changes, imperative voice. -->

## Risk and rollback
<!-- What could break and how to revert. "Low risk; revert single commit" is fine. -->

## Agent metadata
<!-- Fill if authored by a coding agent (Copilot, Claude, etc.). Humans: delete if N/A. -->
- [ ] Single Conventional Commit scope: `<scope>`
- [ ] Single goal (no scope creep)
- [ ] LOC declared upfront: `<n>`
- [ ] Files in scope match the issue brief
