{"id":"aud_01M267F3A317KQJPGPB7FRBKGH","target":{"owner":"vercel","repo":"ms","subpath":"","ref":"main","sha":"4ff48cec099f0514c3e9bbca18706c9c21122bfb","defaultBranch":"main","visibility":"public","sizeKb":446,"archived":false,"fork":false,"userId":null},"status":"complete","overall":73,"band":"good","bandLabel":"Good","worldClassNote":null,"verdict":"PASS_WITH_DEBT","evidence":"observed","applicableWeight":90,"verdictSentence":"vercel/ms passes every install, build, quickstart, and CI-parity gate with 100% test coverage across Node and Edge runtimes, but its agent-readiness inventory sits at just 26%, and thrown errors carry no codes or documented recovery guidance.","debtParagraph":"The core loop of vercel/ms — install, build, and 167 passing tests across Node and Edge — is fast, reproducible, and gate-clean, reflecting a mature, simple library. The debt is concentrated in operability surfaces: no AGENTS.md or machine-readable schema, no error codes or troubleshooting links on thrown errors, no --json or structured-output guidance, and no CONTRIBUTING or architecture doc. None of these block a human user today, but they slow autonomous agents and new contributors.","magicPath":{"seconds":5.677,"status":"PASS","evidence":"observed","commands":3,"credentials":0,"contextSwitches":0},"commands":[{"stage":"install","command":"pnpm install","note":"from package.json line 1","exit":0,"seconds":5.543,"skipped":false,"cut":false},{"stage":"build","command":"pnpm run build","note":"from package.json line 19","exit":0,"seconds":0.971,"skipped":false,"cut":false},{"stage":"test","command":"pnpm test","note":"from package.json line 16","exit":0,"seconds":3.999,"skipped":false,"cut":false},{"stage":"execute","command":"node --input-type=module -e \"import { ms } from './dist/index.js'; console.log(ms('2 days'));\"","note":"from README line 16","exit":0,"seconds":0.066,"skipped":false,"cut":false},{"stage":"verify","command":"node --input-type=module -e \"import { ms } from './dist/index.js'; console.log(ms(60000));\"","note":"from README line 27","exit":0,"seconds":0.066,"skipped":false,"cut":false}],"areas":[{"key":"ttfv","name":"Time to first value","weight":20,"effectiveWeight":22,"applicable":true,"score":92,"evidence":"observed","ceiling":100,"bound":null,"notes":"Install (5.5s), build (0.97s), and quickstart execute+verify steps completed in 5.7s total with zero credential prompts or retries."},{"key":"api","name":"API","weight":15,"effectiveWeight":17,"applicable":true,"score":69,"evidence":"estimated","ceiling":69,"bound":null,"notes":"Single well-typed entry point (ms, format, parse, parseStrict) with generated .d.ts, 167 tests, 100% statement/branch coverage across Node and Edge runtimes."},{"key":"sdk","name":"SDK","weight":10,"effectiveWeight":0,"applicable":false,"reason":"fewer than two SDK packages sharing the product name","score":null,"evidence":"unverified","ceiling":null,"bound":null},{"key":"cli_config","name":"CLI and configuration","weight":10,"effectiveWeight":11,"applicable":true,"score":55,"evidence":"reviewed","ceiling":84,"bound":null,"notes":"Library ships no CLI; no --json flag, no documented exit codes, and no toolchain version pin beyond engines>=20 in package.json."},{"key":"errors_recovery","name":"Errors and recovery","weight":12,"effectiveWeight":13,"applicable":true,"score":50,"evidence":"reviewed","ceiling":84,"bound":null,"notes":"Errors are plain new Error(...) with short messages (src/index.ts:59,73,143,227); no error codes, links, or recovery docs for callers to branch on."},{"key":"documentation","name":"Documentation","weight":10,"effectiveWeight":11,"applicable":true,"score":60,"evidence":"observed","ceiling":100,"bound":null,"notes":"README quickstart is accurate and fast, but no AGENTS.md, CONTRIBUTING, architecture doc, or llms.txt exists for deeper onboarding."},{"key":"local_dev","name":"Local development","weight":8,"effectiveWeight":9,"applicable":true,"score":88,"evidence":"observed","ceiling":100,"bound":null,"notes":"pnpm install/build/test finish in ~11s total; biome, husky pre-commit, and lint-staged are configured and working."},{"key":"testing_quality","name":"Testing and quality","weight":8,"effectiveWeight":9,"applicable":true,"score":95,"evidence":"observed","ceiling":100,"bound":null,"notes":"167 tests pass with 100% coverage on both Node and Edge-runtime jest environments; CI matrix confirmed to run the documented pnpm test command."},{"key":"release_compatibility","name":"Release and compatibility","weight":7,"effectiveWeight":8,"applicable":true,"score":69,"evidence":"estimated","ceiling":69,"bound":null,"notes":"CI matrix covers claimed Node engines; canary release workflow publishes with npm provenance and GITHUB_TOKEN/NPM_TOKEN secrets scoped via id-token permission."}],"findings":[{"id":"F2","severity":"P2","problemClass":6,"stage":"diagnose","gate":null,"title":"Thrown errors have no codes, links, or troubleshooting guidance","publicTitle":"Errors lack codes or troubleshooting links","why":"ms() and format() throw plain Error objects with only a short message and no error code, documentation link, or recovery guidance, e.g. at src/index.ts:59 and src/index.ts:227. A caller hitting these in production has no structured way to distinguish or handle them programmatically.","evidence":{"label":"reviewed","lines":[],"pointer":"src/index.ts:59"},"acceptanceTest":"Each thrown Error in src/index.ts carries a stable code property and README documents each code with cause and fix; a test asserts on error.code.","ownerSkill":"error-handling","fixPrompt":"In src/index.ts, give each thrown Error a stable machine-readable code property (e.g. err.code = 'ERR_MS_INVALID_INPUT'). Document each code, its cause, and how to fix it in a new 'Errors' section of README.md. Add tests asserting error.code for each throw site.","v0Eligible":true}],"gates":[{"gate":"BROKEN_CANONICAL_INSTALL","result":"pass","checked":"pnpm install exits 0 from a clean clone with no credential prompt"},{"gate":"NON_REPRODUCIBLE_BUILD","result":"pass","checked":"install, build and test complete in 11 s — the standard allows 10 min"},{"gate":"BROKEN_QUICKSTART","result":"pass","checked":"the documented quickstart reached a verified outcome in 5.7 s"},{"gate":"UNVERIFIABLE_CI_PARITY","result":"pass","checked":"the package.json test command pnpm test appears in .github/workflows/quality.yml, .github/workflows/release.yml, .github/workflows/test.yml, doc:README.md"},{"gate":"UNTESTED_SUPPORTED_VERSION","result":"pass","checked":"every version the repository claims to support appears in the CI matrix"},{"gate":"UNSAFE_EXAMPLES","result":"pass","checked":"no secret-shaped strings found in examples or docs"},{"gate":"UNEXPLAINED_ERROR","result":"unverified","checked":"no break or diagnose step executed — inventory-only evidence yields P2 findings, never this gate"},{"gate":"UNDOCUMENTED_BREAKING_API","result":"not_yet","checked":"needs two versions to compare — coming in v2"},{"gate":"SDK_API_DRIFT","result":"not_yet","checked":"needs an OpenAPI JSON spec and an SDK language to compare — not in v1"},{"gate":"STALE_PUBLIC_REFERENCE","result":"not_yet","checked":"needs a generated reference to compare against behaviour — not in v1"}],"engine":{"engineVersion":"0.5.0","skillsVersion":"2.9.4+de1abc8","modelId":"anthropic/claude-sonnet-5","temperature":0,"runner":"dx_journey.py (fork of journey_runner.py @ de1abc8)","sandbox":"vercel/sandbox/universal","vcpus":2,"plannerFallback":false,"journeyPinned":true,"droppedFindings":3,"budgetExceeded":false},"startedAt":"2026-09-10T17:57:20.345Z","finishedAt":"2026-09-10T17:59:33.887Z","durationSeconds":134,"cached":false}