Inspiration
The DOJ's ADA Title II rule makes WCAG 2.1 AA accessibility mandatory for US state and local governments — and in April 2026, the DOJ extended the compliance deadlines by a full year, citing resource constraints and technical solutions that have lagged expectations. In other words: the regulator itself admitted governments can't get this done with today's tooling. Disability advocates are already suing over the delay.
Here's why it's so hard: an inaccessible PDF looks identical to an accessible one. The failure lives inside the file — missing tag structure, no language declaration, image-only scans. The only way to know is to open every file and inspect it by hand. A mid-size city publishes thousands of PDFs across dozens of departments, new ones arrive every day, and there's nowhere to write the answer down. Next month: start over. Accessibility scans get run once and rot in spreadsheets.
We realized the missing piece isn't a better scanner — it's memory. So we made the catalog, not a spreadsheet, the compliance system of record.
What it does
AccessCatalog Agent models a government document library as first-class DataHub entities:
| Concept | DataHub entity |
|---|---|
| PDF document | Dataset on a custom documents platform |
| Department | Domain + Ownership (real owners) |
| Compliance status | Tags: unscanned → 508-compliant / 508-non-compliant / in-remediation |
| Scan evidence | Custom properties (score, failed checks, timestamp) |
| Original → accessible edition | Lineage |
An AI agent then closes the loop:
- READ — inventories every unscanned document through the DataHub MCP Server (
search,get_entities,get_lineage) - SCAN — runs real PDF accessibility checks: tag structure (StructTreeRoot/MarkInfo), document title,
/Lang, image-only scanned pages, form labels — each mapped to Section 508 / WCAG criteria - WRITE BACK — verdicts become DataHub tags, with evidence written into properties, so the next person or agent inherits verified knowledge
- DECIDE — prioritizes public-facing documents by traffic and severity, and reads lineage to catch documents that already have an accessible edition: recommend a URL redirect instead of paying for duplicate remediation
- REPORT — a prioritized queue routed to named owners, plus department-level compliance reports generated entirely from live catalog state
The report is just a snapshot. The real product is a catalog that's always current — the loop runs every day, so people don't have to.
How we built it
- DataHub (docker quickstart) as the metadata backbone; Python SDK for ingestion & write-back; DataHub MCP Server for all agent reads
- OpenAI Agents SDK for the agent loop (MCP stdio integration + guardrailed function tools)
- pikepdf / pypdf to inspect actual PDF internals — no mocked metadata
- WeasyPrint (PDF/UA) + reportlab + Pillow to generate a 22-document synthetic municipal corpus with genuinely accessible and inaccessible PDFs: untagged text PDFs, image-only "scans", metadata-stripped exports, and remediation pairs connected by lineage
- Typer/Rich CLI:
ingest·agent·report·status·scan, plus a one-commanddemo.shfor judges
Challenges we ran into
- Agents fail in predictable ways. Our first run queued a compliant document at priority #1 because it had high traffic. Prompt fixes weren't enough — we moved the constraints into the tools themselves:
queue_remediationnow rejects compliant, internal, or already-remediated documents. Prompts guide; tools guarantee. - Parallel tool calls scrambled the queue. The SDK executes tool calls concurrently, so "position = count + 1" raced and every document got position 1. Fix: sequential tool calls + positions assigned from call order — never let an LLM hand-number a list.
- The agent narrated work it hadn't done. One summary claimed 8 documents were queued when only 3 write-backs had landed (DataHub went down mid-run). We added a
get_queue_statustool returning authoritative state, and required the agent to reconcile against it before reporting. Never describe what you can't verify. - Making the demo real. Generating genuinely tagged PDF/UA files (not faked metadata) so an Adobe Acrobat tags panel and our scanner agree on every verdict.
Accomplishments that we're proud of
- A complete read → act → write-back loop on DataHub, reproducible run after run: 22 scanned, 16 non-compliant found, 10 queued by impact, 2 lineage-based redirects — zero hand-editing
- The lineage redirect decision: the agent refuses to queue a failed document because the graph knows an accessible edition already exists. A spreadsheet could never make that call
- Guardrailed write-back that keeps the catalog consistent even when the model misjudges
- Compliance reports rendered entirely from live catalog state — if it isn't in DataHub, it isn't in the report
What we learned
- The catalog is the memory that breaks the infinite re-checking loop — write-back is what makes agent work compound
- Tool-level guardrails beat prompt instructions for anything that must always hold
- Give agents an authoritative state tool and make them reconcile before summarizing
- OSS DataHub MCP Server is read-only (mutation tools disabled), which pushed us to a clean architecture: MCP for reads, SDK-backed tools for writes — and it's better for it
What's next for AccessCatalog Agent — AI Agent for ADA Document Compliance
The next step isn't a feature — it's reach. ADA Title II applies to every US state and local government: tens of thousands of cities, counties, school districts, and transit agencies, all facing the same deadline with the same broken workflow. The DOJ extended compliance dates precisely because they aren't ready. We want AccessCatalog Agent in their hands before the extended deadlines hit:
- Get it to the agencies that need it. Publish as a turnkey open-source deployment (it's Apache 2.0 today), with guides written for government IT teams — not data engineers. Partner with the civic-tech community (Code for America brigades, GovTech groups) and state digital service teams to run pilots with real document libraries.
- Meet agencies where their documents live. Connectors for SharePoint, Drupal, CKAN, and records-management systems, so onboarding is "point it at your site," not "build a corpus."
- Scan on arrival. DataHub Actions integration so every newly published document is scanned, tagged, and triaged the moment it enters the catalog — compliance that keeps up with the daily flow of new documents.
- Close the remediation loop. A second agent that doesn't just queue work but fixes PDFs and publishes accessible editions back to the catalog — with lineage, so the redirect recommendation writes itself.
- Deeper checks over time: alt-text quality and reading-order validation with vision models, and DataHub's native Document entity for reasoning over document content, not just metadata.
One catalog, one loop, running daily in every agency that publishes documents — that's the goal.
Log in or sign up for Devpost to join the conversation.