Repository navigation
Remove cargo-hakari and cut the Windows Workshop tests to one command - #147
Merged
Merged
Conversation
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
This branch was successfully deployed
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.
Summary
workspace-hackcrate,.config/hakari.toml, and cargo-hakari from CI. Each crate now builds with only the features it declares, so tokio'stest-utilno longer compiles into release binaries and the Engine crates no longer pull in tokio, reqwest, or hyper.headlessfeature, which only its own CI step used.check-workshopjob'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.system-proxyto the workspace reqwest pin, so the gateway keeps honoring Windows registry and macOS proxy settings. It previously got that only through the hack.test-utilon harness-runner's dev-dependencies, the one feature the per-crate sweep found missing.Test plan
test-util, andsystem-proxychecksrelease-workshop.ymlbuilds the gateway and Workshop for all five targetsPlan:
vibe/2026-10-13-3-remove-hakari.md