Pacmon

Dependency notes — rules for AI agents

Pacmon keeps a note for each direct dependency in .pacmon/, beside its manifest. People write under the dependency's heading; AI coding agents write under ### Agent notes.

Pacmon: Set Up AI Instructions copies the rules below into the repository as .pacmon/AGENT-RULES.md, and adds a three-line pointer to the instruction files you pick: AGENTS.md, CLAUDE.md, .cursor/rules/dependency-notes.md, .github/copilot-instructions.md. An agent that reads those files finds the rules there. Pacmon does not call any AI service: agents use their own tools, and Pacmon gives them the files and the rules.

The copy in a repository is the one its agents follow. This page shows the rules of the current release, as Pacmon writes them.

Before you touch a dependency

Its notes are beside the manifest you are changing: npm uses .pacmon/DEPENDENCY-NOTES.md, Rust uses .pacmon/cargo/DEPENDENCY-NOTES.md, Maven uses .pacmon/maven/DEPENDENCY-NOTES.md, Gradle uses .pacmon/gradle/DEPENDENCY-NOTES.md, Mix uses .pacmon/mix/DEPENDENCY-NOTES.md, Gleam uses .pacmon/gleam/DEPENDENCY-NOTES.md, Zig uses .pacmon/zig/DEPENDENCY-NOTES.md, Python uses .pacmon/python/DEPENDENCY-NOTES.md, Go uses .pacmon/go/DEPENDENCY-NOTES.md, and .NET/NuGet uses .pacmon/nuget/DEPENDENCY-NOTES.md. In a monorepo, use the nearest file for the same ecosystem, walking up. Read two things first: the free text between # Dependency Notes and the first section (this repository's own rules), then the dependency's ## <name> section.

Where you write

## <the dependency's note key>

Text written by people. Do not touch it.

### Agent notes

- key: value
- key: value

Fields

Fill these whenever you can:

Field Question it answers One line of
purpose: What job does it do here? the package's role in this project — what it is and why this repo uses it, one sentence
usage: Where and how is it wired in? entry points, wrapper module, config; the rule for using it ("always through lib/http.ts")
constraint: What must not change? a pin, a forbidden upgrade, a coordination requirement — the rule and its reason
verify: How do I check I did not break it? a command or a flow: vitest src/api, "run the login e2e"
log: What happened, what was decided? one dated event per line — added (by whom, version, PR), an upgrade attempt, a rejected proposal and why; carry a commit hash, PR or advisory id
verified: Which installed version were these notes checked against? the resolved version (from the lockfile, where there is one) when you last confirmed the block is still true

Add these only when they are true and non-obvious:

Field Question it answers One line of
risk: What does it cost or endanger? a judgment — security exposure, native binary, licence obligation, maintenance state — not raw numbers
runtime: Where does it execute? one of: server, client, build, dev, deploy
exposure: Does it handle untrusted input? one of: untrusted-input, internal
bump-with: What must move with it? packages that have to be upgraded together (peer pairs, plugin sets)
remove-when: When should it go? the exit condition
alternatives: What could replace it? only real decisions, dated, with a verdict: "fastify (rejected 2023-01: middleware ecosystem)"
owner: Who to ask? a team, a person, a channel
status: Is it still here? dead, removal-planned, or removed <YYYY-MM> — <reason>; absent means active
links: Sources? changelog, docs, upstream issue, registry page — the specific ones, not the obvious
note: Anything else the next agent must know? free text that fits no other field — one thought per line, never a measurement

A section whose status: starts with removed is kept on purpose for a package that left its manifest; Pacmon does not flag it as an orphan.

Example

## express

Do not upgrade to v5 — the auth middleware is incompatible (SEC-1301).
Rate-limit settings live in `src/middleware/limits.ts`.

### Agent notes

- purpose: HTTP framework; serves the public REST API and the webhook receiver
- constraint: stay on ^4 — v5 changes router path matching (path-to-regexp v8) and the session API
- verify: `vitest src/api` and the login e2e (`pnpm e2e:auth`)
- log: 2026-03 agent tried 5.0.1, 14 auth tests failed, reverted (PR #402)
- verified: 4.18.2