gui-dod (per-PR: scroll-60fps + unhappy-path) and gui-dod-nightly (rss-flat, schedule/workflow_dispatch) are live in ci.yml, driving GUI's newly-landed gui/tests/dod/run.sh + gui-dod-harness. No Xvfb step: run.sh already runs QT_QPA_PLATFORM=offscreen itself. Each gate forced red once before being trusted (tests/integration/README.md has the transcripts): VELOX_DOD_FRAME_BUDGET_MS=0.01 for scroll-60fps, VELOX_DOD_RSS_SLACK_KIB=-999999999 for rss-flat, and — since run.sh always starts a working mockd — a direct gui-dod-harness invocation against an unreachable socket for unhappy-path, which hit the harness's own 75s watchdog exactly as documented. Recorded GUI's live finding (gui/docs/proto-requests-m1.md) that mockd --drop-connection is a no-op over the UDS transport, so unhappy-path's drop-connection phase can't yet exercise a real drop — coordinating with PROTO on the fix rather than working around it locally. gui-dod stays required regardless: its other two phases and the crash/hang/watchdog paths still catch real regressions. Added gui-dod to BRANCH_PROTECTION.md's required-checks table. ADR 0019: the live-veloxd conformance runner (run.sh step 3b, already unconditional inside the already-required conformance job) stays required as PROTO's xfail list shrinks (18 entries now, down from 34; 57/57 fixtures passing on main). No CI change needed — it was already inside a required check; this records the decision not to carve out an exception for it. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01RBPR7iM3YPyxrjWsVtZDPJ
2.5 KiB
ADR 0019 — The live-veloxd conformance runner is a required check, as-is
Status: accepted · Date: 2026-09-12 · Lane: PKG/QA
Context
tests/conformance/run.sh step 3b (ADR 0014's conformance ctest, already required
per .github/BRANCH_PROTECTION.md) replays every fixture against a real, isolated
veloxd it builds and starts — not just mockd, which only proves the TS client and the
fixtures agree with each other. This is the runner that can catch veloxd disagreeing
with its own contract, and it is unconditional in run.sh (set -euo pipefail, no
skip flag): it already runs, and already blocks, inside the conformance job.
What was open was whether to treat that as a settled, defended gate or as something
still provisional while daemon/docs/deferrals.md's D1-D4b stub handlers were excused
via veloxd-xfail.json. PROTO's update: 57/57 fixtures pass on main, and the xfail
allowlist is down to 18 entries from 34 as DAEMON lands the deferred handlers behind
them.
Decision
The live-veloxd conformance runner stays required — no change to CI is needed, since
it already runs inside the already-required conformance job (ADR 0014). What this ADR
records is the standing: PKG/QA is not carving out an exception, a continue-on-error,
or a separate advisory job for it while the xfail list shrinks. A regression here fails
the same required check a schema mismatch would.
Verified, not assumed: tests/conformance/veloxd-xfail.json has 18 entries as of this
ADR (python3 -c "import json; print(len(json.load(open('tests/conformance/veloxd-xfail.json'))))").
Each remaining entry excuses one still-stubbed handler on deferrals.md's D-list, not a
real disagreement between veloxd and its contract — tests/conformance/README.md
already draws that line (an entry for anything else is a run.sh-detected "xfail entry
unexpectedly passed" or a straight failure, not a quiet pass).
Consequences
- No
ci.ymlorBRANCH_PROTECTION.mdchange:conformancewas already listed required, and this runner was already inside it. - The xfail list is a visible, shrinking number, not a static allowance — as DAEMON
clears more of
deferrals.md's D-list, entries come out oftests/conformance/veloxd-xfail.json, andreplay.tsfails loudly (perapplyXfail's "unexpectedly passed" check) if one is left in after its handler ships. - Nothing here changes who owns what:
veloxd-xfail.jsonandrun.shstay PROTO's; PKG/QA's role is the branch-protection policy this ADR confirms, not the runner itself.