byfma← Work
AI agentsHuman-in-the-loopDesign systemsB2B SaaS

Countersign

Reads run alone. Writes wait for you. An AI agent operating a real admin panel — where the tool surface, not the prompt, decides what the model can get wrong.

role

Product Designer · AI Interfaces

type

Portfolio product · agent governance

year

2026

tools

Next.js · Groq · code-first

3

Governance tiers

8

Agent states

14

Design reviews

1

Human checkpoint

The Countersign scenario: a product catalog table beside the copilot panel, with four guided steps stacked in the panel, each labelled with its governance tier
Four guided steps — the first two run alone, the third undoes, the fourth waits for you.

This runs against a real model. Try it.

Try it live →
00Overview

A research catalog that turned into a product

Countersign started as a catalog — 63 AI interface patterns, mapped to sell as a Figma kit. Testing the patterns against a real model turned it into something else: a working admin panel where an agent proposes actions and a human approves the irreversible ones.

Reads run alone. Reversible writes run, then wait. Destructive writes wait first. Friction before or friction after, never both.

01The finding

The bug that became the thesis

Testing the agent, I ran a harmless read: "list discontinued products". There was no read tool for "discontinued" — so the model reached for the nearest tool by name. And the nearest tool by name was a destructive write.

The read asked for

list discontinued products

Nearest tool by name

discontinue_products

A query that meant to list three products became a proposal to discontinue all 27 active ones. The gate caught it — but a read should never surface a destructive proposal in the first place. I traced why, and closed it.

The fix wasn't a warning in the prompt. It was adding the read tool that was missing — so the verb resolves to a read, not a write. Same model, different surface:

The same discontinued-products query, resolved: the copilot returns a card listing three discontinued products instead of proposing a destructive write
Today the same query resolves cleanly to the three discontinued products. The surface changed — the model didn't.

That's when the thesis landed: the tool surface — not the prompt — bounds what the model can get wrong. You don't fix this by telling the model to behave. You change the surface it reaches into.

The corollary

Every fix in Countersign is additive to the surface, never a correction to the prompt. A missing read verb becomes a read tool. A destructive verb gets a gate. The model doesn't get smarter — its reach gets shaped.

02The system

Friction scales with how hard it is to undo

Three tiers — not three buckets picked by intuition, but a continuous variable discretized: how far the change reaches, and whether the undo window closes on its own.

safe · a read

Query and filter execute on their own — the table reacts live, nothing waits.

reversible · radius 1

A radius-1 change runs immediately, then waits: undo lives on the action until the next write.

gate · destructive

The engine stops at the gate. Nothing irreversible runs until you approve — all, some, or none.

The reversible tier — the write runs, the old price strikes through, and Undo stays until the next write closes the window.
The approval gate: a card listing the resolved rows the destructive write would touch, each with its own checkbox, above Approve and Reject controls
The gate — resolved rows with per-item checkboxes. Approve all, a subset, or reject.

The invariant underneath: the server resolves, the client reflects. Counts, previews, resolved targets — all computed server-side. The human approves exactly what the server will execute, never a guess from the browser.

03Evidence

Real failures, surface fixes

Every one came from watching the agent fail against a real model — then changing the surface, never the prompt.

The catalog table after a read the agent ran on its own, with a Margin column revealed beside the price and stock columns
A read the agent ran on its own — and a margin column computed server-side, never handed to the model.

The failure

Handed 13 rows of data, the model enumerated them in prose and mislabeled the criterion — naming products it wasn't asked about.

The fix

Split the channel. The model gets the count and the criterion, never the rows. With nothing to enumerate, it can only write the preamble. The rows render server-side, beside it.

The failure

A filter left the table at "3 of 30" with no visible way back — and the model denied the view state it had produced.

The fix

The agent uses the user's own filters, not a private channel. The tool surface is a subset of the user's — so the human can always see and undo what the agent did.

The failure

Approve-all-or-nothing was a lie. The resolver was right, but the human held context the system didn't — one row shouldn't ship.

The fix

Partial approval. Untick by human judgment; the server re-intersects the exclusions against its own preview before running. A first-class outcome, not an error correction.

See the agent hit the gate yourself.

Open the scenario →
04What I didn't build

Where the principle stops

The research marked "trust builders" as the core wedge — confidence scores, reasoning chains, self-reported caveats. I dropped all three, because they share one shape: they ask the model to report on itself.

Countersign solves trust the other way: the server renders the true value beside the prose, and the model's self-report becomes unnecessary. When the model confused an entire product, it didn't matter — the real data was right there.

Where it stops

This works for a bounded admin panel. In open-ended research or writing, self-report becomes necessary again — and I didn't solve that. Naming where a principle ends is what makes it sound reasoned instead of dogmatic.

05What's true

An honest account

Real: the agent runs against a real model; the failures are reproducible with tool names and counts. Code-first: built in code, no Figma mirror — the loop was watch it run, spec the fix, review. Fictional: Northbase and its catalog are entirely invented. My role: specs, decisions and review are mine; execution delegated to Claude Code, and the review log is the paper trail.

06Live

See it running

The demo runs on a real model over simulated data — sandbox, no login. Four guided steps, then free input.

Northbase is fictional. The governance isn't.

Open the demo →
Live demo →