Files
troupe-standup/wizard-work/ledger/CHECK
T

75 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# CHECK — check-in census extract (Extract lane, 2026-10-27).
# Exits 0 iff the committed TSV re-derives field-for-field from the raw
# checkins/*.md files. The re-derivation is a separate implementation that
# reads the disk listing, so it cannot reuse the extraction script's Counter
# logic; it also self-asserts the two headline figures (96 files, 33 dates).
set -u
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1
ROOT=/root/troupe-standup
SRC=$ROOT/checkins
TSV=2026-10-27-checkin-census.tsv
[ -f "$TSV" ] || { echo "FAIL: $TSV missing"; exit 1; }
python3 - "$SRC" "$TSV" <<'PY'
import collections
import os
import re
import sys
src, tsv = sys.argv[1], sys.argv[2]
per_date = collections.Counter()
per_wizard = collections.Counter()
for fn in os.listdir(src):
if not fn.endswith('.md'):
continue
name = fn[:-3]
if not re.match(r'^\d{4}-\d{2}-\d{2}-', name):
continue
date = name[:10]
rest = name[11:]
wizard = re.sub(r'-\d+$', '', rest)
per_date[date] += 1
per_wizard[wizard] += 1
# Independent re-derivation of the per-wizard table (same canonical sort:
# count desc, name asc).
expected = []
for w in sorted(per_wizard, key=lambda w: (-per_wizard[w], w)):
expected.append((w, str(per_wizard[w])))
with open(tsv, encoding='utf-8') as f:
header = f.readline().rstrip('\n')
actual = []
for line in f:
line = line.rstrip('\n')
if line:
actual.append(tuple(line.split('\t')))
if header != 'wizard\tcheckin_files':
print('FAIL: unexpected header: %r' % header)
sys.exit(1)
if expected != actual:
print('FAIL: re-derived table != committed TSV')
print('expected:')
for r in expected:
print('\t'.join(r))
print('actual:')
for r in actual:
print('\t'.join(r))
sys.exit(1)
if sum(per_date.values()) != 96:
print('FAIL: expected 96 date-prefixed files, got %d' % sum(per_date.values()))
sys.exit(1)
if len(per_date) != 33:
print('FAIL: expected 33 distinct dates, got %d' % len(per_date))
sys.exit(1)
print('OK: checkin-census.tsv verified (%d rows, %d files, %d dates)' % (len(actual), sum(per_date.values()), len(per_date)))
PY