Vision Rules demo assets — built by scripts/vision_pack_assets.py
One folder per model under models/<id>/ (EfficientNet-B0 concept
bottleneck + two single-cut TT-Sparse rulebooks). Each checkpoint keeps
only backbone.* and concept_head.*: the label head is unused, the
verdict is the rulebook's.

[gender] female / male — 39 celeba_all concepts
  run        get_concept_into_rules/runs/celeba/efficientnet_b0_sequential/exp_3
  checkpoint final/best_checkpoint.pt (neural head test accuracy 95.30%, unused)
  compact    ttsparse_30n5b_median_drop0.5_i0.json (6 rules, test 95.01%)
  accurate   ttsparse_30n5b_median_i0.json (26 rules, test 95.65%)

[age] under_20 / 20_plus — 11 age_cues_v4 concepts
  run        get_concept_into_rules/runs/fairface/efficientnet_b0_sequential/exp_4
  checkpoint final/best_checkpoint.pt (neural head test accuracy 91.97%, unused)
  compact    ttsparse_30n5b_drop0.5_i0.json (11 rules, test 91.37%)
  accurate   ttsparse_30n5b_i0.json (17 rules, test 91.53%)

[age-grounded] under_20 / 20_plus — 8 age_grounded concepts
  run        get_concept_into_rules/runs/fairface/efficientnet_b0_sequential/exp_6
  question   age (the cue set chosen first)
  checkpoint final/best_checkpoint.pt (neural head test accuracy 89.46%, unused)
  compact    ttsparse_30n5b_median_drop0.5_i0.json (7 rules, test 87.11%)
  accurate   ttsparse_30n5b_median_i0.json (13 rules, test 88.23%)

Gallery photos are the demo's test faces, EXIF-transposed and downscaled
to 640 px, shared by every model. Ids: carla, famous, haaland, harry, mbappe, pam, strangerthings
Regenerate one model: python scripts/vision_pack_assets.py <repo>/<run> --id <id>
