{"_id":"@aerofortress/assay","_rev":"5-975029e0c4b76fcb796d626bc39d0d65","name":"@aerofortress/assay","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@aerofortress/assay","version":"0.1.0","keywords":["avp","assay","acceptance","verification","testing","react","archetypes"],"author":{"name":"Lucas Tinoco"},"license":"MIT","_id":"@aerofortress/assay@0.1.0","maintainers":[{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"}],"homepage":"https://github.com/lucasrgt/acceptance-verification-protocol#readme","bugs":{"url":"https://github.com/lucasrgt/acceptance-verification-protocol/issues"},"bin":{"assay":"bin/assay.mjs"},"dist":{"shasum":"a22ab474be81b186bba7fa0c47e1eca2b7575532","tarball":"https://registry.npmjs.org/@aerofortress/assay/-/assay-0.1.0.tgz","fileCount":27,"integrity":"sha512-bRm7JdrzLUZIxclE80u9MWF2cJ44Dhp6ZOg3VPOGpH0vkx06XwWn1BKTP8jgPqJSC2c69L73YXwSypIeFTwP9w==","signatures":[{"sig":"MEUCIQCpZutc8Oqwf/ElPJ0ydfmzuXh5q6rN20nopP61sxcGLQIgej55k2MROU59WJu65tIZC41XeWow3whzrcSFjjTq8pw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":901482},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./http":{"types":"./dist/http.d.ts","import":"./dist/http.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./design":{"types":"./dist/design.d.ts","import":"./dist/design.js"},"./package.json":"./package.json","./react/vitest":{"types":"./dist/react/vitest.d.ts","import":"./dist/react/vitest.js"}},"gitHead":"2197ca40e7710ae9b0c7c6ab44e5c68d6dc2a2d6","scripts":{"test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"},"repository":{"url":"git+https://github.com/lucasrgt/acceptance-verification-protocol.git","type":"git","directory":"assay"},"workspaces":["examples/*"],"_npmVersion":"10.9.8","description":"Assay — the reference JS/React implementation of AVP (Acceptance Verification Protocol). Deterministic behavior verification for AI-built web features: tap the vein and confirm it's remediated.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"msw":"^2.6.8","@testing-library/react":"^16.0.1","@testing-library/user-event":"^14.5.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","jsdom":"^25.0.1","react":"^18.3.1","vitest":"^2.1.8","react-dom":"^18.3.1","typescript":"^5.6.3","@types/node":"^22.10.1","@types/react":"^18.3.12","puppeteer-core":"^25.1.0","@types/react-dom":"^18.3.1","@testing-library/dom":"^10.4.0","@tanstack/react-router":"^1.170.16"},"peerDependencies":{"jsdom":">=25","react":">=18","vitest":">=2","react-dom":">=18","@anthropic-ai/sdk":">=0.40.0"},"peerDependenciesMeta":{"jsdom":{"optional":true},"@anthropic-ai/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/assay_0.1.0_1782101517039_0.5072040481213336","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aerofortress/assay","version":"0.2.0","keywords":["avp","assay","acceptance","verification","testing","react","archetypes"],"author":{"name":"Lucas Tinoco"},"license":"MIT","_id":"@aerofortress/assay@0.2.0","maintainers":[{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"}],"homepage":"https://github.com/lucasrgt/acceptance-verification-protocol#readme","bugs":{"url":"https://github.com/lucasrgt/acceptance-verification-protocol/issues"},"bin":{"assay":"bin/assay.mjs"},"dist":{"shasum":"39924a1c0145c99eb9d97020be12ff2611f7cf57","tarball":"https://registry.npmjs.org/@aerofortress/assay/-/assay-0.2.0.tgz","fileCount":44,"integrity":"sha512-S5N8iu33FGeqhM688KFGQl3anXNs+batwKCMaLLb44mtfZbuEzgnMUuf44cyDh+mtwBsdNb+Hnc3IjVz/kiMFw==","signatures":[{"sig":"MEUCIHLTdTieMU/q602FOEHp+g6GjaPQbWCiC3lTTQlE3zDAAiEAmvacYRKfRhbRgN+u3rvcBMJXVWMhzQ5iN6LwWFFyqBk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aerofortress%2fassay@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1094931},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./http":{"types":"./dist/http.d.ts","import":"./dist/http.js"},"./judge":{"types":"./dist/judge.d.ts","import":"./dist/judge.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./design":{"types":"./dist/design.d.ts","import":"./dist/design.js"},"./package.json":"./package.json","./react/vitest":{"types":"./dist/react/vitest.d.ts","import":"./dist/react/vitest.js"},"./design/browser":{"types":"./dist/design/browser.d.ts","import":"./dist/design/browser.js"}},"gitHead":"9ff87ee1c50c9e8988b0983b10d0d1501752bbcd","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"},"repository":{"url":"git+https://github.com/lucasrgt/acceptance-verification-protocol.git","type":"git","directory":"assay"},"workspaces":["examples/*"],"_npmVersion":"10.9.8","description":"Assay — the reference JS/React implementation of AVP (Acceptance Verification Protocol). Deterministic behavior verification for AI-built web features: tap the vein and confirm it's remediated.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.6.8","tsup":"^8.3.5","jsdom":"^25.0.1","react":"^18.3.1","eslint":"^9.17.0","vitest":"^2.1.8","react-dom":"^18.3.1","@eslint/js":"^9.17.0","typescript":"^5.6.3","@types/node":"^22.10.1","@types/react":"^18.3.12","puppeteer-core":"^25.1.0","@types/react-dom":"^18.3.1","typescript-eslint":"^8.19.0","@testing-library/dom":"^10.4.0","@tanstack/react-router":"^1.170.16","@testing-library/react":"^16.0.1","@testing-library/user-event":"^14.5.2"},"peerDependencies":{"msw":">=2.6","jsdom":">=25","react":">=18","vitest":">=2","react-dom":">=18","puppeteer-core":">=23","@anthropic-ai/sdk":">=0.40.0","@testing-library/react":">=16","@testing-library/user-event":">=14"},"peerDependenciesMeta":{"msw":{"optional":true},"jsdom":{"optional":true},"react":{"optional":true},"vitest":{"optional":true},"react-dom":{"optional":true},"puppeteer-core":{"optional":true},"@anthropic-ai/sdk":{"optional":true},"@testing-library/react":{"optional":true},"@testing-library/user-event":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/assay_0.2.0_1782944554562_0.3921538461904954","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aerofortress/assay","version":"0.3.0","keywords":["avp","assay","acceptance","verification","testing","react","archetypes"],"author":{"name":"Lucas Tinoco"},"license":"MIT","_id":"@aerofortress/assay@0.3.0","maintainers":[{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"}],"homepage":"https://github.com/lucasrgt/acceptance-verification-protocol#readme","bugs":{"url":"https://github.com/lucasrgt/acceptance-verification-protocol/issues"},"bin":{"assay":"bin/assay.mjs"},"dist":{"shasum":"e8bd7be765dd73ccbd36e099ef77351ac0fa1fdc","tarball":"https://registry.npmjs.org/@aerofortress/assay/-/assay-0.3.0.tgz","fileCount":44,"integrity":"sha512-w2vrKeeA7Xxm+6KfRDeBkkntGbKZqpOtAIW+grlHQEeJuaxomwKHtkPc++ToUyKM3eoRqhFolV0SfjwLvG8LLA==","signatures":[{"sig":"MEYCIQC6zdTsn+o6UrcfGd8/dKM7PirpLiABQMRt/cUtowAzZAIhAMgJIAkM0uivMVmpwxVe4l9gmS5QQzhSeRKM5GYlGAh+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aerofortress%2fassay@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1098722},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./http":{"types":"./dist/http.d.ts","import":"./dist/http.js"},"./judge":{"types":"./dist/judge.d.ts","import":"./dist/judge.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./design":{"types":"./dist/design.d.ts","import":"./dist/design.js"},"./package.json":"./package.json","./react/vitest":{"types":"./dist/react/vitest.d.ts","import":"./dist/react/vitest.js"},"./design/browser":{"types":"./dist/design/browser.d.ts","import":"./dist/design/browser.js"}},"gitHead":"62eb4b29211fbdac097bfb03fde4d0ae447816fe","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"},"overrides":{"esbuild":"^0.28.1"},"repository":{"url":"git+https://github.com/lucasrgt/acceptance-verification-protocol.git","type":"git","directory":"assay"},"workspaces":["examples/*"],"_npmVersion":"10.9.8","description":"Assay — the reference JS/React implementation of AVP (Acceptance Verification Protocol). Deterministic behavior verification for AI-built web features: tap the vein and confirm it's remediated.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.6.8","tsup":"^8.3.5","jsdom":"^25.0.1","react":"^18.3.1","eslint":"^9.17.0","vitest":"^4.1.10","react-dom":"^18.3.1","@eslint/js":"^9.17.0","typescript":"^5.6.3","@types/node":"^22.10.1","@types/react":"^18.3.12","puppeteer-core":"^25.1.0","@types/react-dom":"^18.3.1","typescript-eslint":"^8.19.0","@testing-library/dom":"^10.4.0","@tanstack/react-router":"^1.170.16","@testing-library/react":"^16.0.1","@testing-library/user-event":"^14.5.2"},"peerDependencies":{"msw":">=2.6","jsdom":">=25","react":">=18","vitest":">=2","react-dom":">=18","puppeteer-core":">=23","@anthropic-ai/sdk":">=0.40.0","@testing-library/react":">=16","@testing-library/user-event":">=14"},"peerDependenciesMeta":{"msw":{"optional":true},"jsdom":{"optional":true},"react":{"optional":true},"vitest":{"optional":true},"react-dom":{"optional":true},"puppeteer-core":{"optional":true},"@anthropic-ai/sdk":{"optional":true},"@testing-library/react":{"optional":true},"@testing-library/user-event":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/assay_0.3.0_1784582200029_0.8935304625548546","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@aerofortress/assay","version":"0.3.1","keywords":["avp","assay","acceptance","verification","testing","react","archetypes"],"author":{"name":"Lucas Tinoco"},"license":"MIT","_id":"@aerofortress/assay@0.3.1","maintainers":[{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"}],"homepage":"https://github.com/lucasrgt/acceptance-verification-protocol#readme","bugs":{"url":"https://github.com/lucasrgt/acceptance-verification-protocol/issues"},"bin":{"assay":"bin/assay.mjs"},"dist":{"shasum":"650063416d7ab31e881d41ff50287226026e3cad","tarball":"https://registry.npmjs.org/@aerofortress/assay/-/assay-0.3.1.tgz","fileCount":42,"integrity":"sha512-bdaRMLrcEXgiVX3WvCk+aLnZYPHQDfYZZheqW+YyPtII4PcGtuch44hdB6vf58YKaBcsI6LzgLnb6cX4Mr8Adw==","signatures":[{"sig":"MEQCIFQw54p01PbYv8GsUW8OgnNSLwcz7kozcQn+8yEVb///AiAKLCgBAYVzOBYGT2NfU+uspBgBRQcIN1s7VBg80RNtHg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aerofortress%2fassay@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":754939},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./http":{"types":"./dist/http.d.ts","import":"./dist/http.js"},"./judge":{"types":"./dist/judge.d.ts","import":"./dist/judge.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./design":{"types":"./dist/design.d.ts","import":"./dist/design.js"},"./package.json":"./package.json","./react/vitest":{"types":"./dist/react/vitest.d.ts","import":"./dist/react/vitest.js"},"./design/browser":{"types":"./dist/design/browser.d.ts","import":"./dist/design/browser.js"}},"gitHead":"1d4cde8b26a80bb3a46ea8118961b07dda6e82e9","scripts":{"lint":"eslint .","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:package":"npm run build && node test/package-entrypoints.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"},"overrides":{"esbuild":"^0.28.1"},"repository":{"url":"git+https://github.com/lucasrgt/acceptance-verification-protocol.git","type":"git","directory":"assay"},"workspaces":["examples/*"],"_npmVersion":"10.9.8","description":"Assay — the reference JS/React implementation of AVP (Acceptance Verification Protocol). Deterministic behavior verification for AI-built web features: tap the vein and confirm it's remediated.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.6.8","tsup":"^8.3.5","jsdom":"^25.0.1","react":"^18.3.1","eslint":"^9.17.0","vitest":"^4.1.10","react-dom":"^18.3.1","@eslint/js":"^9.17.0","typescript":"^5.6.3","@types/node":"^22.10.1","@types/react":"^18.3.12","puppeteer-core":"^25.1.0","@types/react-dom":"^18.3.1","typescript-eslint":"^8.19.0","@testing-library/dom":"^10.4.0","@tanstack/react-router":"^1.170.16","@testing-library/react":"^16.0.1","@testing-library/user-event":"^14.5.2"},"peerDependencies":{"msw":">=2.6","jsdom":">=25","react":">=18","vitest":">=2","react-dom":">=18","puppeteer-core":">=23","@anthropic-ai/sdk":">=0.40.0","@tanstack/react-router":">=1","@testing-library/react":">=16","@testing-library/user-event":">=14"},"peerDependenciesMeta":{"msw":{"optional":true},"jsdom":{"optional":true},"react":{"optional":true},"vitest":{"optional":true},"react-dom":{"optional":true},"puppeteer-core":{"optional":true},"@anthropic-ai/sdk":{"optional":true},"@tanstack/react-router":{"optional":true},"@testing-library/react":{"optional":true},"@testing-library/user-event":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/assay_0.3.1_1784582660233_0.14575589759847452","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aerofortress/assay","version":"0.4.0","description":"Assay — the reference JS/React implementation of AVP (Acceptance Verification Protocol). Deterministic behavior verification for AI-built web features: tap the vein and confirm it's remediated.","license":"MIT","author":{"name":"Lucas Tinoco"},"type":"module","sideEffects":false,"engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/lucasrgt/acceptance-verification-protocol.git","directory":"assay"},"homepage":"https://github.com/lucasrgt/acceptance-verification-protocol#readme","bugs":{"url":"https://github.com/lucasrgt/acceptance-verification-protocol/issues"},"keywords":["avp","assay","acceptance","verification","testing","react","archetypes"],"workspaces":["examples/*"],"overrides":{"esbuild":"^0.28.1"},"bin":{"assay":"bin/assay.mjs"},"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./react":{"types":"./dist/react.d.ts","import":"./dist/react.js"},"./react/vitest":{"types":"./dist/react/vitest.d.ts","import":"./dist/react/vitest.js"},"./http":{"types":"./dist/http.d.ts","import":"./dist/http.js"},"./design":{"types":"./dist/design.d.ts","import":"./dist/design.js"},"./design/browser":{"types":"./dist/design/browser.d.ts","import":"./dist/design/browser.js"},"./judge":{"types":"./dist/judge.d.ts","import":"./dist/judge.js"},"./package.json":"./package.json"},"publishConfig":{"access":"public"},"scripts":{"build":"tsup","prepublishOnly":"npm run build","test":"vitest run","test:watch":"vitest","typecheck":"tsc --noEmit","lint":"eslint .","test:package":"npm run build && node test/package-entrypoints.mjs","measure":"node tools/measure/measure.mjs","measure:check":"node tools/measure/measure.mjs --check"},"peerDependencies":{"@anthropic-ai/sdk":">=0.40.0","@testing-library/react":">=16","@testing-library/user-event":">=14","@tanstack/react-router":">=1","jsdom":">=25","msw":">=2.6","puppeteer-core":">=23","react":">=18","react-dom":">=18","vitest":">=2"},"peerDependenciesMeta":{"@anthropic-ai/sdk":{"optional":true},"@testing-library/react":{"optional":true},"@testing-library/user-event":{"optional":true},"@tanstack/react-router":{"optional":true},"jsdom":{"optional":true},"msw":{"optional":true},"puppeteer-core":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"vitest":{"optional":true}},"devDependencies":{"@eslint/js":"^9.17.0","@tanstack/react-router":"^1.170.16","@testing-library/dom":"^10.4.0","@testing-library/react":"^16.0.1","@testing-library/user-event":"^14.5.2","@types/node":"^22.10.1","@types/react":"^18.3.12","@types/react-dom":"^18.3.1","eslint":"^9.17.0","jsdom":"^25.0.1","msw":"^2.6.8","puppeteer-core":"^25.1.0","react":"^18.3.1","react-dom":"^18.3.1","tsup":"^8.3.5","typescript":"^5.6.3","typescript-eslint":"^8.19.0","vitest":"^4.1.10"},"_id":"@aerofortress/assay@0.4.0","gitHead":"4a5e03dceeb0a375e5822e301dc4fdab447256af","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-yyWPg1rpBMDu3VMFXWVuv0c3VJAB2zaYQm3ujJglZDquoGEswvmklbvt4+v49cbAWKTCEO0sZvM5ON525BEgEA==","shasum":"72c32696b8ce4636a333f6e59774af9e4b092048","tarball":"https://registry.npmjs.org/@aerofortress/assay/-/assay-0.4.0.tgz","fileCount":42,"unpackedSize":788720,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aerofortress%2fassay@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDfgEI95ARvcDYMueWXNMzj2m2VtojIhQUGdMOyfZ7ryQIhAOwcHKUoYAY6fLtrftW6t1BO1Ls3sp6ep9QxR8m9BXBX"}]},"_npmUser":{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"},"directories":{},"maintainers":[{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/assay_0.4.0_1784760939324_0.13221964690085053"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-22T04:11:56.792Z","modified":"2026-07-22T22:55:40.010Z","0.1.0":"2026-06-22T04:11:57.300Z","0.2.0":"2026-07-01T22:22:34.754Z","0.3.0":"2026-07-20T21:16:40.268Z","0.3.1":"2026-07-20T21:24:20.390Z","0.4.0":"2026-07-22T22:55:39.487Z"},"bugs":{"url":"https://github.com/lucasrgt/acceptance-verification-protocol/issues"},"author":{"name":"Lucas Tinoco"},"license":"MIT","homepage":"https://github.com/lucasrgt/acceptance-verification-protocol#readme","keywords":["avp","assay","acceptance","verification","testing","react","archetypes"],"repository":{"type":"git","url":"git+https://github.com/lucasrgt/acceptance-verification-protocol.git","directory":"assay"},"description":"Assay — the reference JS/React implementation of AVP (Acceptance Verification Protocol). Deterministic behavior verification for AI-built web features: tap the vein and confirm it's remediated.","maintainers":[{"name":"lucasrgt","email":"lucas.tinoco@hotmail.com"}],"readme":"# @aerofortress/assay\n\nThe reference **JS/React implementation of AVP** (the Acceptance Verification Protocol) — deterministic behavior\nverification for AI-built web features. You declare what a feature must *do* (the archetype + criteria); Assay\nruns it against a real substrate (rendered React, an HTTP backend, the laid-out DOM) and returns an actionable\n**verdict** + fail-closed aggregate outcome. Empty or unresolved proof is inconclusive,\nnot green. The runtime sibling of the static doctor; standalone, like a test runner.\n\nIt runs **inside your existing Vitest suite** — the canonical `*.assay.test.*` suffix is both\nAssay-filterable and Vitest-discoverable. The `assay` bin is a thin\nface over `vitest run` (it is a wrapper, not a runner of its own).\n\n## Entry points\n\n| Import | What it is | Needs (peer) |\n|---|---|---|\n| `@aerofortress/assay` | The authoring API: the DSL, archetypes, `runVerification`, `composeVerdicts`, `formatVerdict`. | — |\n| `@aerofortress/assay/react` | The React substrate — render + probe + the MSW seam. | `react`, `react-dom`, `@testing-library/react`, `@testing-library/user-event`, `msw`, `jsdom` |\n| `@aerofortress/assay/react/vitest` | `defineVerification` — the Vitest binding for the React adapter. | `vitest` |\n| `@aerofortress/assay/http` | The HTTP substrate — verify a real backend over the wire. | — |\n| `@aerofortress/assay/design` | The design substrate — jsdom + computed style (tokens, themes, contrast, a11y). | `jsdom` |\n| `@aerofortress/assay/design/browser` | The GEOMETRY tier — real layout in your installed Chrome/Edge (overflow, responsive, RTL, tap targets, layout shift…). | `puppeteer-core` |\n| `@aerofortress/assay/judge` | `claudeJudge` — the reference `model`-oracle judge. | `@anthropic-ai/sdk` |\n\nEvery substrate library is an **optional peer** — install only what the adapters you use\nneed (the react line above for the DOM tier; nothing extra for `/http`). The package is\n**ESM-only** and needs Node ≥ 20 — it rides an ESM-first substrate (Vitest, MSW 2) by design.\n\n```bash\nnpm install -D @aerofortress/assay vitest\n```\n\n```ts\n// features/todo/todo.assay.test.ts — co-located with the feature, run by `npx assay verify`\nimport { actionEffect } from \"@aerofortress/assay\";\nimport { defineVerification } from \"@aerofortress/assay/react/vitest\";\nimport { addTodoSubject } from \"./todo.subject\"; // the seams: how to mount, which endpoint, which control\n\ndefineVerification(actionEffect, addTodoSubject);\n```\n\n## Authoring your own criteria (off-catalog)\n\nThe shipped catalog covers **universal** invariants, each grounded in a real escape. For a\n**domain rule specific to your product** — say, *\"every bank integration must expose the same\naccount protocol\"* — you author your own criterion with the same public DSL and run it through\nthe same engine. Custom criteria live in **your** repo and never enter the package's accuracy\nbenchmark (see [ADR 0002](../../docs/adr/0002-custom-criteria-bring-your-own-off-catalog.md)).\n\n```ts\nimport { archetype, criterion, mechanical, runVerification, AvpFail } from \"@aerofortress/assay\";\n\n// 1 — author the criterion (reads like any catalog archetype)\nconst accountProtocol = archetype(\"account-protocol-conformance\", \"0.1.0\", () => {\n  criterion(\n    \"exposes-canonical-account-protocol\",\n    \"Every bank provider returns { id, currency, integer balanceMinor }.\",\n    { substrate: \"http\" },\n    mechanical(async ({ act, expect }) => { await act(); expect.everyProviderIsCanonical(); }),\n  );\n});\n\n// 2 — bind it to a substrate with your own probe, then run it\nconst verdict = await runVerification(\"all-banks\", accountProtocol, { probe: () => myProbe(subject) });\n```\n\nWant it on the same Vitest host (gating + formatted verdict) as the catalog? Pass the hooks\nper-call — no global registration:\n\n```ts\nverify(accountProtocol, subject, { hooks: (s) => ({ probe: () => myProbe(s) }) });          // React\nverifyHttp(accountProtocol, subject, { hooks: (s) => ({ probe: () => myProbe(s) }) });        // HTTP\ndefineVerification(accountProtocol, subject, { hooks: (s) => ({ probe: () => myProbe(s) }) });// Vitest\n```\n\nA full worked example, calibrated caos→verde (the verifier passes a compliant fleet and catches a\nbank that breaks the protocol), lives in [`test/custom-criterion.test.ts`](./test/custom-criterion.test.ts).\n\nMIT © Lucas Tinoco\n","readmeFilename":"README.md"}