From 55ffcf8dd5697a00adb50f43962ad689f6e801a3 Mon Sep 17 00:00:00 2001 From: meh Date: Sun, 6 Sep 2026 18:06:46 +0700 Subject: [PATCH 1/5] build(qa-inspect-host): take the ps-blitz 0.4 engine 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. --- crates/qa-inspect-host/Cargo.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/qa-inspect-host/Cargo.toml b/crates/qa-inspect-host/Cargo.toml index 8dce26d..559bc19 100644 --- a/crates/qa-inspect-host/Cargo.toml +++ b/crates/qa-inspect-host/Cargo.toml @@ -18,11 +18,11 @@ publish = true # precisely so that driving a control does not build a browser engine. Keeping # the host in its own crate is what lets both stay true. [dependencies] -blitz-dom = { package = "ps-blitz-dom", version = "^0.3", features = ["system-fonts"] } -blitz-script = { package = "ps-blitz-script", version = "^0.3", features = ["system-fonts"] } -blitz-traits = { package = "ps-blitz-traits", version = "^0.3" } +blitz-dom = { package = "ps-blitz-dom", version = "^0.4.3", features = ["system-fonts"] } +blitz-script = { package = "ps-blitz-script", version = "^0.4.3", features = ["system-fonts"] } +blitz-traits = { package = "ps-blitz-traits", version = "^0.4.3" } brotli = { version = "^8.0.4", default-features = false, features = ["std"] } -tauri-runtime-blitz = { version = "^0.3", features = ["agent-control"] } +tauri-runtime-blitz = { version = "^0.3.2", features = ["agent-control"] } # Only the channel: `ControlBridge` hands its answer back on a # `tokio::sync::oneshot`, so the type has to match. No runtime, no reactor. tokio = { version = "^1", default-features = false, features = ["sync"] } From 11e93e1e38d5e215e6dd71f28460f41959614676 Mon Sep 17 00:00:00 2001 From: meh Date: Sun, 6 Sep 2026 19:06:35 +0700 Subject: [PATCH 2/5] build(qa-inspect-host): release 0.1.9 with the new engine 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. --- crates/qa-inspect-host/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/qa-inspect-host/Cargo.toml b/crates/qa-inspect-host/Cargo.toml index 559bc19..c145d2a 100644 --- a/crates/qa-inspect-host/Cargo.toml +++ b/crates/qa-inspect-host/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "qa-inspect-host" description = "Host a Blitz document and serve it over the inspection socket" -version = "0.1.8" +version = "0.1.9" edition = "2024" rust-version = "1.88" license = "MIT OR Apache-2.0" @@ -22,7 +22,7 @@ blitz-dom = { package = "ps-blitz-dom", version = "^0.4.3", features = ["system- blitz-script = { package = "ps-blitz-script", version = "^0.4.3", features = ["system-fonts"] } blitz-traits = { package = "ps-blitz-traits", version = "^0.4.3" } brotli = { version = "^8.0.4", default-features = false, features = ["std"] } -tauri-runtime-blitz = { version = "^0.3.2", features = ["agent-control"] } +tauri-runtime-blitz = { version = "^0.3.3", features = ["agent-control"] } # Only the channel: `ControlBridge` hands its answer back on a # `tokio::sync::oneshot`, so the type has to match. No runtime, no reactor. tokio = { version = "^1", default-features = false, features = ["sync"] } From b6e6110dd12e9ff6a5d949d118cfdd8f1a3ceb53 Mon Sep 17 00:00:00 2001 From: meh Date: Sun, 6 Sep 2026 19:57:47 +0700 Subject: [PATCH 3/5] feat(qa): open a plain page, and address any node by id 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 `
` 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 `