A mature, well-tested framework with clear request handling and solid CI practices, but lacks architectural documentation and strict dependency pinning for agents working at scale.
last scored 2026-06-21 · both lenses
Readiness lenses
The same repo, two ways: how ready it is for an AI coding agent, and for a human newcomer. Switch lenses to see each one's score and checks.
How ready the repo is for an AI coding agent to read, build, and operate it.
68 / 10021 of 39 checks passed across 6 categories.
Machine Orientation
75README and package.json describe the framework clearly, with explicit build/test commands; entry point and library structure are obvious, but no dedicated AGENTS.md or CLAUDE.md, and architecture lacks high-level documentation of internal modules and request flow.
The README provides a quick-start code example, explicit test command (`npm test`), installation steps, and feature summary. The package.json lists all scripts (`test`, `lint`, `lint:fix`) and pinpoints the Node 18+ requirement. The entry point (index.js → lib/express.js) is straightforward, and the lib/ structure (application.js, request.js, response.js, view.js, utils.js) is navigable. However, there is no AGENTS.md, CLAUDE.md, or architecture document explaining module boundaries, middleware flow, or how the Router integrates—an AI agent must infer these from source code inspection alone.
Reproducible Setup
50Partial setup reproducibility: Node.js pinned to a minimum floor but no lockfile, no container, and floating caret ranges across all dependencies leave version resolution to npm negotiation.
The repository specifies `engines.node >= 18` in package.json and includes explicit npm scripts (test, lint) documented in the README. However, all 23 dependencies use caret-range pins (^2.0.0, ^4.4.0, etc.) rather than exact versions, and .npmrc disables package-lock generation (package-lock=false), so the agent must resolve transitive dependencies at install time. No container, devcontainer, or npm-shrinkwrap.json provides a locked state, and no .env.example documents environment variables. This forces npm to pick minor/patch versions dynamically, creating reproducibility drift across runs.
Code Navigability
72Clear module structure with explicit request/response/application boundaries, descriptive function names, and JSDoc; minor gaps in TypeScript definitions and architectural documentation prevent exemplary status.
Express uses a conventional, well-established layout with lib/ housing core modules (application.js, request.js, response.js, utils.js, view.js), examples/ for runnable patterns, and test/ with comprehensive coverage organized by feature. Module boundaries are explicit: request and response are prototypal extensions of Node's http classes; application.js handles server setup and routing. Function signatures are descriptive (e.g., `app.use()`, `res.send()`, `req.get()`), and JSDoc comments document intent and parameters. The test suite (213 files detected, test/ organization by concern) and examples/ (20+ runnable scenarios) are extensive and navigable. ESLint configuration enforces consistent style. However, no TypeScript definitions (.d.ts) exist, no explicit architecture document explains the full composition pattern, and lib/ files lack JSDoc-style @private/@public markers in some utility functions, creating minor friction for agents unfamiliar with Node.js prototypal patterns.
Verification Surface
72Tests run reliably via mocha with broad CI coverage; linting is strict and documented; lacks type-checking and has minor CI observability gaps.
Express has a comprehensive test suite (100+ test files across unit, integration, and acceptance tests) invoked via `npm test` using mocha with leak detection (`--check-leaks`), concrete fixtures, and supertest for HTTP assertions. The CI pipeline (ci.yml) runs tests across 9 Node versions and 2 OSes with coverage collection via nyc and Coveralls integration. ESLint is configured with strict rules (eqeqeq, no-unused-vars, proper indentation) and runs in CI as a separate lint job. However, the repository lacks TypeScript or type-checking (no JSDoc, no tsc), and test coverage thresholds are not enforced or visible in the CI config.
Agent Safety
72Good secret hygiene and CI oversight, but missing formal safety documentation and destructive-operation boundaries.
The repository demonstrates solid agent-safety fundamentals: .gitignore properly excludes node_modules, package-lock.json, and .log files (no .env committed); CI pipelines run linting and tests with restricted permissions; no hardcoded secrets detected in scanned files. However, the repo lacks a SECURITY.md file to formalize vulnerability reporting, has no CODEOWNERS to gate sensitive code changes, and lacks explicit boundaries around destructive operations (e.g., app.listen, file deletions via res.download, or child process spawning).
Context Economy
72Clear, navigable codebase with committed build and vendor artifacts properly excluded, though example and changelog bulk is untagged and adds moderate noise to the signal path.
Express excludes node_modules, package-lock.json, and build output via .gitignore (confirmed: `node_modules`, `coverage`, `.nyc_output` explicitly listed). The core library is compact (lib/ ~1400 LOC across 6 key files), tests are well-organized (213 files total but split by concern), and CI/linting configuration is standard and minimal. However, 27 example directories with templates, CSS, and fixture files, plus a 1000+ line History.md changelog, are committed without Linguist markers, forcing agents to parse full directory trees to identify signal from noise — examples would benefit from `.gitattributes linguist-documentation=true` or a separate docs branch.
Machine Orientation
5 checks passed4 problems found
- mediumAgent instructions file
AGENTS.md / CLAUDE.md is the direct, machine-read channel for entry points and conventions.
Fix: Add an AGENTS.md naming the entry points, the build/test commands, and the house conventions.
- lowllms.txt present
An llms.txt is the emerging machine-orientation standard — a curated map for LLMs.
Fix: Add an llms.txt pointing at the key docs and entry points.
- lowArchitecture doc
An ARCHITECTURE doc hands an agent the module map instead of making it infer one.
Fix: Add an ARCHITECTURE.md describing the major components and how they fit.
- lowContribution conventions are written down
A contributor guide is where an agent learns the branch, commit, and review conventions it must follow.
Fix: Add a CONTRIBUTING.md stating the branch naming, commit format, and how a change gets reviewed.
- README present — An agent reconstructs what the repo is and how to work in it from the README first.
- Repository description set — The one-line description is the fastest orientation signal an agent reads.
- Topics set — GitHub topics situate the repo's domain and stack for an agent at a glance.
- README shows usage — A usage/example section tells an agent how the project is actually invoked.
- Examples directory — An examples/ directory gives an agent runnable, copyable references for the API.
Reproducible Setup
2 checks passed5 problems found
- highLockfile committed
Without a lockfile two clones can resolve different dependency trees — the build isn't reproducible.
Fix: Commit your lockfile (package-lock.json / pnpm-lock.yaml / Cargo.lock / …).
- mediumContainer or dev-container
A Dockerfile / compose / devcontainer removes 'works on my machine' from setup.
Fix: Add a Dockerfile, a compose file, or a .devcontainer so the environment is declared, not assumed.
- lowVersion pins are exact
A floating pin (a bare major, or a range) still drifts between installs.
Fix: Pin to an exact or minor version, not a floating range.
- lowEnv template present
A .env.example tells an agent which configuration keys it must supply to run.
Fix: Ship a .env.example listing every required key with placeholder values.
- lowDev container
A .devcontainer gives an agent a one-command, fully-declared environment.
Fix: Add a .devcontainer so the toolchain is declared, not assumed.
- Runtime / toolchain pinned — An unpinned runtime makes an agent guess the version a clean environment needs.
- README documents setup — Explicit install/setup steps are what let an agent go from clone to running.
Code Navigability
2 checks passed2 problems found
- lowFormatter configured
A formatter config (Prettier/Biome/rustfmt/…) keeps style uniform across the tree.
Fix: Add a formatter (Prettier, Biome, rustfmt, …) and commit its config.
- lowTyped public API
A declared `types` entry gives an agent typed signatures to anchor an edit on.
Fix: Ship type declarations and point package.json `types`/`typings` at them.
- Conventional source layout — A recognised src/ · lib/ · app/ layout lets an agent localise code without spelunking.
- .editorconfig present — An .editorconfig keeps whitespace and encoding consistent, so diffs stay legible.
Verification Surface
4 checks passed3 problems found
- lowTask runner present
A Makefile / Taskfile / justfile gives an agent a single index of the project's commands.
Fix: Add a Makefile / Taskfile / justfile collecting the common commands.
- lowTypecheck command
A typecheck script lets an agent catch type errors before they ship.
Fix: Add a `typecheck` script (e.g. `tsc --noEmit`).
- lowBuild command
A documented build command is the discoverable way for an agent to produce artifacts.
Fix: Add a `build` script that produces the distributable.
- Tests present — Runnable tests are the ground truth an agent checks its own edits against.
- Test command defined — A `test` script is the documented, discoverable way to run the suite.
- Lint command defined — A linter an agent can run catches a class of mistakes before they ship.
- CI configured — Readable CI is the feedback loop an agent reads to know what 'green' means here.
Agent Safety
5 checks passed3 problems found
- medium.gitignore covers env files
An ignore rule for .env is what keeps the next careless commit from leaking secrets.
Fix: Add `.env` (and `.env.*`) to .gitignore.
- mediumSecurity policy
A SECURITY.md is where an autonomous security agent reads this repo's rules before acting on it.
Fix: Add a SECURITY.md stating the disclosure channel and the repo's security rules.
- lowCODEOWNERS present
CODEOWNERS marks the 'don't touch without review' zones an agent should respect.
Fix: Add a CODEOWNERS file marking the sensitive paths.
- No committed .env — A tracked real .env hands secrets to anything — including an agent — that reads the repo.
- No exposed secrets — Secret-shaped literals in tracked files are a live credential leak.
- Automated dependency updates — Dependabot / Renovate keeps dependencies patched without a human in the loop.
- .gitignore present — A .gitignore is the first guard against an agent committing secrets or build junk.
- License makes the code reusable — Without a license an agent cannot safely copy, redistribute, or vendor any of this code.
Context Economy
3 checks passed1 problem found
- lowGenerated / vendored files marked
A .gitattributes linguist marker tells tools (and agents) what to skip.
Fix: Mark generated/vendored paths in .gitattributes (linguist-generated / linguist-vendored).
- Dependencies not vendored in — A committed node_modules / vendor tree drowns the real signal an agent needs.
- Build output not committed — Generated dist/ · build/ output is noise an agent has to read past.
- No oversized source file — A single file in the hundreds of KB blows past an agent's effective context window.
How ready the repo is for a human newcomer to understand, set up, and contribute.
73 / 10019 of 33 checks passed across 6 categories.
First Impression
91Exemplary first impression: README front-loads project purpose, scope, and maturity with a working code example, badges, comprehensive navigation, and 25+ documented examples covering real use cases.
The README immediately answers who, what, and why through a clear tagline ("Fast, unopinionated, minimalist web framework for Node.js"), followed by a complete, runnable code example (4 lines of ES6) within the first screen. Visual badges (npm version, downloads, CI status, test coverage, OpenSSF scorecard) signal active maintenance and maturity. The table of contents is structured and machine-scannable. The repository pairs this with 25 concrete examples in the `/examples` directory (auth, MVC, sessions, static files, error handling, etc.), each with working code, demonstrating scope and patterns. Project governance, team members, and contribution pathways are documented transparently.
Getting Running
72README and package.json provide clear installation and test instructions, pinned Node version, and working examples; missing only lockfile and env template.
Express delivers explicit prerequisites (Node.js 18+), copy-pasteable commands for install (`npm install`), test (`npm test`), and running examples (`node examples/hello-world`), with all dependencies version-pinned in package.json. CI workflow verifies the setup deterministically across Node 18–26 and both OS platforms. However, no lockfile (package-lock.json absent, intentionally disabled via .npmrc) and no .env.example or configuration template are provided, leaving environment-specific setup implicit for users needing custom configs beyond defaults.
Finding Your Way
72Clear module structure with descriptive naming and a comprehensible entry point, but lacks a top-level architecture document and relies on external docs for navigation depth.
Express has a conventional, navigable structure: a minimal index.js entry point that delegates to lib/express.js, which creates the application using clearly-named modules (application.js, request.js, response.js, view.js, utils.js). Module exports are explicit and JSDoc-commented (@private/@public/@api annotations throughout). The examples/ folder with a README provides 25 runnable samples, and the package.json files field declares what's published. However, there is no architecture.md, design-doc, or equivalent overview explaining layer interactions, Router integration, middleware pipeline, or request flow — forcing a newcomer to infer these from code reading rather than documentation.
Path to Contribute
35Minimal contribution scaffold with missing explicit guides: no CONTRIBUTING.md in the main repo, no issue or PR templates, no beginner-labeled issues detected.
The README references a "[Contributing Guide]" and mentions running tests (`npm test`), but the link points to a .github organization-level file (/.github/CONTRIBUTING.md) that is not present in this repository snapshot. The signals confirm: contributing=no, issueTemplates=no, prTemplate=no. While the repo has tests (mocha), linting (eslint), and CI workflows, a newcomer has no explicit route to understand conventions, PR workflow, or how to identify beginner-friendly issues in the absence of machine-readable templates or a local CONTRIBUTING.md.
Signs of Life
92Exemplary signs of life: a stable, well-maintained flagship project with documented governance, monthly CI runs on 9 Node versions, active releases (v5.2.1 from Dec 2025), and a visible Technical Committee plus triage team managing the backlog.
Express shows sustained, professional maintenance across multiple signals: the repository records a recent push (2026-06-16), History.md documents frequent releases with detailed changelogs (v5.2.1 / 2025-12-01, v5.1.0 / 2025-03-31, v5.0.1, v5.0.0), and the CI pipeline (.github/workflows/ci.yml) runs lint and test jobs across 9 Node versions (18–26) on both Ubuntu and Windows on every push and PR. The README explicitly names 8 current Technical Committee members and 11 triagers with GitHub links, plus a published GOVERNANCE.md file and a Code of Conduct. Dependabot is configured for monthly dependency updates with npm and GitHub Actions patching. The project has 208 open issues and extensive test coverage (mocha + nyc) instrumented in package.json scripts.
Open Door
85Legally and socially safe to enter: MIT license is present and explicit, Code of Conduct is linked from README, but contribution and help pathways lack in-repo documentation.
The repository clears the legal prerequisite with a valid MIT LICENSE file (checked: full text present with proper copyright notices). The README explicitly signals "[Code of Conduct]" via hyperlink to the org's shared policy. However, the repo is missing three key signals that agents rely on: no CONTRIBUTING.md in the main repo (README links to an external org-level guide that an agent cannot reliably traverse), no visible security policy document (only a README link to a GitHub-hosted security policy endpoint), and no issue or pull-request templates to clarify where and how to ask questions or report problems.
First Impression
6 checks passed0 problems found
- README present — The README is the first screen — with none, a newcomer has nothing to land on.
- Repository description set — The one-line description sets expectations before a newcomer even opens the README.
- Topics set — Topics situate the project's domain at a glance and help a newcomer find it.
- Status badges — Build/version badges signal at a glance that the project is alive and healthy.
- README shows what it does — A usage/example section lets a newcomer see the tool in action before committing.
- Examples to learn from — An examples/ directory gives a newcomer something concrete to run and adapt.
Getting Running
2 checks passed5 problems found
- highLockfile committed
Without a lockfile a newcomer's install resolves differently and hits errors the docs don't mention.
Fix: Commit your lockfile so a fresh clone installs the same dependency tree.
- mediumOne-command environment
A Dockerfile / compose / devcontainer turns a fiddly setup into one command.
Fix: Add a Dockerfile, a compose file, or a .devcontainer for a one-command setup.
- lowEnv template present
A .env.example shows a newcomer exactly which settings they must fill in to run it.
Fix: Ship a .env.example listing every required key with placeholder values.
- lowOne-click dev container
A .devcontainer lets a newcomer start in a cloud IDE with zero local setup.
Fix: Add a .devcontainer for a one-click, batteries-included environment.
- lowVersions pinned exactly
A floating version still drifts — a newcomer can hit a break the maintainer never saw.
Fix: Pin prerequisites to an exact or minor version, not a floating range.
- Prerequisite versions pinned — Unpinned prerequisites are the classic 'works on my machine' first-run failure.
- README documents setup — Explicit install steps are the difference between a 5-minute start and giving up.
Finding Your Way
3 checks passed2 problems found
- mediumArchitecture / overview doc
An overview hands a newcomer the map instead of making them reconstruct it.
Fix: Add an ARCHITECTURE.md (or a 'Project layout' README section) naming the key directories.
- lowFormatter configured
An auto-formatter means a newcomer never guesses the house style.
Fix: Add a formatter (Prettier, Biome, rustfmt, …) and commit its config.
- Conventional source layout — A familiar src/ · lib/ · app/ layout lets a newcomer guess where things live.
- No oversized source file — A single thousand-line file is a wall a newcomer bounces off.
- .editorconfig present — Consistent indentation/encoding keeps the code readable and diffs clean for newcomers.
Path to Contribute
2 checks passed4 problems found
- mediumCONTRIBUTING guide
A CONTRIBUTING guide is the difference between a guessed and a guided first PR.
Fix: Add a CONTRIBUTING.md covering dev setup, the test command, and how to submit a change.
- lowIssue templates
Issue templates show a newcomer how to file something useful — and that contributions are welcome.
Fix: Add issue templates under .github/ISSUE_TEMPLATE.
- lowPull-request template
A PR template tells a first-time contributor what a good change includes.
Fix: Add a PULL_REQUEST_TEMPLATE.md.
- lowTask runner
A Makefile / Taskfile gives a contributor a single index of the project's commands.
Fix: Add a Makefile / Taskfile collecting the common dev commands.
- Test command defined — A documented test command lets a contributor check their change before opening a PR.
- Lint command — A linter lets a first-time contributor catch style issues before review.
Signs of Life
4 checks passed1 problem found
- lowFunding configured
A FUNDING config signals an invested, sponsored project — not a one-off dump.
Fix: Add a .github/FUNDING.yml if the project accepts sponsorship.
- Tests present — A test suite signals a project that's cared for, not abandoned.
- CI configured — Green CI on every change tells a newcomer the project is actively kept working.
- Automated dependency updates — Dependabot / Renovate activity is a visible heartbeat of ongoing maintenance.
- Changelog — A maintained CHANGELOG shows a newcomer the project ships and records its changes.
Open Door
2 checks passed2 problems found
- lowCode of conduct
A code of conduct states the social ground rules that make it safe to step in.
Fix: Add a CODE_OF_CONDUCT.md (the Contributor Covenant is the de-facto standard).
- lowSecurity policy
A SECURITY.md tells a newcomer how to report a problem responsibly.
Fix: Add a SECURITY.md describing how to report a vulnerability.
- License present — With no license the project isn't legally reusable — the door is shut however friendly the README.
- License is a standard one — A non-standard or custom license is a legal question mark a newcomer won't resolve.
Where the grip slips
- highReproducible Setup+6 pts if fixed
No package-lock.json or npm-shrinkwrap.json
The .npmrc explicitly sets package-lock=false, disabling lockfile generation. Without a committed lockfile, npm install resolves transitive dependencies nondeterministically, violating reproducibility for an agent.
Fix: Remove package-lock=false from .npmrc, generate and commit package-lock.json (or use npm-shrinkwrap.json), and verify it captures all nested dependency versions.
- mediumVerification Surface+3 pts if fixed
No type-checking or static type enforcement
The codebase is plain JavaScript with no TypeScript, JSDoc with type annotations, or type-checker (tsc, flow) integrated into the verification loop. An agent cannot verify type correctness without manual inspection.
Fix: Add TypeScript strict mode or comprehensive JSDoc with type checking via `tsc --allowJs --checkJs`, and run it in CI.
- highReproducible Setup+2 pts if fixed
Floating caret-range dependencies
All 23 dependencies use caret ranges (^X.Y.Z) allowing minor and patch upgrades. Combined with no lockfile, this permits breaking changes in minor versions to slip into installs.
Fix: Pin all dependencies to exact versions (remove ^) in both dependencies and devDependencies, then regenerate and commit the lockfile.
- highMachine Orientation+2 pts if fixed
Missing agent-specific onboarding file (AGENTS.md or CLAUDE.md)
No file exists to concisely document entry points, key module structure, build/test/run commands, or architectural patterns for an AI agent. The README is user-focused (installation, examples, philosophy) rather than agent-focused (code navigation, internal conventions).
Fix: Create AGENTS.md with sections: (1) Entry Point & Core Modules (index.js → lib/express.js, lib/application.js, lib/router integration); (2) Build/Test Commands (npm install, npm test, npm run lint); (3) Request Flow (app.handle → router.handle → middleware stack); (4) Key Abstractions (app, req/res prototypes, Router).
- mediumReproducible Setup+1 pts if fixed
No container or devcontainer setup
No Dockerfile, docker-compose.yml, or .devcontainer/devcontainer.json exists. An agent cannot guarantee a consistent OS, Node.js build toolchain, or system library state across different host environments.
Fix: Add a Dockerfile specifying Node.js 18+ base image and a .devcontainer/devcontainer.json for VS Code dev environments, or provide docker-compose.yml for local dev.
- mediumMachine Orientation+1 pts if fixed
No architecture or module-dependency diagram
While lib/ modules are readable in isolation, there is no overview of how application.js, request.js, response.js, view.js, and external dependencies (Router, bodyParser) interact. An agent must reverse-engineer request lifecycle from code.
Fix: Add a brief Architecture section to AGENTS.md: 'Express creates an app function that proxies to app.handle(). The handle method sets up req/res prototypes and delegates to this.router.handle(). Middleware and route handlers are orchestrated by the Router instance, which chains handlers via next().'
- mediumCode Navigability+1 pts if fixed
No TypeScript definitions
The codebase is pure JavaScript with no .d.ts files. Agents and downstream users must infer types from runtime JSDoc and code inspection, increasing the cognitive load for understanding what to edit where.
Fix: Generate .d.ts type definitions using tools like tsc --declaration or JSDoc-to-TypeScript converters, or author manually for core exports (application.js, request.js, response.js). Start with the public API surface.
- mediumCode Navigability+1 pts if fixed
No architecture documentation
The README and repo contain no doc explaining how request/response prototypes are composed, how app.init() sets up the lazy router, or the inheritance chain for middleware. An agent must read and infer from source code.
Fix: Add ARCHITECTURE.md or docs/ folder explaining: (1) how createApplication() creates an Express app, (2) the prototypal inheritance model for req/res, (3) the lazy router setup, (4) flow from app.handle() to Router.handle(). Include a simple diagram.
- lowVerification Surface+1 pts if fixed
No explicit code coverage threshold in CI
The test-ci script collects coverage reports via nyc and uploads to Coveralls, but does not enforce a minimum coverage percentage in the CI config or fail the build if coverage drops. An agent cannot rely on coverage thresholds as a verification signal.
Fix: Add `--check-coverage --lines X --functions X` flags to the nyc invocation in package.json test-ci script, or add a post-test check in CI.
- mediumAgent Safety+1 pts if fixed
No SECURITY.md or formal vulnerability disclosure policy
The README references 'Security Policies and Procedures' via a GitHub URL, but no SECURITY.md file exists in the repo itself. An agent reading the repo cannot verify this as machine-readable content and must rely on external GitHub settings.
Fix: Create SECURITY.md with a clear vulnerability reporting workflow, scope, and contact instructions, committed to the repository root.
- mediumAgent Safety+1 pts if fixed
No CODEOWNERS file for destructive or sensitive code paths
Express handles HTTP servers, file serving (res.sendFile, res.download), cookie/session management, and middleware composition—all agent-accessible and potentially destructive. No CODEOWNERS file exists to gate changes to critical paths like lib/application.js or lib/response.js.
Fix: Add CODEOWNERS file assigning lib/application.js, lib/response.js, lib/request.js, and cookie/session logic to required reviewers.
- mediumContext Economy+1 pts if fixed
Examples and fixtures not marked as documentation/non-source
The `examples/` directory contains 27 sample apps with templates (EJS, HBS), static files, CSS, and fixture data, plus `test/fixtures/` with template files and test data. These are all committed at repository root depth without `.gitattributes` linguist markers, forcing an agent to treat them as primary signal when walking the tree. Similarly, History.md (1000+ lines) is unparsed changelog committed to root.
Fix: Add `.gitattributes` file with `examples/** linguist-documentation=true`, `test/fixtures/** linguist-generated=true`, and `History.md linguist-documentation=true` to signal these are not source code.
- lowReproducible Setup
No .env.example or environment documentation
No .env.example or documented environment variables are provided. An agent does not know what configuration is required to run tests or the application.
Fix: Create .env.example with all environment variables needed (NODE_ENV, DEBUG flags, etc.) and document them in CONTRIBUTING or a dedicated SETUP guide.
- lowMachine Orientation
Test invocation details partially implicit
README says 'npm test', and package.json shows the mocha command with test/support/env require and acceptance tests, but there is no documented convention for where to place new tests or how to run specific test suites.
Fix: Add to AGENTS.md: 'Tests live in test/ and test/acceptance/. Run all: npm test. Test organization: test/app.*.js for app methods, test/acceptance/ for integration examples. Use mocha --grep to run subsets.'
- lowCode Navigability
Sparse JSDoc in lib/utils.js utility functions
Helper functions like compileETag, compileQueryParser, compileTrust, and createETagGenerator lack @param/@return JSDoc annotations. Agents must read the full function body to understand inputs and outputs.
Fix: Add JSDoc headers to all exported and internal functions in lib/utils.js, e.g., '@param {string|Function} val', '@return {Function}', '@private' for internal helpers.
- lowCode Navigability
Large core files approach context limits
lib/application.js, lib/request.js, and lib/response.js are long files (>1000 lines likely for application.js and response.js); a single change site may require an agent to hold the entire file in context.
Fix: Consider splitting lib/application.js into smaller modules (e.g., lib/app/init.js, lib/app/routing.js) if editing becomes a bottleneck. Not urgent for current size, but worth monitoring.
- lowVerification Surface
No machine-readable verification summary in CI output
CI produces TAP and coverage artifacts but does not post test results (pass/fail counts, flakiness) as a comment or artifact accessible to an agent reading the workflow.
Fix: Add a GitHub action (e.g., dorny/test-reporter) to parse test results and post them as a workflow artifact or PR comment.
- mediumAgent Safety
Destructive operations (file I/O, process termination) lack agent-readable safety boundaries
Methods like res.sendFile, res.download, and app.listen are callable by agent without warnings. No JSDoc guards, runtime assertions, or explicit 'dangerous—requires review' markers exist to signal destructive intent to an LLM reading the code.
Fix: Add JSDoc tags like @dangerous or @requires-manual-review to lib/response.js and lib/application.js methods that perform I/O or network binding; document these in a SAFETY.md guide for agents.
- lowAgent Safety
No .env.example template or documented secret keys
While no .env is committed, the repo provides no .env.example to guide agents on what environment variables are expected or how to safely configure sensitive settings (e.g., session secrets, proxy trust rules, view caching).
Fix: Create .env.example documenting all environment variables used in examples/ and lib/, with safe default placeholders.
- lowContext Economy
No .npmrc constraints or explicit dependency pinning strategy
package.json uses floating semver ranges for all dependencies (e.g., `accepts@^2.0.0`, `debug@^4.4.0`), and .npmrc has no `save-exact=true` or lockfile requirement strategy. This is normal for a library, but agents cannot infer dependency stability or reproducible builds from the repo alone without a lock file (package-lock.json is .gitignored).
Fix: Either commit package-lock.json to ensure reproducibility, or add a note in README explaining the library's semver strategy and why devs should `npm ci` instead of `npm install`. Alternatively, document in a CONTRIBUTING guide.
- lowContext Economy
No explicit marker of which files are published to npm
`package.json` has a `files` field listing `[LICENSE, Readme.md, index.js, lib/]`, which is correct and visible, but this is not documented in the README or a .npmignore. An agent must parse package.json to know examples, tests, and CI are not distributed.
Fix: Add a line to README explaining what is published ('Only `lib/` and `index.js` are distributed via npm; examples and tests are development-only') or create .npmignore as a visual signal.
Show your score
[](https://latch.fyi/expressjs/express)Share this analysis
https://latch.fyi/expressjs/expressFixed some issues? Re-analyze to measure your progress →
Copy the whole report
Grab the entire verdict in one go — a Markdown block for a README or an issue, plain text, or a prompt you can paste straight into an LLM.