# mbr-deck: the December 2025 MBR deck: slides 2 and 6 cropped to their text, one to a row at the full text width (mbr-deck.tex), and all six whole slides two to a row (mbr-deck-sheet.tex).
# Made by: python3 tools/render_exhibits.py mbr-deck
# Commands run from the repo root unless a `$ cd` line says otherwise, each with
# SOURCE_DATE_EPOCH=315532800 so the PDFs carry a fixed date.
# Source: runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/output/slide-map.json
# Source sha256: 3c58a592026be240383f751c799ee2f473c16630cb05af03b290a20a79ec23b5
# Inputs (sha256  path):
#   3c58a592026be240383f751c799ee2f473c16630cb05af03b290a20a79ec23b5  runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/output/slide-map.json
#   36f4fb0f2831b7b4b920ab6e5079fb11dd53d6f67344ce3fa12eea91aee2c048  runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/output/scorecard.json
#   6c376af2543d274e548b23b6821a3bb6e285dec7361d37cda0db05e16fa5a65b  runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/output/mbr.json
#   98cb5b74a47fd274db29f22ec8b320eec1f417974250bd5e26881cc9e6b63a99  runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/output/deck.json
#   20941ba42084f97012388cebdf0fe9066415a48804a4ea7398539119622cb651  runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/result.json
#   20795f27b428471ae05187af9bb3866d4f3bb8fcede7b087ca986b16bee5f79a  packs/management-reporting/skills/deck-assembly/scripts/build_deck.py
#   26be6399095eb3bc4081ce9ca16ab796a264780be52d28081eee51c8aad4183a  packs/management-reporting/_shared/company-branding/assets/brand.json
# check: runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/result.json: passed, and so did each of its 9 checks (script_identity, independent_identity, golden, contract, provenance, binding, deck_titles, sentinels, pack_unchanged)
# scorecard.json is byte-identical to packs/management-reporting/tests/golden/kpi-scorecard.json
# mbr.json is byte-identical to packs/management-reporting/tests/golden/mbr-narrative.json
$ mkdir -p examples/renders/mbr-deck/output
$ cp \
>   runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/output/slide-map.json \
>   runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/output/scorecard.json \
>   runs/20261004-2356-repeat-management-reporting-deck-assembly-2025-12-claude-sonnet-5-5/deck-assembly-2025-12/claude/r1/output/mbr.json \
>   examples/renders/mbr-deck/output/
$ cd examples/renders/mbr-deck
$ python3 ../../../packs/management-reporting/skills/deck-assembly/scripts/build_deck.py \
>   --slide-map output/slide-map.json --output output/deck.json
December 2025 deck: 6 slides, 56 figures, every one from a source. Wrote output/IS_MBR_2025-12.pptx and output/deck.json
# check: IS_MBR_2025-12.pptx sha256 0b56b7130a1336e9e6bca2c42da84efb0b7350d4110454cb3f37a5df3cd67945 equals the deck the run wrote (0b56b7130a1336e9e6bca2c42da84efb0b7350d4110454cb3f37a5df3cd67945)
$ soffice --headless --convert-to pdf --outdir . output/IS_MBR_2025-12.pptx
$ pdftoppm -png -scale-to 2400 IS_MBR_2025-12.pdf slide
# check: every title, subtitle, bullet and cell of the slide map is on its page of IS_MBR_2025-12.pdf
# IS_MBR_2025-12.pptx (python-pptx): slides 13.333 in wide; font sizes, slide by slide, as title / body / footer and source line:
#   slide 1 (December 2025 Monthly Business Review): 36 / 24 / 8 pt
#   slide 2 (Headline): 24 / 16 / 8 pt
#   slide 3 (P&L vs budget): 24 / 11 / 8 pt
#   slide 4 (KPI scorecard): 24 / 11 / 8 pt
#   slide 5 (Drivers): 24 / 16 / 8 pt
#   slide 6 (Watch list): 24 / 16 / 8 pt
# text box: slide 1 (December 2025 Monthly Business Review): the slide map's strings lie in x 50.3..765.8, y 194.1..306.2 pt of the 960 x 540 pt slide; crop (not used): x 26.3 y 170.1 w 763.5 h 160.1 pt; at the text width its body text 24 pt would print at 10.72 pt (whole: 8.53 pt)
# text box: slide 2 (Headline): the slide map's strings lie in x 50.3..611.3, y 34.6..192.5 pt of the 960 x 540 pt slide; crop: x 26.3 y 10.6 w 609.0 h 205.9 pt; at the text width its body text 16 pt would print at 8.96 pt (whole: 5.69 pt)
$ pdftoppm -png -singlefile -f 2 -l 2 -r 283.726 -x 103 -y 42 -W 2400 -H 811 IS_MBR_2025-12.pdf \
>   slide-2-crop
# check: slide-2-crop.png is 2400 x 811 px and holds every string the slide map puts on slide 2 (the crop is their box plus 24 pt); the footer is outside it
# text box: slide 3 (P&L vs budget): the slide map's strings lie in x 50.3..892.8, y 34.6..275.1 pt of the 960 x 540 pt slide; crop (not used): x 26.3 y 10.6 w 890.5 h 288.5 pt; at the text width its body text 11 pt would print at 4.21 pt (whole: 3.91 pt)
# text box: slide 4 (KPI scorecard): the slide map's strings lie in x 50.3..892.7, y 34.6..361.5 pt of the 960 x 540 pt slide; crop (not used): x 26.3 y 10.6 w 890.5 h 374.9 pt; at the text width its body text 11 pt would print at 4.21 pt (whole: 3.91 pt)
# text box: slide 5 (Drivers): the slide map's strings lie in x 50.3..446.7, y 34.6..219.6 pt of the 960 x 540 pt slide; crop (not used): x 26.3 y 10.6 w 444.4 h 233.0 pt; at the text width its body text 16 pt would print at 12.28 pt (whole: 5.69 pt)
# text box: slide 6 (Watch list): the slide map's strings lie in x 50.3..558.1, y 34.6..219.6 pt of the 960 x 540 pt slide; crop: x 26.3 y 10.6 w 555.8 h 233.0 pt; at the text width its body text 16 pt would print at 9.82 pt (whole: 5.69 pt)
$ pdftoppm -png -singlefile -f 6 -l 6 -r 310.902 -x 113 -y 46 -W 2400 -H 1006 IS_MBR_2025-12.pdf \
>   slide-6-crop
# check: slide-6-crop.png is 2400 x 1006 px and holds every string the slide map puts on slide 6 (the crop is their box plus 24 pt); the footer is outside it
# examples/renders/mbr-deck/mbr-deck.tex (slides 2 and 6 cropped, at the full text width) and mbr-deck-sheet.tex (the contact sheet) are written by the tool
# examples/renders/mbr-deck/proof.tex (written by the tool) sets mbr-deck.tex in the book's preamble
$ cd ../../..
$ mkdir -p build/renders/mbr-deck
$ cd build/renders/mbr-deck
$ xelatex -interaction=nonstopmode -halt-on-error ../../../examples/renders/mbr-deck/proof.tex
$ cp proof.pdf ../../../examples/renders/mbr-deck/proof.pdf
# proof.pdf: 1 page(s); the fragment is 294.3pt tall on a 494.0pt text block, leaving room for a caption of 13.0 lines; log build/renders/mbr-deck/proof.log
$ cd ../../..
$ cd examples/renders/mbr-deck
$ pdfimages -list proof.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image    2400   811  rgb     3   8  image  no         5  0   506   506 80.1K 1.4%
   1     1 image    2400  1006  rgb     3   8  image  no         8  0   506   506  101K 1.4%
# measure (mbr-deck.tex): slide 2 (Headline) is set 4.74 in wide (2400 px at 506 ppi) of its crop's 8.459 in, so 0.5607 of its size: body text 16 pt prints at 8.97 pt, the title 24 pt at 13.46 pt
# measure (mbr-deck.tex): slide 6 (Watch list) is set 4.74 in wide (2400 px at 506 ppi) of its crop's 7.719 in, so 0.6144 of its size: body text 16 pt prints at 9.83 pt, the title 24 pt at 14.75 pt
# check: the body text of every slide in mbr-deck.tex prints at 8.0 pt or more
# examples/renders/mbr-deck/proof-sheet.tex (written by the tool) sets mbr-deck-sheet.tex in the book's preamble
$ cd ../../..
$ mkdir -p build/renders/mbr-deck
$ cd build/renders/mbr-deck
$ xelatex -interaction=nonstopmode \
>   -halt-on-error ../../../examples/renders/mbr-deck/proof-sheet.tex
$ cp proof-sheet.pdf ../../../examples/renders/mbr-deck/proof-sheet.pdf
# proof-sheet.pdf: 1 page(s); the fragment is 345.4pt tall on a 494.0pt text block, leaving room for a caption of 9.4 lines; log build/renders/mbr-deck/proof-sheet.log
$ cd ../../..
$ cd examples/renders/mbr-deck
$ pdfimages -list proof-sheet.pdf
page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
   1     0 image    2400  1351  rgb     3   8  image  no         5  0  1047  1047 51.6K 0.5%
   1     1 image    2400  1351  rgb     3   8  image  no         8  0  1047  1047 86.4K 0.9%
   1     2 image    2400  1351  rgb     3   8  image  no         9  0  1047  1047  107K 1.1%
   1     3 image    2400  1351  rgb     3   8  image  no        10  0  1047  1047  126K 1.3%
   1     4 image    2400  1351  rgb     3   8  image  no        11  0  1047  1047 82.1K 0.9%
   1     5 image    2400  1351  rgb     3   8  image  no        12  0  1047  1047 92.8K 1.0%
# measure (mbr-deck-sheet.tex, not checked): slide 1 (December 2025 Monthly Business Review) is set 2.29 in wide (2400 px at 1047 ppi) of its 13.333 in, so 0.1719 of its size: body text 24 pt prints at 4.13 pt, the title 36 pt at 6.19 pt
# measure (mbr-deck-sheet.tex, not checked): slide 2 (Headline) is set 2.29 in wide (2400 px at 1047 ppi) of its 13.333 in, so 0.1719 of its size: body text 16 pt prints at 2.75 pt, the title 24 pt at 4.13 pt
# measure (mbr-deck-sheet.tex, not checked): slide 3 (P&L vs budget) is set 2.29 in wide (2400 px at 1047 ppi) of its 13.333 in, so 0.1719 of its size: body text 11 pt prints at 1.89 pt, the title 24 pt at 4.13 pt
# measure (mbr-deck-sheet.tex, not checked): slide 4 (KPI scorecard) is set 2.29 in wide (2400 px at 1047 ppi) of its 13.333 in, so 0.1719 of its size: body text 11 pt prints at 1.89 pt, the title 24 pt at 4.13 pt
# measure (mbr-deck-sheet.tex, not checked): slide 5 (Drivers) is set 2.29 in wide (2400 px at 1047 ppi) of its 13.333 in, so 0.1719 of its size: body text 16 pt prints at 2.75 pt, the title 24 pt at 4.13 pt
# measure (mbr-deck-sheet.tex, not checked): slide 6 (Watch list) is set 2.29 in wide (2400 px at 1047 ppi) of its 13.333 in, so 0.1719 of its size: body text 16 pt prints at 2.75 pt, the title 24 pt at 4.13 pt
$ cd ../../..
