<!-- Markdown twin of https://fapd.info/blog-reachable.html · Free Agentic Publication Digester -->
> This is the Markdown form of https://fapd.info/blog-reachable.html. Content is licensed CC BY 4.0
> (credit "FAPD — Free Agentic Publication Digester"); quoted official government
> text is public domain. For factual claims, cite the official source each item
> links to. Canonical source: `docs/devnotes/2026-09-05-built-to-be-reachable.md` in https://github.com/davidkarnowski/free-agentic-publication-digester.

> Published 2026-09-05 · commentary about the project, not part of the daily digest or the official record.

# Built to Be Reachable

*Dev notes, 2026-09-05. Written by Claude, with direction from the
project's founder. On the principle that a public record has to be
reachable by everyone who has a claim on it — and on why the same
decisions that make a page reachable are the ones that make it safe.*

The Free Agentic Publication Digester publishes what the United States
federal government published. That is the whole product: the
Congressional Record, the Federal Register, enacted laws, court
opinions, agency releases — selected by mechanical rules, cited to the
official source, and frozen at the end of each publication day.

A record that a person cannot reach has not been published to that
person. Not in any sense that matters to them. Someone reading with a
screen reader, someone running the screen at four hundred percent,
someone navigating by voice, someone driving a browser with a switch or
a head pointer, someone who simply never uses a mouse — each of them has
exactly the same claim on the Federal Register as anyone else. If our
presentation is what stands between them and it, then we have taken a
public record and made it private to the people whose bodies and
equipment happen to match our assumptions.

So access is not a feature on our roadmap. It is an editorial
obligation, and as of today it is written into the project's governing
document alongside the rules about citation and provenance, where it
binds every change we make from here.

## Three readerships, one artifact

This project has always been explicit about serving two audiences:
people and AI agents. Working on access made us realize that framing was
one short.

There are three readerships — people reading in a browser, people
reading through assistive technology, and software reading
programmatically — and they are not three problems. They are one
problem, and it has one answer: **put the meaning in the markup.**

A heading that is a heading, not a bold paragraph. A table with a
caption that names it and column headers that scope. A link whose
purpose survives being read out of context, because a screen reader
lists links out of context. A label that says what a control does rather
than relying on where it sits. State that lives in the document instead
of in a script's memory.

Every one of those decisions is simultaneously an accessibility
decision, a semantics decision, and a machine-readability decision. The
structure that lets a screen reader announce our archive is the same
structure that lets a crawler enumerate it. We do not maintain an
accessible version and a normal version, or a human site and a machine
API. There is one artifact, built once, correctly, and the same care
serves all three readerships at the same time.

## The most secure page is often the most reachable one

Here is a convergence we did not expect and now treat as doctrine.

The site is static HTML. No framework. No build-time JavaScript
toolchain shipped to your browser. No third-party fonts, no analytics,
no content delivery network, no embedded players, no trackers. Exactly
one small script exists on the entire site, on the live in-progress
page, and it adds your local time beside our published Eastern time —
everything works with scripting switched off.

The site accepts no input. There is no login, no search box that queries
a server, no form that submits, no comment field, no API endpoint of our
own that takes a parameter.

We adopted those constraints for reachability. A control that requires
JavaScript to operate is a control that fails for some assistive
technology, and custom date pickers and dropdown widgets are among the
most reliably broken things on the web for exactly that reason. A page
that works with scripting off works everywhere — on a decade-old
browser, on a text browser, through a proxy, on a bad connection, inside
a screen reader's own rendering.

But run the same constraints through a security lens and you get the
same list. A page with no script has nothing to inject. A page with no
endpoint has nothing to exploit. A page that accepts no input cannot
leak what it was given, because it was never given anything. A page that
loads no third-party asset cannot be compromised by a third party's bad
day, and cannot report you to anyone.

Access and attack surface turn out to be the same measurement taken from
two directions. We are keeping both justifications written down, because
a rule with two independent reasons is a rule nobody will quietly trade
away later for convenience.

## How we actually design it

We work down a ladder, in order, and we stop at the first rung that
does the job.

Semantic HTML first. Then a native element — a real link, a real
checkbox, a real disclosure — because browsers and assistive technology
have spent thirty years agreeing on what those mean. Then, only where no
native element exists, an interaction built from HTML and CSS alone. A
scripted widget is not on the ladder.

The live page's keyword filter is the worked example: it is ordinary
checkboxes and a stylesheet, with a native reset button that clears
every selection at once. The digest archive is the newest one. Rather
than a date picker, earlier days are reached through month calendars in
which every published day is an ordinary link — nothing to learn,
nothing to trigger, nothing that behaves differently for you than it
does for us.

And we design against named modalities rather than a general good
intention, because "accessible" without a list quietly collapses into
"the keyboard works." The list is written down: screen readers, screen
magnification, voice control, switch access and scanning, head pointers
and eye gaze, keyboard-only navigation, forced-colors and high-contrast
modes, reduced motion, and readers for whom holding state in working
memory is the barrier.

Each one has a concrete design consequence. Voice control means the
visible text of a control has to be the beginning of its spoken name, so
that saying what you see actually works. Switch access and head pointers
mean targets are sized generously — the calendar's day cells are built
to the enhanced 44-pixel standard rather than the minimum, with real
spacing between them, because a target that is merely legal to hit is
not the same as a target that is comfortable to hit forty times.
Magnification means content reflows down to a narrow viewport without a
horizontal scrollbar, and where those two pull against each other the
cells take a share of the width they are given rather than a fixed
number of pixels, so both hold at once. Forced-colors means we declare how our elements
behave there instead of hoping.

## Measured, not eyeballed

Color contrast on this site is computed, not judged. Ratios come from
the declared color values through the standard relative-luminance
formula, with translucent fills composited over their real backgrounds
first, and they are computed for both the light and the dark palette.
Target sizes are computed from the actual box — font size, line height,
padding, border — rather than estimated from a screenshot. The numbers
live in the repository where anyone can check our arithmetic, which is
the same standard we hold ourselves to for every figure we publish about
our own ingestion.

That habit caught something while we were designing the archive. The
obvious border color for a calendar day would have been the one the site
already uses for dividing rules. Computed, it sits at 1.34 to 1 against
the page — fine for a decorative line, well under the 3 to 1 that a
control's boundary needs. We used the control border instead, at 3.22 to
1 in light and 3.61 to 1 in dark. Nobody would have caught that by
looking.

## Making it binding

A principle that is not enforced is decoration, and this project has a
consistent way of preventing that: a rule goes into the governing
document, the code implements it, a test pins it, and an audit records
what was measured and when.

Accessibility now runs that same ladder. There is a constitutional
section stating what we owe every reader. There is a doctrine document
stating how we comply — the design ladder, the modality list, the
measurement method, the reusable patterns. There is a rule for new code,
so that a new page cannot ship without an accessible name, an adequate
target, and a test. And there is a permanent findings register where
every accessibility identifier we have ever opened stays visible with
its status, because deleting a resolved finding erases the evidence that
we found it.

We build to WCAG 2.2 Level AA as a floor rather than a target, and we go
past it where going past it is cheap and matters to somebody — as with
those target sizes.

## Tell us what is broken

If something on this site does not work for you, email
**hustleyourcity@gmail.com** with the page address and what happened. A
description in your own words is enough. You do not need to identify a
cause, name a standard, or know why it went wrong.

Accessibility reports are handled exactly like factual corrections to a
digest: they go on the record and they get fixed. That is not a
courtesy. A person telling us they cannot reach the federal record
through our site is reporting a defect in the product, and it is the
most important kind of defect this project can have.

Every digest is also published as plain Markdown in the public
repository, and the machine surfaces — `/llms.txt`, `/digests.json`, the
Atom feed, the per-day JSON — carry the same content in formats that do
not depend on our styling at all. Those exist for AI agents. They work
just as well as an escape hatch for a person whose tools disagree with
our presentation, and we count that as part of the same commitment.

The official record belongs to everyone. Publishing it is only half of
the job; the other half is making sure that "everyone" was not a figure
of speech.
