80-line Python script hides invisible IDs in text to trace leaks
A weekend-buildable attribution kit: zero-width marks survive HTML and docx, keyed synonyms hit 100% detection, SynthID Text covers your model's output.

Copy markdown
Zero-width chars, 80 lines, zero dependencies
A new walkthrough ships an 80-line, standard-library-only script that hides a 32-bit ID plus CRC-8 checksum in zero-width Unicode after each sentence — invisible in the rendered text. It survives copy-paste through HTML, JSON, and .docx conversions, so a unique per-recipient ID turns any leaked draft into a fingerprint pointing back to who shared it.
The paraphrase test picks your method
Zero-width marks vanish the instant text goes through an LLM rewrite. Keyed synonym swaps hit 100% detection at ~1,075 words but fall to 73% for a single paragraph and 0% after full paraphrase; semantic word-planting claws back 36.7% post-paraphrase at k=12, at the cost of natural prose. Choose by threat model — mechanical copying versus a motivated rewriter.
For your own model's output: SynthID Text
If you generate the text, Google's open-source SynthID Text watermarks at generation time by nudging token choices, and ships a detector inside Hugging Face Transformers — a drop-in for your inference pipeline. Caveat: it only flags output from models that opted in, and the signal weakens on short or heavily-edited passages.
Elsewhere: GPT-6 reasoning config lands in the Vercel AI SDK
@ai-sdk/openai 4.0.60 (and 3.0.109 / 2.0.125) adds GPT-6 reasoning configuration, with matching updates for the Azure and Amazon Bedrock providers — so you can tune Astra's reasoning from the same SDK you already ship on.