TL;DR: GitHub checks confirm that the code someone wrote tests for behaves as expected; they say nothing about the user paths a test author never wrote one for. As an app's surface grows, hand-written unit and end-to-end tests cover a shrinking share of it, so real user journeys go unchecked and their bugs reach production with every check still green.
Key Takeaways
The gap: GitHub checks confirm the paths someone scripted, not the ones a real user takes.
Coverage math: an app's surface area grows faster than any team can hand-write and maintain tests for.
Selector decay: end-to-end tests anchored to UI structure break on redesigns, whether or not there's a real bug underneath.
Diminishing returns: adding more scripts raises maintenance faster than it raises real coverage.
A different approach: TaloTrace explores your app by sight and proves each journey completes, instead of checking a fixed script.
Independent review: every TaloTrace finding is checked before it reaches you, with a recording and reproduction steps attached.
Why Do Bugs Still Reach Production Even When Every GitHub Check Passes?
GitHub checks pass because they only test what someone wrote a test for: a unit test, a type check, a scripted end-to-end flow. They don't test the paths a real user takes that nobody happened to write a script for, so a bug sitting outside every written test never turns a check red. That gap, between the code that's tested and the app that's actually used, is where production bugs live.
What Exactly Does a Green GitHub Check Verify?
A passing check usually means a build compiled, a linter found no violations, and the unit and integration tests in the suite returned the results their authors expected. Some pipelines add a handful of scripted end-to-end tests that click through a few key flows in a browser or emulator.
Nothing in that list verifies how the interface actually looks or behaves for someone using it in an order the test suite didn't anticipate. A button can be visually broken, a form can silently fail to save, or a multi-step flow can dead-end on an edge case, and every one of those checks will still report green, because none of them were asked about that particular path.
Why Does Test Coverage Shrink as Your App Grows?
The number of paths through an application grows with every screen, permission level and input combination you add. The number of paths a team can hand-write, review and maintain as tests grows far more slowly, because someone has to think of the path, write it, and keep it passing through every redesign.
Scripted end-to-end tests compound this. They're usually anchored to specific selectors or page structure, details that were never meant to be a stable contract. A harmless redesign can break tests that have nothing to do with the actual defect, so teams either chase false failures or start skipping the flaky ones, and either way a check that goes green stops meaning what it used to. This isn't a small-team problem either: in a 2016 post, Google's engineering team reported that roughly one in seven of their tests showed nondeterministic flakiness unrelated to any real code defect (see Google's Testing Blog on flaky tests).
What Do Teams Usually Try, and Where Does It Run Out?
Each common approach closes part of the gap and leaves the rest standing:
Approach | What it catches | Where it runs out |
|---|---|---|
More unit and integration tests | Logic errors inside individual functions | Can't confirm a multi-step journey resolves correctly for a real user |
More scripted end-to-end tests | Additional coverage | Maintenance burden rises with every redesign |
Manual QA pass before release | Things scripts were never told to check | Doesn't run on every build, and a reviewer working through the same regression list release after release can miss things under time pressure |
Production monitoring and user reports | Eventually surfaces what shipped broken | The user has already hit the bug by the time it surfaces |
Some teams accept the gap as the cost of shipping fast, which is a reasonable trade-off until the bug that slips through turns out to be an expensive one.
What Does Testing Your App the Way a Real User Would Look Like?
TaloTrace is an AI-powered QA testing platform built to close exactly this gap: it explores your running app and drives real user journeys to a verified outcome, rather than checking a fixed list of assertions someone wrote in advance. It navigates by looking at the screen instead of relying on selectors or element IDs, so it keeps working as your UI changes.
You point TaloTrace at your app and, optionally, describe the flow you care about in plain language. It plans the journeys worth testing, commits real actions such as create, save and submit, and reads the resulting screen to confirm what changed. Destructive or irreversible actions, like deleting an account, are held back rather than carried out. A TaloTrace goal is a machine-checkable outcome, proven true only after the action runs and false before it, so a screen already showing the expected state can't be mistaken for a completed journey.
Findings go through independent review before they reach you. TaloTrace checks its own output rather than handing you the raw, unverified result of the step that produced it, and every finding carries a recording, TaloTrace's reasoning and step-by-step reproduction. Runs happen on demand, from the app or the API, or on a recurring daily or weekly schedule against your latest build, and you can see how a run gets built in more detail. Exploring the app directly and reviewing every finding independently is what lets TaloTrace offer 24/7 continuous testing with no fatigue and no coverage gaps. It doesn't run as a pull request check today; on-demand and scheduled runs are the two ways to start one.
TaloTrace runs against a browser, an Android emulator or an iOS Simulator automatically, chosen from your app's platform, so there's no test environment for you to provision. It's dogfooded daily on Growtrics Academy, its own most-tested customer app, and its navigation reliability is measured against a standardised internal benchmark across real apps and devices. Every run's cost is tracked and visible, and TaloTrace surfaces 4x more validated bugs compared to manual QA. For a closer look at how this kind of script-free exploration works on mobile, see this piece on autonomous mobile app testing.
How Do You Get Started With TaloTrace?
Most TaloTrace tiers are published and available to buy directly. See the pricing page for the current plans, with custom terms available at enterprise scale through sales. If you want to see it explore your own app before deciding anything, TaloTrace's beta is open now — apply for early access to find out whether it fits your stack.
Frequently Asked Questions
Why do bugs still reach production even when every GitHub check passes?
GitHub checks typically confirm that a build compiles, a linter is satisfied, and the unit and integration tests someone wrote came out as expected. They don't check the paths a real user takes that were never scripted, so a bug outside every written test never turns a check red. TaloTrace closes part of that gap by exploring the running app itself and driving real user journeys to a verified outcome.
What's the difference between a passing test suite and a bug-free app?
A passing suite means every assertion someone wrote came out true. It says nothing about the assertions that were never written, and most user journeys through a real app fall into exactly that category: untested by omission, not by mistake.
Why do scripted end-to-end tests break so often?
Scripted end-to-end tests are usually anchored to specific element IDs or page structure, details that were never meant to be a stable contract. When the interface changes, the selectors go stale even if the underlying journey still works, which produces false failures or, over time, tests that get skipped rather than fixed. TaloTrace navigates by looking at the screen instead of relying on selectors, so it keeps working as the UI changes.
Can adding more unit tests close the gap between CI passing and bugs reaching users?
More unit tests catch more logic errors inside individual functions, but they can't confirm that a multi-step journey, like completing a checkout, resolves to the right screen for someone clicking through it in real time. That requires exercising the actual interface, which is a different kind of test.
Does TaloTrace run automatically on every GitHub pull request?
No. TaloTrace runs on demand from the app or the API, or on a recurring daily or weekly schedule against your latest finalised build. It isn't wired into pull request checks today.
How does TaloTrace know a journey actually passed, rather than the app just not crashing?
A TaloTrace goal is only marked complete when a machine-checkable predicate proves the outcome: it must be false before the action and true after. That means a screen already showing the expected state before anything happens can't be mistaken for a completed journey.


