v1.0.0
[1.0.0] - 2026-08-10
First stable release. The tool surface, the return shapes and the safety
guarantees are now a contract, and a breaking change to any of them means 2.0.0.
Security
-
Headlines are fenced as untrusted data. A LinkedIn headline is free text any
stranger can write, and it was reaching a model that also holdssend_message
andconnect. The README already promised that human-written text is fenced and
aboutwas, butheadlinewas not, so the guarantee was only partly true.Now fenced at all three sites,
get_profile, thesearch_peoplestructural row
path, and the selector fallback, through the sameclean,truncate,fence
pipeline asabout, withfenceoutermost so its boundary nonce is still
generated after the content exists._HEADLINE_LIMITis 220, matching
LinkedIn's own headline cap, so truncation never fires on a real headline.Contributed by @VedantMadane in #12, closing #6.
-
Regression tests now guard the fencing. Previously only the
get_profile
site was covered, so the twosearch_peoplepaths could have been silently
unfenced by a refactor with the suite staying green. All three paths are now
tested, and the fence label is pinned as well as the wrapper, since a
mislabelled provenance marker is how a reader later mistakes one field for
another.tests/fakes.pygained a search-results fixture that future search
tests can reuse.
Added
- Contributing docs explain how to run the tests. The default suite needs no
Chromium, no LinkedIn account, no cookie and no network access, which was true
but written down nowhere. Contributed by @averyquinnhq in #11, closing #7.
Changed
- Breaking:
headlineis now a fenced string rather than a raw value in
get_profileandsearch_people. Callers matching on exact content must match
on containment instead.