{
  "id": 2007355,
  "title": "The Audit Became a Build Step",
  "url": "https://urgent.news/2026/08/19/the-audit-became-a-build-step",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-19T19:54:25.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/henry_dan_81513dd35a2f540/the-audit-became-a-build-step-45je"
  },
  "original_language": "en",
  "account": "The audit of the travel site's legal-status dataset was conducted twice, each time revealing inconsistencies in stored facts. The first audit found the same fact stored in four places, with a fifth occurrence in prose. The second audit discovered that the drift had a fifth home - the database itself. A country's status was incorrectly recorded in one file while being accurate in another. A different country was placed in the wrong continent in the database, causing dead links on live pages.\n\nBoth audits were essential and accurate when executed. However, the problem lies in the fact that an audit only certifies a moment. The dataset has multiple writers, including an admin panel, an agent editing files, the reporter, and occasional migrations. After the auditor's departure, no system holds agreement among these writers.\n\nThe check is not just a session; it is a script that runs before anything else in the build. Two design decisions are crucial: loading the app's real modules instead of a regex scrape and using the app's own slug transforms, name normalization, and merge logic. These ensure that the check accurately reflects the rendering code's behavior.\n\nThe check distinguishes between errors and warnings. A contradiction between two sources where a reader can reach - the database says one status, and the search dropdown says another - is an error and triggers a build failure. On the other hand, a country that exists in the static files but has no database row is a warning, indicating an unmanaged page that will be edited in the future.\n\nThe check also has two important rules: failing to run is a failure, and running silently without verifying is worse than not running at all. If the database is unreachable, the check exits with a nonzero status and prints \"this is not a pass.\"\n\nThe check initially produced 28 known conflicts, which couldn't be resolved by blocking every deploy. Therefore, known differences live in a baseline file, but any baseline entry that stops matching reality is reported. The baseline starts at 28 and eventually shrinks to 0, forming a contract for any future disagreements.\n\nThe audit exposed the true sources of truth in the dataset, revealing different authorities for the same facts on various pages of the site. This realization led to the creation of a definition that resolves ambiguities and clarifies which copy should be trusted. This definition has proven beneficial over time, ensuring consistency in data interpretation and maintenance.",
  "summary": "I have audited my travel site's legal-status dataset twice. The first audit found the same fact stored in four places, drifting independently. The second found the drift had a fifth home — the prose — and ended with me writing that a half-derived page contradicting itself \"is not a risk, it's a schedule.\" Six weeks later the schedule delivered again. A country's status was wrong in one file and…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}