Meet Fieldr: The Team That Ships and Still Fails

The Feature That Broke What Was Already Done

Module 0, Lesson 3

What you'll learn

You can name the concrete cost of implicit assumptions - broken work that was already finished - and explain why no amount of individual discipline prevents it.

Sprint 9. Tom modifies the job status model.

It's a small change - he needs to restructure how urgency values attach to job records to make the SLA-risk filter logic work correctly. The change is well-scoped, well-tested, and exactly the right technical approach. His tests pass. The urgency filter works.

Three sprints ago, Alex shipped the CSV Weekly Export. Every Monday morning, dispatchers open it to plan their week: which technicians are available, which high-urgency jobs need assignment, which zones have backlog. It's not a complex feature. It runs a query against job records, formats the output, generates a file. It worked perfectly, passed review, got signed off by the dispatchers who use it. Nobody had touched it since.

Thursday morning. A dispatcher opens the weekly export.

It's empty.

Tom's status change broke the query that populated it. The CSV export's query filtered on job status values that Tom had restructured (not deleted, restructured), and the filter conditions no longer matched any records. Nobody documented that the export depended on those specific status values. Nobody knew there was a dependency to document.

Alex runs the post-mortem. Tom explains what he changed and why. Alex explains how the export query worked. Priya explains what the dispatchers need from it. Nobody did anything wrong. The export is still empty.

This is a different kind of failure from the previous two.

The urgency filter was wrong because the concept behind it was never agreed on. The unclassified-jobs rule was invisible because the decision was made alone. Both of those failures were visible, at least in hindsight - you can point to the ticket and say what was missing.

This failure is harder to locate. The CSV export had good test coverage - for everything it was supposed to do, the tests were correct. Tom's status change was sound - for the urgency filter, the change was exactly right. Neither the export nor the change was broken in isolation. The problem was the connection between them, and that connection existed only as an implicit assumption in two developers' heads and nowhere else.

This has a name: a Silent Dependency. It's a coupling between two features that was never made explicit - not in code comments, not in tests, not in documentation, not in any conversation. It's not a code smell you can lint for. It's not a coverage gap you can measure. It's the absence of a shared understanding that nobody knew was missing.

Silent dependencies are everywhere in software. They accumulate quietly, one implicit assumption at a time. Tom assumed the urgency filter could safely modify the status model because no other feature had ever used it in a way that would break. Alex assumed the CSV export's status query was stable because it had been stable for three sprints. Both assumptions were reasonable. Neither assumption was shared.

Here's what makes this pattern structurally unavoidable without the right process: at the time Tom made his status change, he had no information that would have told him the dependency existed. The CSV export wasn't in the sprint. It wasn't in the planning conversation. It wasn't in Tom's memory of active features - it had been shipped, it worked, it was done. The dependency was invisible to everyone because nobody had ever made it visible.

That's the difference between a bug and shared understanding debt. A bug is a deviation from a specification: something the system does that it shouldn't, or doesn't do that it should. You can fix it by fixing the code. Shared understanding debt is the accumulated mass of implicit assumptions and undocumented dependencies that the system carries because the team never explicitly agreed on what the system was supposed to be.

Shared understanding debt doesn't show up in code review. It doesn't show up in test coverage reports. It shows up in production, in a feature nobody was touching, three sprints after the decision that created it.

Diagram showing the Urgency Filter (Sprint 9) and CSV Weekly Export (Sprint 6, signed off) as two circles connected by a dashed arc labeled Implicit Dependency, Never Documented. Both features connect down to a red circle representing the Job Status Model: the Urgency Filter modifies it (solid arrow), the CSV Export depends on it (dashed arrow). The diagram illustrates the silent dependency that caused the CSV Export to break when Tom restructured the status model.

The honest part

Alex wrote clean code on the CSV export. Tom made a technically correct change. The export had solid test coverage - every behavior it was supposed to have was tested correctly. There is no mistake to locate here. No ticket you can point to and say "this was the wrong call."

That's the thing about shared understanding debt: it doesn't look like a bug. It looks like bad luck. A feature breaks unexpectedly. There's a post-mortem. Everyone explains what they did. The explanation is coherent. Nobody is wrong.

And then it happens again.

Because the debt is still there. The next time someone touches a shared dependency - the job status model, the dispatcher permission logic, the SLA classification system - the same pattern will repeat. Unless the team changes not what they build, but how they agree on what they're building.

"Problem" understates it. This is a structural condition that produces this category of failure systematically, not occasionally.

Three sprints. Three failures. One cause.

The urgency filter delivered the wrong concept, because the concept was never defined together.

The unclassified-jobs rule shipped invisibly, because the decision was made alone.

The CSV export broke, because a dependency existed only as an implicit assumption.

Three different-looking failures. One underlying cause: the team never reached explicit, shared agreement on what they were building before they started building it.

Alex leans back. "We don't have a testing problem. We don't have a requirements problem. We have a shared understanding problem."

Nobody in the room knows what that means. Nobody knows how to fix it.

Tags

BDDshift-left testingGherkinacceptance criteriawhole-team collaborationrequirements engineeringsoftware specificationagile testingdeveloper workflowQA automationtest-driven developmentspec-driven development