build: migrate dev environment and CI from nix flake to devenv - #951
Conversation
Phase 1 of the nixflakes -> devenv migration. Adds devenv.nix, devenv.yaml, devenv.lock, and .envrc without touching the existing flake, so both systems work side by side during the cutover. The four C/C++ derivations (zig 0.16.0, cimgui, rmlui, rmlui-bridge) are ported verbatim from flake.nix, as are the ZIGCRAFT_DYNAMIC_LINKER and ZIGCRAFT_RUNTIME_LIBRARY_PATH computations consumed by build.zig and the robustness integration test. Base devenv.nix exposes the common foundation (zig, sdl3, vulkan, cimgui, rmlui, freetype, pkg-config, glslang). Three additive profiles mirror the previous devShells: - default: zls + mesa + weston + kcov + shellcheck (local dev; .envrc activates it automatically via 'use devenv --profile default') - unit: kcov + shellcheck (lean CI CPU shell, no mesa/weston/zls) - graphics: mesa + weston + shellcheck (CI graphics shell) Spike-verified: full 'zig build' links zigcraft/benchmark/robust-demo inside 'devenv shell --profile unit', env vars export correctly, and IN_NIX_SHELL=impure is set so scripts/run_benchmark.sh is unaffected. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
Phase 2a of the nixflakes -> devenv migration. Adds the devenv setup composite action and migrates the two actions that referenced nix shells or flake files. - .github/actions/setup-devenv: new action installing Nix (preserving the Determinate primary + cachix fallback pattern), wiring the devenv Cachix cache (pull-only), adding the devenv CLI, and caching on hashFiles(devenv.nix, devenv.yaml, devenv.lock). - start-weston: input nix-shell (default .#ci-graphics) renamed to devenv-profile (default graphics); 'nix develop ... --command weston' becomes 'devenv shell --profile ... -- weston'. - setup-zig-cache: cache key switches from hashFiles(flake.nix, flake.lock) to hashFiles(devenv.nix, devenv.yaml, devenv.lock). - devenv.nix: new tasks.zigcraft replacing the former packages.default / 'nix build -L' -- builds the Debug x86_64-linux binary and bakes the nixpkgs runtime rpath via patchelf. patchelf added to base packages. Verified: devenv info registers the zigcraft task; actionlint (full-repo scan) reports no errors on the touched actions. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
Phase 2b. All build.yml jobs now use devenv: - fmt: 'devenv shell --profile unit -- zig fmt --check src/ modules/' - build: 'devenv shell --profile unit -- devenv tasks run zigcraft' replaces 'nix build -L'; artifact copied from dist/bin/zigcraft (task output) instead of result/bin/zigcraft (flake symlink). - unit-test-matrix: unit profile for the test matrix, phase5-gate, and phase5-stress-gate. - integration-test: graphics profile for test-integration, world smoke test, and phase5-visual-gate. Path filters (push, pull_request, dorny/paths-filter) now key on devenv.nix/devenv.yaml/devenv.lock and .github/actions/setup-devenv/** instead of flake.nix/flake.lock and .github/actions/setup-nix/**. platform-build (Windows/macOS) is unchanged: it never used Nix. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
Phase 2c. All remaining CI workflows now use the devenv composite action and the unit/graphics profiles: - workflow-validation: shell syntax + shellcheck via unit profile; the former 'nix flake check --no-build' gate becomes 'devenv info >/dev/null' which validates the devenv.nix configuration evaluates. Path filters key on devenv.nix/devenv.yaml/devenv.lock. - coverage: kcov + zig build test via unit profile. - sanitize: ASAN test matrix via unit profile. - profiling: fixed-world benchmark capture via graphics profile. - visual-test: menu screenshot capture via graphics profile (the ad-hoc 'nix shell nixpkgs#imagemagick' for golden comparison is retained since Nix remains installed). - security: gitleaks/trivy ad-hoc 'nix run nixpkgs#...' retained; the former 'nix flake show --json' dependency-graph artifact is replaced by a devenv configuration snapshot (devenv.lock) uploaded as 'devenv-configuration'. - benchmark: suite, phase5-stress-gate, and GPU culling captures via the unit/graphics profiles; provenance strings updated from 'pinned Nix flake'/'Nix environment' to 'pinned devenv inputs'/'devenv profile'. - opencode, opencode-pr, opencode-audit, opencode-test-writer: setup-only, swapped to the devenv composite action. - labeler.yml: build label triggers on devenv.nix/devenv.yaml/devenv.lock. Verified: actionlint (full-repo scan) reports no errors. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
devenv task names require a 'namespace:name' format (every task is
namespaced, e.g. myapp:build). The bare 'zigcraft' attribute registered in
'devenv info' but 'devenv shell' rejected it with
Tasks(InvalidTaskName("zigcraft")) when the task runner validated on shell
entry. Renamed to zigcraft:build; CI invocation updated to match.
Verified: 'devenv shell --profile unit' enters cleanly and 'devenv tasks
list' shows zigcraft:build.
Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
…s to devenv Phase 3. Updates the remaining non-CI invocation sites: Scripts (self-wrapping helpers): - run_phase5_visual_smoke.sh, capture_lighting_baselines.sh, capture_shadow_test.sh: 'nix develop --command zig build run' -> 'devenv shell --profile graphics -- zig build run'. - run_benchmark.sh: the IN_NIX_SHELL guard still works (devenv sets IN_NIX_SHELL=impure), so the direct-execution branch is unchanged; only the fallback wrapper switches from 'nix develop --command' to 'devenv shell --profile graphics --'. Git hook: - .githooks/pre-push: fmt check and full test suite now run through 'devenv shell --profile unit --' (self-contained; does not require direnv activation). Source: - gpu_mesher.zig, lpv_utils.zig, culling_system.zig: user-facing SPIR-V regeneration hint updated from 'nix develop --command zig build' to 'devenv shell zig build'. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
Phase 4. Mechanical sweep of every developer-facing instruction file, replacing 'nix develop --command <cmd>' with 'devenv shell <cmd>' (and the CI-specific forms 'nix develop .#ci-unit/.#ci-graphics --command' with 'devenv shell --profile unit/graphics --'). Touched: AGENTS.md, README.md, CONTRIBUTING.md, docs/ (ci-test-guardrails, profiling, visual-test, benchmarks, lighting-phase0-baselines, ui-architecture, worldgen-biomes-and-terrain, lod-water-and-latency-steering-752, platform-ci), four headless-* agent skills, test-writer skill, pr-autopilot skill, both opencode commands, and the three .github/prompts review/audit/test-writer prompts. Prose adjusted where 'Nix'/'flake' appeared: README troubleshooting now references 'devenv update' instead of 'nix-channel --update'; CONTRIBUTING prerequisites list Nix + devenv + optional direnv; AGENTS.md intro now describes the unit/graphics profiles; capability blurbs say 'devenv' where they previously said 'Nix'. Remaining 'Nix' mentions are the accurate 'Nix-based'/'required by devenv' qualifiers. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
Phase 5 (final). Deletes flake.nix, flake.lock, and the now-orphaned .github/actions/setup-nix composite action. The devenv shell, the zigcraft:build task, and all CI workflows/scripts/docs now reference only devenv.nix/devenv.yaml/devenv.lock and the setup-devenv action. Verified post-removal: - 'devenv info' still evaluates and resolves ZIGCRAFT_DYNAMIC_LINKER. - actionlint full-repo scan reports no errors (no dangling setup-nix refs). - grep across all tracked .yml/.yaml/.sh/.md/.zig/.zon/.nix files finds zero residual 'nix develop'/'nix flake'/'nix-channel'/'setup-nix'/'flake-utils' references (CODEBASE_REPORT.md, which is gitignored/generated, excluded). The migration is functionally complete. Remaining 'Nix' mentions in docs are the accurate 'Nix-based'/'required by devenv' qualifiers, since devenv still runs on a Nix daemon. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
kcov coverageLine coverage ran for this PR and uploaded a non-blocking report artifact named |
The build job failed in CI: patchelf --add-rpath hit a
rewriteSectionsExecutable assertion ('startAddr % getPageSize() ==
startOffset % getPageSize()') on the PIE binary zig emits by default. The
former flake packages.default avoided this via hardeningDisable=["all"]
(which disables PIE); devenv builds zig's default PIE layout, which patchelf
cannot always rewrite.
The zig build itself succeeded (53s) -- only the post-build rpath bake
failed. Since the uploaded artifact is for inspection rather than external
execution and the binary runs inside 'devenv shell' via
ZIGCRAFT_DYNAMIC_LINKER/ZIGCRAFT_RUNTIME_LIBRARY_PATH regardless, the rpath
bake is now best-effort: on patchelf failure it warns and leaves the binary
as-is instead of failing the task.
Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
This comment has been minimized.
This comment has been minimized.
The integration test failed with 86 Vulkan validation errors (viewport width/height 0, render-pass srcAccessMask mismatches). Root cause: devenv.lock had floated to a newer nixos-unstable (e2587ca, 2026-07-23) than the former flake.lock (0bb7ec5, 2026-07-08), pulling in SDL3 3.4.12 and a newer vulkan-loader that surface these errors under Lavapipe. dev's integration test passes with the older pin (SDL3 3.4.10). Pin devenv's nixpkgs input to 0bb7ec54c8483066ec9d7720e780a5caa71f8612 (the exact rev the former flake.lock used) so the migration changes only the shell tooling, not dependency versions. Verified: devenv info resolves with sdl3-3.4.10 and mesa-26.1.4, matching the pre-migration flake. Bumping this pin (and reconciling any newly-reported validation errors) is deferred to a separate PR. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
|
I have completed my analysis. Here is my review. 📋 SummaryLinked issues: None. The PR description does not reference any issues via This PR migrates ZigCraft's developer environment and CI from a hand-rolled Nix flake to devenv, porting the four C/C++ derivations (zig 0.16.0, cimgui, rmlui, rmlui-bridge) verbatim and re-wiring all 12 workflows, the runtime scripts, pre-push hook, docs, skills, and prompts to 📌 Review Metadata
🔴 Critical Issues (Must Fix - Blocks Merge)✅ All previously reported critical issues have been resolved (no previous automated reviews existed). None identified at the critical severity — the failing CI gates are classified below as High because they are recoverable with a small pinning fix to
|
| Principle | Score | Notes |
|---|---|---|
| Single Responsibility | 7/10 | devenv.nix mixes derivations, env, task, and profiles, but this is the canonical devenv layout and the concerns are clearly sectioned. |
| Open/Closed | 8/10 | The additive profiles.{default,unit,graphics} design makes it trivial to add new profiles without touching the base. |
| Liskov Substitution | 7/10 | Profiles compose predictably on top of the common foundation; no surprising overrides. |
| Interface Segregation | 8/10 | Three narrow profiles cleanly segregate CPU-only vs graphics vs full local dev. |
| Dependency Inversion | 5/10 | The migration correctly inverts the devShell mechanism, but setup-lavapipe still depends on the unpinned nixpkgs registry for the validation layers (see High issue). |
| Average | 7.0 |
🎯 Final Assessment
Overall Confidence Score: 58%
Confidence Breakdown:
- Code Quality: 80% (clean mechanical sweep, well-commented Nix, faithful port of derivations)
- Completeness: 55% (migration is functionally complete but the integration/benchmark gates are red on the head commit and the pinning fix is incomplete)
- Risk Level: 45% (a broken integration-test gate on dev would mask real graphics regressions for subsequent PRs)
- Test Coverage: 50% (no new tests; existing CI is the verification surface and two key jobs are failing)
Merge Readiness:
- All critical issues resolved
- SOLID average score >= 6.0
- Overall confidence >= 60%
- No security concerns
- Tests present and passing (if applicable)
Verdict:
MERGE WITH FIXES — The migration itself is thorough and well-executed, but pinning vulkan-validation-layers (and mesa.drivers) in setup-lavapipe/action.yml to the same revision devenv.lock uses is required before merge so the integration-test and benchmark gates return to green.
Machine Readable Verdict
{
"reviewed_sha": "e2cb133c69ef4f1a1acb0600bb4f0b19b47824f3",
"critical_issues": 0,
"high_priority_issues": 1,
"medium_priority_issues": 2,
"overall_confidence_score": 58,
"recommendation": "MERGE_WITH_FIXES"
}The nixpkgs pin in devenv.yaml did not flow into setup-lavapipe, which resolved mesa.drivers and vulkan-validation-layers via the bare 'nixpkgs#' shorthand (the floating flake registry). The validation layers therefore drifted forward 17 days independently of the project pin and surfaced 86 latent Vulkan errors (viewport 0x0, render-pass srcAccessMask mismatches), failing integration-test; the same drift inflated validation overhead enough to breach the LOD GPU budget in benchmark. setup-lavapipe now reads the nixpkgs rev from devenv.lock (.nodes.nixpkgs.locked.rev) and resolves both packages from github:NixOS/nixpkgs/<rev>, so the validation layers match the rest of the environment. Single source of truth: bumping devenv.yaml/lock updates the Lavapipe layers automatically. Also addresses two review findings: - patchelf best-effort rpath bake now captures stderr to a temp file and prints it on failure instead of redirecting to /dev/null, so future patchelf regressions are diagnosable. - The zigcraft build artifact no longer double-lists the binary: upload path narrows from dist/ to dist/zigcraft-linux (the prepared copy). Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
|
I have enough information to write the review. The previously reported HIGH issue's "fix" (commit bde5bcf) introduced a new critical regression: the benchmark CI gate now fails at the Setup Lavapipe Vulkan step itself (1m31s into the run) because pinning via 📋 SummaryLinked issues: None. The PR description references no issues via This PR migrates ZigCraft's developer environment and CI from a hand-rolled Nix flake to devenv, porting the four C/C++ derivations (zig 0.16.0, cimgui, rmlui, rmlui-bridge) verbatim and re-wiring all 12 workflows, runtime scripts, pre-push hook, docs, skills, and prompts to 📌 Review Metadata
🔴 Critical Issues (Must Fix - Blocks Merge)✅ Previous critical issues status: No critical issues were reported in the prior review (it had only HIGH/MEDIUM/LOW). However, the latest commit's attempted fix of the prior HIGH issue introduced a new critical regression below. [CRITICAL] The Impact: Two of the required correctness/performance CI gates (integration-test, benchmark) are red on the merge candidate because they cannot even install the validation layers. Merging advertises Suggested Fix: Use a flake URL form that preserves the binary-cache hit. The cleanest option is to surface graphics.module = { pkgs, ... }: {
packages = [
pkgs.mesa
pkgs.mesa.drivers # for the Lavapipe ICD JSON
pkgs.vulkan-validation-layers
pkgs.weston
pkgs.shellcheck
];
};Then have - name: Resolve Vulkan paths
shell: bash
run: |
set -euo pipefail
# mesa.drivers and vulkan-validation-layers come from the graphics profile
# (pinned via devenv.lock) -- no separate nix build needed.
LVP_PATH="$(devenv shell --profile graphics -- bash -c 'echo "${pkgs.mesa.drivers}"')/share/vulkan/icd.d/lvp_icd.x86_64.json"
...If a self-contained ad-hoc nixpkgs_rev=$(jq -r '.nodes.nixpkgs.locked.rev' devenv.lock)
# legacyPackages keeps the registry alias path that cache.nixos.org indexes;
# 'packages.<system>.foo' or 'github:owner/repo/rev#foo' can miss the binary cache.
LVP_PATH=$(nix build --no-link --print-out-paths "nixpkgs/${nixpkgs_rev}#legacyPackages.x86_64-linux.mesa.drivers")/share/vulkan/icd.d/lvp_icd.x86_64.json
LAYER_PATH=$(nix build --no-link --print-out-paths "nixpkgs/${nixpkgs_rev}#legacyPackages.x86_64-linux.vulkan-validation-layers")/share/vulkan/explicit_layer.dEither way, the choice must be verified by re-running the
|
| Principle | Score | Notes |
|---|---|---|
| Single Responsibility | 7/10 | devenv.nix still mixes derivations, env, task, and profiles, but this is the canonical devenv layout and concerns are clearly sectioned. |
| Open/Closed | 8/10 | The additive profiles.{default,unit,graphics} design makes adding new profiles trivial without touching the base. |
| Liskov Substitution | 7/10 | Profiles compose predictably on top of the common foundation. |
| Interface Segregation | 8/10 | Three narrow profiles cleanly segregate CPU-only vs graphics vs full local dev. |
| Dependency Inversion | 4/10 | The pinning fix in setup-lavapipe re-introduces a fragile dependency on the GitHub-rev address form hitting cache.nixos.org (it doesn't), so the migration's "single source of truth" claim is broken in practice (see Critical). |
| Average | 6.8 |
🎯 Final Assessment
Overall Confidence Score: 35%
Confidence Breakdown:
- Code Quality: 75% (clean mechanical sweep, faithful port of derivations, MEDIUM fixes are clean)
- Completeness: 30% (the migration code is complete, but the Lavapipe-pinning fix is broken and two required CI gates cannot even start their core test/benchmark)
- Risk Level: 25% (a broken integration-test gate on
devwould mask real graphics regressions for every subsequent PR; the fix made things strictly worse thane2cb133) - Test Coverage: 25% (existing CI is the verification surface, and the benchmark gate fails at environment setup before any test runs)
Merge Readiness:
- All critical issues resolved
- SOLID average score >= 6.0
- Overall confidence >= 60%
- No security concerns
- Tests present and passing (if applicable)
Verdict:
MERGE WITH FIXES — The migration itself is well-executed and the previous MEDIUM issues are properly resolved, but the head commit's fix for the prior HIGH issue (Lavapipe pinning) is broken: the benchmark gate fails at Setup Lavapipe Vulkan itself and the integration-test gate uses the same action, so the pinning approach must be reworked (prefer devenv profile packages or legacyPackages address form) and the benchmark/integration-test gates re-verified before merge.
Machine Readable Verdict
{
"reviewed_sha": "bde5bcf704233242d033cbe35f14259924cfa8ef",
"critical_issues": 1,
"high_priority_issues": 0,
"medium_priority_issues": 0,
"overall_confidence_score": 35,
"recommendation": "MERGE_WITH_FIXES"
}The previous attempt to pin Lavapipe/validation layers to devenv.lock's rev (0bb7ec5, nixos-unstable) forced a from-source build of vulkan-validation-layers that failed: that rev does not keep the package in the binary cache, and the sandbox build aborts with 'FileNotFoundError: git'. Re-checking the root cause: the validation-layer VERSION is identical across the pinned and floating nixpkgs (1.4.350.0 at the failing run), so layer drift was not the differentiator. dev's green integration-test (2026-07-08) used floating nixpkgs# layers + an sdl3-3.4.10 binary. My first red run used the same floating layers but an sdl3-3.4.12 binary (devenv.lock had floated forward). The SDL3 bump (3.4.10 -> 3.4.12) is what surfaced the 86 validation errors (0x0 viewport under headless weston), and the devenv nixpkgs pin already restores sdl3-3.4.10. So setup-lavapipe is restored to the floating nixpkgs# form dev has always used, which substitutes from the well-populated nixpkgs-unstable cache. The devenv nixpkgs pin (sdl3-3.4.10) is the actual correctness fix. Signed-off-by: MichaelFisher1997 <contact@michaelfisher.tech>
|
I have enough information to complete the review. The head commit 📋 SummaryLinked issues: None. The PR description references no issues via This PR migrates ZigCraft's developer environment and CI from a hand-rolled Nix flake to devenv, porting the four C/C++ derivations (zig 0.16.0, cimgui, rmlui, rmlui-bridge) verbatim and re-wiring all 12 workflows, runtime scripts, pre-push hook, docs, skills, and prompts to 📌 Review Metadata
🔴 Critical Issues (Must Fix - Blocks Merge)✅ [FIXED] Previous CRITICAL issue (commit ✅ All previously reported critical issues have been resolved. No new critical issues identified.
|
| Principle | Score | Notes |
|---|---|---|
| Single Responsibility | 7/10 | devenv.nix mixes derivations, env, task, and profiles, but this is the canonical devenv layout and concerns are clearly sectioned. |
| Open/Closed | 8/10 | Additive profiles.{default,unit,graphics} design makes adding new profiles trivial without touching the base. |
| Liskov Substitution | 7/10 | Profiles compose predictably on top of the common foundation. |
| Interface Segregation | 8/10 | Three narrow profiles cleanly segregate CPU-only vs graphics vs full local dev. |
| Dependency Inversion | 7/10 | Single nixpkgs pin via devenv.yaml/devenv.lock for all profile packages and the SDL3/vulkan-loader versions that govern correctness; ad-hoc Lavapipe fetch intentionally stays floating to match the binary cache. |
| Average | 7.4 |
🎯 Final Assessment
Overall Confidence Score: 80%
Confidence Breakdown:
- Code Quality: 85% (clean mechanical sweep, faithful verbatim port of derivations, well-commented Nix, MEDIUM fixes retained)
- Completeness: 80% (migration functionally complete; previous CRITICAL cleanly reverted with sound root-cause analysis; pending only empirical CI confirmation)
- Risk Level: 75% (configuration now matches dev's known-good 2026-07-08 green state; the in-progress
integration-test/benchmarkgates are the final confirmation that SDL3 — not layer version — was the regression) - Test Coverage: 80% (existing CI is the verification surface;
fmt/build/changesalready green onf7f8888; integration/benchmark running)
Merge Readiness:
- All critical issues resolved
- SOLID average score >= 6.0
- Overall confidence >= 60%
- No security concerns
- [~] Tests present and passing —
fmt/build/changesgreen;integration-test/benchmarkgates still in_progress onf7f8888at review time and must be confirmed green as the merge condition
Verdict:
MERGE — The previously-reported CRITICAL (broken Lavapipe pinning) is cleanly resolved by reverting to floating nixpkgs# resolution, the previously-fixed MEDIUMs are retained, and the configuration now matches dev's last known-good integration state (pinned SDL3 3.4.10 + floating validation layers); confirm the in-progress integration-test and benchmark gates are green on f7f8888 as the merge condition.
Machine Readable Verdict
{
"reviewed_sha": "f7f888893a6a49fbb32b58e302619dda14e9616f",
"critical_issues": 0,
"high_priority_issues": 0,
"medium_priority_issues": 0,
"overall_confidence_score": 80,
"recommendation": "MERGE"
}


Summary
Migrates the entire developer environment and CI from a hand-rolled Nix flake (
flake.nix+flake-utils) to devenv. The four C/C++ derivations (zig 0.16.0, cimgui, rmlui, rmlui-bridge) and theZIGCRAFT_DYNAMIC_LINKER/ZIGCRAFT_RUNTIME_LIBRARY_PATHruntime-loader mechanism are ported verbatim, so the binaries produced are identical.Key decisions (decided up-front in planning)
devenv.nixexposes the common foundation; three additive profiles mirror the old devShells:unit(lean CPU: kcov, shellcheck — no mesa/weston/zls)graphics(mesa/Lavapipe + weston)default(full local-dev: zls, mesa, weston, kcov — auto-activated by.envrc)nix build -L→ devenv task — thezigcraft:buildtask replacespackages.default; produces the Debug x86_64-linux binary with the nixpkgs rpath baked in via patchelf..envrcusesuse devenv --profile default.devenv shell <cmd>form (CI usesdevenv shell --profile <unit|graphics> --).Commits (8, ordered)
feat: add devenv shell configuration alongside nix flake—devenv.nix/devenv.yaml/devenv.lock/.envrcci: add setup-devenv action, migrate weston/zig-cache, add zigcraft taskci: migrate build.yml(nix build -L→devenv tasks run zigcraft:build)ci: migrate remaining workflows(11 workflows +labeler.yml)fix: use namespaced devenv task name zigcraft:build— barezigcraftfaileddevenv shellvalidation; devenv task names requirenamespace:namerefactor: migrate dev scripts, pre-push hook, shader error stringsdocs: migrate all docs, skills, and prompts(23 files)chore: remove nix flake and setup-nix actionScope touched
devenv.nix(+624 lines),devenv.yaml,devenv.lock,.envrc,.gitignore.github/actions/setup-devenv/; all 12 workflows;start-weston,setup-zig-cache,labeler.yml; removedsetup-nix.githooks/pre-push, 3 Zig shader error stringsVerification
devenv infoevaluates;ZIGCRAFT_DYNAMIC_LINKER/ZIGCRAFT_RUNTIME_LIBRARY_PATHresolve to the nixpkgs glibc loader + 9-library path.unithas no weston/mesa,graphicshas weston,defaulthas zls.IN_NIX_SHELL=impureis set by devenv, soscripts/run_benchmark.shneeded no logic change (only its fallback wrapper updated).zig buildlinkszigcraft/benchmark/robust-demoend-to-end indevenv shell --profile unit(exit 0).nix develop/nix flake/setup-nix/flake-utilsreferences.Notes for reviewers
devenv.nix/devenv.yaml/devenv.lock), so the first CI run after merge will be cold.devenvinstalled (nix profile add nixpkgs#devenv) in addition to Nix; direnv is optional but recommended. CONTRIBUTING prerequisites updated.nix run nixpkgs#gitleaks|trivy/nix shell nixpkgs#imagemagickinsecurity.yml/visual-test.ymlare intentionally retained — Nix remains installed under devenv.platform-build(Windows/macOS) is unchanged; it never used Nix.Migration notes
Remaining "Nix" mentions in docs are the accurate "Nix-based" / "required by devenv" qualifiers — devenv still runs on a Nix daemon.
🤖 Generated with assistance from opencode