Procedural Clock — Product Design Plan
LegalPresence · Product design plan · 2026-07-20

Readiness against the clock

A design plan for the web interface over ontology/deadline_engine.py. The engine is deterministic and the interface must look it. Every number on screen is arithmetic with a receipt — not a prediction.

01 — Position

An instrument, not a dashboard

The stdout clock already works. It is ordered by urgency, it aligns in columns, it states its own caveat in the header, and it declines to guess. Those four properties are the product's credibility. The interface inherits them literally rather than replacing them with cards and donut charts.

Continue from the marketing site

  • Warm paper ground #eeece5 — reads as document, not app chrome, and survives an eight-hour reading day.
  • Deep green #1f4a3d — brand continuity.
  • Serif for identity — matter names and the verdict keep Iowan Old Style's gravitas.
  • Dark-mode palette#0f131d / #6fb298 / #ff8a80 already exist. Reuse verbatim.

Diverge deliberately

  • Green is demoted. On the marketing page green is the hero accent. Here it means exactly one thing — counsel-approved. It never encodes urgency and never decorates.
  • Monospace is promoted to a primary role. Column alignment is the information design. Serif prose is for reading; this surface is scanned.
  • Radii go to zero. Rounded cards read consumer-SaaS. Square edges read filing instrument.
  • A separate semantic ramp that shares no hue with the brand.
The partner is skeptical of AI and personally accountable for the filing. The design's job is not to look confident — it is to look checkable. Anywhere the interface would have to estimate, it shows an absence instead.
02 — Flow

Open the app → know what's at risk

Target: the answer in under four seconds, the reason in one click, the proof in two.

Frame 1 · 0s
The verdict, before anything else

No matter picker, no landing page. The app opens on a single sentence answering will we be ready, with the worst deadline named inside it.

Reads in 4s
Frame 2 · 4s
Scan the clock rail

The left rail is the stdout list, preserved: open deadlines sorted by days remaining, severity encoded in rail width and notches. The partner scans down, not across.

Same order as stdout
Frame 3 · 10s
Select the worst one

Centre panel expands: T-minus, the linked motion's element ledger, named gaps, pending counsel approvals. This is the stdout indented block, given room.

One click
Frame 4 · 20s
Ask "why that number?"

Any dotted-underlined figure opens the provenance drawer on the right: the computation, its inputs, the authority, the source document at the page.

Two clicks to proof
Frame 5 · 40s
See what blocks what

Switch the centre panel to the blocking ladder. The AND/OR gate shows whether closing one gap actually unblocks the motion, or whether four more sit behind it.

Decide where to spend the week
Frame 6 · exit
Assign and leave

Each gap carries a responsible role from the record. Assign, set a chase date, export the clock as a PDF memo for the risk committee.

Leaves with a task list

Layout concept

Three fixed zones under a persistent verdict bar. Left rail (320px) — the clock, always visible, never collapses; it is the product's spine and losing it loses the plot. Centre — the selected deadline, switchable between ledger and ladder view. Right drawer (430px) — provenance, summoned on demand, overlays nothing; the partner must be able to read a receipt while still seeing the number it explains. A modal would break that and is prohibited.

03 — Design system

Palette, type, encoding

Two colour axes that never mix

Urgency (a property of the clock) and approval (a property of the record) are different questions. They get different hues and appear in different components, so a green pip never means "safe" and an oxblood rail never means "unapproved".

Paper — ground#eeece5 / #0f131d
Seal — counsel-approved#1f4a3d / #6fb298
Slate — candidate, awaiting counsel#4a5470 / #98a2b8
Oxblood — CRITICAL & evidence gap#9f1d16 / #ff8a80
Amber — HIGH#c2661a / #e9a35c
Olive — MEDIUM#7a6a3c / #c3b174
LOW gets no colour at all. Four hues competing for attention is three too many. LOW renders in plain ink with a 2px neutral rail — visually silent. The eye should only ever be caught by oxblood and amber, which means when something is caught, it means something.

Type roles

RoleFaceUsed forSetting
IdentityIowan Old Style → Palatino → GeorgiaMatter names, deadline titles, the verdict sentence600 wt · -0.01em · balance
Interfacesystem-ui grotesqueLabels, buttons, body copy, drawer prose15px / 1.55
Dataui-monospace → SF Mono → MenloDates, T-minus, tallies, computations, citations, hashestabular-nums, always

No webfont is loaded. The artifact CSP blocks font CDNs and a silent fallback on a legal instrument is worse than an honest system stack. All three roles resolve on every target machine.

Risk encoded three ways at once

Colour is never load-bearing alone. Each level carries a hue, a rail width, and a notch count — legible in greyscale, on a projector, and to a colour-blind partner.

CRITICAL8px rail · 3 notches
HIGH5px rail · 2 notches
MEDIUM3px rail · 1 notch
LOW2px rail · no notch · no hue

Element state, encoded in shape

filled square — approved (STABLE + counsel-APPROVED + unimpeached) dashed outline — candidate (STABLE, awaiting counsel) struck outline — gap (no STABLE support)

Filled / dashed / struck survives desaturation. The three states come straight from motion_viability.support() — the UI invents no fourth.

04 — Components

Inventory, with every state

Verdict bar — the thesis component

13 Harrison St · Sup Ct NY Cty · Index 654321/2025 · as of 2026-07-20
Not ready. The nearest hearing cannot be brought — 3 element gaps and 5 unapproved candidates stand between today and the return date.
7 open 2 CRITICAL/HIGH next dependency: Expert disclosure T-32d counsel to confirm dates

The stdout SUMMARY footer, promoted to the top. A scanned surface must answer before it explains. The caveat from the engine's own header rides along permanently — it is not a footnote to bury.

All-clear state — sober, not celebratory

13 Harrison St · Sup Ct NY Cty · Index 654321/2025 · as of 2026-07-20
Ready to file. All 6 elements of the contempt test are counsel-approved and unimpeached; affidavits sworn 2026-07-18.
record sealed a41f…9c02verified 2026-07-20 09:14 ETcounsel to confirm dates

No confetti, no green tick. The all-clear is the highest-stakes screen in the product — a partner is about to rely on it — so it carries more receipts than the failure state, not fewer: what was approved, when it was sworn, and the seal hash of the record it was computed from.

Deadline row — populated

T-14d Opposition to motion to dismiss CRITICAL
2026-08-03Sup Ct NY Ctyper order 2026-07-06 NYSCEFresp: associate
| | 2 approved · 5 candidate · 3 gap
notice element — no served copy in record
prejudice — no admissible proof of damage
5 elements have STABLE candidates awaiting counsel approval

Loading — structure, never fake numbers

T— Loading deadline…
──────────── · ────────
computing court-local days…

Shimmer blocks shaped like numbers are a lie in this product. Em-dashes hold the slot. A partner must never glance at a loading screen and read a number that isn't there yet.

Error — fail loud, show nothing

Readiness cannot be computed
assertions-graph failed to load
No figures are shown. A partial graph understates risk, so the interface withholds rather than estimates.

Mirrors lp_ns.load, which raises rather than silently returning a thin graph. The UI must not be more optimistic than the engine.

Partial data — the caveat is a component

T-32d? Expert disclosureDATE UNCONFIRMED
derived from CPLR 3101(d), not from an orderresp: partner
No scheduling order in record. Date is inferred from the rule and must be confirmed by counsel.

A trailing ? on the T-minus, a badge, and a plain-language reason. Inferred dates are visually distinct from ordered dates everywhere they appear — including in exports.

Full inventory

ComponentJobStates
Verdict barOne sentence: will we be readynot-ready · at-risk · all-clear · uncomputable · loading
Clock railOrdered open deadlinespopulated · loading · empty-no-deadlines · empty-new-matter · error · filtered-to-none
Deadline rowOne deadline at a glance4 risk levels · overdue · date-unconfirmed · extension-pending · no-linked-motion · done (hidden by default) · loading · selected
Element ledgerPer-element support tallyapproved · candidate · gap · impeached · contested-weight · empty (motion has no elements yet)
Gate badgeAND / OR test structureAND-satisfied · AND-dead · OR-lit · OR-dark · mode-unknown
Blocking ladderWhat blocks whatfull graph · spine-isolated · single-element drill · empty (no dependencies) · too-large (>40 nodes → collapse)
Provenance drawerNumber → source documentfull chain · partial chain · no source in record · document unavailable · loading · sealed/verified · seal-mismatch
Exposure panelContradictions impeaching our own supportclean · flagged-by-type · unclean-hands · estoppel-risk
Approval queueWhat counsel must sign offpending · approved · rejected · expired · not-my-role
ExportPDF memo for risk committeeready · generating · stale-warning
Seal-mismatch is the state that earns the product's trust. If the record hash no longer matches what a number was computed from, every affected figure greys out and the drawer says so. Silently recomputing would be the single most damaging thing this interface could do.
05 — Traceability

From a number to the page it came from

The most important interaction in the product. If this feels solid, the partner trusts everything else. If it feels thin, nothing else matters.

The affordance. Every derived figure — day counts, tallies, risk levels — carries a dotted underline. Raw transcribed values do not. So the dotted line means something precise: this was computed, and the computation is on file. One consistent affordance, product-wide, learned once.

The mechanism. Click opens the right drawer — never a modal. The partner must be able to read the derivation while still seeing the figure it explains, and compare two deadlines without losing place.

The content, in fixed order. Value → computation with real inputs → governing authority → source document at the page, with the span quoted → chain back up the graph → counsel state → seal.

Showing arithmetic is the anti-AI move. A confidence score invites the question "how do you know?" A printed function call with its actual arguments answers it. The drawer shows the call, not a percentage. Nowhere in this product does a number appear with a confidence interval attached.

Absence is rendered, never filled. When an element has no source, the slot shows a dashed oxblood no served copy in record — occupying the same visual position a citation would. The gap is as legible as the proof.

Provenance
T-14d — days remaining
Computation
court_local_days_to( "2026-08-03T21:00:00Z", now = 2026-07-20T13:04:11Z, tz = "America/New_York" ) → 14
Counted in court-local calendar days, not a raw UTC delta. A 5 pm ET filing stored as 21:00Z would misreport near a day boundary.
Risk escalation
stored MEDIUM + hearing with unmet gaps → HIGH + linked motion NOT bringable → CRITICAL
Rules escalate only. Nothing in the engine can lower a stored risk band.
Authority
Order of the Court, 2026-07-06 · Hon. Headley, IAS Part 17M
Open NYSCEF #291 → p.4
Source span
"Opposition papers shall be served and filed on or before August 3, 2026."
doc 291 · p.4 · ln 12–13 · OCR confidence not used for dates — transcribed and counsel-confirmed
Blocking element — no source
✗ notice element — no served copy in record
Chain
assertion #a-4471
  └ supports element «knowledge»
    └ of motion CONTEMPT (AND)
      └ linked to this deadline
Counsel state
NOT APPROVED — counsel review required
Record seal
a41f7c2e…9c02 · verified 09:14 ET · matches
06 — The differentiator

The blocking ladder

Not a force-directed node cloud. Those reshuffle on every load, and a diagram that moves when the facts didn't looks like it is guessing — fatal here.

The ladder has four fixed semantic columns, taken directly from the schema: evidence → element → logic gate → motion → deadline. Every node sits in exactly one column, every edge flows left to right, and the same data always renders identically. Layout is deterministic because the engine is.

The gate column is the idea. motion_viability.py encodes each motion's legal test as AND (every element required) or OR (any one ground sufficient) — and that distinction completely changes what closing a gap is worth. Closing one gap on an OR-test motion makes it bringable. Closing one gap on an AND-test motion with three open gaps buys nothing. No calendar tool shows this. It is the difference between a to-do list and a strategy.

CONTEMPT · Judiciary Law §753 · AND-test · ⛔ NOT YET
EVIDENCE ELEMENT GATE MOTION → DEADLINE 3 approved valid order 2 approved knowledge of the order 1 approved clear, unequivocal mandate 2 pending violation of the mandate no support in record prejudice to a right no support in record admissible proof AND DEAD CONTEMPT Judiciary Law §753 · AND-test · 6 elements ⛔ NOT YET Return date — order to show cause 2026-08-03 · T-14d CRITICAL Highest-leverage move — from motion_viability.next: OBTAIN STABLE evidence for « admissible proof » 2 gaps remain behind it. Closing this one does not open the gate: an AND-test needs all six.

Edge grammar

  • Solid green — satisfied. Counsel-approved, unimpeached.
  • Dashed slate — candidate. Evidence exists; a signature does not.
  • Dotted oxblood — gap. Nothing in the record supports it.
  • Struck edge — impeached. Support exists but a STABLE contradiction hits it.
  • Break mark on the gate output — the test fails; nothing flows to the motion.

Dash pattern carries the state independently of hue, so the ladder survives greyscale printing — which matters, because this diagram will end up in a committee pack.

The OR gate reads oppositely

W.T. Grant — likelihood 5015(a)(3) — fraud irreparable harm OR LIT bringable Unlit grounds are spare capacity, not failures — dimmed, never marked with a gap glyph.
Progressive disclosure, three depths. Default — motion-level only, one row per motion with its gate; a matter fits on one screen. Click a motion — its elements expand with evidence counts, as above. Click an element — the evidence column expands to individual assertions, each opening the provenance drawer. Beyond forty nodes the ladder collapses to gate-level and offers "isolate the spine": the single chain from the deepest gap to the deadline at full weight, everything else at hairline.
07 — Empty states

Nothing entered is not the same as nothing to do

Conflating those two is a malpractice-shaped bug. Each empty state names which one it is.

No deadlines on the clock

This matter has no open deadlines. That is either a matter at rest or an unentered docket — the record cannot tell which, and neither can we.

last docket sync: never

Import scheduling order

No gaps on this deadline

All six elements of the linked motion carry counsel-approved, unimpeached support. The motion is bringable now.

6 approved · 0 candidate · 0 gap · sealed a41f…9c02

Review the six approvals

New matter — nothing on the record yet

Readiness cannot be computed until there is a docket to compute against. Three steps, in order:

1 · import the scheduling order → dates
2 · link motions to their deadlines → tests
3 · ingest the record → elements and gaps

No sample data, no demo matter. A fabricated clock in a legal tool is not a friendly onboarding — it is a hazard.

No deadline selected

Choose a deadline from the clock to see its element ledger and blocking ladder.

The verdict bar and clock rail stay populated — the partner is never looking at a fully blank screen while real deadlines are running.

The all-clear empty state is the one to get right. It is the screen a partner sees immediately before filing. It must not read as "we found nothing" — it must read as "we checked six things and here they are." Absence of gaps is a positive finding, and it carries its receipts like any other number in this product.