{"_id":"@a2zai-ai/driftcheck","_rev":"5-be93db3bf983de9a446d589662f28046","name":"@a2zai-ai/driftcheck","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@a2zai-ai/driftcheck","version":"0.1.0","license":"MIT","_id":"@a2zai-ai/driftcheck@0.1.0","maintainers":[{"name":"ikrish","email":"krishna.adavi@gmail.com"}],"bin":{"driftcheck":"bin/driftcheck.js"},"dist":{"shasum":"3ff22799a59faf655755dd6c03fdc23d485bd906","tarball":"https://registry.npmjs.org/@a2zai-ai/driftcheck/-/driftcheck-0.1.0.tgz","fileCount":7,"integrity":"sha512-ioA1nDs6arMRBTGOhtrG8ZoFu5iVF6Qkj/qwJL5pAC0VQZ3y2oOzJizzD886bmkGeF2h6pWs+FMdaUybButeFw==","signatures":[{"sig":"MEUCIQDELfSATwGWt1bX+V9mSAYSLy55wLoicjeJJVC/GZiiIQIgfgJ6RIo2J9yjcPjStCRmFJNIK1tlTUJgStP69qg55Pk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28590},"type":"commonjs","engines":{"node":">=18"},"gitHead":"ab047c5fdb9b4d3b23d9d60373a5a2d06d46d228","scripts":{"smoke":"node bin/driftcheck.js init --force && node bin/driftcheck.js check"},"_npmUser":{"name":"ikrish","email":"krishna.adavi@gmail.com"},"_npmVersion":"11.7.0","description":"Local-first regression intelligence for AI builders.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"yaml":"^2.8.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/driftcheck_0.1.0_1777157037182_0.9074164565922098","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@a2zai-ai/driftcheck","version":"0.2.0","license":"MIT","_id":"@a2zai-ai/driftcheck@0.2.0","maintainers":[{"name":"ikrish","email":"krishna.adavi@gmail.com"}],"bin":{"driftcheck":"bin/driftcheck.js"},"dist":{"shasum":"989108a5fd8b8ec3bee04081b01d26737257bfa7","tarball":"https://registry.npmjs.org/@a2zai-ai/driftcheck/-/driftcheck-0.2.0.tgz","fileCount":7,"integrity":"sha512-S3mowDZiC0EMHX+74wRd059P8FAIFfGKGLMg1BVmbDKh726SWmBk+yMMoBpAiF8ViYUVbblI4DlzivxclSKUHw==","signatures":[{"sig":"MEYCIQCf7/u9YcorGTbtaUxz1dBDqNSEen7+TogQYg+rw7UlmgIhALsvaT5VN5EeJ2CiV1eqScVdNQyYmXwsEqgs2Ew9gf1b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34606},"type":"commonjs","engines":{"node":">=18"},"gitHead":"6b2a6e089231fba6ebe34ca793ac6994e5a0dd47","scripts":{"smoke":"node bin/driftcheck.js init --force && node bin/driftcheck.js check"},"_npmUser":{"name":"ikrish","email":"krishna.adavi@gmail.com"},"_npmVersion":"11.7.0","description":"Local-first regression intelligence for AI builders.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"yaml":"^2.8.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/driftcheck_0.2.0_1777238954843_0.37792795973155946","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@a2zai-ai/driftcheck","version":"0.3.0","license":"MIT","_id":"@a2zai-ai/driftcheck@0.3.0","maintainers":[{"name":"ikrish","email":"krishna.adavi@gmail.com"}],"bin":{"driftcheck":"bin/driftcheck.js"},"dist":{"shasum":"ac95df7a994407e7cf67e3e406657b123e79d847","tarball":"https://registry.npmjs.org/@a2zai-ai/driftcheck/-/driftcheck-0.3.0.tgz","fileCount":7,"integrity":"sha512-Qa2zfk0HO6fnWviTUvRTu1MGkXIarggibDGkvD5WI74MdpGKwX0cwGg8r7gi+YkQgOcMRlmDadCU3mFb/nO3nQ==","signatures":[{"sig":"MEYCIQDQh16IJtcn/w0eg5P5KLc/VnDGs/jFCQXJao1fA01W9gIhAOY70GKZfRQmXpxPFQz9396ZDLtzoBB6LyhZGTTGbT/e","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38128},"type":"commonjs","engines":{"node":">=18"},"gitHead":"ef7ea903c0d330f3145df4d811bc2e2d9958f0aa","scripts":{"smoke":"node bin/driftcheck.js init --force && node bin/driftcheck.js check"},"_npmUser":{"name":"ikrish","email":"krishna.adavi@gmail.com"},"_npmVersion":"11.7.0","description":"Local-first regression intelligence for AI builders.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"yaml":"^2.8.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/driftcheck_0.3.0_1777243072033_0.9745323925347882","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@a2zai-ai/driftcheck","version":"0.4.0","license":"MIT","_id":"@a2zai-ai/driftcheck@0.4.0","maintainers":[{"name":"ikrish","email":"krishna.adavi@gmail.com"}],"bin":{"driftcheck":"bin/driftcheck.js"},"dist":{"shasum":"be094e6d8ccb4a44840fdfe2edcd790631db995c","tarball":"https://registry.npmjs.org/@a2zai-ai/driftcheck/-/driftcheck-0.4.0.tgz","fileCount":8,"integrity":"sha512-gj+dql8WOv32IS7uzKo2zyppt4O6zY7qflDhZY2tep4i/wLvBRFpSwKkSPMXlwGmupp88FKFsLdUjtE6cz4Vjg==","signatures":[{"sig":"MEUCIQDn3fRaueQncEQgreSM0UBzpsi9Fh4Y8Y3dw0vkbFyUnwIgZqAu6l7mw92ZSF9AZnV1uOKmw3X/TpTLeERnFAS9XLg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55651},"type":"commonjs","engines":{"node":">=18"},"gitHead":"52485d285de28bc174943dddfc5ad7348d7f4366","scripts":{"test":"node test/engine.test.js","smoke":"node bin/driftcheck.js init --force && node bin/driftcheck.js check"},"_npmUser":{"name":"ikrish","email":"krishna.adavi@gmail.com"},"_npmVersion":"11.7.0","description":"Local-first regression intelligence for AI builders.","directories":{},"_nodeVersion":"23.9.0","dependencies":{"yaml":"^2.8.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/driftcheck_0.4.0_1778284751608_0.4212858973001996","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@a2zai-ai/driftcheck","version":"0.5.0","description":"Local-first regression intelligence for AI builders.","license":"MIT","type":"commonjs","bin":{"driftcheck":"bin/driftcheck.js"},"scripts":{"smoke":"node bin/driftcheck.js init --force && node bin/driftcheck.js check","test":"node test/engine.test.js"},"dependencies":{"yaml":"^2.8.2"},"engines":{"node":">=18"},"gitHead":"ec1de7c1e8cedf705c239bd223cb75aac6f16141","_id":"@a2zai-ai/driftcheck@0.5.0","_nodeVersion":"23.9.0","_npmVersion":"11.7.0","dist":{"integrity":"sha512-Rad/KvQNcw9ZrI2p5Gk5+FSA+R1SvS782t+1IboF5ad28HN69OTTe4JUlSZRE8wAwHNXfuXOFjByi4vcRWFF2Q==","shasum":"c389ce4b984245e49cc3f79078fc2db75074f636","tarball":"https://registry.npmjs.org/@a2zai-ai/driftcheck/-/driftcheck-0.5.0.tgz","fileCount":10,"unpackedSize":65662,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDEZGfI1NFbYglJDPSk6Rt4FOryrEEBELMlPMjXXWx+lgIhAOBhDI84Fly4kTvvu8mC8f9U+N5zbsr5B4AWTgnyTedM"}]},"_npmUser":{"name":"ikrish","email":"krishna.adavi@gmail.com"},"directories":{},"maintainers":[{"name":"ikrish","email":"krishna.adavi@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/driftcheck_0.5.0_1779154613356_0.2291198000550978"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-25T22:43:57.122Z","modified":"2026-05-19T01:36:53.651Z","0.1.0":"2026-04-25T22:43:57.316Z","0.2.0":"2026-04-26T21:29:14.990Z","0.3.0":"2026-04-26T22:37:52.182Z","0.4.0":"2026-05-08T23:59:11.748Z","0.5.0":"2026-05-19T01:36:53.528Z"},"license":"MIT","description":"Local-first regression intelligence for AI builders.","maintainers":[{"name":"ikrish","email":"krishna.adavi@gmail.com"}],"readme":"# DriftCheck by A2ZAI\n\nLocal-first regression intelligence for AI builders.\n\nDriftCheck helps catch behavior drift when prompts, tools, RAG flows, SDKs, or models change. It runs locally first, writes JSON and markdown reports, and publishes a hosted proof card only when you choose.\n\n## Quick Start\n\n```bash\nnpx @a2zai-ai/driftcheck init\nnpx @a2zai-ai/driftcheck check\n```\n\nDuring local package development:\n\n```bash\nnpm install\nnpm run smoke\n```\n\nDriftCheck creates:\n\n- `.driftcheck/checks/*.yml` starter packs\n- `.driftcheck/runs/latest.json`\n- `driftcheck-report.md`\n\n## Starter Packs\n\n- **Tool-Calling Reliability**: schema-valid tool arguments, safe fallback behavior, and hallucinated tools.\n- **RAG Faithfulness**: grounded answers, citations, missing-context refusal, and source scope.\n- **Model Migration**: quality, cost, latency, and safety drift when moving between models.\n- **Agent Workflows**: tool recovery, permission boundaries, sensitive-action confirmation, and state consistency.\n\nTo also write a live model comparison pack:\n\n```bash\nnpx @a2zai-ai/driftcheck init --live\n```\n\n## Run One Pack\n\n```bash\nnpx @a2zai-ai/driftcheck check --pack tool-calling\nnpx @a2zai-ai/driftcheck check --pack rag-faithfulness\nnpx @a2zai-ai/driftcheck check --pack model-migration\n```\n\n## Override Models From The CLI\n\nFor packs with a live `execution` block, you can override the baseline and candidate models without editing YAML:\n\n```bash\nOPENAI_API_KEY=\"sk-...\" npx @a2zai-ai/driftcheck check \\\n  --pack model-migration \\\n  --baseline-model gpt-4o-mini \\\n  --candidate-model gpt-4.1-mini\n```\n\nThe same values can be set with environment variables:\n\n```bash\nDRIFTCHECK_BASELINE_MODEL=gpt-4o-mini \\\nDRIFTCHECK_CANDIDATE_MODEL=gpt-4.1-mini \\\nOPENAI_API_KEY=\"sk-...\" \\\nnpx @a2zai-ai/driftcheck check --pack model-migration\n```\n\nStatic packs still run without API keys. Model overrides only affect packs that define `execution.provider`.\n\n## One-Command Live Compare\n\nUse `compare` when you want to check a model migration without editing YAML first:\n\n```bash\nOPENAI_API_KEY=\"sk-...\" npx @a2zai-ai/driftcheck compare \\\n  --baseline-model gpt-4o-mini \\\n  --candidate-model gpt-4.1-mini\n```\n\nThis runs the built-in Live Model Compare pack and writes the same `.driftcheck/runs/latest.json` and `driftcheck-report.md` outputs.\n\n## Compare Two Runs\n\nUse `diff` to turn two DriftCheck reports into a regression review:\n\n```bash\nnpx @a2zai-ai/driftcheck diff \\\n  --base .driftcheck/runs/baseline.json \\\n  --head .driftcheck/runs/latest.json\n```\n\nThe diff highlights overall score delta, dimension deltas, new regressions, recovered cases, new checks, removed checks, and the biggest score drops.\n\n## Bless A Baseline\n\nUse `baseline` to mark the latest known-good run as the comparison point for future PRs:\n\n```bash\nnpx @a2zai-ai/driftcheck baseline\n```\n\nThis writes `.driftcheck/runs/baseline.json` from `.driftcheck/runs/latest.json`.\n\nTo overwrite an existing baseline after reviewing a good run:\n\n```bash\nnpx @a2zai-ai/driftcheck baseline --force\n```\n\n## Fail On Regressions\n\nUse `--base` and `--fail-on-regression` when DriftCheck should act as a PR guardrail:\n\n```bash\nnpx @a2zai-ai/driftcheck check \\\n  --base .driftcheck/runs/baseline.json \\\n  --fail-on-regression\n```\n\nBy default, the regression gate fails when a previously passing case now needs review. You can also fail when the overall score drops by a configured amount:\n\n```bash\nnpx @a2zai-ai/driftcheck check \\\n  --base .driftcheck/runs/baseline.json \\\n  --fail-on-regression \\\n  --max-score-drop 5\n```\n\n## Generate A CI Summary\n\n```bash\nnpx @a2zai-ai/driftcheck summary --run .driftcheck/runs/latest.json\n```\n\nThe GitHub Action writes this summary to the workflow run automatically, so PR authors can see the overall score, dimension scores, model pair, and cases needing review without opening artifacts.\n\nTo include a regression review in the summary:\n\n```bash\nnpx @a2zai-ai/driftcheck summary \\\n  --run .driftcheck/runs/latest.json \\\n  --base .driftcheck/runs/baseline.json\n```\n\n## Publish A Proof Card\n\nPublishing is explicit. Reports stay local unless you run `publish`.\n\n```bash\nDRIFTCHECK_TOKEN=\"paste-token-here\" npx @a2zai-ai/driftcheck publish --run .driftcheck/runs/latest.json --public\n```\n\nThe hosted proof layer currently lives at A2ZAI:\n\n```bash\nDRIFTCHECK_API_URL=\"https://www.a2zai.ai\" npx @a2zai-ai/driftcheck publish --run .driftcheck/runs/latest.json --public\n```\n\n## Pack Format\n\nPacks live in `.driftcheck/checks/*.yml`.\n\n```yaml\nid: tool-calling\nname: Tool-Calling Reliability\ncategory: tool-calling\ndescription: Catch schema drift, hallucinated tool calls, and weak fallback behavior before agent changes ship.\ncases:\n  - name: Valid tool arguments\n    dimension: quality\n    weight: 3\n    threshold: 80\n    baselineOutput: \"call_tool({ user: 'acct_123', action: 'refund_review' })\"\n    candidateOutput: \"call_tool({ userId: 'acct_123', action: 'refund_review' })\"\n    expectedContains:\n      - userId\n      - action\n    forbiddenContains:\n      - malformed\n      - undefined\n```\n\nSupported categories:\n\n- `tool-calling`\n- `rag-faithfulness`\n- `model-migration`\n- `agent-workflows`\n\nSupported score dimensions:\n\n- `quality`\n- `safety`\n- `latency`\n- `cost`\n\nString and regex assertions are supported:\n\n```yaml\nexpectedContains:\n  - confirm\nexpectedRegex:\n  - \"manual (review|handoff|escalation)\"\nforbiddenContains:\n  - completed successfully\nforbiddenRegex:\n  - \"deleting .* now\"\n```\n\n## Live Model Execution\n\nStatic outputs work without API keys. To compare live OpenAI model responses, add an `execution` block and set `OPENAI_API_KEY`.\n\n```yaml\nexecution:\n  provider: openai\n  baselineModel: gpt-4o-mini\n  candidateModel: gpt-4.1-mini\n  temperature: 0\n  maxTokens: 140\n```\n\n## GitHub Action\n\nAfter this repo is public, use:\n\n```yaml\nname: DriftCheck\n\non:\n  pull_request:\n\njobs:\n  driftcheck:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: a2zai-ai/driftcheck@v0\n        with:\n          fail-threshold: 70\n          baseline-run: .driftcheck/runs/baseline.json\n          fail-on-regression: true\n          max-score-drop: 5\n          baseline-model: gpt-4o-mini\n          candidate-model: gpt-4.1-mini\n```\n\n## Privacy\n\nDriftCheck is local-first:\n\n- Pack files stay in your repo.\n- Reports are written locally.\n- Publish is opt-in.\n- Known secret patterns are redacted from generated reports before publish.\n\n## Roadmap\n\n- more starter packs for support bots, coding workflows, and RAG apps\n- live execution providers beyond OpenAI\n- richer CI artifacts for build systems beyond GitHub Actions\n- hosted proof-card improvements in A2ZAI\n","readmeFilename":"README.md"}