Skip to content

fix: build, release and connect without a committed lockfile - #43

Merged
pathscale merged 4 commits into
masterfrom
fix/release-version-without-lockfile
Sep 11, 2026
Merged

fix: build, release and connect without a committed lockfile#43
pathscale merged 4 commits into
masterfrom
fix/release-version-without-lockfile

Conversation

@pathscale

@pathscale pathscale commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Merge last. This is the final merge of the cycle: merging it is what publishes chuzz, so it lands after the engine repos have published and their bumps are in here. Merged at any other point it ships a version without the engine fixes.

Three failures with one cause: dropping the committed lockfile removed assumptions three places were relying on. Each is verified in both directions.

1. The release could not read its own version

cargo pkgid resolves the dependency graph, so it needs a Cargo.lock. It has failed on every release run since we stopped committing one, and it did not fail the step: VERSION took the empty string from the failed substitution and the job carried on to compare the bundle against nothing.

##[error]bundle reports 0.1.37 but this release is

That is why 0.1.37 is on master and was never published.

command with no lock present
cargo pkgid -p chuzz-gui error: a Cargo.lock must exist for this command
cargo metadata --no-deps ... | sed ... 0.1.37, and creates no lock

The empty-version guard is the other half: a release that cannot name itself now stops rather than publishing under a blank version.

2. A headless build built the browser chrome, and took the fleet's QA red

build_frontend ran unconditionally, so cargo build --bin chuzz-headless --no-default-features shelled out to bun run build for assets that binary never links. frontend.rs is its only consumer and is already behind gui.

Without apps/chuzz/frontend/node_modules the build script panicked instead, which is every runner using the headless-host action:

error: script "layouts:local" exited with code 127
error: script "prebuild" exited with code 127

Verified with node_modules moved aside: the headless build finishes, and --bin chuzz-gui still fails there with the error above. That second half is the proof the gate did it.

3. TLS picked its provider by resolution

rustls selects its crypto provider from crate features and panics at the first handshake when the graph enables neither ring nor aws-lc-rs, or both. Features are additive across a graph, so with no lockfile that is not fixed at any point in time: one dependency picking up ring in a later release turns every https:// and wss:// into a panicked worker on the next runner that resolves it.

It was hit on a fresh resolution during QA work on rustls 0.23.43 and went away on re-resolution to 0.23.44. Today's graph enables aws-lc-rs alone, so it is latent rather than reproducible here, which is the problem: nothing holds it there.

It does not present as a browser failure. The socket never opens, Solid halts reactivity on the escaped error, and the page collapses to unnamed nodes, so a QA run reports a broken site.

Both binaries now install a named provider before anything reaches the network. Verified by capturing an https page end to end.


The engine dependency bumps land here too, before merge, so 0.1.37 publishes exactly once carrying all of it.

meh added 3 commits September 9, 2026 17:26
`cargo pkgid` resolves the dependency graph, so it requires a `Cargo.lock`.
This repo stopped committing one, and the command has failed ever since:

    error: a Cargo.lock must exist for this command

The step did not fail with it. `VERSION` was assigned the empty string from a
failed substitution, the job continued, and the bundle verification compared
`0.1.37` against nothing:

    ##[error]bundle reports 0.1.37 but this release is

So 0.1.37 was merged, built and signed, and never published.

`cargo metadata --no-deps` reads the workspace manifests without resolving
anything, needs no lock, and creates none. Verified both ways with the lock
moved aside: it returns 0.1.37 offline, while `pkgid` reproduces the error
above.

The empty-version guard is the other half. A release that cannot name itself
should stop rather than publish under a blank version.
`build_frontend` ran unconditionally, so `cargo build --bin chuzz-headless
--no-default-features` shelled out to `bun run build` in
`apps/chuzz/frontend` for assets that binary never links. `frontend.rs` is
the only consumer of the generated module and is already behind `gui`.

On a machine without `apps/chuzz/frontend/node_modules` the build script
panicked instead:

    error: script "layouts:local" exited with code 127
    error: script "prebuild" exited with code 127

That is every runner using the `headless-host` action, which installs the
site under test's dependencies and has no reason to install this crate's, so
the whole fleet's QA went red in the host build step.

Verified both ways with `node_modules` moved aside: the headless build now
finishes, and `--bin chuzz-gui` still fails there with the error above,
which is the proof the gate did it rather than something else.

The helpers move behind the same feature so an unused import does not become
a denied warning.
`rustls` picks its provider from crate features and panics at the first
handshake when the graph enables neither `ring` nor `aws-lc-rs`, or both.
Features are additive across a graph, so which of those holds is an outcome
of resolution rather than a decision anyone made, and with no lockfile it is
not fixed at any point in time: one dependency picking up `ring` in a later
release is enough to turn every `https://` fetch and every `wss://`
connection into a panicked worker on the next runner that resolves it.

It was hit on a fresh resolution during QA work, on `rustls 0.23.43`, and
went away on re-resolution to 0.23.44. Today's graph enables `aws-lc-rs`
alone, so this is latent rather than reproducible here, which is exactly the
problem: nothing holds it there.

The failure does not look like a browser failure. The socket never opens,
Solid halts reactivity on the escaped error, and the page collapses to
unnamed nodes, so a QA run reports a broken site.

Both binaries now install a named provider before anything can reach the
network. Verified by capturing an https page end to end.
@pathscale pathscale changed the title fix(release): read the version without a lockfile fix: build, release and connect without a committed lockfile Sep 9, 2026
@pathscale
pathscale force-pushed the fix/release-version-without-lockfile branch from 70e190c to 94f3f04 Compare September 9, 2026 11:06
@pathscale pathscale changed the title fix: build, release and connect without a committed lockfile fix(release): read the version without a lockfile (merge LAST) Sep 9, 2026
@pathscale pathscale changed the title fix(release): read the version without a lockfile (merge LAST) fix: build, release and connect without a committed lockfile Sep 9, 2026
The corpus tooling was rewritten out of the repository, so nothing under
scripts/corpus is Python any more and no build step produces bytecode. The
ignore rule outlived the files it was written for.

Leaving it in place is worse than merely dead. Python is not allowed in this
tree, and an ignore rule for its bytecode is the one thing that would keep a
reintroduction out of git status, so the rule quietly works against the
convention it now has nothing to serve.
@pathscale
pathscale merged commit a053e96 into master Sep 11, 2026
4 checks passed
@pathscale
pathscale deleted the fix/release-version-without-lockfile branch September 11, 2026 19:44
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