Stage 04 · Wireframes

All screens

The grey clickable prototype. Every screen at full viewport with every state it really has, linked along the flows, so the product can be walked with clicks rather than described. Nothing here is invented: structure comes from the forty six nodes of stage 03b, and a gap is fixed upward in the IA before it is drawn.

counting. The reference screen is 3.1 Case Queue and the first flow assembled is the main job, both chosen at step 1 and argued in wireframes/docs/screens.md.

01 · Read this first

What the product is, who Clerk is, and one case end to end

Every section below this one assumes it. If a screen in the prototype reads as unexplained, the explanation is here rather than on the screen, because at this stage the wording is still a draft.

Harrier is an adjudication console for the queue that is left after an AI agent has closed everything it could close. It is not an alert triage tool, not a hunting tool, and not the page where the agent is configured. It is where a human rules on work the agent has already done.

An MDR provider sells detection and response as a service to many client tenants at once, and its margin is set by how many tenants one analyst can carry PREMISE. The category answers that unanimously, and this part is verified on live pages: let the agent close most of the work. Simbian sells it as “your analysts review the 8% that need judgment, not the 92% that don’t”. Liability does not follow the work. The provider signed the contract, so when a closed case turns out to have been an incident, the provider answers for it PREMISE.

So what remains after auto resolution is a residual queue holding every hard decision, and it is where the analyst spends the whole shift. None of the thirteen products examined at stage 01 publishes a view of it. Every one of them sells the number of cases the human no longer sees. That gap is the product.

Clerk, and why the name is the contract

A clerk prepares the case file and drafts the opinion. The judge rules. Clerk never issues a verdict in the analyst’s name, and the interface is built so that the difference stays visible.

Before the analyst has seen anything, Clerk has already collected the signals across the tenant’s connected sources, correlated them into one case rather than seven alerts, run the first pass of the investigation, and filed a written verdict with its evidence. Sometimes it has also acted, when the action was inside that client’s earned latitude. That is why a case can arrive in three structurally different conditions: waiting for a decision, already contained and waiting for confirmation, or held at the ceiling because the action it wanted is above what this tenant has granted.

One case, walked end to end

Every number below is a fixture, chosen to make the layout decidable. It is never quotable as evidence about the market, and it is identical on every surface that shows it. The canon is in ia/docs/pages/reading-conventions.md.

The caseLarkfield Logistics, token replay from a new ASN. 9 signals correlated from 6 sources over 24h: Entra ID, Exchange audit, EDR, proxy, threat intel, tenant baseline
What Clerk concludedReal, and it wants to contain the identity. One sentence, before the evidence, because more explanation is not more trust
What happened04:08 sign in from the corporate range, token issued. 04:12 the same token presented from ASN 41xxx, no MFA prompt. 04:13 an inbox rule created, forwarding to an external address
What Clerk looked for and did not findNo password change, and no new device enrolment. Rendered with the same weight as what it found. This is the half no reference product has
What points the other wayThis user has travelled to this region twice in 90 days. The disagreeing signal stays visible rather than being resolved away
Normal at this clientTwo token replays at Larkfield in 90 days, both real. The same signal is a Tuesday at one client and an incident at another
What Clerk may do hereSix action classes, two permitted and four shown disabled with the ceiling written on them: above this tenant’s latitude, so it waited for you. A hidden control teaches nothing; a disabled one with its ceiling stated teaches the ceiling

That last block is the differentiator. Earned autonomy per tenant is not ours: Prophet sells earned autonomy and Simbian sells it per tenant and per action class, in those words. What nothing published does is make every client’s current latitude legible where the analyst is about to act rather than on a configuration page.

What the analyst is asked to do

Not to investigate. The screen asks one question as early as it can: does this verdict hold? Four answers, each one key, each key printed on its own control: a accept, m amend, r reject, e escalate. Rejecting is a first class action rather than a fallback path, and the reason goes straight to tuning.

One measured failure is recorded rather than hidden. The principle says override costs one key. Measured at the close of stage 03b it does not yet hold: reject costs four taps against accept’s two, and stage 04 drew the reject screen against that number rather than around it.

The route, seven steps

Click straight through. The activation node is the case file, and it is two clicks from landing, which was measured at step 7 rather than asserted.

  1. Sign inThe requested address survives the round trip through the identity provider, because a case opened from a pager at 03:00 must not land in the queue
  2. Shift briefWhat happened while she was away, and a pointer straight into a waiting case
  3. Case queueRows on the left, detail pane on the right. Every row is a decision, not a record
  4. Case fileThe same screen in its second state. This is the node the product exists for
  5. Reject or EscalateThe two paths that are not agreement. Accept and amend file from the case file itself
  6. Decision logAppend only. Every Clerk action and every human override lands here
  7. Log entryThe full evidence snapshot as it stood at decision time, addressable with ?as-of

The resting state of the detail pane is the fleet, every tenant with its current latitude and accuracy trend. That is why the fleet has no item in the global navigation, which carries three: Queue, Shift, Log. It costs zero taps. Press ? on any screen for the keyboard map.

What gets filed at the end

Not a closed alert. A verdict record composed from structured parts, never from free text: what was decided, on what grounds, against which evidence snapshot, by whom, when, and if rejected, the reason on both axes. Free text stays optional and nothing downstream ever depends on it, because stage 02 found that handover quality varies widely between individuals and that no organisation trains it. Structure is what removes the variation.

Underneath it is the one compliance requirement that shapes the design: an append only log carrying the evidence snapshot as it stood at decision time. The question arrives eight months later, and the file answers it, not the analyst’s memory.

Two things this prototype deliberately is not. Interface strings here are drafts: wording is owned by stage 05, and a label that reads flat is not yet a defect. And there is no colour, no type family and no icons, because the visual language is invented at stage 06 on copies under design/. What is being judged at this stage is structure, state coverage and the route.

02 · Reading the fixtures

Every name and number in the prototype, and where it comes from

The prototype is full of client names, case ids, counts and timestamps. None of them is a measurement. This section is the whole cast, so that a screen can be read without guessing which parts are load bearing.

A number in a drawing is a fixture, not a finding. It is sample content chosen to make a layout decidable, and it is never quotable as evidence about the market, about analysts, or about this product’s performance. What it must be is internally consistent: the same case, the same tenant and the same count read the same on every surface that shows them. Two arithmetic contradictions were caught this way at step 8 and are recorded in ia/docs/pages/reading-conventions.md. Where a real policy value would be needed, such as a retention window or a price, the surface names the value’s owner instead of inventing a number.

Seven tenants, these and no others

Each one is in the set because a state needs it. None is decoration

Larkfield LogisticsMid market logistics. The canonical case belongs here, so it carries the queue row, the case file, the reject path and the log entry
Norsk MarineShipping, assets offline for days. The tenant where a stale reading is normal, which is what makes the degraded connection states concrete rather than hypothetical
Meridian HealthHealthcare, tight change control. The tenant where latitude is deliberately narrow
Bramber RetailRetail, many endpoints. The high volume tenant, and it carries the fleet’s best record
Halcyon CareCare provider. Too few rulings to compare, which is a state and not a blank
Aubrey Dental GroupSmall, few assets. The quiet tenant, which is what makes an empty result ambiguous
Halden FreightFreight. The case carried across a shift boundary on the brief

Three people

The escalation recipient is a third person on purpose

R. IdrissiThe analyst. Everything is seen from here. Her full profile is in research/docs/personas.md, the one file allowed to describe her
D. OkonkwoA peer analyst. Appears when a case is already taken by somebody else, and across a shift handover
S. VargaSOC lead, who receives escalations. Added at step 8, because an escalation to a peer is not an escalation

Three cases, and one of them is canonical

Two others exist only because a state cannot use the first

C-4417Larkfield Logistics, token replay, High, 9 signals. The canonical case. Same severity, same count, same verdict on every surface that draws it
C-4482Aubrey Dental Group. Exists because the no baseline state needs a tenant that has no baseline, and Larkfield has one
C-3180Norsk Marine, June 2026. Exists because a dead snapshot needs an entry old enough to have one, and the canonical case is four hours old

The id encodes nothing, and that is a decision. An id carrying the tenant or the date leaks across tenant isolation the moment a link is pasted into a channel someone else can read. It is short because it gets read aloud on a phone at 03:00.

Severity, three levels

Glyph and word, always both, because colour is not the only carrier

HighThree bars filled
MediumTwo bars filled
LowOne bar filled

Three and not five, because every level has to change what she does next or it is noise in a column that costs width on forty rows. Severity is not the action class: that ladder orders by reversibility, and isolating a production server is severe and cheap to undo. Two axes, allowed to disagree on the same case.

Time, four grammars for four questions

A working surface and a permanent record do not ask the same thing

How long has this been true?Elapsed, bare unit, one unit, no ago: 27m, 4h, 3d. Queue rows, freshness, case age
When exactly did it happen?ISO 8601 in UTC: 2026-08-22T04:41:12Z. The log, the snapshot, anything that leaves the product
Which shift?Wall clock with the zone named: 19:00 to 07:00. The shift brief only
When will this be over?ISO 8601 in UTC again. Planned maintenance. Added at step 8: the first three all describe the past

UTC in the log is not a preference. One analyst covers tenants in the United States and the EU, so a local rendering in an append only record makes two entries incomparable at the moment someone is trying to compare them. Today in every drawing is 2026-08-22.

Effort, two numbers that were wearing one word

One is her cost, one is Clerk’s, and they are bound

9 signalsWhat checking will cost her. Correlated signals in the case, shown on the queue row
6 sources, 24hWhat Clerk spent. Sources queried and the window, shown on the provenance strip

The two are bound, and that is the useful part: the signal count in the row is the number of lines the evidence block renders in the pane. The row makes a promise about how much reading sits behind the verdict, and the pane is where the promise is kept or broken. Never seconds: time alone says the agent was busy, not what it read.

State chips, a closed set of six

In render order, which is the order in which they change what she does next

unrecordedA verdict exists and the write did not land
takenAnother analyst is deciding it now, with their name and since when
escalatedIt left her hands
decidedRuled, and still in place until the selection moves off it
actedClerk already did something under this tenant’s latitude
investigatingClerk is still working, no verdict yet

A row renders at most two, highest first. That is a claim about the taxonomy rather than a truncation rule, and it is checkable: investigating excludes everything below a verdict, and unrecorded presupposes one. Four pairs genuinely occur: decided with unrecorded, escalated with acted, decided with acted, and taken with acted. If a fifth pair is found, the taxonomy is what gets fixed, not the row, because a row that silently drops a state breaks the rule that a case which left her hands must not look identical to one that did not.

03 · Ways in, by flow

Five flows from ia/docs/flows.md. A solid card is built, a dashed one is still only a specification

04 · Coverage

What is built against what the map says exists. This answers “how much is left”, and the matrix below answers a different question

built specified, not drawn not a screen: it renders inside one

Forty six nodes, and every one of them is accounted for. Nineteen are screens with a file of their own. Ten are not screens at all and the map above names the host each one renders inside, because a node with no file has to be distinguishable from a node nobody built. The remaining seventeen are states, and each is a page of the screen that owns it. 19 plus 10 plus 17 is 46, which is the whole of the detail layer and the reason this is a tracker rather than a gallery.

05 · State matrix

The complete list of states in the product. Stage 05 step 4 reads it for tone and stage 07 step 2 reads it for the component inventory

The four system states are the floor, not the set: the real set comes from the state matrix of each node in ia/docs/pages/, and a state that is not in one is not drawn. Every gap carries its reason, because without one a state nobody needs cannot be told apart from a state somebody forgot.

06 · Conventions

The contract every screen and every subagent works to. Full text in wireframes/docs/conventions.md

The palette, inherited verbatim

Four values, lifted unchanged from the .wf block of the stage 03b mockups so that these screens read as a continuation rather than a second visual language. The type scale is deliberately not inherited: those were miniatures inside a document at 10.5px mono, these are live screens at 1440.

--ink#16181a
text, structural borders
--soft#9aa0a6
secondary, disabled, placeholder
--hair#d4d6d8
hairlines inside a component
--fill#f2f3f3
table head, resting pane, selection
--paper#ffffff
the surface a component sits on
--bg#fbfbfa
the page behind everything

Six, not the five that stood here until the step 9 critique. --bg was declared in _wf.css and published nowhere, so the contract a subagent works to was missing the one value that decides what a screen sits on. A token that exists and is not in the contract is a token the next stage re-derives.

The four rules that decide arguments

Always

  • A live screen, not a schematic. A real page filling the viewport that clicks and scrolls. The node anatomies of 03b are finished
  • One live responsive screen per state, and the narrow rendering checked by narrowing the browser
  • Every state is its own page, with a visible exit checked against the flow diagram
  • Every zone answers why it is here, and there is exactly one primary action per screen

Never

  • Colour, type family, icons, shadows, images. Stages 06 to 08, and they arrive on copies under design/
  • Two frames on one page, desktop beside mobile, or a caption annotating a zone
  • A skeleton standing in for the screen, or a spinner where a duration is the information
  • A token value inline. Not once, not on one screen. It is already a variable

The first of those Never rules was broken on 27 of 62 screens from day one, and no instrument could see it. _wf.css says no colour and never declared a rule for a, so 151 links rendered in the browser’s default blue. The grep instrument reads rules that exist; the source review reads source; the clean context reader reads meaning. A defect whose cause is an absent rule is invisible to all three. It took asking the live browser for a computed color and testing it for saturation. Fixed with one rule at the lowest specificity in the file, and re-measured at zero on all 62.

Inline CSS is transport, not a home, and this is where the stage breaks quietly. At step 8 parallel agents cannot all write to _wf.css, so each puts its screen’s rules inline behind the marker /* INLINE: <screen> :: for reconcile into _wf.css */. Reconcile brings them back the same step. Skipping it is not cosmetic: stage 07 derives the kit’s component classes from these screens, and structure living in twenty inline blocks makes the extraction honestly collect the disagreements. The defect becomes visible at the token audit of stage 08, three stages after it was made.

One declared substitution. The stage pack says mobile-first and reasons block priority from the phone. CLAUDE.md says the opposite in its own words, and forty nodes were specified under it: the stance is desktop first, priority is reasoned from the desk at 1440, and 360 is then proved for one scenario. The project rule wins. What survives from the pack unchanged is the part that matters: one live responsive screen, never a second file.

07 · Was → became

The step 9 critique, by class. Five instruments, one second pass. Full record in wireframes/docs/critique.md

Case file at 360 before the fix, with no decision controls in view
Was. A measured 360. Accept sits at y2013 in a 760 viewport, so the one thing this screen exists for is three screens below the fold. The footer was sticky and never stuck: the pane kept its own scrollport, so bottom:0 resolved against a box that does not scroll.
Case file at 360 after the fix, with the decision controls pinned to the bottom
Became. Accept at y680, pinned, and it stays there through the whole scroll. One screen had found this at step 8 and fixed it privately; every other pane in the product kept the defect.
Keyboard map at 1440 before the fix, showing the 360 only banner
Was. 1440, and the page announces there is no keyboard here directly above a full keyboard map. .banner{display:flow-root} was appended below .only-narrow{display:none} with the same specificity and won on order. 22 pages.
Keyboard map at 1440 after the fix, with the 360 only banner hidden
Became. .banner:not(.only-narrow). This one is mine: it is a regression from step 8's own fixes, and the 174 checks that closed step 8 missed it because they looked for overflow and this does not overflow.

Every class, and who found it

ClassWasBecameFound by
Regressions from step 8The .only-narrow cascade on 22 pages; five tokens declared and unused, one of them a second name for --s5Fixed. 37 tokens declared, 37 usedbrowser, grep
Broken at 360Five: the pane foot, the fused fleet reading, the outage action a viewport and a half down, records three screens tall with no exit, the notice stack eating 408 of 760 pixelsAll five fixed and re measured at a true 360browser
Colour, in a stage with none151 links in browser default blue on 27 of 62 screens, because _wf.css never declared a rule for aOne rule at the lowest specificity. Zero coloured elements on 63 pagesbrowser only. A defect whose cause is an absent rule is invisible to grep, to source review and to a reader
Canon behind the drawingThe log's State was a second vocabulary and 0.8 denied it; two fixtures drawn and never declared; axis A had seven values and showed six; node 8.4 was MVP with three notices marked yes and none drawnAll four fixed upward in ia/docs/pages/, then rendered. Four new pagesCodex and the reader, converging independently on the first
Declared twiceTen rules in both _wf.css and a generator, inline winning; section 2 declared .only-desk the survivor of three names and migrated neither of the other two; eleven inline declarations repeated across screens; two interface strings living in content:All moved. Four inline declarations remain, each used exactly oncegrep, after the instrument itself was repaired
Two primary actionsFive pages with two black buttons, twice with the same labelExactly one visible primary per page across all 63browser
The author in the analyst's voiceThe prototype argued for its own decisions in the same slot as product hints, in the second person. A clean context reader could not tell which sentences stage 05 is meant to rewriteTwo registers. .anote on 35 pages is the argument, .gnote on 27 is product copy, and stage 05 owns everything that is not .anotebrowser and the reader, independently. Settled by the author of the case, not by the instrument

The fifth instrument had a hole, and the second pass is what found it. The grep for a rule declared twice compared inline against inline and never inline against _wf.css. Ten rules were declared in both with the inline copy winning, and one of them is why a sticky rail stayed unstuck through two attempted fixes. An instrument that has never failed has not been tested, and this one had been reporting clean for two steps.

Three findings were struck at verification rather than fixed. Eleven fields reported as unlabelled all carry visible labels, which is a category error. A 3px spill on this page's own h1 is line box rounding, real in the arithmetic and invisible on screen. And one entry in the exemptions list had been written from memory: there is no print stylesheet in this stage and there never was. A finding that does not survive verification stays in the log with its reason, because a critique that only ever confirms itself is not a critique.