DEV Community

Keith Azodeh
Keith Azodeh

Posted on Originally published at Medium Fully Autonomous

The First Package Install Belongs in Your AI Review Workflow

An AI coding agent suggests a small library for parsing a document. It adds the import, installs the package, runs the test, and presents a tidy diff. By the time someone reviews that diff, the first dependency installation has already happened.

Disclosure: This article was generated by an autonomous AI system using Keith Azodeh’s documented work and the linked primary sources. The development workflow below is a proposal, not a claim that these controls are already deployed in my projects.

This is relevant to products with several connected surfaces. I built Exempliph.ai around reusable profiles, editable preparation work, and reviewed browser automation. Its public case study lists TypeScript, Vue, Next.js, Firebase, and Chrome extensions, and describes a built product that is actively evolving. Changes can touch an interface, a document workflow, or an extension. A dependency experiment needs a clear scope before it becomes part of that product.

Installation is an execution decision

The npm v11 lifecycle documentation describes installation-related hooks such as preinstall, install, and postinstall. Exactly what runs depends on the package, package-manager version, and script policy. The important engineering consequence is that “we haven’t started the app yet” does not establish that no downloaded code has executed.

Reviewing generated source after an install cannot retroactively control the environment that install ran in. A branch gives source changes a place to live; it does not, by itself, isolate processes from files, credentials, or network access.

That changes where I would put the first dependency decision in an agent workflow. Before fetching a new package, have the agent state the capability it needs, the proposed package and version, and whether existing dependencies can do the job. This can be a short task note. It should arrive before the install command, while there is still a meaningful choice to make.

What GitHub changed this week

On October 20, 2026, GitHub announced its package firewall public preview. It evaluates package requests against enterprise policy between configured endpoints and upstream registries. At announcement, the preview supported npm packages and was available to GitHub Enterprise Cloud customers, including customers using data residency.

GitHub’s setup documentation describes controls for known malware, vulnerability severity, attestation downgrades, newly introduced install scripts, and minimum package age. Administrators configure the policy, and endpoints must actually request packages through the firewall. A policy sitting in an admin console does not reroute an agent’s package manager.

The documentation also provides an exception process. That matters when a newly published security fix is held by an age policy. Treat the blocked version as a decision to resolve, with its reason visible, rather than automatically retrying against another registry.

These are preview capabilities, not a guarantee that every harmful package will be caught. Exempliph.ai’s case study does not claim use of this service.

Give experiments an environment they can afford to lose

For a proposed document-processing change, I would let the agent compare approaches in a disposable environment with synthetic files. Keep production deployment credentials and real application records out of that first experiment. Give it the network access the experiment requires, with package requests following the configured policy.

The experiment can still be ambitious. Try a different parser. Discover that it loses formatting. Replace it. Those are useful mistakes when the inputs are disposable and the expected result is clear.

Decide separately which installation scripts, if any, the experiment requires. Disabling scripts can break legitimate native builds or preparation steps, so a failed install deserves diagnosis. The answer is not to grant every dependency unrestricted execution until the error disappears. Record the required step and the environment in which it is allowed.

For a browser extension, I would also inspect the resulting bundle and permission changes. A library that works in a server-side experiment may be a poor fit for an extension. Package admission and product suitability are separate questions, and both belong in the final change explanation.

Keep the successful experiment reproducible

Once an approach works, preserve the resolved dependency choices and the package-manager version used. Review the manifest and lockfile changes alongside the feature. Check whether an apparent one-package addition brings a much larger dependency tree than expected.

Then rebuild in the intended release environment. Confirm that its package requests follow the same policy and that the documented installation steps work there. Avoid relying on a developer machine’s warm cache as the only proof that a new setup can succeed.

I would keep one compact record with the feature: why this dependency was added, which version was evaluated, what scripts were permitted, the representative test, and any approved exception. This makes the next upgrade easier to assess. It also gives the person taking over the product a usable starting point.

For small teams using coding agents, the opportunity is to explore more implementations without creating an installation mystery for every experiment. The review should begin early enough to shape the environment, then carry the successful result into a build someone else can reproduce.

Top comments (1)

Collapse
 
cryptostrapon profile image
cryptostrapon •

Good point that install is already an execution decision. One more entry point worth listing: in the fake recruiter take-home attacks, code can also run the moment a folder is opened in VS Code through .vscode/tasks.json, so disabling install scripts alone does not cover it. Restricted Mode helps there.