Color Accessibility — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Color Accessibility (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A palette that fails contrast ships a product that a measurable slice of users cannot read: low-vision users lose the text, and roughly 8% of men (and about 0.5% of women) with red-green color blindness lose any meaning carried by hue alone. The costly mistake this skill prevents is approving colors that look fine on a designer's bright monitor and fail on real screens, in sunlight, and in audits - forcing a token-system rework after components already reference the broken values.
Work the steps in order: pairings must be enumerated before ratios are computed, and ratios must pass before color-blindness simulation, because a palette that fails contrast is not worth simulating.
Collect before starting. Label any assumed value as a guess.
Contrast is a property of a pair, never of a color. List every combination actually rendered: body text on each surface, large text, button labels on button fills, borders and icons against adjacent colors, focus rings against both the component and the page background, hover and pressed states, and text over the darkest and lightest regions of any image.
Run the calculator below on every pair from Step 2 and record pass/fail per threshold.
Contrast ratio is computed from relative luminance, which lightness moves and hue barely does - so darkening or lightening preserves brand identity while fixing the number. If the brand color cannot reach 4.5:1 on its main surface without becoming unrecognizable, keep it for large text and UI components (3:1) and mint a darker "text-safe" variant of the same hue for body copy.
Color must never be the sole carrier of information. Concrete alternatives:
Check the palette under deuteranopia, protanopia, and tritanopia simulation. Red/green must never be the only distinction between two meanings - prefer blue/orange when two hues must contrast. If two adjacent chart series or statuses become indistinguishable in simulation, apply a Step 5 alternative.
Dark mode is a separate set of pairings, not an inversion. Verify every pair again on dark surfaces, avoid pure white text on pure black (halation for astigmatic users - slightly desaturated off-white on a dark gray surface reads better), and confirm focus rings still clear 3:1 on the dark background.
Finally, verify focus indicators meet 3:1 and check disabled states: WCAG exempts disabled controls from contrast minimums, but any disabled text the user must still read (a pre-filled locked value) should stay legible.
Self-contained Node script, no dependencies. Save as contrast.js, edit the pairs array, run node contrast.js.
// WCAG 2.x contrast ratio checker. Edit pairs, then: node contrast.js
const pairs = [
['#1F1F1F', '#FFFFFF', 'body text / surface'],
['#5F6368', '#FFFFFF', 'secondary text / surface'],
['#0057B7', '#FFFFFF', 'link text / surface'],
['#949494', '#FFFFFF', 'border / surface'],
['#999999', '#FFFFFF', 'BAD caption gray'],
['#666666', '#FFFFFF', 'GOOD caption gray'],
]
const lin = (c) => {
const s = c / 255
return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4)
}
const luminance = (hex) => {
const n = parseInt(hex.slice(1), 16)
return 0.2126 * lin(n >> 16) + 0.7152 * lin((n >> 8) & 255) + 0.0722 * lin(n & 255)
}
const ratio = (a, b) => {
const [hi, lo] = [luminance(a), luminance(b)].sort((x, y) => y - x)
return (hi + 0.05) / (lo + 0.05)
}
for (const [fg, bg, label] of pairs) {
const r = ratio(fg, bg)
const verdict = r >= 7 ? 'AAA' : r >= 4.5 ? 'AA body' : r >= 3 ? 'large/UI only' : 'FAIL'
console.log(`${fg} on ${bg} ${r.toFixed(2)}:1 ${verdict} (${label})`)
}#1F1F1F on #FFFFFF 16.48:1 AAA (body text / surface)
#5F6368 on #FFFFFF 6.05:1 AA body (secondary text / surface)
#0057B7 on #FFFFFF 6.89:1 AA body (link text / surface)
#949494 on #FFFFFF 3.03:1 large/UI only (border / surface)
#999999 on #FFFFFF 2.85:1 FAIL (BAD caption gray)
#666666 on #FFFFFF 5.74:1 AA body (GOOD caption gray)Read it: primary and secondary text clear 4.5:1 with room; the link blue passes body text so no underline-only compromise is forced; the border gray at 3.03:1 is legal for UI components but must never carry text. The fail/pass pair shows the fix pattern - same neutral hue, lightness dropped from #999999 (2.85:1, fails everything) to #666666 (5.74:1, passes AA body).
Produce a contrast report containing: the full pairing table with computed ratios and pass/fail per threshold, the corrected token values (before → after hex), the list of color-only meanings found and the non-color cue added for each, color-blindness simulation notes, and the dark-mode pairing table.
When conformance is contractual or regulated (government procurement, healthcare, education), pass results to a qualified accessibility specialist for formal conformance claims - this skill produces engineering evidence, not a legal audit. For accessibility issues beyond color (semantics, keyboard, screen readers), route to accessibility-audit. To design the palette itself before auditing it, pair with color-palette-builder.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.