Case 01 · AI coding-agent workbench

Boreal

AI coding agents can change a codebase. Deciding what deserves to ship is the harder problem.

Boreal is a desktop workbench for directing AI coding agents, reviewing the changes they propose, and deciding what gets accepted.

Nothing is written to a project until the run has been checked and a person has approved it, and every write stays reversible until it is accepted.

Role
Product design · interface design · implementation
Year
2026
Status
Working Windows build · limited personal V1
Boreal's change review: a unified diff of what the run produced, with approve, apply, and roll back.
The change review: a diff of exactly what the run produced, with approve, apply and roll back.

The premise

Execution is not the same thing as trust.

Most agent tooling asks for trust. A prompt goes in, files change, and what comes back is a summary. Boreal treats a change as a transaction instead: the run, the check, the diff and the approval stay separate steps, and you can see which one you are in.

It runs on the Ariadne engine, which executes scoped tasks and records what each one was allowed to touch.

Boreal's run record: the request, the agent's report, and the independent check, each with its own timestamp.
The run record: what was asked, what the agent reported, and the check that followed.
Detail of the run record: started working, reported complete, checked the result, with the disclosure lines naming what could not be verified.
Each step is written by a different party.

Principles

Three rules decide every interaction in the workbench.

  1. The agent proposes. The person approves.

    Approval happens in a native dialog the page cannot forge, so what you confirm is what actually runs.

  2. A run is judged against its scope.

    Every task records the profile, the scope and the checks it used, so nothing has to be taken on faith afterwards.

  3. Failure stays a visible state.

    Interrupted runs, blocked approvals and checks that did not run stay on the record instead of disappearing into a success summary.

How a request becomes an approved change

The agent proposes. The engine checks. The person approves. The project is written last.

That order is built into the structure rather than agreed by convention. A task is a contract before it is a conversation: what it may write, what it may never touch, what it has to satisfy, and how many repair attempts it gets. A profile can ask for more evidence or more review. It cannot grant itself an approval or widen its own scope.

I kept approval out of the agent's reach. The confirmation is assembled from the engine's own records in a native window rather than from the page, and it says plainly that the identity is the caller's claim, not something Boreal checked. The agent never works inside your project either: a run gets a copy of the workspace as it was handed over, and that copy is what gets examined.

When a worker reports complete, that report decides one thing only, which is that there is now something to check. Everything else is recomputed. Boreal compares the working copy against the version the run started from, works out what actually changed, and runs the task's checks against the files on disk. Some of those results are unflattering on purpose: a workspace that moved while the run was going is refused rather than checked, because validating a different version would be theatre.

  • A run starts as a record

    The run is written down before any worker starts, so an interruption leaves something to recover from.

  • The workspace is a copy

    A run works in a staged copy of the project. The project itself is not the workspace.

  • The check is not the claim

    Checks run against the files on disk, not against the agent's description. A claimed success has no bearing on the result.

  • One thing at a time

    A second run is refused while one is going, so the project is never written by two hands at once.

A check that cannot inspect
Recorded as not run, never as passed
A workspace that moved
Refused; the run stops
Review
The reviewer's own opinion, labelled as one
Acceptance
A separate decision, never inferred from a pass

A claim is never validation. A completed run is still not accepted work.

What the review shows you

The review is built from the run's own before-and-after state, not from a file list the agent hands over. It lists every path that was created, changed or deleted, and approval belongs to one exact version of that content. Change the files afterwards and the approval goes stale by design.

Applying is journalled, so each file can be put back. A multi-file change is written one file at a time, so an interruption can land partway through: recovery works out how far it got, and a rollback restores the earlier bytes. If a file changed after you applied, the rollback stops, keeps both versions, and tells you.

A chat message can carry a proposal. It cannot carry a diff, a scope, an approval tied to specific content, and a way back.

Detail of the change review's changes panel: created and modified counts, and the three steps the review walked through.
Detail of the change review's diff and its approve and apply controls, with the note that nothing is written until it is approved.
The change set, then the diff. Apply stays disabled until the approval is on record.

Execution wasn't the hard part. Knowing what deserved approval was.

Preview before acceptance

The change can be run before it is kept.

A diff tells you what changed. It does not tell you whether the result is any good, which is how I ended up building a preview at all. Boreal runs the project for real, but only from a config the project declares and you explicitly trust, and only inside a frame that cannot reach back into the workbench.

Click anything in the preview and it reports what is rendering there and where the source says that line lives. Where the mapping cannot be confirmed, the panel says so rather than guessing. Inspecting is read-only; changing text or styles takes its own path, checked against the source before the file is written, with an undo beside it. Structural changes are proposed as tasks and reviewed like anything else.

Boreal's live preview: the project running in a sandboxed frame, with a selected element and its source mapping.
The live preview: inspect the running interface before accepting the change.
Detail of Boreal's inspect panel: run controls, the selected element, and the note that inspecting is read-only.
Clicking an element reports what is rendering there and where the source claims the line lives.
Editing the selected element in Boreal: the text change field and the computed style values beside the running preview.
A typed edit is checked against the source before the file is written.
The loop end to end: request, run, preview, inspect, review.

What happens when something stops

An interrupted run is a state, not an error screen.

The interesting failures happen between steps, so the store writes atomically and keeps a log. If the engine restarts with a run still marked running, that run becomes interrupted, with a record of how far it got, and the task goes back to a state it is allowed to run from. It does not quietly become a failure.

Half-applied changes are resolved the same way. Boreal compares every file against what it should have been, and a rollback restores the earlier version. A rollback that finds a file edited since the apply stops and keeps both copies. What you do not get back is the conversation: each run gets a fresh workspace and a fresh session, and continuity between attempts comes from the project's own records.

Interrupted run
Becomes interrupted, with a record of how far it got; the task returns to a runnable state
Half-applied change
Worked out by comparing every file against what it should have been
Rollback
Restores the earlier version; refuses to overwrite later edits and keeps both copies
After a restart
Recovery runs when the engine starts; no half-written record survives

Where it has got to

A packaged Windows build installs and runs. Here is how far it has actually got.

Working now

  • A run happens in a staged copy of the project. The real project is written last.
  • Every change is a transaction: proposed, checked, approved by a person, applied with a journal, and reversible.
  • A proposed change can be read as a diff before it is applied, with a live preview and a mapping back to the source it came from.
  • An interrupted run recovers instead of becoming an error screen.
  • A required check that cannot inspect its own input is reported as not run, never as passed.

Still open

  • The preview and inspector are proven on projects Boreal scaffolds, or that carry the same instrumentation. Arbitrary real projects are not supported yet.
  • One live model-backed run ended blocked, when the worker never returned a complete implementation claim. A completed live edit is not yet verified.
  • This is a development-mode application, not a public release, and it is not code-signed.

What I want to test next

What do people actually look at before they approve an AI change?

Boreal currently assumes that the diff, the check, the run record and rollback help people review agent work more carefully. The next useful step is to test that assumption rather than treat it as proven.

One comparison would put a summary-only review against Boreal's evidence-rich review, and measure what people catch, what they ignore, how long the review takes, and how confident they are in the decision.

What this turned into

I started Boreal to make AI coding agents better at changing interfaces, and that turned out to be the easier half. Producing a change is largely solved. Reading one is solvable. The part in between is not.

Someone has to look at a diff they did not write, decide whether it deserves to become real, and still be able to reverse that decision afterwards. So the workbench is arranged around that: scope the run, watch it, read the change, approve it, and keep it reversible until you have. Trust here is a property of a workflow you can inspect, not a claim the system makes about itself.

A runtime reports what happened. It never decides what is true. Boreal is arranged around that one sentence. The rest is deciding how a person sees the work before anything is written.