Skip to content

v0.4.1 — what exercising the shipped product found

Choose a tag to compare

@chethan62 chethan62 released this 29 Sep 11:01
· 45 commits to main since this release

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/stats counted every period as a sentence end, so Dr. Smith, 1.5 lakh,
    R. K. Narayan, 10.30 a.m., example.com and ... all inflated the sentence
    count — and mean/longest sentence length, Flesch ease, FK grade and the grade band
    are computed from it.
  • /v2/fix-sentence read 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.
  • enabledOnly naming rules this engine does not have answered "no issues" — a clean
    document that was never checked. warnings.incompleteResults is now true instead.
  • The binary reported a hardcoded 0.4.0 regardless of the revision it was built from;
    the version is now injected from the git tag, so /status says 0.4.1 (or
    0.4.1-3-gabc1234 for 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.