Triangles and Matrix Tables
A triangular grid—how are the empty positions filled?
✅ NormativeSettled. The requirement holds as written.📄 Page ruleCan be applied from the page alone.Read §9.8.2 in the RFC ↗
Every row MUST carry the full column count. The jagged half MUST be padded with individual
empty cells — one <td></td> per missing position. A colspan or rowspan over the empty region
MUST NOT be used, and a 0 or any other value MUST NOT be invented.
When it applies
Loss development exhibits and similar matrices are jagged on purpose. The missing half is meaningfully empty — that development period has not happened yet — not data that failed to be read.
Accident yr | 12mo | 24mo | 36mo |
| 2021 | 450 | 512 | 530 |
| 2022 | 470 | 528 | | ← structurally empty,
| 2023 | 465 | | | not "failed to read"
Reading the examples. Each one pairs a source page with the output the rule expects. ✅ Sample: the rule applies. ❌ Counter-sample: it looks like it applies and does not, or a rendering got it wrong. A non-conforming output, in red, is shown only for contrast. … marks content left out of an excerpt.
Requirements
- The shape MUST be kept. Every row has the full column count; the cells past the end of the row are present and empty. Rows MUST NOT be truncated.
- One empty cell per missing position. Four unhappened periods are four
<td></td>, not onecolspan="4". The span would say "this region is one thing", and it is not — it is four distinct coordinates that each have not happened yet. - The empty half MUST NOT be padded with values. Filling it with
0,n/aor a repeat of the last figure destroys the only thing the triangle asserts. - A printed value MUST NOT be read as structural emptiness either. Some pages print
0across the future half. A zero is a claim and a blank is an absence; the output MUST render whichever the page prints. - A cell that is empty because it cannot be read is a different situation — see Cell Text Fidelity (§9.6.3).
Stacked loss-development exhibits where the empty lower-right is meaningfully emptyppy
those development periods have not happened. Every row of the first triangle carries all eleven cells. The column headers are underlined, not bold.
Source page

Expected output · table 1 of 3
| Accident Year Ended | 15 | 27 | 39 | 51 | 63 | 75 | 87 | 99 | 111 | 123 |
|---|---|---|---|---|---|---|---|---|---|---|
| 12/31/2003 | 418,550,936 | 418,042,452 | 417,267,765 | 417,492,929 | 417,216,932 | 417,189,136 | 417,146,522 | 417,095,498 | 417,140,320 | 417,120,054 |
| 12/31/2004 | 431,833,889 | 427,373,100 | 425,430,426 | 425,032,454 | 424,899,046 | 424,930,538 | 424,893,684 | 424,824,851 | 424,784,418 | 424,738,538 |
| 12/31/2005 | 471,370,885 | 466,106,849 | 464,434,610 | 463,396,915 | 463,268,706 | 463,175,541 | 463,165,720 | 463,139,866 | 463,075,855 | 463,014,244 |
| 12/31/2006 | 463,200,919 | 457,725,282 | 455,822,189 | 454,841,890 | 455,017,266 | 455,000,340 | 454,915,676 | 454,822,382 | 454,797,996 | |
| 12/31/2007 | 515,029,169 | 510,374,742 | 508,154,461 | 507,592,525 | 507,251,378 | 507,252,665 | 507,124,706 | 507,069,577 | ||
| 12/31/2008 | 547,084,231 | 543,696,826 | 542,151,638 | 541,255,839 | 540,913,464 | 540,904,143 | 540,713,622 | |||
| 12/31/2009 | 459,114,867 | 455,232,703 | 454,478,144 | 454,047,620 | 454,108,281 | 453,794,733 | ||||
| 12/31/2010 | 511,853,602 | 507,399,547 | 506,256,705 | 506,014,933 | 506,071,619 | |||||
| 12/31/2011 | 571,554,254 | 566,987,304 | 565,194,620 | 564,927,450 | ||||||
| 12/31/2012 | 603,862,305 | 602,282,512 | 600,316,599 | |||||||
| 12/31/2013 | 591,546,839 | 588,047,899 | ||||||||
| 12/31/2014 | 656,279,959 |
The same shape, filled differentlywaiox
the un-earned future half is printed with explicit 0s rather
than left blank. A zero is a claim; a blank is an absence — here every 0 is kept.
Source page

Expected output · table 1 of 2, excerpt
| Medical | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Incurred Month | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Paid Month | 202401 | 202402 | 202403 | 202404 | 202405 | 202406 | 202407 | 202408 | 202409 | 202410 | 202411 | 202412 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 202401 | 41,539 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 202402 | 191,691 | 29,902 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 202403 | 90,233 | 324,478 | 55,730 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 202404 | 11,157 | 20,717 | 326,646 | 70,804 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 202405 | 5,533 | 8,224 | 429,936 | 308,025 | 125,102 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 202406 | 283 | -45,171 | 36,806 | 13,870 | 241,742 | 52,107 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| … | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Why a span is wrong here, when it is free elsewhere
Blank and Spacer Rows (§9.5.1) leaves the encoding of an unruled empty region free: leading empty cells and one blank spanning block render identically, and neither is preferred.
A triangle is the carve-out. Every empty cell sits at a real coordinate — an accident year crossed with a development period — and "12 months has not elapsed for the 2023 year" is a separate fact from the same statement about 24 months. Collapsed into one span, those coordinates stop being addressable: a consumer can no longer ask what the 2023 row holds at 24 months, because the cell it would look in no longer exists.
Elsewhere the empty region is one undifferentiated blank. Here it is a set of individually meaningful absences that happen to be adjacent.
This is the same principle that settles blank space beside a header in Barely-Existing Columns and Headers (§9.3.1): a span is a claim that the page merged something. The page did not merge these.
Why the blank matters more here than elsewhere
In most tables, blank versus an explicit empty marker is cosmetic. In a loss triangle the blank carries actuarial meaning: it asserts this development period does not exist yet, which is a fact about the world, not a gap in the transcription. That is the same argument that makes the em-dash a value in Marks and Symbols in Cells (§9.6.6) and the coloured fill a value in Color as the Value (§9.6.4) — a non-value that is a value.
Neighbouring rules, and how they differ
More
Rule id tables-triangles-and-matrix-tables · tables encoding empty-cells