module-operability-floorlisted
Install: claude install-skill matis-dev/m-skills
# Module: The Operability Floor
**Loaded by:** `accessibility-architect` · `design-architect` · `code-review-architect` · `testing-architect` · `planning-architect` · `implementing-architect`. Read it whenever a run touches an interactive surface; do not restate its content in a skill file.
**Why this is separate from the craft floor:** almost everything below produces **zero automated violations**. A focus trap with no exit, focus never returned to the trigger after a dialog closes, a route change that announces nothing — there is no violating node for a scanner to find. They are architectural, which means they are decided when the interaction is designed, not fixed from a log afterwards.
**The rule that governs all of it:** `role`, `aria-*`, and `tabindex` change what assistive technology is *told*, and change nothing about what the element *does*. A `<div role="button">` announces as a button and then ignores Enter, ignores Space, cannot be focused, and cannot be disabled. **No ARIA is better than bad ARIA.**
---
## 1. Native First, ARIA Second
1. **Use the element that already means it.** `<button>`, `<a href>`, `<input>`, `<select>`, `<details>`, `<dialog>`, `<table>`, `<label>`, `<fieldset>`/`<legend>`, heading levels in order. Each arrives with role, keyboard behaviour, focusability, and a disabled state you did not have to write and cannot forget.
2. **Only if no native element expresses it**, reach for ARIA — and then you owe the full contract, not just the rol