Draw the thesis lifecycle, and give crucible its own generated header - #16
Merged
Merged
Conversation
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>
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.
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.jsonholds the words. Both SVGs are pure functions ofit, so
tests/test_repo_art.pyre-renders and compares bytes. Artwork thatstops 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
feTurbulenceseed, arandom.Random(int)corona, 2-decimal coordinate formatting, and a rendererthat writes with
newline="". The repository's existing* text=auto eol=lfalready covers checkout, so no
.gitattributeschange was needed.The diagram is grounded in the code, not the highlights list
I read
run_cmd._run_onceandrefinerather than working from the featurebullets. 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 deviationand 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 unwrappedline 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
mmmmfromiiii. 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_wrappercatches the wrapper'ssilent three-line truncation, and
test_a_return_edge_stays_on_its_own_rowcatches 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_drawingchecks that rather than assertingit in a doc.
Banner
.github/assets/zentropy-banner.pngstays as the 1280x640 social-previewsource, uploaded through repository settings. It is no longer the README's
first image, so
test_readinessnow requires the two generated files in theREADME 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 thesame signal the SVG does.
🤖 Generated with Claude Code