Stop drawing two lanes. Draw one pipeline that loops.

Every ranking page asks "manual or automation, which do I pick?" and answers with two parallel lanes plus a category checklist. That is the wrong picture. A durable suite is manufactured downstream of human exploration, so the real shape is one directional pipeline that feeds the next charter.

How manual testing improves test automation, not by guessing

A durable automation suite is not a parallel activity to manual testing. It is manufactured downstream of it: exploration surfaces a defect, root-cause analysis pins it to its lowest level, a value x stability x cost score clears it, and only then is it automated. Here is the pipeline, the worked handoff, and a decision instrument you can run on your own backlog.

The question every ranking page answers wrong#

Search this topic and every result asks the same thing. Manual or automation, which do you pick? Then it draws two parallel lanes and hands you an up-front checklist of categories to automate. That framing feels tidy. However, it is the wrong question, and it produces the exact suite teams hate.

The truer question is different. How does human exploration manufacture a durable automation suite? Because the answer is a pipeline, not a fork. You do not choose a lane. Instead, exploration runs first and discovers what actually breaks. Then the confirmed findings flow downstream into automation. As a result, the automated suite is evidence of what exploration proved, never a guess made before anyone looked.

Why automating everything up front produces a flaky low-value suite#

Automating a category checklist has a hidden cost nobody names. You are automating UI paths nobody confirmed matter, not root-caused failures. So each check is a broad, slow browser journey standing in for a fault you never located. Consequently, it breaks for reasons unrelated to the behavior it claims to protect.

That is where flakiness comes from. Furthermore, Google's 2016 data shows 84% of pass-to-fail transitions in its continuous integration were already flaky noise. A suite shaped this way drowns real regressions in false alarms. In the end, the team learns to ignore red builds, which is worse than having no suite at all.

How manual testing improves test automation: the pipeline#

Here is the whole mechanism as one loop, drawn directly against the category framing. A charter surfaces a surprising defect. Root-cause analysis reduces it to its lowest reproducible level. That level becomes a precise regression case. The case becomes an automated check. The checks together form a coverage map. Then the map re-aims the next charter. This is how manual testing improves test automation in practice: each stage feeds the next.

The exploration-to-automation loop: charter, defect, root-cause, regression case, automated check, coverage map, then back to the next charterOne directional pipeline, not two lanes. Human exploration discovers and root-causes; automation crystallizes the confirmed finding into a fast regression check; the coverage map then reveals the gap that aims the next charter. The loop is the point every competitor misses by drawing a one-shot decision.

Notice what the loop replaces. The category page presents a single up-front decision. This pipeline presents a cycle that compounds. Because every automated check traces to a discovered, root-caused defect, the suite grows only where real failures were found. Therefore it stays small, fast, and high-signal as it grows.

A charter is a mission, not a script#

Exploratory testing is not random clicking. It is disciplined investigation under a charter, which is a short mission for a time-boxed session. A charter names a target and a risk. Then it leaves the software tester free to follow what looks wrong. Session-based test management, defined by James Bach and Michael Bolton, makes this repeatable and reportable.

The difference from a script matters here. A scripted step can only confirm what you already expected to happen. In contrast, a charter lets a person find the defect nobody thought to write a step for. For a fuller treatment of the practice, the Satisfice exploratory testing archive and the session-based test management paper are the primary sources.

Root-cause first: push each discovery to its lowest reproducible level#

This is the crystallization step, and it is the biggest lever on suite quality. When a session surfaces a defect, do not automate it where you found it. Instead, ask the cheaper question first. What is the lowest level at which this fault reproduces? Because the level you pick decides the cost of the check forever.

Consider a bug you saw in the browser. Often the real fault lives in one pure function, reachable by a unit test in milliseconds. So the same coverage can live at the unit level instead of a slow, flaky UI journey. Martin Fowler's practical test pyramid is the canonical argument for pushing checks down. Root-cause analysis is what tells you exactly how far down each one can go.

The coverage map re-aims the next charter#

Now the loop closes where competitors present a one-shot decision. Your automated checks are a map of what is proven. Equally, the blank regions are a map of what is not. Consequently, the gaps become the target for the next exploratory session.

This is why the pipeline compounds. First, exploration finds a defect. Second, automation locks it. Third, the map shows the next unexplored risk. Then the cycle repeats, and coverage grows toward real risk rather than toward a checklist. In short, the suite gets smarter every lap.

One charter, followed from session to suite#

Abstract pipelines convince nobody, so here is one real charter carried the whole way through. Step through the five artifacts below. The chain runs from the charter, to the defect it surfaced, to the root-cause note, to the exact regression assertion, and finally to the oracle statement. That last artifact is the one vendor guides never show, because it names who decides pass or fail.

One charter, followed from session to suite

The surprising defect No up-front script predicts it

Apply a 10% coupon, then remove one line item.

The discount stays computed on the old subtotal. The order total lands USD 3.40 too low. No category checklist asks "what if the cart changes after the coupon applies?" A human chasing the risk found it in minutes.

The root-cause note Push it to the lowest reproducible level

The discount is cached on the cart when the coupon applies.

It is never recomputed when a line item changes. The real fault sits in one pure function that is called on the wrong event. That means it reproduces at the unit level, so the automated check does not need the browser at all.

The exact regression assertion The crystallized check

Now the discovery becomes one fast, precise test.

Because root-cause pinned the fault to a pure function, the regression is a unit test, not a fragile UI journey. It runs in milliseconds and fails only when this exact behavior breaks.

it('re-prices a percentage coupon after a line item is removed', () => {
  const cart = removeItem(cartWithCoupon('SAVE10'), 'sku_42');
  // discount must track the CURRENT subtotal, not the cached one
  expect(recalcDiscount(cart).total).toBe(expectedTotalAfterRemoval);
});

The oracle statement Why a human stays in the loop

Who decides this is a bug, and which rule it protects?

The oracle is a person: a percentage discount must always apply to the current subtotal. The unstated requirement is that any cart change after a coupon must re-price. No generic assertion knew the intended total. A human supplied that expectation, which is the part automation can execute but never originate.

Step through the five artifacts that carry a single exploratory session into a durable automated check. With JavaScript off, all five are listed in order and the assertion is fully readable.

Read the fifth step again, because it carries the argument. The assertion is trivial to run once it exists. However, someone had to state the expected total first. That expectation is the oracle, and a person supplied it. Automation executes that judgment on every commit, yet it could never have originated it.

Which tests are worth automating: value, stability, cost#

Most vendor guides say "measure ROI" and "make a plan," then stop. Nobody shows the arithmetic. So here is a decision instrument you can run on your own backlog. Set the value, the stability, and the cost of a candidate check, then state whether a rule or a human decides pass or fail. The verdict updates live.

Score one candidate from your backlog

Who decides pass or fail?
If only a person can say whether the output is correct, that is an oracle dependence.
Automate nowCrystallize it into a fast regression check
net 11

Value plus stability clears the cost with room to spare, and a rule can judge the result. This is exactly what a root-caused exploratory finding becomes: a fast, precise regression check worth locking down today.

Value
+8
Stability
+7
Cost
-4
Net
11

Try the oracle toggle in particular. Whenever a human must judge the result, the verdict can never reach automate-now, however high the other scores climb. That is not a quirk of the model. Instead, it is the structural rule the whole page is about, made operational.

The honest pyramid, rebuilt#

The classic pyramid is often drawn upside down in real projects. Teams pile broad system tests on top and starve the fast unit base. The crystallized suite fixes that by construction. Because root-cause pushes each confirmed defect to its lowest level, most checks land at the cheap, stable base. Meanwhile, flakiness is the cost you pay for every check you leave too high.

Same-code flakiness rises with test size#

These are not opinions. Google published the same-code flakiness rates by test size, meaning the rate at which identical code produces a different pass or fail result.

Show data table
Same-code flakiness rate by test size (Google, Where Do Our Flaky Tests Come From?, 2017)
Item Same-code flakiness rate
Small / unit 0.5% flaky
Medium / integration 1.6% flaky
Large / system 14% flaky

Same-code flakiness climbs from about 0.5% at the unit level to about 14% for large system tests, roughly 28x. The lever is level: the higher a check sits, the more often it fails for reasons unrelated to the behavior it protects. Figures are from Google's 2017 analysis.

Figure Same-code flakiness rate by test size (Google, Where Do Our Flaky Tests Come From?, 2017) Google, Where Do Our Flaky Tests Come From?, 2017

Read the bars as a tax on height. Because a large test exercises more moving parts, it fails more often for reasons that have nothing to do with the fault it guards. Therefore every check you can push down is a check that stops crying wolf.

1,000 checks: about 140 flaky vs about 6 flaky#

Now apply those rates to a thousand regression checks that exploratory sessions surfaced. The two approaches lock down the same defects. Still, they pay wildly different flakiness bills.

Locking down 1,000 exploratory findings: two approachesabout 23x fewer flaky checks

~140 flaky

Approach A: automate up front as broad system tests (1,000 x 14%)

About 23x fewer

~6 flaky

Approach B: crystallize by root-cause (900 unit x 0.5% + 100 integration x 1.6%)

Same defect coverage, about 140 flaky versus about 6. The reduction is possible only because manual exploration plus root-cause first pinpointed the exact failing behavior, so each check could be pushed to its lowest, cheapest, most stable level.

Show data table
Locking down 1,000 exploratory findings: two approaches (intermittently failing checks with no code change)
Optionintermittently failing checks with no code change
Approach A: automate up front as broad system tests (1,000 x 14%)~140 flaky
Approach B: crystallize by root-cause (900 unit x 0.5% + 100 integration x 1.6%)~6 flaky

This is the mechanism stated in numbers. The automation suite is a crystallization of what human testing discovered. Furthermore, pushing each discovery to its lowest reproducible level is what keeps the suite fast, stable, and high-signal.

The decision table: where the oracle keeps a human in the loop#

The calculator makes the rule feel real one candidate at a time. This table makes it operational across a backlog. Read each row left to right. An oracle-dependent row can never resolve to automate-now, whatever its other scores are.

Candidate checks scored on value, stability, cost, and oracle dependence
Candidate checkValueStabilityCostOracleVerdict
Coupon re-prices after a cart changeHighHighLowA rule decidesAutomate now
Order total arithmetic on checkoutHighHighLowA rule decidesAutomate now
Third-party payment redirect completesHighLowHighA rule decidesAutomate later
Empty-state copy reads as friendlyLowHighLowA human decidesKeep manual
New dashboard under weekly redesignMediumLowHighA rule decidesKeep manual for now
Does the flow feel fast and clear?HighLowHighA human decidesKeep manual

Look down the Oracle column. Wherever a human decides, the verdict stops short of automate-now, on purpose. Because no arithmetic can promote a check whose pass or fail only a person can judge. That single constraint is the difference between a suite you trust and a suite that lies to you.

The oracle problem: why human judgment is structurally irreplaceable#

The oracle problem has a plain name once you see it. Who decides that a result is a bug? An automated check compares an output to an expected value. Yet someone had to supply that expected value, and that someone is the oracle. Automation runs the comparison. It never authors the expectation.

This is why judgment is permanent, not merely useful today. Requirements are always partly unstated. Consequently, an expectation oracle, meaning a person who knows what the software should do, has to fill the gap. Usability is the clearest case. No assertion knows whether a flow feels clear, so a human must judge it. In short, the oracle is where manual testing stops being a phase and becomes a structural role.

When NOT to run this pipeline#

This pipeline is not a universal law, so here is where it does not earn its cost.

How manual testing improves test automation: common questions

Does manual testing really improve test automation?
Yes, and the link is causal, not vague. How manual testing improves test automation is by manufacturing the suite: exploratory sessions surface real defects, root-cause analysis pins each one to its lowest reproducible level, and only the confirmed, high-value findings become automated regression checks. Skip that step and you automate guesses about which paths matter, which is exactly how flaky low-value suites are born. Manual exploration is the source that feeds the automation, so the automation stays fast, stable, and worth trusting.
What should I automate first?
Automate what exploration already proved matters and root-cause pushed to a cheap level. In practice that means high-value behaviors with a deterministic rule for pass or fail, reproduced at the unit level rather than through a fragile browser journey. Score each candidate on value, stability, and cost, and put the checks that clear all three at the front of the queue. Anything that needs a human to judge the result waits, because a person still owns the expectation.
Why is my automation suite so flaky?
Usually because it was built as broad system-level tests that automate unconfirmed guesses instead of root-caused failures. Google measured same-code flakiness rising with test size, from about 0.5% at the unit level to about 14% for large system tests. A suite of a thousand large tests can carry roughly 140 that fail with no code change, which trains the team to ignore red builds. Push each check down to the lowest level that reproduces the fault and the flakiness collapses.
What is an exploratory testing charter?
A charter is a short mission for a time-boxed session. It names a target and a risk, then leaves the software tester free to investigate. A charter never scripts the clicks, which is the whole point: scripted steps can only confirm what you already expected, while a charter lets a person find the defect no up-front script would predict. Session-based test management, defined by James Bach and Michael Bolton, is the discipline that makes this repeatable and reportable.
Is exploratory testing a replacement for automation?
No. They are two stages of one pipeline, not competitors. Exploratory testing discovers and root-causes; automation crystallizes the confirmed findings into fast regression checks so the same defect never returns unseen. The automated coverage map then reveals the gaps that aim the next exploratory session. Remove either stage and the loop breaks: automation without exploration guesses, and exploration without automation forgets.

Want a second read on your test strategy, or help turning a flaky suite back into a fast one? This connects directly to how QA fits into an enterprise software development process and to where automated test gates sit in a Gitflow branching workflow. No pressure and no lock-in.

See Atyantik's approach to scaling and optimizing existing software

Aatman

Software Engineer, Atyantik Technologies

Aatman is a Software Engineer at Atyantik Technologies, a software product studio building web platforms, mobile apps, and integrated systems since 2015. Aatman writes about the software engineering practice behind shipping and maintaining real software.

More from AatmanScale and optimize existing softwareTalk to Atyantik

Keep reading