v0.4.1 — what exercising the shipped product found
Delivery fixes found by exercising the shipped thing, not the source.
Fixed
- Chunk boundaries fell inside words on text with no
.,!or?(bullet lists,
tables, comma run-ons): the engine saw half-words and reported both halves as
misspellings. 29 KB of clean text came back as'o'@11998+'ver'@11999; cuts now
land on the last space, tab or newline. /v2/statscounted every period as a sentence end, soDr. Smith,1.5 lakh,
R. K. Narayan,10.30 a.m.,example.comand...all inflated the sentence
count — and mean/longest sentence length, Flesch ease, FK grade and the grade band
are computed from it./v2/fix-sentenceread the client's UTF-16 offset as a byte index: with an emoji or
an accent before the error it fixed the previous sentence, and grammar-ui swapped
that sentence into the document.enabledOnlynaming rules this engine does not have answered "no issues" — a clean
document that was never checked.warnings.incompleteResultsis now true instead.- The binary reported a hardcoded
0.4.0regardless of the revision it was built from;
the version is now injected from the git tag, so/statussays0.4.1(or
0.4.1-3-gabc1234for commits on top of it). - The release archive could carry the previous release's binary (tagging changes no
source file, and the build target only watched sources) — the build now always runs.
Measured on this build (66 words at level=picky, 2 findings): p50 15 ms / p95 16 ms
with one request in flight, p95 91 ms at 4 in flight, ~65 checks/s at 32 in flight, no
failures. Checks are serialized by design, so throughput is flat and latency queues.
Verified against a real client: language_tool_python passes five contract
assertions (typos, correct(), the picky style tier, disabledRules, enabledOnly) —
uv run --with language_tool_python python examples/lt-client-smoke.py. Hostile input
(every method × every endpoint, 30 absurd bodies each, 6 content types) answers 4xx and
never 5xx, and never wedges the engine.
This archive: grammar-server, harper-ls and harper-cli side by side (the server
finds the pair in its own directory, so nothing needs installing and PATH is irrelevant),
the systemd unit, the UI's three files with their unit, README.md, LICENSE and
LICENSE-harper (harper is Apache-2.0). Extract and run ./grammar-server.