Accessibility
Governs the accessibility targets every other foundation must meet, and the gate nothing enters foundations/ or patterns/ without passing.
The gate every other foundation must pass. Nothing enters foundations/ or patterns/ without meeting these targets.
What is approved
Fernando Kylas approved Accessibility on 2026-08-26. The approval covers the conformance target and every threshold this chapter states: WCAG 2.2 Level AA, the contrast minimums, the focus indicator, keyboard operability, the 24 by 24 target minimum, the text-spacing and 200% resize targets, the motion rules, and the documents limitation.
Two items are acknowledged and intentionally excluded, and both are limits of the toolchain rather than of the targets:
A11Y-02, the PDF cannot be made accessible by the current toolchain. This chapter states plainly that no accessibility claim may be made for a Fernando Kylas PDF and that the HTML is the accessible form. Approving it approves that honesty, not a defect.A11Y-03, no automated accessibility audit runs. A process gap outside this chapter's jurisdiction: nothing the chapter states is wrong for lacking a runner, and every figure here was measured by hand and dated.
A threshold does not move because a standard does. This targets WCAG 2.2, not "the current WCAG". Adopting a later version is a superseding decision.
Conformance target
WCAG 2.2, Level AA. Locked by Fernando on 2026-08-26 (A11Y-04, DECISIONS.md).
It confirms what the chapter was already written to rather than choosing something new. Every criterion cited below is a 2.2 AA criterion, and 2.5.8 Target Size (Minimum) exists only in 2.2, so the chapter could not have been describing 2.1. The lock removes an assumption, not a possibility.
AA rather than AAA, and the reason is a value you have already approved. AAA requires 7:1 for body text. The paper tone #F6F4F1 with primary ink measures 18.03:1 and clears it, but text-secondary at 8.07:1 and text-tertiary at 5.64:1 do not, so AAA would retire two of the three reading tiers and with them the editorial grey the system is built on. AA is the target the palette was designed against.
A version, not a moving target. This is WCAG 2.2, not "the current WCAG". When 3.0 arrives it does not silently become the standard here: adopting it would be a superseding decision, because a threshold that changes without anyone deciding is the failure this lock exists to prevent.
Colour
Complete and measured. This section and the focus indicator below are what other chapters cite as the gate.
| Element | Minimum |
|---|---|
| Body text (below 24px, or below 18.66px bold) | 4.5:1 |
| Large text (24px and above, or 18.66px bold and above) | 3:1 |
| UI components and graphical objects, including a meaning-bearing rule | 3:1 |
| Focus indicator, against adjacent colours | 3:1 |
| Data marks, against the ground and against each other | 3:1 |
| Decorative surface or rule | none, but never the sole carrier of anything |
| Disabled control | exempt |
Colour is never the sole carrier of meaning. This is brand-principles.md §3.3; the thresholds it must clear are below. Anything communicated by colour must also be carried by text, shape, or position. The Report Engine's four channels exist for this reason: severity as a square, state as a circle, confidence as dots, coverage as a bar.
All approved pairs, with measured ratios for every ground in the system, are recorded in the contrast matrix in colour.md §7.2. colour.md is authoritative for colour values; this file is authoritative for the targets they must meet.
Focus indicator: decided 2026-07-25
| Ground | Ring value | Ratio |
|---|---|---|
Light paper #F6F4F1 | #0A0A0A | 18.03:1 |
Raised card #FCFCFB | #0A0A0A | 19.29:1 |
Green wash #EBF0E9 | #0A0A0A | 17.13:1 |
Dark ink #090909 | #FAFAF7 | 19.04:1 |
Dark raised #2A2A2A | #FAFAF7 | 13.73:1 |
2 px ring at 2 px offset. One ink ring is legal on every light surface in the system, so no per-surface exception is needed. Token: focus-ring.
Green is not a focus colour. It measures 2.65:1 against paper, below the 3:1 minimum.
The previous --shadow-focus token is Superseded. It composited to roughly 1.1:1 and was not a focus indicator at all. It must not be carried into v3.1.
Never outline: none without a replacement that measures 3:1 against adjacent colours.
Increased contrast
Under prefers-contrast: more, text-secondary and text-tertiary rise to text-primary and border is promoted to border-strong. No new colours are introduced.
Known colour defects
COLOUR-01, RESOLVED 2026-08-26.text-tertiary#8E8E8Eon darksurface-raised#2A2A2Ameasured 4.38:1 against the 4.5:1 body threshold, so a caption inside a dark card was non-conforming. Tertiary on a raised surface now resolves to#ADADAD, 6.40:1. The card was measured and deliberately not darkened: seecolour.md§14.1.
Output issued before that date still carries the defect, and this is the honest position rather than an oversight. Fernando's decision of 2026-08-26 applies the fix to new output only; validated report PDFs already delivered are not reissued. A conformance claim is a claim about a specific document, so a report carrying the 4.38:1 pair does not become conforming because a later stylesheet does. Anything reissued from source picks the fix up automatically.
Typography
Specified 2026-08-25. Every figure below was measured against the built site or is a WCAG 2.2 AA success criterion, named where it applies.
| Target | Value | Basis |
|---|---|---|
| Minimum body size in content | 16px | The system sets 17px. The floor is declared in tokens.css beside the token |
| Minimum line height for body copy | 1.5 | The system sets 1.647, measured 28px on 17px |
| Roles permitted below 16px | caption 13px, footnote and label 12px | Metadata, captions and labels only. colour.md §4.2 forbids body copy at these sizes |
| Text resizable to 200% | no loss of content or function | WCAG 1.4.4. Measured: root raised to 32px, scrollWidth stayed 1440 against a 1440 client, no horizontal overflow |
| Text spacing override tolerated | line 1.5, letter 0.12em, word 0.16em, paragraph 2em | WCAG 1.4.12. Measured with all four applied at once: no overflow |
| Reflow | 320px, no horizontal scrolling | WCAG 1.4.10. The engine's validation record measures this per report |
The root font size is never overridden. It resolves to the browser's own 16px, and 40 token declarations are in rem, so a reader who raises their default carries the whole scale with them. A pixel type scale would silently ignore that preference, which is why there is not one.
Interaction
Specified 2026-08-25.
| Target | Value | Basis |
|---|---|---|
| Visible focus indicator | 2px primary ink, 2px offset, on every focusable element | Decided 2026-07-25, above. Measured 18.03:1 on paper and 19.04:1 on ink, against a 3:1 requirement |
| Focus never removed | outline: none only inside :focus:not(:focus-visible) | WCAG 2.4.7. A pointer press may hide the ring; a keyboard focus may never |
| Keyboard operability | every control reachable and operable, DOM order, no positive tabindex | WCAG 2.1.1 and 2.4.3. Measured on the home page: 36 focusable elements, 0 positive tabindex |
| Target size | 24 by 24 CSS px minimum, except inline links | WCAG 2.2 AA 2.5.8, with its own inline exception |
Measured, and unresolved. The theme control is 40 by 40. Fourteen targets on the home page render below 24 by 24, all of them text links between 19px and 22px tall. WCAG 2.5.8 exempts a target "in a sentence or whose size is constrained by the line height of non-target text", which covers a link inside a paragraph and plainly does not cover a standalone control. The navigation links sit between those two readings. See A11Y-01 below.
Motion
Specified 2026-08-25.
| Target | Value | Basis |
|---|---|---|
prefers-reduced-motion: reduce | honoured system-wide | base.css sets animation-duration: 0.01ms and --fk-dur falls from 200ms to 1ms |
| Duration under the preference | 1ms, not 0 | So transitionend still fires and a product listening for it does not hang |
| Meaning survives the preference | the end state is kept, only the travel is removed | The theme control's mark flips instantly rather than not at all |
| Flashing | nothing flashes more than three times per second | WCAG 2.3.1. Nothing in the system animates at that rate; there is no video and no auto-playing content |
Documents
Specified 2026-08-25, and the specification is a limitation rather than a target.
The HTML is the accessible form of every publication. The PDF is a print artefact derived from it. That is a statement of fact about the toolchain, not a preference:
| Property | State | Measured |
|---|---|---|
| Tagged PDF | not produced | All four specimen PDFs carry StructTreeRoot: 0 and /Marked: 0 |
| Reading order in the PDF | not encoded | Follows from the above |
| Alt text in the PDF | not carried | Follows from the above |
| Alt text in the HTML | required | Every chart and dial takes role="img" and a label |
| Print reading type | stated in points against an accessible floor | print.css re-declares the reading roles |
PDFs are produced by headless Chrome --print-to-pdf, which emits no structure tree. No accessibility claim may be made for a Fernando Kylas PDF, and a reader who needs assistive technology is served the HTML. Changing this needs a different toolchain, which is A11Y-02.
Testing
Specified 2026-08-25.
| Method | Cadence | Status |
|---|---|---|
| Contrast matrix over every token pair, every ground | On any colour change | In force, colour.md §7.2 |
| Rendered-text contrast in a browser | Per release | In force. 80 nodes measured, lowest 5.64:1 on light |
| Keyboard order and focus indicator | Per release | In force |
| Reflow at 320px, both themes | Per release | In force |
| Forced colours and greyscale | Per release | In force |
| Automated audit, axe or equivalent | not run | The validation record states this plainly |
Accessibility here is checked by construction and by measurement, not by a tool. That is a real position and not an excuse: an automated pass catches categories a human misses, and no tool catches a colour that carries meaning alone. Adding one is A11Y-03.
Who signs off: Fernando, as with every other foundation. AGENTS.md §2.
Open items
A11Y-01: Does the target-size minimum apply to navigation links? · RESOLVED 2026-08-26
A11Y-01: Does the target-size minimum apply to navigation links?Fourteen targets measured below 24 by 24 CSS px, all of them text links, 19 to 22px tall.
The question was framed around the wrong exception. 2.5.8's inline exception covers a link inside a sentence and does not cover a standalone control, and a navigation row is neither, so arguing it either way could not settle anything. 2.5.8's SPACING exception settles it without an opinion: an undersized target conforms if a 24px circle centred on it does not meet another target's circle. The navigation declares gap: 12px 24px and the links measure ~20px tall, so centres sit 32px apart vertically and further horizontally, against the 24px the test requires. The navigation already conformed.
So the decision was a quality one rather than a compliance one, and the hit areas were raised anyway. Fernando's decision, 2026-08-26: inline-flex with a 24px min-height on every navigation link. The text does not move; the box grows around the label. It costs 4px of masthead height and nothing else.
Why raise a target that already conformed. Relying on an exception is reasonable for a document and poor for a control someone uses on a phone. A 24px target is easier to hit than a 20px one, and the exception remains true underneath, so the system now satisfies the criterion twice over rather than narrowly.
A11Y-02: The PDF cannot be made accessible by the current toolchain · Open
Headless Chrome emits no structure tree, so no Fernando Kylas PDF is tagged. Resolving this means a different PDF pipeline, which is a platform decision rather than a brand one, and it belongs with the engine.
A11Y-03: No automated accessibility audit runs · Open
Everything is checked by construction and by measurement. An automated pass would catch a different class of defect. Whether one is added, and where it runs, is open.
A11Y-04: The WCAG version and level are not locked · RESOLVED 2026-08-26
A11Y-04: The WCAG version and level are not lockedThe conformance target read "default assumption: WCAG 2.2 AA", and every threshold in this chapter was written against 2.2 AA. Locked by Fernando on 2026-08-26, which made explicit what was assumed and changed no threshold.
It had to be settled before this chapter could be approved: it governs the gate nothing enters foundations/ or patterns/ without passing, and approving a gate whose standard is an assumption approves a standard nobody set.