)]}'
{
  "log": [
    {
      "commit": "ed0a18fb8d097c3b2f351e9a801754a482ce40f7",
      "tree": "6092a4c3481c2d509f203a33c2eb413b7c3c12fd",
      "parents": [
        "cf3b770b9aeb85c4ff883723bcb9f646a494be6b"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Aug 25 14:06:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 14:06:51 2026 +0800"
      },
      "message": "docs: add native inverted-index design package (#1306)"
    },
    {
      "commit": "cf3b770b9aeb85c4ff883723bcb9f646a494be6b",
      "tree": "81a55eb5e396ca93c6db8c70f30aaef4439759a4",
      "parents": [
        "4bec7cafcccfbdb0a7abed84e71c2c728f3fc57b"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Tue Aug 25 12:15:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 12:15:19 2026 +0800"
      },
      "message": "Fix standalone TopN write ordering (#1304)"
    },
    {
      "commit": "4bec7cafcccfbdb0a7abed84e71c2c728f3fc57b",
      "tree": "270515f945009c3b95d608c7749214de92bbf855",
      "parents": [
        "3b83e18fb0481d02e44eaa5df137fcf7b000754b"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Aug 25 08:32:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 08:32:12 2026 +0800"
      },
      "message": "docs(skills): add a gh-issue skill for writing and splitting issues (#1305)\n\nBanyanDB\u0027s issues live in apache/skywalking, and the ones that sit untouched\nare usually the ones nobody can implement from without asking a question. This\nrecords what an issue has to carry to be actionable: a boundary, expected\nvalues stated rather than left to be derived the way the implementation would\nderive them, and acceptance criteria provable by running something.\n\nIt also carries the packages-to-test-commands map, and the `make build` before\n`make pre-push` ordering a fresh clone needs — pre-push runs lint, lint\ntypechecks ui/, and ui/ embeds dist, which only exists after a build.\n\nThe second half splits a design-ready issue into dependency-ordered vertical\nslices filed as sub-issues, including that the sub_issues endpoint takes the\nchild\u0027s id rather than its number.\n\nNo CHANGES.md entry, following the previous skills-only commits 145686a5 and\n9ebac451; the entries there are release notes and this is contributor tooling.\n\nCo-authored-by: Gao Hongtao \u003c1960537+hanahmily@users.noreply.github.com\u003e"
    },
    {
      "commit": "3b83e18fb0481d02e44eaa5df137fcf7b000754b",
      "tree": "803f4be3f2d4228843df23d6c4ba1af3f1b87b14",
      "parents": [
        "8f1c6f5fd7acb8356f5bd5cdcd6feee7a478c5d4"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 24 16:28:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 16:28:25 2026 +0800"
      },
      "message": "feat: advertise BanyanDB API version 0.11 (#1303)"
    },
    {
      "commit": "8f1c6f5fd7acb8356f5bd5cdcd6feee7a478c5d4",
      "tree": "7a177e8eb03e41ae5f35ad4eea295a86b3556d79",
      "parents": [
        "70c1275864c9127db6daf5233441573fb287dcc4"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Mon Aug 24 13:27:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 13:27:56 2026 +0800"
      },
      "message": "Fix lifecycle migration test source readiness (#1301)"
    },
    {
      "commit": "70c1275864c9127db6daf5233441573fb287dcc4",
      "tree": "51cbd5fdf059ec653be313c1830cee749b282ea6",
      "parents": [
        "4c1f79a0320824cb62cedfc79d461ca08dcdd931"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Aug 24 09:23:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 09:23:52 2026 +0800"
      },
      "message": "Fix wrong log level in trace lifecycle migration (#1300)"
    },
    {
      "commit": "4c1f79a0320824cb62cedfc79d461ca08dcdd931",
      "tree": "e8c6e0f25a43a47d2f66ab67e892afa62f0fa428",
      "parents": [
        "7638c9fb275bab51b444fb8e483fe049b4f65e69"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sun Aug 23 23:41:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 23 23:41:33 2026 +0800"
      },
      "message": "Prevent metrics collection after inverted store closure (#1298)"
    },
    {
      "commit": "7638c9fb275bab51b444fb8e483fe049b4f65e69",
      "tree": "46e040f19eaf2b52361614f738140e2a774e48b2",
      "parents": [
        "2b1a7192e9a04cb7261f0adc159df38e006bd7db"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sun Aug 23 22:49:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 23 22:49:25 2026 +0800"
      },
      "message": "Add liaison write-path latency metrics (#1299)"
    },
    {
      "commit": "2b1a7192e9a04cb7261f0adc159df38e006bd7db",
      "tree": "8ab369db471dba20b379d63c50dc13ecd102cff6",
      "parents": [
        "523a15157529e985e2d3defc3f00a256d82b0b3c"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sun Aug 23 20:37:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 23 20:37:47 2026 +0800"
      },
      "message": "Fix flaky trace merge benchmark observer test (#1294)"
    },
    {
      "commit": "523a15157529e985e2d3defc3f00a256d82b0b3c",
      "tree": "48d5232e79147bc801dfe2b64ca5907b3d2c34b0",
      "parents": [
        "9ebac4516a5d4a84d69f882ae75bf43bc2fd1558"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sun Aug 23 15:44:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 23 15:44:23 2026 +0800"
      },
      "message": "fix(test): await schema barrier before standalone writes (#1297)"
    },
    {
      "commit": "9ebac4516a5d4a84d69f882ae75bf43bc2fd1558",
      "tree": "ddc14e99134dde5a6247d8af6f0121a1054c4516",
      "parents": [
        "6c0d696909189a91b31ebd8bf8c32227ac88f0b9"
      ],
      "author": {
        "name": "Jingyi Qu",
        "email": "JophieQu@gmail.com",
        "time": "Fri Aug 21 22:44:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 22:44:09 2026 +0800"
      },
      "message": "Support BYDBQL TUI  agent  (#1292)"
    },
    {
      "commit": "6c0d696909189a91b31ebd8bf8c32227ac88f0b9",
      "tree": "4e03dabec476054a72da3d8a218ceae0a6fd7aa1",
      "parents": [
        "da86fc478244674b89e409d5bac70ef242fe78e8"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Aug 20 19:22:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 19:22:53 2026 +0800"
      },
      "message": "Fix liaison batch admission timeout (#1293)"
    },
    {
      "commit": "da86fc478244674b89e409d5bac70ef242fe78e8",
      "tree": "b86855e6854966d641f99bb67bd3f1f121b1a648",
      "parents": [
        "00ef2d2bd4a364e44292bae0c972da8253f32fed"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Aug 19 15:46:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 15:46:51 2026 +0800"
      },
      "message": "Expose trace sampler decision and row metrics (#1290)"
    },
    {
      "commit": "00ef2d2bd4a364e44292bae0c972da8253f32fed",
      "tree": "ecd070a819e985f3ebe7c5f8088bea161ebe9569",
      "parents": [
        "d5a0176fe006a8bd9b2cebfcdc4618135f9cd9cd"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Wed Aug 19 12:44:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 12:44:26 2026 +0800"
      },
      "message": "Fix flaky trace merge panic test wait (#1289)"
    },
    {
      "commit": "d5a0176fe006a8bd9b2cebfcdc4618135f9cd9cd",
      "tree": "012c777eec249d8259eea71939f353afe3e3a43e",
      "parents": [
        "dcc10d4fc2c783d099512af0b81fd1e8dc01f4d2"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Aug 19 11:41:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 11:41:22 2026 +0800"
      },
      "message": "Fix Canopy behind path-prefix proxies (#1286)"
    },
    {
      "commit": "dcc10d4fc2c783d099512af0b81fd1e8dc01f4d2",
      "tree": "b7ec47df09dc1fd4077607c9685300bbf202bf14",
      "parents": [
        "f994e6b392cb41e511943ca6c429301d64c54a16"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Aug 19 09:51:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 09:51:34 2026 +0800"
      },
      "message": "Fix flaky schema-merge tests near midnight (#1288)"
    },
    {
      "commit": "f994e6b392cb41e511943ca6c429301d64c54a16",
      "tree": "fc50c4576d3d2ca04cd2e01ad6e217d9ee2225ca",
      "parents": [
        "d134f8db3b439b27f4ff2e70e6a237ad9293c9b2"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Wed Aug 19 08:42:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 08:42:45 2026 +0800"
      },
      "message": "Fix merge benchmark observer test setup (#1287)"
    },
    {
      "commit": "d134f8db3b439b27f4ff2e70e6a237ad9293c9b2",
      "tree": "a5a45808bf05456e26924950a7a6032cfecff88c",
      "parents": [
        "ed255a15f5aa07fd7eaa727e689731d7a76baf65"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 17 18:08:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 18:08:13 2026 +0800"
      },
      "message": "Fix critical trace query and merge correctness (#1285)"
    },
    {
      "commit": "ed255a15f5aa07fd7eaa727e689731d7a76baf65",
      "tree": "fbd47fbbbf7e59feb9fbb5df414d73317d697257",
      "parents": [
        "ebfb52688449927d9e9597fdd6397336f8c9e059"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 17 16:39:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 16:39:20 2026 +0800"
      },
      "message": "docs: curate 0.11.0 release notes (#1282)"
    },
    {
      "commit": "ebfb52688449927d9e9597fdd6397336f8c9e059",
      "tree": "c94acadbc4607e3d27b760ab923496507a205e91",
      "parents": [
        "2276ebe54fd3b137b4eb078b64d826149874d3f5"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 17 15:46:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 15:46:16 2026 +0800"
      },
      "message": "ci: dead-link-checker on all *.md and shim required checks (#1283)"
    },
    {
      "commit": "2276ebe54fd3b137b4eb078b64d826149874d3f5",
      "tree": "5580b10c8d93bca2134a58df8742e515b1425409",
      "parents": [
        "c68b82faf38b0faf512568be57551a29f84ba3c4"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 17 14:21:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 14:21:18 2026 +0800"
      },
      "message": "chore(deps): bump go toolchain to 1.25.13 and dependencies to clear CVEs (#1284)"
    },
    {
      "commit": "c68b82faf38b0faf512568be57551a29f84ba3c4",
      "tree": "811157f4d05a482ff1590b043ec867357903e36a",
      "parents": [
        "abc7e08adfb67a642c0c2e2e74248a0d7d879a04"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 17 08:32:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 08:32:30 2026 +0800"
      },
      "message": "fix(canopy): support HTTP session cookies (#1281)"
    },
    {
      "commit": "abc7e08adfb67a642c0c2e2e74248a0d7d879a04",
      "tree": "7cfa4dc1e9551755f3973861fa385f7585f7f00b",
      "parents": [
        "3b4e4d973136ef2a37873f84872072b987a78a02"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sat Aug 15 08:42:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 15 08:42:52 2026 +0800"
      },
      "message": "ci(canopy): publish the canopy image for every main commit (#1280)\n\nThe canopy workflow filtered its push trigger on `paths: canopy/**`, so a\nmain commit that touched no canopy file never ran it and never produced a\n`\u003csha\u003e-canopy` image. The tag is meant to pair with the `\u003csha\u003e` and\n`\u003csha\u003e-testing` images publish-docker.yml pushes for the same commit, so\nevery Go-only merge left a hole: 3b4e4d97 has `-testing` in ghcr but no\n`-canopy`.\n\nDrop the paths filter and pin the push trigger to main, mirroring\npublish-docker.yml. Pull requests keep the filter, so canopy CI still only\nruns on canopy-touching PRs.\n\nMain now builds and publishes only -- no tests, per the convention\nestablished in #1267. build-test and integration-test are gated to\npull_request, and image-build accepts a skipped build-test so the gate does\nnot skip the build itself. The single-arch build, docker save and artifact\nupload exist only to feed the integration test, so they are gated too; main\ndoes one dual-arch build instead of discarding an amd64 one.\n\nThe required-check shims are restricted to pull_request as well. Without the\npaths filter this workflow now runs on main alongside ci.yml and\npublish-docker.yml, and two workflows reporting the same check context on one\ncommit would let the no-op jobs mask a real failure."
    },
    {
      "commit": "3b4e4d973136ef2a37873f84872072b987a78a02",
      "tree": "eb2caf656f8c334d715736fd3ec932ef8fa22f1d",
      "parents": [
        "d323982a5b8e361defdf257df8e247e8d7726b34"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Aug 13 19:32:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 13 19:32:21 2026 +0800"
      },
      "message": "Add Phase 10 trace plugin performance report (#1279)"
    },
    {
      "commit": "d323982a5b8e361defdf257df8e247e8d7726b34",
      "tree": "7096b72ecb7350fd8e0cd75798132d1e3be99170",
      "parents": [
        "d11dd1b049f951b953dd35d42f5b972ead8c068e"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Aug 12 19:48:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 19:48:29 2026 +0800"
      },
      "message": "Add trace plugin execution observability (#1278)"
    },
    {
      "commit": "d11dd1b049f951b953dd35d42f5b972ead8c068e",
      "tree": "d906ff5a91dbbafe411bb5dbfd85d0ce725cca30",
      "parents": [
        "0ea574327a262d1d0cde3df408f2ba8224356bfa"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Aug 12 11:40:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 11:40:52 2026 +0800"
      },
      "message": "Fix flaky trace snapshot-fallback tests racing async snapshot persist (#1276)"
    },
    {
      "commit": "0ea574327a262d1d0cde3df408f2ba8224356bfa",
      "tree": "97b529bfba7b49b697a4a2d04aa5badd11ae0e1e",
      "parents": [
        "d1d8a02927c17bd6625a40bf563a8aa423ef60a7"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Aug 11 15:33:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 15:33:01 2026 +0800"
      },
      "message": "Bound the trace merge drop-set with a retain-instead-of-drop ceiling (#1277)"
    },
    {
      "commit": "d1d8a02927c17bd6625a40bf563a8aa423ef60a7",
      "tree": "d1f7f95b337f22ff3f91f47f9df3cd69caf4359e",
      "parents": [
        "7060969527ae1025714937c7159ba38111eac1ac"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Aug 11 09:02:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 09:02:16 2026 +0800"
      },
      "message": "ci: scope daily slow tests (#1273)"
    },
    {
      "commit": "7060969527ae1025714937c7159ba38111eac1ac",
      "tree": "d2ec5e1ecc829accf05c8b600068036f26ef74b7",
      "parents": [
        "c99d6117f50d8967265ed9f82a4c36e76aa0beb5"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 10 19:30:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 19:30:59 2026 +0800"
      },
      "message": "perf(tracesampler): halve realistic sampler decision cost via direct scalar reads and early entry rejection (#1274)"
    },
    {
      "commit": "c99d6117f50d8967265ed9f82a4c36e76aa0beb5",
      "tree": "cb63c308ecf229567a81bd9c565a9b32d8b85a86",
      "parents": [
        "b841462841a016d765f9b3a00ebe110dc89545ae"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 10 18:46:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 18:46:22 2026 +0800"
      },
      "message": "fix(test): regenerate the TLS test certificate that expired today (#1275)"
    },
    {
      "commit": "b841462841a016d765f9b3a00ebe110dc89545ae",
      "tree": "315bb3955719d576e0d51f04277bfd70c4cf758e",
      "parents": [
        "3d62826054c5a0eef77b62573741835995b5292d"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 10 15:01:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 15:01:23 2026 +0800"
      },
      "message": "Count panics recovered by the gRPC interceptors (#1268)\n\n* fix(observability): count panics recovered by the gRPC interceptors\n\nEach gRPC server hand-rolled a recovery handler that only logged the\npanic and returned codes.Internal, so panics on a request path reached\nnone of panicdiag\u0027s signals: not banyandb_panic_total, not the crash\nreporters, not the artifact writer. During a production incident one\ndata node logged 737 recovered request-path panics while\nbanyandb_panic_total stayed at 4 -- the only goroutine panics, which\nroute through run.Go. The panics worth alerting on were the ones\nnothing counted.\n\nExtract the signal-emitting body of WithRecovery so a panic recovered\nelsewhere can reuse it, expose it as RecoverExternal, and replace the\nfour copied handlers with panicdiag.GRPCRecoveryHandler labelled per\nserver. The stack is captured inside the interceptor\u0027s recovering\ndefer, so artifacts keep pointing at the panic site.\n\n* test(stream): gate the snapshot test on flush persist, not the part dir\n\nTestSnapshotFunctionality waited for a part directory to appear before\ntaking a snapshot, but memPart.mustFlush creates that directory on its\nfirst line -- before the mem-\u003efile introduction reaches the snapshot\nand before the .snp manifest is written. The snapshot could therefore\nbe taken mid-flush, yielding no part directory in the copy and a\nhalf-written manifest. Removing the accompanying sleep reproduces it\nevery time.\n\nWait for the persisted .snp manifest instead, porting the helper that\nalready fixed the identical race for measure in #1152.\n\n* docs: record the stream snapshot test fix in CHANGES\n\n* test(schema): retry the clamp CreatedAt-span query on the topology race\n\nThe distributed clamp spec queried once immediately after AwaitRevision\nand AwaitApplied returned. Those confirm the schema cache, not that the\ndata node has loaded the group\u0027s topology, so the query could still fail\nwith \"group clamp-span-... not found\". Retry until it resolves, the same\ntreatment the multi-group spec below already received. Retrying only on\nerror keeps the assertion honest: a real clamp regression surfaces as a\nnon-empty successful response.\n\n* test(topn): stop overriding the configured eventually timeout\n\nThe TopN verify helper passed flags.EventuallyTimeout and then chained\nWithTimeout(10s), which takes precedence, so the spec always ran on a\n10s budget. CI builds the integration suites with\n-X ...flags.eventuallyTimeout\u003d30s precisely so slow runners get more\nroom, and this was the only case in test/cases that opted out of it --\nhence \u0027Timed out after 10.001s\u0027 on a loaded runner while the same suite\npasses locally. Pass the polling interval positionally instead and let\nthe configured timeout apply.\n\n* test(measure): keep both merge batches inside one day segment\n\nThe schema-change merge spec wrote its two batches at now-2h and now-1h\nand then waited for the part count to drop. sw_metric uses a 1-day\nsegment aligned to local midnight, so any run starting within two hours\nof midnight put the first batch in yesterday\u0027s segment and the second in\ntoday\u0027s. A merge only ever combines parts within one segment, so the\ncount could never drop and the wait burned its entire budget: the CI\nfailure ran at 01:02 UTC and timed out after 600s on 2 \u003c 2.\n\nThat also explains why raising the budget never helped -- it was never a\nlatency problem. Compress both offsets into the elapsed part of the\ncurrent segment when too little of the day has passed, keeping their\norder and staying inside the -3h query window.\n\nVerified both directions: forcing the clock to 01:00 reproduces the\ntimeout before the change and passes in 10s after it, and the package\nnow completes in 109s instead of 704s.\n\n* docs: record the remaining test-stability fixes in CHANGES"
    },
    {
      "commit": "3d62826054c5a0eef77b62573741835995b5292d",
      "tree": "8756b55c1c8cea795899e2238c275184ee7ac6e7",
      "parents": [
        "7f685a1d89de5f1f7f94a3e616a29a8724ceac0a"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 10 13:09:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 13:09:01 2026 +0800"
      },
      "message": "perf(trace): halve sampler tag-rule cost via an escape-free var-array decode path (#1271)"
    },
    {
      "commit": "7f685a1d89de5f1f7f94a3e616a29a8724ceac0a",
      "tree": "7714b45383a031d3c4258f1235b9747115ed0b65",
      "parents": [
        "aca1bf9945a2e73029fffc768e25016a77374afa"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 10 11:05:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 11:05:29 2026 +0800"
      },
      "message": "Optimize trace merge decision path (#1272)"
    },
    {
      "commit": "aca1bf9945a2e73029fffc768e25016a77374afa",
      "tree": "524f3abb6b6b5a9482a2b7c928b2602b831765c6",
      "parents": [
        "75d45de5f66e5edd5a9e92e8ebdf821ce395ca5d"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 10 08:53:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 08:53:42 2026 +0800"
      },
      "message": "Fix flaky TestPropertyInspect by awaiting liaison info (#1260)"
    },
    {
      "commit": "75d45de5f66e5edd5a9e92e8ebdf821ce395ca5d",
      "tree": "b2d1d587c397f67a15b03f858b4264d6a4cf41df",
      "parents": [
        "7d167e154aac10088b07c23d9fc7720441b82f6c"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 10 07:36:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 07:36:28 2026 +0800"
      },
      "message": "test(trace): verify dropping merge pipeline (#1269)\n\n* test(trace): load SkyWalking sampler configuration\n\n* test(trace): verify dropping merge pipeline"
    },
    {
      "commit": "7d167e154aac10088b07c23d9fc7720441b82f6c",
      "tree": "225e8120f4d34d15504b65b767cc85959fedd15e",
      "parents": [
        "02bb6718b87061e6b5d58c272d635a88a1c68856"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sun Aug 09 19:32:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 09 19:32:23 2026 +0800"
      },
      "message": "test(trace): validate full-day finalize sampling (#1265)"
    },
    {
      "commit": "02bb6718b87061e6b5d58c272d635a88a1c68856",
      "tree": "90f6591a2b49744921df2c026595bf5561099ba5",
      "parents": [
        "3635d42eeb16e0f58b80506950ab14b71ff78a6d"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sun Aug 09 15:04:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 09 15:04:46 2026 +0800"
      },
      "message": "Make the trace merge loop survive persistently failing merges (#1266)"
    },
    {
      "commit": "3635d42eeb16e0f58b80506950ab14b71ff78a6d",
      "tree": "81b4d74cde2b25e38d8fd27f631f87d8e98d9a6f",
      "parents": [
        "5f544a096910293a4aea908bd9d2c5d892e8ea31"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Sun Aug 09 12:14:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 09 12:14:22 2026 +0800"
      },
      "message": "add cluster schema consistency check in FODC lifecycle endpoint (#1244)\n\n* add cluster schema consistency check in FODC lifecycle endpoint\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "5f544a096910293a4aea908bd9d2c5d892e8ea31",
      "tree": "02349d94d583afcb4b126b018c63b494068847fc",
      "parents": [
        "f6337b7f4d1fb7d6474248cc943c95a8ca0fb3e9"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sun Aug 09 10:53:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 09 10:53:21 2026 +0800"
      },
      "message": "ci: skip tests on main pushes (#1267)"
    },
    {
      "commit": "f6337b7f4d1fb7d6474248cc943c95a8ca0fb3e9",
      "tree": "c73a5fd09a2f36744573e7e2918b1761bf11eb97",
      "parents": [
        "5f97741c57ec365a565c87e96777c294b288950a"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sun Aug 09 08:42:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 09 08:42:54 2026 +0800"
      },
      "message": "chore(deps): bump mcp, ui and go dependencies to fix CVEs (#1264)\n\n* feat(trace): adapt merge sampling batch limits\n\n* docs(trace): record adaptive merge acceptance\n\n* fix(trace): address merge benchmark review\n\n* chore(deps): address CVEs in ui, mcp, and go dependencies\n\nUpgrade js-yaml to fix CVE-2026-59869 and CVE-2026-59870,\nfast-uri and hono to fix multiple CVEs, and grpc to v1.83.0\nfor xDS RBAC/HTTP2 fixes.\n\n* chore(deps): bump mcp, ui and go dependencies to fix CVEs\n\n- Update grpc to v1.83.0\n- Update typescript-eslint to v8.66.0\n\n* fix(ui): remove extra indentation in yaml.js imports\n\n---------\n\nCo-authored-by: Hongtao Gao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "5f97741c57ec365a565c87e96777c294b288950a",
      "tree": "b40741034820a771c49bf32a8fad0abd33d4e96a",
      "parents": [
        "0424159f08b2e6b3ecfafe772b1028aeb70c059a"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sat Aug 08 23:02:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 23:02:28 2026 +0800"
      },
      "message": "ci: reduce pull request feedback time (#1263)\n\n* ci: reduce pull request feedback time\n\n* ci: rerun flaky storage e2e\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "0424159f08b2e6b3ecfafe772b1028aeb70c059a",
      "tree": "37069118aafe5cb6655ad2582ef1956a33a1614c",
      "parents": [
        "f8dda214b33132ab3766c9d28834c69417146f56"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sat Aug 08 21:33:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 21:33:58 2026 +0800"
      },
      "message": "perf(tracesampler): alias decoded entry strings via convert.BytesToString (#1258)\n\n* perf(tracesampler): alias decoded entry strings via convert.BytesToString\n\nPer-row string(buf[idx:end]) in arrayEntries allocated one string\nheader per decoded entry. Append the bytes into a pooled stableBuf\n(never reset, only appended to) and alias with convert.BytesToString.\nSaves 408 allocs/op on SkyWalking tag paths and 1,536 allocs/op on\nZipkin tag paths (the realistic 3-row × 8-entry trace). Cumulative-\nconfig ns/trace drops 23-32%.\n\nAlso fixes a pre-existing nil-deref in keepTrace when the array column\nis absent: arrayEntries now always returns a non-nil pool element.\n\n* perf(tracesampler): trigger plugin rebuild\n\nEmpty commit to invalidate the build cache for the plugin .so.\nThe previous build produced a sw-trace-sampler.so with a stale pkg/pool\nABI relative to the host binary.\n\n* fix(docker): build plugin .so with -tags slim to match host ABI\n\nThe plugin-host binary is built with `-tags slim` (banyand/Dockerfile:131)\nbut the plugin .so was built without it. `pkg/pool` has build-tag-dependent\ncode (tracker.go vs tracker_stub.go), so the two builds produced ABI-\nincompatible `pkg/pool` symbols. The plugin-sidecar E2E failed with\n\"plugin.Open: plugin was built with a different version of package\ngithub.com/apache/skywalking-banyandb/pkg/pool\".\n\nAdd `-tags slim` to the plugin build so the .so uses the same `pkg/pool`\nbuild as the host. The Dockerfile comment \"IDENTICAL toolchain/flags as\nbuild-plugins-server above\" was not honored."
    },
    {
      "commit": "f8dda214b33132ab3766c9d28834c69417146f56",
      "tree": "a50305d12d104179add35f00f095097f5cab24a3",
      "parents": [
        "31b044ba838eb3ba4e27b5c2c352746cdc808e36"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sat Aug 08 19:03:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 19:03:02 2026 +0800"
      },
      "message": "Improve trace merge sampler staging memory (#1259)\n\n* feat(trace): adapt merge sampling batch limits\n\n* docs(trace): record adaptive merge acceptance\n\n* fix(trace): address merge benchmark review"
    },
    {
      "commit": "31b044ba838eb3ba4e27b5c2c352746cdc808e36",
      "tree": "710e72904bdc6d775ac95b87a0057337ceed5cfc",
      "parents": [
        "543ae2e16ea92e17dd27d1c500aa90bf60d37061"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sat Aug 08 12:17:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 12:17:50 2026 +0800"
      },
      "message": "Sweep the distributed integration suites in Flaky Test, and run it in parallel lanes (#1257)"
    },
    {
      "commit": "543ae2e16ea92e17dd27d1c500aa90bf60d37061",
      "tree": "a1b4f05d8a19898b5e8ba6b34b4eed366825b35b",
      "parents": [
        "ae42840ec6c73623f85a906b7966ddd8e5609613"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Sat Aug 08 09:35:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 09:35:47 2026 +0800"
      },
      "message": "Add latest parameter in slow QL log (#1248)"
    },
    {
      "commit": "ae42840ec6c73623f85a906b7966ddd8e5609613",
      "tree": "ae62e248f33e39859afaa0d19af7f5283977bf55",
      "parents": [
        "8eda9bb7cff6e5ba6f1d4411012947fdcbea40d6"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Aug 07 15:38:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 15:38:52 2026 +0800"
      },
      "message": "Fix flaky pool discard test without relying on reuse (#1256)"
    },
    {
      "commit": "8eda9bb7cff6e5ba6f1d4411012947fdcbea40d6",
      "tree": "f6821d67b03834c2889b80d088a526bd1121f29f",
      "parents": [
        "1ebeee40ec413fbeb38f701c0dfb10392e382536"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Aug 07 11:02:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 11:02:23 2026 +0800"
      },
      "message": "chore(tracesampler): defer sw-trace-sampler tag-array decode (#1255)"
    },
    {
      "commit": "1ebeee40ec413fbeb38f701c0dfb10392e382536",
      "tree": "01bf0addb7909253a11b87f5900a06825c0cf83f",
      "parents": [
        "f369d86704cc26e40d8a3e7dfc7fde487f1f478b"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Aug 06 16:13:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 16:13:56 2026 +0800"
      },
      "message": "Fix flaky Canopy auth session test by mocking version probe (#1254)"
    },
    {
      "commit": "f369d86704cc26e40d8a3e7dfc7fde487f1f478b",
      "tree": "d54a236d275351f55d9b72a755d2412cb894bfad",
      "parents": [
        "872d02981b0013ceaafdfc46533fa207afe48413"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Aug 06 13:43:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 13:43:35 2026 +0800"
      },
      "message": "Optimize trace pipeline merge performance (#1253)"
    },
    {
      "commit": "872d02981b0013ceaafdfc46533fa207afe48413",
      "tree": "3db0e368f7c084be0d60037582a5f3d6082c20e5",
      "parents": [
        "545a6310ce65ccdb7420c9f3bb1a8f0d46ba09e8"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Aug 06 12:29:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 12:29:21 2026 +0800"
      },
      "message": "Fix flaky TestTraceWriteRoundTrip by publishing trace metadata last (#1249)"
    },
    {
      "commit": "545a6310ce65ccdb7420c9f3bb1a8f0d46ba09e8",
      "tree": "19dc9b06f0c39224f336d52fba9f7d37f04723bb",
      "parents": [
        "21d113a59f480171d4c55f41dbabbbfc826ea2c3"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Aug 05 10:15:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 05 10:15:20 2026 +0800"
      },
      "message": "fix(deps): close canopy CVEs and refresh dependencies (fast-uri 3.1.5, brace-expansion 5.0.9, in-range upgrades) (#1246)\n\n* chore(deps): bump fast-uri in /canopy"
    },
    {
      "commit": "21d113a59f480171d4c55f41dbabbbfc826ea2c3",
      "tree": "79c7c224d39ea42bdd5bf1bd281e70e65ae70da6",
      "parents": [
        "36921708b3bd3e0cd0ca37db9761fadf685c99a1"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Aug 04 11:27:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 04 11:27:55 2026 +0800"
      },
      "message": "Vectorized stream query path with native columnar wire frame; enable stream and trace by default (#1241)"
    },
    {
      "commit": "36921708b3bd3e0cd0ca37db9761fadf685c99a1",
      "tree": "8f58a31d5425bb1b0c74b94c0b974d1b906f9c5c",
      "parents": [
        "5898e902c13afab8663ccef6d6be7a46253a6097"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 03 20:12:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 20:12:52 2026 +0800"
      },
      "message": "canopy: build all image stages on BUILDPLATFORM (#1242)"
    },
    {
      "commit": "5898e902c13afab8663ccef6d6be7a46253a6097",
      "tree": "e1d40644e2441c08717cf874c244b5294d43fa21",
      "parents": [
        "6c51a544168c8c9d57964cdac4eac8b6d2c333a4"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 03 10:03:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 10:03:30 2026 +0800"
      },
      "message": "Fix sampling for traces split across blocks (#1240)"
    },
    {
      "commit": "6c51a544168c8c9d57964cdac4eac8b6d2c333a4",
      "tree": "a2a8e7254f79e1cfba273dfa81a9fe56dd84d650",
      "parents": [
        "0422b1bb83cba139ec45b49291be79355494a0f9"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Aug 03 08:38:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 08:38:38 2026 +0800"
      },
      "message": "canopy: use the in-repo setup-build-env composite for the image job (#1239)\n\nThe main-branch push failed: multi-arch buildx needs the containerd\ndriver, which docker/setup-buildx-action configures — but the org policy\nonly allows it SHA-pinned (a tagged reference startup-failed the workflow\nduring PR review and the step was dropped). The in-repo composite\n(.github/actions/setup-build-env, setup-docker\u003dtrue) wires the SHA-pinned\nsetup-qemu/setup-buildx actions, the same path publish-docker.yml uses."
    },
    {
      "commit": "0422b1bb83cba139ec45b49291be79355494a0f9",
      "tree": "2fc17d89fe824489ab7835833d9970b19f50d566",
      "parents": [
        "cb9814abfc355b3ce51ebed650d18cd5b3407832"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sun Aug 02 12:38:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 02 12:38:11 2026 +0800"
      },
      "message": "Fix trace fragment sampling across partial merges (#1237)"
    },
    {
      "commit": "cb9814abfc355b3ce51ebed650d18cd5b3407832",
      "tree": "cd6fad2c6dc7cfd1263a88b0e78b479b89bfc9ea",
      "parents": [
        "0c91de57a363e61c32450846ccc9ccaad7dcf6d1"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sun Aug 02 11:36:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 02 11:36:53 2026 +0800"
      },
      "message": "canopy: docker image, makefile toolchain, CI integration tests (standalone + distributed) (#1238)"
    },
    {
      "commit": "0c91de57a363e61c32450846ccc9ccaad7dcf6d1",
      "tree": "4d1cd7d38e279eb4fa8faf6f2f3986224e5e9727",
      "parents": [
        "d552528a6f1571c26cd449b711db8f7351ada73e"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sat Aug 01 09:30:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 01 09:30:49 2026 +0800"
      },
      "message": "canopy: query console + result-view fixes for distributed clusters, verification checklist (#1236)"
    },
    {
      "commit": "d552528a6f1571c26cd449b711db8f7351ada73e",
      "tree": "cdf90a98ef8a1309e376cb1782a821e8ed330fac",
      "parents": [
        "5dd8fd9c6bde97c0b2d8713e1205fd43293a3cd3"
      ],
      "author": {
        "name": "Wan Kai",
        "email": "wankai123@foxmail.com",
        "time": "Fri Jul 31 07:28:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 07:28:31 2026 +0800"
      },
      "message": "feat(trace-pipeline): add first-party sw/zipkin trace-retention sampler plugins (#1234)"
    },
    {
      "commit": "5dd8fd9c6bde97c0b2d8713e1205fd43293a3cd3",
      "tree": "e1d453c72e328c6ac796f67746b88ed5d9221d1d",
      "parents": [
        "ea04f6728693547bb4c97bf8962ad6c6db3c52e8"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Jul 30 14:47:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 14:47:23 2026 +0800"
      },
      "message": "canopy: Pipelines — TopN aggregation CRUD + Top-N query console (#1235)"
    },
    {
      "commit": "ea04f6728693547bb4c97bf8962ad6c6db3c52e8",
      "tree": "7a37b6e241b22028b9f7015843c7a2e07973c500",
      "parents": [
        "f20062c4e24614d366a55b520af2891f55d220d2"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Jul 28 09:31:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 09:31:57 2026 +0800"
      },
      "message": "canopy: Property — collection CRUD + document query console (#1233)\n\n* canopy: Property (MP) — CRUD + document query; fix TagType/FieldType enums\n\nProperty milestone, ported from the handoff prototype (property-query.jsx,\ndoc-list.jsx, property-form.jsx) rather than rebuilt:\n- PropertyQuery.tsx — builder⇄code console scoped to one collection (FROM\n  locked to PROPERTY name IN group, no TIME), reusing the shared QBSection/\n  QBChips (lifted into qb-parts.tsx) + CodeEditor. Code mode stays executable\n  via pqParseCode.\n- DocList.tsx — document cards with adaptive JSON/text/scalar value cells,\n  type pills, pagination, role-gated Edit/Delete.\n- PropertyForms.tsx — create/delete collection + Apply/Edit/Delete document\n  with the key-value tag editor (type dropdown + CodeArea for JSON/long str).\n- PropertyDetailPage + /properties routes + a minimal PropertyNav sidebar tree.\n- Data layer: property schema Create/Delete (database/v1 registry) + document\n  Apply (PUT) / Delete / Query (POST /v1/property/data/query); builder-state →\n  structured Query request (id leaves→ids, others→criteria, SELECT→\n  tagProjection, ORDER BY→orderBy, LIMIT→limit). SeedFactory.seedPropertyDoc.\n- Live-verified corrections: property is NOT schema-free server-side, so Apply\n  auto-grows the collection\u0027s declared TagSpecs; Apply uses STRATEGY_REPLACE so\n  the full-document form can drop tags (MERGE silently kept them).\n\nFix TagType/FieldType enum mismatch (pre-existing, affected Measure/Stream/\nTrace too): the shared enums used stale 64-suffixed names the live grpc-gateway\nsilently drops to UNSPECIFIED. Corrected to the proto:\n- TagType: STRING/INT/STRING_ARRAY/INT_ARRAY/DATA_BINARY/TIMESTAMP (no float)\n- FieldType: STRING/INT/FLOAT/DATA_BINARY\nUpdated the form dropdowns, ResourceDetailPage labels, role-infer + tests.\n\nTests: property-bydbql (round-tripped vs the .ql corpus), DocList, PropertyForms;\ne2e properties.spec.ts (@property) + PropertyPage POM. typecheck + lint clean,\n413/413 web unit tests pass; live Apply/Query/Delete round-trip verified.\n\n* canopy: fix property e2e harness so the suite runs green live\n\nRunning e2e/tests/properties.spec.ts against a live BanyanDB surfaced three\nharness-only bugs (product code was fine):\n- SeedFactory.createPropertySchema sent no tags; the registry requires \u003e\u003d1\n  (Property.Tags min_items). Synthesize a _placeholder TagSpec, matching the\n  product\u0027s createPropertySchema.\n- SeedFactory.seedPropertyDoc raw-Applied undeclared tag keys (\"tag X not\n  found\"). Declare the keys on the collection schema first, mirroring the\n  product\u0027s applyPropertyDocument auto-grow.\n- PropertyPage.codeEditor() used getByLabel, which matched both the card and\n  its textarea (strict-mode violation). Target the textarea by role."
    },
    {
      "commit": "f20062c4e24614d366a55b520af2891f55d220d2",
      "tree": "b9ce0fe12aac4277c7d4c5d3562300f5968a9960",
      "parents": [
        "b81af690ebed114cc51d8a1fa8096e7bddade9c8"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Jul 28 08:28:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 08:28:00 2026 +0800"
      },
      "message": "fix(deps): close all 22 dependabot alerts, add canopy vendor-update target, upgrade React 18 → 19 (#1232)\n\n* fix(deps): resolve 22 dependabot security alerts and add canopy vendor-update\n\nGo:\n- bump google.golang.org/grpc v1.82.0 -\u003e v1.82.1 (fixes #172 xDS RBAC + HTTP/2 CVEs)\n- go get -u across banyand, bydbctl, mcp, fodc/agent, fodc/proxy, pkg, test\n- also bumps aws-sdk-go-v2, cloud.google.com/go, prometheus/client_golang,\n  golang.org/x/{exp,mod,sync,net,sys,text,tools}, genproto, api, etc.\n\nnpm (canopy / mcp / ui):\n- ui: 0 vulns (cleared via npm audit fix --force:\n  unplugin-vue-components 0.26.0 -\u003e 32.1.0,\n  unplugin-auto-import 0.17.5 -\u003e 21.0.0)\n- mcp: 0 vulns (cleared via npm audit fix --force + manual bumps:\n  eslint 9 -\u003e 10.8.0,\n  @modelcontextprotocol/sdk -\u003e 1.29.0,\n  @hono/node-server override -\u003e 2.0.5)\n- canopy: 2 high remaining (see note below)\n  cleared via npm audit fix --force + overrides:\n  brace-expansion -\u003e 5.0.8, minimatch -\u003e 10.0.3,\n  @fastify/static -\u003e 10.1.2, eslint-plugin-react -\u003e 7.22.0,\n  @vitejs/plugin-react -\u003e 6.0.4, react-router-dom -\u003e 7.18.1\n\ncanopy/Makefile:\n- add \u0027vendor-update\u0027 target (mirrors ui/Makefile pattern)\n- fix license-check/license-fix path bug: \u0027$$(repo_root).licenserc.yaml\u0027\n  was missing a slash, so license-eye fell back to default config\n  and reported node_modules as \u0027unsupported file\u0027\n- byproducts of the now-working license-fix: Apache headers added to\n  canopy/.env.example and canopy/.prettierignore\n\nmcp/Makefile:\n- remove \u0027vendor-update\u0027 from the \u0027check\u0027 target; \u0027make check\u0027 should\n  validate, not mutate the lockfile\n\ncanopy/web/package.json:\n- bump @vitejs/plugin-react ^4.5.2 -\u003e ^6.0.0 (v8 vite compat; 4.x\n  peer range was 4-7 only, which caused ERESOLVE on vendor-update)\n- bump react-router-dom ^6.30.0 -\u003e ^7.18.1 (closes the open-redirect\n  alerts #181/#179)\n\ncanopy/server/package.json:\n- bump eslint ^9.30.1 -\u003e ^9.39.4\n- bump eslint-plugin-react 7.22.0 -\u003e ^7.37.5 (7.22.0 only supports\n  eslint 3-7; latest 7.37.5 is the highest that supports 9.x)\n\ncanopy/package.json:\n- add \u0027overrides\u0027 for brace-expansion and minimatch so the fixed\n  versions apply to nested copies under @eslint/config-array and\n  @eslint/eslintrc\n\nRemaining canopy vulnerability (2 high, both same root cause):\n- react-router 7.12.0-8.2.0 has GHSA-qwww-vcr4-c8h2 (RSC CSRF bypass).\n  The patched version is 8.3.0, which requires react \u003e\u003d19.2.7, but\n  canopy is on react 18.3.1. Fixing this requires a React 19\n  upgrade, which is out of scope for a dep-bump. Reverting to\n  7.11.0 trades 1 high for 14+ high (XSS/RCE/DoS), so ^7.18.1\n  is the right floor.\n\ncloses #170, #171, #172, #173, #174, #175, #176, #177, #178, #179,\n       #180, #181, #182, #183, #184, #185, #186, #187, #188, #189,\n       #191, #192\n(#193 brace-expansion was auto-dismissed by GitHub)\n\n* chore(canopy): upgrade React 18 → 19, close last 2 dependabot alerts\n\nBumps canopy/web to React 19 so we can pull in react-router 8.3.0, which\nis the patched version for GHSA-qwww-vcr4-c8h2 (RSC CSRF bypass). The\npatched react-router requires react \u003e\u003d19.2.7; canopy was on 18.3.1.\n\nSource changes (mechanical):\n- react-router-dom was merged into react-router in v8, so all 11\n  importers under canopy/web/src/ were rewired from\n  `from \u0027react-router-dom\u0027` to `from \u0027react-router\u0027`. The 10 public\n  call sites (BrowserRouter, Routes, Route, useParams, useNavigate,\n  useLocation, MemoryRouter) are stable across the major bump; no\n  component code needed to change.\n\nDependency changes in canopy/web/package.json:\n- react 18.3.1 -\u003e 19.2.7\n- react-dom 18.3.1 -\u003e 19.2.7\n- @types/react 18.3.23 -\u003e 19.2.7\n- @types/react-dom 18.3.7 -\u003e 19.2.3 (latest available)\n- react-router-dom 7.18.1 -\u003e removed; react-router 8.3.0 added\n- eslint-plugin-react 7.22.0 -\u003e 7.37.5 (consistency with server/;\n  also dropped the dependency that was pinned to a version\n  incompatible with eslint 9 in canopy/server)\n\nDependency changes in canopy/package.json (overrides):\n- added `react: ^19.2.7` and `react-dom: ^19.2.7` so the workspace\n  sees a single React instance. Without this, transitive deps\n  (@testing-library/react, @tanstack/react-query, zustand) each\n  pulled their own copy of react@18.3.1, which made vitest fail\n  with \"Objects are not valid as a React child\" (two React\n  reconcilers disagreeing on element identity).\n\nVerification (all green):\n- npm run -w web typecheck   -\u003e 0 errors\n- npm run -w web test        -\u003e 362 passed (22 test files, all React\n                                component tests + pure-function tests)\n- npm run -w web build       -\u003e vite production build OK\n- npm audit                  -\u003e 0 vulnerabilities\n- make check (repo root)     -\u003e clean working tree, format/tidy/license\n                                all consistent\n\nThis closes the last 2 dependabot alerts that the previous commit\n(#3e84ce34) could not: #181 / #179 (react-router 7.12.0-8.2.0 CSRF).\n\ncloses #179, #181\n\n* fix(canopy): widen RefObject types in Combobox for React 19\n\nCI caught a real React 19 type regression that slipped past my local\nverification (my earlier `npm run -w web typecheck` was run from the\nwrong cwd and silently no-op\u0027d).\n\nIn @types/react 19, `useRef\u003cT\u003e(null)` now returns\n`React.RefObject\u003cT | null\u003e` (not `React.RefObject\u003cT\u003e`). The\nReact 18-era convention of passing refs to helper functions typed as\n`RefObject\u003cHTMLElement\u003e` no longer type-checks.\n\nCombobox has three call sites that pass `useRef\u003cHTMLDivElement\u003e(null)`\ninto helpers typed as `RefObject\u003cHTMLElement\u003e`:\n- `DropdownPanel` prop `popRef: RefObject\u003cHTMLDivElement\u003e`  (line 122)\n- `usePopoverPosition` param `anchorRef: RefObject\u003cHTMLElement\u003e` (135)\n- `useDismiss` params `wrapRef`, `popRef: RefObject\u003cHTMLElement\u003e` (157)\n\nFix: widen each to `RefObject\u003c… | null\u003e`. This matches what the\nhelpers actually do (every consumer calls `?.current` / `?.contains`)\nand matches the type `useRef\u003cT\u003e(null)` produces in React 19.\n\nSubjectOverflow also uses `useRef\u003cT\u003e(null)` but only attaches the\nref to its own JSX elements (`\u003cspan ref\u003d{wrapRef}\u003e`), so the host\nelement\u0027s ref type already accepts `RefObject\u003cT | null\u003e` and no\nchange is needed.\n\nVerification (all green locally):\n- npm run -w web typecheck   -\u003e 0 errors\n- npm run -w web test        -\u003e 362 passed (22 files)\n- (the previous commit had these green too, but in a different cwd\n  where `npm run -w web` is a no-op — this run is from the right cwd)\n\nCo-located with #4c4cb6c1 (the React 19 upgrade commit).\n\n* chore: regenerate LICENSE files via make license-dep\n\nCI\u0027s `make check` failed because the regenerator produced a slightly\ndifferent LICENSE/ dist/ output than what I committed (different sort\norder, line widths, or a transitive dep license that shifted). This\nre-runs license-dep in this repo (Node 24, current lockfile) and\ncommits the canonical output.\n\nNo code changes; CI determinism only.\n\nFiles touched:\n- dist/LICENSE                                  (regenerated)\n- dist/licenses/ui-licenses/license-sass.txt   (1 line)\n- mcp/LICENSE                                   (1 line)\n- ui/LICENSE                                    (regenerated)\n\n* fix(canopy): use Fastify reply.header() in static setHeaders callback\n\nCI caught another regression: the `@fastify/static 10.1.2` upgrade\nthat closed the route-guard-bypass advisory also changed the signature\nof the `setHeaders` callback. In v10 it now receives a `FastifyReply`\n(not a raw `ServerResponse`), so the previous `res.setHeader(...)`\ncalls no longer type-check.\n\n`FastifyReply` has `.header(name, value)` (the Fastify native API)\nand `.getHeader(name)`, but no `.setHeader` — hence the\n\"Did you mean \u0027getHeader\u0027?\" diagnostic.\n\nFix is mechanical: replace `res.setHeader(...)` with `res.header(...)`\nin `canopy/server/src/plugins/static.ts`. Same behavior, correct API.\n\nVerification (all green locally):\n- npm run typecheck (shared, web, server)  -\u003e 0 errors\n- npm run -w server test                    -\u003e 33 passed, 2 skipped\n- npm run -w web test                       -\u003e 362 passed\n- npm run -w web build                      -\u003e OK\n\nCo-located with the other post-merge CI-fix commits.\n\n* fix(canopy): force-install native bindings for rolldown + esbuild\n\nCI failed a third time: vite (via rolldown) and vitest (via esbuild)\nboth load native bindings at runtime, and on the Linux x64 runner the\noptionalDependencies for those bindings sometimes don\u0027t materialize\nwhen `npm ci` reinstalls from the lockfile (npm/cli#4828).\n\nThis bit me locally too — the test step ran fine on my box only after\nI manually `npm install --no-save @rolldown/binding-linux-x64-gnu\n@esbuild/linux-x64`. That works locally but is not what CI does, so\nthe fix is to force the bindings into the dep tree so `npm ci` always\ninstalls them.\n\nFix: add both as `overrides` in `canopy/package.json`. The overrides\nflock them to the exact versions rolldown and esbuild actually want\n(@rolldown/binding-linux-x64-gnu 1.1.5, @esbuild/linux-x64 0.28.1) so\nthe binary file is part of the resolved tree, and `npm ci` will not\nbe able to silently drop it.\n\nNo other platform needs touching for CI: GitHub Actions runners are\nUbuntu x64, and `npm ci` from the lockfile is the only install path\nthat runs in CI (no `--include\u003doptional` flag). Local devs on macOS /\nWindows already have the right binding installed by the regular\noptionalDependency flow.\n\nVerification (all green locally on Linux x64):\n- npm ci / npm install -\u003e both bindings present in node_modules\n- npm run typecheck (shared, web, server)  -\u003e 0 errors\n- npm run -w web test                     -\u003e 362 passed\n- npm run -w server test                  -\u003e 33 passed, 2 skipped\n- npm audit                                -\u003e 0 vulnerabilities\n\nCo-located with the other post-merge CI-fix commits.\n\n* fix(canopy): add native bindings as direct devDeps (override didn\u0027t work)\n\nPrevious commit tried to force the rolldown/esbuild Linux x64 native\nbindings into the dep tree via `overrides`. CI still failed with the\nsame \"Cannot find module \u0027@rolldown/binding-linux-x64-gnu\u0027\" error.\n\nReason: `overrides` only pins the version range, but doesn\u0027t change\nthe install decision. The bindings are still optionalDependencies of\nrolldown/esbuild, and `npm install` skips optional deps that don\u0027t\nmatch the current platform string at install time when the override\ndoesn\u0027t change the install behavior.\n\nFix: add `@rolldown/binding-linux-x64-gnu` and `@esbuild/linux-x64`\nas direct devDependencies in `canopy/web/package.json` (where vite\nlives). Direct deps are not optional — npm always installs them. As\na bonus, the package-lock.json shrinks by ~1k lines because the\ntransitive resolution through the optionalDependency graph goes away.\n\nAlso drop the now-useless overrides entries for the same two\npackages (kept the react / brace-expansion / minimatch ones).\n\nVerified by simulating CI in a clean /tmp dir: rm -rf node_modules\n+ package-lock.json + npm install + npm run -w web test + npm run\n-w web typecheck → 362/362 tests pass, 0 type errors, both bindings\npresent at node_modules/@rolldown/binding-linux-x64-gnu/ and\nnode_modules/@esbuild/linux-x64/.\n\nCo-located with the other post-merge CI-fix commits."
    },
    {
      "commit": "b81af690ebed114cc51d8a1fa8096e7bddade9c8",
      "tree": "14d9cf3d565acb2a5a008bd71ec2aeb248d32fa2",
      "parents": [
        "d9e1c18d2e72d5431011bc9407709804c17b7359"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Jul 27 11:26:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 11:26:36 2026 +0800"
      },
      "message": "canopy: M4 — Query console + result views, E2E framework redesign, WHERE coverage (#1224)\n\n* feat(canopy): M4 query console base — server, seed, gate, console shell\n\nBring up the M4 query console: server-side no-cache headers, an\nm4-seed CLI that installs the canonical service_cpm_minute measure\nunder the sw_metric group, a QueryConsole page that wires the\nBanyanDB HTTP API end-to-end (groups → schema → query), the four\nresult views (Measure / Stream / Trace / Top-N) with shared\nproto-decoding, and a no-skip pixel-regression gate (handoff capture\n+ chrome baseline) to lock the visual chrome.\n\n\n---------\n\nCo-authored-by: Hongtao Gao \u003chongtao@example.com\u003e"
    },
    {
      "commit": "d9e1c18d2e72d5431011bc9407709804c17b7359",
      "tree": "20ea32485eab334725d0b5e418fa91a08ac897d9",
      "parents": [
        "8d88629f55a1776967d5033e02f73e8af7755663"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Jul 23 09:00:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 09:00:55 2026 +0800"
      },
      "message": "test(stream): add program-generated query test cases (#1222)"
    },
    {
      "commit": "8d88629f55a1776967d5033e02f73e8af7755663",
      "tree": "4183f6f79fdf3af7275e0dcb5629bf927579c780",
      "parents": [
        "b1fc90553296510ec787c755411abe83ac12527e"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Wed Jul 22 08:59:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 08:59:27 2026 +0800"
      },
      "message": "Allow `*` in the BydbQL identifier (#1223)"
    },
    {
      "commit": "b1fc90553296510ec787c755411abe83ac12527e",
      "tree": "03eeb9f44e93930756c093e5eeb9d88ba141f3e3",
      "parents": [
        "c22f7d42392b8ef80f180cee61fab999cabc880f"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Wed Jul 22 06:43:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 06:43:51 2026 +0800"
      },
      "message": "Add TTL to top-k query and add health check for pub (#1221)\n\n* Add TTL to top-k query and add health check for pub"
    },
    {
      "commit": "c22f7d42392b8ef80f180cee61fab999cabc880f",
      "tree": "639dcbdb27ce8e75fce184e0bf9966a359fd9ba5",
      "parents": [
        "32055eb1a069a8c6ab93b5e7de5bb72e7bf7dec0"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Sun Jul 19 08:21:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 08:21:49 2026 +0800"
      },
      "message": "Fix wrong QL cache missing top-K logs (#1220)\n\n* Fix wrong QL cache miss top-K logs\n\n* increase the cache size of prepared ql"
    },
    {
      "commit": "32055eb1a069a8c6ab93b5e7de5bb72e7bf7dec0",
      "tree": "92608e4a31f24cee855b5e96aed9b956ef148314",
      "parents": [
        "38932b9113686cddb75739adf2ed2e75324a927a"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Jul 16 13:54:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 13:54:06 2026 +0800"
      },
      "message": "chore(security): bump Go toolchain to 1.25.12 and add govulncheck CI job (#1219)\n\n* chore(security): bump Go toolchain to 1.25.12 and wire govulncheck into CI\n\nBump the go.mod go directive from 1.25.8 to 1.25.12 to pick up the fixed\nstdlib toolchain and close all outstanding stdlib CVEs (fix floors up to\n1.25.12). x/net (v0.56.0) and x/crypto (v0.53.0) were already patched.\n\nWire the existing `make vuln-check` (govulncheck) target into the CI\npipeline as a dedicated parallel job so stdlib/toolchain and dependency\nCVE regressions are caught going forward. Dependabot does not track the\nGo stdlib/toolchain, so govulncheck fills that gap with reachability\nanalysis.\n\n* test(schema): de-flake clamp multi-group query on group2 topology race\n\nThe \"clips TimeRange.Begin to max(CreatedAt)\" spec created group2 and only\nwaited via AwaitRevision, which confirms the schema cache but not that\ngroup2\u0027s topology has propagated to the distributed query coordinator. The\nfinal multi-group query could then fire before group2 resolved and fail\nwith \"group not found\" (STATUS_INTERNAL_ERROR).\n\nWrap the query in gm.Eventually, retrying only on error — matching the\nsingle-group baseline retry already in this spec. Retrying on error (not on\nemptiness) keeps the clamp assertion falsifiable: a genuine regression still\nsurfaces as a non-empty successful response."
    },
    {
      "commit": "38932b9113686cddb75739adf2ed2e75324a927a",
      "tree": "b6d77536f9d800735fdaf60afd50f3328455c62f",
      "parents": [
        "2fbb65efa68b60991fe824e764b85d9b3aef67df"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Tue Jul 14 22:18:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 22:18:47 2026 +0800"
      },
      "message": "Resolve lifecycle stage opts on group update (fix short warm/cold segments) + schema delete-path fixes (#1218)"
    },
    {
      "commit": "2fbb65efa68b60991fe824e764b85d9b3aef67df",
      "tree": "f1380d66761dbfc2b8066203dde8d1d0b4cd742b",
      "parents": [
        "add78bb6a61c6baea1a74aec26c0a4caaa3dd593"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Jul 14 10:29:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 10:29:04 2026 +0800"
      },
      "message": "feat(trace): enforce single-trace-per-group when a sampler pipeline is enabled (#1215)\n\n* feat(trace): enforce single-trace-per-group when a sampler pipeline is enabled\n\nA trace-pipeline sampler applies to one trace schema per group, so a group\nwhose pipeline is enabled with a sampler plugin must contain exactly one\ntrace. Enforce this at registration time in both directions:\n\n- CreateTrace/UpdateTrace reject introducing a second, differently-named\n  trace into such a group (the updated trace is excluded by name).\n- CreateGroup/UpdateGroup reject enabling a sampler pipeline on a group\n  that already holds more than one trace.\n\nThe constraint triggers only when the pipeline is enabled and declares at\nleast one sampler plugin; disabled or sampler-less pipelines are unaffected.\nRejections use codes.FailedPrecondition, consistent with the neighboring\ntombstone invariant.\n\nPart of apache/skywalking#13634\n\n* docs(trace): document plugin pipeline registration (the activation step)\n\nThe plugin development guide and plugins.md showed the TracePipelineConfig JSON\nbut never explained how to attach it to a group, which is the step that actually\nactivates the plugin (the data node reconciles the group\u0027s pipeline and calls\nplugin.Open on the mounted .so). Document the supported operator paths — bydbctl\n`group update -f`, REST `PUT /api/v1/group/schema/{group}`, and the gRPC\nGroupRegistryService.Update (all write through the single schema registry and\npreserve the nested pipeline field) — plus the sampler_active_count activation\ncheck.\n\nAlso correct the plugin-sidecar register helper\u0027s comment: it claimed the HTTP\ngateway drops the nested pipeline field and that the GroupRegistryService is not\nwatched. Both are wrong — protojson round-trips the field losslessly and the\npublic GroupRegistryService writes through the same property-based schema store.\nThe helper uses the property-schema client only because the standalone test pod\nexposes just that schema-server address, not a liaison registry endpoint.\n\nPart of apache/skywalking#13634\n\n* fix(trace): run sampler single-trace check after existence is confirmed\n\nAddresses Copilot review on #1215: UpdateTrace and UpdateGroup ran the\nsampler single-trace check before updateResource loaded the existing\nresource, so updating a non-existent trace/group in a sampler-enabled group\nreturned codes.FailedPrecondition instead of a not-found error.\n\nMove both checks into updateResource validator callbacks, which run only\nafter the existing schema has been confirmed. Add tests asserting a missing\ntrace/group now surfaces not-found rather than FailedPrecondition.\n\nPart of apache/skywalking#13634\n\n* fix(lifecycle): resolve co-located node by --grpc-addr to de-flake sender tier\n\nresolveSelfIdentity matched the sender only by pod hostname via\nhostMatches, which strips the port. In the distributed lifecycle test\nboth data nodes register on 127.0.0.1 (differing only by port), so the\nresolver returned whichever node the registry listing ordered first --\nnon-deterministically stamping remote_tier\u003d\"warm\" instead of \"hot\"\nand failing the queue_sub_total_finished sender-label assertion.\n\nAdd a port-aware first pass that matches the lifecycle\u0027s --grpc-addr\nagainst the registry GrpcAddress via grpcAddrEqual (full host:port),\ndeterministically pinning the co-located node even when nodes share a\nhost. Pod-hostname matching remains as the pass-2 fallback for the K8s\nsidecar case. Plumb l.gRPCAddr through parseGroup and add a regression\ntest reproducing the shared-loopback ordering."
    },
    {
      "commit": "add78bb6a61c6baea1a74aec26c0a4caaa3dd593",
      "tree": "c5abb625b7b11d01ce377180e057115f04684320",
      "parents": [
        "6f7d712f4f78445b531a4cdbd76efe4a51f7e0c5"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Jul 13 18:44:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 18:44:10 2026 +0800"
      },
      "message": "Fix goroutine link when sync part between liaison and data nodes (#1217)"
    },
    {
      "commit": "6f7d712f4f78445b531a4cdbd76efe4a51f7e0c5",
      "tree": "b3f3558e62dbbb1ec6413f77d5a299e30f262c36",
      "parents": [
        "9fb8a8fb63336916690adcbcbd4600a67ed26814"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Jul 13 15:52:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 15:52:25 2026 +0800"
      },
      "message": "fix(storage): prevent DiskMonitor.Stop from hanging when forced cleanup is active, leaking the whole server on shutdown (#1216)"
    },
    {
      "commit": "9fb8a8fb63336916690adcbcbd4600a67ed26814",
      "tree": "4f04d27eead10f67a298ae2abec071b422c12239",
      "parents": [
        "67a743f684b14063ce17f11116be1532df987be9"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Jul 13 08:49:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 08:49:33 2026 +0800"
      },
      "message": "Introduce reusable `Prepared` QL binding (#1213)\n\n* Introduce reusable `Prepared` QL binding"
    },
    {
      "commit": "67a743f684b14063ce17f11116be1532df987be9",
      "tree": "a578847ed23c03dec9c99ad3eaf1d18124b03de7",
      "parents": [
        "7bb5998bc472ebcffe3b15765caf6a2792c770c0"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Jul 10 14:41:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 14:41:33 2026 +0800"
      },
      "message": "feat(trace): package sampler plugins into mountable images and add a plugin dev toolkit (#1214)"
    },
    {
      "commit": "7bb5998bc472ebcffe3b15765caf6a2792c770c0",
      "tree": "7282b5bf6f7a4a545ab51342d2a716a84bbb4dd3",
      "parents": [
        "eae4ef2917a9449eddc092a0c49854d24a798af4"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Thu Jul 09 04:24:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 04:24:07 2026 +0800"
      },
      "message": "Introduce parameter binding (`?` placeholders) into BydbQL (#1209)"
    },
    {
      "commit": "eae4ef2917a9449eddc092a0c49854d24a798af4",
      "tree": "c60a94a39ac2eb0e73ba834e86df2107d323d739",
      "parents": [
        "6fb3a1ba8663aad71856d31ad90ab4b1704def98"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Jul 08 23:17:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 23:17:35 2026 +0800"
      },
      "message": "chore(deps): bump vitest to ^3.2.6 and echarts to ^6.1.0 to fix Dependabot alerts (#1212)"
    },
    {
      "commit": "6fb3a1ba8663aad71856d31ad90ab4b1704def98",
      "tree": "b2cf9fdb2941c5291c21e5b14feb11d0607591d3",
      "parents": [
        "59b33b531257c3909bfa17dfd26daca8802f6387"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Jul 08 16:51:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 16:51:10 2026 +0800"
      },
      "message": "feat(trace): finalization sampling (PIPELINE_EVENT_FINALIZE) (#1210)"
    },
    {
      "commit": "59b33b531257c3909bfa17dfd26daca8802f6387",
      "tree": "f9bbb81a3f083a78ef83f634807f20c6353d5ef3",
      "parents": [
        "26daf947db2c1097b11597e36970d1ed9eb7833c"
      ],
      "author": {
        "name": "Huang Youliang",
        "email": "butterbright0504@gmail.com",
        "time": "Wed Jul 08 15:16:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 15:16:06 2026 +0800"
      },
      "message": "Support multiple types for the same tag in a single measure or stream part (#1126)"
    },
    {
      "commit": "26daf947db2c1097b11597e36970d1ed9eb7833c",
      "tree": "6fb3eacd237a880c4856435530762459f1d84f52",
      "parents": [
        "1a2696b8a7c79a0fb9421af48dbfc8c031d07140"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Jul 08 12:13:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 12:13:59 2026 +0800"
      },
      "message": "chore(deps): bump ui/mcp/go deps to clear Dependabot advisories (#1211)"
    },
    {
      "commit": "1a2696b8a7c79a0fb9421af48dbfc8c031d07140",
      "tree": "9dc547eae5bb00dc786b105e51eea162f7904172",
      "parents": [
        "215f4bbe028ed041e00407de58071894be2fb0aa"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Jul 08 09:18:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 09:18:33 2026 +0800"
      },
      "message": "feat(trace): bounded meter + logger telemetry for the sampler plugin SDK (#1206)\n\n* feat(trace): bounded meter+logger telemetry for the sampler plugin SDK\n\nGive trace-pipeline sampler plugins metrics and logging under a bounded,\nhost-enforced scope, delivered opt-in via a frozen SDK façade.\n\n- SDK façade (pkg/pipeline/sdk/telemetry.go): Meter/Counter/Gauge/Histogram,\n  Logger, Host, and the optional HostAware{UseHost(Host)} — stdlib-only\n  signatures, no ABIVersion bump (delivery is a type assertion).\n- Per-group instance for HostAware plugins: the loader cache is keyed by\n  (path,symbol,configHash,group) for HostAware samplers (shared otherwise), and\n  UseHost is called exactly once under pluginCache.mu before the instance is\n  published, so attribution is correct by construction and there is no\n  UseHost/Decide data race (proven under -race with a Go fake).\n- Host adapters (banyand/trace/plugin_telemetry.go): forced\n  banyandb_trace_pipeline_plugin_* prefix, {group,plugin_name} variable labels,\n  per-plugin cardinality cap (100) with overflow, recover-guarded registration\n  (never panics the host); rate-limited logger (module TRACE.PLUGIN.\u003cG\u003e.\u003cP\u003e,\n  INFO cap, 50 lines/s burst 100, 1 KiB msg, 16 fields); Delete-based series\n  reclaim on remove/replace/OnDelete; never-Close (R4). Self-observability:\n  plugin_telemetry_series_rejected_total / plugin_log_dropped_total /\n  plugin_telemetry_panic_total. reconcile idempotent-skips unchanged configs.\n- Make the SDK genuinely zerolog-free: extract ValueType to the dependency-free\n  leaf pkg/pb/v1/valuetype and the var-array codec to pkg/encoding/vararray;\n  pkg/pb/v1 and pkg/encoding alias/forward so all existing callers are\n  unchanged. go list -deps of the SDK now pulls no zerolog/zap/logger/meter.\n- Tests: adapter units, Go-fake integration (-race: cross-group + same-group +\n  distinct-config once-only, teardown reclaim, panic isolation), a real-.so\n  end-to-end test asserting metrics land in a prometheus registry and logs flow\n  through the standard logger, reference _telemetrysampler/_faultysampler .so\n  plugins + build/load smoke, docs and CHANGES."
    },
    {
      "commit": "215f4bbe028ed041e00407de58071894be2fb0aa",
      "tree": "cb781b1de813017274db4fdcb69b8b77e12b9bbb",
      "parents": [
        "0e3254c997068e589ad64b3723a67dc884d62aa7"
      ],
      "author": {
        "name": "Huang Youliang",
        "email": "butterbright0504@gmail.com",
        "time": "Tue Jul 07 16:15:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 16:15:48 2026 +0800"
      },
      "message": "fix: avoid pooling arena-owned migration tag values (#1203)\n\nCo-authored-by: Hongtao Gao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "0e3254c997068e589ad64b3723a67dc884d62aa7",
      "tree": "ed4c0a4338f97b2008179eff65cd307a894b9b4c",
      "parents": [
        "9b83f0bc699c5b144e25a979b3d298a677b760b8"
      ],
      "author": {
        "name": "Jingyi Qu",
        "email": "JophieQu@gmail.com",
        "time": "Tue Jul 07 11:50:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 11:50:51 2026 +0800"
      },
      "message": "Add the codex/claude plugin to bydbQL (#1201)\n\n* feat: add BanyanDB nl2ql plugin"
    },
    {
      "commit": "9b83f0bc699c5b144e25a979b3d298a677b760b8",
      "tree": "ce25949f08154cccb13b32f2f1b02f6c157773b7",
      "parents": [
        "a4fac2f4bd82e5fcf124ce9a7ef61173802b051b"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Jul 06 15:52:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 15:52:21 2026 +0800"
      },
      "message": "fix(stream): fix migration corruption from arena tagValue double-free (#1205)"
    },
    {
      "commit": "a4fac2f4bd82e5fcf124ce9a7ef61173802b051b",
      "tree": "1d9c8efc5761549b9a82152b7cabd23870bc767b",
      "parents": [
        "2c9946197a9df91dd02cffdeb880aa00a12f837d"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Jul 06 11:23:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 11:23:16 2026 +0800"
      },
      "message": "Add Consistently check after Eventually checks (#1204)"
    },
    {
      "commit": "2c9946197a9df91dd02cffdeb880aa00a12f837d",
      "tree": "b50e9d4a54853243524146b6dd17bc298d31befb",
      "parents": [
        "38704419f786f825cf7cfe8b12f306de1c71a906"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Fri Jul 03 09:12:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 09:12:15 2026 +0800"
      },
      "message": "Lifecycle only handle stream/measure/trace snapshots (#1202)"
    },
    {
      "commit": "38704419f786f825cf7cfe8b12f306de1c71a906",
      "tree": "15432aa0cd70f9edf4abd9592ce4eb97555788b3",
      "parents": [
        "4c674abc429e4350f236fc2762d907c02704d521"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Thu Jul 02 20:23:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 20:23:27 2026 +0800"
      },
      "message": "Add FODC memory-pressure pprof capture (#1200)"
    },
    {
      "commit": "4c674abc429e4350f236fc2762d907c02704d521",
      "tree": "cca8d38d5a3bc8b3fafa4a1471b4c55eccb85a31",
      "parents": [
        "152fa41f89aca1a97c73e692587f37d6ee96d68e"
      ],
      "author": {
        "name": "Huang Youliang",
        "email": "butterbright0504@gmail.com",
        "time": "Thu Jul 02 08:59:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 08:59:36 2026 +0800"
      },
      "message": "feat: implement global tag type metadata for measure parts (#1196)"
    },
    {
      "commit": "152fa41f89aca1a97c73e692587f37d6ee96d68e",
      "tree": "867057c544edef8c5110e2d17b0e13ea19d8a103",
      "parents": [
        "ec48e7ff5f90b97f6219e67aaab223fca4204ef2"
      ],
      "author": {
        "name": "Huang Youliang",
        "email": "butterbright0504@gmail.com",
        "time": "Wed Jul 01 20:49:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 20:49:58 2026 +0800"
      },
      "message": "Fix block metadata reset before unmarshal for stream and trace (#1195)\n\n* Fix block metadata reset before unmarshal"
    },
    {
      "commit": "ec48e7ff5f90b97f6219e67aaab223fca4204ef2",
      "tree": "e05b5497662a1ac3189e2a824ba3bc86794c1cc1",
      "parents": [
        "d1574db08faf9eb9ad6c3b91d87c6807e71f58a0"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Jul 01 08:59:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 08:59:42 2026 +0800"
      },
      "message": "feat(trace): dynamic sampler registration via group-scoped pipeline config (#1198)\n\nRegister/update/remove in-merge trace retention samplers at runtime without\nrestarting the data node. The sampler pipeline config is carried on\ncommonv1.Group (new optional field `pipeline`, with TracePipelineConfig +\nSamplerPlugin relocated from pipeline/v1 into the leaf common/v1 to avoid a\ncommon-\u003epipeline import cycle) and delivered via the existing KindGroup schema\nwatch; the data node rebuilds its group-keyed sampler registry on\nOnAddOrUpdate(KindGroup), fail-open and gated to ROLE_DATA + native pipeline.\n\n- registry: atomic replace/remove + named samplers, NEVER-Close\n- pluginCache: config-aware key (path,symbol,configHash), ABI re-check on every miss\n- validate.GroupForNonProperty validates the embedded config; stage-only configs rejected\n- per-config merge_grace; metrics: sampler_{active_count,register,update,remove,load_failed}\n- dynamic-only: static --trace-pipeline-config boot loader removed\n- standalone out-of-process suite live-green (14/15); distributed + soak suites CI-gated\n\nGenerated *.pb.go are gitignored; run `make generate` after checkout."
    },
    {
      "commit": "d1574db08faf9eb9ad6c3b91d87c6807e71f58a0",
      "tree": "0109bd9487eb25b90b5281987593b7aceafe308a",
      "parents": [
        "68ac23e15427c2280209a3587fe34aa851a8089d"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Jun 29 19:18:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 19:18:40 2026 +0800"
      },
      "message": "feat(canopy): M3 metadata management — Group/Stream/Measure/Trace/IndexRule CRUD (#1197)\n\n\n\n* feat(canopy): implement M3 metadata pages, CRUD forms, and routing\n\n- Add TypeOverviewPage, GroupPage, ResourceDetailPage for measures/streams/traces/properties\n- Add GroupForm, MeasureForm, StreamForm with create/delete modes and TanStack Query mutations\n- Wire App.tsx routing to all M3 pages with modal state management\n- Expand shared CRUD DTOs (CreateGroupRequest, UpdateGroupRequest, CreateStream/MeasureRequest)\n- Expand ApiDataSource with full group + resource CRUD (11 methods)\n- Add 12 new SVG icons (Group, Plus, Edit, Trash, Search, Play, ArrowRight, ArrowLeft, Key, Index, Alert, Empty)\n- Extract shared CATALOG_MAP/TYPE_TITLES/TYPE_ICONS to meta-utils.ts (dedup 3 pages)\n- Add E2E tests for TypeOverview, GroupPage, and ResourceDetail navigation\n\n* feat(canopy): add Trace group to Group CRUD tests, remove Property implementation\n\n- Add create/delete trace group UI tests to the Group CRUD serial block\n- Remove PropertyForm component, all property routes (PropertiesRoute,\n  PropertiesGroupRoute, PropertiesResourceRoute), and property modal states\n  from App.tsx\n- Remove createProperty/updateProperty methods from DataSource and api.ts\n- Remove CreatePropertyRequest/UpdatePropertyRequest from api-dto.ts\n- Remove the M3 CRUD Property test block from m3-crud.spec.ts (32 tests pass)\n- Also includes prior-session work: GroupForm edit mode with catalog field fix\n  and data-initialized attribute, MeasureForm/StreamForm edit modes, TraceForm\n  create/delete, and E2E test suite for all metadata CRUD operations\n\n* feat(canopy): add TraceForm edit mode, form validation, and unit tests\n\n- TraceForm: add \u0027edit\u0027 mode with useQuery pre-fill, updateMut, readOnly name\n- App.tsx: wire trace-edit modal kind and onEdit handler\n- StreamForm/MeasureForm: align client-side validation with validate.go rules\n  (#-in-tag-name, compression-unspecified, empty field/family names)\n- E2E: add trace edit test (pre-fill wait, add tag, verify detail page)\n- Unit tests: GroupForm/MeasureForm/StreamForm/TraceForm — validation rules\n  and immutable fields in edit mode (32 tests total)\n\n* feat(canopy): add M3 IndexRule + Binding CRUD forms and validation\n\n- Pure validate*() module: 8 input groups with unit coverage\n- IndexRule + IndexRuleBinding CRUD forms + tests (create/edit/delete)\n- Wire kebab-case BanyanDB REST paths in api.ts\n- useFocusTrap + useDirtyGuard modal hooks; GroupForm integration\n- Live m3-indexrule.spec.ts (CRUD + MF2 server-authority)\n- Opt-in m3-handoff.spec.ts + handoff-server.cjs\n- GroupPage: IndexRule + Binding list sections\n\n\n---------\n\nSigned-off-by: Hongtao Gao \u003chanahmily@gmail.com\u003e\nCo-authored-by: Hongtao Gao \u003cgaohongtao@apache.org\u003e"
    },
    {
      "commit": "68ac23e15427c2280209a3587fe34aa851a8089d",
      "tree": "f8a568865aef56a558905fafd63e497a8d0e88d3",
      "parents": [
        "7ae98e0b6addfe216b32712c57c054eabee5a4c2"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Jun 29 13:15:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 13:15:28 2026 +0800"
      },
      "message": "feat: in-merge trace retention filter with native .so plugin pipeline (#1194)\n\nAdd the storage-node in-merge trace retention filter (PIPELINE_EVENT_MERGE)\nand an end-to-end integration test that loads a real Go plugin (.so) into\nout-of-process standalone and distributed servers."
    },
    {
      "commit": "7ae98e0b6addfe216b32712c57c054eabee5a4c2",
      "tree": "5a5d679fad1863ea1333297726f7f724dfd16e2d",
      "parents": [
        "ac7f7a3b191e0aa2be919dcea311a03f34770a99"
      ],
      "author": {
        "name": "Huang Youliang",
        "email": "butterbright0504@gmail.com",
        "time": "Sat Jun 27 08:57:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 27 08:57:44 2026 +0800"
      },
      "message": "feat: implement global tag type metadata for stream parts (#1184)\n\n* feat: implement global tag type metadata for stream parts\n\n* Fixup\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "ac7f7a3b191e0aa2be919dcea311a03f34770a99",
      "tree": "b826cc1b40fcc4193628c0b7d771568face3a600",
      "parents": [
        "7b961589c27ec406317357ee7492ffd8a0b459ad"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Sat Jun 27 08:16:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 27 08:16:44 2026 +0800"
      },
      "message": "feat(lifecycle): throttle migration under receiver memory pressure; fix bluge dedup OOM (#1193)\n\n* feat(lifecycle): throttle migration under receiver memory pressure; fix bluge dedup OOM"
    },
    {
      "commit": "7b961589c27ec406317357ee7492ffd8a0b459ad",
      "tree": "84c9af8058cd7da8b223b104156ff52a9201ec3b",
      "parents": [
        "6f4ef25b8185c7c0ab4c255d8223ff186cb7dd9a"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Jun 26 09:12:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 09:12:47 2026 +0800"
      },
      "message": "feat(canopy): add Canopy BFF + React SPA subproject (M0–M2) (#1191)\n\n* fix(release): strip macOS metadata from tarballs and document release targets\n\nTwo related fixes for the release process:\n\n1. scripts/release.sh: exclude macOS AppleDouble (._*) and __MACOSX/\n   metadata from all release tarballs (src, banyand, bydbctl, fodc-agent,\n   fodc-proxy). Without this, downstream users running `make generate`\n   (which invokes `buf generate`) hit \u0027invalid control character\u0027 errors\n   when buf walks the ._* proto files bsdtar emits on macOS.\n\n   Defense in depth:\n     - export COPYFILE_DISABLE\u003d1 at script top so bsdtar stops emitting\n       AppleDouble files in the first place;\n     - add --exclude\u003d\"._*\" --exclude\u003d\"__MACOSX\" to every tar\n       invocation (src + 4 binary tarballs);\n     - filter ._* / __MACOSX out of the find in copy_binaries() so they\n       never reach the cp step.\n\n2. docs/installation/binaries.md: add a \u0027Reproduce the Official Release\n   Artifacts\u0027 section showing the per-component release targets\n   (`make -C banyand release`, etc.) that match the binaries shipped on\n   the Apache mirror. The previous docs only described `make build`,\n   which produces dev binaries (debug symbols retained, `\u003cver\u003e-release`\n   version string) that do NOT match the official artifacts.\n\n* feat(canopy): add Canopy BFF + React SPA subproject (M0–M2)\n\nIntroduces canopy/ as a standalone Node.js/React subproject for the\nBanyanDB web console, implemented without touching the existing ui/ Vue\napp or ui/embed.go.\n\nM0 – scaffold: npm workspace (web/server/shared), Vite+React SPA with\ndark-theme CSS from design handoff, Fastify BFF skeleton, Playwright\nE2E harness that builds BanyanDB from source and spawns it as a\nsubprocess.\n\nM1 – BFF: config-user auth (bcrypt, encrypted session cookie), per-\nrequest dynamic proxy to session.endpoint via undici, /monitoring\nproxy with prefix strip, role enforcement (readonly→403 on mutations),\nupstream credential attach-if-configured, SSRF deny-narrow with per-\nrequest DNS re-resolution, boot guards (no-users + production fence),\nsecurity headers, full contract test suite (vitest).\n\nM2 – UI shell: login page with live BanyanDB version via /api/meta,\nauthenticated two-column shell, collapsible sidebar with nav count\nbadges and protocol-stripped endpoint host, home page with breadcrumbs\nand quick-nav grid, pree2e build gate.\n\nRoot changes: .licenserc.yaml ignores canopy tree; Makefile wires\ncanopy into license-check/license-fix targets; CI workflow added at\n.github/workflows/canopy.yml.\n\n* docs(canopy): add M2 UI screenshots for PR reference\n\n* fix(canopy): fix 3 bff test failures and upgrade @fastify/static to 9.1.3\n\n- Add .times(2) to single-shot MockAgent GET intercepts in the three\n  failing tests: fetchBanyanVersion() during loginAs() consumes the\n  first intercept slot; the actual test request now gets the second.\n- Upgrade @fastify/static from ^8.1.0 to ^9.1.3 to resolve CVEs\n  GHSA-x428-ghpx-8j92 (route guard bypass) and GHSA-pr96-94w5-mx2h\n  (path traversal).\n\n* ci: skip Go workflows when only canopy/ changes\n\nAdd paths-ignore for canopy/** to ci.yml and publish-docker.yml so\nthe Go build/test/docker pipelines do not run on canopy-only PRs.\nThe canopy.yml workflow already scopes itself to canopy/** paths.\n\n* ci: skip Go workflows when only canopy/ changes\n\nAdd paths-ignore for canopy/** to ci.yml and publish-docker.yml so\nthe Go build/test/docker pipelines do not run on canopy-only PRs.\nThe canopy.yml workflow already scopes itself to canopy/** paths.\n\n* fix(canopy): address Copilot PR review comments\n\n- proxy.ts: return reply in requireAuth to short-circuit pipeline after 401\n- role.ts: return reply in enforceRole to short-circuit pipeline after 403\n- auth.ts: canonicalize normalizeEndpoint() to u.origin (strips path/fragment/userinfo)\n- auth.ts: reject userinfo in isValidHttpUrl (http://user:pass@host)\n- auth.ts: apply SSRF check before fetchBanyanVersion() in login route\n- server/package.json: remove unused argon2 native addon dependency\n- LoginPage.tsx: remove tabIndex\u003d{-1} from password visibility toggle for keyboard accessibility\n\n---------"
    },
    {
      "commit": "6f4ef25b8185c7c0ab4c255d8223ff186cb7dd9a",
      "tree": "ae17c37851ed4d6f3a759260aa08ba039e4ce1c8",
      "parents": [
        "3c8659ba5aed8538f153540e12751f58c436e02a"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Thu Jun 25 10:55:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 10:55:26 2026 +0800"
      },
      "message": "Make dump UT more stable (#1188)"
    },
    {
      "commit": "3c8659ba5aed8538f153540e12751f58c436e02a",
      "tree": "44964fa922dd737026e91df40e24044fa66e4059",
      "parents": [
        "5604682e06cb20b0032898947ec9ae78eb514796"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Jun 24 20:33:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 20:33:07 2026 +0800"
      },
      "message": "perf(trace): vectorized trace query — limit pushdown, bounded sidx scan, native columnar distributed wire frame (#1190)\n\n* perf(trace): push offset+limit into the vectorized SIDX scan\n\nThe ordered SIDX (tag-filter) vectorized path built Phase-1 with no trace cap, so it carried forward and materialized span data for every matching trace before the outer traceLimit truncated to the limit -- O(matches) work vs the row path\u0027s O(limit). Pass maxRows (\u003d offset+limit) to BuildMergePhase1 so Phase-1 stops after the top-N distinct trace IDs in sorted-merge order (via the existing ErrLimitExhausted), matching the row path. Results are identical (the merge is globally sorted); this aligns the SIDX path with the static traceID path, which already truncated."
    },
    {
      "commit": "5604682e06cb20b0032898947ec9ae78eb514796",
      "tree": "0ac373d32f9c1a3bad25c1f79daac70307ac9544",
      "parents": [
        "c6183d7ff43e322bc82341fb78ad64bd95a29601"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Jun 24 09:53:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 24 09:53:03 2026 +0800"
      },
      "message": "Add storage-node post-trace pipeline: design, pipeline.v1 proto, Go SDK (#1189)"
    },
    {
      "commit": "c6183d7ff43e322bc82341fb78ad64bd95a29601",
      "tree": "504cebf97416aecaf771a3c1f32b5780a418142c",
      "parents": [
        "711093275beece3c84697d969d1fa20fc5b7d518"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Tue Jun 23 12:23:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 12:23:19 2026 +0800"
      },
      "message": "Support migration copy/verify/analysis index mode measure (#1187)\n\n* Support migration copy/verify/analysis index mode measure"
    },
    {
      "commit": "711093275beece3c84697d969d1fa20fc5b7d518",
      "tree": "02a0a6bf5dd01f5ea183f3efe35c3271d0ff74f7",
      "parents": [
        "74187c3994a432f475e806ec5c1dc7bf4a19bbfe"
      ],
      "author": {
        "name": "Huang Youliang",
        "email": "butterbright0504@gmail.com",
        "time": "Mon Jun 22 20:01:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 20:01:29 2026 +0800"
      },
      "message": "fix: add dynamic checksum generation in release script (#1185)\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "74187c3994a432f475e806ec5c1dc7bf4a19bbfe",
      "tree": "12adae25b9c7c07caa33be2414a78ecf0bf788c0",
      "parents": [
        "dfad95c93aa26e6b21f24c10c65ad9d4910843f4"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Jun 22 12:12:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 12:12:10 2026 +0800"
      },
      "message": "Make dump CI more stable (#1186)"
    }
  ],
  "next": "dfad95c93aa26e6b21f24c10c65ad9d4910843f4"
}
