<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Pipeline Architecture on Ghost in the data</title><link>https://ghostinthedata.info/tags/pipeline-architecture/</link><description>Ghost in the data</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>Ghost in the data</copyright><lastBuildDate>Sat, 09 May 2026 09:00:00 +1000</lastBuildDate><atom:link href="https://ghostinthedata.info/tags/pipeline-architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>The Broken Window in Your Data Pipeline</title><link>https://ghostinthedata.info/posts/2026/2026-05-09-broken-window-theory/</link><pubDate>Sat, 09 May 2026 09:00:00 +1000</pubDate><guid>https://ghostinthedata.info/posts/2026/2026-05-09-broken-window-theory/</guid><author>Chris Hillman</author><description>A single ignored data quality issue doesn't stay local. In pipelines, broken windows travel — and by the time anyone notices, the damage is already downstream.</description><content:encoded>&lt;p>There&amp;rsquo;s a particular kind of data problem that doesn&amp;rsquo;t announce itself. It accumulates.&lt;/p>
&lt;p>We were receiving Salesforce data through delta extraction — sensible in theory, because full snapshots can run to hundreds of terabytes and less than 1% of records change on any given day. The problem is that deltas require someone to know what &amp;ldquo;changed&amp;rdquo; means. In Salesforce, that&amp;rsquo;s less obvious than it sounds. Watch a &lt;code>last_modified&lt;/code> column and you&amp;rsquo;ll miss objects that get updated when a related object changes, without their own timestamp reflecting it.&lt;/p>
&lt;p>Over time: drift. Orphan records. Data that &lt;em>looks&lt;/em> current because the record exists, but isn&amp;rsquo;t. The fix was documented — run a full snapshot periodically to correct the accumulated drift, painful as that was — and everyone with any context on the system knew it.&lt;/p>
&lt;p>What happened was roughly this: the drift accumulated silently until something downstream looked wrong. An investigation traced it back to the delta logic. The full snapshot was run. The problem was resolved. Notes were written. The workaround was filed away.&lt;/p>
&lt;p>And then, about twelve months later, the same conversation happened again.&lt;/p>
&lt;hr>
&lt;p>What made that moment stick wasn&amp;rsquo;t the technical failure. It was the recognition that the window had been broken for a while. Everybody who walked past it knew it was broken. We&amp;rsquo;d even put a note next to it.&lt;/p>
&lt;p>I&amp;rsquo;ve been that person — the one who wrote the documentation, filed the Jira ticket, and moved on. Which is probably why I remember the twelve-month cycle so clearly. And why I started paying attention to the pattern of it, across teams and companies, long after that particular incident.&lt;/p>
&lt;p>We just hadn&amp;rsquo;t fixed it.&lt;/p>
&lt;hr>
&lt;p>Bear with me here, because what I&amp;rsquo;m about to describe starts with an abandoned car in the Bronx in 1969 — and I promise it ends somewhere relevant to your dbt models.&lt;/p>
&lt;/br>
&lt;/br>
&lt;h3 id="a-broken-window-in-the-bronx-a-broken-window-in-your-warehouse">A broken window in the Bronx, a broken window in your warehouse&lt;/h3>
&lt;/br>
&lt;p>A Stanford psychologist named Philip Zimbardo ran a strange experiment. He abandoned two cars — one in the Bronx, one in Palo Alto — and watched what happened.&lt;/p>
&lt;p>The Bronx car was stripped within twenty-four hours. Within three days it was completely gutted.
The Palo Alto car sat untouched for a week — until Zimbardo himself walked up with a sledgehammer and broke a window. Within hours, it had been stripped too.&lt;/p>
&lt;p>Same car. Different signal.&lt;/p>
&lt;p>Thirteen years later, criminologists James Q. Wilson and George Kelling built a theory on that experiment. If a window in a building is broken and left unrepaired, they argued, all the rest will soon follow. Not because there&amp;rsquo;s a particular breed of window-breaker lurking around, but because an unrepaired window sends a message: &lt;em>nobody here cares&lt;/em>. And once that signal is broadcast, breaking more windows costs nothing.&lt;/p>
&lt;p>The insight was semiotic, not structural. It wasn&amp;rsquo;t about windows. It was about what an unrepaired window communicates about the norms of a place.&lt;/p>
&lt;p>The theory eventually found its way into software. Andrew Hunt and David Thomas put it into &lt;em>The Pragmatic Programmer&lt;/em> almost verbatim: don&amp;rsquo;t leave broken windows — bad designs, wrong decisions, poor code — unrepaired. They&amp;rsquo;d watched clean systems deteriorate quickly once windows started breaking. The mechanism was the same. A developer looking at a messy codebase thinks: &lt;em>if someone else got away with being careless, maybe I can too.&lt;/em> The norm shifts. The entropy accelerates.&lt;/p>
&lt;p>Researchers at Empirical Software Engineering ran a controlled experiment — twenty-nine developers, codebases seeded with either high or low technical-debt density — and found exactly what Hunt and Thomas had intuited. Pre-existing debt measurably caused developers to introduce &lt;em>more&lt;/em> debt. Non-descriptive variable names. Duplicated logic instead of reuse. Additional code smells. The broken window was statistically contagious.&lt;/p>
&lt;p>It&amp;rsquo;s a compelling idea, and it maps well to software. But it doesn&amp;rsquo;t map perfectly to data engineering. And the gap between &amp;ldquo;maps well&amp;rdquo; and &amp;ldquo;maps perfectly&amp;rdquo; is where teams get into serious trouble.&lt;/p>
&lt;hr>
&lt;/br>
&lt;/br>
&lt;h3 id="the-thing-thats-different-about-data">The thing that&amp;rsquo;s different about data&lt;/h3>
&lt;/br>
&lt;p>When a broken window appears in a codebase, it&amp;rsquo;s local. A messy function, an undocumented module, a class that&amp;rsquo;s doing five things at once — these are ugly, they invite imitation, and they slow future development. But they stay where they are. They don&amp;rsquo;t go anywhere.&lt;/p>
&lt;p>A broken window in a data pipeline doesn&amp;rsquo;t stay where it is.&lt;/p>
&lt;p>It travels.&lt;/p>
&lt;p>That&amp;rsquo;s the thing nobody really talks about when they apply broken-windows thinking to data work. In a pipeline, everything is connected. A schema drift in a source table doesn&amp;rsquo;t just make that table annoying to work with — it silently corrupts every model downstream that touches that field. Which means it corrupts every dashboard that uses those models. Which means it corrupts the metrics those dashboards expose. Which means it corrupts the business decisions made from those metrics.&lt;/p>
&lt;p>The broken window is in row one. By the time someone notices, the damage is in the boardroom.&lt;/p>
&lt;p>And unlike software, where the damage is visible — a stacktrace, a failing build, a crash — data damage is often invisible. The pipeline still runs. The dashboard still renders. The report still reconciles. The numbers just happen to be wrong, quietly, for reasons nobody can easily trace.&lt;/p>
&lt;p>Software bugs produce noise. Bad data produces silence.&lt;/p>
&lt;p>In software, the broken window signals disorder and invites imitation. In data pipelines, it does all of that &lt;em>and&lt;/em> it propagates at machine speed through every downstream system that trusts the upstream to be clean. By the time the propagation is discovered, it&amp;rsquo;s usually been underway for a while.&lt;/p>
&lt;p>This is the propagation problem. It&amp;rsquo;s not just that bad data begets more bad data. It&amp;rsquo;s that one bad window can contaminate an entire watershed.&lt;/p>
&lt;hr>
&lt;/br>
&lt;/br>
&lt;h3 id="what-a-contaminated-watershed-actually-looks-like">What a contaminated watershed actually looks like&lt;/h3>
&lt;/br>
&lt;p>In May 2022, Unity Software — the game engine company — disclosed something remarkable in their SEC earnings filing. Their Audience Pinpointer ML model, the system that powered their ad targeting business, had ingested bad data from a large customer. That data had corrupted their training set.&lt;/p>
&lt;p>CEO John Riccitiello on the earnings call: &amp;ldquo;we lost the value of a portion of our training data due in part to us ingesting bad data from a large customer.&amp;rdquo;&lt;/p>
&lt;p>The bad data didn&amp;rsquo;t just produce one wrong prediction. It poisoned the model weights. Every subsequent retrain was built on a contaminated foundation. The model had to be taken offline, the bad data removed, and training restarted from scratch. The estimated impact was $110 million in revenue for 2022. The stock dropped 37% in a single day. Market cap losses in the billions.&lt;/p>
&lt;p>The broken window wasn&amp;rsquo;t in Unity&amp;rsquo;s systems — it was in data they were &lt;em>ingesting&lt;/em>. Once it crossed the boundary into their training pipeline, it propagated in the only direction data knows: forward and downstream, embedding itself into every layer of the system that touched it.&lt;/p>
&lt;p>Riccitiello&amp;rsquo;s pledge after the fact was almost poignant: &amp;ldquo;We are deploying monitoring, alerting and recovery systems and processes to promptly mitigate future events.&amp;rdquo; The observability came after the disaster. The window had already broken every other window in the building.&lt;/p>
&lt;hr>
&lt;p>These are the normal failure mode of connected data systems. The propagation isn&amp;rsquo;t a bug in the design — it&amp;rsquo;s inherent to the architecture. Data flows in one direction. Trust flows with it. The moment you have a pipeline, you have propagation risk.&lt;/p>
&lt;p>The question isn&amp;rsquo;t whether your broken windows will propagate. It&amp;rsquo;s how far they&amp;rsquo;ll travel before anyone notices.&lt;/p>
&lt;hr>
&lt;/br>
&lt;/br>
&lt;h3 id="the-tools-we-built-to-tolerate-this">The tools we built to tolerate this&lt;/h3>
&lt;/br>
&lt;p>Modern data tooling has given us genuinely sophisticated ways to formally accept broken windows.&lt;/p>
&lt;p>dbt — the transformation tool most data engineering teams live inside — has a &lt;code>severity&lt;/code> configuration on data tests. You can set a test to &lt;code>warn&lt;/code> instead of &lt;code>error&lt;/code>. The test runs, detects a problem, and&amp;hellip; doesn&amp;rsquo;t fail the pipeline. It records the warning and moves on.&lt;/p>
&lt;p>The documentation is cheerful about it: &amp;ldquo;Maybe 1 duplicate record can count as a warning, but 10 duplicate records should count as an error.&amp;rdquo;&lt;/p>
&lt;p>In principle, this is sensible. In practice, the &lt;code>warn&lt;/code> threshold becomes a Schelling point. Teams configure tests to warn to avoid breaking CI. The warnings accumulate. And then — almost invariably — the warnings become wallpaper. &lt;em>(Go check your own test results right now. Count how many have been in warn state for more than two weeks. I&amp;rsquo;ll wait.)&lt;/em>&lt;/p>
&lt;p>dbt also has a feature called &lt;code>store_failures&lt;/code> that saves failed records to an audit schema table. The test is doing its job. The failures are being recorded. They overwrite the previous run&amp;rsquo;s failures on the next run. If nobody is actively querying that audit table — and almost nobody is — the failures exist only to make the test feel like it&amp;rsquo;s being taken seriously.&lt;/p>
&lt;p>It&amp;rsquo;s a passive graveyard. The window is monitored. Nobody fixes the glass.&lt;/p>
&lt;p>Airflow has an equivalent pattern. The &lt;code>soft_fail&lt;/code> parameter on sensors means that if an exception is raised — the source system is down, the file hasn&amp;rsquo;t arrived — the task is marked as &lt;em>skipped&lt;/em> rather than &lt;em>failed&lt;/em>. Downstream tasks, depending on their trigger rules, may also skip. An entire branch of your DAG quietly collapses to a skipped state, which most pipelines treat as benign, and your stakeholders get a dashboard with no data in it instead of an error message.&lt;/p>
&lt;p>Retries do something similar. A flaky source that fails 30% of the time gets &lt;code>retries=3&lt;/code> configured. The task eventually succeeds on the third attempt. The 30% failure rate never surfaces as an anomaly in any meaningful way. Until the source dies entirely, at which point the symptom everyone responds to is not &amp;ldquo;this has been flaky for six months&amp;rdquo; but &amp;ldquo;this suddenly started failing today.&amp;rdquo;&lt;/p>
&lt;p>None of this is the fault of the tools. dbt and Airflow are doing what they&amp;rsquo;re designed to do. The issue is that the default ergonomics of both make &lt;em>tolerating&lt;/em> failure significantly easier than &lt;em>stopping propagation&lt;/em>. &amp;ldquo;Don&amp;rsquo;t break the build&amp;rdquo; is a more convenient goal than &amp;ldquo;don&amp;rsquo;t ship broken data downstream.&amp;rdquo; The tools give you excellent knobs for the former and adequate knobs for the latter.&lt;/p>
&lt;p>Chad Sanderson — formerly at Convoy, now building in the data contracts space — has a name for what this produces over time. He calls it the POSIWID principle: the Purpose Of a System Is What It Does. If your data pipelines are consistently producing low-quality data, and your team consistently tolerates that, then whatever you think the purpose of your data platform is, its actual purpose is to enable teams to move fast, ship without accountability, and tolerate breakages.&lt;/p>
&lt;p>The broken windows aren&amp;rsquo;t exceptions. They&amp;rsquo;re the product.&lt;/p>
&lt;hr>
&lt;/br>
&lt;/br>
&lt;h3 id="weve-built-monitoring-why-isnt-it-working">We&amp;rsquo;ve built monitoring. Why isn&amp;rsquo;t it working?&lt;/h3>
&lt;/br>
&lt;p>Data observability emerged as a formal discipline. The concept — largely popularised by Barr Moses at Monte Carlo — drew directly from the software world&amp;rsquo;s SRE and distributed systems monitoring practices: freshness, distribution, volume, schema, lineage. Five pillars. Automated anomaly detection. Alerts in Slack when something looks wrong.&lt;/p>
&lt;p>The framing was right. The problem is what happened next.&lt;/p>
&lt;p>Monte Carlo&amp;rsquo;s own telemetry — across millions of monitored tables — shows that alert engagement drops 15% when a Slack channel exceeds 50 alerts per week, and a further 20% past 100 per week. The data observability system has a data quality problem: the signal-to-noise ratio degrades, and so does the human response.&lt;/p>
&lt;p>This isn&amp;rsquo;t specific to data. The clinical literature on alarm fatigue is sobering. ICU environments average more than 150 alarms per bed per day. Studies consistently find that 72% to 99% of those alarms are non-actionable. The clinical community&amp;rsquo;s response to this was institutional — the Joint Commission made alarm safety a National Patient Safety Goal in 2014 — because they recognised that a monitoring system that produces more noise than signal doesn&amp;rsquo;t just fail to help. It actively worsens outcomes by training humans to stop responding.&lt;/p>
&lt;p>Cybersecurity teams face the same thing. Security operations centres receive thousands of alerts daily; most go unaddressed, not because analysts are lazy, but because the ratio of genuine signals to false positives has degraded to the point where sustained attention is cognitively impossible.&lt;/p>
&lt;p>The Google SRE book is direct on this: &amp;ldquo;Every page should be actionable. If a page merely merits a robotic response, it shouldn&amp;rsquo;t be a page.&amp;rdquo;&lt;/p>
&lt;p>In data engineering, the equivalent of a &amp;ldquo;robotic response&amp;rdquo; is the acknowledged-and-unresolved alert. The monitor that fires every Tuesday morning, gets a thumbs up in Teams, gets added to the &amp;ldquo;known issues&amp;rdquo; document, and never gets fixed. The window is now monitored. The fact that it&amp;rsquo;s monitored makes the team feel responsible. The window stays broken.&lt;/p>
&lt;p>There&amp;rsquo;s a term for this: observability theatre. The infrastructure of visibility exists. The dashboards are green. Nobody&amp;rsquo;s actually looking at the glass.&lt;/p>
&lt;p>This is where the broken windows metaphor earns its keep most fully. Wilson and Kelling weren&amp;rsquo;t saying that disorder is bad because it looks bad. They were saying that an unrepaired broken window sends a signal that no one cares — and that signal is the actual mechanism of decay. Monitoring a broken window without repairing it sends exactly the same signal. Possibly a worse one, because now everyone knows the problem is being tracked and nobody&amp;rsquo;s acting on it. The norm becomes: acknowledged problems are not necessarily fixed problems.&lt;/p>
&lt;hr>
&lt;/br>
&lt;/br>
&lt;h3 id="the-stakeholder-sees-it-differently">The stakeholder sees it differently&lt;/h3>
&lt;/br>
&lt;p>Here is the asymmetry that data teams consistently underestimate.&lt;/p>
&lt;p>When an engineer looks at a broken window in a data pipeline — a column with a known null rate, a test that&amp;rsquo;s been in warn state for three weeks, a DAG that soft-fails every second run — they see technical debt. A problem to eventually be addressed. Something that exists on a spectrum of severity, probably not at the top of the list.&lt;/p>
&lt;p>When a business stakeholder encounters the downstream consequence of that broken window — a dashboard that contradicts a number they just presented to the CFO, a metric that moved in an unexplained direction, a report that doesn&amp;rsquo;t reconcile with another report — they don&amp;rsquo;t think &amp;ldquo;technical debt.&amp;rdquo; They think: &lt;em>can I trust the data team?&lt;/em>&lt;/p>
&lt;p>Benn Stancil — one of the clearest thinkers writing about this — put it well: &amp;ldquo;Trust is built, and blown up, by the outputs — and specifically, the consistency of those outputs.&amp;rdquo; He uses a vivid image that I keep coming back to: &amp;ldquo;Data and the dashboards that display it create a shared sense of reality. Looking at two dashboards that don&amp;rsquo;t match is like looking out two adjacent windows and not seeing the same thing.&amp;rdquo;&lt;/p>
&lt;p>That&amp;rsquo;s the experience of broken-window propagation from the stakeholder&amp;rsquo;s side. Two adjacent windows. Different views. A reality that doesn&amp;rsquo;t cohere.&lt;/p>
&lt;p>Monte Carlo&amp;rsquo;s 2023 State of Data Quality research put a number to the trust inversion that most data engineers already sense. In 2022, 47% of respondents reported that business stakeholders identified data issues first &amp;ldquo;all or most of the time&amp;rdquo; — more often than the data team itself. By 2023, that figure had risen to 74%. &lt;em>(Three in four. Let that land.)&lt;/em>&lt;/p>
&lt;p>Think about what that means. In three out of four data incidents, the people who rely on the data found the problem before the people who built it. The pipeline runs, the test passes, the dashboard renders, and somewhere downstream a business analyst is staring at a number that doesn&amp;rsquo;t look right and is about to send a message that starts with: &amp;ldquo;Quick question about this figure&amp;hellip;&amp;rdquo;&lt;/p>
&lt;p>The damage isn&amp;rsquo;t technical. It&amp;rsquo;s relational. And it compounds in a way that&amp;rsquo;s harder to reverse than any schema migration.&lt;/p>
&lt;p>Thomas Redman — who has spent decades studying data quality — made this point in Harvard Business Review: &amp;ldquo;When data are unreliable, managers quickly lose faith in them and fall back on their intuition to make decisions.&amp;rdquo; Once that happens, you haven&amp;rsquo;t just produced bad data. You&amp;rsquo;ve trained decision-makers to ignore good data too, because they can no longer distinguish between the two.&lt;/p>
&lt;p>The broken window didn&amp;rsquo;t just propagate through the pipeline. It propagated into the culture.&lt;/p>
&lt;hr>
&lt;/br>
&lt;/br>
&lt;h3 id="nobody-owns-the-broken-window">Nobody owns the broken window&lt;/h3>
&lt;/br>
&lt;p>There&amp;rsquo;s a specific pattern worth naming, because it&amp;rsquo;s where most data teams I&amp;rsquo;ve worked with have the most unacknowledged broken windows: the orphaned asset.&lt;/p>
&lt;p>The pipeline that was built by an engineer who left eighteen months ago. The table in the warehouse that exists in the data catalogue but whose owner field says &amp;ldquo;Unknown&amp;rdquo; or, worse, the name of someone who&amp;rsquo;s no longer at the company. The dbt model that runs in production, that feeds two dashboards, that nobody on the current team can fully explain.&lt;/p>
&lt;p>These aren&amp;rsquo;t broken in any obvious sense. They run. They load. The tests pass, or they&amp;rsquo;re set to warn. But they&amp;rsquo;re broken windows in the original sense: they signal that nobody cares. And because nobody owns them, nobody&amp;rsquo;s in a position to repair them even when something goes wrong.&lt;/p>
&lt;p>What typically happens is this: a new engineer joins the team. They need to understand how the data flows. They look at the catalogue. They look at the undocumented table. They look at the model that references it. They look at the Jira ticket from fourteen months ago that says &amp;ldquo;Known issue — downstream teams aware.&amp;rdquo; And they make a rational decision: don&amp;rsquo;t touch it, build around it, replicate it if necessary.&lt;/p>
&lt;p>The broken window has now inspired a new window. Same mechanism as the Bronx car. Different materials.&lt;/p>
&lt;p>The organisational research on this is unambiguous. Ron Westrum&amp;rsquo;s typology of organisational cultures — validated empirically by the DORA research programme across thousands of software teams — found that information flow predicts safety and performance more reliably than almost any structural variable. In pathological cultures, information is hoarded or withheld for political reasons. In generative cultures, information flows freely, failures are shared, and problems get fixed because surfacing problems is rewarded rather than penalised.&lt;/p>
&lt;p>Amy Edmondson&amp;rsquo;s research on psychological safety adds the other half: 85% of employees have withheld important information from their manager due to fear of speaking up. In data teams, this looks like: the junior engineer who noticed the null rate had been climbing for two weeks and didn&amp;rsquo;t raise it because they weren&amp;rsquo;t sure it was their call to make. The analyst who suspected the metric definition had drifted but didn&amp;rsquo;t want to slow down the dashboard delivery. The data engineer who knew the pipeline was flaky but figured someone more senior would have noticed if it really mattered.&lt;/p>
&lt;p>The broken window gets left unrepaired not because nobody sees it, but because the culture hasn&amp;rsquo;t made repair feel safe or worthwhile.&lt;/p>
&lt;p>Edmondson on this: &amp;ldquo;If there&amp;rsquo;s no bad news, remind yourself: It&amp;rsquo;s not that it&amp;rsquo;s not there. It&amp;rsquo;s that you&amp;rsquo;re not hearing about it.&amp;rdquo;&lt;/p>
&lt;hr>
&lt;/br>
&lt;/br>
&lt;h3 id="the-original-theorys-mistake--and-ours">The original theory&amp;rsquo;s mistake — and ours&lt;/h3>
&lt;/br>
&lt;p>Before we get to what to actually do about this, it&amp;rsquo;s worth pausing on where the original theory went wrong. Because data engineering is at risk of making exactly the same mistake.&lt;/p>
&lt;p>When Wilson and Kelling published their 1982 Atlantic article, the theory was nuanced. It was about signals and norms. It was explicitly a theory about community — about how residents and police could work together to maintain shared standards in public spaces. It was, in Kelling&amp;rsquo;s own framing, a theory of collective efficacy.&lt;/p>
&lt;p>What cities did with it was zero tolerance. Mass arrests for minor offences. Stop-and-frisk. 685,000 stops in New York City in a single year, more than 85% of them finding nothing at all.&lt;/p>
&lt;p>Kelling&amp;rsquo;s reaction, when he learned how comprehensively his theory had been misapplied: &amp;ldquo;Oh, shit.&amp;rdquo;&lt;/p>
&lt;p>The software world made a version of the same mistake when it imported broken windows thinking. &amp;ldquo;Don&amp;rsquo;t live with broken windows&amp;rdquo; became, for some teams, a linting rule for everything, a zero-tolerance policy for code smells, a culture of perfectionism that burned people out and produced beautiful codebases that never shipped.&lt;/p>
&lt;p>Adam Tornhill&amp;rsquo;s research at CodeScene offers the corrective: not all broken windows matter equally. In a 400,000-line codebase with 89 developers, his analysis found that 4% of the code was responsible for 72% of the defects. The broken windows that needed fixing weren&amp;rsquo;t distributed evenly. They clustered in hotspots — files that were both frequently changed and highly complex. Fix the hotspots. Let the cold, ugly, stable corner of the codebase sit.&lt;/p>
&lt;p>The principle for data engineering is the same. Zero-tolerance data quality enforcement — failing every pipeline on every test at severity error — produces fragile systems and tired teams. It&amp;rsquo;s the data equivalent of arresting everyone for jaywalking. The signal gets lost in the noise.&lt;/p>
&lt;p>What the original theory was actually pointing at was something more like: maintain the norm. Make it visible that people care. Ensure that the broken windows that matter — the ones that propagate, the ones in the high-traffic, high-trust parts of the system — get fixed promptly and publicly. Not every window. The ones that signal whether anyone&amp;rsquo;s paying attention.&lt;/p>
&lt;hr>
&lt;h3 id="what-collective-efficacy-looks-like-in-a-data-team">What collective efficacy looks like in a data team&lt;/h3>
&lt;/br>
&lt;p>Sampson, Raudenbush, and Earls — the Chicago sociologists who ran the most rigorous empirical test of broken windows theory — found that the variable that actually predicted neighbourhood safety wasn&amp;rsquo;t the presence or absence of disorder. It was &lt;em>collective efficacy&lt;/em>: the combination of social cohesion and shared willingness to intervene. Neighbours who knew each other, trusted each other, and were willing to act on behalf of each other&amp;rsquo;s wellbeing.&lt;/p>
&lt;p>The policy prescription that emerges from their work is very different from zero tolerance. It&amp;rsquo;s community investment. Shared ownership. Making the costs of non-intervention visible.&lt;/p>
&lt;p>The equivalent in data engineering starts with one thing, and if you do nothing else in this list, do this one:&lt;/p>
&lt;p>&lt;strong>Make propagation visible before anything else.&lt;/strong>&lt;/p>
&lt;p>Column-level data lineage — now available in most modern data observability platforms and increasingly in the open-source OpenLineage standard — lets you answer the question: if this column is wrong, what does it break? That question should be answerable in seconds, not hours. Teams that can visualise propagation chains respond to broken windows faster because they can see the radius of the damage before they decide whether to act.&lt;/p>
&lt;p>This matters beyond incident response. When you can show an engineer that the null column they&amp;rsquo;re tolerating in a staging model feeds seven downstream gold-layer tables, three dashboards, and a Snowflake share that two other teams consume — the calculus on whether to fix it changes. The broken window stops being an abstract code quality concern and becomes a blast radius. That&amp;rsquo;s a much more compelling argument for repair than &amp;ldquo;we should improve our data quality culture.&amp;rdquo;&lt;/p>
&lt;p>&lt;strong>Treat ownership as load-bearing infrastructure, not housekeeping.&lt;/strong>&lt;/p>
&lt;p>Every pipeline, every table, every model should have a named owner. Not a team. A person. The Jira ticket that says &amp;ldquo;Known issue — downstream teams aware&amp;rdquo; with no assigned owner is the data equivalent of a broken window with an orange cone next to it. The cone acknowledges the hazard. Nobody&amp;rsquo;s fixing the glass.&lt;/p>
&lt;p>The counterargument is always resourcing — &amp;ldquo;we don&amp;rsquo;t have time to own everything properly.&amp;rdquo; That&amp;rsquo;s true, and worth taking seriously. But the right response isn&amp;rsquo;t to pretend you own things you don&amp;rsquo;t. It&amp;rsquo;s to make orphaned assets visible and have an honest conversation about whether the organisation can afford to run production pipelines with no accountable maintainer. Most of the time, when the question is asked that directly, the answer is no.&lt;/p>
&lt;p>&lt;strong>Calibrate your tolerance patterns deliberately — and actually revisit them.&lt;/strong>&lt;/p>
&lt;p>The dbt &lt;code>severity: warn&lt;/code> setting and Airflow&amp;rsquo;s &lt;code>soft_fail&lt;/code> are legitimate tools when they&amp;rsquo;re conscious decisions: &amp;ldquo;this condition is a signal worth tracking but not a pipeline-stopper, and here&amp;rsquo;s the threshold at which that changes.&amp;rdquo; The problem is that almost nobody uses them that way. They&amp;rsquo;re the path of least resistance to avoid a broken CI build — and six months later you audit your test results and discover forty tests set to warn that haven&amp;rsquo;t been at zero failures since the day they were written.&lt;/p>
&lt;p>Treat warn-severity tests the way you treat Jira tickets that never get triaged. Set a review cadence. If a test has been consistently warning for more than two weeks without an associated investigation, it&amp;rsquo;s either a bug that needs fixing or a threshold that needs changing. &amp;ldquo;Known issue&amp;rdquo; is not a status. It&amp;rsquo;s an admission.&lt;/p>
&lt;p>&lt;strong>Fix alert fatigue before it hollows out your monitoring culture.&lt;/strong>&lt;/p>
&lt;p>The Teams channel where every data quality alert lands is the digital equivalent of a neighbourhood where every broken window gets photographed and logged and nobody ever fixes one. The log is evidence that someone noticed. It&amp;rsquo;s not evidence that anyone will act.&lt;/p>
&lt;p>Set alert thresholds that produce actionable signals. The Google SRE principle applies directly: if an alert merits a robotic response, it shouldn&amp;rsquo;t be an alert. If your first instinct on seeing a particular monitor fire is to click acknowledge and move on, that monitor is producing noise, not signal. Change it or delete it. Grouping alerts by lineage — &amp;ldquo;these five monitors fired because of one upstream schema change&amp;rdquo; rather than five separate pings — reduces volume while making propagation visible at the moment of failure, which is exactly when you want it.&lt;/p>
&lt;p>&lt;strong>Make broken windows visible to leadership, because right now the cost is invisible.&lt;/strong>&lt;/p>
&lt;p>Data quality work is famously hard to demonstrate. Pipelines that run cleanly leave no artefact. A well-maintained model with a 0% null rate looks identical to a freshly built one. There&amp;rsquo;s no natural demo format for &amp;ldquo;nothing bad happened this week.&amp;rdquo;&lt;/p>
&lt;p>This invisibility is part of why broken windows accumulate. The cost of prevention is hidden in maintenance time that doesn&amp;rsquo;t get counted. The cost of failure gets absorbed by analysts who spend their Tuesdays reconciling numbers instead of answering strategic questions, by data engineers who spend their Fridays investigating stakeholder tickets, by business decisions made on incorrect information that can&amp;rsquo;t be traced back to a specific incident.&lt;/p>
&lt;p>Quantify the propagation radius when incidents do occur. How many downstream models were affected? How many stakeholders were exposed to incorrect data, and for how long? What was the resolution effort in hours? Those numbers, tracked consistently, build a case for investment that abstract arguments about data quality never will.&lt;/p>
&lt;hr>
&lt;/br>
&lt;/br>
&lt;h3 id="the-window-was-broken-before-i-noticed">The window was broken before I noticed&lt;/h3>
&lt;/br>
&lt;p>What we ended up doing was building the fix into the operating rhythm. A scheduled data drift catch-up: a full snapshot weekly, or monthly, depending on the volatility of the Salesforce object — not to respond to an incident, but to systematically correct the accumulated drift before it became visible to anyone downstream. We stopped waiting for the escalation. We made the repair part of the architecture.&lt;/p>
&lt;p>The broken window was still there, technically. The delta logic still had its blind spots around hidden relationships. But we stopped waiting for it to propagate before we addressed it. Some broken windows aren&amp;rsquo;t things you permanently seal — they&amp;rsquo;re things you build a maintenance routine around. Knowing that is the fix.&lt;/p>
&lt;p>What stayed with me wasn&amp;rsquo;t the technical solution, which was straightforward enough once we committed to it. What stayed with me was the calendar predictability of the escalation cycle before the fix. The fact that we had a known issue, a known workaround, documentation of both — and still managed to have the same downstream discovery, the same investigation, the same remediation conversation, almost exactly twelve months apart.&lt;/p>
&lt;p>The window wasn&amp;rsquo;t hidden. It was visible in the delta logs if you knew where to look. We just hadn&amp;rsquo;t made it someone&amp;rsquo;s job to look, and we hadn&amp;rsquo;t made repair part of the routine. We&amp;rsquo;d fixed the glass, filed the paperwork, and assumed the problem was solved. Until the same signal appeared in the same downstream reports, a year later.&lt;/p>
&lt;hr>
&lt;p>What I keep coming back to, though, is something that was true of that experience and is true of most of the data quality failures I&amp;rsquo;ve seen since: the window wasn&amp;rsquo;t broken secretly. It wasn&amp;rsquo;t hidden. It was visible, it was acknowledged, and it was left.&lt;/p>
&lt;p>We had the monitoring. We had the test. We had the Jira ticket.&lt;/p>
&lt;p>We had, in other words, all the infrastructure of concern. What we didn&amp;rsquo;t have was the collective agreement that repair mattered — that the propagation radius of that one broken window was large enough, and trust-eroding enough, that it justified stopping what we were doing and fixing the glass.&lt;/p>
&lt;p>That&amp;rsquo;s the thing broken windows theory is actually about, underneath all the criminology and the code smells and the schema drift. It&amp;rsquo;s about the signal that unrepaired damage sends. Not to the criminals or the developers or the data consumers. To the people who are supposed to care about the system.&lt;/p>
&lt;p>When a broken window sits long enough in a data pipeline, it stops being a problem and starts being a norm. The new engineer doesn&amp;rsquo;t flag it — they work around it. The analyst doesn&amp;rsquo;t escalate it — they add a caveat to their report. The data engineer doesn&amp;rsquo;t fix it — they document it.&lt;/p>
&lt;p>And somewhere downstream, a business decision gets made on numbers that were broken before anyone thought to check.&lt;/p>
&lt;p>The window isn&amp;rsquo;t just in the pipeline. The window is in the standard you&amp;rsquo;re willing to keep.&lt;/p></content:encoded><category>Data Engineering</category><category>Data Quality</category><category>Data Quality</category><category>Data Pipelines</category><category>Technical Debt</category><category>Data Observability</category><category>dbt</category><category>Apache Airflow</category><category>Data Culture</category><category>Pipeline Architecture</category></item></channel></rss>