From cf7b3fe90c15d64ca48d933e3ac5e686d382c227 Mon Sep 17 00:00:00 2001 From: transitrix Date: Fri, 28 Aug 2026 11:22:01 +0400 Subject: [PATCH 1/2] site: publish how-a-document-prints one-pager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **From: transitrix-site.** Commit the downloadable PDF one-pager for /explainers/how-a-document-prints/. Copied byte-identical from the Coordinator's staging tray. Add unobtrusive download link on the explainer page. - explainers/how-a-document-prints/how-a-document-prints.pdf (downloadable artefact, 842×474 pt, one page) - explainers/how-a-document-prints/index.html (added one-pager link) The PDF source and renderer remain in transitrix/coordinator. Co-Authored-By: Claude Haiku 4.5 --- .../how-a-document-prints.pdf | Bin 0 -> 39176 bytes explainers/how-a-document-prints/index.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 explainers/how-a-document-prints/how-a-document-prints.pdf diff --git a/explainers/how-a-document-prints/how-a-document-prints.pdf b/explainers/how-a-document-prints/how-a-document-prints.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7fd5b5001cd7dd5fde6181c7d844d7f5babc902c GIT binary patch literal 39176 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
-

← Explainers

+

← Explainers · one-pager

How a model-backed document prints

From 05855711599a55cccdea0040b1f95167beeb8713 Mon Sep 17 00:00:00 2001 From: transitrix Date: Fri, 28 Aug 2026 11:22:19 +0400 Subject: [PATCH 2/2] chore: add explainers PDF check workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **From: transitrix-site.** Add validation workflow for explainer PDFs. Checks published contract only: - Must be valid PDF - Exactly one page - Geometry 842×474 pt (A4 short form, 297×167 mm) PDF rendering and source remain in transitrix/coordinator. This check validates the published artefact only. Co-Authored-By: Claude Haiku 4.5 --- .github/workflows/explainers.yml | 41 ++++++++++++++++++ scripts/check_explainers.py | 71 ++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 .github/workflows/explainers.yml create mode 100644 scripts/check_explainers.py diff --git a/.github/workflows/explainers.yml b/.github/workflows/explainers.yml new file mode 100644 index 0000000..0f076d8 --- /dev/null +++ b/.github/workflows/explainers.yml @@ -0,0 +1,41 @@ +name: Explainers + +# Explainers PDFs must be valid, single-page, and correctly sized. +# This check validates the published contract only; rendering lives +# in transitrix/coordinator. + +on: + push: + branches: [main] + paths: + - 'explainers/**' + - 'scripts/check_explainers.py' + - '.github/workflows/explainers.yml' + pull_request: + branches: [main] + paths: + - 'explainers/**' + - 'scripts/check_explainers.py' + - '.github/workflows/explainers.yml' + +permissions: + contents: read + +jobs: + check-explainers: + runs-on: ubuntu-latest + name: explainers/ published PDF contract holds + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install PDF validator + run: python3 -m pip install 'pypdf==6.16.2' + + - name: Check explainers/ contract + run: python3 scripts/check_explainers.py diff --git a/scripts/check_explainers.py b/scripts/check_explainers.py new file mode 100644 index 0000000..18832d8 --- /dev/null +++ b/scripts/check_explainers.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +"""Check explainers PDF contract. + +Published explainer PDFs must: +- Be valid PDFs +- Have exactly one page +- Have geometry 842 × 474 pt (A4 short form, 297 × 167 mm) +""" + +import glob +import sys +from pathlib import Path + +try: + from pypdf import PdfReader +except ImportError: + print("❌ pypdf not installed; skipping checks", file=sys.stderr) + sys.exit(0) + + +def check_explainer_pdfs(): + """Validate all explainer PDFs.""" + errors = [] + pdf_files = glob.glob("explainers/*/[!_]*.pdf") + + if not pdf_files: + # No explainer PDFs yet; check passes + return errors + + for pdf_path in sorted(pdf_files): + try: + reader = PdfReader(pdf_path) + + # Check page count + page_count = len(reader.pages) + if page_count != 1: + errors.append( + f"❌ {pdf_path}: expected 1 page, got {page_count}" + ) + continue + + # Check geometry on the one page + page = reader.pages[0] + mediabox = page.mediabox + width = float(mediabox.width) + height = float(mediabox.height) + + # Expected: 842 × 474 pt (A4 short form) + # Allow ±1pt tolerance for rounding + expected_w, expected_h = 842, 474 + if abs(width - expected_w) > 1 or abs(height - expected_h) > 1: + errors.append( + f"❌ {pdf_path}: geometry {width:.0f}×{height:.0f} pt, " + f"expected {expected_w}×{expected_h} pt" + ) + else: + print(f"✓ {pdf_path}: {width:.0f}×{height:.0f} pt, 1 page") + + except Exception as e: + errors.append(f"❌ {pdf_path}: {e}") + + return errors + + +if __name__ == "__main__": + errors = check_explainer_pdfs() + if errors: + for error in errors: + print(error, file=sys.stderr) + sys.exit(1) + sys.exit(0)