build(qa-inspect-host): take the headless feature set - #14
Merged
Merged
Conversation
added 6 commits
September 6, 2026 18:06
The host is what gives ps-qa its renderer, so every check any project runs is judged by whatever engine is pinned here. On 0.3 that engine dispatches a checkbox's click before the checkbox takes its new value, never dispatches a click at a control its label was pressed for, and treats a written `checked="false"` as checked. A controlled toggle therefore reports the wrong state from first paint and cannot be driven, which is invisible to a check that asserts the renderer's own toggle rather than the application's reaction. Pinned at 0.4.3 rather than 0.4: 0.4.2 is a newer engine without those fixes, and a host on it would keep passing the checks this is meant to make honest. Verified against that engine built from source: `@pathscale/ui`'s component gate is 17/17 across switch, checkbox, radio and connection-settings, and 73/74 over the whole library, the one failure being a Select paint check that fails identically on the published host.
0.1.8 is on crates.io and the publish workflow returns early for a version it finds there, so the engine bump lands and every `cargo install` keeps handing out the old host and the old renderer. That is worse than not bumping at all: the checks would look updated and judge nothing new.
Two limits that between them stopped a repository from testing its own renderer with the harness everybody else uses. `qa-inspect-host` was not a page loader. It read an rsbuild `dist`, pulled the one external stylesheet and the one external script out of it, and synthesised a shell with the `<div id="root">` a component harness mounts into. That is the right shape for a component library and the only shape it accepted: a page carrying its own markup failed with "the page has no src asset". So a project testing the engine, or reducing a bug, had to stand up a JavaScript toolchain before it could assert that a checkbox toggles -- and wrote its own driver instead, which is how a renderer ends up with two testing stories and one of them untested. A page with no external script is now served as written. And `#id` was documented as a selector but could not reach most of what carries one. The role gate ran first, so only interactive nodes survived to be matched, and a `<label>` -- generic, with an id, painted and enabled -- could not be pressed by any spelling. That is not a niche shape: it is how every switch and styled checkbox on the web is built, the visible thing a person actually hits. `#id` and `@slot` now skip the gate, because they already name one exact node, which is the reason `dom_id` is carried at all. A name or `role:name` still goes through it: those are descriptions rather than identities.
0.5.11 is on crates.io and the publish workflow skips a version it finds there, so the id selector reaching non-interactive nodes would land and no installed harness would gain it. Same reason the host is going out as 0.1.9.
`^0.4.3` is a version bump wearing a caret: it forces every consumer to a version that does not exist yet, and it is not how anything else here is pinned. `^0.4` resolves what is available and the lockfile decides the rest. The reason I reached for the patch floor was that 0.4.2 is published and still has the bugs this is meant to catch, so a host resolving it would keep passing the checks. That is a lockfile's job, not a manifest's.
The host opens no window: it serves a socket, answers `Inspect` and activates nodes. Taking `tauri-runtime-blitz` with default features compiled the Tauri runtime along with it, which on Linux means GTK development headers for a binary that never creates a window, and on Linux meant it could not be built at all. `default-features = false` with `agent-control` gets the same nine functions and none of the window stack.
pathscale
pushed a commit
that referenced
this pull request
Sep 6, 2026
The headless feature set landed in #14 without a version bump, and 0.1.9 was already on crates.io from #13, so the publish workflow skipped it and the change reached nobody. `cargo install qa-inspect-host` still gets a host that compiles the Tauri runtime, which is why the consumer that needs it fails on Linux: The system library `glib-2.0` required by crate `glib-sys` was not found error: failed to compile `qa-inspect-host v0.1.9` Exactly the hole the review of the engine change described, walked into one merge later.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The host opens no window. It serves a socket, answers
Inspectand activates nodes.Taking
tauri-runtime-blitzwith default features compiled the Tauri runtime along with it, which on Linux means GTK development headers for a binary that never creates a window — and in fact meant it could not be built on Linux at all, since that crate does not compile there.default-features = falsewithagent-controlgets the same nine functions and none of the window stack:Depends on pathscale/tauri-runtime-blitz#51 publishing, which is where the feature comes from.
Verified with the host built against that branch, driving pathscale/ps-blitz#86's fixture suite: 6/6 groups pass.