Files
vdm/gui/docs/pkg-qa-requests-m1.md
T
samiandClaude Sonnet 5 8844dd616b gui: amend PKG/QA request (R1 escalation, R3 restated) + EXT grep-check note
Review feedback on the filed request:

- R1: gui/CMakeLists.txt is on main now, so root's
  find_package(Qt6 ... Svg REQUIRED) is live — a missing SVG dev package
  is a hard configure failure for the whole project, not a skipped guard.
  Added the reason CI hasn't caught it: ubuntu-latest is 24.04 (where
  libqt6svg6-dev likely resolves), the project targets 26.04 (where it
  does not). Wrong name + runner/target release mismatch = the class of
  bug PKG/QA owns is currently unobservable in CI. That's the argument
  for R2, folded in.
- R3: corrected — CI does build the GUI and runs its three ctests under
  the ci preset. What has no home is the non-unit-test DoD: 10k-row
  60fps, flat RSS over a 10-minute run, and mockd
  --slow/--flaky/--drop-connection recovery. Asked for those specifically.
- gui/docs/ext-requests-m1.md: CLAUDE.md §3 says the no-download-logic
  rule applies to extension/ too; GUI made its half an executable ctest,
  EXT's half is still prose. Suggested the ESLint equivalent for the
  existing extension-lint job.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_016Ne28kx4VreeBWZv82Nksd
2026-09-10 13:53:51 +04:00

147 lines
7.2 KiB
Markdown

# GUI → PKG/QA requests (M1)
Filed by lane GUI. These touch PKG/QA-owned files (`tools/bootstrap.sh`, the CI jobs,
`docs/agents/AGENT-PKG-QA.md`) and the root `README.md`, so GUI is not making the edits —
CLAUDE.md §1. Everything below is apply-ready.
---
## R1 — `libqt6svg6-dev` is not a real package on 26.04 (hard configure failure now)
`apt-cache policy libqt6svg6-dev` on a clean Ubuntu 26.04 box gives `Candidate: (none)`.
The Qt 6 SVG **dev** package in the 26.04 archive is **`qt6-svg-dev`** (currently
`6.10.2-2`). `libqt6svg6` (no `-dev`) exists as the runtime lib but carries no headers or
CMake config, so `find_package(Qt6 COMPONENTS Svg)` fails without `qt6-svg-dev`.
I checked the other 38 apt names in `bootstrap.sh` against `apt-cache policy` on 26.04 —
`libqt6svg6-dev` is the only one with no candidate. Everything else resolves.
**This is no longer a latent bug.** `gui/CMakeLists.txt` is now on `main`, so the root
`CMakeLists.txt` line
```cmake
find_package(Qt6 6.6 REQUIRED COMPONENTS Widgets Svg Network LinguistTools)
```
is live for every build. On a machine without the SVG dev package that is a hard configure
failure for the whole project — not a skipped guard, not a GUI-only problem.
**Why nothing has gone red yet — and why that's R2's problem too:**
* This dev box already has `qt6-svg-dev` (pulled in by a `qt6-base-dev` recommends chain),
so `pkg-config --exists Qt6Svg` succeeds and `--check` is green here.
* CI runs on `ubuntu-latest`, which is **24.04**, where `libqt6svg6-dev` most likely still
resolves. The project *targets* **26.04** (the `ci.yml` env comment says as much). So the
one automated place that runs `bootstrap.sh` is on the wrong release to see this, and
`--check` wouldn't catch it there anyway (R2). Wrong package name + runner-vs-target
release mismatch means the class of bug PKG/QA owns is currently unobservable in CI.
### Fix — three files, same one-line change
**`tools/bootstrap.sh`** (in `APT_GUI`, ~line 87):
```diff
APT_GUI=(
qt6-base-dev
qt6-tools-dev
qt6-tools-dev-tools # lrelease/lupdate for i18n
- libqt6svg6-dev # GUI: SVG icon rendering
+ qt6-svg-dev # GUI: SVG icon rendering (was libqt6svg6-dev — no such
+ # package on 26.04; this is the one with headers +
+ # the Qt6SvgConfig.cmake find_package needs)
)
```
**`docs/agents/AGENT-PKG-QA.md`** (~line 17):
```diff
- `libqt6svg6-dev`, `libsecret-1-dev`, `nodejs`/`npm` and (optionally) `clang` are
+ `qt6-svg-dev`, `libsecret-1-dev`, `nodejs`/`npm` and (optionally) `clang` are
```
**`README.md`** (toolchain table, ~line 106):
```diff
sudo apt update && sudo apt install -y \
- libqt6svg6-dev \ # GUI: SVG icon rendering
+ qt6-svg-dev \ # GUI: SVG icon rendering
libsecret-1-dev \ # DAEMON: Secret Service for site logins
```
---
## R2 — `--check` verifies the outcome, not the thing that can break
`--check` today runs the "verify toolchain" block: `command -v` for the binaries,
`pkg-config --exists` for the dev libs (`Qt6Core`, `Qt6Widgets`, `Qt6Svg`, `libcurl`,
`sqlite3`, `libssl`, `libsecret-1`, `libavformat`), plus the cmake/g++/node version
floors. Every one of those checks a *result* on a box that already installed everything.
None of them touch the apt package **names** in `APT_*`, which is the only part of the
script that can be wrong on a clean machine — as R1 just demonstrated. So `--check`
reported green for a script that fails `apt-get install` on its target OS.
### Proposed fix — make `--check` validate the install list it would actually run
Add this to the verify block (runs in **both** modes; in `--check` mode it is the point of
the exercise). It needs neither root nor network — `apt-cache policy` reads the local
package lists that `apt-get update` already populated:
```bash
# Every apt name this script would install must be a real, installable package on THIS
# release. This is the check that would have caught libqt6svg6-dev before the VM did.
log "validating apt package names (${#PKGS[@]})"
missing_pkgs=()
for pkg in "${PKGS[@]}"; do
# `apt-cache policy <pkg>` prints "Candidate: (none)" for a name with no installable
# version, and exits 0 either way — so grep the candidate line, don't trust $?.
cand="$(apt-cache policy "$pkg" 2>/dev/null | sed -n 's/^ Candidate: //p')"
if [[ -z "$cand" || "$cand" == "(none)" ]]; then
printf ' \033[31m✗\033[0m %-20s no installable candidate on this release\n' "$pkg"
missing_pkgs+=("$pkg")
fail=1
fi
done
if (( ${#missing_pkgs[@]} == 0 )); then
printf ' \033[32m✓\033[0m %-20s all %d resolve\n' "apt names" "${#PKGS[@]}"
fi
```
Notes for whoever applies it:
* `PKGS` is already assembled above the `CHECK_ONLY` branch, and it already respects
`--with-clang` / `--with-packaging`, so the loop covers exactly what would be installed.
* Belt-and-braces alternative: `apt-get install -s --no-install-recommends "${PKGS[@]}"`
(`-s` = simulate, no root) also catches an *un-satisfiable dependency*, not just a
missing name. Downside: it needs the apt lists reasonably fresh and is noisier to parse.
`apt-cache policy` is enough to catch the whole class of bug in R1; pick whichever you
want to own.
* **The runner mismatch is part of this.** Even with the name-validation loop, the
`bootstrap-script` job on a 24.04 runner validates names against the *24.04* archive, not
26.04. So R2 only fully closes the gap if the check also runs where the project ships —
a 26.04 container step in that job (`container: ubuntu:26.04`), or a documented decision
that 24.04 is close enough and why. Without that, a name that is valid on 24.04 and gone
on 26.04 (exactly `libqt6svg6-dev`) still slips through.
---
## R3 — the GUI DoD gates have nowhere to run in CI
To be precise about what already works: `VELOX_BUILD_GUI` defaults `ON`, the `ci` preset
inherits `dev`, and once `gui/` is on `main` the `build` and `sanitizers` jobs configure
and build `velox-gui` and run `ctest --preset ci`, which picks up all three GUI checks
(`gui_downloadtablemodel`, `gui_rtl`, `gui_no_download_logic`). That part is covered.
What has no home is the part of the GUI M1 definition of done that isn't a unit test:
1. **10 000 rows scroll at 60 fps** (`mockd --tasks 10000`) — needs a frame-timing probe
against the offscreen (or Xvfb) view; red when a scroll frame exceeds ~16 ms at the
99th percentile.
2. **Flat memory over 10 minutes of progress events** — needs RSS sampled across a
10-minute `mockd --tasks 10000` run; red when RSS grows more than a small fixed slack
(a leak in the progress-patch path is the thing this catches).
3. **Unhappy-path recovery**`mockd --slow`, `--flaky <f>`, `--drop-connection <s>`:
the client must show the banner and recover without a freeze or crash; red on a crash,
a hang (watchdog), or the connection state never returning to `Connected`.
GUI owns writing that harness (`gui/tests/` + a driver script, headless against `mockd`).
Wiring it into `.github/workflows/ci.yml` as its own job — with the 10-minute one likely
`nightly` rather than per-PR — is PKG/QA. Say the word and it comes over as a follow-up
request with the job stanza pre-written.