)]}'
{
  "log": [
    {
      "commit": "be33db564a4011bded6ded7b09d6d27b08ef4984",
      "tree": "1fc884c22e53e51eb3dbdddf57fd546ffa637147",
      "parents": [
        "8b1176cf9700120e91587dd4e2dd904f319e488d",
        "248a3228d7ecbfa39feaab8a7223847e67802361"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Oct 18 09:41:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 09:41:24 2026 -0700"
      },
      "message": "Merge pull request #546 from apache/array-union-num-values\n\nCheck the number of values in array tuple union and intersection"
    },
    {
      "commit": "8b1176cf9700120e91587dd4e2dd904f319e488d",
      "tree": "fb76bbb42b91a9c943d218f101fb733ee46cc407",
      "parents": [
        "ec8e9f4e8e9d73f44f9072fad043849687988129",
        "6e04b719cdb069ba05f7ce82f442c1f0b8682841"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Thu Oct 15 12:37:23 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 12:37:23 2026 +0900"
      },
      "message": "Merge pull request #549 from proost/ci-del-branch-on-merge\n\nci: delete branch on merge"
    },
    {
      "commit": "6e04b719cdb069ba05f7ce82f442c1f0b8682841",
      "tree": "fb76bbb42b91a9c943d218f101fb733ee46cc407",
      "parents": [
        "ec8e9f4e8e9d73f44f9072fad043849687988129"
      ],
      "author": {
        "name": "lani_karrot",
        "email": "lani@daangn.com",
        "time": "Thu Oct 15 00:33:00 2026 +0900"
      },
      "committer": {
        "name": "lani_karrot",
        "email": "lani@daangn.com",
        "time": "Thu Oct 15 00:33:00 2026 +0900"
      },
      "message": "ci: delete branch on merge\n"
    },
    {
      "commit": "ec8e9f4e8e9d73f44f9072fad043849687988129",
      "tree": "55bfab0acc36b220278fb0480ff426929ddf78c1",
      "parents": [
        "9a7226e3494bc6c14d1ffed3ca5f4a453a1696c5"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Thu Oct 15 00:01:36 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 23:01:36 2026 +0800"
      },
      "message": "fix: Undefined behavior (#548)"
    },
    {
      "commit": "9a7226e3494bc6c14d1ffed3ca5f4a453a1696c5",
      "tree": "2615576b5f028c0c0990aabef7b63d0be0caa5f1",
      "parents": [
        "c9e41b67c384b77ba671c3c4dca62a77b719b135",
        "179f8b2182bb6c24d1f2aa43cf79e7c07c5c14a4"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Mon Oct 12 23:18:48 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 23:18:48 2026 +0900"
      },
      "message": "Merge pull request #547 from proost/ci-add-ubsan\n\nci: add UBSan"
    },
    {
      "commit": "179f8b2182bb6c24d1f2aa43cf79e7c07c5c14a4",
      "tree": "2615576b5f028c0c0990aabef7b63d0be0caa5f1",
      "parents": [
        "c9e41b67c384b77ba671c3c4dca62a77b719b135"
      ],
      "author": {
        "name": "lani_karrot",
        "email": "lani@daangn.com",
        "time": "Mon Oct 12 21:14:29 2026 +0900"
      },
      "committer": {
        "name": "lani_karrot",
        "email": "lani@daangn.com",
        "time": "Mon Oct 12 21:14:29 2026 +0900"
      },
      "message": "ci: add UBSan\n"
    },
    {
      "commit": "c9e41b67c384b77ba671c3c4dca62a77b719b135",
      "tree": "097351fe7a42c5b5cf84d79d253c828d58df8a81",
      "parents": [
        "cb9d6aba323c1272e40e1e0c3a9cb07033acb53c",
        "f4cd158d0acd30d19962ef63565fc4ed76975c04"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 10 15:18:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 15:18:04 2026 -0700"
      },
      "message": "Merge pull request #545 from apache/security-md\n\nAdd SECURITY.md"
    },
    {
      "commit": "248a3228d7ecbfa39feaab8a7223847e67802361",
      "tree": "1c0f85d47d7c078853315af99e93b0831eaddea1",
      "parents": [
        "cb9d6aba323c1272e40e1e0c3a9cb07033acb53c"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 10 15:17:14 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 10 15:17:14 2026 -0700"
      },
      "message": "Check the number of values in array tuple union and intersection\n\narray_tuple_union::update() and array_tuple_intersection::update() now\nthrow std::invalid_argument when the sketch\u0027s number of values differs\nfrom the policy\u0027s, as ArrayOfDoublesUnion and ArrayOfDoublesIntersection\ndo in datasketches-java. Previously the mismatch was not detected and the\nresult was undefined.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f4cd158d0acd30d19962ef63565fc4ed76975c04",
      "tree": "097351fe7a42c5b5cf84d79d253c828d58df8a81",
      "parents": [
        "40511b3929db59449e36b79e86b6b4f5de993685"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Fri Oct 09 17:48:49 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Fri Oct 09 17:48:49 2026 -0700"
      },
      "message": "SECURITY.md: add the ASF license header instead of excluding it from RAT\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "40511b3929db59449e36b79e86b6b4f5de993685",
      "tree": "464c4aef640c6ba4c757cfd823647a72ecb1efcf",
      "parents": [
        "cb9d6aba323c1272e40e1e0c3a9cb07033acb53c"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Fri Oct 09 17:45:35 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Fri Oct 09 17:45:35 2026 -0700"
      },
      "message": "Add SECURITY.md\n\nDescribes how to report a vulnerability privately, the supported-versions\npolicy, where published vulnerabilities are listed, and the security model\nfor deserialization and the other APIs. Excluded from the RAT audit like the\nother top-level documentation files.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "cb9d6aba323c1272e40e1e0c3a9cb07033acb53c",
      "tree": "07081589f6d1905d28121d1140a89ea5bbf40596",
      "parents": [
        "16d4ea6f2013f7fb005eb53ea2b88bf5da937652",
        "185e0743fe29fc1492318a3e981c8f1f6f162ff5"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Tue Oct 06 11:33:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 11:33:34 2026 -0700"
      },
      "message": "Merge pull request #535 from apache/serialization-test-data-dir\n\nMove Java test fixtures to serialization_test_data/java_generated_files"
    },
    {
      "commit": "16d4ea6f2013f7fb005eb53ea2b88bf5da937652",
      "tree": "a90678391ed9ce784ff706b0cce10856545ea0ab",
      "parents": [
        "eeb2cff9b43bef31fd11bd78e21e1d5f21186646",
        "6e176e5d33b5b7f85dbf89ebc60a434329a787c1"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Oct 04 13:50:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 13:50:51 2026 -0700"
      },
      "message": "Merge pull request #534 from apache/readme-supported-platforms\n\nREADME: add Supported Platforms section"
    },
    {
      "commit": "eeb2cff9b43bef31fd11bd78e21e1d5f21186646",
      "tree": "b626fa13ea9eaa1045746f198c4bc6cb34d2684f",
      "parents": [
        "feac3caa11ef0b36aa50cc0882b54e3c0559ce77",
        "641c3f4571b618df028301a62ebe7f98113073dc"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Oct 04 13:46:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 13:46:45 2026 -0700"
      },
      "message": "Merge pull request #532 from jaideeppyne/test/theta-java-binary-parity\n\nTest theta binary parity with Java fixtures"
    },
    {
      "commit": "185e0743fe29fc1492318a3e981c8f1f6f162ff5",
      "tree": "172e1c3c9584365e0ccff23454b367e21876f1cd",
      "parents": [
        "feac3caa11ef0b36aa50cc0882b54e3c0559ce77"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Thu Oct 01 17:09:06 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Oct 04 13:42:22 2026 -0700"
      },
      "message": "Move Java test fixtures to serialization_test_data/java_generated_files\n\nThe cross-language tests read Java-generated sketches from a top-level\ndirectory named \"java\", which suggests Java source code. Read them from\nserialization_test_data/java_generated_files instead, the layout used by\ndatasketches-java and datasketches-go.\n\n- Update the 14 *_deserialize_from_java tests.\n- serde_compat workflow: check out Java into datasketches-java and copy\n  its generated files into the new directory.\n- .gitignore: ignore serialization_test_data/, datasketches-java/ and\n  all *.sk files, so snapshots can never be committed or released.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "feac3caa11ef0b36aa50cc0882b54e3c0559ce77",
      "tree": "59512046bd23339615fdba8b23fe4da957bd14e2",
      "parents": [
        "5dcc512a3e5d3bb3a180a520c328cc1796661dc9",
        "80dd6f3bb6f4fb840248d1c37594d7d7ccfbe3c9"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Oct 04 13:07:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 13:07:04 2026 -0700"
      },
      "message": "Merge pull request #540 from apache/dev_target_5.4.0\n\nrelease process: setting development target to 5.4.0"
    },
    {
      "commit": "5dcc512a3e5d3bb3a180a520c328cc1796661dc9",
      "tree": "480809202b37242dd4f042de87fad438f7e7f3e0",
      "parents": [
        "412c47efa67e3c5e601bb0db1a97778eaca9c724",
        "a4605c8048426e221ff7d689d78b59e5d58e4f37"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Oct 04 13:06:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 13:06:04 2026 -0700"
      },
      "message": "Merge pull request #541 from apache/fix-release-metadata\n\nFix release licensing metadata and build documentation"
    },
    {
      "commit": "a4605c8048426e221ff7d689d78b59e5d58e4f37",
      "tree": "480809202b37242dd4f042de87fad438f7e7f3e0",
      "parents": [
        "83cea6b96c4f8b728f63d5b045b03015dd8a0bf1"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Sun Oct 04 11:11:28 2026 +0800"
      },
      "committer": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Sun Oct 04 11:11:28 2026 +0800"
      },
      "message": "Preserve documentation license audit exclusions\n"
    },
    {
      "commit": "83cea6b96c4f8b728f63d5b045b03015dd8a0bf1",
      "tree": "9da67efbcd9bb7b25ab2c01a113f00a778fc95dc",
      "parents": [
        "412c47efa67e3c5e601bb0db1a97778eaca9c724"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Sun Oct 04 11:04:49 2026 +0800"
      },
      "committer": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Sun Oct 04 11:04:49 2026 +0800"
      },
      "message": "Fix release licensing metadata and build documentation\n"
    },
    {
      "commit": "412c47efa67e3c5e601bb0db1a97778eaca9c724",
      "tree": "31bb6946f4c570db950628b24d2db5fc1767583e",
      "parents": [
        "0a784547d600d5b9daa523f4b3fb4b4b51a0d1a6",
        "70505c331d12551cce268a1417c90b8a698222d3"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 03 17:04:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 17:04:00 2026 -0700"
      },
      "message": "Merge pull request #538 from apache/deserialize-validation\n\nValidate header fields and sizes when deserializing CPC, Count-Min, Theta (v4) and VarOpt"
    },
    {
      "commit": "80dd6f3bb6f4fb840248d1c37594d7d7ccfbe3c9",
      "tree": "1fb66b550556f3275def58d10de8bd00e748ba7d",
      "parents": [
        "0a784547d600d5b9daa523f4b3fb4b4b51a0d1a6"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 03 16:51:06 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 03 16:51:06 2026 -0700"
      },
      "message": "release process: setting development target to 5.4.0\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "70505c331d12551cce268a1417c90b8a698222d3",
      "tree": "31bb6946f4c570db950628b24d2db5fc1767583e",
      "parents": [
        "0a784547d600d5b9daa523f4b3fb4b4b51a0d1a6"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Thu Sep 24 10:28:02 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 03 13:56:27 2026 -0700"
      },
      "message": "Validate header fields and sizes when deserializing CPC, Count-Min, Theta and VarOpt\n\n- var_opt_union: require the full non-empty preamble before reading it.\n- count_min_sketch: include the preamble in the deserialized size check;\n  compute num_buckets * num_hashes in 64 bits.\n- compact theta, serial version 4: compute the packed data size in 64\n  bits, and require entry bits in [1, 63] and num entries bytes in\n  [1, 4], for both byte and stream deserialization.\n- cpc_sketch: validate lg_k, num_coupons and the number of table entries;\n  bound decoding by the number of compressed words; require decoded rows\n  and columns to be in range; check the input size before allocating.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "0a784547d600d5b9daa523f4b3fb4b4b51a0d1a6",
      "tree": "3497ec812ef401774715f54d92d7d1ab94d6a192",
      "parents": [
        "d5c92d2e0f670ffcaad5a71382fe21a1307986ec",
        "b3c7a8125fa7259347be104de705ed8a5ab88201"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 03 13:54:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 13:54:21 2026 -0700"
      },
      "message": "Merge pull request #537 from apache/revert-aos-sketch\n\nRevert #476: remove the array-of-strings tuple sketch for 5.3.0"
    },
    {
      "commit": "d5c92d2e0f670ffcaad5a71382fe21a1307986ec",
      "tree": "d0b2775ca17137d474690057fe164d7f7e224077",
      "parents": [
        "b93fc576e26f24827ce8121c8cfe9050884dcaea",
        "24924dfd30d987047fcdb6b417fd108944c5d09b"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 03 13:52:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 03 13:52:51 2026 -0700"
      },
      "message": "Merge pull request #536 from alexey-milovidov/fix-compact-theta-parser-short-buffer\n\nCheck the buffer size before reading compact theta sketch preamble fields"
    },
    {
      "commit": "b3c7a8125fa7259347be104de705ed8a5ab88201",
      "tree": "23deaeff65aa07a486a03db74b9b79dadafdf912",
      "parents": [
        "b93fc576e26f24827ce8121c8cfe9050884dcaea"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Fri Oct 02 11:53:25 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Oct 03 12:18:10 2026 -0700"
      },
      "message": "Revert \"Merge pull request #476 from proost/feat-aos-tuple-sketch\"\n\nThis reverts commit 1a23698f4a300d25593cb2d41fbea0a985b158d7, reversing\nchanges made to f5462628f24e91ef882431ee9344eaa9f97ce5fa, except for\ntuple/include/array_tuple_sketch.hpp.\n\nThe array-of-strings tuple sketch hashes keys as UTF-8, while Java hashes\nthem as UTF-16LE, so its sketches cannot be combined with Java\u0027s (#533).\nIt has not been released yet, so it is removed for 5.3.0 and will be\nrewritten once the encoding is agreed on dev@.\n\nThe generic array\u003cT\u003e changes from #476 in array_tuple_sketch.hpp are kept:\nthe \u003calgorithm\u003e include, element construction and destruction for\nnon-trivial types, resetting the size of a moved-from array, and the size\ncheck in operator\u003d\u003d. They are not specific to array-of-strings, and the\narray-of-doubles sketch uses the same class.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "24924dfd30d987047fcdb6b417fd108944c5d09b",
      "tree": "d0b2775ca17137d474690057fe164d7f7e224077",
      "parents": [
        "b93fc576e26f24827ce8121c8cfe9050884dcaea"
      ],
      "author": {
        "name": "Alexey Milovidov",
        "email": "milovidov@clickhouse.com",
        "time": "Sat Oct 03 17:50:21 2026 +0000"
      },
      "committer": {
        "name": "Alexey Milovidov",
        "email": "milovidov@clickhouse.com",
        "time": "Sat Oct 03 17:50:21 2026 +0000"
      },
      "message": "Check the buffer size before reading compact theta sketch preamble fields\n\n`compact_theta_sketch_parser::parse` checks that the buffer holds 8 bytes\nand then, for serial versions 1, 2 and 3, reads `num_entries` (offset 8)\nand `theta` (offset 16) before checking the size again. A truncated\nsketch therefore causes an out-of-bounds read, and the bytes read decide\nwhether the sketch is rejected or accepted as empty: a serial version 1\nor 2 sketch truncated to 8 bytes is accepted as an empty sketch if the\nmemory after the buffer happens to look like an empty preamble.\n\nCheck that the whole preamble is present before reading any field from\nit, which is what the `std::istream` deserializer does implicitly.\n\nFound by the AST fuzzer in ClickHouse:\nhttps://github.com/ClickHouse/ClickHouse/issues/119595\n"
    },
    {
      "commit": "641c3f4571b618df028301a62ebe7f98113073dc",
      "tree": "1418e80ecf388c60ad9ef3eb7921600e0bdefc2f",
      "parents": [
        "d1ec6b97a5a3bb8e4c7fe816d49190ae353c9a4b"
      ],
      "author": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Sat Oct 03 10:13:53 2026 +0530"
      },
      "committer": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Sat Oct 03 10:13:53 2026 +0530"
      },
      "message": "test(theta): retain stream compatibility coverage\n"
    },
    {
      "commit": "6e176e5d33b5b7f85dbf89ebc60a434329a787c1",
      "tree": "5125d6d939fe43c637cdcfc36069a011c14b9ae7",
      "parents": [
        "b93fc576e26f24827ce8121c8cfe9050884dcaea"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Thu Oct 01 14:47:28 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Thu Oct 01 14:47:28 2026 -0700"
      },
      "message": "README: add Supported Platforms section\n\nState that DataSketches supports little-endian platforms only, and that\nthis library is tested on Linux, macOS and Windows.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d1ec6b97a5a3bb8e4c7fe816d49190ae353c9a4b",
      "tree": "f12385417247f3e1f17955dfc31602fa60b7dbf9",
      "parents": [
        "b93fc576e26f24827ce8121c8cfe9050884dcaea"
      ],
      "author": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Thu Oct 01 12:16:10 2026 +0530"
      },
      "committer": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Thu Oct 01 12:16:10 2026 +0530"
      },
      "message": "test(theta): verify Java binary parity\n"
    },
    {
      "commit": "b93fc576e26f24827ce8121c8cfe9050884dcaea",
      "tree": "c136df218be4a205c03d3e4867f8b8bdef4be5a6",
      "parents": [
        "95052ec9a57b801d5f6ee987783c6804528aadbe",
        "57df19ce46ea8c87a5bf892323f55377cd10b24b"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 30 18:34:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 18:34:48 2026 -0700"
      },
      "message": "Merge pull request #531 from jaideeppyne/fix/tdigest-rank-quantile-tails\n\nfix(tdigest): correct rank and quantile tails"
    },
    {
      "commit": "57df19ce46ea8c87a5bf892323f55377cd10b24b",
      "tree": "c136df218be4a205c03d3e4867f8b8bdef4be5a6",
      "parents": [
        "95052ec9a57b801d5f6ee987783c6804528aadbe"
      ],
      "author": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Wed Sep 30 08:00:01 2026 +0530"
      },
      "committer": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Wed Sep 30 08:00:01 2026 +0530"
      },
      "message": "fix(tdigest): correct rank and quantile tails\n\nThe left tail of get_rank() was not divided by the total weight, and the\nright tail of get_quantile() was added onto the maximum. A last centroid\nof weight 2 makes that division 0/0, so return the maximum. Interpolation\nnow weights each centroid by the distance to the other one.\n"
    },
    {
      "commit": "95052ec9a57b801d5f6ee987783c6804528aadbe",
      "tree": "bd2a6e0f5be91e04ba8f3328a75fbb117002f9db",
      "parents": [
        "70e462fcd03977e378c34ca121ba9f40d17ecef3",
        "c22323afda89c0800d8ba998d502e890bc97cab1"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Mon Sep 28 18:39:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 18:39:42 2026 -0700"
      },
      "message": "Merge pull request #530 from apache/cstdint-internal-headers\n\nAdd missing \u003ccstdint\u003e and \u003citerator\u003e includes to hll and cpc internal headers"
    },
    {
      "commit": "c22323afda89c0800d8ba998d502e890bc97cab1",
      "tree": "bd2a6e0f5be91e04ba8f3328a75fbb117002f9db",
      "parents": [
        "70e462fcd03977e378c34ca121ba9f40d17ecef3"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Mon Sep 28 16:51:28 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Mon Sep 28 16:51:28 2026 -0700"
      },
      "message": "Add missing standard includes to hll and cpc internal headers\n\ncoupon_iterator.hpp uses uint32_t and std::input_iterator_tag, and\ncompression_data.hpp uses uint8_t and uint16_t, but neither includes the\nheaders that declare them. Both compile today only because of include\norder. This is the same latent problem as reverse_purge_hash_map.hpp in\n#499, which surfaced under GCC 15\u0027s reduced transitive includes.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "70e462fcd03977e378c34ca121ba9f40d17ecef3",
      "tree": "b94bb407bbe0088367287370da907b9ce3b01b62",
      "parents": [
        "7b7cc5dfa35f17c190bf6a461251188ca09c1355",
        "3a94242f0649c02f1a3b0db599b2aec90d833fb6"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Thu Sep 24 10:08:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 10:08:05 2026 -0700"
      },
      "message": "Merge pull request #529 from apache/fi-empty-preamble\n\nfrequent_items_sketch: add reset(), decide emptiness by preamble longs"
    },
    {
      "commit": "3a94242f0649c02f1a3b0db599b2aec90d833fb6",
      "tree": "b94bb407bbe0088367287370da907b9ce3b01b62",
      "parents": [
        "8cf87b8340e5eeb572b369dd02a8a4583edbd5b9"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 23 15:34:41 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 23 15:34:41 2026 -0700"
      },
      "message": "frequent_items_sketch: generate purged-to-zero images for cross-language tests\n\nLongs and strings sketches with lg_max_map_size\u003d8 and 193 distinct items:\nnon-empty (N\u003d193, offset\u003d1) with no retained items, serialized with the\nfull preamble.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "8cf87b8340e5eeb572b369dd02a8a4583edbd5b9",
      "tree": "83d9769b1464e2bcfdb325149260a6fb84432a20",
      "parents": [
        "7b7cc5dfa35f17c190bf6a461251188ca09c1355"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 23 15:10:31 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 23 15:10:31 2026 -0700"
      },
      "message": "frequent_items_sketch: add reset(), decide emptiness by preamble longs\n\n- Add reset(), paralleling Java: returns the sketch to the empty state,\n  keeping the maximum map size, equality operator and allocator.\n- On deserialize, emptiness is determined by preamble longs (1 or 4).\n  The flags byte is only cross-checked against it; either legacy empty\n  bit is still accepted.\n- Reject a non-empty image whose total weight is not positive. No valid\n  writer produces it, and it would otherwise load as an empty sketch.\n- Document that no flag bits other than the empty bits are defined.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7b7cc5dfa35f17c190bf6a461251188ca09c1355",
      "tree": "6d4be89211cb55dc94faaf9aede7627812650234",
      "parents": [
        "32e7e2a8405fc2b344acc793bdaebd49980c08a4",
        "1ecdc1eb2f32e5d484be632ec7ef9be148df305a"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 23 15:04:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 15:04:35 2026 -0700"
      },
      "message": "Merge pull request #527 from FluorineDog/fix-frequent-items-empty-after-purge\n\nfrequent_items_sketch: fix is_empty() after purge clears all counters"
    },
    {
      "commit": "32e7e2a8405fc2b344acc793bdaebd49980c08a4",
      "tree": "6b5e88460cd15b14dc703c8eaec59e4aae6e6c12",
      "parents": [
        "a904aa40c2cdc3d481c9d97d5248a6052c5d1b56",
        "4f6b8a7b57f6f3c64290816349b43b0d5db8b273"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 23 13:47:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 13:47:14 2026 -0700"
      },
      "message": "Merge pull request #509 from cv4g/countmin-serialize-to\n\nIntroduce `count_min_sketch::serialize_to`"
    },
    {
      "commit": "1ecdc1eb2f32e5d484be632ec7ef9be148df305a",
      "tree": "954d1b53c7d82bf4d88f64c7d7665b58ba9a7f2a",
      "parents": [
        "a904aa40c2cdc3d481c9d97d5248a6052c5d1b56"
      ],
      "author": {
        "name": "Gou Guilin",
        "email": "gouguilin@bytedance.com",
        "time": "Fri Sep 18 16:57:12 2026 +0800"
      },
      "committer": {
        "name": "Gou Guilin",
        "email": "gouguilin@bytedance.com",
        "time": "Fri Sep 18 16:57:12 2026 +0800"
      },
      "message": "frequent_items_sketch: fix is_empty() after purge clears all counters\n\nA purge subtracts the median from all counters and keeps only positive\nones, so when all counters equal the median (typical for many low-frequency\nitems), every counter is wiped and num_active drops to 0 while offset and\ntotal_weight remain non-zero. is_empty() was defined as num_active \u003d\u003d 0,\nconflating \"no retained items\" with \"no observations\", which caused:\n\n- serialize() to emit the empty short format, dropping total_weight and\n  offset on the wire;\n- merge() to early-return, silently discarding the other sketch\u0027s\n  total_weight and offset.\n\nReproducer: 193 distinct items at lg_k\u003d8 (capacity 192). The 193rd update\ntriggers a purge with median 1 that clears all counters; the state then\nreports is_empty()\u003d\u003dtrue, round-trips to total_weight\u003d0/max_error\u003d0\n(falsely looking exact), and contributes nothing when merged.\n\nFix: define emptiness as \"no observations\" (total_weight \u003d\u003d 0). The\nnon-empty wire format already supports num_items \u003d\u003d 0, so purged states\nnow round-trip with weight and error intact, and merge absorbs them.\n"
    },
    {
      "commit": "a904aa40c2cdc3d481c9d97d5248a6052c5d1b56",
      "tree": "9e930c5de4746e95a1fe9cff28caae429b92ac37",
      "parents": [
        "7aaa0bb6f5145f0bf43fdc451df49636572166eb"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Thu Sep 17 06:57:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 21:57:03 2026 +0800"
      },
      "message": "Write the single-item flag on a compact theta sketch (#526)\n\nJava sets bit 5 of the flags byte (SINGLEITEM_FLAG_MASK) on a compact\nsketch holding exactly one entry in exact mode. C++ never wrote it, so\nthe one-item image was the last theta fixture that differed between the\ntwo languages: byte 5 was 0x1A here and 0x3A in Java.\n\nThe condition mirrors Java\u0027s: one retained entry and theta at its\nmaximum. Only the two version-3 writers change; the compressed form\nnever carries a single item. Readers are untouched, since they test\nindividual bits and have always ignored this one, which is also why C++\nalready reads Java\u0027s single-item images.\n\nPins the exact 8-byte empty and 16-byte single-item images in tests,\nwith a non-default seed to show the seed hash is absent from one and\npresent in the other, and checks that one entry in estimation mode does\nnot get the flag.\n\nCo-authored-by: Claude Opus 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "7aaa0bb6f5145f0bf43fdc451df49636572166eb",
      "tree": "684cec4c079a8b0188334b0680a2c78fb9e9c558",
      "parents": [
        "419062ad92331b5d6894702aa35ea93ca701da18",
        "8da6a93fc6f5cf70f8608b53e919be2b1299d428"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 16 21:46:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 21:46:46 2026 -0700"
      },
      "message": "Merge pull request #525 from jaideeppyne/fix/tdigest-merge-minmax\n\nfix(tdigest): preserve stored min and max when merging"
    },
    {
      "commit": "8da6a93fc6f5cf70f8608b53e919be2b1299d428",
      "tree": "684cec4c079a8b0188334b0680a2c78fb9e9c558",
      "parents": [
        "419062ad92331b5d6894702aa35ea93ca701da18"
      ],
      "author": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Wed Sep 16 10:41:44 2026 +0530"
      },
      "committer": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Wed Sep 16 10:41:44 2026 +0530"
      },
      "message": "fix(tdigest): preserve stored min and max when merging\n\nMerging a digest whose extreme centroids have weight greater than one\nre-derived min and max from those centroid means. Copy the stored extrema\nfrom the other digest first so rank and quantile tail interpolation stay\ncorrect, especially for deserialized images.\n"
    },
    {
      "commit": "419062ad92331b5d6894702aa35ea93ca701da18",
      "tree": "b6179c94c4f2b9701ce7e3e25da2ffafe838cd51",
      "parents": [
        "527bd4d5cd3afe2ddbc1243f6abc8e457ddff1b4",
        "e13672e8a19930a0a7faa5dd1623178f224f5004"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 21:08:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 21:08:22 2026 -0700"
      },
      "message": "Merge pull request #524 from apache/theta-compact-trim\n\nAdd optional trim flag to update_theta_sketch::compact()"
    },
    {
      "commit": "527bd4d5cd3afe2ddbc1243f6abc8e457ddff1b4",
      "tree": "5108bc592457949d70d235232e87d499e4033179",
      "parents": [
        "88a5761ee33a0e856bc093b75ccf29d265405539",
        "27e096a4450499c6f3d0f48434c721703810abd0"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 21:07:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 21:07:13 2026 -0700"
      },
      "message": "Merge pull request #522 from apache/hll-kxq-rebuild-parity\n\nFinish repairing the deferred KxQ rebuild, and pin the estimator constants"
    },
    {
      "commit": "e13672e8a19930a0a7faa5dd1623178f224f5004",
      "tree": "7ca301fa972365b047eeb9f9f59dad961261208e",
      "parents": [
        "b3f2c9b84e4c754eba2381f87a0bb52bf88fc562"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 16:20:58 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 16:20:58 2026 -0700"
      },
      "message": "Share one trim implementation between union and compact\n\nReview feedback: compact(ordered, trim) omitted the shrink_to_fit that\ntheta_union_base::get_result performs after the same erase. The two were\ncopies of one algorithm and the newer copy had already drifted, so share\nit rather than patch the copy.\n\nAdds trim_to_nominal to theta_helpers.hpp, generic over ExtractKey, and\ncalls it from both sites. theta_union_base is instantiated by both\ntheta_union and tuple_union, so all three paths now run identical code;\ntheta\u0027s compact is the degenerate case where the entry is the key.\n\nThe missing shrink matters most where it was missing. An update sketch\nretains up to 15/16 * 2k entries between rebuilds, and the entries vector\nis reserved to that before being erased down to k, so a trimmed result\nkept the untrimmed allocation. Measured at lg_k\u003d12: 7674 retained against\n4096 kept, holding 1.87x the memory it reports, 46.6% of the allocation\ndead. The whole point of trim is a bounded result, so the caller was\npaying the accuracy cost without getting the size back.\n\nThe invariant is documented once now: entries[nominal_size] becomes theta\nand is itself discarded, so everything kept is strictly below it. An\noff-by-one there does not fail loudly, it biases every estimate.\n\nVerified behaviour-preserving: serialized bytes of both the trimmed\ncompact and the union result are identical before and after, across\nordered and unordered at 5000, 26989 and 40000 updates. theta 89 cases /\n20250056 assertions and tuple 55 cases / 126786 assertions pass.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01BKM9nrFVMhH2gmFaag2JuC\n"
    },
    {
      "commit": "27e096a4450499c6f3d0f48434c721703810abd0",
      "tree": "5108bc592457949d70d235232e87d499e4033179",
      "parents": [
        "0d954d6fa2db044ffbfcd067b8bf57606c9a0b63"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 15:22:50 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 15:22:50 2026 -0700"
      },
      "message": "Treat .sk sketch fixtures as binary, not text\n\n.gitattributes declared \"*.sk text eol\u003dlf\", which subjects serialized\nsketch images to line-ending conversion. A .sk file is arbitrary bytes,\nso any stray CRLF pair in one gets rewritten to a lone LF on check-in,\nsilently truncating the fixture by a byte and corrupting it.\n\nTwo of the fifteen tracked fixtures contain a CRLF pair today:\n\n  theta/test/theta_compact_estimation_from_java_v1.sk\n  theta/test/theta_compact_estimation_from_java_v2.sk\n\nNeither is damaged in the repository, but git reports both as modified\nin any fresh worktree, which blocks merges and rebases until worked\naround, and a routine \"git add\" would have committed the truncation.\nThe remaining thirteen are safe only because they happen to contain no\nCRLF pair; any regenerated sketch could acquire one.\n\nMove *.sk to the block that already covers genuinely binary files and\nrecord the reason. .gitattributes is export-ignore\u0027d, so it is not part\nof a source release and this cannot affect released artifacts.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01BKM9nrFVMhH2gmFaag2JuC\n"
    },
    {
      "commit": "0d954d6fa2db044ffbfcd067b8bf57606c9a0b63",
      "tree": "14ce45ed4da3cbd361286868b6dc27f2ea7b0c0c",
      "parents": [
        "dbf294775905ec6ade8e79ce59229fd47036d4c6"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 11:59:29 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 11:59:29 2026 -0700"
      },
      "message": "Exclude fdlibm_log.hpp from RAT and date the deprecated alias\n\nTwo follow-ups now that #523 (Apache RAT) and #521 have merged.\n\nRAT flags common/include/fdlibm_log.hpp, which carries the Sun FDLIBM\nnotice rather than the ASF header, so add it to .rat-excludes. It is\nalready recorded in LICENSE, which is the other half of what the check\nrequires for third-party source.\n\nRecord when the FULL_SIZE_FLAG_MASK alias was added, so a future reader\ncan decide when it is safe to drop without having to reconstruct the\nhistory. A date and PR number are facts; a predicted release number is\nnot, since the release following 5.2.0 has not been numbered yet.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01BKM9nrFVMhH2gmFaag2JuC\n"
    },
    {
      "commit": "dbf294775905ec6ade8e79ce59229fd47036d4c6",
      "tree": "63ad788bc89031f761b471e25dc9866a195c3620",
      "parents": [
        "25583e9838717a460a9664770a48d0a71f4f21c1",
        "88a5761ee33a0e856bc093b75ccf29d265405539"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 11:58:45 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Wed Sep 09 11:58:45 2026 -0700"
      },
      "message": "Merge branch \u0027master\u0027 into hll-kxq-rebuild-parity\n"
    },
    {
      "commit": "4f6b8a7b57f6f3c64290816349b43b0d5db8b273",
      "tree": "9edc6ab7d8ecca856259095056d3ecc0289a0d6a",
      "parents": [
        "52f8d03751d306a8d44efb3084a650a5a003047d",
        "88a5761ee33a0e856bc093b75ccf29d265405539"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Wed Sep 09 08:41:18 2026 +0000"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Wed Sep 09 08:41:18 2026 +0000"
      },
      "message": "Merge branch \u0027master\u0027\n"
    },
    {
      "commit": "52f8d03751d306a8d44efb3084a650a5a003047d",
      "tree": "70ec44b1979ed5d9d6d254faa61e15a9d4077aa1",
      "parents": [
        "163e75ea22111d76a4edf88f381faee10ebd99ce"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Wed Sep 09 08:41:09 2026 +0000"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Wed Sep 09 08:41:09 2026 +0000"
      },
      "message": "Rename template parameter, add round trip test\n"
    },
    {
      "commit": "88a5761ee33a0e856bc093b75ccf29d265405539",
      "tree": "25a72884725eb29a72106f37d70361b936f671e7",
      "parents": [
        "7ca8d3fefcc8062a4d248f7802a16dad87b23e78",
        "eeb8d1f42a587aaa23dc5c5a65c17d11993cd276"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Mon Sep 07 12:26:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 12:26:11 2026 -0700"
      },
      "message": "Merge pull request #521 from apache/hll-full-size-reset\n\nStop persisting the full-size flag in serialization flags bit 32 (0x20)"
    },
    {
      "commit": "b3f2c9b84e4c754eba2381f87a0bb52bf88fc562",
      "tree": "be020473f3d0615b87c7330f98b9fe873ff7d351",
      "parents": [
        "7ca8d3fefcc8062a4d248f7802a16dad87b23e78"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Sep 06 21:56:27 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Sep 06 22:16:02 2026 -0700"
      },
      "message": "Add optional trim flag to update_theta_sketch::compact()\n\nAn update sketch retains more than the nominal size k between rebuilds.\nCallers who need a result bounded by k currently have to copy the sketch,\ncall trim() on the copy, then compact() it, which mutates state and\nallocates twice.\n\nThis adds an optional second flag to the existing compact():\n\n    compact_theta_sketch_alloc\u003cAllocator\u003e compact(bool ordered \u003d true,\n                                                 bool trim \u003d false) const;\n\nThe trim path copies the retained entries (the method is const, and quick\nselect would permute the live table), partitions with std::nth_element at\n0-based index k so that entries[k] becomes the new theta, keeps the k\nentries below it, and sorts only when an ordered result is requested. This\nmatches the pivot convention already used by rebuild(), so trimming and\nrebuilding cannot drift apart.\n\nTrimming stays opt-in because it is lossy. Relative error scales with\n1 / sqrt(retained), so discarding entries always widens the confidence\nbounds: measured 1.03x to 1.27x here, and up to about sqrt(15/8) (~37%)\nworst case for a sketch grown to just under the 15/16 * 2k rebuild\nthreshold. A sketch in exact mode that retains more than k entries also\nloses exactness and is returned in estimation mode. Both effects are\ndocumented on the parameter and pinned by tests.\n\nTests cover the four ordered/trim combinations, that the source sketch is\nunmodified, that trimmed output matches trim() + compact() exactly, that\nevery retained hash is below the new theta, the exact-to-estimation\nconversion, the bounds widening, and the empty and below-k cases.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_017EDHa7UhfW4eSj5L82panJ\n"
    },
    {
      "commit": "eeb8d1f42a587aaa23dc5c5a65c17d11993cd276",
      "tree": "5e7eaf51f48ebdfae0b5cf3354b1d9166627b807",
      "parents": [
        "637d74896da90045f81cb2210bfc077de5febcc9"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Sep 06 10:43:22 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Sep 06 10:43:22 2026 -0700"
      },
      "message": "Keep FULL_SIZE_FLAG_MASK as a deprecated alias\n\nReview feedback on #521: renaming FULL_SIZE_FLAG_MASK to\nRESERVED_FLAG_MASK_32 is a source break for any downstream code that\nnames the constant, and it is the one break in this PR that costs\nnothing to avoid.\n\nKeep the old name as an alias for the new one. Bit 32 is still never\nwritten and never interpreted, so the behaviour of this PR is unchanged;\nonly the spelling survives, for compatibility.\n\nNo [[deprecated]] attribute: this library targets C++11\n(CMAKE_CXX_STANDARD 11), where that attribute is not available, so the\ndeprecation is recorded in a comment instead.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01BKM9nrFVMhH2gmFaag2JuC\n"
    },
    {
      "commit": "7ca8d3fefcc8062a4d248f7802a16dad87b23e78",
      "tree": "35695ec970a9c21135d9f25f3a3fef5ae11cff2e",
      "parents": [
        "fe0261aa043c1d3af9a92a62fa286caabbf6fa84",
        "7eeffa27fa988a8d04e12d3ce5cb07aa6dab9cda"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sun Sep 06 09:47:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 06 09:47:05 2026 -0700"
      },
      "message": "Merge pull request #523 from apache/rat-license-check\n\nAdd an Apache RAT license-header audit to CI"
    },
    {
      "commit": "7eeffa27fa988a8d04e12d3ce5cb07aa6dab9cda",
      "tree": "35695ec970a9c21135d9f25f3a3fef5ae11cff2e",
      "parents": [
        "fe0261aa043c1d3af9a92a62fa286caabbf6fa84"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Sep 05 17:49:42 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Sep 05 17:49:42 2026 -0700"
      },
      "message": "Add an Apache RAT license-header audit to CI\n\nThis repository has no automated license check. Nothing in the build system\nknows which files are third-party, so a vendored source file can be added with\nno ASF header and no LICENSE entry and every existing check will still pass.\nThat is not hypothetical: it happened while preparing the HLL parity work, and\nthe omission would have surfaced only in a release audit.\n\nC++ makes this easier to get wrong than Java does. In a Maven project every\ndependency is a coordinate in the POM, resolved and versioned by the tool. Here\ndependencies arrive two different ways: Catch2 and google-benchmark are fetched\nby CMake FetchContent and declared there, but vendored source is simply copied\ninto the tree, so no build file mentions it at all. LICENSE is the only registry\nof those files, and it is maintained purely by hand. Grep does not substitute:\nof the vendored headers, only some carry the word \"Copyright\", so scanning the\nsource does not reliably enumerate them either.\n\nAdds tools/rat-check.sh and a workflow that runs it on push and pull request.\nThe script exports the tree with `git archive` so only tracked files are\nexamined, meaning a local build directory cannot affect the result and the\ncheck can be run locally exactly as CI runs it. RAT itself always exits zero,\nso the script parses the report and fails on any unapproved file, printing the\noffending paths and what to do about them.\n\n.rat-excludes lists the exclusions, each one grouped and commented, with a note\nthat adding a vendored file there also requires a LICENSE entry. Note the\npatterns are matched by RAT against the file name, not the path.\n\nRunning this for the first time found a real omission: hll/include/hll.private.hpp\ncarried no ASF header, while every sibling header does. That is fixed here.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "25583e9838717a460a9664770a48d0a71f4f21c1",
      "tree": "d4fa04144f08dc45dc36efafaeefe699e7f2b768",
      "parents": [
        "637d74896da90045f81cb2210bfc077de5febcc9"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Sep 05 13:38:00 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Sep 05 17:30:17 2026 -0700"
      },
      "message": "Finish repairing the deferred KxQ rebuild, and pin the estimator constants\n\nThree independent defects in the HLL estimator state.\n\n1. The deferred KxQ rebuild from #364 still leaves curMin/numAtCurMin merge\norder dependent. #512 repaired the visible damage, but not the representation\nthe rebuild writes: check_rebuild_kxq_cur_min() stores the true minimum\nregister value and the count at that minimum, while the rest of the HLL_8\ncode maintains curMin \u003d\u003d 0 with numAtCurMin counting the zero registers.\nWhen the merged array has no zero register the rebuild leaves curMin \u003e 0, and\nfrom then on numAtCurMin -\u003d (curVal \u003d\u003d 0) never fires, so the stored pair\nfreezes and drifts away from the registers. Its value depends on when the\nrebuild fired, hence on merge order. Over 4800 randomized merge-order\ncomparisons 92 differed only in these two fields; the same sweep before #364\ngives 0. Estimates and bounds are unaffected because both consumers branch on\ncurMin \u003d\u003d 0, so this is a serialization determinism defect. Emit the\ncanonical form instead, and add the HLL_8 / HLL-mode guard that\ndatasketches-java has, so the rebuild can never rewrite curMin on an HLL_4\narray whose nibbles are stored relative to it.\n\n2. HLL_HIP_RSE_FACTOR and HLL_NON_HIP_RSE_FACTOR were rounded to seven\ndigits. For lg_k \u003e 12 the bounds use the closed form rather than the\ninterpolation table, so this is observable: the HIP bounds differ from Java by\n~4.3e-11 relative and the non-HIP factor is off by 1.7e-6 relative, skewing\nthe bounds of every union result above lg_k 12. Use full precision literals\ntaken from Java\u0027s Double.toString output, rather than computing sqrt(log(2.0))\nat runtime, so the value cannot vary with the platform libm.\n\n3. harmonicNumber() and getHllBitMapEstimate() called the platform std::log.\ngetBitMapEstimate computes K * (H(K) - H(K - numHit)), whose cancellation\namplifies a 1 ULP log difference by about 17x. Apple libm differs from fdlibm\non 0.62% of a 400000 sample sweep. Java\u0027s StrictMath.log is specified to be\nfdlibm, so add common/include/fdlibm_log.hpp (FDLIBM 5.3 __ieee754_log,\nSun notice preserved) and use it in both places. fdlibm needs strict IEEE\nevaluation, and the clang pragma is overridden by an explicit\n-ffp-contract\u003dfast, so the contraction sensitive expressions go through a\nvolatile round trip; verified bit-identical to Java under -O2, -O3,\n-ffp-contract\u003don and \u003dfast. LICENSE gains an FDLIBM entry alongside the\nexisting xxhash64, MurmurHash3 and bithacks entries.\n\nThis changes serialized bytes, unlike the preceding PR. Union results carry\nthe canonical curMin/numAtCurMin, linear-counting estimates shift ~1e-15, and\nbounds above lg_k 12 shift as described. Reading is unaffected: older images\nstill deserialize and yield identical estimates and bounds.\n\nAdds HllKxqRebuildTest.cpp. Three of the four assertions that also compile\nagainst the parent branch fail there and pass here; the fourth already held\nand is kept as a guard.\n\nWith the companion datasketches-java change, a 1041 record corpus spanning\nlg_k 4..21, all three target types, 17 sizes across LIST/SET/HLL, round trips\nand 80 union scenarios goes from 428 differing records to 0, comparing every\nserialized byte, estimate, composite estimate and bound as raw IEEE bits.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "637d74896da90045f81cb2210bfc077de5febcc9",
      "tree": "627f11d830217d9e6f6b8192e3c4729518d272e0",
      "parents": [
        "fe0261aa043c1d3af9a92a62fa286caabbf6fa84"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Sep 05 10:47:28 2026 -0700"
      },
      "committer": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Sat Sep 05 12:19:38 2026 -0700"
      },
      "message": "Stop persisting the full-size flag in serialization flags bit 32\n\nSerialization flags bit 32 (0x20) was written as FULL_SIZE_FLAG_MASK here and is read as REBUILD_CURMIN_NUM_KXQ_MASK by datasketches-java, so the two implementations disagree about what a sketch image means. A C++ sketch built with start_full_size\u003dtrue serializes flag FULL_SIZE, which Java heapifies with its REBUILD_CURMIN_NUM_KXQ_MASK (union rebuild) flag set (observed for HLL_4 and HLL_6; for HLL_8 Java\u0027s heapify calls checkRebuildCurMinNumKxQ immediately and clears it). Going the other way, a Java union-gadget image is read here as full size. This is a serious cross-language bug.\n\nIn C++, the persisted bit exists for one purpose: so that reset() on a deserialized sketch returns to a full-size array rather than to LIST. It also leaked into unions, because union_impl replaces the gadget via copyAs()/copy() and the rvalue update() overload moves a sketch in wholesale, both of which carry the startFullSize_ across. A union\u0027s reset behavior therefore depended on which sketches had been merged into it. This is a bug internal to C++.  A user that happened to merge in a sketch that was configured full-size would permanently configure his sketch to full-size mode without his knowledge.\n\nFixing this collision between Java and C++ involves minimizing the impact surface to both Java backwards compatibility and C++ backwards compatibility.  On the C++ side this Full-Size capability was never fully implemented and never tested, and it contained a bug in the union implementation as well.\n\nFix Strategy: Make full-size a property of the call that creates the state instead. This means if the user wants this feature it must be requested when the sketch is created and requested upon reset (if reset is required).  This feature is a runtime dynamic and never persisted, which removes the requirement to have the bit for C++.  This fixes this bug going forward, there is not much we can do about historical C++ sketch images.\n\n- add hll_sketch_alloc::reset(bool full_size \u003d false); reset() returns to coupon collection mode as Java does, reset(true) to an empty full-size HLL array\n- remove startFullSize_, isStartFullSize(), and the bool parameter on the HllArray/Hll4Array/Hll6Array/Hll8Array constructors and newHll()\n- stop writing and reading bit 32; rename the constant RESERVED_FLAG_MASK_32 and record the collision, noting bits 64 and 128 are free\n- hll_union_alloc::reset() resets its gadget to LIST explicitly\n\nRemoving the state fixes the union leak by construction. Reading is unaffected: older images still deserialize and the bit is ignored. Output is byte-identical to master except for sketches created with start_full_size\u003dtrue, verified over a 1047-record corpus spanning lg_k 4..21, all three target types, 17 sizes across LIST/SET/HLL, round trips and 80 union scenarios. One deliberate behavior change: a full-size sketch that has been serialized and deserialized now resets to LIST; call reset(true) for the previous effect.\n\nAdds HllFullSizeTest.cpp. The five assertions that also compile against the previous headers fail there and pass here.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "fe0261aa043c1d3af9a92a62fa286caabbf6fa84",
      "tree": "d70594a61ac4f25cd75adba28069916ff7111c76",
      "parents": [
        "e84f2609b12ff50dd331c78d232489cae9afd42f",
        "c9f327bae90796801f294a870ffa491b361782c0"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Mon Aug 31 13:31:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 13:31:21 2026 -0700"
      },
      "message": "Merge pull request #516 from proost/refactor-strict-validation-from-bytes-bloom-filter\n\nrefactor: strict validation from bytes bloom filter"
    },
    {
      "commit": "e84f2609b12ff50dd331c78d232489cae9afd42f",
      "tree": "eb90b30a3d2a84b87accd8dd9fc3336f857d3107",
      "parents": [
        "5e18631727ae996f5ab4a47aed60c34d4197f655",
        "c11a5ea92ce7416df56c16f7156c8f189a7be448"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Mon Aug 31 13:25:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 13:25:57 2026 -0700"
      },
      "message": "Merge pull request #518 from jaideeppyne/empty-seed-hash\n\nReport a zero seed hash for an empty compact sketch"
    },
    {
      "commit": "5e18631727ae996f5ab4a47aed60c34d4197f655",
      "tree": "0fbc7eacfc4fb515e0d37805fba1ee6bec817534",
      "parents": [
        "c8e42183091558de994b7110c71657e7f880630e",
        "bed5cd240bdcaa89786321dc346e9d37f0f8e2a0"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Mon Aug 31 13:23:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 13:23:13 2026 -0700"
      },
      "message": "Merge pull request #517 from jaideeppyne/theta-anotb-empty-seed-hash\n\nIgnore the seed hash of an empty B in theta/tuple a-not-b"
    },
    {
      "commit": "c11a5ea92ce7416df56c16f7156c8f189a7be448",
      "tree": "eb90b30a3d2a84b87accd8dd9fc3336f857d3107",
      "parents": [
        "bed5cd240bdcaa89786321dc346e9d37f0f8e2a0"
      ],
      "author": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Mon Aug 31 07:56:01 2026 +0530"
      },
      "committer": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Mon Aug 31 07:56:01 2026 +0530"
      },
      "message": "Report a zero seed hash for an empty compact sketch\n\nJava EmptyCompactSketch.getSeedHash() returns 0 and its serialized form\ncarries zeros in that position, with the recognition mask excluding those\ntwo bytes. C++ carried compute_seed_hash(seed) instead, so an empty\nsketch did not round trip to the same bytes as Java.\n\nGenerated-by: Claude Code\n"
    },
    {
      "commit": "bed5cd240bdcaa89786321dc346e9d37f0f8e2a0",
      "tree": "0fbc7eacfc4fb515e0d37805fba1ee6bec817534",
      "parents": [
        "c8e42183091558de994b7110c71657e7f880630e"
      ],
      "author": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Sun Aug 30 10:35:11 2026 +0530"
      },
      "committer": {
        "name": "jaideeppyne",
        "email": "jaideeppyne1997@gmail.com",
        "time": "Sun Aug 30 10:35:23 2026 +0530"
      },
      "message": "Ignore the seed hash of an empty B in theta/tuple a-not-b\n\nAn empty sketch retains no hashes, so its seed hash carries no\ninformation and must not be validated. Deserialization\n(deserialize_v3/deserialize_v4), theta_union_base::update() and\ntheta_intersection_base::update() all already skip the seed hash check\nfor empty inputs, and the existing seed mismatch tests record the intent\nwith the comment \"non-empty should not be ignored\".\n\ntheta_set_difference_base::compute() was the one path that still checked\nit. When A is non-empty with zero retained entries, the early return does\nnot fire, and an empty B whose seed hash differs makes a-not-b throw\n\"B seed hash mismatch\" where union and intersection accept the same pair.\n\nThis also breaks Java/C++ interop: datasketches-java serializes every\nempty compact sketch as the constant {1,3,3,0,0,0x1E,0,0}, with a seed\nhash of 0 that is documented as ignored, so any empty sketch coming from\nJava hits this path.\n\nThe behavior is reproducible in C++ alone using two different seeds.\n\nGenerated-by: Claude Code (Claude Opus 4.8)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c9f327bae90796801f294a870ffa491b361782c0",
      "tree": "ed31ab356e87b3b8ea1a658c7fcdea6bc989b8ae",
      "parents": [
        "5741909a7e6daf61419aaf15de803e64195c3139"
      ],
      "author": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Aug 29 15:22:45 2026 +0900"
      },
      "committer": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Aug 29 15:22:45 2026 +0900"
      },
      "message": "fix: remove change numb bit set\n"
    },
    {
      "commit": "5741909a7e6daf61419aaf15de803e64195c3139",
      "tree": "8d4f0bf7676892ea29f52e6b9e098e5f242ab8fa",
      "parents": [
        "c8e42183091558de994b7110c71657e7f880630e"
      ],
      "author": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Aug 29 15:12:20 2026 +0900"
      },
      "committer": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Aug 29 15:12:20 2026 +0900"
      },
      "message": "refactor: strict validation from bytes for bloom filter\n"
    },
    {
      "commit": "c8e42183091558de994b7110c71657e7f880630e",
      "tree": "110efcd7fc7bfd7085295b6c7915758ba6bb0bf3",
      "parents": [
        "70b86faa63402d7f62f5a6b1b05109d5fd1f2186",
        "689ffa075ece03c8387a9f65092be49d7d0d65ab"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Sat Aug 22 15:10:19 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 22 15:10:19 2026 +0900"
      },
      "message": "Merge pull request #514 from SavicStefan/lg\u003d4\n\nAllow theta sketches with lg_k \u003d 4 to match Java"
    },
    {
      "commit": "689ffa075ece03c8387a9f65092be49d7d0d65ab",
      "tree": "60192bb372d89a4d537a0d79d3595e4338650e76",
      "parents": [
        "9e84829e8d035669a9779e95c7773c70b2245e4f"
      ],
      "author": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Thu Aug 20 12:12:11 2026 +0000"
      },
      "committer": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Thu Aug 20 12:12:11 2026 +0000"
      },
      "message": "Ajmo testovi\n\nSigned-off-by: Stefan Savić \u003cstefan.savic@databricks.com\u003e\n"
    },
    {
      "commit": "9e84829e8d035669a9779e95c7773c70b2245e4f",
      "tree": "71a89a5b423bf4d59c901c7a9ab37ec43e4020fa",
      "parents": [
        "c22888581964fc490feee835766cc8c3adb722e0"
      ],
      "author": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Thu Aug 20 09:45:12 2026 +0000"
      },
      "committer": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Thu Aug 20 10:00:08 2026 +0000"
      },
      "message": "Allow theta sketches with lg_k \u003d 4 to match Java\n\nThe C++ theta implementation used a single constant, theta_constants::MIN_LG_K\n\u003d 5, for two distinct roles: the floor on the user-requested nominal size (K)\nand the floor on the internal hash table (cache) size. Java keeps these\nseparate -- ThetaUtil.MIN_LG_NOM_LONGS \u003d 4 and MIN_LG_ARR_LONGS \u003d 5 -- so Java\naccepts lg_k \u003d 4 (nominal 16) while C++ rejected it in theta_base_builder::\nset_lg_k.\n\nAs a result, C++ could not *construct* a theta/tuple update sketch or a union\nat lg_k \u003d 4, even though Java can. (Reading was unaffected: the compact\nserialization format does not carry lg_nom, so C++ already deserializes\nJava-produced lg \u003d 4 compact sketches -- this only concerns building them.)\n\nSplit the constant: MIN_LG_K becomes 4 (the nominal floor validated by\nset_lg_k, shared by update/union/tuple builders), and a new MIN_LG_ARR \u003d 5\nkeeps the hash table floored at 32 slots via starting_sub_multiple(). A lg_k \u003d\n4 sketch therefore starts with lg_cur_size (5) \u003e lg_nom_size (4) and only ever\nrebuilds down to the nominal 16, which the existing update/rebuild path already\nhandles.\n\nAdd tests: building at the minimum lg_k (and rejecting below it), estimation +\ntrim + serialization round trip for an update sketch, and a union built at the\nminimum lg_k.\n\nCo-authored-by: Isaac\n"
    },
    {
      "commit": "70b86faa63402d7f62f5a6b1b05109d5fd1f2186",
      "tree": "ac232f5e6e18c43a1a60f43921996dcdb5995d92",
      "parents": [
        "a001ebe44958f50dcd0aed97a5b3d5e4c97800a8",
        "01a67328c99a53b0ba6d11dec2421b1652bade84"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Sat Aug 15 21:43:50 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 15 21:43:50 2026 +0900"
      },
      "message": "Merge pull request #512 from SavicStefan/hll_bug_fix\n\nFix HLL union estimate/serialization regression from lazy KxQ rebuild"
    },
    {
      "commit": "01a67328c99a53b0ba6d11dec2421b1652bade84",
      "tree": "ac232f5e6e18c43a1a60f43921996dcdb5995d92",
      "parents": [
        "ed731c28cb83766df410558f5bd966a40cc3184a"
      ],
      "author": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Sat Aug 15 11:05:01 2026 +0000"
      },
      "committer": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Sat Aug 15 11:05:01 2026 +0000"
      },
      "message": "Fixed some stuff\n"
    },
    {
      "commit": "ed731c28cb83766df410558f5bd966a40cc3184a",
      "tree": "64380867cb097926e2e4381f7b2913b1aee13175",
      "parents": [
        "46025e9aeed8368b1184cbde9634dd99d0ee47c0"
      ],
      "author": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Fri Aug 14 12:39:01 2026 +0000"
      },
      "committer": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Fri Aug 14 12:39:01 2026 +0000"
      },
      "message": "Trimed comments and refactor the tests\n\nSigned-off-by: Stefan Savić \u003cstefan.savic@databricks.com\u003e\n"
    },
    {
      "commit": "46025e9aeed8368b1184cbde9634dd99d0ee47c0",
      "tree": "ce52883d6fc00201be1d23629798b14aaa379db2",
      "parents": [
        "a001ebe44958f50dcd0aed97a5b3d5e4c97800a8"
      ],
      "author": {
        "name": "SavicStefan",
        "email": "50296686+SavicStefan@users.noreply.github.com",
        "time": "Thu Aug 13 18:03:24 2026 +0000"
      },
      "committer": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Thu Aug 13 18:15:21 2026 +0000"
      },
      "message": "Fix HLL union estimate/serialization regression from lazy KxQ rebuild\n\nSince the lazy KxQ/curMin rebuild was introduced (\"skip updating kxq in HLL\nmerge\"), Hll8Array::mergeHll only sets rebuild_kxq_curmin_ and defers the\nrecompute. Several consumers read that deferred state without honoring the\nflag, so unioning HLL sketches with different lgConfigK could:\n\n- discard accumulated data: isEmpty() reads curMin_/numAtCurMin_, which stay at\n  empty-sketch defaults after a downsampling merge, so a populated gadget looks\n  empty and the next union update overwrites it;\n- corrupt the estimate: internalCouponUpdate does incremental KxQ/HIP updates\n  against the stale base;\n- serialize non-deterministically: copyAs() rebuilds via register replay\n  (convertToHll8) while estimate/bounds rebuild via the direct sum, so equivalent\n  merges could serialize to different bytes.\n\nThe effect was estimates collapsing to ~one input\u0027s cardinality (merge-order\ndependent) and merge-order-dependent serialization; 4.0.1 had neither.\n\nFix, keeping the lazy-merge optimization:\n- isEmpty(): a pending rebuild means the array is non-empty.\n- internalCouponUpdate(): rebuild before an incremental update reads KxQ, only\n  when the coupon changes a register (duplicate coupons stay lazy).\n- copyAs(): make every same-type result use the direct-sum rebuild so all paths\n  agree, keeping serialization merge-order independent.\n\nAdds a regression test covering estimate order-independence, is_empty() after a\ndownsampling merge, scalar-after-merge accumulation, and merge-order-independent\nserialization.\n\nCo-authored-by: Isaac\nCo-authored-by: Stefan Savić \u003cstefan.savic@databricks.com\u003e\n"
    },
    {
      "commit": "a001ebe44958f50dcd0aed97a5b3d5e4c97800a8",
      "tree": "6ceef9322f2e4fecc596c37ce23de0fef93cc7f8",
      "parents": [
        "c22888581964fc490feee835766cc8c3adb722e0",
        "944aed14595535f15e37cf17f9e91c1a8bb080e1"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Tue Aug 11 00:14:26 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 00:14:26 2026 +0900"
      },
      "message": "Merge pull request #511 from SavicStefan/tuple_fix\n\nBounds-check per-entry key read in compact_tuple_sketch::deserialize"
    },
    {
      "commit": "944aed14595535f15e37cf17f9e91c1a8bb080e1",
      "tree": "6ceef9322f2e4fecc596c37ce23de0fef93cc7f8",
      "parents": [
        "650c4c9b0ec95fedd899e66bba6a9ed486080c72"
      ],
      "author": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Mon Aug 10 14:58:20 2026 +0000"
      },
      "committer": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Mon Aug 10 14:58:20 2026 +0000"
      },
      "message": "Fixed test name, to make more sense\n"
    },
    {
      "commit": "650c4c9b0ec95fedd899e66bba6a9ed486080c72",
      "tree": "c74db55c5f0894dd5b4db5fdca5acb07035716a9",
      "parents": [
        "c22888581964fc490feee835766cc8c3adb722e0"
      ],
      "author": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Mon Aug 10 12:57:50 2026 +0000"
      },
      "committer": {
        "name": "Stefan Savić",
        "email": "stefan.savic@databricks.com",
        "time": "Mon Aug 10 12:57:50 2026 +0000"
      },
      "message": "Bounds-check per-entry key read in compact_tuple_sketch::deserialize\n\nThe entry-reading loop reads each entry as an 8-byte key followed by a\nSummary-width summary. The summary read is passed the remaining capacity and\nbounds-checks itself, but the key read is an unchecked fixed-size copy_from_mem\nthat relies solely on the pre-loop keys-only reservation, which assumes every\nentry\u0027s summary occupies the width Summary serializes to.\n\nWhen that assumption does not hold (a truncated buffer, or a buffer whose\nserialized summary width differs from the Summary it is deserialized as) the\nread cursor advances past the data. num_entries is read from the preamble and\nis unaffected, so the loop runs the full count and a later key read walks off\nthe end of the buffer: silent on a normal build, a heap-buffer-overflow under\nAddressSanitizer.\n\nAdd an ensure_minimum_memory check before the key read, mirroring the\nremaining-capacity check the summary read already performs and the up-front\nsize validation the compact theta parser does. A malformed buffer now throws\nstd::out_of_range instead of reading out of bounds.\n\nAdds a tuple_sketch_test case that deserializes a float-summary sketch as a\ndouble-summary sketch and asserts std::out_of_range.\n\nCo-authored-by: SavicStefan \u003c50296686+SavicStefan@users.noreply.github.com\u003e\n"
    },
    {
      "commit": "c22888581964fc490feee835766cc8c3adb722e0",
      "tree": "231b58e117b09f3ad48a3f723ad2bb47c9ebbc90",
      "parents": [
        "89e74be285a9e1b99f9d0e56096bb6d1bd9148dd",
        "d42b3dc7734a79951abf1a7daccc57751406757f"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Tue Jul 21 10:19:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 10:19:16 2026 -0700"
      },
      "message": "Merge pull request #508 from proost/test-req-sketch-exact-mode-coverage\n\ntest: cover req sketch exact mode from serialized bytes"
    },
    {
      "commit": "89e74be285a9e1b99f9d0e56096bb6d1bd9148dd",
      "tree": "899b00bc575149795f4d5dc54be8fe26b7e5dd10",
      "parents": [
        "b3e8cc9e5e14fb8f0aed4cc5ba229d27d874a828",
        "e06c663eead7ae128b45738baecf1c4ba45841f2"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Mon Jul 20 18:57:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 18:57:04 2026 -0700"
      },
      "message": "Merge pull request #510 from PointKernel/agent/remove-stale-python-cmake-hook\n\nRemove stale Python CMake hook"
    },
    {
      "commit": "e06c663eead7ae128b45738baecf1c4ba45841f2",
      "tree": "899b00bc575149795f4d5dc54be8fe26b7e5dd10",
      "parents": [
        "b3e8cc9e5e14fb8f0aed4cc5ba229d27d874a828"
      ],
      "author": {
        "name": "Yunsong Wang",
        "email": "yunsongw@nvidia.com",
        "time": "Mon Jul 20 21:17:25 2026 +0000"
      },
      "committer": {
        "name": "Yunsong Wang",
        "email": "yunsongw@nvidia.com",
        "time": "Mon Jul 20 21:17:25 2026 +0000"
      },
      "message": "Remove stale Python CMake hook\n"
    },
    {
      "commit": "163e75ea22111d76a4edf88f381faee10ebd99ce",
      "tree": "2e6beb8240d7d59d53c8f2cf1b469f4d5d9f88a3",
      "parents": [
        "91f6b19745361fb2904df3ca0a440af6b7521e54",
        "b3e8cc9e5e14fb8f0aed4cc5ba229d27d874a828"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Mon Jul 13 13:58:56 2026 +0200"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Mon Jul 13 13:58:56 2026 +0200"
      },
      "message": "Merge branch \u0027master\u0027\n"
    },
    {
      "commit": "b3e8cc9e5e14fb8f0aed4cc5ba229d27d874a828",
      "tree": "a4511e8d5857db402096acd534b6162a95308e06",
      "parents": [
        "78cc913305740cfec41724c63bf59741eb3c1146",
        "ab1a6c604daec8bc02eb3f75897ea00c1c98109a"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Sat Jul 11 21:10:05 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 21:10:05 2026 +0900"
      },
      "message": "Merge pull request #507 from cv4g/countmin-microbenchmark\n\nAdd micro-benchmark for `count_min_sketch`"
    },
    {
      "commit": "78cc913305740cfec41724c63bf59741eb3c1146",
      "tree": "fc93930f30151b27abd74fd79074cee73bdd5c12",
      "parents": [
        "401423367055acdf7502e8ed3126730a08039d91",
        "a211236329e9fd97cf8c7172a357e55fe7e14292"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Sat Jul 11 21:09:40 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 11 21:09:40 2026 +0900"
      },
      "message": "Merge pull request #506 from cv4g/countmin-avoid-allocations-in-get_hashes\n\nRemove allocation in `count_min_sketch::get_hashes`"
    },
    {
      "commit": "91f6b19745361fb2904df3ca0a440af6b7521e54",
      "tree": "37366c0365251f83887a9d8fb56a0d2fb83741f6",
      "parents": [
        "63e7f75771bbf168704cb53956b0a7d0dd90bf30",
        "401423367055acdf7502e8ed3126730a08039d91"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 21:08:51 2026 +0000"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 21:45:18 2026 +0000"
      },
      "message": "Merge branch \u0027master\u0027\n"
    },
    {
      "commit": "63e7f75771bbf168704cb53956b0a7d0dd90bf30",
      "tree": "3e0ec7ada95536fc1b5e66db2718955c9aded9f7",
      "parents": [
        "764cdf1e725b8158ba5b3eb137a557870671ce29"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 17:00:46 2026 +0000"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 18:46:46 2026 +0000"
      },
      "message": "Serialize count_min_sketch sketch array in a single write call\n"
    },
    {
      "commit": "764cdf1e725b8158ba5b3eb137a557870671ce29",
      "tree": "59f1fd247317e3546ec1456113238404ad2fb7b9",
      "parents": [
        "4e66c11a247d1512f095e2c85e4efb846692fe0a"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 18:37:41 2026 +0000"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 18:46:33 2026 +0000"
      },
      "message": "Extend micro-benchmark for count_min_sketch serialization\n"
    },
    {
      "commit": "4e66c11a247d1512f095e2c85e4efb846692fe0a",
      "tree": "532dac5113e96f901aac7b351dece6b8d6631e56",
      "parents": [
        "60298033ffe1f0c28c24c454a5399463f84cd20d"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Thu Jul 09 18:53:15 2026 +0200"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 18:45:34 2026 +0000"
      },
      "message": "Add serialize_to sink API for count-min sketch\n"
    },
    {
      "commit": "60298033ffe1f0c28c24c454a5399463f84cd20d",
      "tree": "2a840d3be1fe7fa72f9fefa4d2d673d60686c266",
      "parents": [
        "76edd74f5db286b672c170a8ded4ce39b3a8800f"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 18:37:41 2026 +0000"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Fri Jul 10 18:45:28 2026 +0000"
      },
      "message": "Add micro-benchmark for count_min_sketch serialization\n"
    },
    {
      "commit": "ab1a6c604daec8bc02eb3f75897ea00c1c98109a",
      "tree": "02ba77151c6bad6d99df5430f7fc04605a7d617a",
      "parents": [
        "837fe9df348fe2dd85cd09b1ac0a903d5402fc70"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Wed Jul 08 14:03:35 2026 +0200"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Wed Jul 08 14:04:25 2026 +0200"
      },
      "message": "Add ClobberMemory to count_min update benchmarks\n"
    },
    {
      "commit": "d42b3dc7734a79951abf1a7daccc57751406757f",
      "tree": "9e97a28924538787db5cf130e95931c35c694036",
      "parents": [
        "401423367055acdf7502e8ed3126730a08039d91"
      ],
      "author": {
        "name": "lani_karrot",
        "email": "lani@daangn.com",
        "time": "Tue Jul 07 14:39:36 2026 +0900"
      },
      "committer": {
        "name": "lani_karrot",
        "email": "lani@daangn.com",
        "time": "Tue Jul 07 14:39:36 2026 +0900"
      },
      "message": "test: cover req sketch exact mode from serialized bytes\n"
    },
    {
      "commit": "837fe9df348fe2dd85cd09b1ac0a903d5402fc70",
      "tree": "600f1d753a978676e73b050d521d4b2826f0b598",
      "parents": [
        "401423367055acdf7502e8ed3126730a08039d91"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Thu Jul 02 18:32:12 2026 +0200"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Thu Jul 02 19:25:34 2026 +0200"
      },
      "message": "Add micro-benchmark for count_min_sketch\n"
    },
    {
      "commit": "a211236329e9fd97cf8c7172a357e55fe7e14292",
      "tree": "fc93930f30151b27abd74fd79074cee73bdd5c12",
      "parents": [
        "401423367055acdf7502e8ed3126730a08039d91"
      ],
      "author": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Thu Jul 02 17:43:51 2026 +0200"
      },
      "committer": {
        "name": "Christoph Viebig",
        "email": "christoph.viebig@clickhouse.com",
        "time": "Thu Jul 02 18:08:19 2026 +0200"
      },
      "message": "Avoid allocation in count_min_sketch::get_hashes\n"
    },
    {
      "commit": "401423367055acdf7502e8ed3126730a08039d91",
      "tree": "66a744942a6651c354c3a68c39ce241fbf7168b8",
      "parents": [
        "0bab2596260510a40c1c953af1d6746c19d87dd1"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Thu Jun 25 23:02:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 23:02:50 2026 +0800"
      },
      "message": "Fix count-min sketches test snapshots should use binary mode (#505)\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e"
    },
    {
      "commit": "0bab2596260510a40c1c953af1d6746c19d87dd1",
      "tree": "de045f4039ea9bbc25fdca14d8427ce3561382ca",
      "parents": [
        "75934fa5347a5b7a7a48872a4d974e1a8988b210",
        "58344f31e97c269b5cf253828327bdc5fe91ced2"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Fri Jun 19 11:09:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 19 11:09:42 2026 -0700"
      },
      "message": "Merge pull request #504 from apache/tisonkun-patch-2\n\nUpdate .gitattributes for new file types"
    },
    {
      "commit": "58344f31e97c269b5cf253828327bdc5fe91ced2",
      "tree": "de045f4039ea9bbc25fdca14d8427ce3561382ca",
      "parents": [
        "22ec883d58322d4e088595bba71db90a44e12d6c"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Fri Jun 19 13:09:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 19 13:09:58 2026 +0800"
      },
      "message": "Apply suggestions from code review\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "22ec883d58322d4e088595bba71db90a44e12d6c",
      "tree": "2a8ee2947ef962ed0827f6c9a6201aedc4e79bc3",
      "parents": [
        "75934fa5347a5b7a7a48872a4d974e1a8988b210"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Fri Jun 19 02:20:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 19 02:20:07 2026 +0800"
      },
      "message": "Update .gitattributes for new file types\n\nSee https://github.com/apache/datasketches-rust/pull/92#issuecomment-4743982760.\r\n\r\nI don\u0027t know if it works but it should at least do no harm."
    },
    {
      "commit": "75934fa5347a5b7a7a48872a4d974e1a8988b210",
      "tree": "411024be3cacb3e1a11360ff493ccfdea6a7e413",
      "parents": [
        "7de007f13a67521473e8556db493c27f7524b828",
        "805eaf3c5d96bf6263298880be10da30a604faec"
      ],
      "author": {
        "name": "Lee Rhodes",
        "email": "leerho@users.noreply.github.com",
        "time": "Fri Jun 05 09:17:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 09:17:14 2026 -0700"
      },
      "message": "Merge pull request #503 from jihuayu/codex/couponlist-deserialize-bugfix\n\nFix CouponList deserialization count validation bug"
    },
    {
      "commit": "805eaf3c5d96bf6263298880be10da30a604faec",
      "tree": "411024be3cacb3e1a11360ff493ccfdea6a7e413",
      "parents": [
        "a07e6f6f81953fa8881b258c1cb3df23a1ad9989"
      ],
      "author": {
        "name": "jihuayu",
        "email": "jihuayu123@gmail.com",
        "time": "Fri Jun 05 21:16:33 2026 +0800"
      },
      "committer": {
        "name": "jihuayu",
        "email": "jihuayu123@gmail.com",
        "time": "Fri Jun 05 21:16:33 2026 +0800"
      },
      "message": "Reject full CouponList during deserialization\n"
    },
    {
      "commit": "a07e6f6f81953fa8881b258c1cb3df23a1ad9989",
      "tree": "6cbc031e930c4f78e659c0fe5748a5ca5b5db73d",
      "parents": [
        "7de007f13a67521473e8556db493c27f7524b828"
      ],
      "author": {
        "name": "John Kew",
        "email": "john.kew@snowflake.com",
        "time": "Wed Apr 22 14:33:40 2026 -0700"
      },
      "committer": {
        "name": "jihuayu",
        "email": "jihuayu123@gmail.com",
        "time": "Fri Jun 05 21:15:54 2026 +0800"
      },
      "message": "Fix CouponList deserialization count validation bug\n"
    },
    {
      "commit": "7de007f13a67521473e8556db493c27f7524b828",
      "tree": "5501b8bd367d29a2609a315015811a4c4f319155",
      "parents": [
        "639134f6e88483bd1bfca451cf09d243ade9bdd4"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Wed May 20 12:00:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 12:00:47 2026 +0800"
      },
      "message": "chore: Add a link to datasketches-rust to README.md (#501)"
    },
    {
      "commit": "639134f6e88483bd1bfca451cf09d243ade9bdd4",
      "tree": "37898a05401e036177a0a4db8e6bf3a3e882b7f9",
      "parents": [
        "4117520c7be29cad192a1a917a25e32a9c242854",
        "bbd13d27958383c66df4fd3cefe18b2cdd66826f"
      ],
      "author": {
        "name": "Hyeonho Kim",
        "email": "proost@apache.org",
        "time": "Tue Apr 14 15:23:57 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 15:23:57 2026 +0900"
      },
      "message": "Merge pull request #500 from proost/fix-missing-header-gcc-15\n\nfix: missing header with gcc 15"
    },
    {
      "commit": "bbd13d27958383c66df4fd3cefe18b2cdd66826f",
      "tree": "37898a05401e036177a0a4db8e6bf3a3e882b7f9",
      "parents": [
        "44e6fb33d23e86cbef437ba54c7d2bfa1b06e7f1"
      ],
      "author": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Apr 11 23:43:25 2026 +0900"
      },
      "committer": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Apr 11 23:43:25 2026 +0900"
      },
      "message": "fix: pinning with windows 2025\n"
    },
    {
      "commit": "44e6fb33d23e86cbef437ba54c7d2bfa1b06e7f1",
      "tree": "937337f2d3708463f652cb661a09ae3766e4f33b",
      "parents": [
        "0a885718cad4f32e7cc240dba288d0a12b6b09b0"
      ],
      "author": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Apr 11 17:44:32 2026 +0900"
      },
      "committer": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Apr 11 17:44:32 2026 +0900"
      },
      "message": "ci: change build coverage\n"
    },
    {
      "commit": "0a885718cad4f32e7cc240dba288d0a12b6b09b0",
      "tree": "867af224485cf745a31f2ef98ea408a35ec6e3f6",
      "parents": [
        "4117520c7be29cad192a1a917a25e32a9c242854"
      ],
      "author": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Apr 11 17:44:14 2026 +0900"
      },
      "committer": {
        "name": "proost",
        "email": "proost@apache.org",
        "time": "Sat Apr 11 17:44:14 2026 +0900"
      },
      "message": "fix: missing header when compile using gcc 15\n"
    }
  ],
  "next": "4117520c7be29cad192a1a917a25e32a9c242854"
}
