Skip to content

Draw the thesis lifecycle, and give crucible its own generated header - #16

Merged
HarperZ9 merged 1 commit into
mainfrom
feat/repo-art-and-diagrams
Sep 3, 2026
Merged

HarperZ9 merged 1 commit into
mainfrom
feat/repo-art-and-diagrams

Conversation

@HarperZ9

@HarperZ9 HarperZ9 commented Sep 3, 2026

Copy link
Copy Markdown
Owner

The README explains the engine well and shows nothing. A reader has to assemble
the run from a feature list. This adds a header and a workflow diagram, and the
machinery that keeps both true.

The picture is generated from a spec

docs/art/crucible.art.json holds the words. Both SVGs are pure functions of
it, so tests/test_repo_art.py re-renders and compares bytes. Artwork that
stops matching its own text fails the suite instead of drifting quietly, which
is the normal fate of a picture in a README: nobody diffs it.

Byte stability across platforms comes from a fixed feTurbulence seed, a
random.Random(int) corona, 2-decimal coordinate formatting, and a renderer
that writes with newline="". The repository's existing * text=auto eol=lf
already covers checkout, so no .gitattributes change was needed.

The diagram is grounded in the code, not the highlights list

I read run_cmd._run_once and refine rather than working from the feature
bullets. Two edges carry the design.

The loop back from Cohesion to Measure is the refine step. Grading each claim
yields a margin, the harmonic mean of those margins is the cohesion, and a
round that is not cohesive names its weakest axis and measures that axis again
instead of reporting a thesis that only half held.

The edge that does not loop is verdict_for: a pure function of a deviation
and a tolerance, with no model in it. An axis that could not be measured reads
UNVERIFIABLE rather than holding.

New gate for a failure nothing was catching

test_the_tagline_stays_inside_its_rule. The header tagline is one unwrapped
line of 21px text under a rule that ends at x=700. A longer one runs on toward
the aperture and stops being readable, and the render still succeeds. The bound
counts characters, so it is a guardrail set at the widest tagline that has been
looked at on a rendered page, not a typographic measurement: it cannot tell
mmmm from iiii. Stated that way in the test so nobody reads it as exact.

Two gates carried over from the gather change also apply here:
test_no_card_note_loses_its_ending_to_the_wrapper catches the wrapper's
silent three-line truncation, and test_a_return_edge_stays_on_its_own_row
catches a backward edge routed straight through the cards between two rows.

Identity

The corona seeds from sha256 of the repository name, so crucible draws a
different aperture from flywheel and gather while keeping the same form.
test_each_repository_gets_its_own_drawing checks that rather than asserting
it in a doc.

Banner

.github/assets/zentropy-banner.png stays as the 1280x640 social-preview
source, uploaded through repository settings. It is no longer the README's
first image, so test_readiness now requires the two generated files in the
README instead of the banner. Its existence check is unchanged.

Checks

ruff, mypy and the full 372-test suite pass locally on Windows.

Honest null: the dark palette was verified on this same stylesheet on the live
gather README, not re-verified on a rendered crucible page yet. The forced-theme
case, where a signed-in reader pins GitHub to light while the OS reports dark,
is untested; GitHub's default is data-color-mode="auto", which follows the
same signal the SVG does.

🤖 Generated with Claude Code

The README explained the engine in prose and showed nothing. A reader had to
assemble the run from a feature list. This adds two pictures and the machinery
that keeps them true.

`docs/art/crucible.art.json` is the source of truth. Both SVGs are pure
functions of it, so `tests/test_repo_art.py` re-renders and compares bytes:
artwork that stops matching its own words fails the suite instead of drifting
quietly, which is what happens to any picture in a README.

The diagram is grounded in `run_cmd._run_once` and `refine`, not in the
highlights list. Two edges carry it. The loop back from Cohesion to Measure is
the refine step: grading yields a margin per claim, the harmonic mean is the
cohesion, and a round that is not cohesive names its weakest axis and measures
that axis again. The edge that does not loop is `verdict_for`, a pure function
of a deviation and a tolerance with no model in it.

The header seeds its corona from sha256 of the repository name, so crucible
draws a different aperture from flywheel and gather while keeping one form.

New gate: `test_the_tagline_stays_inside_its_rule`. The header tagline is one
unwrapped line under a rule that ends at x=700, and a longer one runs on toward
the aperture and stops being readable with nothing failing. The bound counts
characters, so it is a guardrail at the widest tagline that has been looked at
on a rendered page, not a typographic measurement.

`.github/assets/zentropy-banner.png` stays in the repository as the 1280x640
social-preview source, uploaded through repository settings. It is no longer
the README's first image, so `test_readiness` now requires the two generated
files in the README instead.

ruff, mypy and 372 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@HarperZ9
HarperZ9 merged commit 954210c into main Sep 3, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant