overengineeringstudio / overengineeringstudio/effect-utils

Native dep audit: gated-family heuristic misses ungated node-gyp lifecycle addons

Open
#813 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

area:ci area:tooling origin:agent state:needs-research type:chore
Dominant language
TypeScript
Stars
82
Forks
2
Avg merge
1d 8h
Merged PRs (30d)
121

Description

Known limitation surfaced while implementing the native dependency policy audit (#807).

Gap

The audit's "wants to build but unclassified" signal is a CPU/OS/libc-gated prebuilt family heuristic over pnpm-lock.yaml. It deliberately does not consume pnpm's build-script ledger (node_modules/.modules.yaml pendingBuilds), because:

  • the pnpm-builder-contract CI job is install-free (no node_modules), and
  • the pnpm-deps Nix FOD strips .modules.yaml from its normalized output for reproducibility (nix/workspace-tools/lib/mk-pnpm-deps.nix),

so no CI job ever sees pendingBuilds.

Consequence: a new ungated node-gyp lifecycle addon (e.g. bcrypt, better-sqlite3) added with no policy entry has a build script but no cpu/os/libc gating, so it is invisible to the gated-family check — exactly the case the original issue's rule (a) targeted.

Why accepted for now

A ledger-based check would require either bolting a real pnpm install onto the deliberately install-free contract job, or preserving .modules.yaml through the FOD (breaking the Nix determinism invariant the pnpm-deps closure depends on). Neither cost is justified today.

Possible future direction

If this gap matters, add a separate ledger-based check in a job that already has a populated node_modules (e.g. a post-install lane), consuming pendingBuilds to detect a build-wanting package absent from nativeDependencyPolicy. Until then this is documented in genie/external.ts and accepted.

Posted on behalf of @schickling
field value
agent_name 🔄 cl2-tide
agent_session_id f6325b3c-bcd9-4b16-9af1-96f2233d2d3d
agent_tool Claude Code
agent_tool_version 2.1.179
agent_runtime Claude Code 2.1.179
agent_model claude-opus-4-8
runtime_profile /nix/store/wbb5q5n2gbk751hcyr5ndp0zrmar602x-coding-agent-runtime-profile/share/coding-agents/profile.json
skills_manifest /nix/store/3i12shfqx3wqzq2di3jy1m7f8fn4prmm-agent-skills-corpus/share/agent-skills/manifest.json
worktree effect-utils/schickling/2026-06-19-deps
machine dev3
tooling_profile dotfiles@unknown-dirty

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the native dependency audit in genie/external.ts and the pnpm lockfile heuristic described here. Read nix/workspace-tools/lib/mk-pnpm-deps.nix and inspect how pendingBuilds is unavailable; compare this with a post-install job that has node_modules. Done means the ungated node-gyp lifecycle-addon case is detected without weakening the install-free or reproducibility constraints.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
build-system, ci-cd
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.