Add promo/, and the first piece: the foundation nobody shared - #58
Merged
Conversation
Promotional material built from measured facts rather than from claims. Six real XAF applications by one author share 16 class names and 60 property names, and zero base classes: the same vocabulary every time, the structure rebuilt from XPO primitives every time. Drawn as an engineer's elevation sheet, because the base class is a foundation and the sheet can measure its absence. Elevation heights are proportional to entity count at a computed 2.2511 px per entity, stated in the title block beside the six module paths the numbers were read from. Windows, parapets and earth hatching are drafting detail, never data wearing a costume. The generator is the deliverable that matters. build-foundation.py holds the numbers in one table and recomputes every coordinate from them, because a piece nobody can regenerate quietly becomes wrong -- these totals were a controller and an action out of date in this repository's own notes within four days of being recorded, which is how the re-measure was noticed at all. Made with the Epic Infographics skill (MIT, OrRon/EpicInfographics). Its preflight measures real glyph geometry and refuses to render on a text collision; it ran clean before every render here. Two review loops were needed and both are worth recording: the first draft failed the skill's own squint test -- cover the text and it was hatched bars on graph paper, a layout that would hold any dataset -- and the second still had the footings hiding the earth, so the foundations did not read as foundations. promo/README.md records two constraints this piece does NOT meet, because finding them after posting would be worse. build-shorts.py reserves 300px top and 400px bottom for the interface the platforms draw over a vertical video, and this piece puts its title and its title block outside that band -- so it is a poster and a still, not a platform short. And it is drawn in the skill's blueprint palette rather than the house palette in scene_kit.py, whose own comment is the argument against mixing them. Meeting both would be a different piece rather than a setting, and that is a decision, not an oversight. No source changes. 556 tests unaffected. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W45tzJFX3NoSrk7svtQeKT
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A
promo/folder, and the first piece in it: six real XAF applications by one author share 16 class names and 60 property names, and zero base classes.The same vocabulary every time. The structure rebuilt from XPO primitives every time.
Built from measurements, not from claims
Every number was read by running
xaflogic wikiover the six module directories, on 2026-08-28:The re-measure is the reason the generator exists. The repository's own notes recorded 405 / 111 / 98; the real figures are 405 / 112 / 99. A controller and an action drifted within four days, unnoticed, because they were recalled rather than read.
build-foundation.pykeeps them in one table and recomputes every coordinate from it, so refreshing the piece is editing six rows.The drawing
The base class is a foundation, so the piece is an engineer's elevation sheet that can measure its absence. Elevation heights are proportional at a computed 2.2511 px per entity — stated in the title block, beside the six paths the numbers came from, so a reader can check the claim rather than trust it. Windows, parapets and earth hatching are drafting detail; none of them is data wearing a costume.
Made with the Epic Infographics skill (MIT). Its preflight loads the page headless, measures real glyph geometry and refuses to render on a collision — it ran clean before every render here.
Two review loops were needed, and both are worth recording. The first draft failed the skill's own squint test: cover the text and it was hatched bars on graph paper, a layout that would hold any dataset unchanged. The second still had the footings covering the earth, so the foundations did not read as foundations. Neither would have been caught by looking at the code.
Two constraints this piece does not meet
Recorded in
promo/README.mdrather than discovered after posting.docs/Blog/video/build-shorts.pyreservesSAFE_TOP, SAFE_BOTTOM = 300, 400because TikTok, Reels and Shorts draw their own interface over the top and bottom of a vertical frame. This piece puts its title near the top edge and its title block near the bottom, so posting the MP4 as a platform short would hide both. It is a poster and a still: safe as a feed image, an OG card, a slide or a print handout.blueprintlanguage, not the house palette inscene_kit.py(#07090cground,#ff8a3daccent). That file's own comment is the argument: a short that does not match the film it promotes looks like somebody else made it.Meeting both would mean recomposing inside a 1220px band and re-skinning — a different piece, not a setting. Worth doing if these are to sit beside the eight shorts in
docs/Blog/video/; not worth doing ifpromo/stays posters. That is the call to make on this PR.Contents
promo/README.md— what is here, how to regenerate it, and the two constraints abovepromo/build-foundation.py— the generator; the numbers live in one table at the toppromo/foundation/— PNG 2160×3840, MP4 8.4s, GIF, and the self-contained HTML source4.4 MB of renders. They are the shareable artefacts, so they are committed rather than regenerated on demand — but every one of them comes back from the generator if that trade stops being worth it.
No source changes. 556 tests unaffected.
🤖 Generated with Claude Code
https://claude.ai/code/session_01W45tzJFX3NoSrk7svtQeKT