0.2.0: release prep - #11
Merged
Merged
Conversation
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
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.
Version, metadata, README, examples, CI, and the dead wood. Rebased onto
mainnow 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:
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_parsepinned three-year-old dependencies, needed anAPI 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:
completestreamingvalidatessedata:streamDeleted
bench.rsimportedcomplete_json::{json_value, Value}— a crate that doesnot exist — plus
combineandcriterion, which are not dependencies. It hasnot compiled since before the project was renamed.
CI, for the first time
fmt · clippy
-D warnings· tests · doctests · the examples actuallyrunning · an MSRV job so the declared 1.70 is real · packaging.
One thing packaging caught
tests/conformance.rswas in the published crate but its 316-file corpus wasexcluded, 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 packageverifies clean at 29 files, 56 KB compressed.Metadata
Points at
PowderworksCodeanddocs.rsrather thangenau.ai, with realkeywords, categories, an MSRV, and a description that matches the crate.
125 tests, clippy clean,
CHANGELOG.mdadded.🤖 Generated with Claude Code
https://claude.ai/code/session_01HsDxLrGdx6nPaXkVEWkNvS