Skip to content

feat(browser): persist profiles and validate native UI - #48

Merged
pathscale merged 21 commits into
masterfrom
fix/prebuilt-headless-host
Sep 23, 2026
Merged

pathscale merged 21 commits into
masterfrom
fix/prebuilt-headless-host

Conversation

@pathscale

@pathscale pathscale commented Sep 13, 2026 •

Copy link
Copy Markdown
Owner

Chuzz now keeps one browser profile across documents and restarts: WorkTable persists one ordered RFC cookie-jar snapshot, session cookies remain process-local, HTTP and document.cookie share the same jar, public-suffix and secure-prefix rules are enforced, and orderly exits drain queued writes. Synchronous cookie callbacks replace one pending snapshot instead of retaining and writing every intermediate jar during a mutation burst. Wake identifiers keep stale apply commands from consuming a snapshot queued after a flush or close barrier.

The browser defaults to a Chrome-compatible identity, exposes the exact identity in Settings, and applies it consistently to HTTP and navigator.userAgent.

The HTTP exchange uses the consumer cookie-provider hook from pathscale/ps-blitz#98, so the same jar receives intermediate redirect and final error-response cookies before later requests are built. The compatibility surface also adds the DOM and browser APIs needed by current applications, coalesces redraws onto the Tauri main queue to avoid resource-completion deadlocks, and uses Nagoya's portable timers while retaining Tokio only at concrete Tauri/network I/O boundaries. The getter-mutation regression discovered by the event integration test is fixed by pathscale/ps-boa#25.

The existing versioned headless-host fix remains the first commit. A Rust-only fixture plus ps-qa inventory/outcome checks drives the signed native bundle in CI and release jobs. Tests launch children with isolated profiles, and repository policy forbids Python and committed lockfiles.

Validation on the current head:

  • cargo fmt --all -- --check
  • Chuzz cookie/profile suite against the exact ps-blitz 0.4.10, WorkTable 1.9.0-beta1 and ps-boa 1.0.6 sources: 11 passed, including redirect/error exchange ordering, reopen, session exclusion, security policy, a deterministic stale-wake/barrier case, a stopped-worker retry case and a 512-mutation close/reopen burst
  • headless Chuzz cargo clippy --no-default-features --features capture,javascript,vello --all-targets -- -D warnings against those exact sources
  • exact-source dependency-tree verification resolves ps-blitz-net 0.4.10 and WorkTable 1.9.0-beta1; the manifests retain compatible ^0.4, ^0.1 Nagoya and ^0.7 ps-qa ranges
  • frontend lint, typecheck and 15 tests passed for the unchanged frontend portion
  • the Rust fixture served the normal script, 96-resource stress page and 404 path; bash -n scripts/qa-visible-app.sh passed

Before ps-blitz-net 0.4.10 is published, a fresh registry resolution of the compatible ^0.4 range selects 0.4.9, which lacks the consumer cookie-provider API; app, control and headless CI therefore remain expected red. Registry-only CI also requires WorkTable 1.9.0-beta1 and ps-boa 1.0.6. The visible signed-bundle QA remains the release/CI verification path on the macOS runner.

@pathscale pathscale changed the title fix(qa): reuse versioned Linux headless browser feat(browser): persist profiles and validate native UI Sep 13, 2026
meh added 6 commits September 13, 2026 11:32
3.2 removed transport::framed_json with the tokio flavour of the transport.
blitz-control-protocol keeps a shim of the same name that bridges the neutral
framing over tokio-util compat, so both call sites here use that and the codec
on the wire is unchanged. chuzz-control gains the dependency it was reaching
through another crate for.

blitz-control-protocol moves to a path dependency. The published 0.5.1 predates
3.2 and still imports the removed framed_json, so it cannot compile against the
endpoint-libs this tree resolves. The version requirement stays beside the path,
so this goes back to a plain registry dep by deleting one key once 0.5.3 ships.

worktable moves from the 1.9 beta line to 1.10, which is what is published.
@pathscale
pathscale force-pushed the fix/prebuilt-headless-host branch from db783ad to a9ba11d Compare September 22, 2026 23:48
meh added 5 commits September 23, 2026 07:55
cargo tree -p chuzz-control -i tokio no longer matches any package.

The control socket is nagoya's, the same way the blitz one is: Addr::path for
the address, a FuturesUnordered of connections rather than spawn_local, a Flag
for shutdown because Drop is not async, and Once in place of the oneshot the
bridge returned.

The permission window is closed here too. The directory is 0700 before anything
inside it exists, because a socket is created by bind already listening and a
mode applied afterwards is always late. The socket keeps 0600 as well.

The listener is bound before start returns rather than on the server thread, so
a caller that connects the moment it has the path finds something listening.

chuzz-inspect drops its tokio runtime for nagoya::block_on: the client owns a
reactor of its own, so the binary only has to drive one future to completion.

tauri-runtime-blitz is izumo now, so the dependency, the two features that
select it and every call site follow the name.
Both named sibling checkouts by path. CI checks out this repository alone, so
cargo could not load the workspace and every Rust job failed before building.
^0.5.3 and ^0.4.1 resolve once ps-observability and izumo publish them.
cargo fmt --check failed the fmt job on four files from the chuzz-control
change. Formatting only.
ps-blitz, ps-anyrender, blitz-control-protocol, izumo and nagoya were required
at a patch floor. No lockfile is tracked, so the newest release resolves
anyway; the floor only had to be chased on every release.
The example redirected git sources, including tauri-runtime-blitz, but chuzz
takes ps-blitz and izumo from crates.io, so neither table matched anything.
It is a crates.io patch now, and izumo points at the renamed checkout.
pathscale pushed a commit to pathscale/ps-blitz that referenced this pull request Sep 23, 2026
tauri-runtime-blitz is izumo now. The manual QA job checked it out into
.tauri-runtime-blitz, handed it over as TAURI_RUNTIME_BLITZ, and patched a
crate of that name; run.sh defaulted to ../tauri-runtime-blitz. All of it is
izumo now, and the pins move together to the first revisions that agree:
izumo 0.4.1, the chuzz that takes it (pathscale/chuzz#48), and the
ps-observability master that ships blitz-control-protocol 0.5.3. Comments that
named the old crate say izumo.
The runtime is published as izumo and its repository is pathscale/izumo.
Manifest comments, AGENTS.md, the release workflow and two doc comments named
the old crate. The two that name a version only ever published under the old
name (0.3.6) keep it with "(now izumo)", and AGENTS.md no longer claims the
runtime is ^0.1.0.
pathscale pushed a commit to pathscale/ps-blitz that referenced this pull request Sep 23, 2026
tauri-runtime-blitz is izumo now. The manual QA job checked it out into
.tauri-runtime-blitz, handed it over as TAURI_RUNTIME_BLITZ, and patched a
crate of that name; run.sh defaulted to ../tauri-runtime-blitz. All of it is
izumo now, and the pins move together to the first revisions that agree:
izumo 0.4.1, the chuzz that takes it (pathscale/chuzz#48), and the
ps-observability master that ships blitz-control-protocol 0.5.3. Comments that
named the old crate say izumo.
pathscale pushed a commit to pathscale/ps-blitz that referenced this pull request Sep 23, 2026
tauri-runtime-blitz is izumo now. The manual QA job checked it out into
.tauri-runtime-blitz, handed it over as TAURI_RUNTIME_BLITZ, and patched a
crate of that name; run.sh defaulted to ../tauri-runtime-blitz. All of it is
izumo now, and the pins move together to the first revisions that agree:
izumo 0.4.1, the chuzz that takes it (pathscale/chuzz#48), and the
ps-observability master that ships blitz-control-protocol 0.5.3. Comments that
named the old crate say izumo.
meh added 7 commits September 23, 2026 20:31
a_client_gets_an_answer_and_teardown_removes_both_files built the client
reactor as a temporary inside the connect call, so it was dropped at the end
of that statement, and dropping a Reactor stops the thread that drives its
sockets. The request went out and the answer was never read: the test hung
for good, and one run had been stuck for twelve hours.
Nothing in chuzz-control uses tokio since the control server moved to nagoya,
and client.rs no longer needs OsStrExt; clippy -D warnings rejected the import.
blitz-control-protocol 0.5.3 bridges a request to a runtime-free Once the
dispatch loop fills, and takes render events as a Latest; chuzz-headless still
handed back a tokio oneshot and a watch channel and did not compile against
it. The two integration tests connect with a nagoya client and the neutral
framing, which is what the server speaks, instead of tokio and the removed
framed_json. A comment that said to drop a path dependency once 0.5.3 was
published goes: it is, and there is no path.
chuzz uses new_multi_thread and block_in_place, and the page server uses
tokio sockets, but only macros, rt and sync were declared. In the default
build tauri and ps-dioxus-native switched the rest on; the headless build has
neither, and it stopped compiling. The features are declared where they are
used.
The app publishes under Rust's `std::env::temp_dir()`, which on macOS is
`$TMPDIR` when set and otherwise the per-user `DARWIN_USER_TEMP_DIR`,
never `/tmp`. The runner starts steps with `TMPDIR` unset, so the app wrote
under `/var/folders/.../T` while the script watched `/tmp` and reported no
descriptor within 20 seconds. The same job's headless test printed the
`/var/folders` path. Resolve the directory once and export it so the app,
the script and ps-qa agree.
`Collapsible.Content` keeps its content mounted by default, and a CSS rule
flattened it with `display: none`. Unmount it instead: the rows come from
the store, so reopening loses nothing, and the dead rule goes.
The 14 ghosts were painted aria-hidden icons, which ps-qa 0.7.5 no longer
counts, not hidden sections. BrowserHeader.test.tsx pins the display:none
rule this removed, so the change is not needed and broke that test.

This reverts commit 5bde97e.
@pathscale
pathscale merged commit 117cb40 into master Sep 23, 2026
5 checks passed
@pathscale
pathscale deleted the fix/prebuilt-headless-host branch September 23, 2026 18:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant