flake: lift cargo test out of buildPackage so prompt edits don't bust the binary cache (#555)
Per mara's review on PR #561: the previous commit kept `./hive-ag3nt/prompts` in `cleanSrc` because `hive-ag3nt::prompt::tests` had a compile-time `include_str!("../prompts/system.md")`. That meant a prompt edit still busted the cargo cache. This change: - Replaces the test-side `include_str!` with a runtime read from `$HIVE_ASSETS_DIR/prompts/system.md` (with a CARGO_MANIFEST_DIR fallback for plain `cargo test` from a checked-out repo). - Drops `./hive-ag3nt/prompts` from `cleanSrc` — it's now `craneLib.cleanCargoSource ./.` (Cargo.* + *.rs only). - Sets `doCheck = false` on `packages.default` and lifts `cargo test` into a separate `checks.cargo-test` derivation that carries the `hyperhive-assets` build input. That scopes the asset rebuild blast radius to the test check — `nix flake check` still exercises the suite, but the binary derivation no longer carries the assets dep. Verified cache-invariance matrix (via `echo '' >> <f>; nix eval .#default.outPath`): | edit | default | cargo-test | clippy | |-------------------------|---------|------------|--------| | README.md | stable | stable | stable | | branding/hyperhive.svg | stable | CHANGED | stable | | nix/modules/* | stable | stable | stable | | prompts/system.md | stable | CHANGED | stable | | hive-c0re/src/main.rs | CHANGED | CHANGED | CHANGED | (`cargo-test` CHANGED on prompts/branding is correct — tests read the production template + need the assets output.)
This commit is contained in:
parent
0058ed1e59
commit
b3f675e367
2 changed files with 93 additions and 42 deletions
72
flake.nix
72
flake.nix
|
|
@ -47,24 +47,23 @@
|
|||
treefmt-eval = treefmt-nix.lib.evalModule pkgs treefmt-config;
|
||||
craneLib = crane.mkLib pkgs;
|
||||
# Narrowed source tree the rust derivations consume.
|
||||
# `commonCargoSources` is crane's standard "everything cargo
|
||||
# cares about" filter (Cargo.toml/Cargo.lock + *.rs); we
|
||||
# union it with the one non-rust path the workspace still
|
||||
# references — `hive-ag3nt/prompts/` — which is read at
|
||||
# compile time by `hive-ag3nt::prompt::tests` via
|
||||
# `include_str!`. Branding assets + claude prompts at
|
||||
# runtime live in the `hyperhive-assets` derivation
|
||||
# (#555), so a tweak to e.g. `branding/hyperhive.svg`,
|
||||
# `README.md`, the `nix/` modules, or the frontend tree
|
||||
# does NOT bust this src hash and the rust derivations
|
||||
# stay cached.
|
||||
cleanSrc = lib.fileset.toSource {
|
||||
root = ./.;
|
||||
fileset = lib.fileset.unions [
|
||||
(craneLib.fileset.commonCargoSources ./.)
|
||||
./hive-ag3nt/prompts
|
||||
];
|
||||
};
|
||||
# `cleanCargoSource` is crane's standard "everything cargo
|
||||
# cares about" filter (Cargo.toml/Cargo.lock + *.rs). All
|
||||
# non-rust runtime assets — branding + the claude system
|
||||
# prompt template + claude-settings.json — live in the
|
||||
# separate `hyperhive-assets` derivation (#555) and are
|
||||
# loaded by the binaries at runtime from `$HIVE_ASSETS_DIR`.
|
||||
# The unit tests in `hive-ag3nt::prompt` read the same
|
||||
# `prompts/system.md` directly from the workspace tree at
|
||||
# *test* runtime (via `env!("CARGO_MANIFEST_DIR")` — a
|
||||
# compile-time string, no file open at compile), so the
|
||||
# prompt template doesn't have to be in this fileset to
|
||||
# keep `cargo test` honest. Net effect: tweaks to any
|
||||
# non-`*.rs` / non-`Cargo.*` file (README, branding,
|
||||
# nix modules, frontend tree, OR `hive-ag3nt/prompts/*`)
|
||||
# do NOT bust this src hash, so the rust derivations
|
||||
# stay fully cached.
|
||||
cleanSrc = craneLib.cleanCargoSource ./.;
|
||||
# Build the workspace's dependency tree once, cached as
|
||||
# its own derivation. `buildPackage` and `cargoClippy`
|
||||
# both reuse this via `inherit cargoArtifacts;` so a
|
||||
|
|
@ -111,12 +110,24 @@
|
|||
...
|
||||
}:
|
||||
{
|
||||
# Build the workspace binaries without running tests. Tests
|
||||
# are run as a separate check (`checks.cargo-test`) that
|
||||
# carries the `hyperhive-assets` build input — `hive-ag3nt::
|
||||
# prompt::tests` reads the production prompt template at test
|
||||
# runtime through `$HIVE_ASSETS_DIR`, so wiring the env var
|
||||
# into the build phase here would make the prompt's hash a
|
||||
# build input of `default` (defeats #555's cache goal: a
|
||||
# prompt edit would still bust the binary derivation, even
|
||||
# though no .rs file changed). Keeping tests in a separate
|
||||
# check derivation localises the asset-rebuild blast radius
|
||||
# to that one check — `nix flake check` still exercises them.
|
||||
default = craneLib.buildPackage {
|
||||
src = cleanSrc;
|
||||
inherit cargoArtifacts nativeBuildInputs;
|
||||
pname = "hyperhive-workspace";
|
||||
version = "0.1.0";
|
||||
meta.description = "hyperhive workspace (hive-c0re, hive-ag3nt, hive-m1nd)";
|
||||
doCheck = false;
|
||||
};
|
||||
# Bundled browser assets — see ./nix/frontend.nix. Output is
|
||||
# $out/{dashboard,agent}/ which the Rust binaries serve via
|
||||
|
|
@ -125,10 +136,12 @@
|
|||
branding-svg = ./branding/hyperhive.svg;
|
||||
};
|
||||
# Static runtime assets the rust binaries read via
|
||||
# `assets::path()` (#555): branding/* + hive-ag3nt/prompts/*,
|
||||
# `hive_sh4re::assets::*` (#555): branding/* + prompts/*,
|
||||
# plus the rendered agent-configs.png. Split out of the
|
||||
# rust derivation so a tweak to e.g. system.md doesn't bust
|
||||
# the cargo cache.
|
||||
# the cargo cache. Build input of the `cargo-test` check but
|
||||
# NOT of `packages.default`, so the binary derivation stays
|
||||
# cached when a prompt edit ripples through.
|
||||
assets = pkgs.callPackage ./nix/assets.nix { };
|
||||
# Pre-built per-container system closures. Exposed as packages
|
||||
# so operators can `nix build .#agent-base-toplevel` (or wire
|
||||
|
|
@ -266,6 +279,8 @@
|
|||
|
||||
checks = forAllSystems (
|
||||
{
|
||||
pkgs,
|
||||
system,
|
||||
treefmt-eval,
|
||||
craneLib,
|
||||
cleanSrc,
|
||||
|
|
@ -290,6 +305,23 @@
|
|||
version = "0.1.0";
|
||||
cargoClippyExtraArgs = "--workspace --all-targets -- -D warnings";
|
||||
};
|
||||
# `cargo test --workspace` lifted out of `buildPackage` so the
|
||||
# `hyperhive-assets` dep (which `hive-ag3nt::prompt::tests`
|
||||
# needs via `HIVE_ASSETS_DIR` to assert against the actual
|
||||
# production prompt template) is scoped to this one check
|
||||
# instead of bleeding into the binary derivation's input
|
||||
# hash. Net: editing `hive-ag3nt/prompts/system.md` still
|
||||
# rebuilds this test check (correct — the tests assert
|
||||
# against its wording), but `packages.default` and the
|
||||
# per-container toplevels stay fully cached.
|
||||
cargo-test = craneLib.cargoTest {
|
||||
src = cleanSrc;
|
||||
inherit cargoArtifacts nativeBuildInputs;
|
||||
pname = "hyperhive-workspace";
|
||||
version = "0.1.0";
|
||||
cargoTestExtraArgs = "--workspace";
|
||||
HIVE_ASSETS_DIR = "${self.packages.${system}.assets}/share/hyperhive";
|
||||
};
|
||||
}
|
||||
);
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue