Build the set of rows emitted for one article. An article with multiple tiers and multiple violations produces tiers.length * max(1, violations.length) rows (one per (tier, violation) pair), so the reviewer can trace every violation back to the tier that will fix it.
An article with zero violations still emits one row per tier so reviewers can sanity-check the tier assignment even when everything is green.
Build the set of rows emitted for one article. An article with multiple tiers and multiple violations produces
tiers.length * max(1, violations.length)rows (one per (tier, violation) pair), so the reviewer can trace every violation back to the tier that will fix it.An article with zero violations still emits one row per tier so reviewers can sanity-check the tier assignment even when everything is green.