Draw a character, watch him walk#9
Merged
Merged
Conversation
The repo has promised 'characters are plain TOML — zero Rust' since the start, in three places, and meant it. But zero Rust still meant typing '#' and '+' into a text file, guessing at the shape, and running a build to find out. Two characters exist, both mine. That's the tell. The spec asks for six fields that look like work — sit_rows, leg_frames, eye_row, mouth_row, legs_row, and the art. Only the art is work. Both existing characters derive from alone, exactly, and I checked that against them rather than assuming: sit_rows is [blank] + rows[:5], leg_frames is [legs, ←1, legs, →1], eye_row is the first row with an '@', legs_row is the last. So the editor asks for a drawing and hands back a character. The first build silently lied. A drawing with no eyes fails the engine's check, and character_of falls back to the built-in buddy — so you drew a cat and watched a cloud walk past, with nothing to tell you why. I'd re-implemented the engine's rules in JavaScript, badly, which is how you get two sources of truth and neither of them trusted. check_spec now hands the engine's own verdict back across the wasm boundary, and the preview refuses to draw a stand-in: it prints what the engine said, which is the same check CI runs. He rides in the zip as characters/<name>.toml with awan.json pointing at him. A config naming a file you don't have isn't a setup.
snk gets 5,951 stars for 'Generates a snake game from a github user contributions graph'. Nine words on line eight, and you're done reading. Ours opened with 'a tiny living character for your terminal — and a personality layer any CLI can embed: wait, ask, react'. Two products joined by an 'and', jargon nobody searches for, API names in the first breath — and not one mention of GitHub, for a thing whose whole point is a GitHub profile. It's one sentence now: a tiny pixel character that walks your GitHub contribution year. The profile section moves to the front because that's what someone came for, and the terminal moves under it and says out loud that it's the second act. Every badge in the header resolves — checked, including the crates.io one, which reads v0.0.5. The engine is still the interesting part. It just isn't the pitch.
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 repo has promised "characters are plain TOML — zero Rust" since the
start, in three places, and meant it. But zero Rust still meant typing
#and+into a text file, guessing at the shape, and running a build to find out.Two characters exist. Both mine. That's the tell.
The spec is smaller than it looks
It asks for six fields that look like work —
sit_rows,leg_frames,eye_row,mouth_row,legs_row, and the art. Only the art is work. Bothexisting characters derive from
rowsalone, exactly — checked against them,not assumed:
sit_rows[blank] + rows[:5]leg_frames[legs, ←1, legs, →1]eye_row@legs_rowSo the editor asks for a drawing and hands back a character. Ten by six, two
colours.
The first build lied, and that's the interesting part
A drawing with no eyes fails the engine's check, and
character_offalls backto the built-in buddy. So you drew a cat and watched a cloud walk past, with
nothing on screen to tell you why.
The cause was mine: I'd re-implemented the engine's validation rules in
JavaScript, and got them wrong. Two sources of truth, neither trustworthy.
check_specnow hands the engine's own verdict back across the wasm boundary,and the preview refuses to draw a stand-in — it prints what the engine said,
which is the same check CI runs. One place decides what a character is.
The loop closes
Draw → he walks immediately (present, stroll, sleep, dance — the four beats a
character has to survive) → he's in the cast → the zip carries him as
characters/<name>.tomlwithawan.jsonpointing at him. A config naming afile you don't have isn't a setup.
Engine untouched apart from
check_spec: 47 tests, clippy clean, every fileunder 200 lines.