)]}'
{
  "log": [
    {
      "commit": "42f9d969024a20735148e3577d4b602ed4d0590a",
      "tree": "13f4246e32bd5288f3fa4701ca898116b9b5d7fe",
      "parents": [
        "629c2ea148ae6ddbd3b70bc1e35076aaf94b7143"
      ],
      "author": {
        "name": "GOWTHAM MP",
        "email": "Gowthamrockerzzz@gmail.com",
        "time": "Mon Aug 31 13:48:05 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 13:48:05 2026"
      },
      "message": "xpress: add Microsoft XPRESS (MS-XCA) decompression (#1195)\n\n* xpress: add Microsoft XPRESS (MS-XCA) decompression\n\n* Fix XPRESS docs: WIM/WOF use the Huffman variant; raise block cap to 32 MiB\n\n* xpress: add fuzzer, fix two panics it found\n\nFuzzXpress runs fuzz input through both decompressors, seeded with the\nMS-XCA test corpus, and asserts output never exceeds the 32 MiB cap.\n\nFixes found by the fuzzer:\n- the Huffman decode table fill could run past the 32768 entries when\n  code lengths were oversubscribed (the completeness check ran after the\n  fill loop, too late)\n- the mid-stream end-of-data-as-match(3,1) fallback indexed out[-1] when\n  the output was still empty\n\n* xpress: spec-correct plain-LZ77 decoding, append APIs, generated corpus\n\nReview follow-up on the XPRESS decompression PR:\n\n- Plain LZ77: fix the shared-nibble and raw-byte length bases to the\n  MS-XCA 2.1.1 values (nibble + 10, byte + 25; LE16/LE32 stays + 3) and\n  let the pending half-byte survive literals. Both were wrong in the\n  initial port and only the self-consistent vectors masked it.\n- Reject LE16/LE32 length values below 22, as the specification does.\n- API: XpressDecompress/XpressHuffmanDecompress become\n  AppendDecompressed/AppendHDecompressed, appending to a caller slice\n  and returning it unmodified on error (klauspost review).\n- MAX_DECOMPRESSED_FILE becomes the exported MaxSize; errors are\n  lowercase with an xpress: prefix.\n- Corpus: xpress_test_data.go is renamed xpress_data_test.go and\n  regenerated by the new tests/xpressgen generator, which encodes with\n  a spec-faithful MS-XCA 2.1.1 encoder and uses bytes.Repeat for the\n  repetitive payloads. The Huffman fixtures are spliced in verbatim\n  from huffman_vectors.txt. New vectors cover every nibble length\n  11..24, byte lengths 26..279, the LE32 path, a literal between two\n  shared-nibble matches, and the append mode.\n\n* xpress: bound matches to this call\u0027s output and fix negative-test byte order\n\nAppendDecompressed and AppendHDecompressed now reject matches that would read before the caller-provided output base (previously the guards compared against the whole slice, letting a crafted stream copy from the prefix). The hand-built negative-test flag words were byte-reversed - little-endian storage put the match flags in the low bits, so TestXpressExpansionRatio and TestXpressOOB passed on the literal/truncated paths instead of the paths they claim to cover. The flag bytes now place match bits where the decoder looks (bit 31 down), assertions use errors.Is, and the append error path asserts the returned slice equals the original prefix. TestXpressTruncated pins the exact error for each case: mid-match cut (errTruncated), short Huffman table (errTruncated), and oversize declaration (errCorrupt via mid-stream end-of-data).\n\nGenerator: xpressgen output is now passed through go/format, and the match-search cap is raised from 65535 to 128 KiB so a corpus vector can exercise the plain LE32 length branch. A hand-built Huffman fixture (Huff7) covering the LE32 raw-length path is verified against the decoder and spliced into the corpus.\n\n* xpressgen: reserve the flag-group header when a match opens a group\n\nThe encoder reserved the four-byte flag-group header only in the literal path (when flagCount reaches 1), so a match emitted as the first token of a group (after 32 literals, or at the end of the stream) wrote its token bytes where the header belonged and the flags were written at a stale position - corrupting the stream. The match path now reserves the header when flagCount \u003d\u003d 0, mirroring the literal path. New vector Plain10 (32 distinct literals followed by a match) exercises the exact boundary and fails against the previous encoder.\n\n* xpress: address review feedback on tests and fixtures\n\n* xpress: apply go fix integer-range rewrites\n\n* Update xpress/xpress_test.go\n\nCo-authored-by: coderabbitai[bot] \u003c136622811+coderabbitai[bot]@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e\nCo-authored-by: coderabbitai[bot] \u003c136622811+coderabbitai[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "629c2ea148ae6ddbd3b70bc1e35076aaf94b7143",
      "tree": "5ad678208c4838e99bc2724d979ba35612ebf6df",
      "parents": [
        "ba74977eb2c7002604765bf9c7f3c8a497224d60"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Mon Aug 31 12:10:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 12:10:17 2026"
      },
      "message": "zstd/huff0: break false partial-register dependencies in seqdec/4X decoders (#1197)\n\n* huff0: break the false output-register dependency in the 4X decoders\n\nThe 4X decoders accumulate decoded symbols in byte lanes of a fixed\noutput register before one coalesced store. The first write used MOVB\ninto AL, which merges into RAX and so depends on whatever the register\nheld before: the previous stream\u0027s value, and across the loop back-edge\nthe previous iteration\u0027s. That serializes the four otherwise-independent\nbitstreams through one register. AL writes are not renamed separately on\nany current x86 core, and the arm64 lowering faithfully reproduces the\nmerge as UBFX into a scratch register plus BFI into the stale\ndestination, with the same chain. Production arm64 profiles show these\ninsert sequences carrying the largest flat sample counts in\ndecompress4x_main_loop_arm64.\n\nEmit a zero-extending MOVBLZX for the first byte instead, making it a\nfresh definition of the full register. The later AH/AL merges then\ndepend only on values produced in the same stream\u0027s block. The lowered\narm64 becomes a fresh-destination UBFX at the same eight sites (both 4X\nloops, all four streams); the lowering itself is unchanged.\n\nValidated: go vet on amd64 and arm64, huff0 tests with and without\nnoasm, zstd tests, 90s huff0 FuzzCompress roundtrip fuzz (1.5M execs),\n60s zstd FuzzDecodeAll differential fuzz (1.4M execs).\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01DyCv35JFWbF23UZax6qn2F\n\n* zstd: replace partial-register byte writes with MOVZBL in seqdec (non-BMI2)\n\nIn the offset/match/literal length updates, MOVB AH, CL relied on\nbrBitsRead \u003c\u003d 64 leaving CX\u0027s upper bits zero so the full register could\nbe read back as addBits; in the getBits mask build, MOVB nBits, CL merged\ninto the stale bitsRead sum. Both are partial-register merges: on x86\neach costs a merge uop depending on the stale full register, and the\narm64 lowering renders each as a UBFX+BFI or BFI read-modify-write pair,\nadding serial links next to the FSE state-update critical path that\ndominates the production decodeSync profile.\n\nMOVBLZX writes the full register fresh: unconditionally correct (no\nknown-bits assumption), same instruction count on amd64, and each site\nlowers to a single fresh-destination UBFX or MOVBU on arm64 - 24 sites\nacross the four non-BMI2 functions, dropping 12 instructions and all 24\nread-modify-write chain links from the lowered code. The BMI2 variants\nare byte-identical, so the default path on BMI2-capable amd64 is\nunchanged; the non-BMI2 amd64 variant and its arm64 lowering carry the\nchange.\n\nValidation: go vet and build on amd64+arm64; go test ./zstd with the\nassembly and with -tags\u003dnoasm; FuzzDecAllNoBMI2 2.8M execs (differential:\nthe changed non-BMI2 variant against the untouched BMI2 output,\nbyte-for-byte); FuzzDecodeAll 1.4M execs; BenchmarkDecoder_DecodeAll on\namd64 (BMI2 path) as a no-regression guard. arm64 performance to be\nmeasured on Neoverse hardware.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01DyCv35JFWbF23UZax6qn2F\n\n* zstd: gofmt comment alignment in seqdec generator\n\nNo functional change; fixes build-special gofmt gate.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n* zstd: fix false loop-carried dependency in overlapped-copy byte loop\n\ncopy_slow_3\u0027s byte-at-a-time overlapping-match copy read each source byte\ninto the low 8 bits of a GP64 declared once outside the loop (MOVB into a\npartial register), the same false-dependency shape #1197 fixed at every\nother site in this file (a partial-register write merges with the\nregister\u0027s stale value from the PREVIOUS iteration, serializing loads\nthat are otherwise independent). One site here was missed because it\u0027s a\nbyte-copy loop rather than a decode step.\n\nFix: MOVBQZX, a fresh full-register def, identical amd64 cost. On arm64\nthis also drops a now-unneeded BFI merge entirely (MOVBU writes the full\ndestination register directly), one instruction fewer per byte copied.\n\nFound via production pprof mining of the same profile that motivated\n#1197 and #1199: copy_slow_3 carries ~0.7-0.9% of decodeSync\u0027s flat CPU\ntime in Honeycomb\u0027s arm64 Lambda workload.\n\n---------\n\nCo-authored-by: Claude \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "ba74977eb2c7002604765bf9c7f3c8a497224d60",
      "tree": "ef2994fffe1ae99ae00fbb2d26fe38881460eb6f",
      "parents": [
        "f5c1529bc7838087176f39eb85e2495f5292606d"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Mon Aug 31 11:13:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 11:13:32 2026"
      },
      "message": "ci: test against go1.27.x, drop go1.24.x (#1198)\n\n* ci: test against go1.27.x, drop go1.24.x\n\ngo1.27.0 has shipped stable; per Go\u0027s two-latest-release support\npolicy the currently supported set is 1.26/1.27, so drop 1.24.x from\nthe CI matrix and add 1.27.x. go.mod\u0027s `go 1.24` minimum is left\nuntouched — that\u0027s a separate consumer-compatibility decision.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n* ci: retrigger to check zlib ExampleNewWriter Windows/1.27 flake reproducibility\n\nNo functional change. build (1.27.x, windows-latest) failed on the\nprevious push with ExampleNewWriter producing a valid-but-different\n(stored vs Huffman-compressed) zlib stream for \"hello, world\\n\". Local\nrepro (isolated test, full ./zlib/..., full ./...) is clean on\namd64/linux, no GOOS-specific code path found in the flate encoder,\nand master\u0027s recent CI history has no record of this failing. Pushing\nan empty commit to see if it reproduces before treating it as a real\nbug versus a runner flake.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n* zlib: make ExampleNewWriter version-tolerant of the stdlib flate encoder\n\nExampleNewWriter asserts against Go\u0027s standard library compress/zlib\n(not this package), and Go 1.27 changed the stdlib flate encoder\u0027s\ntiny-input heuristic (now stores 13-byte inputs instead of Huffman-\ncompressing them). Exact encoder output isn\u0027t part of Go\u0027s\ncompatibility promise, only decodability is, so a golden-byte\nassertion can\u0027t hold across a CI matrix spanning multiple Go\nversions. Round-trip through a Reader instead, matching the existing\nstyle of ExampleNewReader in the same file.\n\nVerified go1.26.7 and go1.27.0 both pass this test and the full\n`go test ./...` suite.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n* zlib: check round-trip errors in ExampleNewWriter\n\nPer CodeRabbit review on #1198: io.Copy and r.Close errors were\nunchecked. This matters here specifically because the zlib adler32\nchecksum is only verified at EOF/Close, so a corrupted round-trip\ncould have io.Copy already write the correct-looking bytes before\nClose surfaces the checksum mismatch -- silently defeating the point\nof round-tripping instead of asserting exact encoder bytes.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n* go.mod: bump minimum Go version to 1.25\n\nPer CodeRabbit review on #1198: go.mod still declared go 1.24 as the\nminimum, but the CI matrix (this PR) no longer tests 1.24, so a\nregression affecting only 1.24 could merge unverified while the\nmodule claimed 1.24 compatibility. Aligning the declared minimum with\nwhat CI actually covers.\n\nThis is a breaking change for any downstream consumer still building\nwith Go 1.24: since Go 1.21 the go directive is enforced as a hard\ntoolchain minimum. Verified `go build ./...`, `go vet ./...`, and the\nfull `go test ./...` suite still pass under both go1.26.7 and\ngo1.27.0.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n* apply go fix ./... for go1.25\u0027s sync.WaitGroup.Go\n\nBumping go.mod\u0027s minimum to 1.25 unlocked go fix suggestions gated on\nthe declared language version: the Add(1)/go func(){ defer Done() }()\npattern collapses to wg.Go(func(){ ... }), now that WaitGroup.Go\nexists in the stdlib. build-special\u0027s `go fix -diff ./...` gate\nrequires this be applied, not just available.\n\nMechanical, go fix-generated change (verified go build, go vet, gofmt,\nand the full go test ./... suite all pass after applying).\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n* _generate: bump zstd/huff0 generator go.mod to go 1.25\n\nBoth locally replace the root module (replace github.com/klauspost/compress\n\u003d\u003e ../..), so once the root go.mod declared go 1.25, Go\u0027s module graph\nrequired these to declare go \u003e\u003d 1.25 too (\"go: updates to go.mod needed\").\nFixed via go mod tidy in each. s2/_generate doesn\u0027t depend on the root\nmodule and was unaffected.\n\nVerified go generate -v -x in all three _generate dirs produces\nbyte-identical output to what\u0027s committed (git status clean after\nregenerating) -- this only touches go.mod/toolchain metadata, not\ngenerator behavior.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n* s2/cmd/_s2sx: bump generator go.mod to go 1.25\n\nSame issue as zstd/huff0 _generate: this module locally replaces the\nroot github.com/klauspost/compress module, so it needed go \u003e\u003d 1.25 to\nmatch the root\u0027s bumped directive. This is what build-special\u0027s\ngoreleaser snapshot step exercises (gen.sh -\u003e go generate . in this\ndir), which is why it wasn\u0027t caught by the earlier _generate fix.\n\nVerified go generate . here is still a no-op on tracked source (only\nproduces build artifacts, not committed).\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01RjoGCCuDTpqAdghumgYWCB\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "f5c1529bc7838087176f39eb85e2495f5292606d",
      "tree": "3e0153626afb189fc93b967bc2e83b2d3c3b428b",
      "parents": [
        "73508b25f222ed50fad2ff7540c059f893781c30"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Mon Aug 31 10:22:01 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 10:22:01 2026"
      },
      "message": "zstd/huff0: pin avo peephole folds, regenerate arm64 (#1199)\n\nPulls in honeycombio/avo@0a52965 (branch lizf.arm64-peepholes): the\nprinter now folds \"AND $mask x2 + TST\" (x86\u0027s same-register TESTB/\nTESTW idiom) to a single masked TST, and \"MOVQ/SHRQ+MOVBQZX\" self-\nextends to a single UBFX. Regenerated amd64 output is byte-identical\n(these are arm64-only printer changes); arm64 output shrinks by\nexactly the matched sites: the loop-bottom exhausted-flag check in\nboth huff0 4X loops (3 insns -\u003e 1) and the FSE table-build check, and\nthe \"moB\" byte extract in all four zstd seqdec_* functions (4 insns\n-\u003e 1, dropping a dead MOVD to RSP too).\n\nMotivated by production pprof profiling (Honeycomb\u0027s arm64 Lambda\nworkload, Graviton2). Benchmarking to follow before deciding whether\nthis ships."
    },
    {
      "commit": "73508b25f222ed50fad2ff7540c059f893781c30",
      "tree": "02ac5510c867b88cad3c624841f6dd0dba9781e6",
      "parents": [
        "0e43f04adae8400cdaf545242467c9910ce9a513"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Mon Aug 17 12:15:05 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 12:15:05 2026"
      },
      "message": "s2: arm64 assembly encoders, lowered from the amd64 avo program (#1187)\n\n* s2, zstd: arm64 asm via avo lowering (NOT SHIPPABLE — see benchmarks)\n\nComplete and correct, retained for reference only. Full s2 suite passes on\nNeoverse N1; zstd encode tests pass. Measured against the pure-Go path arm64\nused previously:\n\n  s2 Twain default   -11.9% time (+13.6% B/s)\n  s2 Twain better    -11.4%\n  s2 snappy-default  -12.6%\n  s2 Random 1MB default  +16% time\n  s2 Random 1MB better  +156% time (-61% B/s)\n  geomean            +8.7% SLOWER\n\n  zstd matchLen      ~24% slower than generic Go at 1-8KB\n\nIncompressible input emits one large literal run, so that benchmark is\nessentially a memmove: Go\u0027s runtime memmove reaches ~11 GB/s on arm64 while\nthe generator\u0027s inlined 128-byte MOVOU loop manages ~4.6 GB/s. matchLen\nloses for a related reason -- the x86 source keeps lengths in 32-bit\nregisters, costing MOVWU truncations, and Go compiles its generic\nle.Load64/TrailingZeros64 loop more tightly than the lowered x86.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* s2: regenerate arm64 with improved printer (address caching, GOAMD64 evaluation)\n\nRegenerated output only. Still not shippable per the benchmarks in the\nprevious commit; retained so the branch reflects the current printer.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* s2: regenerate arm64 against the current lowering\n\nThe previous arm64 generation no longer builds: the lowering has since\nstopped interpreting preprocessor directives (that machinery produced\nabout a third of the miscompiles review found) and has grown a guard\nagainst reading a carry flag across DECQ. Both fire on this generator.\n\nNeither is really an arm64 question. The GOAMD64 blocks -- the v4-to-v3\npromotion and the TZCNT/BSF selection -- are instructions to the amd64\nassembler, so arm64 is emitted by a separate pass that omits them and\nuses TZCNTQ outright, which lowers to RBIT+CLZ. Keeping the amd64 pass\nuntouched is also what keeps its output identical, and it is: byte for\nbyte against master, header and build tag aside.\n\nThe carry guard is pointing at something real. genMemMoveLong\u0027s loop\nbranches JA on the carry that a SUBQ two instructions earlier left,\nbecause x86 DECQ deliberately preserves CF where the arm64 SUBS it\nlowers to does not. The previous generation predates the guard and so\nemitted that branch reading a flag its producer no longer set. arm64\nnow gets the same 32 bytes per iteration with the branch reading a CMPQ\nthat immediately precedes it.\n\nFull s2 test suite passes on Neoverse-N1.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* zstd: drop the arm64 matchLen from this branch\n\nIt measured ~24% slower than the generic Go loop on Neoverse-N1 (8KB:\n879ns lowered vs 706ns Go), which is the expected direction: the x86\nsource does its length arithmetic in 32 bits, costing truncations once\nlowered, and Go\u0027s le.Load64-xor-TrailingZeros64 loop already compiles to\ntighter arm64 than the translation of the x86 does.\n\nIt rode along on the branch this one descends from. It does not belong\nin a change about the s2 encoders.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* s2: drop the GOAMD64 guard around TZCNT, per review\n\nTZCNT\u0027s encoding is BSF\u0027s with an F3 prefix, and processors without the\ninstruction ignore the prefix and execute BSF. One encoding is therefore\ncorrect everywhere, and the assembler-level choice this made was never\nneeded.\n\nThe two differ only on a zero input, which cannot reach here -- every\ncaller has established the value is nonzero -- and in flags, which is\nunobservable: all seventy call sites are followed immediately by SARQ,\nwhich overwrites the flags without reading them. Verified by scanning\nthe generated output: seventy sites, seventy SARQ successors, no\nconditional jump within two instructions of any of them.\n\nThe amd64 output changes by exactly the seventy BSFQ lines and their\nsurrounding directives; the instruction stream is otherwise identical\nmodulo avo\u0027s operand alignment. arm64 output is unchanged -- it already\nemitted TZCNTQ unconditionally, which is what prompted the question.\n\nThis removes the per-site GOAMD64 directives, leaving only the v4-to-v3\npromotion block at the top of the file, so the arm64 pass still has to\nbe separate.\n\nSuggested-by: Klaus Post \u003cklauspost@gmail.com\u003e\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "0e43f04adae8400cdaf545242467c9910ce9a513",
      "tree": "8207863ce42e76cf51247fe8ebd2825aa50fe786",
      "parents": [
        "4005c155a2670b665ddc52205b6e9dacb43cf651"
      ],
      "author": {
        "name": "Alex Sharov",
        "email": "AskAlexSharov@gmail.com",
        "time": "Mon Aug 17 09:53:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 09:53:09 2026"
      },
      "message": "xxhash: bound input of non-preemptive assembly (#1196)\n\n* xxhash: bound the work Digest.Write does in one assembly call\n\nA GC that overlaps a large Digest.Write waits out the whole hash, stopping\nevery goroutine in the process for that window. zstd hits this on every\nframe: framedec hands the entire decoded frame to Digest.Write in one call.\n\nwriteBlocks was NOSPLIT|NOFRAME and Write passed it the whole input, so the\nhash was a single assembly call. The runtime cannot preempt assembly, and\nNOSPLIT removes the stack-growth check that is the only cooperative\npreemption point left.\n\nWrite now feeds writeBlocks 64 KiB at a time, and writeBlocks carries a\nstack frame so each chunk call has that check. Both are needed: measured\nalone, neither moves the stall at all.\n\nSum64 is unchanged. It is also one unbounded call, but no caller here hands\nit more than a block, and wrapping it in Go cost 45% on 4 B inputs.\n\n* xxhash: wait for the hash to start in BenchmarkDigestSTW\n\nThe hash goroutine was not synchronized before runtime.GC(), so a collection\ncould complete before hashing had started and that iteration measured nothing.\nIt overlapped every time in practice only because the hash is far longer than\na collection, which is luck rather than design. The goroutine now signals\nbefore it hashes and the timing waits for that signal.\n\nNumbers are unchanged: DigestSTW/128MB 6429.6us -\u003e 152.4us, DigestSTW/10MB\n533.7us -\u003e 159.6us, and the goloop controls stay flat.\n\n* Update zstd/internal/xxhash/xxhash.go\n\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e\n\n* xxhash: verify the collection overlapped the hash, don\u0027t assume it\n\nA signal sent just before work() begins still leaves a window: the goroutine\ncan be descheduled between the signal and the first Write, and the collection\nthen completes without overlapping anything. Rather than widen the handshake,\nrecord when the work actually began and count the iteration only if that was\nbefore the collection finished.\n\nThis is checkable rather than argued, and it works on both builds. Collecting\nuntil done instead, as a max, would also close the window but reports a tail\nstatistic: measured that way the same benchmark ran at +-15% to +-24% against\n+-1% for the mean.\n\nmissed-overlap is reported when any iteration is discarded, so a run that\nmeasured nothing cannot look clean. Across 6 runs of each build at\n-benchtime\u003d5s, nothing was discarded, and the numbers are unchanged:\n\n  DigestSTW/128MB          6449.8us -\u003e 137.4us  -97.87%\n  DigestSTW/128MB-goloop      217.9us -\u003e 250.0us       ~\n  DigestSTW/10MB            585.1us -\u003e 166.7us  -71.52%\n  DigestSTW/10MB-goloop       213.6us -\u003e 212.3us       ~\n\n* xxhash: keep the benchmark sizes straddling maxAsmSize\n\nmaxAsmSize is now 128 KiB, so the 128KB case (128e3 \u003d 128000 bytes) sits below\nit and reaches writeBlocks in one call like every smaller size. Adds 256KB so\none size still crosses the bound, and corrects the two comments that said 128KB\nwas over it.\n\n---------\n\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "4005c155a2670b665ddc52205b6e9dacb43cf651",
      "tree": "7b878b890296c754cc79c66ebf75653754c9af93",
      "parents": [
        "dd6de45e8beb8833684fbafb4ecd06b0062dafa6"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Mon Aug 17 07:46:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 07:46:46 2026"
      },
      "message": "s2: clamp the Go EncodeBetter skip to match the assembly (#1190)\n\n* s2: clamp the Go EncodeBetter skip to match the assembly\n\nencodeBetterBlockAsm has clamped the adaptive scan skip at 100 since it\nwas written (\"Blocks can be long, limit max skipping\"), and the snappy\nGo encoder in this same file already does the same. encodeBlockBetterGo\ndid not, so after a long stretch with no matches its skip grew\ngeometrically until it strode past the start of the next compressible\nregion and lost the matches there.\n\nMeasured on 4MB of alternating noise and text, Go before -\u003e after:\n\n  noise runs   compressed size      delta\n  16KB         2527580 -\u003e 2521369   -0.25%\n  64KB         2520571 -\u003e 2516749   -0.15%\n  256KB        2518285 -\u003e 2515781   -0.10%\n\nUniformly compressible input is byte-for-byte unchanged, since the skip\ndoes not grow while matches keep arriving. The cost is on incompressible\ninput, where Go now walks the positions the assembly already walked:\nencodeBlockBetterGo on 1MB of random data goes from ~9us to ~39us. That\nis the trade the assembly has always made, and this brings Go into line\nwith it rather than the other way round.\n\nThe Go and assembly outputs are now byte-identical on the \u003e64KB path,\nwhich the new test asserts directly rather than bounding a ratio gap.\n\nNote this leaves blocks of 16383..64KB diverging, in the other\ndirection: the assembly dispatches encodeBetterBlockAsm4MB there, which\nclamps, while Go dispatches encodeBlockBetterGo64K, which does not and\nalso uses skipLog 6 rather than 7. On uniform inputs the two still agree\nbyte for byte; they part company only on mixed content with long noise\nruns inside a small block. Left alone here since it is a different\nconfiguration rather than a missing clamp.\n\nFixes #1186\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n* s2: hoist s out of the skip clamp, per review\n\nKlaus: comparing against the constant rather than against s+maxSkip\nmakes it a constant compare and saves an addition, and may be faster on\nsome platforms.\n\nEquivalent for every value reachable here -- adding s is monotonic, so\nit commutes with min -- and marginally safer besides: the old shape adds\ns to both operands before comparing, which the hoisted form does not, so\nthe comparison cannot overflow a 32-bit int. Not reachable at these\nblock sizes either way.\n\nGo and assembly output remain byte-identical on the \u003e64KB path.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "dd6de45e8beb8833684fbafb4ecd06b0062dafa6",
      "tree": "051236cf855731b51f27f93450979a020669d97c",
      "parents": [
        "07f8bcdd527893e14cf6cab798217c86a2cf5b66"
      ],
      "author": {
        "name": "Vedant Madane",
        "email": "6527493+VedantMadane@users.noreply.github.com",
        "time": "Tue Aug 11 11:04:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 11:04:52 2026"
      },
      "message": "gzhttp: limit jitter hash to jitterBuffer bytes (#1192)\n\n* gzhttp: limit jitter hash to jitterBuffer bytes\n\nWhen RandomJitter is configured with a buffer smaller than the internal\nwrite buffer (wantBuf \u003d max(minSize, 512)), startCompression hashed the\nentire w.buf for the padding RNG seed. That made the seed depend on how\nthe handler chunked Write() calls, defeating the purpose of jitterBuffer.\n\nClamp the hashed prefix to jitterBuffer for both CRC32 and SHA-256 paths,\nand use the same limit when topping up from remain. Adds a regression\ntest for write-size independence (CRC and paranoid modes).\n\nFixes #1191\n\n* fix: apply go fix range-over-int in jitter test"
    },
    {
      "commit": "07f8bcdd527893e14cf6cab798217c86a2cf5b66",
      "tree": "3b7c3c71e26e115252dd795231a22a2f3da01963",
      "parents": [
        "ff8c845b10f76ba9d2fe113e7a4960c772f18b32"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Fri Aug 07 13:45:03 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 13:45:03 2026"
      },
      "message": "zstd, huff0: improved arm64 lowering, and narrow two table loads to MOVWQZX (#1175)\n\n* zstd, huff0: regenerate arm64 assembly with the improved avo lowering\n\nNo source or algorithm change: the same generators, re-run against a\nlowering that emits better arm64. Two improvements account for it.\n\n128-bit moves now use FMOVQ, which takes a base+displacement operand\ndirectly, where the previous VLD1/VST1 needed the address materialized into\na scratch register first. And scalar accesses fold base+index into the\ninstruction when arm64 permits it (the index shift must equal log2 of the\naccess width, and no displacement may be present), with a cache so a run of\naccesses sharing a base and index computes the address once. x86 folds\nbase+index+displacement into a single instruction and the generators lean on\nthat heavily, so this recovers much of what the lowering used to pay per\naccess.\n\nseqdec_arm64.s and decompress_arm64.s together shed about 90 lines. The\namd64 assembly is byte-identical.\n\nMeasured on Neoverse N1 (Ampere, go1.26, -count 6, every result p\u003c0.03):\n\n  Decoder_DecodeAll geomean            -1.53%\n    html.zst                           -2.29%\n    plrabn12.txt.zst                   -2.19%\n    lcet10.txt.zst                     -2.11%\n    kppkn.gtb.zst                      -2.08%\n    alice29.txt.zst                    -2.02%\n  huff0 Decompress geomean             -0.81%\n    Decompress4X/twain                 -2.81%\n\nInputs that are not sequence-bound (fireworks.jpeg, html_x_4) are unchanged,\nas expected.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* zstd, huff0: bump the pinned avo to pick up thirteen lowering fixes\n\nGenerated output is unchanged -- regenerating against this pin reproduces\nevery .s file byte for byte, which also confirms none of the fixed bugs was\nreachable from these generators. The pin still matters: it is what the next\nregeneration uses.\n\nThree review passes over the lowering found thirteen ways it could emit\nplausible-looking but wrong arm64. About half are wrong values: byte extends\nreading the wrong field from a high-byte source, a 32-bit conditional move\nlosing x86\u0027s unconditional zero-extension, a negative 32-bit immediate\nsign-extending across all 64 bits, BEXTR clobbering its own staged control\nfield with a memory source, and compare/test/multiply loading eight bytes for\na four-byte memory operand, which can fault at a page boundary.\n\nThe rest are cases where the two architectures disagree about what a flag\nmeans, and the lowering now refuses to translate rather than emit something\nplausible: carry conditions after additions and after logical ops (both\ninvert), carry read across INC/DEC (which preserve it on x86 but not once\nlowered), ADC after anything but a compare or subtract, a signed sub-word\ncompare whose consumer sits past a flag-transparent instruction, and the\nXOR-self zeroing shortcut, which dropped the zero flag x86 sets there.\n\nThe last round also resolves the GOAMD64 conditionals before the flag\nanalyses run, so those see exactly the instructions that will be emitted --\notherwise a producer inside a dead arm could absorb a mark a live one needed.\n\nCo-Authored-By: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* zstd, huff0: narrow two table loads to MOVWQZX, and bump the pinned avo\n\nThe avo bump carries seven lowering fixes from a fourth review pass (see\nthe fork\u0027s log). One of them matters here: a 16-bit load into a register\nlowered to a zero-extending arm64 load, where x86 preserves the upper 48\nbits. Nothing in this repository was miscompiled by that -- at all forty\naffected sites the destination\u0027s upper bits are dead, so zero-extending\nwas harmless as applied -- but the printer cannot know that, and an avo\nprogram that did depend on those bits would have gotten wrong code.\n\nMaking the lowering exact costs an instruction on every 16-bit load, and\nthat instruction reads the destination it writes, which turns an\nindependent load in huff0\u0027s innermost decode loop into a loop-carried\ndependency: measured +11.74% geomean on Decompress4X on Neoverse N1, up\nto +19% (p\u003d0.000, n\u003d12). zstd\u0027s DecodeAll paid a smaller +0.73%.\n\nSo this asks for what the code actually wants. Every one of these sites\nloads a table entry and then reads only its low bits, so none of them\nneeds the surrounding register preserved; MOVWQZX says that, and lowers\nback to a single folded load. This is belt and suspenders -- there was no\nbug here to fix -- it just keeps the general safety fix from costing\nanything where preservation was never wanted.\n\nIt is also simply the better x86 encoding, which is worth having on its\nown: MOVZX avoids the 66h operand-size prefix and the partial-register\nmerge dependency, the same hazard that cost 11.74% on arm64. On amd64\nhuff0 Decompress4X that is -7.59% geomean, up to -14.10% (p\u003d0.000, n\u003d12,\nRyzen 5 5600X).\n\nNet effect on generated code: huff0/decompress_arm64.s and\nzstd/seqdec_arm64.s are byte-identical to before, zstd/fse_decoder_arm64.s\nloses two instructions to folded addressing, and the amd64 files pick up\nthe faster encoding. The two changes land together because the pin bump\nalone would regress arm64 until the generators were narrowed.\n\n* zstd, huff0: bump the pinned avo for the round-five lowering fixes\n\nGenerated assembly is unchanged, byte for byte. None of this round\u0027s\nbugs was reachable from these generators: they emit only GOAMD64\ndirectives, which the lowering resolves and removes, so the state that\nwas leaking across foreign preprocessor arms had nothing to leak past.\nThe pin moves anyway so the committed assembly corresponds to a printer\nwe would be willing to point at other code.\n\n* zstd, huff0: bump the pinned avo for the round-six lowering fixes\n\nGenerated assembly is unchanged, byte for byte. The 64-bit immediate\nsign-extension bug this picks up needs a Q-width immediate with bit 31\nset, which neither of these generators emits -- s2\u0027s does, which is why\nit was worth finding.\n\n* zstd, huff0: bump the pinned avo for the round-seven lowering fixes\n\nGenerated assembly is unchanged, byte for byte. The frame-offset fix this\nround originally carried landed separately as #1176 and is already in the\nbase; regenerating against this pin reproduces it exactly, which is the\ncheck that the two arrived at the same answer rather than merely at\ncompatible ones.\n\nRound seven\u0027s other fixes are not reachable from these generators: the\nthree-operand SHL/SHR forms are rejected (they are SHLD/SHRD, a different\ninstruction whose destination is the third operand); preprocessor\ndirectives are normalized so \"# else\" is recognized, since Go\u0027s assembler\ntokenizes the \u0027#\u0027 separately and a missed #else drops BOTH arms; and the\nmixed-comment check moved into the preprocessor evaluator, deleting a\nsecond stateless opinion about directive ownership that had already\ndisagreed with the authoritative one.\n\n* zstd, huff0: bump the pinned avo for the round-eight lowering changes\n\nThe address cache is gone from the lowering. It let a second access to\nthe same base and index reuse the register the first one computed, and\nit had to be invalidated at every boundary the printer does not\notherwise model -- two of the silent miscompiles found in review were\nmissing invalidations rather than missing lowerings.\n\nMeasured here, it was worth two instructions: seqdec_arm64.s and\nhuff0/decompress_arm64.s are byte-identical without it, and\nfse_decoder_arm64.s gains two ADDs in buildDtable, which runs once per\nblock. Most accesses fold base+index into the instruction and never\nmaterialize an address at all, so there was rarely anything to cache.\n\nRound eight\u0027s review found no new lowering bugs, so the rest is\nhousekeeping: dead code removed, a confusing panic given a real message.\n\n* zstd, huff0: bump the pinned avo for the round-nine lowering fixes\n\nGenerated assembly is unchanged, byte for byte. None of round nine\u0027s\nbugs is reachable from these generators: the CMN boundary case needs a\ncompare against INT32_MIN written as a signed immediate, and the two\ndirective-coupling holes need directives, which neither generator emits.\n\n* zstd, huff0: bump the pinned avo for the round-ten and -eleven changes\n\nGenerated assembly is unchanged, byte for byte, including across the\nremoval of the lowering\u0027s preprocessor-directive support -- neither of\nthese generators emits a directive, which is most of why that support\nwas removed.\n\nAlso picks up shift counts at or above the operand width being masked\nthe way x86 masks them, rather than passing through to an arm64\nimmediate form that rejects them, and 64-bit immediates written unsigned\nwith the top bit set being read as the bit pattern amd64 wraps them to\nrather than refused.\n\n* zstd, huff0: bump the pinned avo for the round-eleven guard fixes\n\nGenerated assembly unchanged, byte for byte. Both fixes are to the guard\nthat refuses preprocessor directives, which neither of these generators\nemits.\n\n* zstd, huff0: bump the pinned avo for the round-twelve guard fixes\n\nThe only change to generated assembly is one build-tag line per file:\nthe original constraint is now bracketed before the arm64 term is\nANDed onto it. That is a no-op for these three -- every constraint here\nis a pure AND chain -- but without it a constraint containing || would\nhave parsed as \"(arm64 \u0026\u0026 ...) || ...\" and pulled the arm64 assembly\ninto non-arm64 builds.\n\nInstructions are byte-identical. Verified building and testing both\narchitectures.\n\n* zstd, huff0: bump the pinned avo for the label-name guard\n\nGenerated assembly unchanged, byte for byte.\n\n* zstd, huff0: bump the pinned avo for the round-thirteen hardening\n\nGenerated assembly unchanged, byte for byte. Round thirteen found no\nmiscompiles; the changes make flag transparency, instruction suffixes,\nbranch targets and the one-line output invariant into properties this\nprinter checks itself rather than ones that held because a separate tool\nhappened to reject the alternative.\n\n* zstd, huff0: bump the pinned avo for the round-fourteen enforcement\n\nGenerated assembly unchanged, byte for byte. The lowering now checks both\ndirections of the flag contract at generation time: an instruction claimed\nflag-neutral must emit no flag-writers, and one marked as a producer must\nemit exactly one.\n\n---------\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "ff8c845b10f76ba9d2fe113e7a4960c772f18b32",
      "tree": "0689332c50d8e80fa15fe4294a38e34bddf9e352",
      "parents": [
        "c3b3439a48196b5082c63252bfb8633d0a2faad4"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Fri Aug 07 13:44:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 13:44:00 2026"
      },
      "message": "Add lzw reader/writer (#1189)\n\n* Add lzw reader/writer\n\nSee #1188\n\nForked from the Go standard library. Includes https://pkg.go.dev/golang.org/x/image/tiff/lzw as opt-in.\n\n# lzw\n\nThis is a drop-in replacement for the standard library [`compress/lzw`](https://pkg.go.dev/compress/lzw) package,\nwith a **decompressor that is typically 3-4x faster** and a **compressor that is 1.4-2.7x faster**.\n\nBoth are exactly compatible: decoding produces byte for byte identical output and reports the same errors for\ncorrupt or truncated input, and encoding produces byte for byte identical compressed streams, so the\ncompression ratio is unchanged.\n\nOne difference to be aware of: `Read` writes codes out eight bytes at a time, so it may modify up to seven\nbytes of the buffer you pass it beyond the count it returns. It never writes beyond the length of that\nbuffer, so `Read(buf[:k])` will not disturb `buf[k:]`.\n\n* [Godoc documentation](https://pkg.go.dev/github.com/klauspost/compress/lzw)\n\n# usage\n\nReplace imports of `compress/lzw` with `github.com/klauspost/compress/lzw`. Nothing else has to change:\nthe package has the same API, including `Order`, `LSB`, `MSB`, `NewReader`, `NewWriter` and the `Reset`\nmethods.\n\nDecompressing:\n\n```Go\nr :\u003d lzw.NewReader(src, lzw.LSB, 8)\ndefer r.Close()\n\nif _, err :\u003d io.Copy(dst, r); err !\u003d nil {\n    return err\n}\n```\n\nCompressing:\n\n```Go\nw :\u003d lzw.NewWriter(dst, lzw.LSB, 8)\nif _, err :\u003d w.Write(data); err !\u003d nil {\n    return err\n}\n// Close flushes the final codes. It does not close dst.\nreturn w.Close()\n```\n\nUse `LSB` with a literal width of 8 for GIF, and `MSB` for PDF. The literal width must be the same as the\none used when compressing.\n\n# performance\n\nSingle core, AMD Ryzen 9 9950X. Decompression is measured decoding to a 64KB buffer.\n\nDecompression:\n\n| Input                        | `compress/lzw` | this package | speedup |\n|------------------------------|---------------:|-------------:|--------:|\n| `Mark.Twain-Tom.Sawyer.txt`  |      213 MB/s  |    821 MB/s  |  3.86x  |\n| `html.txt`                   |      240 MB/s  |    818 MB/s  |  3.41x  |\n| `e.txt` (digits)             |      307 MB/s  |    881 MB/s  |  2.87x  |\n| `pngdata.bin` (binary)       |      558 MB/s  |   1842 MB/s  |  3.30x  |\n| Tom Sawyer, `MSB` order      |      214 MB/s  |    844 MB/s  |  3.95x  |\n| Tom Sawyer, litWidth 5       |      219 MB/s  |    875 MB/s  |  3.99x  |\n| 1KB streams                  |      332 MB/s  |    559 MB/s  |  1.69x  |\n| `sharnd.out` (random data)   |      238 MB/s  |    329 MB/s  |  1.38x  |\n\nCompression:\n\n| Input                        | `compress/lzw` | this package | speedup |\n|------------------------------|---------------:|-------------:|--------:|\n| `e.txt` (digits)             |      130 MB/s  |    356 MB/s  |  2.73x  |\n| 1KB streams                  |      248 MB/s  |    478 MB/s  |  1.92x  |\n| Tom Sawyer, litWidth 5       |      108 MB/s  |    194 MB/s  |  1.80x  |\n| `html.txt`                   |      143 MB/s  |    230 MB/s  |  1.60x  |\n| `sharnd.out` (random data)   |      160 MB/s  |    255 MB/s  |  1.60x  |\n| `Mark.Twain-Tom.Sawyer.txt`  |      132 MB/s  |    194 MB/s  |  1.48x  |\n| Tom Sawyer, `MSB` order      |      136 MB/s  |    191 MB/s  |  1.41x  |\n| `pngdata.bin` (binary)       |      397 MB/s  |    431 MB/s  |  1.09x  |\n\nDecoding gains most on the compressible data LZW is normally used for; incompressible input, which LZW\nexpands rather than compresses, gains the least since almost every code is a single literal byte. Encoding\ngains most on input drawn from few distinct byte values, such as digits or a small colour palette, and least\non input made of long repeats, where it emits few codes to begin with.\n\nNeither the reader nor the writer allocates while encoding or decoding, and reusing either with `Reset` does\nnot allocate at all — except that a source which is not an `io.ByteReader` is wrapped in a `bufio.Reader` on\neach `Reset`, as it is in the standard library.\n\nRun `go test -bench\u003d\u0027Decode|Encode\u0027 -benchtime\u003d500ms -count\u003d10 .` in this directory to compare on your own\nmachine; `BenchmarkDecodeStd` and `BenchmarkEncodeStd` measure `compress/lzw` in the same process for a fair\ncomparison.\n\n# getting the best speed\n\nNone of these are required for correct use, but each affects how fast the package runs.\n\n**Decoding: read into a buffer of at least 8KB.** Given that much room the reader expands codes straight into\nyour buffer; with less it has to decode into an internal buffer and copy from it. `io.Copy` passes 32KB and so\nneeds no help, but note that a `bufio.Reader` wrapped *around* the reader defaults to 4KB.\n\n**Decoding: prefer a source that can be read a machine word at a time.** The reader is careful never to\nconsume more of the source than the code stream needs, which is what makes it usable for embedded streams such\nas the image data in a GIF. How it achieves that depends on the type passed to `NewReader`:\n\n| Source                                                                                                   | How it is read                       |\n|----------------------------------------------------------------------------------------------------------|--------------------------------------|\n| any `io.Reader` that is not an `io.ByteReader`, e.g. `*os.File` or a network connection                  | wrapped in a `bufio.Reader`, fast    |\n| `*bufio.Reader`, or anything with `Peek`/`Discard`/`Buffered`                                            | peeked, then discarded, fast         |\n| `*bytes.Reader`, `*strings.Reader`, or any `io.ByteReader` that is also an `io.ReaderAt` and `io.Seeker` | read at an offset, then seeked, fast |\n| anything else implementing `io.ByteReader`                                                               | one byte at a time, slower           |\n\nThe last row is the only slow case. It covers types such as `*bytes.Buffer`, and the block readers that\ncontainer formats often use. Wrapping such a source in a `bufio.Reader` is only safe if reading ahead of the\ncompressed stream is acceptable, since a `bufio.Reader` will consume whatever follows it.\n\n**Either direction: reuse readers and writers with `Reset`.** Both hold their dictionary inline — a `Reader` is\naround 56KB and a `Writer` around 68KB — so reusing one across streams, as when handling the frames of an\nanimated GIF, avoids repeated allocation. `Reset` on a `Reader` does not have to clear its tables, so it is\nvery cheap; on a `Writer` it clears the hash table, which is still far cheaper than allocating.\n\n```Go\nr :\u003d lzw.NewReader(frames[0], lzw.LSB, 8).(*lzw.Reader)\ndefer r.Close()\n\nfor _, frame :\u003d range frames {\n    r.Reset(frame, lzw.LSB, 8)\n    // ... read from r ...\n}\n```\n\n## TIFF and PDF: the Aldus variant\n\nTIFF uses a variant of LZW that increases the code width one code early — the \"off by one\" that Aldus\nimplemented and that libtiff keeps for compatibility. PDF\u0027s `LZWDecode` filter specifies the same variant by\ndefault, through its `/EarlyChange` value of `1`. Decoding either needs one extra call:\n\n```Go\nr :\u003d lzw.NewReader(src, lzw.MSB, 8).(*lzw.Reader)\nr.SetAldusCompatible(true)\ndefer r.Close()\n```\n\nSet it before the first `Read`. It is configuration rather than stream state, so it survives `Reset` and a\npooled reader keeps it. There is no cost to leaving it off: the default path is unaffected.\n\nOnly the reader supports this so far — `Writer` always produces standard streams, which is what GIF wants and\nwhat PDF accepts with `/EarlyChange 0`.\n\n# testing\n\nBoth halves are tested by comparison with `compress/lzw` over every test input, both bit orders and all\nliteral widths.\n\nDecoding must agree on the decoded bytes, on the error returned and on how many bytes of the source were\nconsumed, for each kind of source and a range of read sizes. Encoding must produce identical bytes, whatever\nsizes the input is written in.\n\n`FuzzReader` fuzzes the decoder comparison, including for corrupt and truncated input, `FuzzWriter` the\nencoder comparison, and `FuzzRoundtrip` checks that what the writer produces decodes back to the input.\n\n* Go fix.\n\n* Address feedback\n\n* Cleanup and remove local vars. Was slower anyway."
    },
    {
      "commit": "c3b3439a48196b5082c63252bfb8633d0a2faad4",
      "tree": "776d3ec747236df908af7f1fefa658097a13b439",
      "parents": [
        "9874bc9073f350ce462becb84f9a23c3e828d03f"
      ],
      "author": {
        "name": "Sueun Cho",
        "email": "sueun.dev@gmail.com",
        "time": "Wed Aug 05 15:56:51 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 15:56:51 2026"
      },
      "message": "zstd: don\u0027t clear the registered dictionary when decoding past the window (#1177)\n\n* zstd: don\u0027t clear the registered dictionary when decoding past the window\n\nexecuteSequences set hist.dict.content \u003d nil when the frame history grew\npast the window. hist.dict is the same *dict registered via\nWithDecoderDicts/WithDecoderDictRaw, so this blanked the dictionary for\nevery later decode on the decoder: after one streaming decode of a\ndictionary frame larger than the window, subsequent decodes of a valid\ndictionary frame failed with \u0027match offset (...) bigger than current\nhistory\u0027. The write was dead for the current decode (the streaming path\nreads its own hist.decoders.dict copy) and only ever corrupted reuse.\n\nDrop the mutation and keep the window trim; the shared dictionary is now\nleft intact, matching the sync decode path.\n\nAdd TestDecoderDictReuseAfterLargeStream (fails before, passes after).\n\n* go fix\n\n* Move test into existing file and simplify the test somewhat. Verified that it still reproduces.\n\n---------\n\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "9874bc9073f350ce462becb84f9a23c3e828d03f",
      "tree": "1c8803d7fec79a47e702a4f80d53c6e8cedc26a0",
      "parents": [
        "71bb6fd9ddbfbb2ca6612542a916c766a866bfb3"
      ],
      "author": {
        "name": "Rayan Salhab",
        "email": "r.salhab@aiyexpertsolutions.com",
        "time": "Wed Aug 05 14:34:02 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 14:34:02 2026"
      },
      "message": "fix(zstd): handle zero-literal BuildDict corpus (#1178)\n\nCo-authored-by: cyphercodes \u003ccyphercodes@users.noreply.github.com\u003e"
    },
    {
      "commit": "71bb6fd9ddbfbb2ca6612542a916c766a866bfb3",
      "tree": "b12ed55ce89fe90924a78652ebd97b7192d87c6a",
      "parents": [
        "3d4dacbaa9faca75caacc35b6d75731a81a92c6b"
      ],
      "author": {
        "name": "zanarelli",
        "email": "zanarelli.dev@gmail.com",
        "time": "Wed Aug 05 08:22:54 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 08:22:54 2026"
      },
      "message": "zstd: keep BuildDict recent-offsets positive and loadable (#1184)\n\n* zstd: keep BuildDict recent-offsets positive and loadable\n\nHomogeneous corpora with unset Offsets were ranking repeat-code hits as\noffset 0 and writing that into the dictionary, so WithEncoderDict rejected\nthe result with \"invalid offset in dictionary\". Skip zero repeat targets,\npad missing slots with defaults, and validate via loadDict before return.\n\nFixes #1179\n\nSigned-off-by: zanarelli \u003czanarelli.dev@gmail.com\u003e\n\n* zstd: apply go fix to dict_test.go\n\nModernizes the TestBuildDictHomogeneousCorpusValidOffsets sample\ngenerator to strings.Builder and a range-over-int loop, as flagged by\ngo fix and requested in review.\n\nSigned-off-by: zanarelli \u003czanarelli.dev@gmail.com\u003e\n\n---------\n\nSigned-off-by: zanarelli \u003czanarelli.dev@gmail.com\u003e\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "3d4dacbaa9faca75caacc35b6d75731a81a92c6b",
      "tree": "95f0d416fa14e4836502e7a47a836785d2ef5007",
      "parents": [
        "3ceaa81409aabe39c71821b936155b33471c78d8"
      ],
      "author": {
        "name": "zanarelli",
        "email": "zanarelli.dev@gmail.com",
        "time": "Wed Aug 05 07:47:09 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 07:47:09 2026"
      },
      "message": "zstd: avoid racing MaxDecodedSize write on shared dict litEnc (#1182)\n\n* zstd: avoid racing MaxDecodedSize write on shared dict litEnc\n\nTreeless literal decode wrote MaxDecodedSize on hist.huffTree, which\naliases dict.litEnc for trained dictionaries. Concurrent DecodeAll then\nraced. Decoder.Decompress* already sizes via cap(dst), so drop the write.\n\nFixes #1180\n\nSigned-off-by: zanarelli \u003czanarelli.dev@gmail.com\u003e\n\n* zstd: apply go fix to dict_test.go\n\nModernizes the alphabet-building loop in\nTestSharedDecoderTrainedDictRace to a range-over-int loop, as flagged\nby go fix and required by the build-special CI check.\n\nSigned-off-by: zanarelli \u003czanarelli.dev@gmail.com\u003e\n\n---------\n\nSigned-off-by: zanarelli \u003czanarelli.dev@gmail.com\u003e"
    },
    {
      "commit": "3ceaa81409aabe39c71821b936155b33471c78d8",
      "tree": "d4a0d52c36282d611b323267268c26b3bf374f46",
      "parents": [
        "72cb4d3e8e743bea5d1ba40896ad55214a1844e4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Aug 04 15:11:45 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 15:11:45 2026"
      },
      "message": "build(deps): bump the github-actions group with 5 updates (#1185)\n\nBumps the github-actions group with 5 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [actions/checkout](https://github.com/actions/checkout) | `7.0.0` | `7.0.1` |\n| [github/codeql-action/init](https://github.com/github/codeql-action) | `4.36.2` | `4.37.3` |\n| [github/codeql-action/autobuild](https://github.com/github/codeql-action) | `4.36.2` | `4.37.3` |\n| [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.36.2` | `4.37.3` |\n| [actions/setup-go](https://github.com/actions/setup-go) | `6.5.0` | `7.0.0` |\n\n\nUpdates `actions/checkout` from 7.0.0 to 7.0.1\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v7...v7.0.1)\n\nUpdates `github/codeql-action/init` from 4.36.2 to 4.37.3\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81)\n\nUpdates `github/codeql-action/autobuild` from 4.36.2 to 4.37.3\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81)\n\nUpdates `github/codeql-action/analyze` from 4.36.2 to 4.37.3\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81)\n\nUpdates `actions/setup-go` from 6.5.0 to 7.0.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6.5.0...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 7.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: github/codeql-action/init\n  dependency-version: 4.37.3\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: github/codeql-action/autobuild\n  dependency-version: 4.37.3\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: github/codeql-action/analyze\n  dependency-version: 4.37.3\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "72cb4d3e8e743bea5d1ba40896ad55214a1844e4",
      "tree": "6e53fd7c3872969e7d7abbe6277768e7b06a8296",
      "parents": [
        "69c9db420ae55bfcdfbef564805e2646206545f7"
      ],
      "author": {
        "name": "zanarelli",
        "email": "zanarelli.dev@gmail.com",
        "time": "Tue Aug 04 09:17:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 09:17:56 2026"
      },
      "message": "chore: add OpenSSF Scorecard GitHub Action (#1183)\n\n* chore: add OpenSSF Scorecard GitHub Action\n\nPublish weekly Scorecard results to the Security panel so posture\nregressions are visible without a manual scan.\n\nFixes #831\n\nSigned-off-by: zanarelli \u003czanarelli.dev@gmail.com\u003e\n\n* chore: use action version tags instead of SHA pins in scorecard workflow\n\nPer review feedback, follow the action version tags directly rather than\ncopying release.yml\u0027s SHA-pinning style.\n\n---------\n\nSigned-off-by: zanarelli \u003czanarelli.dev@gmail.com\u003e"
    },
    {
      "commit": "69c9db420ae55bfcdfbef564805e2646206545f7",
      "tree": "a3518bf1813b69a042d9da7575fec6708d68d931",
      "parents": [
        "117430d3b0e3c39c14d32fe7c90652149a78e609"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Thu Jul 30 08:37:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 08:37:10 2026"
      },
      "message": "zstd: fix arm64 asm locals overwriting the saved link register (#1176)\n\nThe generated arm64 decoder assembly places every function local 8 bytes\ntoo low, so local 0 lands on the saved link register.\n\nx86 and arm64 put the return address in different places. On x86, CALL\npushes it before the callee runs, so it sits above the frame and local 0\nis at SP+0. On arm64, BL leaves it in the link register and the callee\nspills it to the BOTTOM of its own frame, so 0(RSP) is the saved LR and\nlocals start at 8(RSP). The avo arm64 lowering renamed the pseudo stack\npointer to RSP and passed the displacement through unchanged, inheriting\nx86\u0027s layout.\n\nVerified by disassembling probe functions at two frame sizes: for both\nTEXT $8 and TEXT $64 the assembler places pseudo-SP local 0 at 8(RSP),\nwhile the prologue\u0027s MOVD.W R30, -N(RSP) puts the saved LR at 0(RSP).\nThe 8-byte offset does not depend on frame size.\n\nAffected: sequenceDecs_decode_arm64, sequenceDecs_decode_56_arm64,\nsequenceDecs_decodeSync_arm64 and sequenceDecs_decodeSync_safe_arm64,\nall present since v1.19.0.\n\nScope: this does NOT corrupt decoded data and cannot produce wrong\noutput. Every local shifts by the same 8 bytes, so loads and stores\nagree and the arithmetic is self-consistent; that is why the test suite\nand fuzzing never caught it. These are leaf functions, so the link\nregister is still live in R30 and RET works. What breaks is the unwind\npath only: GC stack scanning, panics and profiling read the return\naddress from 0(RSP) and find decoder state there.\n\nThe fix shifts pseudo-SP displacements by 8 in the lowering, so the\nregenerated assembly is a mechanical +8 on every local access and\nnothing else. zstd tests pass on arm64 (Neoverse N1)."
    },
    {
      "commit": "117430d3b0e3c39c14d32fe7c90652149a78e609",
      "tree": "b065ebc027fa3772fc22d7ed746fefa7fa22a57b",
      "parents": [
        "c73af0c12cc767386af8388f30d5aa7428e6dfc8"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Tue Jul 21 10:01:23 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 10:01:23 2026"
      },
      "message": "zstd: Re-enable unsafe decodeSync memory copies (#1168) (#1171)\n\n* zstd: Re-enable unsafe decodeSync memory copies (#1168)\n\ndecodeSyncSimple has hardcoded `const useSafe \u003d true` since #644 (2022),\nmaking the faster `sequenceDecs_decodeSync_{amd64,bmi2,arm64}` asm variants\ndead code that nothing calls. The #644 comment cites \"rare, random crashes\nwith fuzz testing\" from the extended (16-byte-block) copies.\n\nThose copies were only the amplifier. The root cause was an unguarded\nbitReader overread in updateLength that produced out-of-range match\noffsets/lengths; it was fixed three days later in #645, which also added\nthe Go fuzz corpus that has guarded this path ever since. With the source\nof the bad values gone and the +compressedBlockOverAlloc (16-byte) slack\npresent on every output/literal buffer today, the dynamic useSafe guard —\nidentical in shape to the still-active one in executeSimple — is sound.\n\nRestore the dynamic selection. On arm64 (Cortex-A72) DecodeAll improves\nby +8.7% geomean throughput (n\u003d6, p\u003d0.002), up to +16% on text.\n\nBecause a stray 15-byte overrun lands in an adjacent live allocation,\nneither -race nor plain fuzzing can observe it; add a CGO+clang asan fuzz\njob over FuzzDecodeAll/FuzzDecAllNoBMI2 on amd64+arm64 so any future\nmaxSyncLen/allocation regression is caught deterministically.\n\nValidated on amd64 and arm64: full test suite; asm-vs-noasm differential\nfuzz (byte-identical output); and asan over the decode corpus plus\n2.4M mutation execs with no reports.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* zstd: fix out-of-bounds write in unsafe decodeSync space check\n\nThe per-sequence space check in executeSingleTriple (used by the sync\ndecoder\u0027s inlined execute) requires only outPos+ll+ml \u003c\u003d cap(s.out). The\nunsafe extended copies, however, write in 16-byte blocks and overrun the\nlogical end of a run by up to compressedBlockOverAlloc-1 (15) bytes. When a\nstream\u0027s decoded length lands within the 16-byte over-allocation slack --\ne.g. a malformed frame whose declared content size is a few bytes below what\nits sequences actually produce -- the check passes but the final block copy\nwrites past cap(s.out).\n\nThe overrun is at most 15 bytes and Go\u0027s size-class rounding places it in\nslop that -race and -asan do not poison, so it corrupts an adjacent live\nallocation only intermittently, surfacing later as a crash in the garbage\ncollector rather than at the write. That is exactly the \u0027rare, random\ncrashes with fuzz testing\u0027 #644 disabled the unsafe path for in 2022; it was\nnever the bitReader overread fixed in #645, but this missing copy margin.\n\nReserve compressedBlockOverAlloc in the space check on the unsafe (non-safe)\npath only, so the overrun stays within cap(s.out); a well-formed decode ends\nat cap-16 and is unaffected, while an over-producing stream now errors with\nerror_not_enough_space instead of corrupting memory. The safe copies are\nbounds-exact and keep the tight check. amd64 asm gains one ADDQ per unsafe\nvariant; the safe variants are unchanged.\n\nTestDecodeSyncUnsafeOOB drives the unsafe asm with real captured sequences\ninto a canary-guarded buffer sized to model the under-reported case; it\nfails (canary overwritten past cap) on the unpatched asm and passes here, on\namd64 and arm64. Validated additionally with the full zstd suite and\nFuzzDecodeAll (default and -tags\u003dnounsafe) on go1.25 + go1.26, both arches.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\n* zstd: assert TestDecodeSyncUnsafeOOB exercises the unsafe copy path\n\nReview feedback on the regression test: it verified only that the asm path\nwas dispatched, relying implicitly on the buffer geometry to select the\nunsafe (extended-copy) variant. If the useSafe conditions or the test\nharness allocation ever changed, the test could silently degrade into\nexercising the bounds-exact safe copies while still passing.\n\nExtract decodeSyncSimple\u0027s selection into useSafeDecodeSync() (pure\nrefactor, no behavior change) and have the test call the same helper to\nfail loudly if its buffer sizing would select the safe variant. The canary\nvalidation and asm-path assertion are unchanged; the test still fails via\nthe canary against the unpatched assembly on both architectures.\n\nCo-Authored-By: Claude Fable 5 \u003cnoreply@anthropic.com\u003e\n\n* zstd: fold unsafe-copy margin into the space-check LEAQ\n\nKlaus\u0027s review on #1171 pointed out the compressedBlockOverAlloc margin\ncan be folded into the existing LEAQ displacement instead of a separate\nADDQ. Saves one instruction per unsafe variant on amd64/bmi2; the safe\npath (addMargin\u003d0) and arm64 codegen are unaffected in substance.\n\n---------\n\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "c73af0c12cc767386af8388f30d5aa7428e6dfc8",
      "tree": "2829b920c876b9ca46b0a59e95f5aeebe155722f",
      "parents": [
        "2602f4afea09fe72f2b58d4ed04d43a6047a0131"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Mon Jul 20 13:55:25 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 13:55:25 2026"
      },
      "message": "huff0: add arm64 assembly for Decompress4X/1X via avo lowering (#1172)\n\nGenerate arm64 asm from the existing avo source with the honeycombio/avo\narm64 lowering printer (-arch amd64,arm64), the same mechanism zstd\u0027s\nseqdec/fse asm already uses. The amd64 output is unchanged.\n\nThe Go-side wrappers move to decompress_asm.go, shared between amd64 and\narm64; per-arch files keep only the asm stubs and dispatch (amd64 retains\nthe BMI2 selection for Decompress1X; arm64 lowers the generic twin).\n\nThe avo pin gains exact x86 partial-register semantics (MOVB/MOVW/ADDB/\nADCB/SETcc lower to bit-field inserts preserving untouched bits) — the\nhuff0 loops pack output bytes through AH and accumulate byte counters,\nwhich the previous lowering silently corrupted — plus constant-folding of\nBMI2 control registers (BEXTR with an adjacent constant control becomes a\nsingle UBFX). zstd/seqdec_arm64.s is regenerated with the same printer;\nits amd64 output is byte-identical to before.\n\nOn a 16-core Cortex-A72 (ARMv8.0), huff0 Decompress1X improves 25-34%\n(twain 114-\u003e153 MB/s, digits 128-\u003e161 MB/s); Decompress4X is content-\ndependent (+12% twain, -4% low-entropy). zstd DecodeAll improves 1-7%\nend-to-end (urls.10K +3.8%, html +2.2%, comp-data.bin +6.6%), with\nchecksum (18% of CPU, at scalar xxhash roofline) and sequence decoding\ndominating the remainder.\n\nValidated: full huff0 + zstd test suites on arm64 (Cortex-A72) and amd64;\navo differential execution tests for every new/changed lowering on both\narchitectures.\n\nCo-authored-by: Claude Fable 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2602f4afea09fe72f2b58d4ed04d43a6047a0131",
      "tree": "6997442490922a76e72b4cb4841f6030ab130295",
      "parents": [
        "983acec6dacb98c0d721ca53eb5a904c3c6bec67"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Mon Jul 20 09:36:27 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 09:36:27 2026"
      },
      "message": "Update changelog for version 1.19.0"
    },
    {
      "commit": "983acec6dacb98c0d721ca53eb5a904c3c6bec67",
      "tree": "4d3d837e5b826bff43ba275730017184029d83aa",
      "parents": [
        "9960386c58450bc4ae5fd67411c394b6a7f23c4c"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Mon Jul 20 09:32:36 2026"
      },
      "committer": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Mon Jul 20 09:32:36 2026"
      },
      "message": "add defensive checks\n"
    },
    {
      "commit": "9960386c58450bc4ae5fd67411c394b6a7f23c4c",
      "tree": "52a939bc105e033827fd6e775484d76c549e97cc",
      "parents": [
        "e29d4d389f0e7806e1e84392d0c43453a5048a0f"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Fri Jul 17 09:10:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 09:10:32 2026"
      },
      "message": "zstd: Validate SnappyConverter literal copies (#1170)\n\nEnable disabled length check on `SnappyConverter.Convert` that could result in out-of-bounds reads buffer reads - or in case or re-use return values from the previous run.\n\nReported by @mfazrinizar"
    },
    {
      "commit": "e29d4d389f0e7806e1e84392d0c43453a5048a0f",
      "tree": "cb50e95d7a8e08f682fc65d82661316246ca7266",
      "parents": [
        "c0bbc84762b7d178fe7b1e3a75140793179e9e37"
      ],
      "author": {
        "name": "Ruihao Chen",
        "email": "joechenrh@gmail.com",
        "time": "Wed Jul 15 10:14:59 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 10:14:59 2026"
      },
      "message": "flate: use `Peek` instead of `ReadByte` for the `bufio.Reader` decode path (#1169)\n\n* flate: read the bufio decode path via Peek instead of per-byte ReadByte\n\nhuffmanBufioReader filled the bit buffer with fr.ReadByte() once per input\nbyte. bufio.Reader.ReadByte does not inline, so each call is a barrier that\nspills the fill loop\u0027s fb/fnb registers -- roughly 1.85x slower than the\n*bytes.Reader variant, whose ReadByte inlines to a slice index.\n\nRead from a Peek window instead: peek bufio\u0027s buffered slice and index it\ndirectly (pbuf[pos]), refilling when drained. Peek only views the buffer, so\nconsumed bytes are Discard()ed before every return, keeping the reader\nposition correct for nextBlock/moreBits and the gzip trailer. peekBufio\nrefills from at most one underlying Read (never Peek(Size()), which would\nblock a streaming/sync writer until the whole buffer fills).\n\nOnly the *bufio.Reader variant changes; the other four generated variants\nare byte-identical.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* flate: drop stray blank lines in the generated read sites\n\nThe $GETBYTE_E$ placeholder started with a newline the template already\nsupplied, so every read site picked up a blank line before its return --\n25 in total, and across all five variants rather than only the bufio one.\n\nWith that fixed the four non-bufio variants are byte-identical to the stock\ngenerated output again (verified by diffing each generated function).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c0bbc84762b7d178fe7b1e3a75140793179e9e37",
      "tree": "158a4d04b0fd7cd85a074337032479a236ebe52b",
      "parents": [
        "efdb6ed96c4b5d23f9bd6c3e739414789c871a9d"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Fri Jul 10 07:36:21 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 07:36:21 2026"
      },
      "message": "zstd: bump avo pin, regenerate arm64 asm (#1167)\n\n* zstd: bump avo pin, regenerate arm64 with BMI2 lowering\n\nBumps the pinned avo commit (honeycombio/avo) past today\u0027s fixes: a\nflag-liveness bug and a 32-bit CMPL/TESTL fold bug (neither actually reachable\nfrom this codebase - seqdec\u0027s generated output is byte-identical without\nthem, and CMPL/TESTL aren\u0027t used here at all), plus a new EQ/NE-only\nsub-32-bit CMPW/TESTB lowering that fse_decoder\u0027s buildDtable needs.\n\nChecked whether the sub-word compare/test fold (the general form of which the\nnew avo now refuses to lower) actually produced wrong output in the\nalready-shipped fse_decoder_arm64.s: it didn\u0027t. All three call sites happened\nto operate on registers already clean above the compared width (via an\nupstream sign/zero-extending load, or a preceding bounds check), verified by\ntracing register provenance by hand. Real risk, but mitigated by accident\nrather than by design - which is exactly why the stricter check is worth\nhaving going forward.\n\nThe new avo also prefers the BMI2 twin over the generic one when lowering to\narm64 (arm64 has native flag-free equivalents for the BMI2 idioms), so\nseqdec_arm64.s now lowers sequenceDecs_decode_bmi2/decodeSync_bmi2 instead of\nthe generic variants. Symbol names are unaffected (arm64Name strips the\n_bmi2/_amd64 suffix either way).\n\nValidated: go vet and go test ./zstd/... pass natively on arm64; FuzzDecodeAll\n(26.4M execs), FuzzDecoder (9.6M execs), and FuzzDecAllNoBMI2 pass with zero\ncrashers.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\n* zstd: bump avo pin, prefer generic (non-BMI2) twin on arm64\n\nBenchmarking the BMI2-preferred seqdec on real hardware (Apple M4, Cortex-A72)\nshowed it\u0027s 13-50% slower than the generic twin, not faster as assumed -- see\nthe follow-up avo commit for why. Bump past that fix; avo\u0027s arm64 lowering now\ndefaults to the generic twin (ARM64PreferBMI2 defaults false), which this repo\ndoesn\u0027t override. seqdec_arm64.s is now byte-identical to what #1160 shipped,\naside from the skip-reason comment text; fse_decoder_arm64.s is unchanged\n(the CMPW/TESTB fix has no BMI2 twin to choose between).\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "efdb6ed96c4b5d23f9bd6c3e739414789c871a9d",
      "tree": "d59b4d69d6f67d01d74990dbbb13557bfb9b9299",
      "parents": [
        "f0953f938f77977980c3b9f8c09eec06f2e88a69"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 02 09:35:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 09:35:04 2026"
      },
      "message": "build(deps): bump the github-actions group with 6 updates (#1166)\n\nBumps the github-actions group with 6 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [actions/checkout](https://github.com/actions/checkout) | `6.0.3` | `7.0.0` |\n| [github/codeql-action/init](https://github.com/github/codeql-action) | `4.36.1` | `4.36.2` |\n| [github/codeql-action/autobuild](https://github.com/github/codeql-action) | `4.36.1` | `4.36.2` |\n| [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.36.1` | `4.36.2` |\n| [actions/setup-go](https://github.com/actions/setup-go) | `6.4.0` | `6.5.0` |\n| [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action) | `7.2.2` | `7.2.3` |\n\n\nUpdates `actions/checkout` from 6.0.3 to 7.0.0\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v6.0.3...v7)\n\nUpdates `github/codeql-action/init` from 4.36.1 to 4.36.2\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/87557b9c84dde89fdd9b10e88954ac2f4248e463...8aad20d150bbac5944a9f9d289da16a4b0d87c1e)\n\nUpdates `github/codeql-action/autobuild` from 4.36.1 to 4.36.2\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/87557b9c84dde89fdd9b10e88954ac2f4248e463...8aad20d150bbac5944a9f9d289da16a4b0d87c1e)\n\nUpdates `github/codeql-action/analyze` from 4.36.1 to 4.36.2\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/87557b9c84dde89fdd9b10e88954ac2f4248e463...8aad20d150bbac5944a9f9d289da16a4b0d87c1e)\n\nUpdates `actions/setup-go` from 6.4.0 to 6.5.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6.4.0...v6.5.0)\n\nUpdates `goreleaser/goreleaser-action` from 7.2.2 to 7.2.3\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/5daf1e915a5f0af01ddbcd89a43b8061ff4f1a89...f06c13b6b1a9625abc9e6e439d9c05a8f2190e94)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n- dependency-name: github/codeql-action/init\n  dependency-version: 4.36.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: github/codeql-action/autobuild\n  dependency-version: 4.36.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: github/codeql-action/analyze\n  dependency-version: 4.36.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 6.5.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: goreleaser/goreleaser-action\n  dependency-version: 7.2.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f0953f938f77977980c3b9f8c09eec06f2e88a69",
      "tree": "97330bafb959282fc40d1fed9f13ea37e84fc034",
      "parents": [
        "ab2e3cc7ab261c8f287639760d8532afb7125425"
      ],
      "author": {
        "name": "HNO₃",
        "email": "xiangao.or@isrc.iscas.ac.cn",
        "time": "Tue Jun 30 13:21:42 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 13:21:42 2026"
      },
      "message": "flate: fix buffer formatting in tests (#1165)\n\nSigned-off-by: HNO3Miracle \u003cxiangao.or@isrc.iscas.ac.cn\u003e"
    },
    {
      "commit": "ab2e3cc7ab261c8f287639760d8532afb7125425",
      "tree": "5d77297cef0fbc2383e60b4883f2fb1332f33529",
      "parents": [
        "bb2723d55de85353fd5a1817cbc382997a6a75aa"
      ],
      "author": {
        "name": "Liz Fong-Jones",
        "email": "lizf@honeycomb.io",
        "time": "Tue Jun 30 11:29:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 11:29:08 2026"
      },
      "message": "zstd: Add arm64 decoder asm (#1160)\n\n* zstd: add arm64 asm implementation of fseDecoder.buildDtable\n\narm64 previously fell through to the pure-Go fse_decoder_generic.go because\nthe decoder asm is avo-generated and avo has no arm64 backend. This adds a\nhand-written scalar arm64 port of buildDtable, mirroring the avo-generated\nfse_decoder_amd64.s and the pure-Go reference. The kernel is serial bitfield\nwork (no SIMD), so it needs no NEON/SVE and builds on the stock go1.x\nassembler.\n\nCorrectness is covered by a differential test against an in-tree copy of the\ngeneric algorithm over the three RFC predefined distributions, plus the full\nexisting decode suite (which runs on macos-latest/arm64 in CI).\n\ndarwin/arm64 (M4, go1.26), asm vs -tags noasm; the bench\u0027s table reset is\nidentical on both sides so the delta is the buildDtable work:\n\n  litLength     ~166 vs ~201 ns/op   (+18%)\n  offset        ~118 vs ~141 ns/op   (+16%)\n  matchLength   ~175 vs ~210 ns/op   (+17%)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* zstd: add avo-generated arm64 asm sequence decoder\n\nGenerates the full non-BMI2 zstd sequence decoder for arm64 by lowering the\nexisting amd64 avo program (_generate/gen.go) through a new arm64 backend in\navo (a post-pass.Compile lowering printer; see mmcloughlin/avo#486). No asm is\nhand-written: `go generate` now emits both seqdec_amd64.s and seqdec_arm64.s\nfrom the same IR, so they cannot drift, and CI\u0027s generate+git-diff job enforces\nit.\n\n- seqdec_arm64.s: generated (6 non-BMI2 functions: decode/_56, executeSimple/\n  _safe, decodeSync/_safe).\n- seqdec_arm64.go: shim mirroring seqdec_amd64.go (context structs, noescape\n  decls, dispatch) without the BMI2 paths.\n- seqdec_generic.go: build tag now excludes arm64.\n\nScalar only — no NEON/SVE (one VLD1/VST1 pair for a 16-byte MOVUPS copy);\nbuilds on go1.26. Full zstd decode suite passes on arm64. On Apple M4,\nBenchmarkDecoder_DecodeAll is ~1.5x faster than the pure-Go fallback on\nsequence-heavy input (kppkn: 469 vs 304 MB/s).\n\nRegeneration requires the avo arm64 backend (mmcloughlin/avo#486) via a local\nreplace directive in _generate/go.mod (not committed).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* zstd: generate arm64 fse decoder via avo + pin avo fork\n\nSwitches fse_decoder_arm64.s from the hand-written bootstrap to the\navo-generated lowering, so the entire arm64 zstd decoder (fse table build\n+ sequence decoder) is produced from the existing, unmodified amd64 avo\ngenerators via the arm64 lowering printer (mmcloughlin/avo#486). Supersedes\nthe hand-written fse PR #1159.\n\nPins the printer through a replace to the honeycombio/avo fork (which keeps\nthe github.com/mmcloughlin/avo module path, so the replace resolves) until\nthe printer merges upstream and is released, at which point the replace is\ndropped for a normal require.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* zstd: asmfmt-style formatting for generated arm64 asm\n\nRegenerate the arm64 decoder with the updated avo arm64 printer, which now\naligns operands to a common column and emits a blank line before labels —\nmatching avo\u0027s amd64 (goasm) output. asmfmt reports zero non-comment\ndifferences on the arm64 files (the same standalone-comment indentation\nresidual goasm produces on amd64). Repins the avo fork to the printer commit.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* zstd: address review — dedup shims, -arch generation, asm-vs-nonasm fuzz\n\nResponds to maintainer review on the arm64 decoder PR:\n\n- Deduplicate the asm Go wrappers: shared seqdec_asm.go holds the context\n  structs, error codes and the decode/decodeSync/executeSimple bodies; each\n  arch keeps only its //go:noescape decls and a small dispatch helper (amd64\n  selects the BMI2 / 56-bit / safe variant, arm64 the 56-bit / safe variant).\n  The fse Go wrapper is identical across arches and collapses into one\n  fse_decoder_asm.go (per-arch fse_decoder_{amd64,arm64}.go removed).\n\n- Generate both architectures via avo\u0027s new -arch flag: one\n  `go run gen.go -out ../seqdec.s -arch amd64,arm64` writes seqdec_amd64.s and\n  seqdec_arm64.s from a single compile, so neither file\u0027s header references the\n  other architecture.\n\n- FuzzDecodeAll now cross-checks the assembly decoder against a non-assembly\n  path (BMI2 disabled on amd64) for byte-identical output; run with -tags\u003dnoasm\n  over the shared corpus to cover assembly-vs-generic on arm64.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* ci: run build matrix and zstd fuzzers on linux arm64\n\nAdds ubuntu-24.04-arm to the build matrix (vet/test/noasm/race across Go\nversions on Linux arm64) and gives the fuzz-zstd job an OS matrix so the zstd\ndecode fuzzers also run on arm64 — exercising the new arm64 decoder assembly\ndirectly in CI, as requested in review.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* zstd: defer BMI2 restore in FuzzDecodeAll asm/non-asm comparison\n\nUse the defer cpuinfo.DisableBMI2()() idiom so BMI2 is re-enabled on every exit\npath (panic/return), matching FuzzDecAllNoBMI2. Addresses review feedback.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "bb2723d55de85353fd5a1817cbc382997a6a75aa",
      "tree": "6055559dedbf9a52cf363411d2f9c98b1d259150",
      "parents": [
        "539243b8823ee8f03e49969823d57c348c917536"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Tue Jun 30 09:30:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 09:30:04 2026"
      },
      "message": "Merge commit from fork\n\n`int(r)` would wrap negative for r \u003e MaxInt64, slipping past the bounds check and causing an OOB read in encode.\n\nFix \u0026 add regression test."
    },
    {
      "commit": "539243b8823ee8f03e49969823d57c348c917536",
      "tree": "f8f06b7259ba2256650a32c675f93f7844daf2b6",
      "parents": [
        "bd9228c884559c21e572a0eaf827ee903bca805c"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Mon Jun 29 14:52:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 14:52:46 2026"
      },
      "message": "s2sx: Clean symlink targets (#1163)\n\nWhen self-extractor is extracting files from TAR validate that symlinks remains inside the destination.\n\nExecutables are already expected to be trusted and since they are embedded with the archive, so there really is no breach of trust.\n\nThis change is mainly to discourage false/pointless AI reports."
    },
    {
      "commit": "bd9228c884559c21e572a0eaf827ee903bca805c",
      "tree": "51467d6b53d938c083c2000ff03b3d00088feb33",
      "parents": [
        "4cc176c3325ba1d87aacfdea015a3a2038fefb08"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Jun 17 09:03:42 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 09:03:42 2026"
      },
      "message": "Apply go fix and check in CI (#1158)"
    },
    {
      "commit": "4cc176c3325ba1d87aacfdea015a3a2038fefb08",
      "tree": "611996d9256fbcb0b50494f9d549cc3b848293ba",
      "parents": [
        "4705fcbaf5155f466ca877527f66e88634cdf1c2"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Jun 17 07:57:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 07:57:10 2026"
      },
      "message": "zstd: Add true concurrent stream encoding (#1136)\n\n* zstd: Add true concurrent encoding\n\n```go\n// WithConcurrentBlocks enables job-based parallel compression for streams.\n// When enabled and concurrent \u003e 1, input is split into large sections (jobs)\n// that are compressed simultaneously by multiple goroutines.\n// Each non-first job receives an overlap prefix from the previous job for match context.\n// Output is flushed in order, producing a valid single-frame zstd stream.\n//\n// This is incompatible with dictionary encoding.\n// Cannot be changed with ResetWithOptions.\nfunc WithConcurrentBlocks(b bool) EOption {\n```\n\nExample:\n\n| Level   | 1 thread   | 4 threads          | 16 threads          | 1T ratio | 16T ratio |\n|---------|:----------:|:------------------:|:-------------------:|:--------:|:---------:|\n| fastest | 783 MB/s   | 2950 MB/s (3.8×)   | 6939 MB/s (8.9×)    | 12.24%   | 12.26%    |\n| default | 728 MB/s   | 2533 MB/s (3.5×)   | 5340 MB/s (7.3×)    | 10.67%   | 10.68%    |\n| better  | 434 MB/s   | 1105 MB/s (2.5×)   | 2206 MB/s (5.1×)    | 9.14%    | 9.21%     |\n| best    | 129 MB/s   | 367 MB/s (2.8×)    | 884 MB/s (6.8×)     | 8.48%    | 8.63%     |\n\n* Tweaks\n\n* Just disable when using dictionary encoding.\n\n* Fix Close nil-writer check ignoring concurrent buffer\n\nClose() checked s.w \u003d\u003d nil before the e.o.concurrentBlocks branch. In concurrent mode, Write fills js.filling (not s.filling), so the guard len(s.filling) \u003d\u003d 0 \u0026\u0026 s.nInput \u003d\u003d 0 would incorrectly return nil even with pending data. Fix: moved the concurrentBlocks branch before the nil-writer check, and added a matching nil-writer guard inside closeJobs() that checks js.filling instead of s.filling.\n\n* Clean up reuse\n\n* Share encoder channel with single-shot."
    },
    {
      "commit": "4705fcbaf5155f466ca877527f66e88634cdf1c2",
      "tree": "a839f3b8153f823e030820c75c2e64e4203c476b",
      "parents": [
        "e9c2e569c112ecc1ad8ab818ed7328e7178973e4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jun 03 08:15:39 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 08:15:39 2026"
      },
      "message": "build(deps): bump the github-actions group with 3 updates (#1157)\n\nBumps the github-actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [github/codeql-action](https://github.com/github/codeql-action) and [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).\n\n\nUpdates `actions/checkout` from 6.0.2 to 6.0.3\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v6.0.2...v6.0.3)\n\nUpdates `github/codeql-action` from 4.35.3 to 4.36.1\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/e46ed2cbd01164d986452f91f178727624ae40d7...87557b9c84dde89fdd9b10e88954ac2f4248e463)\n\nUpdates `goreleaser/goreleaser-action` from 7.2.1 to 7.2.2\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/1a80836c5c9d9e5755a25cb59ec6f45a3b5f41a8...5daf1e915a5f0af01ddbcd89a43b8061ff4f1a89)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 6.0.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: github/codeql-action\n  dependency-version: 4.36.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: goreleaser/goreleaser-action\n  dependency-version: 7.2.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "e9c2e569c112ecc1ad8ab818ed7328e7178973e4",
      "tree": "e4e1d1d7af2a6a64ee4357c4157d4a4c87eb78ae",
      "parents": [
        "ecdb779d8745b0b074dcee75d9f7fd2bd524aff8"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Mon May 25 08:06:28 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 08:06:28 2026"
      },
      "message": "huff0: Allow building table from oversized histogram. (#1156)\n\nA histogram of a block larger than max block size could cause huff0 to panic. Scale table down on BuildCTable."
    },
    {
      "commit": "ecdb779d8745b0b074dcee75d9f7fd2bd524aff8",
      "tree": "a9693e1b139b653ef7f9480f8bbb7f663863ef4f",
      "parents": [
        "38efa458d47cc5555ce4a08796ddf2bf5ca22d87"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu May 21 20:36:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 20:36:46 2026"
      },
      "message": "huff0: Allow building tables from histogram. (#1155)\n\n* huff0: Allow building tables from histogram.\n\nAdd interface to build tables from the histograms themselves.\n\nAdds direct method to export the current table and helpers for size reuse (also via histograms).\n\n* Check nil"
    },
    {
      "commit": "38efa458d47cc5555ce4a08796ddf2bf5ca22d87",
      "tree": "f7a5cdc16f1ab298b3cf42ac03ea34b1269290c5",
      "parents": [
        "5b9abedb0ceca2baed4ae217c23ea175075d86c2"
      ],
      "author": {
        "name": "Sai Asish Y",
        "email": "say.apm35@gmail.com",
        "time": "Thu May 21 15:11:11 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 15:11:11 2026"
      },
      "message": "zip: add NameDecoder callback for legacy encoding rewrite (#1150)"
    },
    {
      "commit": "5b9abedb0ceca2baed4ae217c23ea175075d86c2",
      "tree": "f42b2ffd2c602ff6cacf6eebdc0ce11ed5f739e0",
      "parents": [
        "dba8e6f41069ddb1fd8c33e4a325bad06d14f7d7"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu May 21 15:07:49 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 15:07:49 2026"
      },
      "message": "flate: Add inflate checkpoints (#1154)\n\nAllows adding an inflate end-of-block callback with checkpoint information. Callback is cleared on reset and cannot be re-applied to an existing Reader.\n\nFor resuming either use `WithResumeFrom` or assert the `ResetCP(io.Reader, flate.InflateCheckpoint) error` interface. The input stream should be forwarded to the compressed offset."
    },
    {
      "commit": "dba8e6f41069ddb1fd8c33e4a325bad06d14f7d7",
      "tree": "5b1465acbd04ba6db0641293aff41e62917be35b",
      "parents": [
        "0434480b0016df2129189d69ec9b212dd35cae38"
      ],
      "author": {
        "name": "Ali",
        "email": "149781771+z9z@users.noreply.github.com",
        "time": "Fri May 08 11:02:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 11:02:00 2026"
      },
      "message": "gzhttp: match qvalue parameter case-insensitively (RFC 7231) (#1149)\n\nCo-authored-by: Klaus Post \u003cklauspost@gmail.com\u003e"
    },
    {
      "commit": "0434480b0016df2129189d69ec9b212dd35cae38",
      "tree": "b1ed6cce70ebf095a437cd300da11a573ad598b7",
      "parents": [
        "fdcc9b63c4aacfa92fb6a56f2f39ea891ec8015a"
      ],
      "author": {
        "name": "Eugene Kliuchnikov",
        "email": "eustas@google.com",
        "time": "Thu May 07 20:43:49 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 20:43:49 2026"
      },
      "message": "snappy/s2: Limit length of varint in `decodedLen` (#1148)\n\nTo match C++ implementation"
    },
    {
      "commit": "fdcc9b63c4aacfa92fb6a56f2f39ea891ec8015a",
      "tree": "2422f8004c51e5e09ca3524ba0d7550de22de468",
      "parents": [
        "28ae5030398ba1d252a20d1998c9e0287da77162"
      ],
      "author": {
        "name": "Mikers",
        "email": "snissn@gmail.com",
        "time": "Thu May 07 12:07:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 12:07:46 2026"
      },
      "message": "zstd: avoid unused BuildDict encoder allocation (#1147)\n\nBuildDict initialized a bestFastEncoder before checking whether BuildDictOptions.Level was set. When callers requested an explicit level, that encoder was immediately replaced by eOpts.encoder(), so the large best-compression tables were allocated and discarded without being used.\n\nDelay bestFastEncoder construction until the default-level path that actually uses it. This keeps the Level \u003d\u003d 0 behavior unchanged while avoiding the unused encoder allocation for explicit levels.\n\nAdd round-trip coverage for both BuildDict level paths and a benchmark that reports the allocation difference between default and explicit-level dictionary builds."
    },
    {
      "commit": "28ae5030398ba1d252a20d1998c9e0287da77162",
      "tree": "52cc45a6d91ecc13f34555a81b4a5eac8fbcc467",
      "parents": [
        "ac2f5e87a3089bd58c974ca53cef71c7aa8bf877"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 08:40:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 08:40:46 2026"
      },
      "message": "build(deps): bump the github-actions group with 2 updates (#1146)\n\nBumps the github-actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).\n\n\nUpdates `github/codeql-action` from 4.35.1 to 4.35.3\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/c10b8064de6f491fea524254123dbe5e09572f13...e46ed2cbd01164d986452f91f178727624ae40d7)\n\nUpdates `goreleaser/goreleaser-action` from 7.0.0 to 7.2.1\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/ec59f474b9834571250b370d4735c50f8e2d1e29...1a80836c5c9d9e5755a25cb59ec6f45a3b5f41a8)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.35.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: goreleaser/goreleaser-action\n  dependency-version: 7.2.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ac2f5e87a3089bd58c974ca53cef71c7aa8bf877",
      "tree": "b6f842d201a7c218f2b45cedb4da1af44f36fffd",
      "parents": [
        "620d7b5cfbf89fbfdf69884f8a561a2981c25b11"
      ],
      "author": {
        "name": "Sebastiaan van Stijn",
        "email": "thaJeztah@users.noreply.github.com",
        "time": "Thu Apr 30 15:57:39 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 15:57:39 2026"
      },
      "message": "docs: use unix line-endings for markdown files (#1144)\n\n* docs: README: convert to unix line-endings\n\nSigned-off-by: Sebastiaan van Stijn \u003cgithub@gone.nl\u003e"
    },
    {
      "commit": "620d7b5cfbf89fbfdf69884f8a561a2981c25b11",
      "tree": "442af9ca209278eeb11b9ecc2d2e5425b762ab00",
      "parents": [
        "1b63f2fece784da6334068c671e3f94366bf9d68"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu Apr 30 15:56:19 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 15:56:19 2026"
      },
      "message": "s2: Fix amd64 stack frame corruption (#1145)\n\nFixes crash when pre-empted.\n\nFixes #1097 - see for analysis."
    },
    {
      "commit": "1b63f2fece784da6334068c671e3f94366bf9d68",
      "tree": "5ef649bd4c43a82958d27ad7f511ea31b8cdc5f2",
      "parents": [
        "3d86b893733380c370eba876f5beaaf63aeeea94"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Apr 07 10:03:34 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 10:03:34 2026"
      },
      "message": "build(deps): bump the github-actions group with 2 updates (#1141)\n\nBumps the github-actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [actions/setup-go](https://github.com/actions/setup-go).\n\n\nUpdates `github/codeql-action` from 4.32.4 to 4.35.1\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/89a39a4e59826350b863aa6b6252a07ad50cf83e...c10b8064de6f491fea524254123dbe5e09572f13)\n\nUpdates `actions/setup-go` from 6.3.0 to 6.4.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6.3.0...v6.4.0)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.35.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 6.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "3d86b893733380c370eba876f5beaaf63aeeea94",
      "tree": "0894e76672b0c45bfd72736b1912a0be30855931",
      "parents": [
        "15967def6890f5494829394274686436976c4936"
      ],
      "author": {
        "name": "Nhan (Nolan) Huynh",
        "email": "157712338+huynhanx03@users.noreply.github.com",
        "time": "Tue Apr 07 08:39:53 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 08:39:53 2026"
      },
      "message": "s2: pool hash tables in Go encode paths to reduce allocations (#1143)"
    },
    {
      "commit": "15967def6890f5494829394274686436976c4936",
      "tree": "39eb59127507f7a03958b56ef4cc486f73e50c1b",
      "parents": [
        "c5e0077f50a3268a27b02816adc48ebfb535c65e"
      ],
      "author": {
        "name": "Justin Mayhew",
        "email": "mayhew@live.ca",
        "time": "Sun Mar 29 13:52:07 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 13:52:07 2026"
      },
      "message": "gzhttp: Canonicalize ETag header (#1139)\n\nThis ensures the fast-path is hit in the net/http header functions for a\nminor speed improvement."
    },
    {
      "commit": "c5e0077f50a3268a27b02816adc48ebfb535c65e",
      "tree": "acecc5a87509d5ebc25c68866dfefd92f8ea87a8",
      "parents": [
        "fd3f23e2d1d0fca18f38ee2dfedb73d0ca5b02e5"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu Mar 19 08:46:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 08:46:35 2026"
      },
      "message": "zstd: Fix encoder changing dictionary with same ID (#1135)\n\n* zstd: Fix encoder changing dictionary with same ID\n\nFix crash from `Enoder.ResetWithOptions` when replacing a dictionary with another one with same.\n\nDictionary tables would not get reset appropriately when there was a new ID. Leading to references outside of valid entries.\n\n* Fix changing non-dict \u003c-\u003e dict.\n\n* Update zstd/encoder.go\n\nCo-authored-by: coderabbitai[bot] \u003c136622811+coderabbitai[bot]@users.noreply.github.com\u003e\n\n* Better tests.\n\n---------\n\nCo-authored-by: coderabbitai[bot] \u003c136622811+coderabbitai[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "fd3f23e2d1d0fca18f38ee2dfedb73d0ca5b02e5",
      "tree": "7fd6072a2364a82209eb132b3ea9f195fc7b14db",
      "parents": [
        "8233c587ef6e7b0f5168bfc08e63ea37e97b2d36"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Mar 18 17:42:07 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 17:42:07 2026"
      },
      "message": "zstd: Default to full zero frames (#1134)\n\nProbably easiest to reference this: https://github.com/klauspost/stdgozstd/issues/1\n\nThe decoder still accepts both."
    },
    {
      "commit": "8233c587ef6e7b0f5168bfc08e63ea37e97b2d36",
      "tree": "7833e3c673f2513f6ddbd838c5df3bc8c9173f36",
      "parents": [
        "bcf0d1289c8df01178af919dd5d8ff83afaa5471"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Mar 18 17:30:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 17:30:33 2026"
      },
      "message": "flate: Clean up histogram order (#1133)\n\nShouldn\u0027t have any practical impact"
    },
    {
      "commit": "bcf0d1289c8df01178af919dd5d8ff83afaa5471",
      "tree": "36db6922bea6b81d7116ed9ef4cc52f26ccb6202",
      "parents": [
        "cf758fe1c54e3049f302474d2a98afd3acc1a884"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Mar 02 17:21:47 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 17:21:47 2026"
      },
      "message": "build(deps): bump the github-actions group with 3 updates (#1132)\n\nBumps the github-actions group with 3 updates: [github/codeql-action](https://github.com/github/codeql-action), [actions/setup-go](https://github.com/actions/setup-go) and [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).\n\n\nUpdates `github/codeql-action` from 4.32.0 to 4.32.4\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/b20883b0cd1f46c72ae0ba6d1090936928f9fa30...89a39a4e59826350b863aa6b6252a07ad50cf83e)\n\nUpdates `actions/setup-go` from 6.2.0 to 6.3.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6.2.0...v6.3.0)\n\nUpdates `goreleaser/goreleaser-action` from 6.4.0 to 7.0.0\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/e435ccd777264be153ace6237001ef4d979d3a7a...ec59f474b9834571250b370d4735c50f8e2d1e29)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.32.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 6.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: goreleaser/goreleaser-action\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "cf758fe1c54e3049f302474d2a98afd3acc1a884",
      "tree": "18c059e88b578b9ef1d8e69f6c5ad4a7312b8bf7",
      "parents": [
        "77cc5203de2eb0034a63eace182bb28aa869cb83"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Tue Feb 24 13:10:04 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 24 13:10:04 2026"
      },
      "message": "ci: Upgrade Go versions, clean up (#1130)\n\n* ci: Upgrade Go versions, clean up\n\n* Run go fix\n* Upgrade goreleaser\n* Remove rand.Seed\n* Goreleaser broken again."
    },
    {
      "commit": "77cc5203de2eb0034a63eace182bb28aa869cb83",
      "tree": "f9eeb170e308a102e41fbab824c742723dff192b",
      "parents": [
        "c03560f58ab1f595f17838b482483849d585d0c2"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Feb 18 15:19:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 18 15:19:38 2026"
      },
      "message": "Add v1.18.4"
    },
    {
      "commit": "c03560f58ab1f595f17838b482483849d585d0c2",
      "tree": "421d2c6116b9430be20563cd2bc19fb396a25d17",
      "parents": [
        "0874ab860fc90779cb032996aee0c9e11880738c"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu Feb 05 15:29:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 05 15:29:14 2026"
      },
      "message": "zstd: Add ResetWithOptions to encoder/decoder (#1122)\n\n## New API Methods\n\n```\n  func (*Encoder) ResetWithOptions(w io.Writer, opts ...EOption) error\n  func (*Decoder) ResetWithOptions(r io.Reader, opts ...DOption) error\n\n```\n\nNew Options\n\n  // Encoder - clears dictionary\n  `WithEncoderDictDelete() EOption`\n\n  // Decoder - removes dicts by ID; no args clears all\n  `WithDecoderDictDelete(ids ...uint32) DOption`\n\nOption Reset Compatibility\n\n  Can be changed with ResetWithOptions:\n  - Encoder: WithEncoderCRC, WithEncoderPadding, WithZeroFrames, WithAllLitEntropyCompression, WithNoEntropyCompression, WithSingleSegment, WithEncoderDict, WithEncoderDictRaw, WithEncoderDictDelete\n  - Decoder: WithDecoderMaxMemory, WithDecoderMaxWindow, WithDecoderDicts, WithDecoderDictRaw, WithDecoderDictDelete, WithDecodeAllCapLimit, IgnoreChecksum\n\n  Cannot be changed with ResetWithOptions:\n  - Encoder: WithEncoderConcurrency, WithWindowSize, WithEncoderLevel, WithLowerEncoderMem\n  - Decoder: WithDecoderLowmem, WithDecoderConcurrency, WithDecodeBuffersBelow"
    },
    {
      "commit": "0874ab860fc90779cb032996aee0c9e11880738c",
      "tree": "c179ac6ab8e3b3c478755ec3d41edd3f3cea0829",
      "parents": [
        "4a368369aa67e1da850e9a38fbbbea7c20cfd377"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Feb 02 09:57:33 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 02 09:57:33 2026"
      },
      "message": "build(deps): bump the github-actions group with 3 updates (#1126)\n\nBumps the github-actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [github/codeql-action](https://github.com/github/codeql-action) and [actions/setup-go](https://github.com/actions/setup-go).\n\n\nUpdates `actions/checkout` from 6.0.1 to 6.0.2\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v6.0.1...v6.0.2)\n\nUpdates `github/codeql-action` from 4.31.9 to 4.32.0\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/5d4e8d1aca955e8d8589aabd499c5cae939e33c7...b20883b0cd1f46c72ae0ba6d1090936928f9fa30)\n\nUpdates `actions/setup-go` from 6.1.0 to 6.2.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6.1.0...v6.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 6.0.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: github/codeql-action\n  dependency-version: 4.32.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 6.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4a368369aa67e1da850e9a38fbbbea7c20cfd377",
      "tree": "73bf2f419812bc3cd058c134e2b9c8e4a073bfab",
      "parents": [
        "4309644706928691448da21eaa03895b982e086c"
      ],
      "author": {
        "name": "Zach Wasserman",
        "email": "zach@fleetdm.com",
        "time": "Wed Jan 28 08:54:24 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 28 08:54:24 2026"
      },
      "message": "doc: Clarify documentation in readme (#1125)\n\nReduce duplication, improve consistency, fix missing language"
    },
    {
      "commit": "4309644706928691448da21eaa03895b982e086c",
      "tree": "d041c0d6b7d4b1a46da547acce7b6190f57b6517",
      "parents": [
        "c262ec6542b376c1a7da652011385a3109d8026b"
      ],
      "author": {
        "name": "Nimit Suwannagate",
        "email": "ethaizone@hotmail.com",
        "time": "Thu Jan 22 16:47:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 22 16:47:57 2026"
      },
      "message": "zstd: document concurrency option handling in encoder (#1124)\n\n* fix: concurrency option handling in encoder\n\nUpdate concurrency validation and default behavior follow comment of this function\n\n* Correct concurrency validation message\n\nUpdated error message to reflect that concurrency must be \u003e\u003d 0 instead of at least 1.\n\n* Clarify comments and error messages in encoder_options.go\n\n* Update comment for WithEncoderConcurrency function\n\n* Fix error message for decoder concurrency option"
    },
    {
      "commit": "c262ec6542b376c1a7da652011385a3109d8026b",
      "tree": "4beb7c61dd6912c2da6bcbf4b759c9803dcdf2af",
      "parents": [
        "861ca972e91cf227262e01e4d343f32787cd396d"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Fri Jan 16 15:22:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 16 15:22:36 2026"
      },
      "message": "Update README.md"
    },
    {
      "commit": "861ca972e91cf227262e01e4d343f32787cd396d",
      "tree": "abe76c541cb028fe193eea5122111f5d511abf86",
      "parents": [
        "03de960a317daf22b1c4f00c9337137cb37ea078"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Fri Jan 16 10:04:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 16 10:04:48 2026"
      },
      "message": "Downstream CVE-2025-61728 (#1123)\n\n* Downstream CVE-2025-61728\n* Use range in benchmark instead\n\nSee https://github.com/golang/go/issues/77102\n"
    },
    {
      "commit": "03de960a317daf22b1c4f00c9337137cb37ea078",
      "tree": "4a00471bb52747e073cd6e0dc3b7df67cbaca0c2",
      "parents": [
        "bb1ab3b2909e20e8f21999d44118a22b4496864f"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Jan 14 09:41:46 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 14 09:41:46 2026"
      },
      "message": "gzhttp: Add zstandard to server handler wrapper (#1121)\n\nBoth gzip and zstd compression are now enabled by default. When a client supports both, zstd is preferred due to its better compression ratio and speed.\n\nZstd compression is enabled by default alongside gzip. When the client supports both, zstd is preferred because it typically offers better compression ratios and faster decompression.\n\nThe server uses `Accept-Encoding` header negotiation to select the best encoding:\n- If client only accepts `gzip` → response is gzip compressed\n- If client only accepts `zstd` → response is zstd compressed\n- If client accepts both with equal qvalues → zstd is used (configurable)\n- If client specifies qvalues (e.g., `gzip;q\u003d1.0, zstd;q\u003d0.5`) → higher qvalue wins\n\nDefault zstd settings are conservative for broad compatibility:\n- Level: `SpeedFastest` (1) - maximum speed\n- Window size: 128KB - minimal memory usage\n- Concurrency: 1 - single-threaded per request\n"
    },
    {
      "commit": "bb1ab3b2909e20e8f21999d44118a22b4496864f",
      "tree": "a458a6b57700e933d1f35ebfd4c97f98b5ec270b",
      "parents": [
        "986a51ed1cf18e2ae85f6a72a5e40b368a12611e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jan 01 20:59:22 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 01 20:59:22 2026"
      },
      "message": "build(deps): bump the github-actions group with 2 updates (#1120)\n\nBumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `actions/checkout` from 6.0.0 to 6.0.1\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v6...v6.0.1)\n\nUpdates `github/codeql-action` from 4.31.6 to 4.31.9\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/fe4161a26a8629af62121b670040955b330f9af2...5d4e8d1aca955e8d8589aabd499c5cae939e33c7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 6.0.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: github/codeql-action\n  dependency-version: 4.31.9\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "986a51ed1cf18e2ae85f6a72a5e40b368a12611e",
      "tree": "33001d35f6969062e28f613dad05d7842785f7a8",
      "parents": [
        "fbe3b12d6f8acb26c6c2028f83dc38165a4b91ce"
      ],
      "author": {
        "name": "Mathias Bogaert",
        "email": "254434+analytically@users.noreply.github.com",
        "time": "Tue Dec 02 08:58:59 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 02 08:58:59 2025"
      },
      "message": "fix(gzhttp): preserve qvalue when extra parameters follow in Accept-Encoding (#1116)\n\nparseCoding() reset qvalue to DefaultQValue on every loop iteration,\ncausing \"gzip;q\u003d0.5;level\u003d6\" to incorrectly return qvalue\u003d1.0 instead\nof 0.5.\n\nMove qvalue initialization before the loop.\n\nSigned-off-by: Mathias Bogaert \u003cmathias.bogaert@gmail.com\u003e"
    },
    {
      "commit": "fbe3b12d6f8acb26c6c2028f83dc38165a4b91ce",
      "tree": "17f4e41c9bad74799bb3bd793761379c03d2f232",
      "parents": [
        "daa180db3fbda1a00e877a5226e73f3b6b2422ad"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Dec 02 08:37:51 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 02 08:37:51 2025"
      },
      "message": "build(deps): bump the github-actions group with 3 updates (#1118)\n\nBumps the github-actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [github/codeql-action](https://github.com/github/codeql-action) and [actions/setup-go](https://github.com/actions/setup-go).\n\n\nUpdates `actions/checkout` from 5.0.0 to 6.0.0\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v5...v6)\n\nUpdates `github/codeql-action` from 4.31.2 to 4.31.6\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/0499de31b99561a6d14a36a5f662c2a54f91beee...fe4161a26a8629af62121b670040955b330f9af2)\n\nUpdates `actions/setup-go` from 6.0.0 to 6.1.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6...v6.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n- dependency-name: github/codeql-action\n  dependency-version: 4.31.6\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "daa180db3fbda1a00e877a5226e73f3b6b2422ad",
      "tree": "aeb939f9670965198ea6be9c0c20d97a615b5d97",
      "parents": [
        "444d5d9b74cdd224f607dea687edfc584fd493f6"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Mon Dec 01 09:22:21 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 09:22:21 2025"
      },
      "message": "Change log"
    },
    {
      "commit": "444d5d9b74cdd224f607dea687edfc584fd493f6",
      "tree": "1d5a1734ee3c1e2505f624a45bbacc979ea2b792",
      "parents": [
        "503c02816f2fbb1b1afa2de9c5e21146eb9aa812"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Mon Dec 01 09:04:34 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 09:04:34 2025"
      },
      "message": "Fix invalid encoding on level 9 with single value input (#1115)\n\n* Fix invalid encoding on level 9 with single value input\n\nWith single value input and a full block write (\u003e\u003d64K) the indexing function would overflow a uint16 to a 0.\n\nThis would make it impossible to generate a valid huffman table for the literal size prediction.\n\nIn turn this would mean that the entire block would be output as literals - since the cost of the value would be 0 bits.\n\nThis would in turn mean that EOB could not be encoded for the bit writer - since there were no matches. This was previously being satisfied with \"filling\".\n\nFixes:\n\n1. First never encode more than `maxFlateBlockTokens` - 32K for the literal estimate table.\n2. Always include EOB explicitly - if somehow literals should slip through.\n3. Add test that will write big single-value input as regression test. Others were using copy that does smaller writes.\n\nFixes #1114\n\n* Retract v1.18.1"
    },
    {
      "commit": "503c02816f2fbb1b1afa2de9c5e21146eb9aa812",
      "tree": "4f04187ceb1c56f16c32a9ded1f7b0a4c44c959f",
      "parents": [
        "701ca28bd550f622eb2dbccf0d7bd412ac41b0ad"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Nov 02 09:11:20 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 02 09:11:20 2025"
      },
      "message": "build(deps): bump github/codeql-action in the github-actions group (#1111)\n\nBumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action` from 3.30.5 to 4.31.2\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/3599b3baa15b485a2e49ef411a7a4bb2452e7f93...0499de31b99561a6d14a36a5f662c2a54f91beee)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.31.2\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "701ca28bd550f622eb2dbccf0d7bd412ac41b0ad",
      "tree": "140b27db22cd32b737a5307de03ef35d45d048ab",
      "parents": [
        "e0b47ffa6861e3ce2ff3225f739ed234fb3df170"
      ],
      "author": {
        "name": "Raul",
        "email": "79992751+RXamzin@users.noreply.github.com",
        "time": "Fri Oct 24 10:23:38 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 24 10:23:38 2025"
      },
      "message": "flate: reduce stateless allocations (#1106)\n\nAfter updating GO to v1.24+, a sharp increase in CPU utilization was detected. Heap profile helped to reveal increased memory allocations by Write and Close methods of stateless gzip.Writer mode. This PR optimizes problem area by using sync.Pool and later allocation of tokens object.\n\nBenchmarks:\n\nBEFORE\n\n```\nBenchmarkEncodeDigitsSL1e4-12              10141            115946 ns/op          86.25 MB/s      542379 B/op          3 allocs/op\nBenchmarkEncodeDigitsSL1e5-12               1602            730674 ns/op         136.86 MB/s      541377 B/op          2 allocs/op\nBenchmarkEncodeDigitsSL1e6-12                175           6851506 ns/op         145.95 MB/s      541542 B/op          2 allocs/op\nBenchmarkEncodeTwainSL1e4-12                9708            131564 ns/op          76.01 MB/s      542146 B/op          3 allocs/op\nBenchmarkEncodeTwainSL1e5-12                1663            684854 ns/op         146.02 MB/s      541463 B/op          2 allocs/op\nBenchmarkEncodeTwainSL1e6-12                 177           6435648 ns/op         155.38 MB/s      541654 B/op          2 allocs/op\n```\n\nAFTER\n\n```\nBenchmarkEncodeDigitsSL1e4-12              34747             33800 ns/op         295.86 MB/s           8 B/op          0 allocs/op\nBenchmarkEncodeDigitsSL1e5-12               1771            640723 ns/op         156.07 MB/s         160 B/op          0 allocs/op\nBenchmarkEncodeDigitsSL1e6-12                181           6759226 ns/op         147.95 MB/s        1573 B/op          0 allocs/op\nBenchmarkEncodeTwainSL1e4-12               35294             35304 ns/op         283.26 MB/s           8 B/op          0 allocs/op\nBenchmarkEncodeTwainSL1e5-12                1939            585755 ns/op         170.72 MB/s         146 B/op          0 allocs/op\nBenchmarkEncodeTwainSL1e6-12                 181           6505389 ns/op         153.72 MB/s        1573 B/op          0 allocs/op\n```\n\n\u003c!-- This is an auto-generated comment: release notes by coderabbit.ai --\u003e\n## Summary by CodeRabbit\n\n- **Refactor**\n  - Optimized compression internals to reuse buffers via pooling, improving throughput and reducing memory use during repeated operations.\n  - Enhances performance and consistency for both dictionary and non-dictionary compression paths across large blocks.\n  - No changes to public APIs or user-facing behavior; workflows remain the same.\n  - Users may see faster compression and lower memory footprint under sustained/high-volume workloads.\n\u003c!-- end of auto-generated comment: release notes by coderabbit.ai --\u003e"
    },
    {
      "commit": "e0b47ffa6861e3ce2ff3225f739ed234fb3df170",
      "tree": "c84bec3db8e682d2c3f36f50c9bcea5d7002f0e0",
      "parents": [
        "d10b5259eef9d3da9a58bedad041b36731967489"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu Oct 23 16:30:46 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 23 16:30:46 2025"
      },
      "message": "Update changelog"
    },
    {
      "commit": "d10b5259eef9d3da9a58bedad041b36731967489",
      "tree": "272c41c494035e996544f04d05f6f0498bbc9d07",
      "parents": [
        "3c0d30844ced777738c26ca35394953ceb2073ae"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 02 12:00:22 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 02 12:00:22 2025"
      },
      "message": "build(deps): bump the github-actions group with 2 updates (#1105)\n\nBumps the github-actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [actions/setup-go](https://github.com/actions/setup-go).\n\n\nUpdates `github/codeql-action` from 3.30.0 to 3.30.5\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/2d92b76c45b91eb80fc44c74ce3fce0ee94e8f9d...3599b3baa15b485a2e49ef411a7a4bb2452e7f93)\n\nUpdates `actions/setup-go` from 5.5.0 to 6.0.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v5.5.0...v6)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 3.30.5\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 6.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "3c0d30844ced777738c26ca35394953ceb2073ae",
      "tree": "a72689579f4e7abf11d301487c0905394ae679f9",
      "parents": [
        "6e2f5d5b240137060e9d7c44f3c31bad2927593f"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Sun Sep 21 12:44:17 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 21 12:44:17 2025"
      },
      "message": "flate: Faster load+st0re (#1104)\n\n"
    },
    {
      "commit": "6e2f5d5b240137060e9d7c44f3c31bad2927593f",
      "tree": "f582cc00948987d84a3f929b14664bc2fa586d62",
      "parents": [
        "bda824b0286d81f2a988c89f9a8c913607e67c36"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Sun Sep 21 09:38:17 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 21 09:38:17 2025"
      },
      "message": "flate: Use exact sizes for huffman tables (#1103)\n\nWhen filling is disabled calculate exact table sizes."
    },
    {
      "commit": "bda824b0286d81f2a988c89f9a8c913607e67c36",
      "tree": "9e5db643b1978a3686ddab10312edbe2f4b1d9a7",
      "parents": [
        "f44517c79cda0344a79a31a31d09cc8a532e920e"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Fri Sep 19 13:44:26 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 19 13:44:26 2025"
      },
      "message": "flate: Add examples (#1102)\n\nFixes minor difference to stdlib, which doesn\u0027t do a 0 byte write."
    },
    {
      "commit": "f44517c79cda0344a79a31a31d09cc8a532e920e",
      "tree": "eaef6978936cdbd0458ff961cfa3ad1bbdcdde15",
      "parents": [
        "54cb7a5e7c540cf0b50aaa5dd36a3721db2af1e5"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Fri Sep 19 10:05:21 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 19 10:05:21 2025"
      },
      "message": "flate: Simplify matchlen (#1101)\n\nJust use the dedicated function.\n\n\u003c!-- This is an auto-generated comment: release notes by coderabbit.ai --\u003e\n\n## Summary by CodeRabbit\n\n* **Refactor**\n  * Optimized the fast compression path by consolidating match-length calculations for fewer comparisons.\n  * Removed an unused internal dependency, slightly reducing binary size.\n  * Improves compression speed and reduces CPU usage, especially on large or repetitive data.\n  * No changes to public APIs or compressed output; behavior remains compatible.\n  * Error handling and control flow are unaffected.\n  * No configuration changes required.\n\n\u003c!-- end of auto-generated comment: release notes by coderabbit.ai --\u003e"
    },
    {
      "commit": "54cb7a5e7c540cf0b50aaa5dd36a3721db2af1e5",
      "tree": "db69e9f99d8a39a665ce4f9f69732c0a7428f2fb",
      "parents": [
        "c43fcbb924ee8bc8453998094924d896bbe61f3a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Sep 02 17:37:59 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 02 17:37:59 2025"
      },
      "message": "build(deps): bump the github-actions group with 3 updates (#1096)\n\nBumps the github-actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [github/codeql-action](https://github.com/github/codeql-action) and [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).\n\n\nUpdates `actions/checkout` from 4 to 5\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v4...v5)\n\nUpdates `github/codeql-action` from 3.29.7 to 3.30.0\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/51f77329afa6477de8c49fc9c7046c15b9a4e79d...2d92b76c45b91eb80fc44c74ce3fce0ee94e8f9d)\n\nUpdates `goreleaser/goreleaser-action` from 6.3.0 to 6.4.0\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/9c156ee8a17a598857849441385a2041ef570552...e435ccd777264be153ace6237001ef4d979d3a7a)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: \u00275\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: github-actions\n- dependency-name: github/codeql-action\n  dependency-version: 3.30.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: goreleaser/goreleaser-action\n  dependency-version: 6.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "c43fcbb924ee8bc8453998094924d896bbe61f3a",
      "tree": "eb1bdd8b02cb3f2f96d26ca24dfd114a00848c40",
      "parents": [
        "86a9489c72d0742ebe66ee9543d0f78abd82ebcd"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Tue Aug 26 10:34:22 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 10:34:22 2025"
      },
      "message": "Run modernize. Deprecate Go 1.22 (#1095)\n\n* Run modernize. Deprecate Go 1.22\n* Update subpackages\n* Bump tools, ref: https://github.com/golang/go/issues/74462\n\nRunning: https://pkg.go.dev/golang.org/x/tools/gopls/internal/analysis/modernize\n"
    },
    {
      "commit": "86a9489c72d0742ebe66ee9543d0f78abd82ebcd",
      "tree": "591fb0fed6c447023a5abc918112283f3636a633",
      "parents": [
        "ad4a0301d09c368139fd8171be06a8e0508d6088"
      ],
      "author": {
        "name": "Ryan Fowler",
        "email": "ryan.fowler19@gmail.com",
        "time": "Wed Aug 13 08:35:28 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 13 08:35:28 2025"
      },
      "message": "gzhttp: remove redundant err check in zstdReader (#1090)\n\n"
    },
    {
      "commit": "ad4a0301d09c368139fd8171be06a8e0508d6088",
      "tree": "479a0800c5c75e71aeb3315e68ae670672b4a57b",
      "parents": [
        "1a8c0e48e1fa4245694103fc47721c83a9135588"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Aug 02 10:10:36 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 02 10:10:36 2025"
      },
      "message": "build(deps): bump github/codeql-action in the github-actions group (#1087)\n\nBumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action` from 3.29.2 to 3.29.5\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/181d5eefc20863364f96762470ba6f862bdef56b...51f77329afa6477de8c49fc9c7046c15b9a4e79d)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 3.29.5\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "1a8c0e48e1fa4245694103fc47721c83a9135588",
      "tree": "468f250b8f0a9ce0a7e37b05eb4340dd315be867",
      "parents": [
        "d140606c3ebe8acc96157ebac19443621dd73c76"
      ],
      "author": {
        "name": "Old",
        "email": "167892481+travelpolicy@users.noreply.github.com",
        "time": "Mon Jul 21 09:51:06 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 21 09:51:06 2025"
      },
      "message": "Avoiding extra allocation in Reset (#1086)\n\n"
    },
    {
      "commit": "d140606c3ebe8acc96157ebac19443621dd73c76",
      "tree": "065db14df93ec0de0e0fca4188bd3f29b45258bd",
      "parents": [
        "0792fc568a5a00741187e9c4af530f0500906ea3"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Jul 02 11:13:45 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 02 11:13:45 2025"
      },
      "message": "Fix simple encoder src/dst swapped (#1083)\n\n* Fix simple encoder src/dst swapped\n\nFixes #1081 (unreleased)\n\n* Remove unused code."
    },
    {
      "commit": "0792fc568a5a00741187e9c4af530f0500906ea3",
      "tree": "ceeeb65a0816a2f4daba7b2c4c7cd3c183fdaa1e",
      "parents": [
        "0b8a32cac1934962e28a85ecfdb0688af278be50"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 02 09:50:48 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 02 09:50:48 2025"
      },
      "message": "build(deps): bump github/codeql-action in the github-actions group (#1082)\n\nBumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action` from 3.28.18 to 3.29.2\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/ff0a06e83cb2de871e5a09832bc6a81e7276941f...181d5eefc20863364f96762470ba6f862bdef56b)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 3.29.2\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "0b8a32cac1934962e28a85ecfdb0688af278be50",
      "tree": "5743103d0308d31c34cfb97a445ed03c7727b96d",
      "parents": [
        "3fb783694c3f3dcf430070b623803c203321adb1"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Tue Jun 17 13:52:49 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 17 13:52:49 2025"
      },
      "message": "Add simple zstd EncodeTo/DecodeTo functions (#1079)\n\nRequires Go 1.24, since it uses weak pointers.\n\n```\n// EncodeTo appends the encoded data from src to dst.\nfunc EncodeTo(dst []byte, src []byte) []byte\n\n// DecodeTo appends the decoded data from src to dst.\n// The maximum decoded size is 1GiB,\n// not including what may already be in dst.\nfunc DecodeTo(dst []byte, src []byte) ([]byte, error)\n```"
    },
    {
      "commit": "3fb783694c3f3dcf430070b623803c203321adb1",
      "tree": "2c82cfb586855c815c5e80efac4570adbe5fbbfd",
      "parents": [
        "33f59b4f9a998ce6b7440b1885d0aff530fef36d"
      ],
      "author": {
        "name": "Vytenis Darulis",
        "email": "vytenis.darulis@chronosphere.io",
        "time": "Thu Jun 05 09:46:45 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 05 09:46:45 2025"
      },
      "message": "s2: check for cap, not len of buffer in EncodeBetter/Best (#1080)\n\n* Consistently check for capacity of provided buffer\n\n* Make sure benchmarks reuse memory\n\n* Fix snapref, too"
    },
    {
      "commit": "33f59b4f9a998ce6b7440b1885d0aff530fef36d",
      "tree": "40bc8db936dfbfcfec528a97552c4a2390fe49f4",
      "parents": [
        "dee68d8e897eb9e9fcc11b14abbf65c229b0918f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 02 12:24:30 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 02 12:24:30 2025"
      },
      "message": "build(deps): bump the github-actions group with 2 updates (#1077)\n\nBumps the github-actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [actions/setup-go](https://github.com/actions/setup-go).\n\n\nUpdates `github/codeql-action` from 3.28.16 to 3.28.18\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/28deaeda66b76a05916b6923827895f2b14ab387...ff0a06e83cb2de871e5a09832bc6a81e7276941f)\n\nUpdates `actions/setup-go` from 5.4.0 to 5.5.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v5.4.0...v5.5.0)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 3.28.18\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 5.5.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "dee68d8e897eb9e9fcc11b14abbf65c229b0918f",
      "tree": "b2b212c8d3dbf784128c673f2c5431f060144709",
      "parents": [
        "8df4d013ff17ae31f0e013c4e56759037ff775e6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri May 02 09:14:16 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 02 09:14:16 2025"
      },
      "message": "build(deps): bump github/codeql-action in the github-actions group (#1075)\n\nBumps the github-actions group with 1 update: [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action` from 3.28.13 to 3.28.16\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/1b549b9259bda1cb5ddde3b41741a82a2d15a841...28deaeda66b76a05916b6923827895f2b14ab387)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 3.28.16\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8df4d013ff17ae31f0e013c4e56759037ff775e6",
      "tree": "0ea67dbad14eb2e1ffe64d7febe2865a1f1c728b",
      "parents": [
        "e074e40f7175a21c59506ff5ba7a3466efc89bf6"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 02 06:21:33 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 02 06:21:33 2025"
      },
      "message": "build(deps): bump the github-actions group with 3 updates (#1072)\n\nBumps the github-actions group with 3 updates: [github/codeql-action](https://github.com/github/codeql-action), [actions/setup-go](https://github.com/actions/setup-go) and [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).\n\n\nUpdates `github/codeql-action` from 3.28.10 to 3.28.13\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d...1b549b9259bda1cb5ddde3b41741a82a2d15a841)\n\nUpdates `actions/setup-go` from 5.3.0 to 5.4.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v5.3.0...v5.4.0)\n\nUpdates `goreleaser/goreleaser-action` from 6.2.1 to 6.3.0\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/90a3faa9d0182683851fbfa97ca1a2cb983bfca3...9c156ee8a17a598857849441385a2041ef570552)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 3.28.13\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-version: 5.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: goreleaser/goreleaser-action\n  dependency-version: 6.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "e074e40f7175a21c59506ff5ba7a3466efc89bf6",
      "tree": "8eb3f1928ca4d38e0d14f69b32f9ea375187b770",
      "parents": [
        "520e81d628b263802066e4c3802bdb5ae2191ffe"
      ],
      "author": {
        "name": "Burkov Egor",
        "email": "xwooffie@gmail.com",
        "time": "Thu Mar 27 11:13:22 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 27 11:13:22 2025"
      },
      "message": "typo : s2/index.go (#1069)\n\n"
    },
    {
      "commit": "520e81d628b263802066e4c3802bdb5ae2191ffe",
      "tree": "5dbb8ac09026b1db37451136a1d24c14faa4d5e6",
      "parents": [
        "29a7d27244330e9bbe1fa877bad3454460ef69c5"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Tue Mar 18 10:35:54 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 18 10:35:54 2025"
      },
      "message": "Add notice to S2 about MinLZ (#1065)\n\nI have taken the experiences from this library and created a backwards compatible compression package called MinLZ.\n\nThat package will seamlessly decode S2 content, making the transition from this package fairly trivial.\n\nThere are many improvements to pretty much all aspects of S2 since we have \"broken free\" of the Snappy format specification.\nYou can read a writeup on [Design and Improvements over S2](https://gist.github.com/klauspost/a25b66198cdbdf7b5b224f670c894ed5).\n\nThe only aspect not covered is custom dictionary encoding. While I do intend to fix errors in this package,\nI do not expect to make significant improvements, since I consider MinLZ a better basis for going forward.\n\nSee https://github.com/minio/minlz for all details."
    },
    {
      "commit": "29a7d27244330e9bbe1fa877bad3454460ef69c5",
      "tree": "21e5fa03958f77329fdec03ec715eca2684ceec4",
      "parents": [
        "517288e9a6e1dd4dea10ad42ffe2829c58dadf51"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu Mar 13 18:29:26 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 13 18:29:26 2025"
      },
      "message": "zstd: Fix incorrect buffer size in dictionary encodes (#1059)\n\nFix incorrect dLongTableShardSize leading to inefficient zeroing of\n\nAlso make shards 128 bytes to reduce memory use somewhat."
    },
    {
      "commit": "517288e9a6e1dd4dea10ad42ffe2829c58dadf51",
      "tree": "e1b884623e8aeba7bc723ec7ac9f770b3ab4370b",
      "parents": [
        "8e79dc4b98d4c5a09c62a2546b79c14edf7c3e38"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Mar 02 21:28:24 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 02 21:28:24 2025"
      },
      "message": "build(deps): bump the github-actions group with 2 updates (#1056)\n\nBumps the github-actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).\n\n\nUpdates `github/codeql-action` from 3.28.8 to 3.28.10\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/dd746615b3b9d728a6a37ca2045b68ca76d4841a...b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d)\n\nUpdates `goreleaser/goreleaser-action` from 6.1.0 to 6.2.1\n- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)\n- [Commits](https://github.com/goreleaser/goreleaser-action/compare/9ed2f89a662bf1735a48bc8557fd212fa902bebf...90a3faa9d0182683851fbfa97ca1a2cb983bfca3)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: goreleaser/goreleaser-action\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8e79dc4b98d4c5a09c62a2546b79c14edf7c3e38",
      "tree": "72c14c899b8839eee21744de6278ba677379dcb2",
      "parents": [
        "df8e99c8d015080686afb9b70a88791dd16a97a6"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Feb 19 09:26:03 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 19 09:26:03 2025"
      },
      "message": "Deprecate Go 1.21 and add 1.24 (#1055)\n\n* Deprecate Go 1.21 and add 1.24\n* Update s2sx go.mod\n\nRemove old docs, prep for new release.\n\n"
    },
    {
      "commit": "df8e99c8d015080686afb9b70a88791dd16a97a6",
      "tree": "4a8419b288c3a4f2e42e1cc9ecb198e2b099c58c",
      "parents": [
        "7787431d606fe7748391cb5009cee0cf966d1cd9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Feb 02 12:02:32 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 02 12:02:32 2025"
      },
      "message": "build(deps): bump the github-actions group with 2 updates (#1053)\n\nBumps the github-actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [actions/setup-go](https://github.com/actions/setup-go).\n\n\nUpdates `github/codeql-action` from 3.28.0 to 3.28.8\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/48ab28a6f5dbc2a99bf1e0131198dd8f1df78169...dd746615b3b9d728a6a37ca2045b68ca76d4841a)\n\nUpdates `actions/setup-go` from 5.2.0 to 5.3.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v5.2.0...v5.3.0)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "7787431d606fe7748391cb5009cee0cf966d1cd9",
      "tree": "3b83ac08520f9e1cf402b2a191bd9140884ef87c",
      "parents": [
        "0bf3ecbea777ec39f7919b47e464a046254e29a8"
      ],
      "author": {
        "name": "Bbulatov",
        "email": "47882558+Bbulatov@users.noreply.github.com",
        "time": "Fri Jan 31 16:07:05 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 31 16:07:05 2025"
      },
      "message": "zstd: fix unused debug code (#1052)\n\nCo-authored-by: Марк Булатов \u003cmbulatov@astralinux.ru\u003e"
    },
    {
      "commit": "0bf3ecbea777ec39f7919b47e464a046254e29a8",
      "tree": "752617c5b91a295940baecc9df579663896dfe00",
      "parents": [
        "e0f89a9638ea2c7d21d9de0044efde931959eabe"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu Jan 30 15:57:59 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 30 15:57:59 2025"
      },
      "message": "flate: Cleanup \u0026 reduce casts (#1050)\n\nSmall improvement by reducing casts for matchlen."
    },
    {
      "commit": "e0f89a9638ea2c7d21d9de0044efde931959eabe",
      "tree": "7178c2832d3978e539acdf3cd0463b4564bd8137",
      "parents": [
        "c8a8470492769c69e56a348e5142734cab19664e"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Mon Jan 27 09:07:46 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 27 09:07:46 2025"
      },
      "message": "flate: Fix matchlen L5+L6 (#1049)\n\n* flate: Fix matchlen L5+L6\n\nRegression from #1045\n"
    },
    {
      "commit": "c8a8470492769c69e56a348e5142734cab19664e",
      "tree": "978d0bd2c7e107559a6e49d52341e01458b37cf8",
      "parents": [
        "b05b993abb0da411a09cff9387877a4026c38906"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Thu Jan 23 12:21:36 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 23 12:21:36 2025"
      },
      "message": "s2: Improve small block compression speed w/o asm (#1048)\n\n* s2: Improve small block compression speed w/o asm\n\nTest with `-tags\u003dnoasm`\n\nUses uint16 hash table, which reduced the zero cost by a lot.\n\n```\nbenchmark                                                                 old MB/s      new MB/s      speedup\nBenchmarkEncodeSnappyBlockParallel/12-txt1_128b/s2-snappy-16              2518.04       4430.70       1.76x\nBenchmarkEncodeSnappyBlockParallel/12-txt1_128b/s2-snappy-better-16       4.59          1852.29       403.55x\nBenchmarkEncodeSnappyBlockParallel/12-txt1_128b/snappy-noasm-16           3362.43       3561.17       1.06x\nBenchmarkEncodeSnappyBlockParallel/13-txt1_1000b/s2-snappy-16             8053.34       9026.64       1.12x\nBenchmarkEncodeSnappyBlockParallel/13-txt1_1000b/s2-snappy-better-16      34.60         3804.57       109.96x\nBenchmarkEncodeSnappyBlockParallel/13-txt1_1000b/snappy-noasm-16          4901.85       4904.47       1.00x\nBenchmarkEncodeSnappyBlockParallel/14-txt1_10000b/s2-snappy-16            9349.04       9544.38       1.02x\nBenchmarkEncodeSnappyBlockParallel/14-txt1_10000b/s2-snappy-better-16     359.32        3795.91       10.56x\nBenchmarkEncodeSnappyBlockParallel/14-txt1_10000b/snappy-noasm-16         5361.99       5535.82       1.03x\nBenchmarkEncodeSnappyBlockParallel/15-txt1_20000b/s2-snappy-16            8852.18       9300.86       1.05x\nBenchmarkEncodeSnappyBlockParallel/15-txt1_20000b/s2-snappy-better-16     594.96        3226.26       5.42x\nBenchmarkEncodeSnappyBlockParallel/15-txt1_20000b/snappy-noasm-16         3418.03       3435.88       1.01x\n```\n```\n"
    },
    {
      "commit": "b05b993abb0da411a09cff9387877a4026c38906",
      "tree": "305be8b4356950f8ea98ccbd00c28535331a2b25",
      "parents": [
        "aafbabd27ac86586bf3d7458e4efe99476716623"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Tue Jan 21 11:32:38 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 21 11:32:38 2025"
      },
      "message": "s2: Add block decode fuzzer (#1044)\n\n"
    },
    {
      "commit": "aafbabd27ac86586bf3d7458e4efe99476716623",
      "tree": "203d9dba845d1312223b9cbe07b3b86145146da9",
      "parents": [
        "dbaa9c1172b66d27d918b0e82a014d97f5dea2e5"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Tue Jan 21 11:32:08 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 21 11:32:08 2025"
      },
      "message": "flate: Simplify matchlen (remove asm) (#1045)\n\nWith unsafe, there is no benefit from matchlen assembly. Remove it."
    },
    {
      "commit": "dbaa9c1172b66d27d918b0e82a014d97f5dea2e5",
      "tree": "bd5d864f12b48f861004ca86d1b18f0f7d07668a",
      "parents": [
        "4fa2036c90af5117d4c79f9fa9872bdb16de613c"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Tue Jan 21 10:32:08 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 21 10:32:08 2025"
      },
      "message": "flate: Simplify l4-6 loading (#1043)\n\nWe already calculate the buffer offset. Reuse in case the compiler doesn\u0027t pick it up."
    },
    {
      "commit": "4fa2036c90af5117d4c79f9fa9872bdb16de613c",
      "tree": "f8533afd1ee98971490a6eadfd1d5c8f339f92b8",
      "parents": [
        "7d9f61a75da773bd0a0bb6d6ac09caf5740e1005"
      ],
      "author": {
        "name": "Klaus Post",
        "email": "klauspost@gmail.com",
        "time": "Wed Jan 15 09:40:04 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 15 09:40:04 2025"
      },
      "message": "Add unsafe little endian loaders (#1036)\n\nBenchmarks without assembly (may be a bit noisy)\n\ndeflate:\n```\nBEFORE:\ngithub-june-2days-2019.json     gzkp    1       6273951764      1073607045      17441   343.04\ngithub-june-2days-2019.json     gzkp    2       6273951764      1045461954      24258   246.65\ngithub-june-2days-2019.json     gzkp    3       6273951764      1030139729      21752   275.06\ngithub-june-2days-2019.json     gzkp    4       6273951764      992526317       25868   231.29\ngithub-june-2days-2019.json     gzkp    5       6273951764      938015731       28992   206.38\ngithub-june-2days-2019.json     gzkp    6       6273951764      918717756       32863   182.07\ngithub-june-2days-2019.json     gzkp    7       6273951764      924473679       42332   141.34\ngithub-june-2days-2019.json     gzkp    8       6273951764      905294390       53014   112.86\ngithub-june-2days-2019.json     gzkp    9       6273951764      895561157       100686  59.43\ngithub-june-2days-2019.json     gzkp    -2      6273951764      4097019597      12499   478.70\ngithub-june-2days-2019.json     gzkp    -3      6273951764      1175153215      24140   247.85\n\nAFTER:\ngithub-june-2days-2019.json     gzkp    1       6273951764      1073607045      16584   360.79\ngithub-june-2days-2019.json     gzkp    2       6273951764      1045461954      19113   313.04\ngithub-june-2days-2019.json     gzkp    3       6273951764      1030139729      20420   293.00\ngithub-june-2days-2019.json     gzkp    4       6273951764      992526317       23619   253.32\ngithub-june-2days-2019.json     gzkp    5       6273951764      938015731       26842   222.90\ngithub-june-2days-2019.json     gzkp    6       6273951764      918717756       30541   195.90\ngithub-june-2days-2019.json     gzkp    7       6273951764      924473679       43810   136.57\ngithub-june-2days-2019.json     gzkp    8       6273951764      905294390       73933   80.93\ngithub-june-2days-2019.json     gzkp    9       6273951764      895561157       98379   60.82\ngithub-june-2days-2019.json     gzkp    -2      6273951764      4097019597      13439   445.20\ngithub-june-2days-2019.json     gzkp    -3      6273951764      1175153215      22819   262.20\n```\n\nzstd:\n```\ngithub-june-2days-2019.json     zskp    1       6273951764      697439481       9378    637.96\ngithub-june-2days-2019.json     zskp    2       6273951764      610876538       12416   481.87\ngithub-june-2days-2019.json     zskp    3       6273951764      545382443       40775   146.74\ngithub-june-2days-2019.json     zskp    4       6273951764      522934301       114291  52.35\n\ngithub-june-2days-2019.json     zskp    1       6273951764      697439481       8325    718.69\ngithub-june-2days-2019.json     zskp    2       6273951764      610876538       9905    604.04\ngithub-june-2days-2019.json     zskp    3       6273951764      545382443       29954   199.74\ngithub-june-2days-2019.json     zskp    4       6273951764      522934301       111174  53.82\n```\n\ns2:\n```\ngithub-june-2days-2019.json     s2      1       6273951764      1041705230      522     11443.55\ngithub-june-2days-2019.json     s2      2       6273951764      944873043       1248    4793.24\ngithub-june-2days-2019.json     s2      3       6273951764      826384742       9999    598.37\n\ngithub-june-2days-2019.json     s2      1       6273951764      1041705230      464     12868.90\ngithub-june-2days-2019.json     s2      2       6273951764      944873043       861     6947.69\ngithub-june-2days-2019.json     s2      3       6273951764      826384742       9335    640.94\n```\n\n\u003c!-- This is an auto-generated comment: release notes by coderabbit.ai --\u003e\n## Summary by CodeRabbit\n\n- **New Features**\n\t- Introduced a new `le` package for flexible integer type handling.\n\t- Added new functions for loading and storing binary data in little-endian format.\n\t- Enhanced test coverage with `nounsafe` build tag in GitHub Actions workflow.\n\n- **Refactor**\n\t- Updated byte loading mechanisms across multiple packages.\n\t- Replaced `encoding/binary` imports with custom `internal/le` package.\n\t- Modified bit reader and decoder offset handling.\n\t- Adjusted decoding logic to utilize cursor for state management.\n\t- Removed outdated comments regarding bounds checks in code.\n\n- **Chores**\n\t- Updated build constraints and import statements.\n\t- Refined error handling in decoding processes.\n\t- Adjusted assembly code offsets for improved performance.\n\t- Updated Go version from 1.19 to 1.21 in module file.\n\n- **Tests**\n\t- Simplified error reporting in decompression tests.\n\u003c!-- end of auto-generated comment: release notes by coderabbit.ai --\u003e"
    },
    {
      "commit": "7d9f61a75da773bd0a0bb6d6ac09caf5740e1005",
      "tree": "21361c84d3926848a4a064613860fe84a44a2969",
      "parents": [
        "a2a2e44979319a246e154d8a4b52bb3de5d4ead6"
      ],
      "author": {
        "name": "Eng Zer Jun",
        "email": "engzerjun@gmail.com",
        "time": "Sun Jan 12 09:26:02 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 12 09:26:02 2025"
      },
      "message": "zstd: use `slices.Max` for max value in slice (#1041)\n\nSigned-off-by: Eng Zer Jun \u003cengzerjun@gmail.com\u003e"
    },
    {
      "commit": "a2a2e44979319a246e154d8a4b52bb3de5d4ead6",
      "tree": "a7e0eadb6c77c944c8e07dd08887c132cdccf644",
      "parents": [
        "6ad807b4d7844640db741410a881f73faa79699d"
      ],
      "author": {
        "name": "Eng Zer Jun",
        "email": "engzerjun@gmail.com",
        "time": "Mon Jan 06 16:30:09 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 06 16:30:09 2025"
      },
      "message": "refactor: use built-in `min` function (#1038)\n\nWe can use the built-in `min` function since Go 1.21.\n\nReference: https://go.dev/ref/spec#Min_and_max\n\nSigned-off-by: Eng Zer Jun \u003cengzerjun@gmail.com\u003e"
    },
    {
      "commit": "6ad807b4d7844640db741410a881f73faa79699d",
      "tree": "476c2f3c6ced34342c56830100eff3d7f327f9cc",
      "parents": [
        "b08929a7ab40b53c9115029ae86d79fcd1f25b4c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jan 02 09:18:19 2025"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 02 09:18:19 2025"
      },
      "message": "build(deps): bump the github-actions group with 2 updates (#1035)\n\nBumps the github-actions group with 2 updates: [github/codeql-action](https://github.com/github/codeql-action) and [actions/setup-go](https://github.com/actions/setup-go).\n\n\nUpdates `github/codeql-action` from 3.27.5 to 3.28.0\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/f09c1c0a94de965c15400f5634aa42fac8fb8f88...48ab28a6f5dbc2a99bf1e0131198dd8f1df78169)\n\nUpdates `actions/setup-go` from 5.1.0 to 5.2.0\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v5.1.0...v5.2.0)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n- dependency-name: actions/setup-go\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    }
  ],
  "next": "b08929a7ab40b53c9115029ae86d79fcd1f25b4c"
}
