Repository navigation
feat(qa): open a plain page, address any node by id, and take the 0.4 engine - #13
Merged
Merged
Conversation
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.
added 4 commits
September 6, 2026 19:06
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.
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.
Three things, all of which came out of trying to run this harness against an engine that had not been released yet.
qa-inspect-hostcan open a plain pageIt 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 around the<div id="root">a component harness mounts into. That is the right shape for a component library and it was the only shape accepted: a page carrying its own markup failed withthe page has no src asset.So a project testing the engine itself, or reducing a bug, had to stand up a JavaScript toolchain before it could assert that a checkbox toggles. ps-blitz went 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.
#idreaches any node#idwas already documented as a selector anddom_idwas already carried, but the role gate ran first, so only interactive nodes survived to be matched. A<label>isgeneric, so with an id, painted and enabled, it 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, and the visible thing a person actually hits.
#idand@slotnow skip the gate because they already name one exact node. A bare name orrole:namestill goes through it: those are descriptions rather than identities.The 0.4 engine
^0.3→^0.4, at the minor. An earlier revision of this PR pinned^0.4.3to stop the host resolving 0.4.2, which is a newer engine that still has the bugs the checks are meant to catch. That is a version bump wearing a caret and it is not how anything here is pinned; the lockfile decides which patch is used.Releases
qa-inspect-host0.1.9 andps-qa0.5.12. Both current versions are on crates.io and the publish workflow returns early for a version it finds there, so without the bumps this merges and no installed harness gains any of it.Verified
The engine repository's own fixtures, driven by this harness through this host, built against an unpublished ps-blitz checkout with cargo's
--configpatches and no manifest edits anywhere: six groups, all passing, and each failing when the engine fix it covers is reverted. See pathscale/ps-blitz#86.