Solid machine-oriented AI SDK with strong type safety and test infrastructure, but bloated file count and missing root documentation constrain agent autonomy.
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.
73 / 10028 of 41 checks passed across 6 categories.
Machine Orientation
78Solid machine orientation with a comprehensive AGENTS.md, clear monorepo structure, and explicit build/test commands, but missing a root README.md and env example undermines agent navigation confidence.
The repository provides a dedicated AGENTS.md file with structured guidance covering monorepo layout (pnpm workspaces + Turborepo), core API functions, import patterns, development commands (pnpm install, pnpm build, pnpm test), package-level workflows, and example directory conventions—all machine-readable and actionable. The package.json exposes explicit task commands (build, test, type-check, dev, lint, fix), and tsconfig.json documents 67+ package references, making the dependency graph navigable. However, the detected README=yes conflicts with the actual absence of README.md in the root; what exists is comprehensive inline documentation in the README section provided to Latch. The missing root .env.example (signal reports env.example=yes but file is absent) forces agents to infer environment setup solely from CONTRIBUTING.md and AGENTS.md, creating ambiguity about required vs. optional API keys.
Reproducible Setup
76Solid reproducibility with explicit pinned versions, lockfile, and pnpm-enforced setup; minor gaps in container/documentation clarity and floating Node.js constraint.
The repository enforces reproducible setup through pnpm@10.33.4 pinned in package.json packageManager field, a pnpm-lock.yaml lockfile (detected but unreadable in snapshot), and strict Node.js 22+ requirement in engines. CI workflows use `--frozen-lockfile` to prevent mutation. .env.example exists with comprehensive provider-specific variables documented. However, Node.js itself floats (^22.0.0 || ^24.0.0 || ^26.0.0) rather than pinning a single version, and no Dockerfile, devcontainer, or docker-compose exists to eliminate host-environment variables entirely.
Code Navigability
72Clear monorepo structure with strong module boundaries and TypeScript strict mode, but vague naming conventions and missing architectural documentation make localization error-prone.
The repository exhibits a well-organized monorepo with 70+ clearly named packages under `packages/` (openai, anthropic, react, google, etc.), each with strict TypeScript (`tsconfig.json` enforces `strictNullChecks`), explicit typed exports via package.json `exports` fields, and test coverage via built-in test scripts. The root tsconfig.json lists all references with full paths, enabling the agent to navigate package interdependencies. However, the lack of an architecture document (architectureDoc=no) and absence of llms.txt mean an agent must infer the module topology from package.json and export statements alone; the 7,157 files and presence of numerous generated changelog entries (.changeset/) increase noise in file navigation, and a 6,900+ file tail in the tree suggests either bloat or unfiltered artifacts that complicate context-window discovery.
Verification Surface
72Strong test and type infrastructure with Turbo, Vitest, TypeScript strict mode, and linting; CI config and exact pinning aid reproducibility, but CI workflows themselves are not visible in the snapshot and test coverage is not quantified.
The repository has machine-verifiable test, type-checking, and lint commands wired into package.json (test, type-check, lint via oxlint + ultracite), Vitest config files present in packages, TypeScript strict mode enabled in root tsconfig.json, and pnpm with exact packageManager pinning (pnpm@10.33.4) that closes the feedback loop reproducibly. The signal indicates 11 CI workflows are present but the workflows themselves are not visible in the provided snapshot, so CI readability cannot be verified. No test coverage metrics (e.g., Istanbul, nyc config, or .nycrc) are visible, and no test flakiness guards (timeouts, retries) are declared in the visible Vitest configs.
Agent Safety
72Strong secret hygiene and safety controls; missing explicit agent-safety documentation and SECURITY.md undermines trust in disclosed threat handling.
The repository demonstrates solid secret hygiene: .env files are properly in .gitignore (including root, examples directories), .env.example is present in examples/ai-functions with documented provider credentials, and the codebase shows active security patches (SSRF redirect validation, short-lived token minting for realtime). However, the absence of both SECURITY.md and explicit agent-safety boundaries is a significant gap—an autonomous agent reading this repo has no machine-readable disclosure policy for reporting vulnerabilities or understanding which components are considered agent-facing attack surfaces. The worktree setup script symlinks .env files across instances, which is operationally correct but undocumented from an agent-safety perspective.
Context Economy
62A large, well-structured monorepo with clear tooling and TypeScript strict mode, but no .gitignore-based exclusion markers for generated build outputs and a massive file count (7157) that forces an agent to sift through substantial noise.
The repository is a 70+ package TypeScript monorepo using Turbo, pnpm, and strict tsconfig references. The .gitignore correctly excludes node_modules, .next, dist, and build artifacts, and no committed node_modules or build output were detected. However, the signal-to-noise ratio is degraded by: (1) 7157 total files—a substantial bulk that stretches context efficiency despite the lack of vendored code clutter; (2) 300+ .changeset metadata files visible in the file tree (one per change entry), which are machine-generated overhead that an agent must parse around; (3) no linguist markers (.gitattributes with linguist-generated or linguist-vendored) to explicitly flag the changesets directory as generated noise, forcing the agent to rely on heuristics rather than explicit signals. The monorepo structure is clean and navigable, with conventional layout and clear package boundaries, but the sheer scale and the untagged generated bulk mean an agent cannot efficiently isolate the truly relevant code signal in a single context window.
Machine Orientation
7 checks passed3 problems found
- lowAgent instructions stay lean
A bloated instructions file burns context and measurably hurts more than it helps.
Fix: Trim AGENTS.md to the load-bearing commands and conventions; link out to the rest.
- 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.
- README present — An agent reconstructs what the repo is and how to work in it from the README first.
- Agent instructions file — AGENTS.md / CLAUDE.md is the direct, machine-read channel for entry points and conventions.
- 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.
- Contribution conventions are written down — A contributor guide is where an agent learns the branch, commit, and review conventions it must follow.
Reproducible Setup
5 checks passed2 problems found
- 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.
- lowDev container
A .devcontainer gives an agent a one-command, fully-declared environment.
Fix: Add a .devcontainer so the toolchain is declared, not assumed.
- Lockfile committed — Without a lockfile two clones can resolve different dependency trees — the build isn't reproducible.
- Runtime / toolchain pinned — An unpinned runtime makes an agent guess the version a clean environment needs.
- Version pins are exact — A floating pin (a bare major, or a range) still drifts between installs.
- Env template present — A .env.example tells an agent which configuration keys it must supply to run.
- README documents setup — Explicit install/setup steps are what let an agent go from clone to running.
Code Navigability
1 check passed4 problems found
- lowTypeScript strict mode on
Strict typing gives an agent typed signatures to anchor an edit on, not guesses.
Fix: Turn on `strict` in tsconfig.json.
- low.editorconfig present
An .editorconfig keeps whitespace and encoding consistent, so diffs stay legible.
Fix: Add an .editorconfig pinning indentation, charset, and final-newline.
- 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.
Verification Surface
6 checks passed1 problem 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.
- 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.
- Typecheck command — A typecheck script lets an agent catch type errors before they ship.
- Build command — A documented build command is the discoverable way for an agent to produce artifacts.
Agent Safety
7 checks passed1 problem found
- 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.
- .gitignore covers env files — An ignore rule for .env is what keeps the next careless commit from leaking secrets.
- 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.
- Security policy — A SECURITY.md is where an autonomous security agent reads this repo's rules before acting on it.
- License makes the code reusable — Without a license an agent cannot safely copy, redistribute, or vendor any of this code.
Context Economy
2 checks passed2 problems 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).
- lowNo oversized source file
A single file in the hundreds of KB blows past an agent's effective context window.
Fix: Split the largest files along their natural seams.
- 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.
How ready the repo is for a human newcomer to understand, set up, and contribute.
75 / 10022 of 33 checks passed across 6 categories.
First Impression
78Well-structured README with clear purpose, unified API examples, and multiple use cases; lacks maturity signals (roadmap, stability badges, architectural overview) and demo/live playground link.
The README explicitly states the project purpose ("provider-agnostic TypeScript toolkit" for "AI-powered applications and agents"), target audience (developers using Next.js, React, Svelte, Vue, Angular, Node.js), and demonstrates mature adoption (25k stars, Vercel backing, 15 topics, CONTRIBUTING.md, SECURITY.md, issue templates). Code examples cover text generation, structured data output, agents, and UI integration—concrete and runnable. However, the README lacks a live demo/playground link, version stability badge, roadmap, or architectural diagram; the monorepo structure (7157 files) and agent-focused examples are visible but not explained upfront for newcomers unsure whether to use core SDK vs. UI modules.
Getting Running
68Essentials exist but require tribal knowledge to bridge critical gaps: lockfile is missing from repo, floating Node version in engines, no env.example for examples, and monorepo setup demands pre-reading CONTRIBUTING before any build works.
The repository provides core install and build machinery: pnpm lockfile is pinned exactly (`pnpm@10.33.4`), package.json defines clear build/test/typecheck scripts, and CONTRIBUTING.md documents the setup sequence (Node v22, pnpm v10, `pnpm install`, `pnpm build`). However, the agent cannot deterministically go from clone to running because (1) pnpm-lock.yaml is not committed (detected absent from signals; crucial for exact reproducibility), (2) engines.node is floating (`^22.0.0 || ^24.0.0 || ^26.0.0`), (3) no `.env.example` is discoverable despite CONTRIBUTING mentioning API keys are required to run examples, and (4) the monorepo structure with 70+ workspaces requires reading CONTRIBUTING to understand how to proceed—the README only documents **using** the SDK, not setting it up for contribution. Workarounds and guessing are unavoidable for example execution.
Finding Your Way
68Large monorepo with clear module layout and TypeScript strict typing, but no top-level architecture doc, inconsistent naming across 67+ packages, and weak inline documentation make navigation difficult for newcomers.
The repository is a TypeScript monorepo (verified by pnpm-workspace.yaml, turbo.json, and 67 packages in tsconfig.json references) with strict type checking and conventional layout (packages/* folders). The main README and packages/ai/README.md document the unified API pattern and example usage clearly. However, no architecture.md or design doc exists to explain the provider abstraction layer, the relationship between core (ai), utilities (provider-utils), and 60+ specialized provider packages. The index.ts barrel-export pattern (agent/, embed/, generate-text/, etc.) is machine-verifiable but many internal modules lack descriptive names; package naming is functional (@ai-sdk/openai) but the rationale for splitting core from gateway from provider-utils is unstated. TypeScript strict mode and 7157 total files create navigation surface area a newcomer must guess through.
Path to Contribute
72Comprehensive CONTRIBUTING guide and PR template present; issue templates missing and no beginner-labeled issues or legal disclaimer checks halt a higher score.
The repository has a detailed CONTRIBUTING.md with clear sections on environment setup (pnpm v10, Node v22), local development workflow, testing, and PR submission procedures (including changeset, signed commits, and code review requirements). A pull_request_template.md with checklist exists. However, the signal detection reports issueTemplates=yes but the .github/ISSUE_TEMPLATE directory search failed, and no beginner-labeled issues are detectable. The SECURITY.md file is also absent despite the signal indicating its presence, suggesting a detection issue. Package.json confirms test, build, and lint scripts are present. The setup is workable for developers willing to read the guide, but the lack of discoverable issue templates and no evidence of beginner-friendly issue labeling creates friction for newcomers identifying low-stakes entry points.
Signs of Life
85A mature, well-staffed project with active CI, frequent commits, responsive issue handling, and organized release automation via Changesets — minor gaps in contributor documentation and explicit governance.
The repository shows strong signs of maintenance and sustainability: the last commit timestamp (2026-06-20T23:47:06Z) is current, the file tree contains 200+ Changeset entries indicating high release cadence and structured versioning, package.json declares exact pnpm version pinning (pnpm@10.33.4) with a configured CI release pipeline (`ci:release` and `ci:version` scripts), and the CONTRIBUTING.md provides explicit setup and contribution workflows. The monorepo structure with 7157 files, 11 CI workflows detected, and organized dependency management (turbo, husky hooks, publint validation) indicate a professional release process. However, CODEOWNERS is absent (no explicit contributor governance), PR templates are not detected, and contributor response metrics (PR merge time, issue resolution rate) cannot be verified from the snapshot alone.
Open Door
85Legal cover, conduct rules, and help channels all present and explicit; missing only a PR template to round out contributor friction points.
The repository has Apache 2.0 license (LICENSE file confirmed), a code of conduct linked from a public Vercel Community page (CODE_OF_CONDUCT.md), and a security reporting path via security@vercel.com documented in .github/SECURITY.md. CONTRIBUTING.md is substantial and covers bug reporting, issue submission, and pull request workflow. The detected signals confirm issue templates and contributing guidelines exist; only a PR template is absent.
First Impression
5 checks passed1 problem found
- lowStatus badges
Build/version badges signal at a glance that the project is alive and healthy.
Fix: Add a few status badges (CI, version, license) near the top of the README.
- 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.
- 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
5 checks passed2 problems found
- 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.
- 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.
- Lockfile committed — Without a lockfile a newcomer's install resolves differently and hits errors the docs don't mention.
- Prerequisite versions pinned — Unpinned prerequisites are the classic 'works on my machine' first-run failure.
- Env template present — A .env.example shows a newcomer exactly which settings they must fill in to run it.
- README documents setup — Explicit install steps are the difference between a 5-minute start and giving up.
- Versions pinned exactly — A floating version still drifts — a newcomer can hit a break the maintainer never saw.
Finding Your Way
1 check passed4 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.
- lowNo oversized source file
A single thousand-line file is a wall a newcomer bounces off.
Fix: Split the largest files along their natural seams.
- low.editorconfig present
Consistent indentation/encoding keeps the code readable and diffs clean for newcomers.
Fix: Add an .editorconfig pinning indentation, charset, and final-newline.
- 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.
Path to Contribute
4 checks passed2 problems found
- 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.
- CONTRIBUTING guide — A CONTRIBUTING guide is the difference between a guessed and a guided first PR.
- Issue templates — Issue templates show a newcomer how to file something useful — and that contributions are welcome.
- 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
3 checks passed1 problem found
- lowLicense is a standard one
A non-standard or custom license is a legal question mark a newcomer won't resolve.
Fix: Use a recognised OSI license so reuse terms are unambiguous.
- License present — With no license the project isn't legally reusable — the door is shut however friendly the README.
- Code of conduct — A code of conduct states the social ground rules that make it safe to step in.
- Security policy — A SECURITY.md tells a newcomer how to report a problem responsibly.
Where the grip slips
- mediumReproducible Setup+2 pts if fixed
No container image, Devcontainer, or compose file
pnpm and Node.js installation still rely on host environment and manual steps (brew, npm, etc.). Without a containerized dev environment, platform-specific issues (Windows vs. macOS vs. Linux) are not pre-eliminated.
Fix: Add a Dockerfile and/or .devcontainer/devcontainer.json to fully specify OS, pnpm version, Node.js, and all system dependencies. Include a docker-compose.yml for orchestration of examples/test databases if needed.
- mediumVerification Surface+2 pts if fixed
CI workflow definitions not visible/verified
The signal reports ci=yes(11) but .github/workflows files are absent from the snapshot. An agent cannot read or verify that these workflows actually run the test/lint/build commands without direct access to their definitions.
Fix: Ensure .github/workflows/*.yml files are included in any snapshot passed to the agent, or document their names and trigger conditions in a machine-readable file (e.g., .github/WORKFLOWS.md).
- highAgent Safety+1 pts if fixed
Missing SECURITY.md disclosure policy
No SECURITY.md file exists to communicate vulnerability reporting process or security contacts. An agent (or maintainer) cannot verify safe handling of agent-safety reports or understand the project's threat model.
Fix: Create SECURITY.md with: supported version policy, vulnerability reporting email/GPG key, disclosure timeline, and security contacts. Reference it in README.
- highAgent Safety+1 pts if fixed
No explicit agent-safety boundaries or documentation
README mentions agent support and shows agent examples, but does not document which APIs are safe for untrusted agent input, injection-prone surfaces (e.g., prompt strings, tool definitions), or runtime constraints. No .agents/skills file validates agent capabilities.
Fix: Add 'Agent Safety' section to README documenting: unsafe/safe APIs for agents, injection risks in tool definitions and system prompts, environment variable isolation requirements, and link to llms.txt or .agents/skills manifest.
- mediumReproducible Setup+1 pts if fixed
Node.js version floats across major releases
package.json specifies engines.node as '^22.0.0 || ^24.0.0 || ^26.0.0', allowing any semver match within those ranges. An agent could pull Node 22.0.0 or 26.99.99 and encounter undocumented or inconsistent behavior.
Fix: Pin a single Node.js version in engines (e.g., '22.11.0') or provide a .node-version or .nvmrc file to enforce the exact LTS release used in CI.
- highCode Navigability+1 pts if fixed
Missing architecture documentation
No ARCHITECTURE.md or docs/structure.md exists to explain how 70+ packages relate to each other, which exports to import from which package, and the build dependency graph. An agent must reverse-engineer this from package.json exports and tsconfig references alone.
Fix: Create docs/ARCHITECTURE.md with a directed graph of package dependencies, export entry points for each major package (ai, @ai-sdk/react, @ai-sdk/openai, etc.), and a module glossary. Include examples like 'to call OpenAI models, import from @ai-sdk/openai; to build UI, use @ai-sdk/react.'
- mediumCode Navigability+1 pts if fixed
Unclear naming of internal provider packages
70+ packages with names like 'anthropic', 'openai', 'azure', 'google' do not explicitly signal whether they are @ai-sdk/ scoped or bare. The signal detection only confirmed 'monorepo=yes' but not the naming convention pattern; files output does not clarify @ai-sdk/anthropic vs anthropic distinctions.
Fix: Standardize all provider packages to @ai-sdk/ scope consistently (already seen in react, but confirm 100% across all 70 packages). Add a scoping rule to .npmrc or document.md stating 'All provider integrations use @ai-sdk/PROVIDER scope.'
- mediumContext Economy+1 pts if fixed
Large file count (7157) without architectural navigation aid
While individual files are not bloated, the total repository size of 7157 files creates context-window pressure. No architecture documentation (architectureDoc signal absent) or llms.txt guide exists to help an agent quickly navigate which packages are entry points vs. internal utilities, prioritizing what to read first.
Fix: Create an llms.txt file at the root documenting the monorepo structure: list the primary packages (ai, @ai-sdk/react, @ai-sdk/openai, etc.), their purpose, inter-dependencies, and which are entry points. Alternatively, add an architecture.md describing the package hierarchy and which files are most critical for understanding the codebase.
- mediumContext Economy+1 pts if fixed
No .gitattributes linguist markers for generated bulk
The .changeset/ directory contains 300+ auto-generated changelog entry files that are structural noise. Without linguist-generated or linguist-vendored markers in .gitattributes, an agent cannot automatically filter or de-prioritize these files and must treat them as legitimate source code.
Fix: Add a .gitattributes file with: .changeset/** linguist-generated=true. This signals to code analysis and AI tools that the entire directory is generated and should be skipped or deprioritized.
- mediumMachine Orientation+1 pts if fixed
Missing root README.md file
The signal indicates README=yes but the file does not exist in the repository root. Agents rely on README.md as the primary machine-readable entry point; without it, they must fall back to AGENTS.md or infer structure from package.json and contributed documentation.
Fix: Create a root README.md (even brief) linking to AGENTS.md and documenting the monorepo structure, setup (pnpm install), and test/build commands. Alternatively, ensure the README signal accurately reflects the absent file.
- mediumVerification Surface+1 pts if fixed
No quantified test coverage visibility
No coverage configuration (e.g., .nycrc, nyc in package.json, coverage thresholds in vitest.config.js) is visible. An agent cannot verify that tests actually cover critical code paths or fail if coverage drops.
Fix: Add coverage configuration to Vitest (e.g., 'coverage: { provider: "v8", reporter: ["text", "html"], lines: 80 }') and expose a 'pnpm coverage' or 'pnpm test:coverage' script.
- lowVerification Surface+1 pts if fixed
Test flakiness/reliability not declared
Vitest node and edge configs are minimal stub files; no retry logic, timeout policies, or flakiness detection are specified. An agent cannot distinguish between real failures and environmental timing issues.
Fix: Extend vitest.node.config.js and vitest.edge.config.js with explicit timeout, retry, and bail settings (e.g., 'test: { testTimeout: 10000, bail: 1 }') to make test reliability expectations machine-readable.
- mediumAgent Safety
No llms.txt or .agents/skills manifest
Detected signal shows .agents/skills directory exists but no machine-readable agent-safety manifest is present. Agents cannot discover safe entry points, version constraints, or intended use patterns.
Fix: Create .agents/skills file (or llms.txt equivalent) declaring: SDK version, supported runtimes, APIs safe for agent consumption, known injection surfaces (e.g., prompt/tool fields), and links to agent-safety docs.
- lowReproducible Setup
.env.example exists but .env.local setup not explicitly documented in main README
CONTRIBUTING.md mentions env setup for examples but the main README does not explain that API keys must be populated in a .env file for most examples to run. An agent reading only README may attempt to run examples without clear guidance.
Fix: Add a 'Configuration' or 'Environment Setup' section to README.md explicitly referencing .env.example and stating that provider API keys are required for examples to function.
- mediumCode Navigability
No central index of exports and entry points
Each package exports via package.json, but there is no single reference document (e.g., docs/EXPORTS.md or src/index.ts at root) that lists all public APIs across all packages and maps them to their source file paths. An agent must traverse 70+ package.json files to find the right export.
Fix: Create docs/EXPORTS.md listing all stable exports: 'generateText → packages/ai/src/generate-text.ts', 'useChat → packages/react/src/use-chat.ts', etc. Alternatively, add a root index.ts that re-exports key types from all packages with JSDoc comments linking to source.
- mediumCode Navigability
Excessive file tree noise obscures key boundaries
7,157 files includes 900+ .changeset/ entries, test snapshots, and generated docs under prepack. An agent querying a file listing will see `.changeset/` clutter before package structure, increasing the chance of editing the wrong file or missing the actual source.
Fix: Add or verify .gitattributes linguist markers to mark .changeset/* and dist/ as generated; document in README that `packages/*/src/` is the source entry point. Consider .gitignore audit to exclude build artifacts from Latch's file index.
- lowCode Navigability
Workspaces and symlink-based dependencies not explicitly documented for agents
The package.json uses 'workspace:*' references and pnpm workspaces, but no machine-readable dependency graph file (e.g., turbo.json tasks or a graph.json) is documented. An agent reading package.json must understand pnpm workspace semantics to locate the actual source.
Fix: Add a pnpm-workspace.yaml or update turbo.json to include a 'packages' field and document in CONTRIBUTING.md: 'All packages use workspace: protocol; run pnpm install to resolve.' Optionally export turbo graph as JSON for agent consumption.
- lowContext Economy
No devcontainer or explicit build-output exclusion documentation
Although .gitignore correctly excludes dist and .next, there is no .devcontainer or Dockerfile to make the build and output footprint explicit to an agent. An agent must infer where build outputs land by reading package.json and turbo.json rather than seeing it declaratively.
Fix: Document build output locations explicitly in a top-level ARCHITECTURE.md or create a .devcontainer/devcontainer.json that codifies the build process, making it machine-readable which directories are ephemeral vs. permanent.
- mediumMachine Orientation
Missing .env.example file despite signal reporting it present
Signal reports env.example=yes, but the file is not found. Agents cannot discover required or optional environment variables (e.g., API keys for providers) without explicit documentation. AGENTS.md and CONTRIBUTING.md mention environment variables in examples but do not provide a template.
Fix: Create .env.example listing provider API key names (OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.) and flag which are required for testing. Document in AGENTS.md or CONTRIBUTING.md any special env setup (e.g., for examples/).
- lowMachine Orientation
AGENTS.md lacks entry point specification for running tests and CI verification
AGENTS.md documents development commands but does not explicitly state which commands verify the build is ready for an agent to work with (e.g., full type-check, all tests, lint pass). Agents may not know the canonical 'ready to go' verification step.
Fix: Add a section in AGENTS.md like 'Verification & CI Checks' with: `pnpm type-check:full && pnpm test && pnpm check` or reference the exact CI script from package.json scripts.
- lowMachine Orientation
.agents/skills directory referenced in README but not found in tree
README mentions 'npx skills add vercel/ai' and signal detects .agents/skills, but the directory does not exist or is empty. Agents expecting to find skill metadata or integration helpers will not locate it.
Fix: Either create .agents/skills with structured skill metadata if supported, or remove the reference from README and clarify that skills are managed externally via Vercel's skill registry.
- lowVerification Surface
Linter rule severity levels not granular for agent guidance
.oxlintrc.json bulk-disables many rules (e.g., 'no-unused-vars': 'off' for entire examples/*) and assigns broad error levels. An agent cannot distinguish which lint failures are blocking vs. warnings.
Fix: Create a secondary lint profile (e.g., .oxlintrc.strict.json) or document in linter config which rules block CI and which are advisory, then expose as 'pnpm lint:strict' for agent use.
Show your score
[](https://latch.fyi/vercel/ai)Share this analysis
https://latch.fyi/vercel/aiFixed 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.