120Water · Predictive Modeling

Nobody digs up a yard on a number they don’t trust.

I designed how a water utility earns trust in AI predictions about lead pipes.

The Predictive Modeling prototype on a silver laptop: the Service Lines screen with service line materials, lead prediction scores and a histogram, and a data quality panel
PrototypePortfolio copy of the final test build, demo data, not a 120Water releaseTry it live

About a million lead pipes are only predicted.

Material unknown

4Mlead service lines
1Mof them only predicted
2027inventory deadline

Lower-income households more often live in older homes with lead pipes.

EPA analysis, 2019 (opens in a new tab)

Most utilities are small, with $625B in needs ahead.

CRS, 2024 (opens in a new tab) · EPA, 2023 (opens in a new tab)

Sources and caveats

Records go back to the 1950s, and some are on paper. A service line is the pipe from the water main to a home. Many are of unknown material, and some are lead. A dig costs hundreds to thousands of dollars. That is a general range, not an EPA number, and it varies by utility.

Digging is not the only way to find out. Utilities also review records and, where their state allows it, use statistics or predictions.

EPA estimates 4 million lead service lines in the US: 3 million reported, and about 1 million predicted among lines reported as unknown. 81% of community water systems serve 3,300 people or fewer.

The 2027 and 2037 dates come from the Lead and Copper Rule Improvements: a full inventory by November 1, 2027, and most lead lines replaced within about ten years after. The rule is being challenged in court, so the dates could move.

Sources: EPA, 2025 update (opens in a new tab) · EPA, lead and copper rule (opens in a new tab) · Montana DEQ, rule timeline (opens in a new tab) · EPA, lead in drinking water (opens in a new tab)

I was the only designer.

Me
  • Design
  • Research
  • Interactions
  • Iteration
  • UX handoff
Role
UX Consultant, via NorthQuad
Timeline
3 months, inside a May to September 2026 engagement
Status
Handed off, not shipped
Original engagement work
Made for 120Water.
Portfolio reconstruction
Rebuilt afterward, with demo data.
Later proposed improvement
Fixed or proposed after handoff.
What I did

I owned the design, the research, the interactions, the iteration and the UX handoff. Engineering and data judged what was feasible.

Would you trust this table?

The original table, with demo data. Portfolio reconstruction
A closer look at two columns of the original table: Lead risk tags (Inconclusive, Likely lead, N/A) beside the system-owned material on file (Unknown or Non-Lead), for the first eight lines.
A closer look: the tag, and the material on file.

Its data isn’t verified or cleaned up. Would you spend taxpayer money on it?

The job was to earn that trust.

Why a tag isn’t enough.

A tag says what the model thinks, not how sure anyone is.

What 120Water’s model said

  • Likely lead
  • Inconclusive
  • N/A

What it left out

  • How old is the record?
  • Who recorded it?
  • How sure is anyone?

First, I learned how utilities work.

Water-quality specialists, consulting for 120Water.

  • Old, messy records

  • Show the evidence

  • Tight budgets

  • Strict rules

The table left three questions open.

Service Line Materials, with demo data: a donut of all 34,199 service lines by material. Lead 1,344, galvanized 362, non-lead 22,198, unknown 10,295. 22,847 of the lines are in service.
What do I have?
Lead and GRR Prediction Scores in the Premium plan, with demo data: 2,847 digs avoided and 7,448 lines that require field verification, both out of 10,295 unknown lines, above a ten-bar histogram of scores.
What can the model call?
Data Quality, with demo data: four checks that each need attention. Street Name Validation has 26 flagged, Geocode Validation 10, Update Year Built 54, and Schools and Childcare 19.
What do I fix?

I put the model in front of users.

Hidden, people second-guess the data. Shown, it builds trust.

HiddenPeople second-guess it

In front of usersPeople can check it

One failed check locks the whole planner.

  1. Click Review Fix one of the four checks: street names.
  2. Click Approve All These highway addresses can’t match a standard street name, so a person approves them.
  3. Click Apply Changes Nothing reaches the inventory until you apply.
  4. The planner is still locked 9 street names are still flagged, so all four checks still need attention. All or nothing: the gate I’d now open step by step.

LiveFixed after handoffThis check no longer says complete while records are flagged.

Why the planner waits

A result is only as clean as the data under it, so Data Quality comes first. The planner stays locked until the checks pass, then it ranks the unknown lines that are worth a dig.

We did not measure an accuracy gain. This is the design argument, and it was handed off, not shipped.

40+ prototype versions, built with Claude.

  1. Figma and pen and paper

  2. A working prototype

  3. Final screens and design system

Throughoutengineeringsalescustomer experience

My earliest Figma layouts. Portfolio reconstruction

Data Quality stayed visible in every plan.

I pushed for

Show the data problems.

Engineering’s concern

It could cost a lot to run.

Basic names three groups. Premium shows every score.

Premium plan: the planner shows lead prediction scores, digs avoided and a ten-band histogram, and the table shows Lead and Inconclusive scores in percent Basic plan: the planner shows three buckets of unknown lines, higher probability non-lead, inconclusive and higher probability lead, and the table shows Lead risk in words
Basic plan: the planner shows three groups of unknown lines, in words. Higher probability non-lead 2,154, inconclusive 7,448, higher probability lead 693.Basic plan table, first four lines: the Lead risk column reads Inconclusive, Higher Prob. Lead, N/A and Higher Prob. Lead.
Premium plan: the planner shows 2,847 digs avoided and 7,448 lines that require field verification, both out of 10,295 unknown lines, above a ten-bar histogram of scores.Premium plan table, first four lines: the Lead score column reads Inconclusive 69%, Lead 97%, N/A and Lead 99%.
  1. Drag the handle Wipe between the Basic plan and the Premium plan.

ScreensPortfolio copy, demo data

Reading the scores

  1. Below 40Likely non-lead
  2. 40 to 69Inconclusive: the model can’t call it
  3. 70 and upLikely lead

A score is not a verified probability.

The full story

Company experts, product leadership, engineering, data specialists and customer-facing teams reviewed the design. The tradeoff was customer value and transparency against engineering complexity and running cost. Data Quality stayed visible in every plan.

Engineering described one way to deliver it: run the checks on everything once, then only on records that change.

Our design lead showed me that dig costs vary by utility, so any dollar figure is wrong for someone. The early scores card carried an estimated saving with a disclaimer. People anchor on a dollar figure, and he was right. That is why the card counts digs avoided.

Each plan answers a different question. Basic says where to send crews first, in three plain words you can click to filter. Premium is for people who defend a classification to a regulator, so it shows the full distribution and digs avoided. I designed the charts.

Digs avoided counts the unknown lines scored outside the middle range: 2,847 of 10,295 in this demo data. It is not a saving.

Six recorded sessions on a working prototype.

I wrote the script and ran several sessions myself.

  • Could they understand the predictions?
  • Could they fix their records?
  • Did they know what to do next?
  1. Start with the service lines The Unknown slice is what the model scores.
  2. Data Quality checks the records All four checks need attention, each with a status and a count of flagged lines.
  3. Click Review Data Quality The planner is locked until the records pass their checks.
  4. Click Street Name Validation Each check opens its own guided fix.
  5. Click Approve All Highway route addresses cannot be matched to a standard street name, so a person approves them together.
  6. Click Apply Changes Nothing is saved to the inventory until you apply.
  7. Tap the menu On a small screen the side menu opens from here.
  8. Click the gear These settings are only for the prototype. They switch the plan and the planner stage.
  9. Click Premium The locked planner card is replaced by the Premium view, and the list shows a Lead Score.

Live prototypePortfolio copy of the final test build, demo data. Use it freely.Open full prototype (opens in a new tab)

What changed after handoff

Fixed in this copy

  • Fixed after handoffTotals: the donut, the bars and both counts add up to the same 10,295 unknown lines, and the table says it lists a 200-line sample of 34,199.
  • Fixed after handoffScore ranges: below 40, 40 to 69 and 70 and up, the same in the chart, the table, the filters and the line drawer. Basic uses the same three words in the chart and the table.
  • Fixed after handoffStreet Name Validation, Update Year Built and Schools and Childcare say what is still flagged instead of complete.
  • Fixed after handoffAccept All fills blank years only, and a bulk button never overwrites a recorded year or class.
  • Fixed after handoffAccepting the rest of the 78-line cluster needs 25 lines checked first.
  • Fixed after handoffThe Basic line drawer shows words, never a percentage. Premium calls it a score.
How the sessions ran

Moderated, task-based usability sessions on a working prototype, with some questions about how people work today. Seven people took part in six sessions, so the count is sessions, not people. Roles only: two utility customers and four water-industry experts.

Six sessions can show patterns and failures in the design: where people misread staged and saved, hesitated on bulk actions or got lost in a long list. They can’t show adoption or statistical significance, and they didn’t prove the model is right. Six was how far we could take it, because utility and industry customers are hard to get.

Six sessions showed three problems.

Original engagement work

  1. Saw

    When I see updated here, I assumed it was committed.Utility GIS and operations lead

    Did

    Nothing saves until Apply Changes.

    Still open

    Staged rows still say Updated.

  2. Saw

    A program lead read the lock as an error.

    Did

    A chart icon, the reason and one button.

    Still open

    One failed check still blocks every prediction.

  3. Saw

    I feel lied to.Internal product manager

    Did

    A side panel with the map, in batches of 25.

    Still open

    A suggested point is still a guess.

More patterns

What else six sessions taught, and what each changed

  1. Words carry risk

    Basic uses words instead of scores.

  2. “Now what?”

    Plan Next Batch. Setup starts from capacity.

  3. Bulk trust is earned

    Accept All stays, for low-risk changes.

  4. People think on a map

    The map stays beside the list.

What else people said

I’ve done the first 10, they look good, you know, accept the rest. I trust you.Internal product manager

Six-digit coordinates mean nothing to most people.Utility GIS and operations lead

The padlock over a blur almost feels like an upsell.Design lead

I think that makes it palatable.Utility GIS and operations lead

What the sessions changed.

My call

Every suggestion needs a yes.

CostSlower cleanup for big backlogs.

  1. Click Accept All Every safe suggestion goes through in one click.
  2. Click Accept or Reject A line recorded as lead never changes in bulk. A person decides.
  3. Click Next: Review & Apply Changes Every accepted change is listed before anything is written.
  4. Click Apply Changes Only now do the changes reach the inventory.

LiveFixed after handoffAccept All now fills blank years only.

Why Accept All stays

Nobody used Accept All, even where it was allowed, so its use became the trust metric I’d track. A utility GIS and operations lead wanted to be granular first. He said he’d use Accept All once corrections were right over 95% of the time. That was his own threshold, not a measured accuracy.

I kept it because trust grows, some utilities will have hundreds of flagged lines, and we’d already limited it to low-risk changes. The guardrail since June 1: the three-step Year Built review, and Accept All only for filling blank years.

Fixed after handoffIn the first build, three bulk buttons, Newer Year, Older Year and Schools, still overwrote recorded values, which broke that rule. Now only blank years and blank classes are filled in bulk.

My call

A 78-line cluster gets batches, not a stepper.

CostSlower than automation, on purpose.

  1. See the stack on the map All 78 lines share one point. The green dots are suggested locations.
  2. Click Accept It takes the suggested point for that line. Each one is a guess, so check it first.
  3. Watch the resolved count It starts at 0 of 78. Accepting the rest unlocks once 25 are checked.
  4. Click the next page arrow The list comes a page at a time.

LiveFixed after handoffAccepting the rest now needs 25 lines checked first.

Why batches

I rejected a stepper, and accepting every suggested point. In the session I said: someone has to step through all 78 of them. Geocoding had put all 78 on one default coordinate, so nobody knew where any of them were.

Legitimate clusters, like apartment buildings, are filtered out first. Before the side panel, a full-screen modal covered the map. Our design lead questioned whether bulk approval should exist at all.

Shared

The operator chooses the strategy.

Find lead fast, or sample at random.

The Prioritization Strategy chooser from the prototype: Targeted options (higher likelihood of lead, geographic proximity, target likely non-lead) and Unbiased options (random sampling, statistical analysis), with Cancel and Apply.
  1. Click Generate Plan The plan starts at 100 lines a month. Change that first if your team can verify more.
  2. Click Remove The plan is a draft. Drop any line you do not want.
  3. Click Next: Program Details Next you name the program and set its dates.
  4. Type a program name Then pick a start and an end date. Assigning the crew comes after.

Live

Why the operator picks

The model learns from every verified line. I designed the plan that turns that into field work. The operator picks a strategy.

Utilities don’t share one goal. Some want lead found fast. Some have to show a regulator their inventory holds up, and that takes a random sample as well as the likely-lead lines. Engineering pushed back: the ranking lived in the back end, and every re-rank costs compute.

What I’d change: a program is either targeted or random. A utility usually needs both in the same month, so I’d let them split capacity inside one program.

I designed how a user chooses a strategy. Michigan’s guidance has utilities dig a statistically sound sample of unknown lines (EDF, 2021 (opens in a new tab)).

From a prediction to Monday.

Operators asked: the AI made predictions, so now what?

  1. Inventory
  2. Data quality
  3. Verified records
  4. Predictions
  5. A verification plan
  6. Field assignments
  7. Progress

Keep verifying. New records can inform later predictions.

The last mile

Whether predictions improve was not measured. What I designed is the operator-facing planning: setting a capacity, choosing a strategy, reading the plan, and seeing progress.

Basic answers where to send crews first, in plain words. Premium shows the full distribution for people defending a classification. The chart for each tier is mine.

The last mile is still open: crews won’t log in, so the plan has to leave the product.

What I’d do differently.

  1. Test the whole workflow with technicians.

    I never tested what crews do with the plan.

  2. Decide early what each record must show.

    Not every old record had a full history.

  3. Unlock the planner in steps.

    One failed check blocked every prediction.

More on each

Went wrong. I designed how a verification plan is made, but I didn’t validate what happens once it reaches the crew: assignments, exports, field reporting, and results coming back. Next time I’d involve field technicians earlier and test the whole workflow.

The prototype covers building the plan, assigning lines to a crew and tracking progress. This gap was found at handoff, not in production: nothing shipped, so nothing failed in the field. A utility program lead said field crews probably won’t be in PWS much, meaning 120Water’s platform.

Went wrong. I separated recorded materials from AI predictions and designed source details, but not every legacy record had a complete history. Next time I’d define what each record must show earlier: source, method, date and history.

In the prototype, a record shows a basis for each part, such as Visual inspection (2019), or Not yet verified, as free text rather than a structured field. A tester whose records go back to the 1950s asked where a classification came from, and the table had no answer.

Went wrong. The planner stays locked until every check passes: one failed check blocks every prediction. A utility program lead read it as an error. We fixed how it reads, not that it is all or nothing.

Lead red means lead, in every theme.

Figma
Open in Figma (opens in a new tab)
The design system page in Figma: foundations (colors, type, spacing, icons), buttons, form controls, navigation, cards and widgets, tables, badges and flyouts, each on its own board.
A live Figma file.Open it in Figma

Live in FigmaClick the file to pan and zoom.

Portfolio reconstruction My own Figma file: designs I transferred and rebuilt, with sample data. The affinity map is recreated. The production files are 120Water’s.

What the system covers

Foundations, icons, buttons and links, form controls, badges and status, navigation, cards and widgets, tables, flyouts, modals and feedback, and record rows and details. High-fidelity screens with a clear information hierarchy, and consistent patterns for status, badges, tables and flyouts.

Lead red means lead, in every theme. Yellow already meant galvanized, so the middle bar went neutral. Basic and Premium differ in presentation, not in pattern. My drawer and flyout patterns were chosen in the final review.

The production design system is 120Water’s, and I don’t claim it. This page is in my own file.

Handed off, not shipped.

  • Interactive prototype
  • Figma designs
  • Interaction specification
  • Research findings
  • Open questions

No adoption numbers. No savings claimed.

“intuitive to the nth degree in comparison to what we’ve had historically.”

Internal modeling expert

“something we desperately, desperately could use.”

Client success manager
What I’d measure next

These are reactions in sessions, not adoption: six sessions on demo data, no field use. The interaction specification says how it behaves, and the open questions are all written down, now with 120Water’s leadership.

What I’d measure next, none of it achieved: how accurately operators tell recorded from predicted information; the correctness and speed of reviewing suggested changes; time to create a useful verification plan; field verification completion; correction, reversal and error rates; and appropriate reliance on the model’s recommendations, which means neither blind trust nor blanket rejection.

Our BRD says the manual service has typically classified about 10 to 40 percent of unknowns without a dig. That is a range for the manual service, not a result for this product.

Who made which call.

  1. My call

    Showing the model,Three trust questions,Accept All,78-line batches,One chart per plan

  2. Changed my mind

    Digs, not dollars,Schools and Childcare as its own check

  3. Shared

    Planner lock,Data Quality in every plan

  4. Lost

    Setup off the dashboard,A 2 by 2 widget grid

More calls, with dates
  • My callShow the utility side and the customer side of each line separately, because one combined label can hide where the lead is.
  • My callRenamed the model’s gray area to Requires verification (late May).
  • My callThe teaser pattern for customers without Premium, because some customers are sensitive to upsell.
  • My callThe drawer and flyout patterns, kept after a final review against another prototype (Sept 23).
  • My callConsistency with Sample Manager’s design language, and a column chooser to fit the score into a busy table (May 18).
  • My callDropped the single accuracy number. An engineering leader, on a bare 97 percent: A regular user is like, okay, what does that tell me? An operator decides about one line at a time.
  • Changed my mindSchools and Childcare as its own check. I questioned it first. Once I understood the rule, I defended it. The rule: utilities list the schools and child care facilities they serve and sample at least 20 percent of the elementary schools and child care facilities a year for five years (40 CFR 141.92 (opens in a new tab)).
  • LostA 2 by 2 widget grid for room and accessibility. The design went with one row of three (late May).
  • SharedLetting the operator choose the prioritization strategy, from a team brainstorm. Engineering pushed back on cost.