overengineeringstudio / overengineeringstudio/effect-utils
Native dep audit: gated-family heuristic misses ungated node-gyp lifecycle addons
Nobody has claimed this yet.
- 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-contractCI job is install-free (nonode_modules), and - the pnpm-deps Nix FOD strips
.modules.yamlfrom 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
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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