Skip to content

feat(pnpm): add dependency materialization profiles#829

Merged
schickling merged 25 commits into
mainfrom
schickling/2026-06-22-dmp-e2e
Jun 24, 2026
Merged

feat(pnpm): add dependency materialization profiles#829
schickling merged 25 commits into
mainfrom
schickling/2026-06-22-dmp-e2e

Conversation

@schickling-assistant

@schickling-assistant schickling-assistant commented Jun 22, 2026

Copy link
Copy Markdown
Collaborator

Problem

pnpm dependency materialization currently has several valid realization modes: live local installs, shared content stores, CI-local stores, and Nix-prepared dependency artifacts. Those modes can share expensive content, but they do not yet expose a stable profile/evidence boundary that says which inputs define the dependency boundary, who may repair or garbage-collect it, and which consumers can safely reuse it.

Without that boundary, local repair actions can be too blunt, Nix FOD reuse is harder to reason about, and future Buck2 consumers would have to infer dependency identity from node_modules layout details.

Goal

Introduce an additive dependency materialization profile foundation that can become the shared contract for pnpm, Nix-prepared dependencies, and future Buck2 consumers without changing live install defaults in the first milestone.

Epic checklist:

  • M1: add the generated dependency-materialization-profile/v0 contract section.
  • M1: add shell helpers for profile emission, shared-pool doctor decisions, and coordinated repair planning.
  • M1: expose mk-pnpm-cli prepared-deps profile/evidence passthru for Nix consumers.
  • M1: prove stable identity, fail-closed traits, optional-input accuracy, source-path insensitivity, and consumer-name insensitivity.
  • M2: wire live pnpm:install profile registry/evidence emission into the devenv task path.
  • M3: add read-only pnpm:doctor diagnostics that consume live registry evidence and refuse raw prune for shared content pools.
  • M4: add shared registry aggregation plus coordinated repair/rebuild execution for all roots sharing a content pool.
  • M5: align prepared-deps FOD freshness with the profile/evidence identity rather than package-name-specific assumptions.
  • M6: add a Buck2-facing evidence adapter that consumes profiles without owning live materialization.
  • M7: benchmark cache efficiency across isolated, split shared-content, CI-local, and Nix-prepared modes on macOS and Linux/ext4.
  • M8: validate downstream adoption and decide whether feat(workspace-tools): share external install-root deps FOD by member-set profile #791 should be stacked under, absorbed by, or superseded by this profile shape.
  • M9: migrate the reusable live-pnpm, projection, Nix prepared-deps, store-authority, Buck2 evidence, and observability VRS from dotfiles into the effect-utils dependency materialization hierarchy.
  • M10: apply sk-patterns-vrs/sk-vrs-interview refinement: add intuition, glossary, ownership decision, child requirement Refines links, and spec requirement-trace tables.
  • M11: resolve DQ1 for bin projection: effect-utils-owned manifest projector with pnpm bin-linking packages as conformance oracles, not runtime authority.
  • M12: resolve DQ2 for native package classification by making pure-package-artifact canonical in code and VRS, and add a verification subsystem with self-contained imported research notes for the long-term proof/benchmark categories.
  • M13: resolve DQ3 for prepared-deps scan transition: strict scan enforcement uses one convergent v18 artifact version bump and hash refresh; no report-only or profile-gated legacy scan modes.
  • M14: resolve DQ4 by keeping FOD hash evidence generated by repair tooling and refusing committed per-target witness files.

Decisions

  • The dependency materialization VRS is now owned by effect-utils as a composed hierarchy. dotfiles keeps fleet and orchestration policy, while effect-utils owns reusable pnpm, projection, prepared-deps, store-authority, Buck2 evidence, and producer-observability contracts.

  • Start with an additive contract and evidence surface rather than changing live install behavior. That keeps this PR safe while making later repair and Buck2 integration explicit.

  • Separate profile identity from exact artifact evidence. A profile describes the dependency boundary and policy; evidence also carries the concrete depsHash for the prepared artifact.

  • Keep native Node package linking out of the prepared-deps profile identity in M1. Those packages are linked into the final CLI workspace after prepared dependency restoration, so treating them as prepared dependency identity would alias unrelated concepts.

  • Report only optional files that actually exist as evidence inputs. Optional candidates like pnpm-install-contract.json or tsconfig.base.json must not appear in public evidence for downstream fixtures that do not stage them.

  • Absorb feat(workspace-tools): share external install-root deps FOD by member-set profile #791's external-root FOD dedup goal into the dependency-materialization profile shape: prepared-deps profile keys now include staged manifest freshness and root patch authority, so shared FOD names are consumer-invariant without aliasing distinct dependency inputs.

Verification

Focused checks run on the rebased stack:

Docs migration follow-up on dfd9333e
=> added context/dependency-materialization child VRS nodes for live pnpm, projections, Nix prepared deps, FOD hash evidence, native Node packages, store authority, Buck2 evidence, and observability.
=> git diff --check passed in effect-utils.
=> stale old-path reference scan passed in dotfiles after cleanup commit abb3a59ad.

VRS refinement follow-up on bd105112
=> added root intuition, glossary, and .decisions/0001-effect-utils-owns-dependency-materialization-vrs.md.
=> added Refines links for every child requirement and requirement-trace tables for every DMP spec.
=> git diff --check passed; child requirement/Refines counts matched; stale old-path/migration wording scan passed.

DQ1 bin projection follow-up on d6a0a909
=> accepted effect-utils-owned manifest projector; pnpm bin-linking packages are conformance oracles only.
=> recorded .decisions/0002-effect-utils-owned-bin-projection.md and projection experiment evidence.
=> npm metadata checked /bins.linker.0.16, /bins.resolver.0.8, /link-bins.3.8, bin-links.0.0, cmd-shim.0.2.
=> scratch fixture showed --ignore-scripts still links ordinary bins and missing targets are skipped/warned rather than lifecycle-repaired.
=> git diff --check passed.

DQ2 native classification and verification follow-up
=> accepted `pure-package-artifact` as the canonical native policy tag in code and VRS.
=> recorded .decisions/0003-native-policy-pure-package-artifact.md.
=> added context/dependency-materialization/07-verification with fixture, proof, benchmark, real-workload, and cross-system evidence tiers.
=> imported the downstream dependency-profile research into self-contained effect-utils .research and .experiments notes; the downstream draft no longer remains a parallel VRS source.
=> bash genie/ci-scripts/native-dep-policy-audit.test.sh passed.
=> git diff --check passed.
=> devenv tasks run lint:check:format --no-tui --mode before passed after running lint:fix:format.
=> devenv tasks run check:quick --no-tui --mode before remains locally blocked by the known Darwin pnpm `Abort trap: 6` during pnpm:install.

DQ3 prepared-deps strict scan transition follow-up
=> accepted one convergent `v18` prepared artifact version bump for strict scan enforcement.
=> recorded .decisions/0004-strict-prepared-scan-v18.md and removed DQ3 from root open design questions.
=> updated prepared-deps specs to reject report-only/profile-gated legacy scan modes for the strict-scan transition.
=> bash genie/ci-scripts/native-dep-policy-audit.test.sh passed.
=> git diff --check passed.
=> devenv tasks run lint:check:format --no-tui --mode before passed.

Tool-neutral FOD evidence follow-up
=> rejected committed per-target FOD witness boilerplate; depsBuilds.*.hash remains the only committed hash authority.
=> recorded .decisions/0005-fod-repair-targets-are-eval-metadata.md and resolved DQ4.
=> FOD hash evidence is generated by passthru, nix eval, CI, or hash repair runs; repair tooling owns cross-system measurement and shared/split collapse decisions.
=> git diff --check passed.
=> mk-pnpm-cli now exposes generated fodHashRepairTargets passthru and wrapped CLI packages propagate it for hash repair discovery.
=> pure-eval downstream fixture proves repair target kind, profile-key alignment, and hash paths.
=> nixfmt --check passed for changed Nix files.
=> added a spec-only Hash Authority And Proof Lanes section: structural proof checks target/evidence shape, while value proof owns current bytes; shared hashes remain preferred only when measured outputs converge.
=> git diff --check passed; no PR review threads were pending for via gh pr-review.

bash nix/devenv-modules/tasks/shared/tests/pnpm.test.sh
=> All pnpm task helper tests passed; 38 tests; 3.18s wall after same-profile multi-root shared-registry coverage.

bash nix/devenv-modules/tasks/shared/tests/pnpm-task-smoke.test.sh
=> passed with live profile/registry evidence, repair-plan, explicit pnpm:repair assertions, and CI-local profile trait coverage; 21.59s wall.

nix build --no-link --no-write-lock-file --override-input effect-utils path: \
  path:/nix/workspace-tools/lib/mk-pnpm-cli/tests/fixtures/downstream#checks..pure-eval-dependency-materialization-evidence
=> passed; 13.87s wall after adding freshness and Buck2 evidence assertions.

nix build --no-link --no-write-lock-file --override-input effect-utils path: \
  path:/nix/workspace-tools/lib/mk-pnpm-cli/tests/fixtures/downstream#checks..pure-eval-profile-dedup
=> passed; 97.90s wall proving #791-style external-root dedup still holds.

nix-instantiate --parse nix/workspace-tools/lib/dependency-materialization-profile.nix >/dev/null
=> passed; 0.070s wall.

git diff --check
=> passed.

nix build --no-link --no-write-lock-file .#packages.$SYSTEM.genie -L
=> passed; 6:56.99 wall on the post-rebase run.

The genie build verified the repaired prepared-deps hash and smoke-tested genie --help. Build logs reported workspace-restore at 149.244s, bun-build at 7.349s, and build-complete at 177.598s.

Fresh CI-red FOD reconciliation on 2026-06-23:

gh-ci-utils logs overengineeringstudio/effect-utils#829 --error
=> run 28009046288 failed at the lower FOD layer: notion-cli-unwrapped-pnpm-deps-* and megarepo-pnpm-deps-* reported stale declared hashes across the dependent jobs.

hash repair reconciliation ...
=> failed with "could not determine --hash-source", confirming the current hash repair tooling capability gap for this repo.s nested mkPnpmCli depsBuilds hash source.

Commit 9a9e7e2b
=> refreshed the two managed hashes using the CI-observed Nix mismatch values. The next CI run cleared those FOD checks, typecheck, lint, integration, and closure-size surfaces.

gh-ci-utils logs overengineeringstudio/effect-utils#829 --error
=> run 28011742597 then exposed the next FOD cascade: workflow-report-unwrapped-pnpm-deps-* and tui-stories-unwrapped-pnpm-deps-* reported stale declared hashes.

Commit 0f99da48
=> refreshed the next two managed hashes using the CI-observed Nix mismatch values. The next CI run cleared both FOD checks, deploy-storybooks, typecheck, lint, tests, integration, and closure-size surfaces, then exposed one more lower-layer FOD in Linux nix-check.

gh-ci-utils logs overengineeringstudio/effect-utils#829 --error --job nix-check
=> run 28012082825 reported notion-md-unwrapped-pnpm-deps-* with stale declared hash.

Commit beaa333a
=> refreshed the final observed managed hash using the CI-observed Nix mismatch value. Run 28012500635 cleared the FOD and product checks, then exposed a `devenv-perf` warm `check:quick` failure caused by `lint:nix:format` finding unformatted Nix files.

Commit 4fced052
=> formatted the reported Nix files and verified `git ls-files '*.nix' | xargs nixfmt --check` plus `git diff --check`. Run 28012966874 is the clean confirmation run for this batch.

git diff --check
=> passed.

Benchmark/cache-efficiency matrix from the focused proof work:

mode                         platform proof                         cache-efficiency signal
isolated live store          macOS helper test                       1 root/1 files pool; profile-local prune allowed
split shared-content store   macOS helper + smoke tests              2 same-profile roots/1 files pool; raw prune refused; repair roots=2
CI-local live store          macOS generated-task smoke with CI=1     ciJobLocal profile trait emitted; repair stays explicit
Nix-prepared deps            macOS downstream checks                  shared external-root FOD dedup holds; evidence 13.87s, dedup 97.90s
Nix-prepared deps            x86_64-linux remote builder              evidence 19.47s, dedup 17.17s cached

GitHub Actions CI on head beaa333abcf41c5f5945251474f980a9e92b5f51:

CI run 28012966874 => all checks passed.
devenv-perf 9m10s; nix-check linux 5m21s; nix-check macOS 8m29s; nix-fod-check linux 2m54s; nix-fod-check macOS 3m53s; test linux 4m58s; test macOS 7m51s.

Complexity

This adds one small Nix library and shell helper functions. The complexity is justified because dependency materialization identity is cross-cutting: shell install tasks, Nix FODs, future repair tools, and Buck2 consumers need the same vocabulary instead of each inferring from pnpm internals.

Concerns

  • Live pnpm:install now emits dependency materialization profile evidence and updates a shared aggregate registry beside the files-pool root.
  • pnpm:repair is explicit operator remediation, not a status/doctor dependency; it skips stale registered roots and force-rebuilds live roots under per-store locks.
  • mk-pnpm-cli evidence is prepared-deps evidence, not a full final workspace bill of materials.
  • Related PR feat(workspace-tools): share external install-root deps FOD by member-set profile #791 is now functionally superseded by this branch's content-fresh prepared-deps profile key and downstream profile-dedup proof.

Friction & bottlenecks

  • devenv shell -- dt --no-tui genie:run was killed with exit 137 after building the dev shell graph. The generated contract file was already updated, but this is a real local proof-surface bottleneck.
  • The current repair tooling rejected the nested depsBuilds.".".hash shape for these mkPnpmCli prepared-deps hashes (could not determine --hash-source). The CI-red hashes for notion-cli-unwrapped-pnpm-deps-*, megarepo-pnpm-deps-*, workflow-report-unwrapped-pnpm-deps-*, tui-stories-unwrapped-pnpm-deps-*, and notion-md-unwrapped-pnpm-deps-* were therefore reconciled from the CI-observed Nix mismatch hashes. Local exact Nix proof was constrained by a congested local daemon, so the clean GitHub run is the final confirmation surface for this FOD batch.
  • The post-rebase genie build took 6:56.99 wall, dominated by prepared workspace restoration. That is a concrete benchmark target for later cache-efficiency work.

Follow-ups

References

Refs #773.
Refs #791.
Related: #828.

PR review follow-up

  • Fixed the shared repair registry flow so pnpm:repair-plan and pnpm:repair read sibling roots from the shared registry when present, with local fallback only for the current pool id.
  • Preserved pure install policy during repair by routing forced repair installs through the generated run_pnpm_install --force path.
  • Made registry writes replace stale same-root profile rows when the profile id changes.
  • Verified with bash nix/devenv-modules/tasks/shared/tests/pnpm.test.sh, bash nix/devenv-modules/tasks/shared/tests/pnpm-task-smoke.test.sh, nixfmt --check for changed Nix files, bash -n for touched shell files, and git diff --check.

VRS timelessness follow-up

  • Made the verification VRS self-contained by replacing source-specific research consolidation language with a generic evidence intake and graduation contract.
  • Expanded 07-verification/.research/ with self-contained design findings and a proof/benchmark catalog, and kept the non-normative consolidation record in 07-verification/.experiments/.
  • Verified that 07-verification/requirements.md and 07-verification/spec.md no longer reference concrete research PRs or dotfiles-owned VRS state.
Posted on behalf of @schickling
field value
agent_name 💰 co3-copper
agent_session_id b67dd182-81b8-432e-b57d-116d18fcae8b
agent_tool Codex CLI
agent_tool_version 0.141.0
agent_runtime Codex CLI 0.141.0
agent_model unknown
runtime_profile /nix/store/krn8q2r4469pp3yraw1g1kybiyyh9s8k-coding-agent-runtime-profile/share/coding-agents/profile.json
skills_manifest /nix/store/aargml0mz52m6zhz064j0w1dz3xssrgx-agent-skills-corpus/share/agent-skills/manifest.json
worktree effect-utils/schickling/2026-06-22-dmp-e2e
machine mbp2025
tooling_profile dotfiles@3add961

@schickling-assistant schickling-assistant added type:epic Large tracking issue with child tasks · Set: manual origin:agent Filed or primarily produced by an AI agent · Set: AI agent or manual type:feature New user-visible or system capability · Set: manual area:nix Nix flakes, derivations, FOD hashes, builders · Set: manual measurement-validation Temporary PR validates CI measurement/reporting behavior · Set: manual area:devenv devenv tasks, inputs, and environment configuration · Set: manual labels Jun 22, 2026
@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown

Storybook Previews

No storybooks were deployed.

github-actions Bot added a commit that referenced this pull request Jun 23, 2026
github-actions Bot added a commit that referenced this pull request Jun 23, 2026
@github-actions

github-actions Bot commented Jun 23, 2026

Copy link
Copy Markdown

CI Measurements

partial - advisory gate - readiness partial (15/26 enabled observations gateable) - commit 6b93220 - protocol devenv-perf-warm-median-v2

No regressions. Comparable movement is below the semantic impact threshold; neutral rows are collapsed below.

Measurement change vs baseline chart

SVG source

devenv / quality gates

What changed? Group Probe Baseline -> current Raw change Impact Confidence
no material impact devenv / quality gates Forced check:quick 11.504 s -> 17.619 s +6.115 s / 53.2% +2.54x paired n=0, 25-75% delta 4.389 s..7.841 s

nix / closures / packages

What changed? Group Probe Baseline -> current Raw change Impact Confidence
no material impact nix / closures / packages Total closure size 144.4 MiB -> 166 MiB +21.5 MiB / 14.9% +0.23x within_budget, baseline n=9, current n=1
no material impact nix / closures / packages Total serialized NAR size 144.4 MiB -> 166 MiB +21.5 MiB / 14.9% +0.2x within_budget, baseline n=9, current n=1
unchanged nix / closures / packages Nix sources closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
unchanged nix / closures / packages Nix sources closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
unchanged nix / closures / packages Nix sources closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
unchanged nix / closures / packages Node / pnpm closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
unchanged nix / closures / packages Rust closure size 0 B -> 0 B +0 B / n/a n/a unknown, baseline n=9, current n=1
Unchanged / 0-impact measurements (14)

These rows had compatible baseline data, but their semantic impact rounded to 0.00x because the movement was below the configured budget, below the noise floor, or inside the robust noise band.

devenv / devenv cli

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / devenv cli devenv tasks list 0.041 s -> 0.042 s +0.001 s / 2.4% 0.00x yes paired n=9, 25-75% delta 0 s..0.001 s Too small to matter
devenv / devenv cli devenv processes --help 0.017 s -> 0.017 s +0 s / 0% 0.00x yes paired n=9, 25-75% delta 0 s..0.003 s Too small to matter

devenv / devenv shell

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / devenv shell Warm shell eval 8.074 s -> 7.986 s -0.088 s / -1.1% 0.00x yes paired n=5, 25-75% delta -0.142 s..-0.027 s Too small to matter

devenv / genie

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / genie Genie check task 4.388 s -> 4.546 s +0.158 s / 3.6% 0.00x yes paired n=5, 25-75% delta -0.078 s..0.177 s Unchanged
devenv / genie Genie run task 1.353 s -> 1.27 s -0.083 s / -6.1% 0.00x yes paired n=5, 25-75% delta -0.449 s..0.025 s Too small to matter

devenv / quality gates

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / quality gates Warm cached check:quick 3.082 s -> 3.359 s +0.277 s / 9% 0.00x low_paired_sample_count paired n=0, 25-75% delta -0.031 s..0.586 s Needs paired evidence

devenv / workspace setup

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
devenv / workspace setup pnpm install task 0.627 s -> 0.637 s +0.01 s / 1.6% 0.00x yes paired n=5, 25-75% delta 0.01 s..0.014 s Too small to matter

nix / closures / packages

Group Probe Baseline -> current Raw change Impact Gate Evidence Why hidden
nix / closures / packages Total closure size 156.3 MiB -> 151.7 MiB -4.6 MiB / -3% 0.00x yes noise_floor, baseline n=9, current n=1 Too small to matter
nix / closures / packages Total serialized NAR size 156.3 MiB -> 151.7 MiB -4.6 MiB / -3% 0.00x yes within_budget, baseline n=9, current n=1 Slightly lower, ok
nix / closures / packages Total closure size 535.9 MiB -> 540.3 MiB +4.4 MiB / 0.8% 0.00x yes noise_floor, baseline n=9, current n=1 Too small to matter
nix / closures / packages Total serialized NAR size 535.9 MiB -> 540.3 MiB +4.4 MiB / 0.8% 0.00x yes within_budget, baseline n=9, current n=1 Slightly higher, ok
nix / closures / packages Total closure path count 79 count -> 79 count +0 count / 0% 0.00x yes noise_floor, baseline n=9, current n=1 Too small to matter
nix / closures / packages Total closure path count 5 count -> 5 count +0 count / 0% 0.00x yes noise_floor, baseline n=9, current n=1 Too small to matter
nix / closures / packages Total closure path count 8 count -> 8 count +0 count / 0% 0.00x yes noise_floor, baseline n=9, current n=1 Too small to matter
Diagnostic / ungated measurements (7)

source / effect-utils

Group Probe Current Baseline Impact Gate Reason Evidence
source / effect-utils Genie runtime lines 20857 lines 20266 lines diagnostic disabled Diagnostic only diagnostic, baseline n=9, current n=70
source / effect-utils Nix workspace tools lines 3995 lines 3694 lines diagnostic disabled Diagnostic only diagnostic, baseline n=9, current n=15
source / effect-utils Genie CI workflow helpers lines 7506 lines 7418 lines diagnostic disabled Diagnostic only diagnostic, baseline n=9, current n=9
source / effect-utils Genie runtime files 70 count 67 count diagnostic disabled Diagnostic only diagnostic, baseline n=9, current n=70
source / effect-utils Nix workspace tools files 15 count 14 count diagnostic disabled Diagnostic only diagnostic, baseline n=9, current n=15
source / effect-utils Genie CI workflow helpers files 9 count 9 count diagnostic disabled Diagnostic only diagnostic, baseline n=9, current n=9

devenv / devenv shell

Group Probe Current Baseline Impact Gate Reason Evidence
devenv / devenv shell Shell eval with OTEL trace 107.714 s n/a n/a missing_baseline No baseline yet missing_baseline, baseline n=0, current n=1
All measurements
Status Gate Target Observation Dimensions Baseline Current Delta Ratio Impact
pass low_paired_sample_count Dev shell Forced check:quick aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=3
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=null
pairedOrderSeed=null
pairedSampleCount=0
phase=warm
probe=task_check_quick_forced
probeLabel=Forced check:quick
sampleCount=6
status=0
taskCacheMode=refresh
warmupCount=0
workload=forced-task-cache
11.504 s 17.619 s +6.115 s 53.2% +2.54x
pass yes Megarepo package Total closure size bucket=total 144.4 MiB 166 MiB +21.5 MiB 14.9% +0.23x
pass yes Megarepo package Total serialized NAR size bucket=total
sizeKind=nar
144.4 MiB 166 MiB +21.5 MiB 14.9% +0.2x
pass yes oxlint npm package Total closure size bucket=total 156.3 MiB 151.7 MiB -4.6 MiB -3% 0.00x
pass yes oxlint npm package Total serialized NAR size bucket=total
sizeKind=nar
156.3 MiB 151.7 MiB -4.6 MiB -3% 0.00x
pass yes Genie package Total closure size bucket=total 535.9 MiB 540.3 MiB +4.4 MiB 0.8% 0.00x
pass yes Genie package Total serialized NAR size bucket=total
sizeKind=nar
535.9 MiB 540.3 MiB +4.4 MiB 0.8% 0.00x
pass disabled effect-utils repository Genie runtime lines scope=genie_runtime 20266 lines 20857 lines +591 lines 2.9% diagnostic
pass disabled effect-utils repository Nix workspace tools lines scope=nix_workspace_tools 3694 lines 3995 lines +301 lines 8.1% diagnostic
pass disabled effect-utils repository Genie CI workflow helpers lines scope=genie_ci_workflow 7418 lines 7506 lines +88 lines 1.2% diagnostic
pass disabled effect-utils repository Genie runtime files scope=genie_runtime 67 count 70 count +3 count 4.5% diagnostic
pass disabled effect-utils repository Nix workspace tools files scope=nix_workspace_tools 14 count 15 count +1 count 7.1% diagnostic
pass low_paired_sample_count Dev shell Warm cached check:quick aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=null
pairedOrderSeed=null
pairedSampleCount=0
phase=warm
probe=task_check_quick_warm
probeLabel=Warm cached check:quick
sampleCount=11
status=0
taskCacheMode=warm
warmupCount=1
workload=cached-no-op
3.082 s 3.359 s +0.277 s 9% 0.00x
pass yes Dev shell Genie check task aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2
pairedSampleCount=5
phase=warm
probe=genie_check_task
probeLabel=Genie check task
sampleCount=11
status=0
warmupCount=1
4.388 s 4.546 s +0.158 s 3.6% 0.00x
pass yes Dev shell Warm shell eval aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2
pairedSampleCount=5
phase=warm
probe=shell_eval_warm
probeLabel=Warm shell eval
sampleCount=11
status=0
warmupCount=1
8.074 s 7.986 s -0.088 s -1.1% 0.00x
pass yes Dev shell Genie run task aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2
pairedSampleCount=5
phase=warm
probe=task_genie_run
probeLabel=Genie run task
sampleCount=11
status=0
warmupCount=1
1.353 s 1.27 s -0.083 s -6.1% 0.00x
pass yes Dev shell pnpm install task aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=5
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2
pairedSampleCount=5
phase=warm
probe=task_pnpm_install
probeLabel=pnpm install task
sampleCount=11
status=0
warmupCount=1
0.627 s 0.637 s +0.01 s 1.6% 0.00x
pass yes Dev shell devenv tasks list aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=9
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2
pairedSampleCount=9
phase=warm
probe=tasks_list
probeLabel=devenv tasks list
sampleCount=19
status=0
warmupCount=1
0.041 s 0.042 s +0.001 s 2.4% 0.00x
pass yes Dev shell devenv processes --help aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=9
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2
pairedSampleCount=9
phase=warm
probe=processes_help
probeLabel=devenv processes --help
sampleCount=19
status=0
warmupCount=1
0.017 s 0.017 s +0 s 0% 0.00x
pass disabled effect-utils repository Genie CI workflow helpers files scope=genie_ci_workflow 9 count 9 count +0 count 0% diagnostic
unknown missing_baseline Genie package Nix sources closure size bucket=nix-sources 0 B 0 B +0 B n/a n/a
unknown missing_baseline Megarepo package Nix sources closure size bucket=nix-sources 0 B 0 B +0 B n/a n/a
unknown missing_baseline oxlint npm package Nix sources closure size bucket=nix-sources 0 B 0 B +0 B n/a n/a
unknown missing_baseline Genie package Node / pnpm closure size bucket=node 0 B 0 B +0 B n/a n/a
unknown missing_baseline Megarepo package Node / pnpm closure size bucket=node 0 B 0 B +0 B n/a n/a
unknown missing_baseline oxlint npm package Node / pnpm closure size bucket=node 0 B 0 B +0 B n/a n/a
unknown missing_baseline Genie package Rust closure size bucket=rust 0 B 0 B +0 B n/a n/a
unknown missing_baseline Megarepo package Rust closure size bucket=rust 0 B 0 B +0 B n/a n/a
unknown missing_baseline oxlint npm package Rust closure size bucket=rust 0 B 0 B +0 B n/a n/a
pass yes Genie package Total closure path count bucket=total 79 count 79 count +0 count 0% 0.00x
pass yes Megarepo package Total closure path count bucket=total 5 count 5 count +0 count 0% 0.00x
pass yes oxlint npm package Total closure path count bucket=total 8 count 8 count +0 count 0% 0.00x
missing_baseline missing_baseline Dev shell Shell eval with OTEL trace aggregation=median
devenvRev=2cf62a010000b70f15c78a72761fad7c9e6fb47a
measuredSampleCount=1
measurementProtocol=devenv-perf-warm-median-v2
otelServiceName=devenv-perf-ci
pairedOrderProtocol=balanced-seeded-alternating-v1
pairedOrderSeed=28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2
pairedSampleCount=1
phase=warm
probe=shell_eval_traced
probeLabel=Shell eval with OTEL trace
sampleCount=2
status=0
warmupCount=0
n/a 107.714 s n/a n/a n/a
Previous runs
Commit Status Gate Top changes
3aaeb09 partial advisory Needs paired evidence Dev shell Warm cached check:quick -0.89 s / -27.3%
Needs paired evidence Dev shell Forced check:quick +4.914 s / 39.5%
Slightly higher, ok Megarepo package Total closure size +21.5 MiB / 14.9%
c2a7d9b partial advisory Needs paired evidence Dev shell Warm cached check:quick -0.988 s / -30.3%
Needs paired evidence Dev shell Forced check:quick +3.062 s / 24.6%
Slightly higher, ok Megarepo package Total closure size +21.5 MiB / 14.9%
c06ef55 partial advisory Needs paired evidence Dev shell Forced check:quick +4.651 s / 37.4%
Needs paired evidence Dev shell Warm cached check:quick -0.769 s / -23.6%
Slightly higher, ok Megarepo package Total closure size +21.5 MiB / 14.9%
962f81a partial advisory Needs paired evidence Dev shell Warm cached check:quick -0.912 s / -27.9%
Needs paired evidence Dev shell Forced check:quick +3.296 s / 26.5%
Slightly higher, ok Megarepo package Total closure size +21.5 MiB / 14.9%
d066b54 partial advisory Needs paired evidence Dev shell Warm cached check:quick -0.949 s / -29.1%
Slightly higher, ok Megarepo package Total closure size +21.5 MiB / 14.9%
Needs paired evidence Dev shell Forced check:quick +2.26 s / 18.2%
4fced05 partial advisory Needs paired evidence Dev shell Forced check:quick +4.809 s / 38.4%
Slightly higher, ok Megarepo package Total closure size +21.6 MiB / 14.9%
Slightly higher, ok Megarepo package Total serialized NAR size +21.6 MiB / 14.9%
Source-of-truth JSON
{
  "schemaVersion": 1,
  "title": "CI Measurements",
  "status": "partial",
  "gate": "advisory",
  "readiness": "partial (15/26 enabled observations gateable)",
  "commit": {
    "shortSha": "6b93220",
    "sha": "6b932202a6f027fcdfc480b8d5bdc349075ac18e"
  },
  "run": {
    "id": "28105522578",
    "attempt": "1",
    "url": "https://github.com/overengineeringstudio/effect-utils/actions/runs/28105522578"
  },
  "baseline": null,
  "protocol": "devenv-perf-warm-median-v2",
  "chart": {
    "meaning": "semantic-impact",
    "zeroImpactMeaning": "no actionable PR impact after budgets, noise floor, and robust evidence checks",
    "svg": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-829/6b932202a6f027fcdfc480b8d5bdc349075ac18e/run-28105522578-attempt-1/ci-measurements.svg",
    "lightPng": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-829/6b932202a6f027fcdfc480b8d5bdc349075ac18e/run-28105522578-attempt-1/ci-measurements.png",
    "darkPng": "https://raw.githubusercontent.com/overengineeringstudio/effect-utils/ci-measurement-assets/ci-measurements/pr-829/6b932202a6f027fcdfc480b8d5bdc349075ac18e/run-28105522578-attempt-1/ci-measurements-dark.png"
  },
  "measurements": [
    {
      "id": "task_check_quick_forced",
      "label": "Forced check:quick",
      "group": "devenv / quality gates",
      "path": [
        "devenv",
        "quality gates",
        "check:quick"
      ],
      "groupPath": [
        "devenv",
        "quality gates"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "low_paired_sample_count",
      "confidence": "low_paired_sample_count",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 11.504000000000001,
      "current": 17.619,
      "delta": 6.114999999999998,
      "ratio": 1.5315542420027815,
      "semanticImpactScore": 2.5436949466852115,
      "semanticImpactKind": "fail_boundary",
      "baselineSources": 4,
      "currentSamples": 3,
      "pairedSamples": 0,
      "evidenceDeltaLower": 4.389399999999998,
      "evidenceDeltaUpper": 7.8405999999999985,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "workload": "forced-task-cache",
        "taskCacheMode": "refresh",
        "probe": "task_check_quick_forced",
        "probeLabel": "Forced check:quick",
        "status": 0,
        "sampleCount": 6,
        "warmupCount": 0,
        "measuredSampleCount": 3,
        "pairedSampleCount": 0,
        "pairedOrderProtocol": null,
        "pairedOrderSeed": null,
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "nix.closure.nar_size",
      "label": "Total closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "total",
        "closure-size",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 151426200,
      "current": 174019736,
      "delta": 22593536,
      "ratio": 1.149204932831967,
      "semanticImpactScore": 0.2309375,
      "semanticImpactKind": "below_warn_boundary",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": 12107776,
      "evidenceDeltaUpper": 33079296,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.serialized_nar_size",
      "label": "Total serialized NAR size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "total",
        "serialized-nar-size",
        "nix closure diagnostics"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "diagnostic",
      "unit": "bytes",
      "baseline": 151426200,
      "current": 174019736,
      "delta": 22593536,
      "ratio": 1.149204932831967,
      "semanticImpactScore": 0.19681973132786795,
      "semanticImpactKind": "below_warn_boundary",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": 7450916,
      "evidenceDeltaUpper": 37736156,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "id": "nix.closure.nar_size",
      "label": "Total closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "total",
        "closure-size",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 163884208,
      "current": 159041232,
      "delta": -4842976,
      "ratio": 0.9704487939435873,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -15328736,
      "evidenceDeltaUpper": 5642784,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.serialized_nar_size",
      "label": "Total serialized NAR size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "total",
        "serialized-nar-size",
        "nix closure diagnostics"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "improved",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "diagnostic",
      "unit": "bytes",
      "baseline": 163884208,
      "current": 159041232,
      "delta": -4842976,
      "ratio": 0.9704487939435873,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -21231396.8,
      "evidenceDeltaUpper": 11545444.8,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "id": "nix.closure.nar_size",
      "label": "Total closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "total",
        "closure-size",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 561922280,
      "current": 566501880,
      "delta": 4579600,
      "ratio": 1.0081498815103043,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -6658845.6,
      "evidenceDeltaUpper": 15818045.6,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.serialized_nar_size",
      "label": "Total serialized NAR size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "total",
        "serialized-nar-size",
        "nix closure diagnostics"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "diagnostic",
      "unit": "bytes",
      "baseline": 561922280,
      "current": 566501880,
      "delta": 4579600,
      "ratio": 1.0081498815103043,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -51612628,
      "evidenceDeltaUpper": 60771828,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total",
        "sizeKind": "nar"
      }
    },
    {
      "id": "source.lines",
      "label": "Genie runtime lines",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "packages",
        "genie",
        "source / genie"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "lines",
      "baseline": 20266,
      "current": 20857,
      "delta": 591,
      "ratio": 1.0291621434915623,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 9,
      "currentSamples": 70,
      "pairedSamples": 0,
      "evidenceDeltaLower": -1435.6000000000001,
      "evidenceDeltaUpper": 2617.6000000000004,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_runtime"
      }
    },
    {
      "id": "source.lines",
      "label": "Nix workspace tools lines",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "nix",
        "workspace-tools",
        "source / nix"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "lines",
      "baseline": 3694,
      "current": 3995,
      "delta": 301,
      "ratio": 1.0814834867352463,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 9,
      "currentSamples": 15,
      "pairedSamples": 0,
      "evidenceDeltaLower": -68.40000000000003,
      "evidenceDeltaUpper": 670.4000000000001,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "nix_workspace_tools"
      }
    },
    {
      "id": "source.lines",
      "label": "Genie CI workflow helpers lines",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "genie",
        "ci-workflow",
        "source / ci"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "lines",
      "baseline": 7418,
      "current": 7506,
      "delta": 88,
      "ratio": 1.011863035858722,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 9,
      "currentSamples": 9,
      "pairedSamples": 0,
      "evidenceDeltaLower": -653.8000000000001,
      "evidenceDeltaUpper": 829.8000000000001,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_ci_workflow"
      }
    },
    {
      "id": "source.files",
      "label": "Genie runtime files",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "packages",
        "genie",
        "source / genie"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 67,
      "current": 70,
      "delta": 3,
      "ratio": 1.044776119402985,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 9,
      "currentSamples": 70,
      "pairedSamples": 0,
      "evidenceDeltaLower": -3.7,
      "evidenceDeltaUpper": 9.7,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_runtime"
      }
    },
    {
      "id": "source.files",
      "label": "Nix workspace tools files",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "nix",
        "workspace-tools",
        "source / nix"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "regressed",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 14,
      "current": 15,
      "delta": 1,
      "ratio": 1.0714285714285714,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 9,
      "currentSamples": 15,
      "pairedSamples": 0,
      "evidenceDeltaLower": -0.40000000000000013,
      "evidenceDeltaUpper": 2.4000000000000004,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "nix_workspace_tools"
      }
    },
    {
      "id": "task_check_quick_warm",
      "label": "Warm cached check:quick",
      "group": "devenv / quality gates",
      "path": [
        "devenv",
        "quality gates",
        "check:quick"
      ],
      "groupPath": [
        "devenv",
        "quality gates"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": false,
      "gateReason": "low_paired_sample_count",
      "confidence": "low_paired_sample_count",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 3.0815,
      "current": 3.359,
      "delta": 0.27749999999999986,
      "ratio": 1.0900535453512898,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 4,
      "currentSamples": 5,
      "pairedSamples": 0,
      "evidenceDeltaLower": -0.030650000000000177,
      "evidenceDeltaUpper": 0.5856499999999999,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "workload": "cached-no-op",
        "taskCacheMode": "warm",
        "probe": "task_check_quick_warm",
        "probeLabel": "Warm cached check:quick",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 0,
        "pairedOrderProtocol": null,
        "pairedOrderSeed": null,
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "genie_check_task",
      "label": "Genie check task",
      "group": "devenv / genie",
      "path": [
        "devenv",
        "genie"
      ],
      "groupPath": [
        "devenv",
        "genie"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "within_budget",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 4.388,
      "current": 4.546,
      "delta": 0.15800000000000036,
      "ratio": 1.0360072926162263,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.078,
      "evidenceDeltaUpper": 0.177,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "genie_check_task",
        "probeLabel": "Genie check task",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "shell_eval_warm",
      "label": "Warm shell eval",
      "group": "devenv / devenv shell",
      "path": [
        "devenv",
        "devenv shell"
      ],
      "groupPath": [
        "devenv",
        "devenv shell"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 8.074,
      "current": 7.986,
      "delta": -0.08800000000000008,
      "ratio": 0.989100817438692,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.142,
      "evidenceDeltaUpper": -0.027,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "shell_eval_warm",
        "probeLabel": "Warm shell eval",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "task_genie_run",
      "label": "Genie run task",
      "group": "devenv / genie",
      "path": [
        "devenv",
        "genie"
      ],
      "groupPath": [
        "devenv",
        "genie"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 1.353,
      "current": 1.27,
      "delta": -0.08299999999999996,
      "ratio": 0.9386548410938655,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": -0.449,
      "evidenceDeltaUpper": 0.025,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "task_genie_run",
        "probeLabel": "Genie run task",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "task_pnpm_install",
      "label": "pnpm install task",
      "group": "devenv / workspace setup",
      "path": [
        "devenv",
        "workspace setup"
      ],
      "groupPath": [
        "devenv",
        "workspace setup"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 0.627,
      "current": 0.637,
      "delta": 0.010000000000000009,
      "ratio": 1.0159489633173844,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 5,
      "currentSamples": 5,
      "pairedSamples": 5,
      "evidenceDeltaLower": 0.01,
      "evidenceDeltaUpper": 0.014,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "task_pnpm_install",
        "probeLabel": "pnpm install task",
        "status": 0,
        "sampleCount": 11,
        "warmupCount": 1,
        "measuredSampleCount": 5,
        "pairedSampleCount": 5,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "tasks_list",
      "label": "devenv tasks list",
      "group": "devenv / devenv cli",
      "path": [
        "devenv",
        "devenv cli"
      ],
      "groupPath": [
        "devenv",
        "devenv cli"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 0.041,
      "current": 0.042,
      "delta": 0.0010000000000000009,
      "ratio": 1.024390243902439,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 9,
      "pairedSamples": 9,
      "evidenceDeltaLower": 0,
      "evidenceDeltaUpper": 0.001,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "tasks_list",
        "probeLabel": "devenv tasks list",
        "status": 0,
        "sampleCount": 19,
        "warmupCount": 1,
        "measuredSampleCount": 9,
        "pairedSampleCount": 9,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "processes_help",
      "label": "devenv processes --help",
      "group": "devenv / devenv cli",
      "path": [
        "devenv",
        "devenv cli"
      ],
      "groupPath": [
        "devenv",
        "devenv cli"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "paired",
      "unit": "seconds",
      "baseline": 0.017,
      "current": 0.017,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 9,
      "pairedSamples": 9,
      "evidenceDeltaLower": 0,
      "evidenceDeltaUpper": 0.003,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "probe": "processes_help",
        "probeLabel": "devenv processes --help",
        "status": 0,
        "sampleCount": 19,
        "warmupCount": 1,
        "measuredSampleCount": 9,
        "pairedSampleCount": 9,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    },
    {
      "id": "source.files",
      "label": "Genie CI workflow helpers files",
      "group": "source / effect-utils",
      "path": [
        "source",
        "effect-utils",
        "genie",
        "ci-workflow",
        "source / ci"
      ],
      "groupPath": [
        "source",
        "effect-utils"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": false,
      "gateReason": "disabled",
      "confidence": "diagnostic",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 9,
      "current": 9,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": null,
      "semanticImpactKind": "diagnostic",
      "baselineSources": 9,
      "currentSamples": 9,
      "pairedSamples": 0,
      "evidenceDeltaLower": -1,
      "evidenceDeltaUpper": 1,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "scope": "genie_ci_workflow"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Nix sources closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "buckets",
        "nix-sources",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "nix-sources"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Nix sources closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "buckets",
        "nix-sources",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "nix-sources"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Nix sources closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "buckets",
        "nix-sources",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "nix-sources"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Node / pnpm closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "buckets",
        "node",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "node"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Node / pnpm closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "buckets",
        "node",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "node"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Node / pnpm closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "buckets",
        "node",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "node"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Rust closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "buckets",
        "rust",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "rust"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Rust closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "buckets",
        "rust",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "rust"
      }
    },
    {
      "id": "nix.closure.bucket.nar_size",
      "label": "Rust closure size",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "buckets",
        "rust",
        "nix closure buckets"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "unknown",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "unknown",
      "comparisonMode": "budget",
      "unit": "bytes",
      "baseline": 0,
      "current": 0,
      "delta": 0,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": "unknown",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10485760,
      "evidenceDeltaUpper": 10485760,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "rust"
      }
    },
    {
      "id": "nix.closure.path_count",
      "label": "Total closure path count",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "genie",
        "total",
        "path-count",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 79,
      "current": 79,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10,
      "evidenceDeltaUpper": 10,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.path_count",
      "label": "Total closure path count",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "megarepo",
        "total",
        "path-count",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 5,
      "current": 5,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10,
      "evidenceDeltaUpper": 10,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "nix.closure.path_count",
      "label": "Total closure path count",
      "group": "nix / closures / packages",
      "path": [
        "nix",
        "closures",
        "packages",
        "oxlint-npm",
        "total",
        "path-count",
        "nix closure"
      ],
      "groupPath": [
        "nix",
        "closures",
        "packages"
      ],
      "status": "pass",
      "direction": "unchanged",
      "gateable": true,
      "gateReason": "eligible",
      "confidence": "noise_floor",
      "comparisonMode": "budget",
      "unit": "count",
      "baseline": 8,
      "current": 8,
      "delta": 0,
      "ratio": 1,
      "semanticImpactScore": 0,
      "semanticImpactKind": "neutral",
      "baselineSources": 9,
      "currentSamples": 1,
      "pairedSamples": 0,
      "evidenceDeltaLower": -10,
      "evidenceDeltaUpper": 10,
      "pairedEvidenceQuantile": 0.25,
      "dimensions": {
        "bucket": "total"
      }
    },
    {
      "id": "shell_eval_traced",
      "label": "Shell eval with OTEL trace",
      "group": "devenv / devenv shell",
      "path": [
        "devenv",
        "devenv shell"
      ],
      "groupPath": [
        "devenv",
        "devenv shell"
      ],
      "status": "missing_baseline",
      "direction": "unknown",
      "gateable": false,
      "gateReason": "missing_baseline",
      "confidence": "missing_baseline",
      "comparisonMode": "historical",
      "unit": "seconds",
      "baseline": null,
      "current": 107.714,
      "delta": null,
      "ratio": null,
      "semanticImpactScore": null,
      "semanticImpactKind": null,
      "baselineSources": 0,
      "currentSamples": 1,
      "pairedSamples": null,
      "evidenceDeltaLower": null,
      "evidenceDeltaUpper": null,
      "pairedEvidenceQuantile": null,
      "dimensions": {
        "probe": "shell_eval_traced",
        "probeLabel": "Shell eval with OTEL trace",
        "status": 0,
        "sampleCount": 2,
        "warmupCount": 0,
        "measuredSampleCount": 1,
        "pairedSampleCount": 1,
        "pairedOrderProtocol": "balanced-seeded-alternating-v1",
        "pairedOrderSeed": "28105522578-1-280ca34979eb3c1fc788cc7b2f7798a1ede45fa2",
        "measurementProtocol": "devenv-perf-warm-median-v2",
        "aggregation": "median",
        "phase": "warm",
        "devenvRev": "2cf62a010000b70f15c78a72761fad7c9e6fb47a",
        "otelServiceName": "devenv-perf-ci"
      }
    }
  ]
}

github-actions Bot added a commit that referenced this pull request Jun 23, 2026
@schickling schickling marked this pull request as ready for review June 23, 2026 09:32
@github-actions github-actions Bot requested a review from schickling June 23, 2026 09:33

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4fced05204

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread nix/devenv-modules/tasks/shared/pnpm.nix Outdated
Comment thread nix/devenv-modules/tasks/shared/pnpm.nix Outdated
Comment thread nix/devenv-modules/tasks/shared/pnpm-task-helpers.sh
@schickling-assistant

Copy link
Copy Markdown
Collaborator Author

Coordination: liveInstallPolicyFlags --ignore-scripts breaks node_modules/.bin under enableGlobalVirtualStore: false

cc @schickling (co3-copper) — flagging this for the DMP work since it's the natural owner of pnpm materialization policy. #829 as-is does not fix it (verified below), and the fix belongs in the install-policy/store-trait layer, not in the consuming repo.

Symptom

On schickling.dev (PR #121), every binary the workspace runs from node_modules/.bin fails in CI:

  • deploy-*: next build --webpacksh: line 1: next: command not found (all 4 Vercel deploys; vercel build runs locally against the CI-materialized tree, installCommand:"true")
  • test:pw:ptg-*: exit 127
  • test:ptg: [ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL] Command "vitest" not found

Root cause

nix/workspace-tools/lib/pnpm-install-policy.nix liveInstallPolicyFlags hardcodes --ignore-scripts (CLI = highest pnpm precedence, overrides any workspace ignoreScripts). Combined with schickling.dev's enableGlobalVirtualStore: false, --ignore-scripts suppresses creation of all node_modules/.bin/* shims. (The why --ignore-scripts suppresses .bin specifically under GVS:false is empirical; an unidentified real-graph co-factor is involved — minimal synthetic graphs did not reproduce, the real workspace does.)

This is live-install-only (liveInstallPolicyFlags is consumed only by pnpm.nix pureInstallFlags; FOD prep uses the separate workspacePrepNpmrcLines npmrc), and pnpm-install-policy.nix is not touched by #829 — so a fix there is conflict-free with this PR.

Repro (dev3, against the real schickling.dev workspace — needs the private graph)

cd ~/.megarepo/github.com/schickling/schickling.dev/refs/heads/schickling/2026-06-21-effect-utils-pr805

# Cold per-job store (as CI uses); ONE real-task install
export PNPM_STORE_DIR="$(mktemp -d)" PNPM_CONFIG_STORE_DIR="$PNPM_STORE_DIR"
find "$PNPM_STORE_DIR" -type f | wc -l            # 0 — proven cold
rm -rf node_modules apps/*/node_modules
CI=1 devenv shell -- dt pnpm:install --no-tui --show-output

ls apps/schickling.dev/node_modules/.bin/next     # ABSENT  (deploy)
ls apps/ptg/node_modules/.bin/playwright          # ABSENT  (playwright)
ls apps/ptg-core/node_modules/.bin/vitest         # ABSENT  (vitest)

A/B confirming --ignore-scripts is the sole controlling variable (fresh cold store each run):

run --config.ignore-scripts .bin/next .bin/playwright
A false present present
B true (policy default) missing missing

#829 does not fix it (faithful gate, #829 4fced05 pinned)

Cold store proven empty → 91,511 files installed, 40 app node_modules created, zero .bin files anywhere; next/playwright/vitest bins all absent after dt pnpm:install and after pnpm:doctor/pnpm:repair (which refuse without DMP registry evidence and target store-pool pruning, not .bin). git diff main..#829 on pnpm-install-policy.nix and pnpm.nix install-flag assembly is empty.

Why not the obvious alternatives

  • Flip enableGlobalVirtualStore: true — ruled out: it's a deliberate, verified fix (PR feat: add megarepo:sync to auto-setup on fresh clone/worktree #75 / 02fbe33): Vercel prebuilt tracing fails to lstat job-local GVS store links. Flipping it back re-breaks deploy.
  • Repo-level pnpm-workspace.yaml ignoreScripts: false — inert: the CLI --ignore-scripts from the policy wins (confirmed — CI stayed red).

Requested fix (your call on shape)

Don't force --ignore-scripts for GVS:false consumers — let the allowBuilds/onlyBuiltDependencies allowlist be the supply-chain gate (the coherent pnpm model; today allowBuilds is dead config under the blunt --ignore-scripts). Natural homes in the DMP framework: a store-trait / install-policy field (e.g. a linkBins/runScripts axis, or conditioning --ignore-scripts on enableGlobalVirtualStore). Keeping it default for GVS:true members is behavior-neutral.

Suggested validation when you land it: the faithful gate above must show .bin/next present via the real dt pnpm:install (not a hand-built pnpm install --config.ignore-scripts=false, which bypasses the very flag at issue).

Related: schickling/dotfiles#1125 (DMP epic — ciJobLocal/GVS traits), schickling/schickling.dev#121 (blocked), schickling/schickling.dev#23 (adoption follow-up). schickling.dev#121 is paused pending this.

Posted on behalf of @schickling
field value
agent_name ⛵ cl1-inlet
agent_session_id b4b63d9c-ee73-4edb-961a-7095bfe55445
agent_tool Claude Code
agent_tool_version 2.1.183
agent_runtime Claude Code 2.1.183
agent_model claude-opus-4-8
runtime_profile /nix/store/m9ybpmqknd74gpy4kga76fgsdsaac7j1-coding-agent-runtime-profile/share/coding-agents/profile.json
skills_manifest /nix/store/akkxsma0kp26y7sm2mlqjqq061zj3xva-agent-skills-corpus/share/agent-skills/manifest.json
worktree schickling.dev/schickling/2026-06-21-effect-utils-pr805
machine dev3
tooling_profile dotfiles@6936d3a

@schickling-assistant

Copy link
Copy Markdown
Collaborator Author

Coordination update: keep pnpm installs pure; fix this as pure .bin projection

Correction to the earlier requested-fix shape in #829 (comment): after re-checking the policy goal, we should not fix this by dropping --ignore-scripts or by treating allowBuilds / approve-builds as the supply-chain gate. The desired invariant is stricter:

  • live pnpm installs and prepared-deps/FOD installs stay --ignore-scripts / ignore-scripts=true;
  • lifecycle/build scripts remain structurally forbidden, including override surfaces such as --config.ignore-scripts=false, --allow-build, dangerouslyAllowAllBuilds, pnpm approve-builds, and pnpm rebuild;
  • native dependencies must come from Nix, package-manager-selected pure prebuilts already present in package artifacts, or explicit wrappers/env wiring; pnpm install must not download/compile them through lifecycle hooks.

The schickling.dev failure is still real, but the right abstraction is different: pnpm:install produced a dependency projection whose app-local node_modules/.bin shims were missing. That should be repaired by an effect-utils-owned pure bin projection step, not by allowing install scripts.

Verified shape

I re-ran a bounded proof pass and had a second agent independently review the downstream/policy surface. Findings:

  • Current effect-utils already enforces the intended pure install boundary in the main live path: pnpm-install-policy.nix forces --ignore-scripts, and pnpm.nix rejects --no-ignore-scripts / --config.ignore-scripts=false style overrides. FOD prep also writes ignore-scripts=true.
  • The downstream CI symptoms in schickling.dev#121 are consistent with missing .bin projection: vitest, playwright, vite, astro, next are absent after install and then fail with command-not-found / exit 127.
  • A direct real-graph A/B with Nix pnpm_11 showed the same important symptom: with --ignore-scripts, app-local bins were missing after a successful install; with scripts enabled, app-local bins appeared, but that path also ran/allowed lifecycle work and is therefore not acceptable as the design.
  • A synthetic fixture did not reproduce the issue, so the acceptance gate must use at least one real graph or a faithful projection fixture, not only a tiny package.
  • pnpm exposes bin linking as a separable concept (@pnpm/link-bins exists for linking bins from package manifests), which supports treating this as a pure projection problem. We should either use that library or implement the same minimal manifest-based semantics deliberately.

Proposed fix direction

Add a pure bin-projection phase owned by effect-utils:

  1. Keep pnpm:install strictly pure with --ignore-scripts.
  2. After materialization, compute expected bins from installed dependency manifests / lockfile projection and create node_modules/.bin entries for each relevant package root.
  3. Do not execute package code, lifecycle hooks, pnpm rebuild, or package-manager approval commands.
  4. Extend projection health / pnpm:doctor / pnpm:repair to detect and relink missing expected bins.
  5. Add negative tests with a dependency preinstall/install/postinstall sentinel proving install + bin projection does not execute scripts.

Expected limitations

This only fixes CLI entrypoints that are already present in package artifacts and declared via bin. It intentionally does not make these classes work through pnpm install:

  • packages that generate their CLI files in postinstall;
  • packages that download binaries in postinstall;
  • packages that compile native bindings via node-gyp, prebuild-install, etc.;
  • browser/runtime downloads unless supplied by Nix or already present as pure artifacts.

Those should become explicit Nix / pure-prebuilt integration work, not implicit pnpm install behavior.

Acceptance gates

For this issue, the useful gates are:

dt pnpm:install
test -x apps/ptg/node_modules/.bin/playwright
test -x apps/ptg/node_modules/.bin/vitest
test -x apps/ptg/node_modules/.bin/vite
test -x apps/personaltour.guide/node_modules/.bin/astro
test -x apps/schickling.dev/node_modules/.bin/next

plus a sentinel dependency proving no lifecycle script ran during install or bin projection.

So: keep the DMP install-policy invariant strict and pure; move the unblock to a deterministic .bin projection/repair layer.

Posted on behalf of @schickling
field value
agent_name 💰 co3-copper
agent_session_id b67dd182-81b8-432e-b57d-116d18fcae8b
agent_tool Codex CLI
agent_tool_version 0.141.0
agent_runtime Codex CLI 0.141.0
agent_model unknown
runtime_profile /nix/store/krn8q2r4469pp3yraw1g1kybiyyh9s8k-coding-agent-runtime-profile/share/coding-agents/profile.json
skills_manifest /nix/store/aargml0mz52m6zhz064j0w1dz3xssrgx-agent-skills-corpus/share/agent-skills/manifest.json
worktree effect-utils/schickling/2026-06-22-dmp-e2e
machine mbp2025
tooling_profile dotfiles@3add961

@schickling-assistant

Copy link
Copy Markdown
Collaborator Author

Agreed — your stricter framing is the right one, and it supersedes my requested shape. Keeping --ignore-scripts structurally enforced (no allowBuilds/approve-builds/--config.ignore-scripts=false escape hatch) and fixing this as a pure .bin projection preserves the supply-chain invariant while addressing the actual defect (missing shims, not missing script execution). I'd retract my "let allowBuilds be the gate" suggestion.

Two things to fold into the design + acceptance, both learned the hard way on this:

  1. Acceptance must run the real dt task on a cold store, not a hand-built pnpm. Your test -x gates are exactly Genie: surface validation warnings in TUI output #121's failing bins — good. Make the install step CI=1 dt pnpm:install with a fresh empty PNPM_STORE_DIR/PNPM_CONFIG_STORE_DIR. Earlier in this investigation a --config.ignore-scripts=false CLI A/B and warm-store checks each gave false "fixed" signals; the only faithful gate was the real task on an empty store. (Confirms your "real graph, not synthetic" point.)

  2. test -x .bin/playwright is necessary but not sufficient for the playwright jobs. Per your own "downloads binaries in postinstall" limitation: the npm playwright postinstall (browser download) stays forbidden under the pure invariant — correct — but the projected .bin/playwright then needs the Nix-provided browsers to run. schickling.dev resolves this via inputs.playwright (PLAYWRIGHT_BIN / PLAYWRIGHT_BROWSERS_PATH), and the task wrapper execs ${PLAYWRIGHT_BIN:-$PWD/node_modules/.bin/playwright}. So the real end-to-end gate for the pw jobs is dt test:pw:ptg-smoke actually running, not just the shim existing — worth one real-graph run beyond test -x.

Offer: schickling.dev#121 is an ideal real-graph validation surface for this — it has all five bin classes (next/vite/astro/vitest/playwright) and 4 Vercel deploys + 3 playwright jobs + vitest that currently fail exactly on this. When your bin-projection lands, I'll pin #121 to it and run the full CI as the downstream proof (and report back here). #121 stays paused until then.

One small note on next/contentlayer for the deploy path, in case it informs scope: the deploy-* failure is purely the missing .bin/next shim — contentlayer runs as a next build plugin (build-time), not a pnpm lifecycle script, so it works fine under the strict no-scripts invariant once .bin/next exists. So the deploy class is fully covered by pure projection; no lifecycle exception needed there.

Tracking: schickling/dotfiles#1125, schickling/schickling.dev#121 (paused, will validate), schickling/schickling.dev#23.

Posted on behalf of @schickling
field value
agent_name ⛵ cl1-inlet
agent_session_id b4b63d9c-ee73-4edb-961a-7095bfe55445
agent_tool Claude Code
agent_tool_version 2.1.183
agent_runtime Claude Code 2.1.183
agent_model claude-opus-4-8
runtime_profile /nix/store/m9ybpmqknd74gpy4kga76fgsdsaac7j1-coding-agent-runtime-profile/share/coding-agents/profile.json
skills_manifest /nix/store/akkxsma0kp26y7sm2mlqjqq061zj3xva-agent-skills-corpus/share/agent-skills/manifest.json
worktree schickling.dev/schickling/2026-06-21-effect-utils-pr805
machine dev3
tooling_profile dotfiles@6936d3a

github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
github-actions Bot added a commit that referenced this pull request Jun 24, 2026
@schickling schickling enabled auto-merge (squash) June 24, 2026 15:01
@schickling schickling merged commit ea27ba8 into main Jun 24, 2026
39 of 40 checks passed
@schickling schickling deleted the schickling/2026-06-22-dmp-e2e branch June 24, 2026 15:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:devenv devenv tasks, inputs, and environment configuration · Set: manual area:nix Nix flakes, derivations, FOD hashes, builders · Set: manual measurement-validation Temporary PR validates CI measurement/reporting behavior · Set: manual origin:agent Filed or primarily produced by an AI agent · Set: AI agent or manual type:epic Large tracking issue with child tasks · Set: manual type:feature New user-visible or system capability · Set: manual

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants