Skip to content

Remove cargo-hakari and cut the Windows Workshop tests to one command - #147

Merged
vinniefalco merged 7 commits into
cppalliance:masterfrom
vinniefalco:remove-hakari
Oct 14, 2026
Merged

vinniefalco merged 7 commits into
cppalliance:masterfrom
vinniefalco:remove-hakari

Conversation

@vinniefalco

Copy link
Copy Markdown
Member

Summary

  • Removes the workspace-hack crate, .config/hakari.toml, and cargo-hakari from CI. Each crate now builds with only the features it declares, so tokio's test-util no longer compiles into release binaries and the Engine crates no longer pull in tokio, reqwest, or hyper.
  • Deletes workshop-server's headless feature, which only its own CI step used.
  • Folds the Windows check-workshop job's test runs into one nextest command and drops the Linux Workshop job's duplicate race tests, which the main Linux test job already runs.
  • Adds system-proxy to the workspace reqwest pin, so the gateway keeps honoring Windows registry and macOS proxy settings. It previously got that only through the hack.
  • Declares tokio test-util on harness-runner's dev-dependencies, the one feature the per-crate sweep found missing.

Test plan

  • Local Windows: fmt, both clippy partitions, featureless gateway check, workspace nextest (5067 passed), merged Windows command (471 passed), five doc builds, build-xtask (262 passed), docs-claims, cargo deny, per-crate check of all 51 crates in two shapes, and the ring, Engine tokio, test-util, and system-proxy checks
  • CI green on this PR
  • Dispatched release-workshop.yml builds the gateway and Workshop for all five targets

Plan: vibe/2026-10-13-3-remove-hakari.md

The Workshop server no longer has a build mode without the web UI. That mode skipped the UI build and swapped the embedded asset layer for one that served nothing, so server-only tests could run without Node.js or the UI bundle, but it needed its own test run in CI. The build script now always bundles the UI, the asset routes always serve the embedded bundle, and the interface that chose between the two asset layers folds into the embedded one.

- `EmbeddedAssets` is now the whole asset layer. The `AssetServer` trait and `NoopAssets` are deleted, and `get` and `manifest` become associated functions with no `self`.
- `ui_asset` drops its `server: &dyn AssetServer` parameter and reads through `EmbeddedAssets::get`. Every route handler loses the matching argument, `logical_asset` calls `assets::EmbeddedAssets::manifest()` directly, and `asset_server()` is deleted.
- `crates/workshop/server/build.rs` always runs the UI build after the ceiling check, since the `CARGO_FEATURE_HEADLESS` branch and `empty_asset_dir` are gone. Building `workshop-server` therefore always needs Node.js 22 and one `npm ci` per checkout.
- `the_server_boots_and_serves_the_ui_with_an_unreachable_gateway` now always requests the UI index and asserts `reqwest::StatusCode::OK`, with no feature gate around that check.
- `crates/workshop/server/Cargo.toml` no longer defines `headless`, and `.github/workflows/ci.yml` drops the `Test (workshop-server headless)` step that ran it.
- `crates/workshop/server/src/routes/assets-headless-tests.rs` and `the_noop_asset_layer_serves_nothing` are deleted along with the feature they covered. The remaining asset tests run under plain `#[cfg(test)]`.

Design: removes feature-flag @ crates/workshop/server/Cargo.toml::headless
Design: removes strategy @ crates/workshop/server/src/assets.rs::AssetServer
Plan: vibe/2026-10-13-3-remove-hakari.md
The Windows Workshop job now runs all of its tests from a single nextest command instead of three separate test steps. A filter keeps coverage as it was: every test in the four Workshop crates, including the workspace jail's Windows path tests, plus the five Gateway process-ownership race tests selected by name. Default features are turned off for every selected package and only the Gateway's test fixtures are turned on. The Linux Workshop job drops its copy of the race tests because the main Linux test job already runs the Gateway suites with every feature enabled.

- `Test (Windows)` replaces `Test (workshop, concurrent via nextest)`, `Test (workshop-workspace, Windows jail)`, and the Windows `Test Gateway process ownership races` step with one six-package `cargo nextest run`. Because it is one cargo command, dependency features unify across all six packages, so the Workshop crates now build with the union of features that all six request.
- `--no-default-features --features gateway/test-fixtures` applies to every selected package, with the fixtures feature enabled on the Gateway alone.
- `-E` selects whole suites for `workshop`, `workshop-server`, `workshop-server-api`, and `workshop-workspace`, plus tests matching the five race-test names in `gateway-api-discovery` and the gateway `it` binary. nextest matches `package()` against the whole name, so `package(workshop)` does not pull in the other Workshop crates.
- `cargo test` no longer runs the five race tests one at a time; they now run under nextest in parallel with the Workshop suites.
- `--all-features` no longer applies to `workshop-workspace`; the merged command builds it with default features off.
- `Test Gateway process ownership races` is gone from the Linux Workshop job. The main Linux test job already runs every `gateway` and `gateway-api-discovery` test with `--all-features`, so Linux keeps race-test coverage.

Design: removes clone-block @ .github/workflows/ci.yml
Plan: vibe/2026-10-13-3-remove-hakari.md
This change deletes the hakari-generated feature-unification crate that nearly every workspace member depended on, along with its configuration and the CI steps that installed and verified it. That crate put test-only features into the normal dependencies of every member that used it, and it let crates compile against features their own manifests never declared. Feature unification now falls back to cargo's default, where a crate gets the features its manifest declares, unified only with the other packages the same command selects. The crate whose tests relied on a supplied feature now declares it, and the comments that described the old arrangement are reworded.

- `crates/workspace-hack` is deleted with `.config/hakari.toml`, its root workspace dependency entry, and the `workspace-hack.workspace = true` line in each of the 49 member manifests that carried it. It was the most-depended-on package in the workspace, so one generated feature list no longer decides what those 49 crates compile against.
- `crates/harness-internal/runner/Cargo.toml` adds `test-util` to its tokio dev-dependency, the feature behind the controllable test clock its suites pace performers with. The removed crate had supplied it through its normal tokio line, so it now stays out of builds without dev-dependencies.
- `Cargo.lock` only loses lines: the `workspace-hack` package block and the `"workspace-hack",` entry in each member's dependency list. No third-party package leaves the lockfile and no version changes.
- `.github/workflows/ci.yml` no longer installs `cargo-hakari` or runs `cargo hakari verify`. The one-crypto-backend gateway check is unchanged, and its comment drops hakari regeneration as a way for `ring` to come back.
- `tauri-plugin-updater` keeps `default-features = false`. Its comment now says the plugin's `rustls-tls` default would put `ring` into the Workshop binary, instead of into every member through the removed crate.
- `system-proxy` reached reqwest in every member through the removed crate's reqwest line, and no reqwest line in this change declares it in its place. The root reqwest pin still lists only `json`, `query`, `rustls`, and `stream`.

Design: removes god-module @ crates/workspace-hack/Cargo.toml
Design: removes hidden-dependency @ crates/harness-internal/runner/Cargo.toml
Plan: vibe/2026-10-13-3-remove-hakari.md
Turn on system proxy support in the workspace's shared HTTP client dependency. With hakari's unified feature set gone, that dependency entry has to ask for the feature itself, or the gateway would stop honoring proxy settings from the Windows registry and macOS system configuration. Default features stay off, and the rest of the feature list is unchanged.

- `reqwest` gains `system-proxy` on the root workspace pin rather than on a gateway crate's own dependency line, so every member that inherits the pin gets system proxy lookup, not only the gateway.

Plan: vibe/2026-10-13-3-remove-hakari.md
With hakari feature unification retired, the build tooling drops every allowance it made for hakari's crate. Outside their own family, Harness crates may now name only the Engine's two public crates, and Plugin crates may name only the Plugin contract, shared crates, and outside libraries. The build-script ceiling check loses its separate line-count path for a crate with no build script, so every crate meets the same wiring rule. Module docs and guard comments that listed the crate as an allowed dependency now match the narrower rules.

- `WORKSPACE_HACK` leaves both `product.rs` and `tidy-wiring.rs`, and `LINE_LIMIT` and `workspace_hack_violations` go with it.
- `ceiling_wiring_violations` runs the former `else` arm for every walked crate with no branch. Each crate has its `Cargo.toml` read and goes through `crate_violation`, so a crate without a build script meets the same `build.rs` rule as the rest.
- `boundary_breach` makes the `(Family::Harness, Family::Unaffiliated)` arm unconditional, so any unaffiliated dependency of a Harness crate is a breach. That arm and the `(Family::Harness, Family::Build)` arm now say Harness crates may name only `promptforge` and `promptforge-plugin` outside their family.
- `plugin_breach` allows `[PLUGIN_CONTRACT, package.package.as_str()]` plus `shared-*` crates, and its breach message no longer names `workspace-hack`.
- `a_harness_crate_depending_on_workspace_hack_passes` and `a_workspace_hack_file_over_the_limit_fails` go away. `a_plugin_crate_naming_the_contract_and_a_shared_crate_passes` replaces the old passing Plugin test without its `workspace-hack` line, and the remaining assertions expect the new messages.
- `## Invariants` sections in the Plugin crates, `promptforge-plugin`, and `promptforge-types` drop `workspace-hack` from their allowed dependencies. The guard comments in `engine_deps.rs`, `harness_bans.rs`, and `test_support_leak.rs` keep only that each check reads declared dependencies.

Plan: vibe/2026-10-13-3-remove-hakari.md
Every exit criterion for the hakari removal now passes on Windows, Linux, and macOS, and this records that. The checks needed no fixes, so the change touches no code, manifests, or workflows.

Plan: vibe/2026-10-13-3-remove-hakari.md
Plan: vibe/2026-10-13-3-remove-hakari.md
@vinniefalco
vinniefalco merged commit 7476ed8 into cppalliance:master Oct 14, 2026
41 checks passed
@vinniefalco
vinniefalco deleted the remove-hakari branch October 14, 2026 07:23

This branch was successfully deployed

1 active deployment
github-pages — 7476ed81 Deployed Oct 14, 2026 by vinniefalco via deploy #112
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