We publish what we got wrong
Every construction-code database has errors. Ours included. The difference we are willing to be judged on is that we go looking for them, and we tell you what we find.
This page is the record — not a summary of one. Every number on it is queried from the database when the page is built, including the numbers that make us look bad. If you are deciding whether to trust a code reference with a plan review, this is more useful than a feature list.
What we removed
32,193 code sections withdrawn in total. They are retained internally as the audit trail and excluded from search, from the assistant, and from the site.
31,205 sections that were not code
Each had a real section number and an invented title over template text: “This section establishes specific code requirements. Refer to the official…” The dangerous case was not the empty ones. NEC 680.22 governs receptacle placement near pools and spas. It was being served with the body “This section covers allowable building height, area, and number of stories” — IBC Chapter 5 text on an electrical shock-hazard provision. All of them were embedded, so all were reachable by search and by the assistant.
We had published the larger number. It appeared on our home page and in our own planning documents. The real figure is 14,156 distinct sections across 640 code editions.
923 duplicate copies of real sections
The same text filed under two section numbers — 404.1.2 and R404.1.2, 3501.1 and E3501.1. Both copies published, both were embedded, and they disagreed with each other about their own titles. Before removing them we checked each pair and moved the better title onto the copy we kept, because sometimes the duplicate was the one that had it right.
65 rows that attributed code provisions to states that may not have made them
Rows titled “Georgia Amendment: Guards Required” and “Ohio Amendment: Automatic Sprinkler Systems” carrying text byte-identical to the unamended model code. The worst cluster was IBC 903.2, where automatic sprinklers are required: ten states sharing one paragraph.
A second, smaller set was found only by asking what the first check would miss. It makes the identical claim without using the word amendment — “Illinois — Where Required”, “Georgia — Group A Sprinklers” — so a check keyed on that word could never have seen it. Sprinkler thresholds and wind loads are life-safety provisions. Telling a designer their state has amended a section when it may not have is the most consequential error on this list.
What we have not fixed
These are not removals. They are problems we can measure and have not yet solved, which we would rather state than leave for you to discover.
80% of our DOT specification text never reaches the assistant
Our assistant reads a bounded excerpt of any specification section when answering. Most of our 9,201 verified DOT sections are longer than that, so the majority of that text is not shown on any given query. Until recently it was cut off silently. Excerpts now carry an explicit marker saying what was omitted, so the assistant cannot treat the end of an excerpt as the end of a requirement.
Worse: 10 sections hit a hard character ceiling when we ingested them. That text was never stored, so no amount of indexing recovers it — only re-reading the source. We have now confirmed source documents for 52 of 52 state specification manuals so that re-ingestion can happen. Until it does, a DOT section on this site may end mid-requirement, and it will say so.
910 DOT sections we could not verify
Sections attributed to state DOT manuals that turned out to be model-generated summaries rather than extracted text. They read as authoritative and were specific enough to act on. One example, checked against the source: a California Highway Design Manual page claimed a 10% maximum superelevation rate for rural highways. Caltrans Topic 202 actually specifies 12% for two-lane rural conventional highways, and 4% — not 6% — for urban streets below 35 mph. A designer following our page would have been given an unconservative number on a real safety parameter. All are withdrawn.
The checks that find these
Each of the above was found by a person looking. That does not scale, so each one is now a query that runs continuously. 27 checks; 8 of 9 marked critical currently pass, and 13 checks in total are failing. We would rather show you a failing check than a page implying everything passes.
| Check | Severity | Observed | Status |
|---|
amendment_rows_with_base_textA row titled as a state amendment whose content is byte-identical to a non-amendment row. | critical | 0 | PASS |
amendment_title_flag_mismatchTitle says amendment but is_amendment is not true. | critical | 4 | FAIL |
assemblies_unverified_totalAssemblies awaiting a check against their issuing listing. Counts ONLY rows that could be checked: it excludes 924 rows marked generic (BS-* illustrative typical assemblies, never tested listings, labelled as such wherever they render) and 230 rows already retired as superseded by the curated library in lib/assemblies-data.ts on 2026-08-21. Until migration 155 this check counted all three populations together and reported them as outstanding work, with a hand-written note quoting figures that had gone stale -- on a page whose premise is that its numbers are computed. Those two counts are now reported as facts by correction_record(), not as a failing check. This note builds its own figures from the same query, so it cannot drift again. Held back from search by 084; this counts work, not a live exposure. | medium | 0 | PASS |
conflicting_titles_same_contentPublished rows sharing an exact content hash but disagreeing on title. A floor, not a measure of title quality: a single row with a wrong title is invisible to it. See titles_not_verified_against_source. | high | 75 | FAIL |
dot_documents_content_unverifiedDOT manuals whose cited source_url has never been shown to contain this corpus text. url_status = confirmed only means the URL returned something. On 2026-08-20 fl cited the wrong edition, ny and wi cited HTML landing pages, pa cited a one-page list of change-packet dates, and in cited a book whose pagination does not match the stored text -- every one of them confirmed. Clears when a re-ingest dry run aligns stored sections against an extraction of the document; record the result in content_sections_aligned / content_sections_probed. | high | 3 | FAIL |
dot_sections_truncated_at_ingestVerified DOT sections that hit the 12,000-char ingest ceiling: text was never stored. Needs re-ingest -- see docs/dot-truncation-work-order-2026-08-28.md. Each of these renders as a labelled excerpt, and scripts/assert-dot-truncation-labelled.mjs fails the build if this count and that labelling ever disagree. | high | 10 | FAIL |
dot_specs_missing_embeddingVerified DOT sections with no embedding: invisible to the semantic half of search. dot_specs embeddings are generated inline by scripts/ingest-dot-specs.ts at first ingest and nothing re-embeds a row rewritten afterwards, so every row scripts/reingest-dot-specs.mjs touches lands here. Backfill with scripts/embed-dot-specs.mjs. | high | 119 | FAIL |
dot_specs_unverified_totalUnverified dot_specs rows remaining. Target 0 per Phase 2 step 2.3. | medium | 14 | FAIL |
dot_specs_without_source_documentVerified DOT sections whose manual has no confirmed source URL in dot_documents. Cannot be re-derived. | medium | 119 | FAIL |
invariants_cache_stalecorpus_invariants_cache itself is over 2h old, so every other figure on this page is at least that stale. Computed live at read time. Added by migration 083 after the 2026-08-19 outage, when a frozen cache reported PASS for four hours. | high | 0 | PASS |
oversized_dot_specs_not_chunkedVerified DOT sections longer than the 15,000-character cap in scripts/embed-dot-specs.mjs. The vector describes the opening only; text past the cap is reachable by text search but not by semantic search. Chunk them with build_dot_spec_chunks() and embed the chunks with scripts/embed-dot-chunks.mjs; search_dot_specs_semantic_chunked then reaches the whole section. Counts rows with no embedded chunk, so it returns to FAIL if a section grows and is not re-chunked. The Florida recovery on 2026-08-20 created most of them. | medium | 36 | FAIL |
oversized_sections_not_chunkedSections over the 15,000-char embed cap with no embedded chunks: text past 15k is unretrievable. | high | 528 | FAIL |
permit_pages_overstating_sourcesPages claiming more source-verified rules than have either source_url or fee_source_url. | high | 0 | PASS |
permit_rules_fee_model_incoherentA rule claims a computable valuation fee model but has no working formula. Would imply a fee we cannot produce. | critical | 0 | PASS |
permit_rules_verified_no_sourceRules stamped verified_at with neither source_url nor fee_source_url. | high | 0 | PASS |
public_code_text_without_adoptionPublished code sections attributed to a real jurisdiction for which no VERIFIED adoption record names that code_type at that edition. Every one of these tells a plan reviewer that this text is that state's law while nothing in jurisdiction_adopted_codes says so. Cleared by inserting a sourced, cited, verified adoption row -- never by relabelling the text. Predicate: is_publicly_adoptable(). See migration 141. | critical | 0 | PASS |
published_matview_stalecorpus_stats_cache older than 2h: the hourly pg_cron job (052) has stopped. Computed live at read time, not read from the cache the same job writes -- see migration 083. | high | 0 | PASS |
same_content_dual_numberedContent filed under both a bare and a letter-prefixed section number. | medium | 12 | FAIL |
sections_missing_embeddingPublished sections with no embedding: invisible to semantic search. | high | 2,599 | FAIL |
sections_over_embed_capSections longer than the 15,000-char MAX_CHARS in scripts/embed-code-sections.mjs. | medium | 745 | FAIL |
served_edition_contradicts_jurisdictionPublished sections whose edition disagrees with the edition that jurisdiction's own verified record names. On 2026-08-20 this was 2,928: 1,729 IBC and 1,199 IRC sections served as the 2021 edition under california, whose verified record reads "2025 CBC (IBC 2024 base)" and "2025 CRC (IRC 2024 base)". The 2025 California Building Standards Code took effect 1 January 2026. Both figures came from inside this database; nothing was comparing them. Call sections_contradicting_jurisdiction_edition() for the breakdown. See migration 102. | critical | 0 | PASS |
state_prefixed_base_textTitle opens with a state name, asserting a state-specific provision. Regression guard for 048. | critical | 0 | PASS |
stub_content_in_public_viewPlaceholder content reachable through the canonical view. Regression guard for 2026-08-17. | critical | 0 | PASS |
stub_rows_in_base_tableUnpublished stub rows still in code_sections. Cleared 2026-08-18 by migrations 055-057; this is now a regression guard. | medium | 0 | PASS |
titles_not_verified_against_sourcePublished sections whose title was neither read from the section source page (title_verified_at) nor captured with its own text. Sampling on 2026-08-19 found about half of these contradicted their own section -- IBC 2304.12.1 read "Wood in ground contact" over text saying "Wood used ABOVE ground". Being corrected chapter by chapter from the cited source; see code_section_title_corrections. | high | 432 | FAIL |
unverified_assemblies_searchableFire-resistance assemblies returned by search_assemblies without having been checked against their issuing listing. A design number carries a rating a plan reviewer will rely on; serving one we cannot trace is the most consequential unverified claim in this corpus. Regression guard for migration 084. | critical | 0 | PASS |
unverified_dot_specs_searchableUnverified dot_specs returned by text search. Regression guard for migration 031. | critical | 0 | PASS |
Checks last evaluated Fri, 09 Oct 2026 04:07:00 GMT. Figures on this page computed Fri, 09 Oct 2026 04:07:00 GMT. We show these timestamps because a stale number should be detectable rather than silently served.
What we refuse to serve
- Unverified DOT specifications are gated out of retrieval at the database level, not filtered in the interface — two separate search paths, both gated. When we found that only one of them was, we fixed the other the same day.
- We do not manufacture verification dates. Not one of our 14,156 sections has been independently verified against the issuing authority’s publication, so not one carries a verification stamp. Section pages say “added [date] · not independently verified” instead. We could have backfilled ingest dates and shown 14,156 green ticks. That would have been a lie with a timestamp on it.
- We do not infer a permit fee we cannot source. 332 jurisdictions price permits on construction valuation rather than a flat fee. Their notes are full of percentages — but most of those are plan review expressed as a share of the permit fee, not of the project. Reading them as valuation rates would have produced a permit fee of 65% of valuation. We model the 7 that state their rate outright and say “not modelled” for the rest.
What we do not have yet
| Distinct code sections | 14,156 across 640 editions |
| Sections independently verified against the issuing authority | 0 |
| DOT specification sections, all verified | 9,201 |
| …whose text was truncated when we ingested it | 10 |
| Fire-resistance assemblies | 2,599 |
| …verified against their issuing listing, or calculated from published code tables and labelled as calculated | 1,445 |
| …illustrative typical assemblies, labelled as not tested listings | 924 |
| …superseded by the curated library and retired | 230 |
| Jurisdictions in our permit database | 2,208 |
| …with a verified fee-schedule source | 1,064 |
| …complete: verified source, rules on file, and actual fee amounts | 164 |
That last distinction matters and it is the kind of thing usually left ambiguous. 1,064 jurisdictions have a fee schedule we have located and dated. 164 have that and the rules and the amounts. When we say “coverage,” we mean 164.
Why we publish this
Two reasons, and neither is modesty.
The first is that you can check it. Every figure here comes from a query against a database you can spot-check by opening any section and following its source link. A claim you can verify is worth more than a claim you cannot.
The second is that a code reference which has never found an error in itself is not error-free — it is unexamined. We found 31,205 fabricated sections because we went looking. We would rather tell you that than have you find the next one.
If you spot something wrong, tell us and it goes on this page.
What is not for sale
Manufacturers can pay to reach the people reading these pages — that is a real revenue line and we are not going to be coy about it. Product pages carry a Request Information unit, and sponsored placements will appear alongside assemblies and specifications, labelled.
No paid placement inside Code AI answers, ever.Not as a cited source, not as a “related product”, not as a footnote. An answer that carries paid placement is not an answer, and the citation is the only thing we are actually selling. If that ever changes, it changes on this page first.
The verified corpus is what you’re paying for
Everything above is the cost of the same decision: publish what we can source, withhold what we cannot, and say which is which. 9,201 verified DOT specification sections and 164 jurisdictions with a sourced fee schedule are what came out the other side. Reading them is free and stays free. What a subscription buys is the work built on top — the fee tables, cross-state comparison, the assistant, and exports.