An ordinary chart draws a proof, a floating-point estimate, a guess and a gap with the same line. In WARRANT each has its own stroke, a verdict is a word, and the build refuses a figure that claims more than its record.
The segments’ claim, with a tolerance: every straight segment is within ε = of √x on [0, 5/4]. ε is a choice: type it, or drag its handle along the ruler, in steps of 1/64. The solid tick is where the answer changes, decided once in exact rationals; a drag moves only ε, the segments raised by ε (dotted, above them), the × and the words.
It holds from ε = 1/8 up: the largest gap in the window is at x = 1/16, where the segment reads 1/8 and √x is 1/4. Below 1/8 a point breaks it: the hero’s own x = 1/2 while it can, then x = 1/16.
Every mark has one standing, and each standing one stroke on a line and one underline in text. Here is the hero’s right half again, one standing per frame:
The standings are ordered, and a mark takes the weakest standing on its way to the pixel: one float makes it computed, one choice makes it chosen, one refusal leaves the void. Standing is not a confidence: a value known to many decimals can be undecided.
A verdict is a word in one shape, everywhere. A stroke never carries a verdict, so a refutation proved here is drawn solid.
A verdict over a chosen input names the input, in italic: it holds given that choice, and no other.
An empty set is ∅ and a word, never a zero-height bar. The red × is kept for one thing, an exhibited counterexample beside the words that name it: on this page, the hero’s.
From here down, the ways this site shows data, by kind: charts, maps, routes and time, fields and images, systems, and text. Each is drawn from one of the instruments, twice where an ordinary version exists, and each ends with the rule that draws it, so the rule can be applied to data of your own.
Five charts of the kinds people draw every day, each twice: as a plotting library draws it, and in WARRANT. Two read a real record; one is computed from its equations as this page is built; two are illustrations, their numbers invented and said so on the figure. The arithmetic on an invention is still exact, so its ties, gaps and counts are decided given it; and no invention carries a red ×, which would be a forged counterexample.
The usual chart draws a trend with error bars. The spread is two choices, the block and the family: the picked 100-year wave runs from 13.05 m (monthly) to 17.38 m (weekly). The error bars are the only float on the page, and on annual maxima one family has no certified fit, so the choice between them is refused, not drawn.
The rule: Draw each certified level as a knot, an interval from a float method as a dashed whisker, and a choice the data cannot settle as a void with its reason.
The usual chart draws an exact law and a 1939 fit in one ink, and carries a pen across the transition. Here 64/Re is solid, Colebrook’s curves are dashed, each names the roughness it was drawn given, and from Re 2300 to 4000, where no correlation holds, nothing is drawn.
The rule: Draw an exact law solid and a fit solved in floating point dashed, name each curve by the input it was drawn given, and leave a range where no correlation holds as a void, never bridged.
The usual chart ranks six models one to six. First place is a tie broken by name; fourth is a score someone reported and nobody re-counted; the zero at the bottom is a run that never happened.
The rule: Draw counts solid, a reported number dashed until it is re-counted, an order between equal values as a dotted choice, and a run that never happened as a void with NEEDS DATA, never a zero.
The usual chart shows a dip and a fall. The dip is two days nobody reported, drawn as zero; the fall is a week still being counted. Here the gap is a void, the mean stops where the data stop, and the last week is a nowcast, dashed.
The rule: Draw counts received solid, unreported days as a void, a mean whose window was picked dotted and stopped at every gap, and the days still being counted as a dashed nowcast.
On a linear ramp only the dense core of the hours shows, and the hours a 20-year contour is scored on, a few single hours at the edge, vanish. Here every hour shows in a stated class, each contour carries its exact count outside, and the edge a test adds to close an open file is dotted.
The rule: Draw counts as an ordered field in stated classes so a single count shows, draw each curve as its source lists it, and draw any edge the scorer adds to close it dotted, as a choice the count holds given. See it live →
Cells, regions, sites, reaches and fields: what a map says about each place, and what it may not.
The usual map fills every cell. A cell where no family could be decided gets a zero, lands in the lowest shade, and reads as the calmest sea on the coast. Here a refused cell keeps its full square as a void with its reason, and the shades are only the cells the ledger decides.
The rule: Shade a cell only where its value is decided, and draw a refused cell as a void the size of a cell, with its reason in words, never as zero. See it live →
The usual map puts a sentence over a picture and lets the eye agree. A region named in words has no edge until someone reads one in. Here the box is drawn dotted as the reading it is, the count inside it decides the claim, and the readings one cell away that change the verdict are drawn too.
The rule: Draw a region that a sentence names as a dotted box, the reading it is, decide the claim inside it, and show the readings one step away when they change the verdict. See it live →
The usual map prints the forecast’s one number at each site, and 4 of the nine read under the limit. Read against the band the forecast is known to miss by, only 1 is cleared and 2 are blocked; the other 6 are undecided, 3 of them sites whose one number looked fine. Here each site carries its decided word, its shape and the band it was decided on.
The rule: Mark each site with the word its band decides against the limit, cleared, blocked or undecided, in a shape as well as a word, and print the band it was decided on, never the forecast’s one number alone. See it live →
The usual ring is one line from one glide ratio and one forecast wind, and everything inside it looks reachable. Here the inputs are ranges: the two solid edges are decided, the panel’s ring runs dashed between them, and 69 of the 108 airfields inside it are undecided, not reachable.
The rule: Draw a reach as the two edges the inputs decide, solid, with a halo where the model was never validated, the one-value ring dashed between them, and each place inside marked with its own verdict. See it live →
The usual map draws a model’s crests like a photograph, edge to edge, and every beach alike. Here the crests are dashed and the figure says it is a picture of the model; they stop where the model is refused, the beaches show where the model was checked and where it was only assumed, and the three where the check says it reads low are named.
The rule: Draw a model’s field dashed and say once that it is a picture of the model, leave a void where the model is refused, and mark each place by how far the model was checked there, naming the places where the check says it reads low. See it live →
Data that moves: a flight along its route, a week of six-hour windows, a forecast and the sea that came after it, a star dimming as a planet crosses it, a price stepping as its rate moves. Each is read from an instrument's own record, and each is drawn so the stretch nobody saw, the hours nobody can decide and the claim nobody has checked yet look like what they are.
The usual map draws a flight as one line. It bridges 5 min 42 s without reports as if they were flown, and it cannot show where along the route a claim about the flight stops being decided. Here the track breaks where the reports stop, the stretch where the reserve is decided to hold is solid, and the rest is a void with its reason.
The rule: Draw a route from the reports that were received, break it wherever they stop, and mark the point where a decision about the route changes, with a solid line where it is decided and a void where it is not. See it live →
A go/no-go board fills the cells that are go and leaves the rest blank, so blocked, cannot tell and not forecast that far look alike. Here each has its own shape and its word, and the hours past the forecast are one void with its reason.
The rule: Give each verdict on a board its own shape and its word (cleared filled, blocked outlined, undecided hatched), and draw the part with nothing to decide on as one void with its reason, never as a blank. See it live →
The usual chart draws the forecast as if it were the sea, with one bar for when the job can start. The forecast is a claim: here it is dashed, the limit it is decided against is solid, and below them each start time carries its verdict, cleared where the band's top edge stays under the limit for the whole job and a void where the band straddles it or the job outruns the forecast.
The rule: Draw a forecast dashed, the limit it is decided against solid, and the window the decision opens as a span with its word; where the forecast straddles the limit, draw the void, not a guess. See it live →
The usual verification plot lays forecasts and observations side by side and leaves the judging to the eye. Here each forecast is a claim, a miss is drawn as the gap between the claim and the sea, and the count of hits sits beside what each forecast claimed. The grade admits or prunes a forecaster; it never decides a window.
The rule: Draw a forecast's band beside what was later observed, draw each miss as the gap between them, and print the count of hits against the coverage the forecast claimed. See it live →
The usual chart draws one fitted curve through the points, solid, and quotes its radius to four decimals. Other stars fit the same points. Here each measurement is drawn as the allowance it is judged with, the fit is dashed, two very different stars that both pass through every allowance are dotted, and the radius is the interval the data decide.
The rule: Draw each measurement as the allowance it is judged with, a fitted model dashed, the extreme members the data admit dotted, and print the decided range in words, never one fit as the answer. See it live →
The usual chart joins the prices into a sloping line and shows the printed one a little off it, which reads as rounding. The rule truncates, so the price moves in treads, and the printed rate stands for a whole box of rates. Here the treads are drawn flat, the box is marked, and the printed price sits on none of them: the gap is a decided fact, not noise.
The rule: Draw a value a rule truncates or rounds as the flat treads it can take, never as a slope between them, mark the box of inputs a printed figure stands for, and say in words whether the printed output sits on a tread. See it live →
A field from a model, an image as the set of its fits, a shape from its chords, an error budget and a calibration band: five ways to draw physical data, each from one of the instruments’ own records, first as a plotting library draws it and then in WARRANT.
The usual contour plot of a model’s field looks like a measurement, with speeds printed on it. Here the contours are dotted, because the profiles behind them were picked to be legible and only the scalings are the paper’s; the one solid mark is the core box, whose shrinking rates are exact.
The rule: Draw a field computed from a model dotted, as a picture of one chosen member, name its chosen inputs in italic, and draw solid only what the model decides, here the box its exact exponents fix. See it live →
The usual image is one sky out of the many that fit the same visibilities, and a picture cannot say which of its features the data force. Here the five fitted skies are drawn at once: ink where all five are bright, texture where only some are.
The rule: Draw an image fitted to data as the set of its fits: ink where every fit agrees, texture where they differ (denser where more agree), edges in the stroke of how the fits were computed, and the level and the beam named as choices. See it live →
The usual sketch joins the chord ends into an outline that looks like the body. That outline is not concave, so no convex body has it. Here the body is the set of shapes the chords allow, and the stations that saw nothing, which set its ceiling, are drawn as observations.
The rule: Draw a shape known only through cuts as the set of shapes the cuts allow: ink where every allowed shape covers, texture where some do, each cut and each empty probe as an observation, and a probe that returned nothing as a void with its reason. See it live →
The usual error bar is one cross of symmetric whiskers. It hides that the error is a box in two dimensions, and that its size rests on three different things: the paper’s numbers, the numbers the paper leaves out, and a lag the page chose.
The rule: Draw an error budget as nested enclosures, one per premise, innermost first: solid where it rests on the source’s literals or on boxes around what the source leaves out, dotted where it adds a chosen scenario, and name the chosen inputs in italic. See it live →
The usual calibration plot draws one fitted curve through the standards and reads a sample back to a number with a narrow ±. The fit is one member of a set: assuming only that more analyte means more signal, the standards allow every curve in the band, and the reading is anywhere between the two standards that bracket it.
The rule: Draw a fitted curve dotted inside the band of every curve the data and the stated assumption allow, read a measurement back through the band as an extent, and say in words any point the axis cannot place. See it live →
Structures rather than series: a wiring diagram, a point in a simplex, an embedding with its tree, a ladder of enclosures against a wall, a matrix of verdicts, and an evolution experiment’s lines of descent. Each is read from an instrument’s own record and drawn twice. In a structure the standing sits on the parts: an edge, a port, a window, a cell, a winner.
The usual diagram draws every connection as the same arrow, so it cannot show the one rule that matters: a value that came from floating point may prune, never decide. Here a wire is drawn in the stroke of what it carries, a port that decides is a square, a verdict port that never fired stays on the drawing, and the connection the engine refuses is a void with its reason.
The rule: Draw each wire in the stroke of what its source emits (solid for exact, dashed for float), draw a deciding port as a square, keep every verdict port on the drawing whether it fired or not, and put a refused connection as a hatched void with the reason, never as a line. See it live →
Weights that sum to one are a point in a simplex, and a bar chart throws that away: thirty-one bars at one temperature say nothing about where the row is heading. Drawn as a point, the row’s path is visible, and the grammar shows how little of it is decided: nine solid knots near the centre, and a long dashed float trail to the corner.
The rule: Draw a composition that sums to one as a point in a simplex (restricted to a face you name in italic), each exact value a solid knot, a float path dashed, and magnify a short decided stretch in a ring rather than stretching the axes. See it live →
The usual scatter gives an eigendecomposition’s picture axes, as if its coordinates were measured, and draws every edge of the tree alike. Here the positions are said once to be a chosen picture, an edge in every minimum tree is solid, and an edge that ties with another of exactly the same length is dotted, its alternative drawn faintly beside it.
The rule: Draw a layout placed by a float solver without measurement axes and say once that it is a chosen picture; draw an edge that the numbers force solid, an edge picked among exact ties dotted with its length, and its tied alternatives as faint guides. See it live →
The usual chart puts every published ratio left of the wall, so every record looks accepted. Each norm was printed rounded to a whole number, so each ratio is really a window; drawn as windows, nine clear the wall and one crosses it, and its verdict is a void, open until someone publishes the norm in full.
The rule: Draw each value as the window its rounding leaves (a solid bracket) beside the printed figure (a dashed tick), put the threshold as a solid line, give each row its verdict word, and leave a hatched void where the window straddles the threshold. See it live →
The usual grid fills a cell for right and leaves it empty for wrong, so a wrong verdict, a hedge and an answer that never came all look the same. Here each cell holds the word the model said, underlined dashed as a claim, beside the exact answer; a missing answer is a void, and the row order, a choice made to group the answers, is drawn dotted.
The rule: Put the decided answer in the first column, write each claim’s own verdict word in its cell (underlined dashed, marked ≠ where it differs), leave a hatched void where no answer came, and when you sort the rows keep their labels and draw the order dotted. See it live →
The usual chart is a race of three curves from one start. Here the start is a program someone wrote, drawn dotted; each curve carries the births its winner descends from, read from the parent pointers; and a winner picked by birth order among births tied at the top score is ringed dotted, with how many it was picked from.
The rule: Draw each arm’s best-so-far as a solid step line told apart by shape and weight, put the hand-made starting point as a dotted line named in italic, mark the winner’s ancestors as knots from the record’s parent pointers, and ring a winner that was picked from a tie dotted, saying from how many. See it live →
Prose flattens standing more than any chart does: a fit, a float interval and a rounded design value read the same in a sentence.
In prose a fit, a float interval and a rounded design value look the same, and a dash in a table could mean zero, missing or not applicable. Here each number wears its underline, the chosen family is named in italic, the verdict is a word, the empty cell says why, and the premises are listed with the weakest last.
The rule: In text, underline each number by its standing, name a chosen input in italic, give a verdict as a word, write the reason in an empty cell, and list the premises with the weakest last.
At Buoy X the 100-year significant wave height is 12.4 m (95% CI 11.6–13.3 m), and the design wave is 13 m. The platform deck clears the design wave.
| return period | Hs |
|---|---|
| 10 years | 9.8 m |
| 100 years | 12.4 m |
| 1000 years | — |
At Buoy X the 100-year significant wave height is 12.38–12.41 m given the GEV family, with a 95% interval of 11.6–13.3 m. The design wave is 13 m, rounded up by the code’s rule. The platform deck clears it: HOLDS given a design wave of 13 m.
| return period | Hs, m |
|---|---|
| 10 years | 9.80–9.83 |
| 100 years | 12.38–12.41 |
| 1000 years | not computed |
It rests on the hindcast, compared against the buoy’s own record, and on the GEV family, assumed, chosen by the analyst. The weakest premise is assumed.
Record: ∅ — an illustration, given an invented record.
The arithmetic can be exact while its equations never met the thing they describe. So a number that rests on a physical model names its premises, each with how far it was checked, and a conclusion is as checked as its weakest premise. Here is a wave limit on Swell, the beach app:
The arithmetic is exact; the weakest premise is assumed, and neither model was verified against an exact solution of its own equations.
A read step — a proof step read and not run by a machine — gets no grade of its own: it is assumed. It never caps a verdict; it is listed in what the page rests on. δ₃ = 117/2192 is an example: a decided finite core, and three steps proved on paper and read.
The design wave from the gallery, the same drawing three times: on the site’s dark screen; on white paper in the print register, where every ink is checked for contrast; and as a mono laser prints it, every colour its grey. Standing rides on the stroke, never on colour, so nothing is lost on the way down.
import warrant_mpl as wm
wm.use() # wm.use('grey') for a mono laser
wm.knot(ax, x, level) # a certified level
wm.whisker(ax, x, lo, hi, wm.COMPUTED) # the delta method
wm.void(ax, x0, x1, words='refused') # words required
wm.legend(ax)
wm.line(ax, x, y, wm.COMPUTED, linestyle='-')
→ TypeError: the stroke is read from the standing
and the series, never chosen by the callerconst W = require('./warrant.js');
W.attrs(W.COMPUTED)
→ class="w-computed" fill="none" stroke-width="2" stroke-dasharray="5 4"
W.attrs(W.meet(W.DECIDED, W.CHOSEN), { width: 1 })
→ class="w-chosen" fill="none" stroke-width="1" stroke-dasharray="1 3" stroke-linecap="round"
W.value('3.1416', W.COMPUTED) // a number in text
W.legendHtml() // the key beside a figureNo package yet: copy one folder. kits/warrant-mpl for matplotlib (with the design wave, a return curve and the contours as worked examples), or warrant.js and grammar.js for the web, MIT. On a canvas, setLineDash takes the same patterns.
The weakest premise is assumed.
The display is a sound map of the record, and the build decides it.
No mark may claim more than its record: not a stronger stroke, not a wider extent, not a stronger word. Every page here is built by a program that reads its records and refuses to build when one stops supporting a sentence, and these checks run over the whole site:
Each is a fact about the built site, counted before the fix and now by the rule that gates it.
Open, and counted by the same census: 75 printed values still carry no record address, 10 figures name no record, 8 print no sentence that would stop them, and 36 dashes carry no standing. Each count may only shrink.
From the rulebook (v2, frozen 28 October 2026, with dated rulings since). Each was learned on a page of this site that broke it.
Every figure reads in greyscale first, and the strokes take lightness in order of standing. The one red, --witness #e0574e at 5.3:1 on the dark ground, marks an exhibited counterexample and nothing else: on this page, once, on the hero. A colour enters only with a measurement, and the law itself came from one: two series colours of a sibling project, distinct to most readers, were one colour to a deuteranope.
OKLab ΔE × 100 for every pair that shares a figure, under the colour-vision model of Machado, Oliveira and Fernandes (2009), computed as this page is built:
Everything above, once more as plain text, built from the same objects as the page. Give an assistant this page’s address, or the brief as a text file, and ask it how to draw your data.
A brief of https://carlostoledo.co/grammar/ in plain text, generated with the page from the same objects. Use it to answer how to draw a number, a chart, a map, a route, a field or a table so that each mark says whether it was decided exactly, computed in floating point, chosen, or refused.
A mark takes the weakest standing on its path to the pixel: one float makes it computed, one choice makes it chosen, one refusal leaves the void. Standing is not a confidence. The stroke carries standing only; which series a line belongs to is carried by weight, opacity or a marker, never by a dash. A guide (a ruler, a leader) is dashed 2 3 and says nothing.
An empty set is ∅ and a word, never a zero-height bar. The one red (--witness #e0574e) marks an exhibited counterexample, on the object, beside the words that name it, and nothing else; never on invented data.
Each premise carries a grade; a conclusion is as checked as its weakest premise; verification (the code solves its equations) and validation (the equations describe the thing) are separate. A forecast is computed and dashed; a field drawn from a model is a picture of it, said once; an extent carried by a model not validated where it is drawn gains a halo.
Python (matplotlib): copy kits/warrant-mpl from github.com/carlostoledo1891/cert-machine; then import warrant_mpl as wm; wm.use(); wm.knot(ax, x, level); wm.whisker(ax, x, lo, hi, wm.COMPUTED); wm.void(ax, x0, x1, words='refused'); wm.legend(ax); wm.line(ax, x, y, wm.COMPUTED, linestyle='-'). A caller cannot pass its own linestyle: the stroke is read from the standing.
JavaScript (SVG and HTML): playground/warrant.js and design/grammar.js. W.attrs(standing) returns the stroke attributes; W.value(text, standing) a number in text; W.legendHtml() the key. On a canvas, setLineDash takes the same patterns: 5 4 computed, 1 5 chosen.
The display is a sound map of the record, and the build decides it: no mark may claim more than its record, in stroke, extent or word. check-grammar — only the five patterns may appear; three uses that are not lines are declared by name, each with its reason. The first census, on 5 September, counted twenty-five: the dash had been derived from the stroke width, one carrying 1.04 5.460000000000001 into published HTML. check-marks — a value printed from a record carries its address; every build follows it back and prints the datum again by the same rule. Four planted marks are refused on every run. check-wiring — a page with a mark of the grammar and no legend is refused; one hero per page, its × first and at weight. check-render — no leaked template text, no paint that does not resolve, no figure thinner in ink than its record, no script error. check-measure — every page driven in Chrome at 1440, 768, 390 px; left edges, overflow, escapes and clipped elements may only go down.
Generated at git 3cf797ac by tools/build-grammar.js. MIT.