B
HomeLibrariesCode AISearchProjectsBookmarksAddress
FeedbackHelp Desk
Libraries
Estimate & calculate
CalculatorsChecklists
PricingLog in

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.

CheckSeverityObservedStatus
amendment_rows_with_base_text
A row titled as a state amendment whose content is byte-identical to a non-amendment row.
critical0PASS
amendment_title_flag_mismatch
Title says amendment but is_amendment is not true.
critical4FAIL
assemblies_unverified_total
Assemblies 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.
medium0PASS
conflicting_titles_same_content
Published 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.
high75FAIL
dot_documents_content_unverified
DOT 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.
high3FAIL
dot_sections_truncated_at_ingest
Verified 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.
high10FAIL
dot_specs_missing_embedding
Verified 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.
high119FAIL
dot_specs_unverified_total
Unverified dot_specs rows remaining. Target 0 per Phase 2 step 2.3.
medium14FAIL
dot_specs_without_source_document
Verified DOT sections whose manual has no confirmed source URL in dot_documents. Cannot be re-derived.
medium119FAIL
invariants_cache_stale
corpus_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.
high0PASS
oversized_dot_specs_not_chunked
Verified 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.
medium36FAIL
oversized_sections_not_chunked
Sections over the 15,000-char embed cap with no embedded chunks: text past 15k is unretrievable.
high528FAIL
permit_pages_overstating_sources
Pages claiming more source-verified rules than have either source_url or fee_source_url.
high0PASS
permit_rules_fee_model_incoherent
A rule claims a computable valuation fee model but has no working formula. Would imply a fee we cannot produce.
critical0PASS
permit_rules_verified_no_source
Rules stamped verified_at with neither source_url nor fee_source_url.
high0PASS
public_code_text_without_adoption
Published 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.
critical0PASS
published_matview_stale
corpus_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.
high0PASS
same_content_dual_numbered
Content filed under both a bare and a letter-prefixed section number.
medium12FAIL
sections_missing_embedding
Published sections with no embedding: invisible to semantic search.
high2,599FAIL
sections_over_embed_cap
Sections longer than the 15,000-char MAX_CHARS in scripts/embed-code-sections.mjs.
medium745FAIL
served_edition_contradicts_jurisdiction
Published 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.
critical0PASS
state_prefixed_base_text
Title opens with a state name, asserting a state-specific provision. Regression guard for 048.
critical0PASS
stub_content_in_public_view
Placeholder content reachable through the canonical view. Regression guard for 2026-08-17.
critical0PASS
stub_rows_in_base_table
Unpublished stub rows still in code_sections. Cleared 2026-08-18 by migrations 055-057; this is now a regression guard.
medium0PASS
titles_not_verified_against_source
Published 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.
high432FAIL
unverified_assemblies_searchable
Fire-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.
critical0PASS
unverified_dot_specs_searchable
Unverified dot_specs returned by text search. Regression guard for migration 031.
critical0PASS

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 sections14,156 across 640 editions
Sections independently verified against the issuing authority0
DOT specification sections, all verified9,201
…whose text was truncated when we ingested it10
Fire-resistance assemblies2,599
…verified against their issuing listing, or calculated from published code tables and labelled as calculated1,445
…illustrative typical assemblies, labelled as not tested listings924
…superseded by the curated library and retired230
Jurisdictions in our permit database2,208
…with a verified fee-schedule source1,064
…complete: verified source, rules on file, and actual fee amounts164

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.