window.addEventListener('load',function(){['ktd-logo-sub','ktd-flogo-sub'].forEach(function(c){var el=document.querySelector('.'+c);if(el&&el.textContent.indexOf('Senior')>=0)el.textContent='Lead UX Designer';});});
Tidal Cyber · AI-Assisted UX · Case Study

NARC — Designing trust into AI-assisted detection.

NARC uses an LLM to extract intelligence from threat reports and surface findings analysts can act on. Making the output useful was the easy half. Making it trustworthy — to skeptical analysts making real security decisions under pressure — was the design problem. Across three versions, every state was a trust decision.

Company
Tidal Cyber
My Role
End-to-end UX lead · Sole designer
Timeline
April 2025 – Present
Status
Launched Nov 2025 · Paid enterprise add-on
NARC results surface — source attribution inline, per-object selection, explicit action labels
NARC · Results surface
Source attribution visible inline — analysts can evaluate confidence before acting. Staged enterprise rollout kept adoption safe.
Trust
by design
Source attribution, explicit action labeling, and per-object user selection — every state a decision point
0
Mock previews or fabricated results — users without access saw a locked state, never a simulation of capability they didn't have
Atomic
saves
All updates applied or none — partial application would have left a knowledge base in a state no one could reason about

NARC existed before I did anything.

It worked — an API that extracted intelligence from threat reports and mapped them to a standard threat taxonomy. But it was API-only. Customers who wanted their threat reports reflected in their coverage data had to build and maintain integration code themselves. The team's own assessment: the adoption barrier was too large.

The underlying job was tedious and manual. Analysts read threat reports and hand-mapped them to ATT&CK techniques, which is slow, inconsistent, and exactly the kind of work a model should be good at.

So the product problem wasn't extraction quality. It was delivery — and delivery meant letting a model write into the system of record that customers make security decisions from.

An API that returns JSON is a suggestion. A feature that updates a knowledge base is an action.

That's a different problem. And it's why this project wasn't really about AI — it was about what it takes to let a probabilistic system touch data that people depend on.

NARC Submission dialog — URL or paste text input, with explicit data boundary notice
NARC · Submission dialog
URL or paste-text input — the explicit notice that processing happens outside the customer's environment is part of the trust contract, not a legal footnote.

Before designing a screen,
the boundaries had to be settled.

Most of these were product and engineering decisions I designed within rather than decisions I made — but they shaped every subsequent interface choice. Each one removed a capability. Together they defined the actual design problem: within these walls, how do you make a model's output legible enough that an analyst can decide what to accept?

Data boundary
NARC never received customer data
Only the API key and the specific report the user chose to submit. Matching against a customer's existing objects happened inside the platform, not in the model service.
Retention
Submitted reports were not stored
A threat report can contain live incident detail. The team chose not to retain it without a demonstrated need — no submission history, no replay, no analytics on what customers submitted.
Write scope
Existing descriptions were never rewritten
NARC could append to list-like attributes — countries, sectors — when the value was new. Narrative descriptions written by a customer's analysts were left alone.
Save behavior
Saves were atomic
All updates applied or none did. Partial application would have left a knowledge base in a state nobody could reason about. No partial commits, no silent partial state.

The arguments, the pivots,
and what got removed.

01
The argument I lost, then won

Should objects created by NARC be identifiable as NARC-derived?

Early in the integration design, I asked whether NARC-derived objects should carry provenance markers. The answer was no — implementation complexity, plus a concern that some customers might view AI provenance negatively.

I understood the argument. I didn't think it survived contact with the actual workflow. If an analyst can't tell which parts of their knowledge base came from a model, they can't audit it, and they can't decide how much to trust it.

By GA, the decision had reversed. The release introduced a "last modified by NARC" timestamp and a dedicated table of NARC-processed objects. What changed wasn't the trust argument — it was that the business needed the same thing to show customers what NARC had done for them, in order to justify renewal.

I'd have preferred to win it on the user-trust argument. But the outcome is the point — and knowing why it eventually landed is more useful than pretending I was simply right the first time.

02
Source is not the same as action

The results table was asking the user two different questions at once.

Pre-GA testing surfaced the sharpest interface problem in the project. One column was trying to communicate: where did this object come from, and what is NARC about to do to it. Those are separate questions. Collapsing them meant that when several objects shared a name, users couldn't tell whether NARC would create, update, or leave something alone.

Working with the product lead and an engineer, we split them: Matched Object Source became its own column, distinct from Action. Related fixes followed — the literal placeholder "<object to be created>" became a plain "New" tag; the action during processing changed from "Cancel" to "Abandon," because cancel implied the system would undo something it couldn't.

NARC processing state — Analyzing your report with Abandon Report Analysis link
NARC · Processing state
"Abandon Report Analysis" — not "Cancel." The system can't undo what it's doing mid-process; cancel would imply it could.
03
The feature we removed rather than shipped

Search inside the results table didn't work reliably. The obvious move was to fix it.

The deeper problem was worse than a bug: filtering could silently uncheck results the user had already selected and could no longer see. A user could search, narrow, save — and apply a different set of changes than the one they thought they'd approved.

The team removed search entirely and moved it to the backlog.

A results table without search is a worse feature. A results table that silently changes what you're about to save is a worse product. That distinction is most of what this project taught me.

04
Naming as scope control

An early proposal called this "NARC AI Report Analyzer." I pushed for "NARC AI."

The long name was clearer in the short term but it locked the feature to a single input type — and if the product ever accepted anything other than a report, the navigation label would be wrong.

Nine months later, PDF upload shipped with a page-based credit model. A year later, the feature was generating exports and scoped campaigns. A navigation label is a cheap decision that becomes expensive to reverse. This one cost a Slack thread.

Four things the production
record is explicit about.

The most useful design documentation is honest about what didn't get finished and what broke. Here's the open ledger.

Model output varies between runs
Processing the same report twice can produce slightly different object names. Customers have asked for the ability to rename and edit generated objects before saving. Tracked, not shipped.
Name matching is incomplete
When a customer has created their own object with a name close to one NARC returns, the system doesn't always recognize them as the same thing. Documented as a future enhancement, deliberately out of GA scope.
Sessions don't persist
Scoped campaigns can only be created while the current processed session is open. Start a new submission and the opportunity is gone — the report has to be processed again. A known limitation with a roadmap fix.
A production incident
After launch, technique relationships from processed reports disappeared while the parent objects remained, affecting six enterprise customers and requiring manual remediation. The clearest reliability failure in the record — and it happened to exactly the surface this project was meant to make trustworthy.

Four things this project
made concrete.

01
A model that writes to a system of record is a different product than one that returns answers.
Every design decision here descends from that. Human review, explicit action labeling, atomic save, no silent description rewrites — those aren't AI features, they're what it takes to let a probabilistic system touch data people depend on.
02
Provenance is not a nice-to-have.
I argued for it, lost on complexity and customer-perception grounds, and watched the business arrive at the same requirement from the revenue side eighteen months later. The lesson isn't that I was right. It's that AI provenance has more than one constituency, and I'd argued it from only one of them.
03
Removing a broken feature can be the safer design.
Search that silently changes what you're saving is worse than no search. In a workflow where the output modifies a customer's knowledge base, "incomplete" beats "quietly wrong."
04
Names are architecture.
"NARC AI Report Analyzer" would have been obsolete within a year. Choosing a name that doesn't constrain future input types cost nothing at the time. A year later the feature was generating exports and campaigns. Navigation labels are cheap decisions that become expensive to reverse.