kb-web-severity-scoring · git:20261028.d473f9f · 2026-10-28 · sha256 f1a405aa937d244a

kb-web-severity-scoring git:20261028.d473f9fA

Immutable. This exact content never changes and is served at /api/v1/blob/f1a405aa937d244a.

---
name: kb-web-severity-scoring
description: Reference data, not a reviewer. Compute web accessibility scores (0-100, A-F grades) with severity scoring, confidence levels, and remediation tracking across audits.
license: MIT
disable-model-invocation: true
user-invocable: false
metadata:
  tier: reference
  domain: cross-cutting
  output: none
  effort: low
  title: Web Severity Scoring
---

## Web Severity Scoring

This file describes the scoring that `skills/a11y-core/scripts/merge-findings.mjs`
computes for every rendered report. Where this file and the script differ, the
script decides. A score is not a conformance claim: only a finding-free review
against every criterion at the target level supports "conforms".

## Score formula

```text
penalty = sum over findings of severity_weight x confidence_factor
checks  = max(number of findings + number of passed checks, 10)
score   = max(0, round(100 - (penalty / checks) x 20))
```

Each severity, with its weight.

| Severity | Weight |
|---|---|
| critical | 10 |
| serious | 5 |
| moderate | 2 |
| minor | 1 |

Dividing by the number of checks keeps a large audit from scoring lower only
because it looked at more. The floor of 10 checks stops a tiny audit with one
finding from scoring near zero.

**Example:** one critical finding at high confidence and 9 passed checks gives
penalty 10, checks 10, score 100 - (10 / 10) x 20 = 80, grade B.

## Grades

Each score band, with its grade.

| Score | Grade |
|---|---|
| 90-100 | A |
| 80-89 | B |
| 70-79 | C |
| 60-69 | D |
| 0-59 | F |

## Confidence

Each level, with its factor and when to use it.

| Level | Factor | When to use |
|---|---|---|
| high | 1.0 | Structural and certain (missing alt, no label, no lang), or found by two sources (for example axe-core and code review) |
| medium | 0.7 | One source, likely an issue (heading edge cases, questionable ARIA, possible keyboard trap) |
| low | 0.4 | Needs human review (alt text quality, reading order, context-dependent link text) |

A finding confirmed by a third source, such as a Playwright run that tabs
into the trap, stays `high`; the schema has no higher level. Merging keeps the
highest confidence any source reported for the same rule at the same location.

## Scorecard Format

### Single Page

```markdown
## Accessibility Score

| Metric | Value |
|--------|-------|
| Page | [URL] |
| Score | [0-100] |
| Grade | [A-F] |
| Critical | [count] |
| Serious | [count] |
| Moderate | [count] |
| Minor | [count] |
```

### Multi-Page

```markdown
## Accessibility Scorecard

| Page | Score | Grade | Critical | Serious | Moderate | Minor |
|------|-------|-------|----------|---------|----------|-------|
| / | 82 | B | 0 | 2 | 3 | 1 |
| /login | 91 | A | 0 | 0 | 2 | 1 |
| /dashboard | 45 | F | 2 | 4 | 3 | 2 |
| **Average** | **72.7** | **C** | **2** | **6** | **8** | **4** |
```

## Cross-Page Pattern Classification

Each pattern type, with its definition and remediation ROI.

| Pattern Type | Definition | Remediation ROI |
|-------------|-----------|-----------------|
| Systemic | Same issue on every audited page | Highest - usually layout/nav, fix once |
| Template | Same issue on pages sharing a component | High - fix the shared component |
| Page-specific | Unique to one page | Normal - fix individually |

## Remediation Tracking

### Change Classification

Each status, with its definition.

| Status | Definition |
|--------|-----------|
| Fixed | Issue was in previous report but no longer present |
| New | Issue not in previous report, appears now |
| Persistent | Issue remains from previous report |
| Regressed | Issue remains, at a higher severity than in the previous report |

### Progress Metrics

- **Issue reduction:** `(fixed / previous_total) * 100`
- **Score change:** `current_score - previous_score`
- **Pages improved:** count of pages with higher scores than previous audit
- **Trend:** improving (score up 5+), stable (within 5), declining (score down 5+)

## Issue Severity Categories

### Critical

- No keyboard access to essential functionality
- Missing form labels on required fields
- Images conveying critical information have no alt text
- Color is the sole means of conveying information
- Keyboard traps with no escape

### Serious

- Missing skip navigation
- Poor heading hierarchy (skipped levels)
- Focus not visible on interactive elements
- Form errors not programmatically associated
- Missing ARIA on custom widgets

### Moderate

- Redundant ARIA on semantic elements
- Suboptimal heading structure (multiple H1s)
- Missing autocomplete on identity fields
- Links to new tabs without warning
- Missing table captions

### Minor

- Redundant title attributes
- Suboptimal button text
- Missing landmark roles where semantic elements exist
- Decorative images with non-empty alt text