Skip to content

0.2.0: release prep - #11

Merged
zmaril merged 2 commits into
mainfrom
chore/0.2.0-release-prep
Aug 19, 2026
Merged

0.2.0: release prep#11
zmaril merged 2 commits into
mainfrom
chore/0.2.0-release-prep

Conversation

@zmaril

@zmaril zmaril commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Version, metadata, README, examples, CI, and the dead wood. Rebased onto main
now that #9 has landed.

README, rewritten — and it can no longer drift

It led with JSON repair and promised JavaScript and Python wrappers "soon"
for three years. It now leads with what jawohl is, shows the three levels, states
the stability guarantee and what it costs, and gives real numbers for early
cancellation:

bad role  : CANCELLED after 10 of 44 bytes -- {"role":"s
bad limit : CANCELLED after 27 of 43 bytes -- {"role":"user","limit":1000
good      : read all 42 bytes -> Valid

Every Rust snippet in it is now a doctest, via a #[cfg(doctest)] include,
so the front page cannot drift from the crate again. It also says plainly that
bindings do not exist yet and will not be claimed until they do — once was
enough.

Examples: four that run, replacing one that couldn't

examples/openai_streaming_parse pinned three-year-old dependencies, needed an
API key, lived in its own workspace, and demonstrated only the 0.1 surface — so
nothing could run it in CI. Replaced with four that need no network, all run by
CI:

example shows
complete truncated documents, including the six 0.1 corrupted
streaming a tool call materialising chunk by chunk, with events
validate early cancellation, and the lowering report
sse the realistic shape — JSON inside a data: stream

Deleted

bench.rs imported complete_json::{json_value, Value}a crate that does
not exist
— plus combine and criterion, which are not dependencies. It has
not compiled since before the project was renamed.

CI, for the first time

fmt · clippy -D warnings · tests · doctests · the examples actually
running
· an MSRV job so the declared 1.70 is real · packaging.

One thing packaging caught

tests/conformance.rs was in the published crate but its 316-file corpus was
excluded
, so a consumer would have received a test that cannot pass. Both are
now excluded — it is a repo-level gate, not something a downstream user re-runs.
cargo package verifies clean at 29 files, 56 KB compressed.

Metadata

Points at PowderworksCode and docs.rs rather than genau.ai, with real
keywords, categories, an MSRV, and a description that matches the crate.

125 tests, clippy clean, CHANGELOG.md added.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HsDxLrGdx6nPaXkVEWkNvS

zmaril and others added 2 commits August 17, 2026 21:30
Version, metadata, README, examples, CI, and the dead wood.

The README is rewritten around what jawohl now is -- an incremental parser and
validator -- rather than a JSON-repair function. It leads with the problem
(structured output should materialise progressively), shows the three levels,
states the stability guarantee and what it costs, and gives real numbers for
early cancellation from a runnable example: a bad enum value is caught after 10
of 44 bytes.

Every Rust snippet in it is now a doctest, via a #[cfg(doctest)] include. The
0.1 README promised wrappers that never shipped and documented behaviour the
code did not have; the front page can no longer drift from the crate. It also
says outright that bindings do not exist yet and will not be claimed until they
do -- once was enough.

Four self-contained examples replace the one that was there. The old
openai_streaming_parse pinned three-year-old dependencies, required an API key,
lived in its own workspace, and demonstrated only the 0.1 surface, so nothing
could run it in CI. The new ones need no network: complete (truncated
documents), streaming (a tool call materialising chunk by chunk, with events),
validate (early cancellation and the lowering report), and sse (the realistic
shape -- JSON arriving inside a data: stream, with the four lines of glue that
are the consumer's job).

bench.rs is deleted. It imported complete_json::{json_value, Value} -- a crate
that does not exist -- plus combine and criterion, which are not dependencies.
It has not compiled since before the project was renamed.

CI exists for the first time: fmt, clippy denying warnings, tests, doctests, the
examples actually running, an MSRV job so the declared 1.70 is real, and a
packaging job.

Packaging revealed an inconsistency worth fixing rather than shipping: the
conformance test was in the published crate but its 316-file corpus was
excluded, so a consumer would receive a test that cannot pass. Both are now
excluded -- it is a repo-level gate, not something a downstream user re-runs.
cargo package verifies clean at 29 files.

Metadata now points at PowderworksCode and docs.rs rather than genau.ai, with
real keywords and categories, and a description that matches the crate.

125 tests, clippy clean, all four examples run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HsDxLrGdx6nPaXkVEWkNvS
The msrv job failed, and chasing it turned up two more problems that had passed
silently.

The msrv failure was not an MSRV problem. cargo 1.70 could not parse the
committed Cargo.lock, which is format v4; the library itself builds fine on
1.70, verified locally against that exact toolchain and with -D warnings set.
The job now removes the lockfile and resolves fresh, which also makes it fail
loudly if a dependency ever raises its own MSRV past ours -- the signal we
actually want from that job.

Worth recording why the job builds rather than tests: a dev-dependency in
serde_json's tree (zmij) requires 1.71. That constrains our test suite, not
anybody depending on jawohl, and rust-version is a promise to consumers. Testing
on the MSRV toolchain would make the declared minimum a function of our test
dependencies, which is the wrong thing to promise.

Second, and quieter: `with: { components: rustfmt, clippy }` is a YAML flow
mapping, so `clippy` parsed as a separate key with no value rather than as part
of the components string. GitHub warned "Unexpected input(s) 'clippy'" and the
action ignored it -- clippy only ran at all because the runner image ships it.
Now a single string, with a comment so it is not rewritten that way again.
There is a test in this commit's verification, not the repo: the workflow is
parsed and the value asserted.

Third, actions/checkout bumped v4 -> v5 to clear the Node 20 deprecation
warnings on every job. CI warnings breed.

Also dropped the workflow-level RUSTFLAGS: -D warnings in favour of passing it
to clippy explicitly. Setting it globally applied it to the msrv job too, which
would have made an old rustc's lint differences fail a build that is only meant
to answer "does this compile at the minimum version".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HsDxLrGdx6nPaXkVEWkNvS
@zmaril
zmaril merged commit bd4d924 into main Aug 19, 2026
4 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