matrix.ts
@file The compatibility matrix: pure formatting, no D1 and no Discord…
Overview
@file The compatibility matrix: pure formatting, no D1 and no Discord
wire types, so it is testable without either.
Only two of the four documented glyphs are reachable yet. ✅ (validated)
and ❌ (known-broken) both come from test *results*, which is the
/test-request + /test-result machinery — not built. Showing them here
would be a status this bot has not actually observed, so for now every
cell is either ⚠️ (someone owns that board/iOS pair) or ❓ (nobody does).
matrixTable takes an optional results map so this file does not need to
change again once that phase lands.
depends on boards.ts rigs.ts · used by matrix.ts render.ts validations.ts
flowchart TD cellText --> countFor cellText --> glyphFor cellText --> resultFor
API
Fexport function compareVersions(a: string, b: string): number
Compare dot-separated numeric version strings ("9.1" < "19.1" < "19.1.2"), not lexicographically ("19.1" would otherwise sort before "9.1"). Missing trailing segments compare as 0, so "19.1" < "19.1.2".
Fexport function distinctVersions(counts: readonly MatrixCount[]): string[]
Every iOS version with at least one registered owner, ascending.
buildMatrixImage, matrixTableFexport function matrixTable(counts: readonly MatrixCount[], results: readonly ValidationStatus[] = []): string | null
A monospace grid: rows are every known board (in the order boards.ts lists them, even ones with zero owners — an all-❓ row is the signal this bot exists to surface), columns are every iOS version seen in the registry, ascending. Returns null if the registry has no iOS versions recorded at all, since there is then no column axis to draw.
textFallback · calls boardLabel, cellText, distinctVersions, padUndocumented (6)
glyphFor, countFor, resultFor, cellText, colWidth, pad