{"_id":"@ariada-org/diff-schema","_rev":"2-d1f776cefed8cef3d0f4595af67bfe5e","name":"@ariada-org/diff-schema","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@ariada-org/diff-schema","version":"0.1.0","keywords":["accessibility","a11y","wcag","ci","diff","github-action","sarif","differential","eupl"],"author":{"url":"Agonist Development AB","name":"Alekszandr Bricskin","email":"git@ariada.org"},"license":"EUPL-1.2","_id":"@ariada-org/diff-schema@0.1.0","maintainers":[{"name":"agonist","email":"ab@agonist.ai"}],"homepage":"https://github.com/ariada-org/ariada/tree/main/packages/ariada-diff-schema#readme","bugs":{"url":"https://github.com/ariada-org/ariada/issues"},"dist":{"shasum":"d236c676c71407f8782a8869ab0bb19bc6c8aa34","tarball":"https://registry.npmjs.org/@ariada-org/diff-schema/-/diff-schema-0.1.0.tgz","fileCount":53,"integrity":"sha512-tmA0eExEuk6T475VOpKXOg0qn6gYDDHdoepzCah/bWDFogwqbgt/QXTQrThhTuU9LZVoMnqKgjzQKMXkmEh15Q==","signatures":[{"sig":"MEUCIFUzgOdJJo8E5mMcaosJ7GrtwotC0Oj+DQNylFPvUD3RAiEA/HwGwk9PFk5Qe2W7TJiNwyCoWeetplbbqfMzaC+Z4vA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ariada-org%2fdiff-schema@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":131231},"main":"./dist/index.js","type":"module","_from":"file:ariada-org-diff-schema-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schemas/diff-result":"./src/schemas/diff-result.schema.json","./schemas/gate-decision":"./src/schemas/gate-decision.schema.json","./schemas/baseline-policy":"./src/schemas/baseline-policy.schema.json"},"scripts":{"lint":"eslint src tests","test":"vitest run","build":"tsc -p tsconfig.json","clean":"rimraf dist coverage","typecheck":"tsc -p tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"agonist","email":"ab@agonist.ai"},"_resolved":"/tmp/102d69098059bb8cb20327b03b758d57/ariada-org-diff-schema-0.1.0.tgz","_integrity":"sha512-tmA0eExEuk6T475VOpKXOg0qn6gYDDHdoepzCah/bWDFogwqbgt/QXTQrThhTuU9LZVoMnqKgjzQKMXkmEh15Q==","repository":{"url":"git+https://github.com/ariada-org/ariada.git","type":"git","directory":"packages/ariada-diff-schema"},"_npmVersion":"10.9.8","description":"Differential accessibility CI gate — finding fingerprint, selector normalisation, DiffResult, BaselinePolicy and GateDecision schemas with reference validators. Open source under EUPL-1.2.","directories":{},"_nodeVersion":"22.22.3","dependencies":{},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"rimraf":"^6.0.1","vitest":"^4.1.0","typescript":"^5.7.2","@types/node":"^22.10.0","@vitest/coverage-v8":"^2.1.8"},"_npmOperationalInternal":{"tmp":"tmp/diff-schema_0.1.0_1781536547568_0.8821571526294372","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ariada-org/diff-schema","version":"0.2.0","description":"Differential accessibility CI gate — finding fingerprint, selector normalisation, DiffResult, BaselinePolicy and GateDecision schemas with reference validators. Open source under EUPL-1.2.","license":"EUPL-1.2","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schemas/diff-result":"./src/schemas/diff-result.schema.json","./schemas/baseline-policy":"./src/schemas/baseline-policy.schema.json","./schemas/gate-decision":"./src/schemas/gate-decision.schema.json"},"devDependencies":{"@types/node":"^22.10.0","@vitest/coverage-v8":"^4.1.0","rimraf":"^6.0.1","typescript":"^5.7.2","vitest":"^4.1.0"},"engines":{"node":">=22"},"keywords":["accessibility","a11y","wcag","ci","diff","github-action","sarif","differential","eupl"],"homepage":"https://github.com/ariada-org/ariada/tree/main/packages/ariada-diff-schema#readme","repository":{"type":"git","url":"git+https://github.com/ariada-org/ariada.git","directory":"packages/ariada-diff-schema"},"bugs":{"url":"https://github.com/ariada-org/ariada/issues"},"author":{"name":"Alekszandr Bricskin","email":"git@ariada.org","url":"Agonist Development AB"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","clean":"rimraf dist coverage","lint":"eslint src tests"},"_id":"@ariada-org/diff-schema@0.2.0","_integrity":"sha512-DUkZOn1PMTrHazEhtowQ31ZJ2n0F+nKN6Eg4JZuuA0K9mrIVCseIKOFMTXv5hL1tcFxfl/nYTTn6WNWXFMH8kg==","_resolved":"/private/var/folders/2c/_42xj0l179z8yc7wmp5k91s00000gn/T/393e0ec107b3cee415433a320ad72262/ariada-org-diff-schema-0.2.0.tgz","_from":"file:ariada-org-diff-schema-0.2.0.tgz","_nodeVersion":"26.5.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-DUkZOn1PMTrHazEhtowQ31ZJ2n0F+nKN6Eg4JZuuA0K9mrIVCseIKOFMTXv5hL1tcFxfl/nYTTn6WNWXFMH8kg==","shasum":"8196b3d5bbab6fb01fb86ea427faced555e64d85","tarball":"https://registry.npmjs.org/@ariada-org/diff-schema/-/diff-schema-0.2.0.tgz","fileCount":53,"unpackedSize":138207,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCBdoM8X+G5XnzY3aFT1RUeGRlgCLZGNZ8MWKgS4vXoIAIhAPC2BOwe1Nj4sOM+n6IuMeB2ytmqOSIaFWXuiszX/BEa"}]},"_npmUser":{"name":"agonist","email":"ab@agonist.ai"},"directories":{},"maintainers":[{"name":"agonist","email":"ab@agonist.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/diff-schema_0.2.0_1784942562221_0.3869910547262976"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-15T15:15:47.411Z","modified":"2026-07-25T01:22:42.512Z","0.1.0":"2026-06-15T15:15:47.723Z","0.2.0":"2026-07-25T01:22:42.340Z"},"bugs":{"url":"https://github.com/ariada-org/ariada/issues"},"author":{"name":"Alekszandr Bricskin","email":"git@ariada.org","url":"Agonist Development AB"},"license":"EUPL-1.2","homepage":"https://github.com/ariada-org/ariada/tree/main/packages/ariada-diff-schema#readme","keywords":["accessibility","a11y","wcag","ci","diff","github-action","sarif","differential","eupl"],"repository":{"type":"git","url":"git+https://github.com/ariada-org/ariada.git","directory":"packages/ariada-diff-schema"},"description":"Differential accessibility CI gate — finding fingerprint, selector normalisation, DiffResult, BaselinePolicy and GateDecision schemas with reference validators. Open source under EUPL-1.2.","maintainers":[{"name":"agonist","email":"ab@agonist.ai"}],"readme":"# @ariada-org/diff-schema\n\nSchemas and reference algorithms for the differential accessibility CI\ngate. Defines the canonical fingerprint, selector normalisation, diff\nenvelope, baseline policy, and gate-decision contracts that any CI\nrunner can consume to surface new-vs-pre-existing accessibility\nfindings on a pull request.\n\nOpen source under [EUPL-1.2](./LICENSE). Zero runtime dependencies.\nNode 22 LTS or newer.\n\n## What this package does\n\nTwo accessibility scans of the same web surface — one against the\nhead commit, one against the base — produce overlapping sets of\nfindings. This package gives you the primitives to:\n\n1. Hash each finding into a deterministic 64-character fingerprint\n   that survives DOM volatility (auto-generated IDs, framework class\n   hashes, nth-child reordering).\n2. Classify the head set against the base set as `new`,\n   `pre_existing`, or `resolved`.\n3. Resolve a declarative policy file into a single\n   pass / fail / warn gate decision.\n4. Emit SARIF 2.1.0 for GitHub Code Scanning and GitLab SAST\n   consumers.\n\nThe package ships the schemas + reference algorithms only. The\nproduction diff engine is shipped separately.\n\n## Install\n\n```bash\nnpm install @ariada-org/diff-schema\n```\n\n## Usage\n\n```ts\nimport {\n  computeFindingFingerprint,\n  defaultPolicy,\n  buildGateDecision,\n  emitSarif,\n  validateDiffResult,\n} from '@ariada-org/diff-schema';\n\nconst finding = {\n  ruleId: 'wcag2/1.1.1',\n  jurisdictionTags: ['WCAG2.2-AA', 'EAA'],\n  severity: 'serious' as const,\n  selector: 'main > img.hero',\n  axTreeRole: 'img',\n  axTreeName: 'Marketing hero image',\n};\n\nconst fp = computeFindingFingerprint(finding);\n// → 64-char lowercase hex (SHA-256 of the JCS-canonicalised pre-image)\n\nconst policy = defaultPolicy();\n// → sensible defaults: new critical/serious fail, moderate/minor warn\n```\n\n## API\n\n| Export                       | Type     | Description                                          |\n|------------------------------|----------|------------------------------------------------------|\n| `computeFindingFingerprint`  | function | Hash a finding into the canonical fingerprint.       |\n| `normaliseSelector`          | function | Apply the deterministic DOM-selector rules.          |\n| `validateDiffResult`         | function | Lightweight runtime validation of a DiffResult.      |\n| `defaultPolicy`              | function | Built-in default `BaselinePolicy`.                   |\n| `resolvePolicy`              | function | Resolve a finding context against a policy.          |\n| `buildGateDecision`          | function | Deterministic GateDecision from DiffResult + policy. |\n| `gateDecisionHash`           | function | SHA-256 of the canonical decision JSON.              |\n| `emitSarif`                  | function | SARIF 2.1.0 emitter (new findings only).             |\n| `EXIT_*` codes               | constant | Stable CLI exit codes.                               |\n| `canonicalize`               | function | RFC 8785 JSON canonicalization (JCS).                |\n\n## Standards referenced\n\n- [RFC 8785 — JSON Canonicalization Scheme (JCS)](https://www.rfc-editor.org/rfc/rfc8785)\n- [FIPS 180-4 — SHA-256](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf)\n- [SARIF 2.1.0 — OASIS Static Analysis Results Interchange Format](https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html)\n- [WCAG 2.2 — Web Content Accessibility Guidelines](https://www.w3.org/TR/WCAG22/)\n\n## License\n\nEUPL-1.2 for code; CC-BY-SA-4.0 for prose; CC0-1.0 for build config.\nSee [LICENSE](./LICENSE) and [NOTICE](./NOTICE).\n","readmeFilename":"README.md"}