packets-all asserts the triangle per zone

The funnel page vanished from all 28 packets during the group-set work
and nothing failed: funnelPage omits when its data is null, and the
builder supplying that data returns null on any internal error. The two
silences compose into a page that simply is not there.

It was caught by a probe looking for the tip's "1 of 28" text, which is
luck rather than method. Asserting presence per zone makes the two cases
distinguishable: "every packet lost one page" shows as 28 failures in
one column, while "this packet has no data for it" would show as one.

28 of 28 now report map, funnel, groups and sets with no failures.
This commit is contained in:
Doxa Maps 2026-09-28 23:05:12 +00:00
parent c54bde307f
commit 1fb6d6890a

View file

@ -97,9 +97,15 @@ if (!files.length) {
const hasMap = /<img|<svg/.test(firstSheet)
const groups = (html.match(/class="card"/g) || []).length
const sets = /sheet-sets/.test(html)
// ★ THE TRIANGLE, asserted per zone because it went missing from ALL 28 packets once and
// nothing failed: funnelPage omits when its data is null, and the builder that supplies that
// data swallows errors into null. "Every packet lost one page" and "this packet has no data
// for it" look identical from inside one packet — only the per-zone table tells them apart.
const funnel = /funnel-title/.test(html)
const zone = f.replace(/\.html$/, '')
report.push(`${hasMap ? '✓' : '✗'} ${zone} groups=${groups} map=${hasMap ? 'yes' : 'NO'} sets=${sets ? 'yes' : 'no'}`)
report.push(`${hasMap && funnel ? '✓' : '✗'} ${zone} groups=${groups} map=${hasMap ? 'yes' : 'NO'} funnel=${funnel ? 'yes' : 'NO'} sets=${sets ? 'yes' : 'no'}`)
if (!hasMap) failures.push(`${zone}: page 1 has no map — the lifted poster is missing (bun run posters, then regenerate)`)
if (!funnel) failures.push(`${zone}: no funnel page — its data builder swallows errors into null, so check the generator run, not just this file`)
if (!(groups > 0)) failures.push(`${zone}: ZERO group rows — a packet of nobody`)
}
console.log(`PACKETS-ALL (headless): ${files.length} packet(s) checked`)