0 · Why round 2

Round 1 explored one source and three layouts. These are four different kinds of object.

The Pass, Quiet Emphasis and Sequence all came from a printed airline ticket. They differ in how a page is arranged, not in what kind of thing it is. Round 2 changes the object: what we borrow from, what the marks encode, how time is shaped, and how much air the page gets.

Tokens from the UX_tools remote at 2f75211. Fixture data throughout: six fictional schools, invented numbers. The diverging ramp in section B is new, proposed here and validated in section E.

A · Source material

The school's own paper

We borrowed from an airline. District people read report cards, attendance registers and bell schedules fluently every day, and we never borrowed from any of them. This is the same data as round 1, shaped like a document they already know how to read.

Technology report card · 2026–27

Roosevelt Elementary

GradesK–5
Students612
Staff48
PeriodMP2
MP1MP2MP3MP4
Comment

Roosevelt gets more out of its licenses than any school in the district. Two subscriptions have never been opened, and dropping them would save $7,400 without touching anything teachers use.

Generated from September 1–18 usage · next update at the close of MP2

The rest of the district, same shape

Every card is the same four subjects in the same order, so a reader who learns one card can read all six. That is the report card's real trick, and it is the same trick as the boarding pass's repeated label-over-value band.

Nearest thing that already exists: Frost/explorations/concepts/evidence-engine.html, a board-memo composer that writes prose over data with numbered citation chips. It is the only place in Frost that lets the product speak in sentences, and it is a concept, not a component.

Where it shines: zero learning curve, and it carries a sentence. The comment line is the only place in either round where the product says something in words a principal would repeat out loud. Where it strains: it is a snapshot, not an instrument. There is no way to ask a follow-up question of a report card, and four subjects is a hard ceiling before it stops being one. What it would take in Frost: a document masthead recipe, the five-rung descriptive rating scale with its marks, and the comment block. The rating scale needs the diverging ramp from section B.

B · Encoding

Compared with what

Every chart in round 1 answers "how much?". None answers "compared to what?", which is the question a superintendent actually asks. Four forms do, and all four need a diverging ramp that Frost does not have.

The demand is already on record: the Analytics+ Frost mockup carries a School comparison item in its rail that opens nothing. It has been an unfulfilled promise since that page was built.

1 · Bullet graphs, for a KPI with a target

The stat tile says 197 minutes. The bullet says 197 against a 180 target, inside the range the district usually sits in.

this monthtargetbands are the district's usual low, typical and high range
Table view
MeasureThis monthTargetDistrict typical range
Time spent per user197 min180 min150–210 min
Logins per user242016–26
Resources used596545–80
Licenses activated87%95%80–98%

2 · A slopegraph, for what changed

Roosevelt and Lincoln swapped places with Washington. Two schools rose, three held, one fell.

Table view
School2025–262026–27Change

A slopegraph is the only form here that shows rank change as a shape. Crossing lines are the finding. Where two schools land too close to label, the label steps aside and a hairline leader keeps it tied to its dot, which is the alternative to stacking labels and detaching them from their lines.

3 · Dot plot against the district

Distance from the line is the story.

district average, 3h 18m
Table view
SchoolDaily per uservs district

4 · Diverging bars

The same data as round 1's heat table, centered on the district.

belowabove
Table view
Schoolvs district

Where it shines: it answers the question people actually bring. A diverging bar centered on the district makes "who is unlike everyone else" a shape rather than a calculation. Where it strains: it needs a defensible benchmark, and a district average is a weak one when an elementary school and a high school sit in the same column. The honest version compares like with like, which means the benchmark is per grade band, and that is a data question before it is a design one. What it would take in Frost: the diverging ramp in section E, a bullet-graph recipe, and a rule that a diverging scale never uses status colors.

C · Time

The school year

Round 1's cost chart says 2022 through 2026, which are generic periods. School time has shape: marking periods, breaks, testing windows, class periods. A chart that knows the calendar can tell a Thanksgiving dip from a problem.

1 · The year as a register

Usage tracks the calendar, not the month. The two quiet stretches are winter break and spring break. The dip in early October is not.

fewermore loginsno school

The one rule that makes this work: a day with no school is blank, not zero. A zero would say the district stopped using its tools. The dashed cell says nothing happened because nothing was supposed to.

Table view, by month
MonthSchool daysAvg logins per day

2 · The year ribbon

Where we are, and what is coming. Breaks are knocked out; testing windows are marked because usage always spikes into them.

AugNovJanApr → Jun

Round 1's five-year cost chart becomes five of these stacked, which shows that the 2026 jump happened in one marking period rather than across a year.

3 · The bell schedule

Period 3 and period 6 carry the load. First period is nearly empty, which is worth asking a principal about.

fewermore logins

Where it shines: it removes false alarms. Half of "why did usage drop?" questions are answered by a calendar, and none of our round 1 charts could answer them. Where it strains: it needs calendar data, and we only have part of it. The component library already ships thisSchoolYearPreset() and lastSchoolYearPreset(), so the system knows where a school year starts and ends. It does not know a district's marking periods, breaks, testing windows or bell schedule, and those are exactly what these three displays run on. A wrong calendar is worse than none. What it would take in Frost: a calendar-heatmap recipe with a mandatory "no data day" treatment, the ribbon, and the period grid, all three reusing round 1's sequential ramp. There is a head start on the third: cl-shad-lib already has a day-of-week usage heatmap that shades one hue by alpha and carries a faded array for weekends and holidays. That faded array is the same idea as "no school is blank", already shipped, just never promoted into Frost or given a legend.

D · Density

The dense end

Quiet Emphasis is generous on purpose. This is its opposite, built to argue with it: the school comparison as an instrument for someone who lives in this screen all day and already knows what every column means.

/ filters sortj k move open 18 schools · 6 shown · sorted by variance from district
SchoolTypeUsersDaily/uservs distLoginsResLic usedUnused $Flag

Rows are 36px with 13px text, the figure the tables exploration proposes. The head stays at 44px because shrinking it costs the sort target. In-row buttons are forfeited, which is what makes 36px legal at all.

Where it shines: six schools become eighteen without scrolling, and the analyst stops paging. Every column is comparable because everything is tabular and nothing is decorated. Where it strains: it is unreadable to the audience that matters most. A superintendent opening this once a quarter gets a wall. It is also a Frost exception, not a Frost variant: the 44px row and the card recipe are system defaults, and a density mode has to be scoped and written down or it leaks. What it would take in Frost: exactly the two tokens the tables exploration already proposes, with its scoping rules attached, plus a decision that density is a user setting rather than a screen's choice.

E · Evidence

The diverging ramp

Frost has no diverging ramp, and sections A, B and D all need one. This is the proposal, built from hues already in the system and validated rather than eyeballed.

The ramp

Seven steps. Cool pole is Frost blue. Warm pole is the --tenant-mark hue family at H17 to H18, picked because it is native to Frost and is not a status color. Using --destructive for "below average" would say broken, and below average is not broken.

Midpoint is Frost's own --muted, a neutral gray, because a diverging midpoint has to read as "nothing". The dataviz rule that blue to aqua fails is why the warm pole is warm: the poles must read as opposite, not merely different.

This argues with a position already on record. The tables exploration rules that "green and gold stay out entirely: every bar is one blue --bar on a --bar-soft track". This ramp keeps the green and gold half of that rule, since terracotta is neither, but it does break the one-hue half. The case for breaking it: that rule was written for magnitude bars, where a second hue would be decoration. On a deviation scale the second hue is the data, because a one-hue scale cannot show which side of the benchmark a school sits on without adding a second channel anyway.

Validator output

PASS below arm light #DEA791 → #C76843 → #9D4E2F light end 2.09:1, hue spread 1° PASS above arm light #7FB3DE → #3B8ECE → #296EA3 light end 2.23:1, hue spread 1° PASS poles light #9D4E2F ↔ #296EA3 CVD ΔE 17.5 (protan) · normal ΔE 21.8 · both ≥3:1 PASS below arm dark #874223 → #A9522D → #D27B56 light end 2.22:1 PASS above arm dark #2E5C80 → #3F82B8 → #5FA8E0 light end 2.31:1 PASS poles dark CVD ΔE 19.5 (deutan) · normal ΔE 23.0 · both ≥3:1

Two candidates were re-stepped rather than accepted: the light blue arm started at #8DBDE2 and measured 2.00:1, just under the 2:1 floor, and the dark warm arm started at #793B20 at 1.92:1. Both moved one step.

One caveat stated plainly: running the pole pair through the categorical checker also reports a lightness-band failure on the dark blue pole. That check exists so categorical slots share a common lightness band, which is the opposite of what a diverging ramp wants. Separation and contrast are the checks that apply, and both pass.

The residual risk. Warm still reads as "bad" to many people no matter what the legend says. The mitigations here are that the legend uses no valence words, the annotation sentences never say worse, and the scale is always labeled with the benchmark it diverges from. If testing shows people read terracotta as failure anyway, the fallback is a single-hue scale with the benchmark drawn as a line, which loses the shape but keeps the honesty.

F · Recommendation

What to carry forward

Two of the four are ready to become rules. One is blocked on data we may not have. One should stay an argument rather than become a screen.

Take it

Compared with what

The biggest gap in round 1. It changes what the data says rather than how it looks, and the ramp is validated and ready. Start with diverging bars in the school comparison and the bullet graph on KPIs that have a target.

Take the comment

The school's own paper

The whole report card may be too much, but the comment line should ship regardless of direction. One plain sentence naming the finding and its dollar value is the most valuable thing on either page, and it works inside Quiet Emphasis unchanged.

Blocked, then take it

The school year

Right idea, dependent on calendar data. Find out whether ClassLink can know a district's breaks and marking periods. If it can, this is the highest-value addition on the page. If it cannot, build nothing: a wrong calendar is worse than none.

Keep as an argument

The dense end

Its job was to test whether Quiet Emphasis is right, and it did: generous wins for the audience that opens Analytics+ occasionally, which is most of them. Do not ship it as a screen. Do let it settle the density question, which is a user setting and needs the two tokens the tables exploration already proposes.

Candidate rules not accepted · for discussion

Diverging scale

Two opposite hues plus a neutral gray midpoint, never a status color at either pole, and never a hue at the midpoint. Always labeled with the benchmark it diverges from. The legend carries no valence words, because "different from the district" is a fact and "worse" is a judgment.

Ramp proposed and validated in section E. Proposed tokens --div-b1..3, --div-mid, --div-a1..3.

Benchmark marks

A bullet graph carries actual, target and the usual range. The range bands are neutral grays, never a stoplight. The target is a single dark tick, not a filled region, so it cannot be mistaken for a value.

New. Fills the case where a stat tile has a target and currently shows only the actual.

No data is not zero

A period with no school, no data or no license gets its own visible treatment and its own legend entry. It is never rendered as a low value on the scale. This applies to calendar cells, table cells and chart gaps alike.

New, and the most portable rule on this page. It also covers the divide-by-zero em dash the tables exploration already requires.

The comment line

Every summary surface carries one plain sentence that names the finding, its size, and what it would take to act. Written at a reading level a parent could follow, which is the bar state report cards mostly miss.

Extends round 1's annotation rule from charts to pages. Inherits the tables exploration's standing rule that a mark is never the only representation, which is why every chart here keeps its table twin.

Row density is a setting, and it is not the Density control

Compact is 36px rows with 13px text, body only, head unchanged, no in-row buttons. It belongs to the reader, not to the screen, so it is chosen once and applies everywhere. It is a table row-height token and must be named apart from the library's shipped Density presets, which rescale the spacing ramp across eight components and move nothing in an app.

Adopts Frost/explorations/tables/DECISIONS.md Part 1 §2 unchanged, adds the setting-not-screen decision, and adds the naming split.

Compare like with like

A benchmark is only honest between comparable units. An elementary school and a high school do not share a baseline, so the default comparison group is the grade band, and the label always says which group it is.

New, and a data question before it is a design one.

Open questions

  1. Can ClassLink know a district's calendar: marking periods, breaks, bell schedule? Section C depends entirely on it.
  2. Is the comparison group the district, the grade band, or a peer set of similar districts?
  3. Does the report card framing survive contact with a principal, or does any rating read as a grade no matter how it is worded?
  4. Is row density a user setting, a screen choice, or not offered at all? And does it get a name that cannot be mistaken for the library's shipped Density presets?
  5. Carried over from round 1 and still open: what "Total" means in the school comparison, and whether to re-step the categorical palette.
G · Sources

Research behind this page

  • ExcelinEd, School report cards and the My School Information Design Challenge, which ran the same kind of redesign exercise on school data that the boarding-pass exercise ran on tickets.
  • Data Quality Campaign via The 74, most state report cards are easier to find but still written at a college reading level. The source of the comment-line reading-level rule.
  • National PTA, A state guide to building online school report cards.
  • Tableau, What is a bullet graph, and the bullet graph definition: one primary measure, a comparative measure, and qualitative ranges.
  • Better Evaluation, dot plots, bullet charts and slopegraphs; slope chart.
  • Vignelli's Unigrid specifications for the National Park Service: one grid that many units fill their own way, with a shared band carrying identity. The closest published precedent for the Frost suite's own problem, and an ancestor of round 1's ink band.
  • Internal prior art checked before building, so nothing here is reinvented: Frost/explorations/concepts/evidence-engine.html for prose over data, cl-shad-lib's day-of-week heatmap for the faded no-data treatment, the library's school-year date presets, the shipped Density presets, and the dead School comparison rail item in Frost/suite/analytics-plus-frost.html. Confirmed absent everywhere: any diverging ramp, slopegraph, dot plot, bullet graph, calendar-grid heatmap, map or school-artifact idiom. Also: Frost/explorations/tables/DECISIONS.md Part 1 §2 for the density tokens and §6 for the inline bar; UX_tools _contract.scss at 2f75211 for every token; the dataviz skill's form, color, mark and anti-pattern references and its palette validator.

← Back to round 1