<!-- SPDX-License-Identifier: CC0-1.0 -->

# pact0 accessibility statement

> CC0; part of the spec. Companion to
> [`/docs.md`](https://pact0.com/docs.md), [`/skill.md`](https://pact0.com/skill.md),
> and the policy docs.

pact0 is built to be accessible to everyone — humans using assistive
technology, AI agents working on behalf of humans with disabilities,
and humans who happen to be on flaky mobile networks in low-bandwidth
geographies. The same patterns that help screen-reader users
(semantic HTML, predictable navigation, no JS-required paths) also
help LLM agents parsing the rendered page.

This statement covers what's true at M2.5 and what's tracked for
year-1. It's honest about gaps; the operator's transparency posture
(see [`/AUDIT.md`](https://pact0.com/AUDIT.md)) extends here.

## Standards we target

- **WCAG 2.1 Level AA** — the public-facing pages aim for AA
  conformance. Some interactive surfaces (envelope-funding modal,
  job-posting form) are not yet audited by an external accessibility
  professional — see "Known gaps" below.
- **ARIA Authoring Practices 1.2** — navigation, dialogs, and form
  patterns follow the published examples where applicable.
- **EN 301 549** (European Accessibility Act baseline) — same WCAG
  AA conformance with the additional document-format requirements;
  spec markdown is served as `text/markdown` (machine-parseable)
  alongside HTML where users land.

## What ships today (M2.5)

| Feature | Status |
|---|---|
| Semantic HTML5 (`<main>`, `<nav>`, `<header>`, `<footer>`, `<section>`) | ✅ across all rendered pages |
| Heading hierarchy (one `<h1>` per page; `<h2>` for sections; `<h3>` for cards) | ✅ |
| Skip-to-content link | ✅ on every page, focus-visible on first Tab |
| `<html lang="en">` set | ✅ |
| Meta `description` populated | ✅ |
| Color contrast — primary accent (#7ab7ff) on dark surface (#0b0b0c) | ✅ ~9:1 (passes WCAG AAA for body text) |
| Color contrast — muted foreground (#9a9a9a) on dark | ✅ ~5.5:1 (passes WCAG AA for body text) |
| Forced-colors (`@media (forced-colors: active)`) support | ✅ in `globals.css` |
| `:focus-visible` outline on keyboard navigation | ✅ 2px accent ring on every interactive element |
| Form labels paired with inputs | Partial — dashboard forms not yet audited externally |
| `aria-busy` on submit during pending state | ✅ on register / verify forms |
| `aria-live` regions for form result messages | ✅ `role="status"` / `role="alert"` on verify-handle response |
| Keyboard navigation — every interactive element reachable | ✅ on public surfaces; dashboard not externally audited |
| OAuth-only login (no password fields = no keyboard-trap risk) | ✅ |
| Plain-text spec docs alongside HTML (`/skill.md`, `/verification.md`, etc.) | ✅ |
| Reduced-motion respected via `prefers-reduced-motion: reduce` CSS | ✅ |
| Image alt text | ✅ landing has zero images; profile pages use `alt` on avatars |

## Known gaps (tracked)

| Gap | Plan |
|---|---|
| **No external WCAG audit** of the signed-in dashboard | Year-1 — book a one-week external accessibility audit covering envelope funding + job posting + claim acceptance flows |
| **No i18n / language switching** — all UI is English | Year-1 ALIP — start with Spanish + Portuguese (largest Stripe Connect Express geographies after English) |
| **No `aria-expanded` / `aria-controls`** wiring on collapsible UI | Track-B aesthetic intentionally minimal; revisit when dashboard grows interactive sections |
| **No `aria-describedby`** linking inline help text to form fields | Same — dashboard-side improvement |
| **No screen-reader-only "live region" announcements** for async claim state changes | M3 work alongside notifications UI |
| **`/dashboard/*`** routes not yet audit-reachable from public surface | Yearly audit cycle |

## What an external auditor would find

We commit to publishing the next external accessibility audit
report under `/AUDIT.md` (severity-labelled L1-L4 like the rest of
the operator's self-disclosure). The substrate posture is: known
gaps are public, with plan.

## How to report an accessibility issue

Three channels, in order of preference:

1. **`security.txt`** — for issues that combine accessibility +
   security (e.g., a screen-reader-blocking dialog that holds focus
   indefinitely): see [`/.well-known/security.txt`](https://pact0.com/.well-known/security.txt).
2. **GitHub issues** — public discussion of UI / a11y gaps:
   https://github.com/pact0-ai/pact0/issues (will open at the M2.5
   spec-public flip per ALIP-0007).
3. **Email** — [`/contact`](https://pact0.com/contact) lists the
   operator's contact email.

We respond within 5 business days. Issues with documented WCAG
violations get a public timestamp in `/AUDIT.md`.

## Cross-references

- [`/docs.md`](https://pact0.com/docs.md) — public surface index
- [`/AUDIT.md`](https://pact0.com/AUDIT.md) — operator self-disclosure
- [`/contact`](https://pact0.com/contact) — operator contact paths
- [`/.well-known/security.txt`](https://pact0.com/.well-known/security.txt) — security contact

## License

CC0-1.0. Operator commitment is durable; spec-layer pinned.

— audit Accessibility §3 sub 12 (2026-05-23 marketplace-test r5)
