{"_id":"@a11yst/source-ranking","_rev":"3-05a188aab51a05541c13602abcd66d48","name":"@a11yst/source-ranking","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@a11yst/source-ranking","version":"1.0.0","license":"MPL-2.0","_id":"@a11yst/source-ranking@1.0.0","maintainers":[{"name":"angelabenavente","email":"ang.ben.dev@gmail.com"}],"homepage":"https://github.com/angelabenavente/a11yst#readme","bugs":{"url":"https://github.com/angelabenavente/a11yst/issues"},"dist":{"shasum":"56c972c070d3f74156a8a040ec11b1d939238ab6","tarball":"https://registry.npmjs.org/@a11yst/source-ranking/-/source-ranking-1.0.0.tgz","fileCount":47,"integrity":"sha512-u34Rdib7rbnSZ74Dg64YuJd4C3aB9Yt9oclmld/Y8wBXJfYs6CEgCrv1cgh/DPcNH+eND0b5DToqX/sCgP4B4g==","signatures":[{"sig":"MEUCIQDSCYAUVug+Coyx+yTESa2byueGVsFgrEf4Q+cwcwiyNgIgWSUQ9cOnWrVPEMzzGf3C3K1vgUJxyAOmPXUAIjI69Ns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106672},"main":"./dist/index.js","type":"module","_from":"file:a11yst-source-ranking-1.0.0.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"angelabenavente","email":"ang.ben.dev@gmail.com"},"_resolved":"/private/var/folders/tf/l5jz90dj0yncc_ds04tbfs5c0000gn/T/49bbca3c02e2ff11ad33370dd66dbca8/a11yst-source-ranking-1.0.0.tgz","_integrity":"sha512-u34Rdib7rbnSZ74Dg64YuJd4C3aB9Yt9oclmld/Y8wBXJfYs6CEgCrv1cgh/DPcNH+eND0b5DToqX/sCgP4B4g==","repository":{"url":"git+https://github.com/angelabenavente/a11yst.git","type":"git"},"_npmVersion":"10.9.0","description":"Deterministic source mapping candidate ranking for a11yst","directories":{},"_nodeVersion":"22.12.0","dependencies":{"@a11yst/types":"1.0.0","@a11yst/source-mapping":"1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/source-ranking_1.0.0_1787506247695_0.7073012372252063","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@a11yst/source-ranking","version":"1.0.1","license":"MPL-2.0","_id":"@a11yst/source-ranking@1.0.1","maintainers":[{"name":"angelabenavente","email":"ang.ben.dev@gmail.com"}],"homepage":"https://github.com/angelabenavente/a11yst#readme","bugs":{"url":"https://github.com/angelabenavente/a11yst/issues"},"dist":{"shasum":"b8c7fba517ba39d1bfb6d0b855b584b29d11e04d","tarball":"https://registry.npmjs.org/@a11yst/source-ranking/-/source-ranking-1.0.1.tgz","fileCount":47,"integrity":"sha512-p6ChlAsYQb9OgyxEwXVWcF7tZ5QOGuCmlyBhPhqLsA4nDbcPILZhoZeVxqCQw1oGBcryvCAzdZc05TK/t6n63g==","signatures":[{"sig":"MEQCIExRgRaKS6w5pZ/++iAtrftGtfcWTVF9lgvFmVx7YIrOAiBKm7CsUy8Y15muX42OEQY6XT86fINK5uePefyIfEkIXw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106672},"main":"./dist/index.js","type":"module","_from":"file:a11yst-source-ranking-1.0.1.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.json","clean":"rm -rf dist *.tsbuildinfo","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"angelabenavente","email":"ang.ben.dev@gmail.com"},"_resolved":"/private/var/folders/tf/l5jz90dj0yncc_ds04tbfs5c0000gn/T/10682d60a214d62e10a4cd546293fd8d/a11yst-source-ranking-1.0.1.tgz","_integrity":"sha512-p6ChlAsYQb9OgyxEwXVWcF7tZ5QOGuCmlyBhPhqLsA4nDbcPILZhoZeVxqCQw1oGBcryvCAzdZc05TK/t6n63g==","repository":{"url":"git+https://github.com/angelabenavente/a11yst.git","type":"git"},"_npmVersion":"10.9.8","description":"Deterministic source mapping candidate ranking for a11yst","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@a11yst/types":"1.0.1","@a11yst/source-mapping":"1.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.2","@types/node":"^22.10.2"},"_npmOperationalInternal":{"tmp":"tmp/source-ranking_1.0.1_1787508677398_0.4993067625956775","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@a11yst/source-ranking","version":"1.0.2","description":"Deterministic source mapping candidate ranking for a11yst","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"main":"./dist/index.js","types":"./dist/index.d.ts","dependencies":{"@a11yst/source-mapping":"1.0.2","@a11yst/types":"1.0.2"},"devDependencies":{"@types/node":"^22.10.2","typescript":"^5.7.2"},"license":"MPL-2.0","repository":{"type":"git","url":"git+https://github.com/angelabenavente/a11yst.git"},"homepage":"https://www.a11yst.dev","bugs":{"url":"https://github.com/angelabenavente/a11yst/issues"},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","clean":"rm -rf dist *.tsbuildinfo"},"_id":"@a11yst/source-ranking@1.0.2","_integrity":"sha512-OlWVVMmEdNeW3L0kT0sFBd3QQMz7pXqjgIEtLjSvKHI8Bzzmb3s16JU02/gjn1QpeyszIBB5yhPWndw5MzbXYQ==","_resolved":"/private/var/folders/tf/l5jz90dj0yncc_ds04tbfs5c0000gn/T/4ccfc1ada76c8b6099ca19ed72be5c57/a11yst-source-ranking-1.0.2.tgz","_from":"file:a11yst-source-ranking-1.0.2.tgz","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-OlWVVMmEdNeW3L0kT0sFBd3QQMz7pXqjgIEtLjSvKHI8Bzzmb3s16JU02/gjn1QpeyszIBB5yhPWndw5MzbXYQ==","shasum":"665a1634d973adb093d0790b523c6f5bab215517","tarball":"https://registry.npmjs.org/@a11yst/source-ranking/-/source-ranking-1.0.2.tgz","fileCount":47,"unpackedSize":107020,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBRf7RdKYHxXDOVT34YMBovYLCvcuCXkhMUUaE32An6SAiEAnXb4+82B3PoEDjmt4NvjH3iNrUYEkmJ0aZsrMQswbss="}]},"_npmUser":{"name":"angelabenavente","email":"ang.ben.dev@gmail.com"},"directories":{},"maintainers":[{"name":"angelabenavente","email":"ang.ben.dev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/source-ranking_1.0.2_1787683116487_0.2520043506133909"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-23T17:30:47.520Z","modified":"2026-08-25T18:38:36.796Z","1.0.0":"2026-08-23T17:30:47.848Z","1.0.1":"2026-08-23T18:11:17.544Z","1.0.2":"2026-08-25T18:38:36.642Z"},"bugs":{"url":"https://github.com/angelabenavente/a11yst/issues"},"license":"MPL-2.0","homepage":"https://www.a11yst.dev","repository":{"type":"git","url":"git+https://github.com/angelabenavente/a11yst.git"},"description":"Deterministic source mapping candidate ranking for a11yst","maintainers":[{"name":"angelabenavente","email":"ang.ben.dev@gmail.com"}],"readme":"# @a11yst/source-ranking [![NPM version](https://img.shields.io/npm/v/@a11yst/source-ranking.svg?style=flat)](https://www.npmjs.com/package/@a11yst/source-ranking) [![License: MPL-2.0](https://img.shields.io/badge/License-MPL--2.0-blue.svg)](LICENSE) [![NPM total downloads](https://img.shields.io/npm/dt/@a11yst/source-ranking.svg?style=flat)](https://www.npmjs.com/package/@a11yst/source-ranking)\n\nDeterministic, explainable ranking for static source-mapping candidates.\n\n## Purpose\n\nFramework mappers (HTML, React, Next.js, Vue, Nuxt, Angular) produce conservative\n`SourceMappingCandidate[]` values. When multiple locations remain plausible, 10a\nreturns `ambiguous` without selecting a winner.\n\n`@a11yst/source-ranking` adds a pure ranking layer that can resolve ambiguity only\nwhen one location has clearly stronger, independent, consistent evidence.\n\n## Matching vs ranking\n\n- **Matching** (10b–10g): discovers candidates from static indexes and evidence.\n- **Ranking** (10h): scores and compares already-built candidates.\n\nMappers do **not** call ranking automatically. Audit and report integration arrives\nin later phases.\n\n## Material location grouping\n\nCandidates at the same normalized URI and region (start/end line/column) are grouped\ninto one `RankedSourceLocation`, regardless of provenance. Multiple provenances at\nthe same location are treated as corroboration.\n\n## Scoring\n\nInteger scores are deterministic and centralized:\n\n- Base confidence: exact 1000, high 300, medium 180, low 80\n- Positive/negative signal weights for selector, component, accessible name, etc.\n- Limited bonuses for independent signal kinds and provenance diversity\n- Small, controlled context adjustments (framework, adapter, scope, route, component, tag, preferred URI)\n\nRanking never increases confidence. Effective confidence may degrade when conflicts\nor insufficient evidence are detected.\n\n## Resolution rules\n\nHeuristic resolution requires:\n\n- No conflicting exact locations\n- Top score ≥ `minimumResolutionScore` (default 340)\n- Winning margin ≥ `minimumWinningMargin` (default 60)\n- Sufficient independent evidence (not tag/route/framework/scope/preferred URI alone)\n- Medium/low-specific rules documented in code\n\nA single exact location resolves immediately. Two distinct exact locations remain\nambiguous regardless of score.\n\n## Status\n\n- `resolved`: clear winner\n- `ambiguous`: credible tie or insufficient margin\n- `insufficient`: evidence too weak (including lone low-confidence candidates)\n- `invalid`: unsafe input or options\n\n## Explainability\n\nEach ranked location includes stable `contributions` describing score components.\nMessages are generic and never include source code, secrets, or full selector/text values.\n\n## Security\n\nNo filesystem, browser, or network access. Context strings and preferred URIs are\nsanitized. Signal values reuse `@a11yst/source-mapping` redaction rules.\n\n## Limits\n\nDefaults: 500 candidates, 64 signals per candidate. Limits are conservative; reaching\na limit prevents silent resolution.\n\n## Determinism\n\nSame inputs in any order produce identical scores, ordering, diagnostics, and stable\nserialization. No machine learning, probabilities, path-length heuristics, Git history,\nor file popularity.\n\n## Future work\n\n- 10i: remediation recommendations\n- 10j: pipeline integration for mapping + ranking in outputs\n","readmeFilename":"README.md"}