)]}'
{
  "log": [
    {
      "commit": "525b69e35d7f0183a144a67fd53a503e99ed054f",
      "tree": "42d28a3a3105a6b475a8da5f7971b73efa613cd0",
      "parents": [
        "adc78b887ec00c07c2da402d36436a02f2da8e90"
      ],
      "author": {
        "name": "bob",
        "email": "146524024+NUAAwqy@users.noreply.github.com",
        "time": "Wed Nov 04 13:09:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:09:51 2026 +0800"
      },
      "message": "fix(meter): keep native scope tag values under their own tag names (#1440)"
    },
    {
      "commit": "adc78b887ec00c07c2da402d36436a02f2da8e90",
      "tree": "1f8f16f0b70b52a3d2456fe54926bcc9ba631308",
      "parents": [
        "f58847d2fee1663e53f7402adac24c007068c2a4"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Tue Nov 03 18:34:27 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 08:34:27 2026 +0800"
      },
      "message": "Support file chunkd protocol to property data (#1451)\n\n* Support file chunkd protocol to property data"
    },
    {
      "commit": "f58847d2fee1663e53f7402adac24c007068c2a4",
      "tree": "899d894f0acf618b80c33a4671357716b89887e2",
      "parents": [
        "cb1ec3f952223efa2307eca93f98c9e0b456172e"
      ],
      "author": {
        "name": "Stochastic",
        "email": "138764723+Asthenia0412@users.noreply.github.com",
        "time": "Tue Nov 03 19:49:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 19:49:57 2026 +0800"
      },
      "message": "Handle missing node-local stream schemas (#1381)"
    },
    {
      "commit": "cb1ec3f952223efa2307eca93f98c9e0b456172e",
      "tree": "ec655b18ecac03ee197f1952fe78e55fac193315",
      "parents": [
        "f9052ba11a875d0381361a854bc706447b105364"
      ],
      "author": {
        "name": "Mallika",
        "email": "whoismallika@gmail.com",
        "time": "Tue Nov 03 09:01:29 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 11:31:29 2026 +0800"
      },
      "message": "protector: report query limit errors as resource exhausted (#1453)\n\nQueryFailure only knew the lease error, so a query that hit the memory\nbudget or an index limit came back as an internal error even though the\nliaison treats both as resource exhausted. Map them the same way.\n\nSigned-off-by: Mallika \u003cwhoismallika@gmail.com\u003e\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "f9052ba11a875d0381361a854bc706447b105364",
      "tree": "d1195a60ad745d125884de5aca4425a9ddc812bc",
      "parents": [
        "300fd04675280d3c946a503d4d72029d9ee7b794"
      ],
      "author": {
        "name": "吴晟 Wu Sheng",
        "email": "wu.sheng@foxmail.com",
        "time": "Tue Nov 03 08:32:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 03 08:32:11 2026 +0800"
      },
      "message": "Bump dependencies to fix security alerts (#1457)\n\nGo (shipped in banyand, bydbctl and the FODC binaries):\n- github.com/go-chi/chi/v5 v5.3.1 -\u003e v5.4.0 (GHSA-j6qf-3m9c-vwj3).\n- github.com/go-jose/go-jose/v4 v4.1.4 -\u003e v4.1.7 (GHSA-4w3g-jfj2-cw2q,\n  GHSA-mgcc-cww5-fp2q, GHSA-vvm8-gf78-28g4).\n- golang.org/x/net v0.60.0 -\u003e v0.62.0 (GO-2026-6860, GO-2026-6866),\n  which moves x/crypto to v0.58.0, x/sys to v0.49.0, x/sync to v0.24.0,\n  x/term to v0.47.0, x/text to v0.43.0 and x/tools to v0.51.0.\n\ncanopy (npm, package-lock.json):\n- fastify 5.12.3 -\u003e 5.12.8, undici 7.29.1 -\u003e 7.30.1, fast-uri 3.1.7 /\n  4.1.4 -\u003e 3.1.9 / 4.2.3 (the overrides pin moves with it), and\n  brace-expansion 5.0.12 / 1.1.21; dev only: vite 8.3.5, vitest and\n  @vitest/mocker 5.0.5, source-map-js 1.2.2. vite 8.3.5 needs rolldown\n  ~1.2.14, so the seven @rolldown/binding-* optional dependencies that\n  canopy/web pins to rolldown\u0027s exact version move from 1.2.8 to 1.2.16;\n  left at 1.2.8, the build fails with a rolldown binding mismatch.\n\nmcp (npm, package-lock.json):\n- @modelcontextprotocol/sdk 1.30.0 -\u003e 1.32.2, zod 4.6.2 -\u003e 4.6.7,\n  hono 4.13.7 -\u003e 4.13.16, @hono/node-server 2.1.1 -\u003e 2.1.6, body-parser\n  2.3.0 -\u003e 2.4.0, qs 6.16.0 -\u003e 6.17.1, ip-address 10.7.3 -\u003e 10.7.5,\n  fast-uri 4.2.1 -\u003e 4.2.3 (override floors raised to match); dev only:\n  vite 6.4.5, vitest and @vitest/mocker 5.0.5, source-map-js 1.2.2.\n\ndist/LICENSE, mcp/LICENSE and canopy/LICENSE regenerated with\n`make license-dep`; only version lines change. CHANGES.md updated.\n\nGitHub Actions: actions/checkout v4 -\u003e v7, actions/cache v4 -\u003e v6,\nactions/upload-artifact v4 -\u003e v7, actions/download-artifact v4 -\u003e v8,\nactions/setup-node v4/v6 -\u003e v7, actions/setup-go v6 -\u003e v7,\nactions/dependency-review-action v2 -\u003e v5, docker/login-action v4.6.0\n-\u003e v4.7.0 (81c6f93) and docker/build-push-action v7.3.0 -\u003e v7.4.0\n(c3c9e26), replacing SHAs that are deprecated on the ASF allowlist.\n\ninfra-e2e: apache/skywalking-infra-e2e c45db27 -\u003e 56ac8be in the E2E\nworkflows and the install-e2e.sh default."
    },
    {
      "commit": "300fd04675280d3c946a503d4d72029d9ee7b794",
      "tree": "ecf87f30f3125e74c9fd30f2e58570e3f9d1eea3",
      "parents": [
        "f8c5f5af2b9051a3d0d32e14d9e35cf9d881802f"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Nov 02 05:25:23 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 21:25:23 2026 +0800"
      },
      "message": "Support BNC file format for native file transfer (#1446)\n\n* Support BNC file format for native file transfer"
    },
    {
      "commit": "f8c5f5af2b9051a3d0d32e14d9e35cf9d881802f",
      "tree": "e9f4fdb547470480aa655dec97424069feaa79a3",
      "parents": [
        "0d662522b8bb5050c1a7f4411f0447c78d2b7e36"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Nov 02 12:54:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 12:54:46 2026 +0800"
      },
      "message": "Bound measure QL membership setup and reuse count-scan buffers (#1454)"
    },
    {
      "commit": "0d662522b8bb5050c1a7f4411f0447c78d2b7e36",
      "tree": "9477d2e38b85f17b494453bb3124d3b1789ad31f",
      "parents": [
        "2c60a8ffd9f84e548438a8bc0955aea1c6e67a25"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Nov 02 11:22:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 11:22:38 2026 +0800"
      },
      "message": "canopy: SSO (OIDC/OAuth2) auth backend, break-glass and auth design doc (#1439)\n\nAdd an `sso` authentication backend to the Canopy server, replacing the \u0027sso not yet supported\u0027 error. It supports OIDC providers (issuer discovery) and OAuth2 providers (explicit endpoints) with authorization code + PKCE, `state` (bound to a short-lived cookie, single use) and `nonce`; the client secret comes from an environment variable or a file and an inline `clientSecret` is rejected. The token endpoint uses the client authentication method the provider advertises. OIDC ID tokens are verified against a time-bounded, refetch-on-failure JWKS (RS256/ES256 only; iss, aud, azp, exp, nbf, nonce, sub). Emails a provider marks unverified are never used. GET /auth/sso/:provider/start and /callback create a session for the resolved principal and revoke the session the browser held before. `auth.sso.roles` maps defaultRoles, roleByEmail (exact, case-insensitive) and roleByDomain to admin/readonly, and a login with no matching role gets 403 and no session. The request resolution order is IdP bearer (an access token the provider\u0027s userinfo endpoint vouches for, cached 30 s), then API token, then cookie session; an empty bearer credential is rejected and never falls back to the cookie. Role mapping and break-glass accounts are re-read from the auth file every few seconds, so live sessions are revoked without a restart. A bounded-timeout SSO health probe (healthy while any provider answers) gates break-glass: with `auth.breakGlass` enabled, POST /auth/login accepts the configured argon2id/bcrypt users only while SSO is unhealthy (otherwise the usual 401 invalid_credentials, with the password verified either way), logging WARN with username and client IP on success and INFO without the password on failure. `/api/meta` reports the providers, SSO health and break-glass availability. The login page shows nothing until that answer arrives (with Retry on failure), a button per provider (disabled while BanyanDB is unreachable), and the break-glass form only when SSO is unhealthy and break-glass is enabled. Adds canopy/docs/auth-design.md, documents every auth key, env var and example in canopy/README.md and .env.example, adds a CHANGES.md entry and links the design doc from docs/interacting/canopy.md.\n\nFixes apache/skywalking#14162"
    },
    {
      "commit": "2c60a8ffd9f84e548438a8bc0955aea1c6e67a25",
      "tree": "6000149f713bc5cfccb31c6814454a999c9ddfe1",
      "parents": [
        "b09b249cb458c0f8ae1920f92092096897203b97"
      ],
      "author": {
        "name": "bob",
        "email": "146524024+NUAAwqy@users.noreply.github.com",
        "time": "Mon Nov 02 01:35:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 02 01:35:10 2026 +0800"
      },
      "message": "fix(flow): keep the dedup caches in sync in ReplaceLowest (#1441)"
    },
    {
      "commit": "b09b249cb458c0f8ae1920f92092096897203b97",
      "tree": "a47b77d70775b7f487fdf6b39b71ebb27897e108",
      "parents": [
        "df26a73667538ace2f5c22c2e8dc42fc2a354cfe"
      ],
      "author": {
        "name": "Sruhvx",
        "email": "sarikarn120@gmail.com",
        "time": "Sun Nov 01 19:15:03 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 21:45:03 2026 +0800"
      },
      "message": "fix(filter,trace,sidx): avoid in-place UnmarshalVarArray mutation of cached filters and decode buffers (#1437)"
    },
    {
      "commit": "df26a73667538ace2f5c22c2e8dc42fc2a354cfe",
      "tree": "b0131668e37ffc2f3bbf8b58236942d407aa7bd5",
      "parents": [
        "6d139c72c55265037781a094139a9b189d8d93a7"
      ],
      "author": {
        "name": "Sruhvx",
        "email": "sarikarn120@gmail.com",
        "time": "Sun Nov 01 14:59:39 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 01 17:29:39 2026 +0800"
      },
      "message": "fix(posting,stream): add safe merge helpers to guard shared empty posting list + regression test (#1436)"
    },
    {
      "commit": "6d139c72c55265037781a094139a9b189d8d93a7",
      "tree": "47314c51ca13ad2797f05955826df18bdca3d6e5",
      "parents": [
        "2d9f456d5cc4c4405a3ec62691893288de654d2e"
      ],
      "author": {
        "name": "Sruhvx",
        "email": "sarikarn120@gmail.com",
        "time": "Fri Oct 30 19:16:14 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 21:46:14 2026 +0800"
      },
      "message": "fix(measure,stream): clean up unintroduced merged and flushed parts on shutdown (#1434)"
    },
    {
      "commit": "2d9f456d5cc4c4405a3ec62691893288de654d2e",
      "tree": "eb9f20110fd557b32d9a191a0194fd218a635bb5",
      "parents": [
        "246dfd213541bd7db8b1d0b3fa0ab5d38488ab3d"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 30 18:55:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 18:55:21 2026 +0800"
      },
      "message": "Stop rejecting queries by an estimated window, charge values by their size and size the default query pool from host memory (#1450)"
    },
    {
      "commit": "246dfd213541bd7db8b1d0b3fa0ab5d38488ab3d",
      "tree": "f673e56dc9a81ca6a875a26a441fdf37675748cd",
      "parents": [
        "72faddb50719ac3a670027ebb9908946975da82d"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 30 09:58:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 09:58:52 2026 +0800"
      },
      "message": "fix(trace): apply limits after residual filters (#1444)"
    },
    {
      "commit": "72faddb50719ac3a670027ebb9908946975da82d",
      "tree": "783a8f883cd6818e480344a66e4b0a23e4316f7e",
      "parents": [
        "3bd5e739c2b82bb5498d66ec8e21e26bae27967a"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 30 08:08:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 08:08:29 2026 +0800"
      },
      "message": "feat(stream): stream query results between liaison and data nodes, acknowledge writes per batch, fix the scan budget (#1433)"
    },
    {
      "commit": "3bd5e739c2b82bb5498d66ec8e21e26bae27967a",
      "tree": "e53fcc6fe9fd00f4c80d50957b28f2aa8b6923fa",
      "parents": [
        "39d33bc5d8b49ea7ee33c253de2b476648637669"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Oct 29 12:42:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 12:42:07 2026 +0800"
      },
      "message": "Add indexed LIKE/ILIKE, aggregate composition and exact decimal sums to measure QL (#1447)"
    },
    {
      "commit": "39d33bc5d8b49ea7ee33c253de2b476648637669",
      "tree": "e2a947a4d57433b7a6463116b81bd9741044fe0e",
      "parents": [
        "b54a9fc76e74baa1c0ecbf75513a082c32649a72"
      ],
      "author": {
        "name": "Trista Pan",
        "email": "hannkenn0@gmail.com",
        "time": "Thu Oct 29 07:57:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 07:57:10 2026 +0800"
      },
      "message": "feat: store BanyanDB\u0027s own logs in BanyanDB on standalone and data nodes (#1419)"
    },
    {
      "commit": "b54a9fc76e74baa1c0ecbf75513a082c32649a72",
      "tree": "c5339910a2c29aca8f01a9d1c8aaae5c1a015b80",
      "parents": [
        "05d6bdf036e5544e0532ece5ac04af8c21e95412"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 28 19:47:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 19:47:53 2026 +0800"
      },
      "message": "[4/4] Add measure QL grouping and result shaping (#1438)"
    },
    {
      "commit": "05d6bdf036e5544e0532ece5ac04af8c21e95412",
      "tree": "0138aef439c0894e67b0fb3ad8d1a2183751e5f5",
      "parents": [
        "ea07383da6f262b8175f65bffe6c5f6123588a53"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 28 15:12:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 15:12:54 2026 +0800"
      },
      "message": "[3/4] Add typed measure QL expressions and filtering (#1432)\n\n* feat(ql): evaluate typed expressions and masked conditionals\n\n* feat(ql): filter raw measure fields before aggregation\n\nEvaluate typed WHERE expressions over native raw batches before projection, local aggregation and pagination. Preserve legacy multi-group routing and share binding and predicate validation.\n\nAdd generated QL-only regression coverage, focused kernel and RPC benchmarks, and language and design documentation.\n\n* feat(ql): filter aggregate groups with HAVING\n\nEvaluate HAVING over completed local aggregates or native keyed merges using the shared predicate engine and query memory budget. Preserve hidden aggregate values until filtering and apply visible projection and pagination afterward.\n\nAdd contextual collection membership with live indexed-array validation, generated QL-only integration coverage, focused HAVING benchmarks, and verification documentation.\n\n* Prepare expression and filter delivery on merged aggregation\n\n* Record isolated expression and filter benchmark evidence"
    },
    {
      "commit": "ea07383da6f262b8175f65bffe6c5f6123588a53",
      "tree": "fb1f9584822d8a507231a73070125c74ac20bd5b",
      "parents": [
        "28b9a64ccc084e712903f9c6960758dfdc4a0943"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 28 09:51:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 09:51:13 2026 +0800"
      },
      "message": "Canopy: local auth with argon2id, server-side sessions and API tokens (#1431)"
    },
    {
      "commit": "28b9a64ccc084e712903f9c6960758dfdc4a0943",
      "tree": "d9ab61b12e585f882bf8b68cddd633edfcb92e2b",
      "parents": [
        "22bd9aeca5c1a12b255b71d33acde912a115f1ec"
      ],
      "author": {
        "name": "Mallika",
        "email": "whoismallika@gmail.com",
        "time": "Tue Oct 27 17:39:37 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 20:09:37 2026 +0800"
      },
      "message": "docs: fix menu links and stale status notes (#1430)\n\nThe Operation menu linked the Property repair concept page instead of its\nobservability page, and two docs had no menu entry. Also drop the stale\nCOUNT_DISTINCT note and mark the tag aggregation design implemented.\n\nSigned-off-by: Mallika \u003cwhoismallika@gmail.com\u003e\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "22bd9aeca5c1a12b255b71d33acde912a115f1ec",
      "tree": "20dcc4a319dc6e22d70ba3630944e58259d38660",
      "parents": [
        "f0387aec09dbfe0b86058e48b8c953e7f4c44f1e"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Oct 27 16:27:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 16:27:42 2026 +0800"
      },
      "message": "perf(stream): merge multi-group stream results as batches instead of Elements (#1426)\n\nMerge the local multi-group stream query\u0027s per-group results as columnar batches. tryVecMergeDispatch stages each group\u0027s batches, rebuilds them onto a single merged BatchSchema (union of tag columns, null-filled for tags a group lacks, with a hidden group column) after charging each aligned copy against the query budget, and runs them through one SortedMerge, Distinct, Limit(offset, limit) pipeline via BuildStreamMergePipeline fed by a new multi-source BatchSource. Elements are built once from the pipeline output, omitting tags the source group did not define, so schema-evolved groups keep their current element shape. The per-group BuildElementsFromBatch call, the sliceStreamElements call in this path, logical_stream.MergeGroupElements and the unused VecMerge.SortTagSpec are removed. Duplicate ElementIDs across groups are now removed by Distinct (first group wins) and equal sort keys keep group scan order, where the old iterator merge kept both copies and interleaved ties. Batches from groups already executed are released when a later group\u0027s scan, staging, alignment or merge fails, with the existing error messages unchanged.\n\nFixes apache/skywalking#14070"
    },
    {
      "commit": "f0387aec09dbfe0b86058e48b8c953e7f4c44f1e",
      "tree": "3bb898127a067bcc0f63afca875945b8d0c1ef6f",
      "parents": [
        "f0ccc41d3932ee17d3836a49dacee13f9f8680e5"
      ],
      "author": {
        "name": "Mallika",
        "email": "whoismallika@gmail.com",
        "time": "Tue Oct 27 02:54:40 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 05:24:40 2026 +0800"
      },
      "message": "bydbctl: test the agent\u0027s execution gate (#1429)"
    },
    {
      "commit": "f0ccc41d3932ee17d3836a49dacee13f9f8680e5",
      "tree": "e973534ae25335eba8df5a444ec466ab1fa1e827",
      "parents": [
        "866591181eaaf68df019a50bc6e7b8b23d7318cd"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Oct 26 08:10:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 08:10:28 2026 +0800"
      },
      "message": "feat(trace): stream trace query results between liaison and data nodes, acknowledge writes per batch (#1423)\n\n* feat(queue): add a server-streaming Scan transport between liaison and data nodes\n\nAdd the internal transport the streaming query path builds on (design\nstreaming-api, step 0). Nothing uses it yet: no trace, stream or measure\nwiring, no Write change and no public API.\n\n- cluster.v1.Service gains `rpc Scan(ScanRequest) returns (stream\n  ScanResponse)`. An empty body with last\u003dfalse is a heartbeat.\n- pkg/bus gains the Sink and StreamListener interfaces.\n- queue.Client.Scatter opens one Scan stream per node chosen by the same\n  node-selector code as Broadcast, under the caller\u0027s context, and returns\n  NodeStreams. One receive goroutine per stream fills a prefetch-deep\n  channel. Heartbeats reset an idle timer and are never delivered; silence\n  for the idle timeout, a transport error, an error chunk or a stream that\n  ends without last\u003dtrue are terminal errors and never io.EOF. A failed\n  open closes the streams opened before it.\n- queue.Server.SubscribeStream registers the listener behind Scan. The sub\n  server checks the version and health, runs the listener under the stream\n  context with a transport scope, marshals chunks like unary replies (raw\n  frames only on the topics that allow them), serialises sends and sends a\n  heartbeat when no chunk went out for --scan-heartbeat-interval.\n- The local queue implements both outside Bus.Publish, which runs listeners\n  synchronously under the bus lock: the listener runs on its own goroutine\n  behind a cancellation-aware bounded channel, values pass unencoded, and\n  Close stops the producer and releases queued values.\n- New flags: --scan-heartbeat-interval (data node, 2s) and\n  --scan-idle-timeout (publisher, 15s).\n\nUnit and in-process gRPC tests cover ordering, EOF, heartbeats, the idle\ntimeout, caller cancellation, transport errors, partial open failure,\nprefetch bounds and release of queued values.\n\n* perf(trace): stream distributed trace query results from data nodes in chunks\n\n* feat(trace): acknowledge trace writes per sealed batch while the stream stays open\n\nBefore, the liaison held every row of a trace Write stream until the client\nhalf-closed: the data node applied the rows and the client received its\nacknowledgements only then, and liaison memory (succeedSent) grew with the\nlength of the stream.\n\nThe liaison now groups a stream\u0027s rows per data node into batches and seals a\nbatch at --write-batch-seal-rows, --write-batch-seal-bytes or\n--write-batch-seal-interval. Each sealed batch goes through its own\nBatchPublisher, snapshots the metadata and tag spec in force when it was\nopened, and is acknowledged to the client as soon as its node has applied it.\nA metadata or spec switch seals the open batch so it lands on the next one.\nResponses leave through a dedicated sender goroutine fed by a queue that never\nblocks Recv, so clients that send everything before reading keep working. At\nmost --write-max-inflight-batches sealed batches per node stay unacknowledged\nbefore Recv waits for a data-node acknowledgement.\n\nA batch the node refuses with DISK_FULL or the new STATUS_SERVER_BUSY before\napplying it is retried with backoff from the session\u0027s own serialized rows\nwhile acknowledgements carry retry_after_ms; past --write-pressure-timeout the\nbatch is answered with STATUS_SERVER_BUSY and the stream ends with\nRESOURCE_EXHAUSTED. A batch with an unknown outcome is reported, never\nreplayed. The trace write listeners\u0027 CheckHealth reports STATUS_SERVER_BUSY\nwhen the node\u0027s memory protector is in StateHigh.\n\nWriteResponse gains status_code and retry_after_ms; model.v1.Status gains\nSTATUS_SERVER_BUSY. The session type is model independent so stream and\nmeasure can reuse it.\n\n* test(querybench): add a long-lived trace write soak\n\n* fix(queue): release the running count when a writable probe is already running\n\ncheckWritable takes a running count before it deduplicates probes, and the\ndeduplicated path returned without releasing it. Repeated busy rejections of\none node hit that path, so pub.GracefulStop waited for a count nobody would\nrelease.\n\n* test(trace): cover write backpressure under liaison and data-node memory pressure\n\n* fix(snapshot): register each transition pool once under concurrent first use\n\ngetTransitionPool created a type\u0027s pool on a map miss and called\npool.Register, which panics on a name it has already seen. Two goroutines\ncreating the first transition of the same snapshot type at once both\nmissed and both registered, so the second panicked. In a cluster the trace\nintroducers flush concurrently, and the panic cancelled the introducer\u0027s\nsupervising context, so trace writes stalled until the client gave up.\n\nCreate the pool under a mutex and check the map again inside it, so only\none goroutine registers a type\u0027s pool. The lookup of an existing pool stays\nlock-free. A test races 64 goroutines on the first use of 16 fresh types;\nit fails every run against the previous code."
    },
    {
      "commit": "866591181eaaf68df019a50bc6e7b8b23d7318cd",
      "tree": "104e701b022877d6e8df85f47c0fdbfefd18b50e",
      "parents": [
        "016ffa76d1fb7b0091a0e1667204bd8741f4a1dc"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Fri Oct 23 06:59:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 21:59:07 2026 +0800"
      },
      "message": "Support CSV format for data export (#1418)"
    },
    {
      "commit": "016ffa76d1fb7b0091a0e1667204bd8741f4a1dc",
      "tree": "9bc497c7d6c172798c610952302a032394abf1f1",
      "parents": [
        "e409a6c688452a1edf6de15ba1a4692c81bf5665"
      ],
      "author": {
        "name": "Mallika",
        "email": "whoismallika@gmail.com",
        "time": "Fri Oct 23 18:30:37 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 21:00:37 2026 +0800"
      },
      "message": "Fix multi-group Measure aggregation across schema-evolved groups (#1416)"
    },
    {
      "commit": "e409a6c688452a1edf6de15ba1a4692c81bf5665",
      "tree": "6caeaae77f5724770012761124e08f630aa721a2",
      "parents": [
        "deb5c9774971fd035dd76dda68e1fdfb8ae68123"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 23 20:28:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 20:28:14 2026 +0800"
      },
      "message": "[2/4] Add SQL measure aggregation and native pushdown (#1424)"
    },
    {
      "commit": "deb5c9774971fd035dd76dda68e1fdfb8ae68123",
      "tree": "efeaafce29e8a62bd3576ce7a5a5a13fa5dc414d",
      "parents": [
        "96c46b7df0989a1397201d29aa28ca8b95bf3856"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 23 17:34:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 17:34:05 2026 +0800"
      },
      "message": "fix(query): compare scalar literals by value, not by pointer (#1422)"
    },
    {
      "commit": "96c46b7df0989a1397201d29aa28ca8b95bf3856",
      "tree": "e78f30b003139ebc4daaf0de2f1aed389e641042",
      "parents": [
        "57322bc8b9f6dca5461eb0fe43401085e253804d"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 23 17:06:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 17:06:55 2026 +0800"
      },
      "message": "Add lifecycle trace sampling with durable crash recovery (#1421)"
    },
    {
      "commit": "57322bc8b9f6dca5461eb0fe43401085e253804d",
      "tree": "6243f673b2384416112c60e8f2bdda7423ae15ab",
      "parents": [
        "5ac9b75de3450f7028362becdf976092e11351cf"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 23 14:17:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 14:17:23 2026 +0800"
      },
      "message": "Replace the multi-group Measure row merger with a batch merger (#1420)"
    },
    {
      "commit": "5ac9b75de3450f7028362becdf976092e11351cf",
      "tree": "9f5d865f6c91b4703a35d2a63293713285dfe06f",
      "parents": [
        "450c73a3a040da9ceac8bbacdf61854517f254b4"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 23 12:48:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 12:48:17 2026 +0800"
      },
      "message": "fix: upgrade E2E harness and stabilize native compaction (#1427)"
    },
    {
      "commit": "450c73a3a040da9ceac8bbacdf61854517f254b4",
      "tree": "151ddaa27c0225eaa4ba668f7caa14ef2dc585d0",
      "parents": [
        "e05ed7f2291b2981311a177877e7a5c918dc63c2"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 21 15:43:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 15:43:52 2026 +0800"
      },
      "message": "chore: upgrade Go toolchain to 1.26.10 (#1425)"
    },
    {
      "commit": "e05ed7f2291b2981311a177877e7a5c918dc63c2",
      "tree": "f5fa4231e065883e032371cf9ec470fb2f59d236",
      "parents": [
        "f9424047d789a7f78957361b057492f2543c1040"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 21 09:22:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 09:22:19 2026 +0800"
      },
      "message": "[1/4] Add typed raw measure QL and compiled-plan reuse (#1417)\n\n* test(ql): add Catalog B plan and verified RPC baseline\n\n* feat(ql): share native measure batch execution\n\nExpose native batch results to measure QL while retaining the shared execution\noperators for protobuf requests. Preserve borrowed-batch ownership and account\nquery, decode, receive and response memory through the existing budgets.\n\nAdd bounded native receiving, transport-lifetime cleanup, completed distributed\ntraces and opt-in verification counters. Cover compatibility and resource limits\nthrough real RPC cases and record the benchmark evidence and acceptance limits.\n\n* feat(ql): execute typed raw measure queries\n\n* feat(ql): cache compiled measure query plans\n\nReuse immutable measure templates with bounded residency, schema generation checks, and independently cancellable shared compilation. Bind parameters and authorize every execution separately.\n\nAdd generated QL-only lifecycle coverage and narrow cache-on/off benchmarks with isolated child processes.\n\n* docs(ql): document raw measure query extensions\n\n* fix(ql): preserve compatibility in the raw query foundation\n\n* docs(ql): align PR 1 scope and cache documentation\n\n* fix(ci): compile benchmark support and retain budget-test size\n\n* docs(ql): record aggregation rebase and benchmark provenance"
    },
    {
      "commit": "f9424047d789a7f78957361b057492f2543c1040",
      "tree": "455f41ca1df33d11886d3977fa0af2b3b1324b52",
      "parents": [
        "02441f9688aecedfceb37ef1a944b4582593282b"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Oct 20 13:38:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 13:38:08 2026 +0800"
      },
      "message": "feat(query): fold each (series, bucket) span of a measure aggregation once (#14092) (#1413)"
    },
    {
      "commit": "02441f9688aecedfceb37ef1a944b4582593282b",
      "tree": "6780059a700645d67af72146841dcc7531d7bf7c",
      "parents": [
        "15635181bbf804750994b9d4b13d473373890de9"
      ],
      "author": {
        "name": "Mallika",
        "email": "whoismallika@gmail.com",
        "time": "Tue Oct 20 08:45:35 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 11:15:35 2026 +0800"
      },
      "message": "bydbql: fix doc examples that don\u0027t parse (#1415)"
    },
    {
      "commit": "15635181bbf804750994b9d4b13d473373890de9",
      "tree": "e4f989d0aca854ad0bd73b694fecd10fdd508e18",
      "parents": [
        "f2f351bfcfb5f934e794d6b591783608f5d61c8c"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Oct 20 08:10:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 08:10:29 2026 +0800"
      },
      "message": "perf(measure): batch v2 and scan path v2 for the vectorized measure query, plus 0.12.0 designs (#1412)\n\n* perf(bydbql): resolve schemas from the liaison\u0027s watch-fed cache\n\nBydbQL\u0027s transformer read measure, stream and trace schemas through the\nschema registry, which broadcasts to every metadata node and may repair\nlagging ones on every request. The liaison already holds these schemas in\nits entity repositories, the same view the native query handlers use for\ngating and time-range clamping. Read them from there and fall back to the\nregistry only on a miss (a just-created resource whose watch event has not\narrived yet).\n\nA loopback benchmark measured the registry read at 0.4-0.6 ms per group,\nagainst 3-6 us for the whole transform once the schema is local.\n\n* perf(measure): borrow decoded block memory in vectorized query batches\n\nFirst part of the measure batch v2 design: stop allocating one heap object\nper decoded value on the vectorized query path.\n\n- Typed numeric decode: null-free int64/float64 columns read for a query\n  decode straight into column-owned []int64/[]float64 and fill batch\n  columns in bulk, instead of one []byte per value converted back. Merge,\n  flush, TopN and columns with nulls keep the byte form.\n- Reference-counted block cursors: string, bytes and string-array tag\n  cells borrow the cursor\u0027s decoded buffers zero-copy. Batches pin their\n  owners (vectorized.Owners on RecordBatch and MeasureBatch); a cursor\n  returns to its pool only when the last borrowing batch is released.\n  Group-by, aggregation, TopN and the response edge copy what they keep.\n  BYDB_POISON_RELEASED_CURSOR\u003d1 overwrites released cursor memory so a\n  use-after-release fails tests visibly.\n- Native projected columns: every projected tag and field with a mapped\n  schema type is a native typed column rather than a protobuf\n  passthrough, and each response value is built in one allocation. The\n  wire format is unchanged (array columns are still sent as TagValue\n  cells).\n- Aggregation and TopN no longer allocate per input row: keys are looked\n  up from a reused buffer and copied only on insert; a displacing TopN\n  row reuses the root\u0027s storage.\n- The G9e gates now decode real stored parts inside the timer\n  (banyand/measure TestVectorizedStorageGates), compare against the\n  previous passthrough column selection, and pin absolute allocation\n  budgets. The old gates built protobufs outside the timer and are\n  removed.\n\nOn real stored blocks, across the eight gate workloads: geomean -6% time\nand -75% allocations, with group-by + aggregation at -97% allocations and\na distributed full-scan frame -49% time and -99.7% allocations.\n\n* perf(measure): stream the vectorized scan one series window at a time\n\nStep 4a of scan path v2. The batch scan groups cursors into series\nwindows and cuts each window into segments from block metadata (a block\nstarting at or before the running segment end joins it). A one-cursor\nsegment is decoded when the scan reaches it and lent to the pipeline\nwithout copying: string cells already borrow, and numeric, timestamp and\nversion columns now borrow the cursor\u0027s typed slices through\nTypedColumn.Borrow, which copies before any write and drops the borrowed\narray on Reset/pool release. BatchSourceFromBatchResult passes such\nbatches through at block size via a reference-counted holder instead of\ncopying them into 1024-row batches; batches under 256 rows are still\ncoalesced. Descending order sets a reversed Selection.\n\nOverlapping segments, and time-ordered queries whose series overlap in\ntime, still use the existing merge; step 4c replaces it. TopN and\nindex-mode results are unchanged. Group-by reserves memory per batchSize\nchunk now that input batches can reach 8,192 rows, and time-bucket\nflooring copies before writing.\n\nScan counters (total_scan_windows, total_scan_windows_overlapped,\ntotal_scan_segments_fast, total_scan_segments_overlap) measure how often\nthe overlap path is taken on a real cluster.\n\n* perf(measure): merge time-ordered vectorized scans keys-first with lazy decode\n\nStep 4c of scan path v2. Time-ordered scans whose series overlap in time\n(the default no-ORDER-BY case) and overlapping segments inside a series\nno longer decode every matching block up front and merge row by row.\n\ntimeMerge orders cursors by their first timestamp (last, for descending)\nand decodes a cursor only when the merge frontier reaches it, so decoded\nmemory is bounded by the blocks overlapping the current instant. Each page\nfirst merges (timestamp, series, version) keys with the legacy Less order\nand newest-version dedup, then gathers every column once: numerics by\nindex copy, strings/bytes/string arrays as borrowed views pinned on the\nbatch, other cells copied as before. Finished cursors are released after\nthe page is gathered. Series windows disjoint from all others keep the\nzero-copy lend path; TopN and index mode are unchanged. Decoding goes\nthrough a single cursorLoader hook for the step 4b decode pool.\n\nThe merge never closes a page inside a duplicate group, fixing the legacy\nbatch merge emitting a straddling duplicate twice at its 4,096-row cut.\n\n* perf(measure): decode scan blocks on a node-wide pool with reserved prefetch\n\nStep 4b of scan path v2.\n\n- decodePool: one per data node or standalone server, GOMAXPROCS\n  workers, created in PreRun and closed in GracefulStop before the\n  schema repository. A decode the scan is waiting on goes to an urgent\n  lane, and a prefetched decode that becomes the head is promoted there.\n- prefetcher: windowScan and timeMerge request decodes in exactly the\n  order they consume them and collect them head-first, so completion\n  order never changes output. Depth starts at 2 and grows to 8 while\n  reservations succeed (inside a merge, max(8, frontier/4), at most 32).\n- Reservations: each cursor reserves its uncompressed size before decode\n  and releases it when its refcount reaches zero, after every borrowing\n  batch is released. Prefetch is refused beyond the protector\u0027s headroom.\n  The current cursor never blocks on the protector once the query holds\n  memory (it waits only at admission), which rules out two queries\n  waiting for memory the other holds; the per-query quota keeps the\n  \"block scan quota exceeded\" error. TopN and the legacy path keep the\n  whole-result check, deferred to the first pull.\n- Cancellation withdraws queued decodes and waits for running ones before\n  a cursor is released, and finished tasks drop their cursor references.\n\nReview fixes (codex): cancel releasing a cursor whose prefetched decode\nwas running; protector hold-and-wait; finished tasks retaining cursors;\nstarvation of a prefetched head behind urgent tasks; a test that could\nhang depending on worker scheduling.\n\n* test(measure): leak-check scan resources and add a measure soak\n\nStep 4d of scan path v2, with the fixes it surfaced.\n\n- Leak checks: verifyNoScanLeaks fails a test that ends with block\n  cursors, owner pins, query results, scan reservations or decode tasks\n  still outstanding, and TestMains check the same at the end of the\n  banyand/measure and pkg/query/vectorized binaries\n  (ScanResourceSnapshot, OutstandingOwnerPins). The first run found 385\n  leaked cursors and leaked pins, all in tests that never released their\n  batches or built cursors outside the pool; those tests are fixed.\n- Measure soak: TestMeasureVecSoak (DQB_SOAK\u003d1) runs an in-process\n  two-data-node cluster with background writes, nine query shapes,\n  concurrent and cancelled queries, and gates on resources returning to\n  baseline, heap growth and sampled correctness. It runs with plain\n  go test; the docker path selects it with DQB_ENGINE\u003dmeasure.\n- Audits: selection-order and large-batch tests across the measure\n  operators (7 to 65,536 rows, reversed, shuffled and subset selections).\n- Data races: measure queries wrote the block cache and shard ID into\n  parts shared with concurrent queries and decode workers. Both are now\n  carried in a partRef next to each part and removed from part.\n- Metrics: opening a group closed the previous group\u0027s query metrics, so\n  a node with several groups exported only the last one\u0027s. Each group now\n  keeps its own set.\n- blockCursor.reset clears shardID.\n\n* fix(storage): do not panic creating a segment whose directory is pending delete\n\nRetention removes an expired segment from the controller\u0027s list at once,\nbut its directory is deleted only when the last reference is released.\nA write to the same time range in that window found no segment, called\ncreate, and MkdirPanicIfExist crashed the node with \"directory is exist\".\nThe stream test data hits it by writing six days back into a group with a\nthree-day TTL.\n\nTrack removed segments whose directory still exists and return\nErrSegmentDeleting from create until it is gone; callers already handle\nCreateSegmentIfNotExist errors. The race is pre-existing on main.\nTestCreateSegment_WhileRemovedSegmentStillHeld reproduces the panic on the\nold code.\n\n* test(querybench): settle heap readings in the measure and trace soaks\n\nThe soaks compared HeapInuse after a single GC, which moved by 15% or\nmore from span fragmentation and pool victim caches alone, so the heap\ngate failed on unchanged code. Both soaks now read live heap (HeapAlloc)\nas the minimum of five samples after four GC rounds, the measure soak\nwarms the process-wide zstd encoders before its baseline, and the growth\npercentage is taken of the workload heap. A deliberate leak of one\nresponse in 2,000 still fails the gate (128%); twelve clean runs grew\n1.0-1.6%.\n\n* perf(measure): constant entity-tag columns and run-based aggregation\n\nStep 5 of the batch v2 / scan path v2 designs.\n\n- ConstColumn (pkg/query/vectorized) holds one value and a length and\n  reports its logical ColumnType, so schemas and planners are unchanged.\n  ColumnDef.Entity marks entity tags. lendBatch and single-series\n  coalesced batches turn projected entity tags into consts decoded from\n  row 0; interleaved merge pages stay typed. Every column consumer handles\n  consts, specialized or through Expand/Materialize; frame encoding\n  expands them, so the wire format is unchanged.\n- Batch hints (series ends, time order within each series run) are set\n  only when a storage batch is lent and cleared on Reset.\n- Runs: BatchAggregation (All/Map) and BatchTimeBucket fold a run of rows\n  whose group key is constant (consts, entity tags of a known series,\n  time buckets found by galloping search, asc or desc) with one group\n  lookup and typed range loops that add in the same order as the per-row\n  fold. Count-distinct, reduce mode, unknown hints and fragmented batches\n  (runs under three rows on average) use the per-row path.\n- SelectRows / BatchColumnFilter evaluate a predicate on a const column\n  once per batch.\n\nGate workloads: geomean -25%; group-by + SUM/COUNT -67%, group by entity\ntags -68%, raw group-by -61%, scalar reduce -57%, time bucket + entity on\ndisjoint series -39%. New gates W13-W15.\n\n* perf(measure): columnar frame v2 between data nodes and the liaison\n\nStep 6 of the batch v2 design.\n\n- Frame version 4 (pkg/query/vectorized/frame/columnar.go): per column a\n  validity bitmap (1 \u003d valid, only when there are nulls), int64/float64\n  data, or int32 offsets plus values, each zero-padded to 8 bytes,\n  little-endian. Constant columns are sent as one value, bounded by a\n  256 MiB frame-wide expansion budget that the encoder respects by\n  flattening. Arrays stay TagValue proto cells. Borrowed strings are\n  copied into the frame; the selection is applied at encode.\n- Decode slices the received message: numeric columns borrow typed\n  slices (copied once into an aligned buffer when the message is not\n  8-byte aligned, or on big-endian), strings are views into the message,\n  which the batch pins through a MessageOwner. Every length and offset is\n  validated; truncation and 30,000 random mutations error without panics.\n- Negotiation: the liaison sets InternalQueryRequest.max_frame_version\n  (additive field 3); the data node emits version 4 only when asked and\n  allowed (BANYAND_MEASURE_FRAME_MAX_VERSION). Frames self-describe, so\n  every old/new pairing works. The distributed vectorized suite now runs\n  three clusters: new+new, old liaison + new data nodes, new liaison +\n  old data nodes.\n- Liaison: every consumer clones what it keeps and releases frames after\n  use; the frame-decode tracing probe runs only for traced queries.\n  appendColumnRangeCoerced now clones borrowed strings it wraps into\n  TagValue/FieldValue cells (found under release poisoning).\n\n4 columns x 8,192 rows: decode 0.85 ms / 16,416 allocs -\u003e 0.14 ms / 38,\nencode 1.3 -\u003e 0.43 ms, frame +6%. Distributed full scan -38%.\n\n* refactor(measure)!: drop frame version negotiation and the vectorized flags\n\nBanyanDB 0.12.0 upgrades are whole-cluster (stop every node, start the\nnew binary); rolling and mixed-version clusters are not supported. The\ncompatibility machinery added for frame v2 is therefore removed:\n\n- InternalQueryRequest.max_frame_version, BANYAND_MEASURE_FRAME_MAX_VERSION\n  and the advertise/emit caps are gone. Measure data nodes always send the\n  columnar frame (wire version 4) and the liaison accepts only version 4,\n  rejecting others with an error that names the upgrade rule. The measure\n  row frame (version 3) encode/decode is deleted; the hidden-tag, sorted\n  and traced paths that used it emit the columnar frame. Stream and trace\n  frames are unchanged.\n- --measure-vectorized-enabled, --stream-vectorized-enabled and\n  --trace-vectorized-enabled are removed (they were deprecated no-ops\n  that failed on \u003dfalse); passing one is now an unknown flag.\n- The three-cluster mixed-version integration setup and the version\n  matrix tests are removed.\n- docs/operation/upgrade.md states the 0.12 whole-cluster rule and drops\n  the liaison-first and flag-fallback guidance; CHANGES.md marks both as\n  breaking.\n\n* style(measure): name unused test parameters _ for revive\n\n* docs(design): add the measure batch v2 and scan path v2 designs\n\nTwo linked design documents for the vectorized measure query path, now\nimplemented: the data unit (reference-counted cursors, borrowed typed\ncolumns, constant columns, the columnar data-node-to-liaison frame) and\nthe scan that feeds it (series windows, the time-ordered merge, the\nnode-wide decode pool with reserved prefetch).\n\nEach keeps the original rationale and design-time evidence and adds an\n\"As built\" section with what shipped, where it deviates from the\nproposal (no offsets or list column types, no frame version negotiation\nbecause 0.12.0 supports whole-cluster upgrades only, SIMD and radix sort\ndeferred) and the measured results.\n\n* docs(design): add the streaming API, measure QL gaps, BydbQL plan cache and aggregation designs\n\nAdd four 0.12.0 design documents and list them in both design indexes:\n\n- Streaming API: a server-streaming StreamQuery per model, the existing\n  Write reworked to acknowledge per sealed batch, and an internal\n  cluster.v1 Scan RPC, with the memory invariant, the decisions taken and\n  the test and benchmark plan. Accepted, not yet implemented.\n- Measure QL gaps: what the measure query language lacks against\n  InfluxDB 3.0 SQL and the order to close it. Design only.\n- BydbQL plan cache: proto-free measure planning with a reusable plan\n  cache. Step 3, the local schema source, ships in this release; the\n  rest is not implemented.\n- Aggregating measures and materialized views: an outline.\n\n* docs(design): scope the streaming design to the existing Query and Write APIs for 0.12.0\n\n0.12.0 implements the streaming process behind the existing APIs: the\ninternal Scan transport, chunked emission on data nodes, an incremental\nliaison merge that the unary Query RPCs collect with today\u0027s exact dedup,\nand the Write rework. Fixed per-node query deadlines become idle deadlines\nwith heartbeats so long scans can finish. The public StreamQuery API, its\ngateway route, the streaming bydbctl options and BydbQL streaming move to\nthe next milestone.\n\n* test(measure): keep the race build of the scan differential tests within the CI budget\n\nThe banyand/measure Go tests took 21.6 minutes under `go test -race\n-covermode atomic` (19 minutes in CI), which pushed the \"Test Banyand\"\njob past its 30-minute limit. Under the race build the differential\ntests now run a deterministic covering selection and smaller fixtures;\nthe build without race keeps today\u0027s full matrices and sizes.\n\nTests (race seconds, before -\u003e after): TestScanWindowConstAndRunsMatchPerRowAndLegacy\n706 -\u003e 34, TestTimeMergeMatchesLegacyThroughGroupByAggregationAndTimeBuckets\n145 -\u003e 14, TestTimeMergeMatchesLegacyAcrossGeneratedQueries 91 -\u003e 14,\nTestScanWindowMatchesLegacyForTimeOrders 62 -\u003e 5,\nTestScanWindowRawQueriesMatchWithConstColumns 42 -\u003e 7,\nTestScanWindowMatchesLegacyAcrossGeneratedQueries 25 -\u003e 9,\nTestTimeMergeDecodesCursorsAtTheFrontier 17 -\u003e 7,\nTestPrefetchAddsAtMostAQuarterOfTheFrontierToTheMergePeak 16 -\u003e 7,\nTestScanSequence.../TestPrefetchMatchesSynchronousDecode.../\nTestConcurrentQueriesShareTheNodePool trimmed. Package total 21.6 min -\u003e 4.3 min.\n\nCoverage is preserved by coverPairs (scan_cover_test.go), a greedy,\ndeterministic cover over the valid cross product: every value of every\ndimension appears, and so does every pair that names a relationship\n(grouping x aggregation, grouping x order for the const test; every pair\nfor the merge group-by, time-order and raw-query tests; order, projection\nand limit pairs for the generated merge queries). Cheaper combos are\npreferred through a cost hint. Fixtures shrink only as far as their\ncomments allow: the oap fixture keeps more than ten series, the frontier\ntests keep 16 series, and the mixed fixture\u0027s long series is 8,400 rows\n(still several blocks, a tail part overlapping its last block, and the\n4,096-row page cut). A raceEnabled constant comes from two build-tagged\ntest files. No test is deleted, skipped or weakened, and no product code\nchanges."
    },
    {
      "commit": "f2f351bfcfb5f934e794d6b591783608f5d61c8c",
      "tree": "3fbb98735d5e46c4d7d0b5eaa65299fe3be8dfcf",
      "parents": [
        "ccc700e63c01e8e9acee0dda50cf1a71694d3338"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Oct 19 21:11:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 21:11:40 2026 +0800"
      },
      "message": "test(stream): add a native inverted-index soak harness for the secondary index (#1410)\n\n* test(stream): add a native inverted-index soak harness for the secondary index\n\nAdd a log-shaped stream soak that measures the two things the existing G5d\nharness does not: query latency and CPU utilization. That harness proves\nparity (results equal a baseline) and survival (heap, goroutines, RSS), but\nrecords no p50/p95/p99 and samples memory only — CPU utilization was\nrecorded as a cgroup limit, never as a measurement.\n\nThe fixture models real log traffic: a skewed level distribution so postings\nspan the size crossover, log-normal durations so numeric range queries select\nfew candidates out of many, a per-element trace id for point lookups, and a\nshared 16-word message vocabulary so terms are genuinely shared across\ndocuments rather than 1-element postings.\n\nTwo index scopes are scraped separately, since they are separate indexes:\nstream_storage is the series index (sidx) and stream_tst is the element index\n(idx) — the secondary index under test.\n\nSeed writes are split across batches (`--chunks`, one per 15 min of the\nwindow). A segment\u0027s time bounds come from the documents it holds and a\nsegment is cut per write batch, so writing the fixture down one stream put\nthe whole 24 h span into one segment and a query window could then only ever\nclassify it as contained or overlap — `disjoint` was structurally\nunreachable and the time pruner never skipped anything. With chunking,\n`disjoint` classifications go from 0 to ~15 M over a 2 h pilot.\n\nTwo harness defects found during pilot analysis are fixed here. The probe\nreported its first window after a single round, so that window held ~3 calls\nagainst ~36 in steady state, and its p50 was the 2nd of 3 observations; it\nnow defers below-threshold windows and carries their observations forward.\nThe drift gate averaged window percentiles unweighted, so one thin window\ncould manufacture a false regression; it now weights by call count and\nexcludes low-confidence windows. Together these produced a false 2.4x\ndegradation report on series_exact_svc that a call-weighted analysis shows\nwas 0.86x, i.e. flat.\n\nMove cmd/soak-driver to test/soak/cmd. cmd/ was in no unit-test lane and not\nin the lint PROJECTS, so its 1000 lines of tests never ran: one asserted 4\ncatalog entries against a 6-entry catalog and had been red since the commit\nthat introduced both. test/ is covered by the nightly sweep and by\n`make lint`, so the move restores test and lint coverage for the package.\n\nAlso fixes countGoroutines, which parsed only the pre-Go-1.21 per-goroutine\nprofile shape and so returned 0 against every current runtime, silently\ndisabling the goroutine gate. ?debug\u003d1 emits a summary header; per-goroutine\nstacks are ?debug\u003d2. Unrecognized input is now an error rather than a zero.\n\nThe query memory budget (~19 KB reserved per candidate document against a\npool of protector limit/4) is a known stream-query design issue, not\naddressed here; the harness is sized around it and records it in\ndocs/soak/stream-index-findings.md.\n\n* test(lifecycle): assert the migrated stream element index is queryable\n\nThe lifecycle integration suite migrated the native element index on every\nrun, and asserted nothing about it: the only element-index assertion was a\n100% transfer rate over the files, and every stream query it issued carried\nno Criteria. Measured directly, the cross-segment migration left ZERO .seg\nfiles under the warm stage\u0027s idx/, so there was no index there to assert on\nin the first place.\n\nThe stream had tags (business_id, entity_id) and the write path populated\nthem, but no index rule was bound to sw_cross_segment_stream, so the\nmigration created the directory and had nothing to put in it.\n\nBind a pinned INVERTED rule (id 21, business_id) to the cross-segment\nstream. The ID is pinned rather than auto-assigned because FieldKey.Marshal\nencodes the native field name as the rule ID, and the migration rebuild reads\nit from the source catalog while the node serving the migrated data looks it\nup in the target\u0027s.\n\nThen assert the migrated index is queryable, in two parts.\n\nQuery results, on the warm stage: business_id\u003d\"biz-shared\" returns exactly\none element, \"biz-other\" one, and an absent term none. These alone are NOT\nindex coverage, and a control run proved it: with the index rule and binding\ndeleted, all three still passed. A tag with no inverted index falls back to a\nfull scan with predicate post-filtering, which reproduces correct results\nindistinguishably from a working index.\n\nIndex content, read off disk via the public native read-only API over every\nseg/shard idx/: each migrated term matches more than zero documents and the\nabsent term matches exactly zero. This is what fails when the migration does\nnot populate the index, and it depends only on the pinned rule ID -- not on\nquery-trace span names, planner internals, or metrics naming.\n\nControl: deleting the index rule and binding now fails with \"the migrated\nindex must contain the chunk-sync + row-replay term\". The assertions read the\nartifact the migration produced rather than how the query planner served the\nrequest.\n\nFull lifecycle suite 8/8; distributed query suite\u0027s 194 stream specs still\npass with the new rule loaded by the shared schema loader."
    },
    {
      "commit": "ccc700e63c01e8e9acee0dda50cf1a71694d3338",
      "tree": "2dc87da4c61bb1ea276dea4a7e550a22b29cdc41",
      "parents": [
        "6966636b62e62abbe72f6e70db6b74c9d4150bb1"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Sun Oct 18 18:50:57 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 08:50:57 2026 +0800"
      },
      "message": "Add the data export dry-run protocol and `bydbctl data export --dry-run` (#1404)"
    },
    {
      "commit": "6966636b62e62abbe72f6e70db6b74c9d4150bb1",
      "tree": "573ab42270b026f6bf431f22894747e916beb596",
      "parents": [
        "16d7747530db9aed03c0d0e7b35ffeed450f2530"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Oct 15 08:52:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 08:52:01 2026 +0800"
      },
      "message": "feat(canopy): improve text readability with higher contrast, larger sizes and heavier weights (#1409)"
    },
    {
      "commit": "16d7747530db9aed03c0d0e7b35ffeed450f2530",
      "tree": "4b4a2ed1a2d195ed01073dbca60fcb298bf1abce",
      "parents": [
        "f445f29508c31c3944c8fb7d736dd8cd9b704ee3"
      ],
      "author": {
        "name": "eye-gu",
        "email": "eyegu@apache.org",
        "time": "Thu Oct 15 08:37:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 08:37:27 2026 +0800"
      },
      "message": "Fix stream block filter skipping the rest of a series instead of one block (#1411)\n\n* Fix stream block filter skipping the rest of a series instead of one block\n\n* Update CHANGES for the stream block filter fix\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "f445f29508c31c3944c8fb7d736dd8cd9b704ee3",
      "tree": "840a8e49c86178ee166794d124338ce00693f5ae",
      "parents": [
        "1f5577f8327728dc9e3fb3c3c04cdbbb63023ba9"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 14 13:31:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 13:31:06 2026 +0800"
      },
      "message": "chore: bump golangci-lint to v2.14.0 and migrate configs to the v2 schema (#1408)"
    },
    {
      "commit": "1f5577f8327728dc9e3fb3c3c04cdbbb63023ba9",
      "tree": "65bb34847a8a2831898b44c13714f6788ab12ed2",
      "parents": [
        "0e1c728ee7311f1d4b8f27231b65d23d233f333f"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Oct 13 12:30:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 12:30:08 2026 +0800"
      },
      "message": "fix(trace): complete traces across a segment boundary within 1h of the query range (#1407)"
    },
    {
      "commit": "0e1c728ee7311f1d4b8f27231b65d23d233f333f",
      "tree": "d1fd49a32b5af282423b927d8c0343f0cc75f31b",
      "parents": [
        "94b2948ffa6aa1de598b6509c84653fcd275a751"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Oct 13 10:13:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 10:13:02 2026 +0800"
      },
      "message": "chore(deps): bump the pending mcp npm deps and fix the false CI version-drift report (#1395)"
    },
    {
      "commit": "94b2948ffa6aa1de598b6509c84653fcd275a751",
      "tree": "70f734c04704ee991bc1b32baac688ba3daa9997",
      "parents": [
        "fade662e9bffebfd85bc3caecb750fac3ea2ae12"
      ],
      "author": {
        "name": "Bibek Jyoti Charah",
        "email": "bibekcharah@gmail.com",
        "time": "Mon Oct 12 17:21:44 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 19:51:44 2026 +0800"
      },
      "message": "Keep stream filtering and client projection on batches until output (#1400)\n\n* Add failing processor test for filtered stream frame egress\n\n* Expose the hidden ordering tag name on StreamVecExecutable\n\n* Drop hidden tag columns from the stream frame egress\n\n* Skip the redundant element tag match for index-order stream queries\n\n* Filter stream batches on the columns so filtered queries emit frames\n\n* Cover cancellation and filter errors on the stream frame path\n\n* Cover multi-batch, traced and null-tag cases on the stream frame path\n\n* Log the stream batch filtering and projection change\n\n* Honor cancellation and call Init in the stream batch filter\n\n* Note that the stream criteria getter mutates the plan\n\n* Cover the multi-group dispatch and a null criteria cell\n\n* Share one tag projection reconstruction between stream egresses\n\n* Filter and project stream batches for both egresses\n\n* Prove the timestamp under-fill against a real merge cap\n\n* Correct the stream projection note in the changelog\n\n* Return an empty result when a stream scan finds no source\n\n* Pin the shared batch stage and the source-less result\n\n* Update the stream comments the batch stage made stale\n\n* Cover nulls and the window across batches, cancellation and tracing\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "fade662e9bffebfd85bc3caecb750fac3ea2ae12",
      "tree": "d51ae5b0c3f9d2c68b9f57935446a8a968b72d13",
      "parents": [
        "7f8f538f17f696f3c4c69d13e9998a5b65761e69"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Oct 12 11:41:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 11:41:54 2026 +0800"
      },
      "message": "feat(index): narrow a native time range before projecting a segment (#1405)\n\n* fix(index): give merged native segments exact time bounds\n\nThe streaming merge wrote 0 for both footer time slots, so every merged\nsegment claimed to have no timestamps, and so did its manifest entry once\npersisted. Merged segments soon hold most of an index\u0027s data, which makes\nthem the segments a query most wants to skip or narrow by time, so this\nblocked the whole time-pruning direction: a query could not exclude a merged\nsegment, nor drop the per-document time check for one it fully covers."
    },
    {
      "commit": "7f8f538f17f696f3c4c69d13e9998a5b65761e69",
      "tree": "8b29a12ca9352bbdaab98081c15d982f942a40a0",
      "parents": [
        "039585c0105672831d0069e8732538110ca9a6e7"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Oct 12 06:57:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 06:57:07 2026 +0800"
      },
      "message": "Fix backup reporting success when an earlier catalog upload fails (#1403)"
    },
    {
      "commit": "039585c0105672831d0069e8732538110ca9a6e7",
      "tree": "2ecc24e828dabe34a88ebfff956f3e68af8c6049",
      "parents": [
        "ca86e9a20c77d3fd00f0f9f2b0227336e9194f49"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sat Oct 10 19:45:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 19:45:20 2026 +0800"
      },
      "message": "chore(deps): move to Go 1.26.9 and pick up the fixed x/net and x/crypto (#1406)"
    },
    {
      "commit": "ca86e9a20c77d3fd00f0f9f2b0227336e9194f49",
      "tree": "2d64277f6a2cfe3bfaaa5a7a0cd1d4b0fd0a4ab9",
      "parents": [
        "de3bd0c7b9cd85da307124f146359e11b7cc5dbf"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 09 06:53:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 06:53:45 2026 +0800"
      },
      "message": "feat(index): remove the legacy inverted-index engine and bound native write memory (NIDX-05) (#1402)"
    },
    {
      "commit": "de3bd0c7b9cd85da307124f146359e11b7cc5dbf",
      "tree": "0c8ae385d037b82ff88cf78084277bdb1c6303f7",
      "parents": [
        "7e1418a02913e535b373c3925606b35b9f49d3a9"
      ],
      "author": {
        "name": "吴晟 Wu Sheng",
        "email": "wu.sheng@foxmail.com",
        "time": "Thu Oct 08 20:13:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 20:13:45 2026 +0800"
      },
      "message": "chore(repo): disable Dependabot, protect v0.11.x, and clean up merged branches in the PR skill (#1401)\n\n- Turn off Dependabot security-update PRs via `dependabot_updates: false` in\n  `.asf.yaml`, matching every other SkyWalking repo. The bot was opening\n  npm bump PRs against `mcp/`, `canopy/` and `ui/` that are always closed.\n- Add `v0.11.x` to the protected branches alongside `v0.7.x`.\n- Extend the `gh-pull-request` skill with an \"After the PR Is Merged\"\n  section: confirm `MERGED` via `gh`, then delete the branch locally and on\n  `origin` and prune. Documents why `git branch -D` is needed in a\n  squash-only repo.\n\n\nClaude-Session: https://claude.ai/code/session_01VuBEujVfGY9bsJJ5qkWzTH\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "7e1418a02913e535b373c3925606b35b9f49d3a9",
      "tree": "6e54fc71852123942dfe953f1281830400f03437",
      "parents": [
        "8c1723643fd39cf930ec4653797d4ac79ca4af63"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 07 19:45:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 19:45:11 2026 +0800"
      },
      "message": "feat(stream): migrate the element index with the native index engine (NIDX-04) (#1399)"
    },
    {
      "commit": "8c1723643fd39cf930ec4653797d4ac79ca4af63",
      "tree": "1b9f8c7dfb8845536b042f432cdfa9e1147469f3",
      "parents": [
        "df5f88adc450489cfdbd2c4726d8ded0ceaac08c"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 07 18:05:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 18:05:14 2026 +0800"
      },
      "message": "feat(index): cut the series index over to the native index and remove the legacy engine (NIDX-03) (#1397)"
    },
    {
      "commit": "df5f88adc450489cfdbd2c4726d8ded0ceaac08c",
      "tree": "35f3748e012191a72542ddf10acd316917886ba7",
      "parents": [
        "735e9ad2cd8090b500591ddd311ae9814e89504b"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Oct 07 16:10:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 16:10:44 2026 +0800"
      },
      "message": "fix(test): wait out an in-flight persist before collecting garbage (#1398)"
    },
    {
      "commit": "735e9ad2cd8090b500591ddd311ae9814e89504b",
      "tree": "f6ac5e20a0964e205301dd2f472299ad7eb3b426",
      "parents": [
        "38a6ba065fb4f30ff2e62eef8265afcd32e48c73"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Oct 06 19:15:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 19:15:28 2026 +0800"
      },
      "message": "feat(index): complete the Property native cutover and serve Q1-Q3 from the native index (#1390)"
    },
    {
      "commit": "38a6ba065fb4f30ff2e62eef8265afcd32e48c73",
      "tree": "cce0a712a767ba183c674e509806b8d5a77713e0",
      "parents": [
        "1fb930683cd9df51f81130f1bb26e7614b3bf263"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Oct 06 16:45:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 16:45:20 2026 +0800"
      },
      "message": "[Bug] Canopy: build natively on macOS ARM64 by dropping the platform-pinned native binaries (#1389)"
    },
    {
      "commit": "1fb930683cd9df51f81130f1bb26e7614b3bf263",
      "tree": "24f3438625b0efda59f7fdfa81bf4ec6bcccc0fb",
      "parents": [
        "aa145bc34770811fa93e4c38b3641bbfec0b9b3c"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Oct 06 13:49:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 13:49:37 2026 +0800"
      },
      "message": "[Chore] Generate license artifacts in a pinned, host-independent environment (#1388)"
    },
    {
      "commit": "aa145bc34770811fa93e4c38b3641bbfec0b9b3c",
      "tree": "dc9a699bded3e2d2ff336ac3a7519353131e3fdd",
      "parents": [
        "cb15c9110ac546d603710708cdb9d4b295ceef61"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sun Oct 04 11:42:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 04 11:42:51 2026 +0800"
      },
      "message": "Cut the Property database over to the native segment plugin (#1383)"
    },
    {
      "commit": "cb15c9110ac546d603710708cdb9d4b295ceef61",
      "tree": "e5069af97130553680c58fad691849aa51554466",
      "parents": [
        "d7877e059afc4627e41a373eb72310cfaf102754"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 02 19:21:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 19:21:14 2026 +0800"
      },
      "message": "fix(scheduler): stop reporting long-running scheduled actions as timed out (#1382)"
    },
    {
      "commit": "d7877e059afc4627e41a373eb72310cfaf102754",
      "tree": "65bf4efe75f256b2382ba14f6849b446bab53af1",
      "parents": [
        "77b7fd44cf39491df6469e23732e719cda91c4d8"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Oct 02 17:09:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 17:09:26 2026 +0800"
      },
      "message": "refactor(test): move trace-pipeline dynamic-lifecycle coverage to e2e (#1377)"
    },
    {
      "commit": "77b7fd44cf39491df6469e23732e719cda91c4d8",
      "tree": "605ae118cde8c77f7ca2b8cb23ba35d54b5533f9",
      "parents": [
        "0e3ee0ec811118b10d7502c1a1c5a6c395172de8"
      ],
      "author": {
        "name": "Sruhvx",
        "email": "sarikarn120@gmail.com",
        "time": "Wed Sep 30 11:47:24 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 14:17:24 2026 +0800"
      },
      "message": "Fix S3 destination URL bucket parsing in backup newFS (#1374)"
    },
    {
      "commit": "0e3ee0ec811118b10d7502c1a1c5a6c395172de8",
      "tree": "85699588dca808c14f15eee0557b00ca24e0b051",
      "parents": [
        "e2ea313cc5dbff11eda9d10d11f86fd2042ff01a"
      ],
      "author": {
        "name": "eye-gu",
        "email": "eyegu@apache.org",
        "time": "Tue Sep 29 21:02:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 21:02:45 2026 +0800"
      },
      "message": "Chore/remove embedded UI (#1380)\n\n* chore: remove the legacy embedded web UI\n\n* fix: restore trailing newline in dist/LICENSE\n\n* chore: address review feedback on leftover UI references\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "e2ea313cc5dbff11eda9d10d11f86fd2042ff01a",
      "tree": "f4fb61574cc318a4263e160676dbd4acaa68ab69",
      "parents": [
        "adf684f34dfb213e7324f65088c56479551cfe45"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Sep 29 10:16:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 10:16:42 2026 +0800"
      },
      "message": "feat(index): drive the native ICE encoder through the segment plugin contract (#1369)"
    },
    {
      "commit": "adf684f34dfb213e7324f65088c56479551cfe45",
      "tree": "30e294a2465a3ec166476e9232bf1b5227619853",
      "parents": [
        "655f54e7ada8b3d9051dc4c9f573c78f37f11fbf"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Sep 28 08:25:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 08:25:27 2026 +0800"
      },
      "message": "Fix FODC proxy OOM kills on `/metrics` scrapes (#1379)\n\n* Fix FODC proxy OOM kills on `/metrics` scrapes\n\n* fix comment and CI\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "655f54e7ada8b3d9051dc4c9f573c78f37f11fbf",
      "tree": "bb1fa66186f70ececbb7ca9a002ea3d92661df23",
      "parents": [
        "24150bf01ef8d446b66d6695e810c3ec88c64df3"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Sep 28 06:14:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 06:14:58 2026 +0800"
      },
      "message": "ci: unblock CI (ASF-allowlisted docker action SHAs, reachable MinIO test image) (#1378)"
    },
    {
      "commit": "24150bf01ef8d446b66d6695e810c3ec88c64df3",
      "tree": "a52fa4ef9ee08a6c045642868cbd15ad896a5fae",
      "parents": [
        "9309fa605c34f6ed0ed693cef88d3c567b0d8dbb"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sun Sep 27 18:06:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 18:06:51 2026 +0800"
      },
      "message": "fix(validate): enforce tag-name uniqueness across a resource\u0027s tag families (#1370)"
    },
    {
      "commit": "9309fa605c34f6ed0ed693cef88d3c567b0d8dbb",
      "tree": "287888c3fa709a662e23db4233123987ad138fd3",
      "parents": [
        "d32853953d8a53a6514bcc36415aca3f07266d30"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sun Sep 27 17:43:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 17:43:17 2026 +0800"
      },
      "message": "fix(query): bound the vectorized measure liaison reduce at the uint16 selection boundary (#1372)"
    },
    {
      "commit": "d32853953d8a53a6514bcc36415aca3f07266d30",
      "tree": "32b13123ffdb92c97226527399b7ef7d1bf27fac",
      "parents": [
        "18386182a5db880ab5d365daa60eeecf1133f4ae"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Sun Sep 27 17:38:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 27 17:38:24 2026 +0800"
      },
      "message": "Extend `databasev1.Node` to support report file format versions and timezone (#1373)"
    },
    {
      "commit": "18386182a5db880ab5d365daa60eeecf1133f4ae",
      "tree": "a5358dcf9348cd021cbd4d479a9d2869665ec6cd",
      "parents": [
        "22b2e7b019f8a05cc1fad2896f9052db2f20fc72"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Sep 23 14:59:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 14:59:42 2026 +0800"
      },
      "message": "fix(release): backport 0.11.1 RC packaging fixes to main (#1364)"
    },
    {
      "commit": "22b2e7b019f8a05cc1fad2896f9052db2f20fc72",
      "tree": "8c2462930120697f6e5d94495fddc0688151b19d",
      "parents": [
        "4b3fc26c5e5a37d0e96212c2e6cd299b5744095e"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Sep 23 11:00:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 11:00:15 2026 +0800"
      },
      "message": "fix(liaison): enforce RBAC on hot-enabled write streams and symlink configs (#1353)"
    },
    {
      "commit": "4b3fc26c5e5a37d0e96212c2e6cd299b5744095e",
      "tree": "0609f4ece623a0994e2311bc1297295d9b128c2f",
      "parents": [
        "89403f9211cbd9c56c37f37a1526610591cb1c55"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Wed Sep 23 06:40:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 06:40:28 2026 +0800"
      },
      "message": "Add data export import design docs (#1371)"
    },
    {
      "commit": "89403f9211cbd9c56c37f37a1526610591cb1c55",
      "tree": "49385709f275657552231b25fd0ce61667942471",
      "parents": [
        "cf44ca3e536b7ac8cdd0e09631ce71666b995271"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Sep 21 07:13:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 21 07:13:25 2026 +0800"
      },
      "message": "feat(bydbql): expose COUNT_DISTINCT and time-bucket grouping in BydbQL (#1366)"
    },
    {
      "commit": "cf44ca3e536b7ac8cdd0e09631ce71666b995271",
      "tree": "c524677300dc431456f12fb128f6f9c259de651d",
      "parents": [
        "d5f4a8462641ce638e27c0155ad06edc5dbf55b7"
      ],
      "author": {
        "name": "Trista Pan",
        "email": "hannkenn0@gmail.com",
        "time": "Sun Sep 20 16:53:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 20 16:53:40 2026 +0800"
      },
      "message": "docs: add the self-stored logs design document (#1367)\n\n* Add the self-stored logs design document\n\nSpecifies a second, optional destination for BanyanDB\u0027s own logs: native\nself-storage into a _monitoring_log stream group, behind\n--logging-native-enabled, alongside normal logging which is never disabled.\n\nCovers the per-role log destinations, the writer seam and level semantics,\nthe schema, the in-memory buffer and its adaptive memory budget, routing and\nshard selection, failure modes, and the four delivery phases.\n\nDesign settled on apache/skywalking#14076.\n\n* Fold the decisions into their sections and drop the issue cross-references\n\nThe document now states each decision where it belongs rather than\nsummarising them at the end, and stands on its own without pointing at\nthe tracking issue.\n\n* Replace the last forward reference to the removed decisions section\n\n* Drop the implementation phases section"
    },
    {
      "commit": "d5f4a8462641ce638e27c0155ad06edc5dbf55b7",
      "tree": "60419882372f43b841551a685ab003026ba2e652",
      "parents": [
        "4ad47b65580b7a111ab967eaf966d0b5cfdba0be"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Sat Sep 19 13:42:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 19 13:42:45 2026 +0800"
      },
      "message": "feat(query): add COUNT_DISTINCT push-down for measure queries (#1365)"
    },
    {
      "commit": "4ad47b65580b7a111ab967eaf966d0b5cfdba0be",
      "tree": "1cbc0f3f06dcdd59cc8673918217df2d167500e5",
      "parents": [
        "01795851c5a86cd815519d43a353698059592f7e"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Sep 18 13:35:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 13:35:17 2026 +0800"
      },
      "message": "feat(query): group measure queries by time bucket (#1362)\n\n* feat(query): group measure queries by time bucket\n\nAdds measure.v1.QueryRequest.GroupBy.time_bucket support (issue #14089):\nGroupBy can now bucket by tumbling time windows, alone or combined with a\ntag GroupBy, in both standalone and distributed queries. Width comes from\nthe request or falls back to the measure\u0027s own interval.\n\nBatchTimeBucket streams bucket-by-bucket on the part-scan path (bounding\nlive memory to one bucket\u0027s groups) and falls back to a bounded\nnon-streaming map for index-mode measures, which have no\nascending-timestamp guarantee. It is a genuine vectorized.PullOperator\nthat pulls upstream lazily via a new PipelineBuilder.Transform primitive,\nrather than a BreakerOperator that would have to drain the whole scan\nbefore emitting anything.\n\nA mixed-version cluster where an older data node ignores time_bucket is\nrejected with a clear error instead of silently collapsing the series to\none row. Bucketed output is kept globally ascending in both the\ndistributed reduce (multi-node partials) and the index-mode map fallback,\nwhich each independently lose that ordering without an explicit sort.\n\nIntegration coverage added under test/cases/measure for both standalone\nand distributed query.\n\n* fix(query): resolve distributed GroupBy keys by family, drain map-mode buckets incrementally\n\nAddresses two real issues from Copilot\u0027s review of PR #1362:\n\n- Thread (TagFamily, tagNames) through the liaison-side distributed reduce\n  (distributedGroupByTagKey, ReduceRawFrames/ReducePartialBatches,\n  resolveKeyIndices) instead of matching key tags by bare name. Tag-family\n  validation does not reject the same tag name in two families, so a valid\n  schema with a repeated name could bind a bucketed or tag-keyed distributed\n  reduce to the wrong family\u0027s column. Corrects a stale design-doc note that\n  had claimed this was safe, contradicting the doc\u0027s own §5.1.\n- Drain BatchTimeBucket\u0027s map-mode terminal aggregator one page at a time\n  (drainMapModeAggregator) instead of materializing every page into the\n  pending queue before returning the first one. That aggregator can\n  represent the whole scan in index mode, so the old behavior defeated the\n  bounded-memory intent the PullOperator rewrite exists for. Streaming\n  mode\u0027s per-bucket flushes are unaffected (already bounded).\n\nA third comment (build_test.go) was verified as a false positive: the test\nalready uses the correct columns and passes."
    },
    {
      "commit": "01795851c5a86cd815519d43a353698059592f7e",
      "tree": "628b58d34fad3a0f4e77e51ee7475f50a66a07be",
      "parents": [
        "c5fa7f4483c483cf46c7a897ff29633b0e1b652f"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Sep 17 21:20:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 21:20:14 2026 +0800"
      },
      "message": "feat(query): allow measure Agg to target a tag, not just a field (#1361)"
    },
    {
      "commit": "c5fa7f4483c483cf46c7a897ff29633b0e1b652f",
      "tree": "c0b9c4b6d326a30325fa4fcf486343d46af105cd",
      "parents": [
        "6d6e4085858d4afbab9beb24bb35fb8e7bfcd708"
      ],
      "author": {
        "name": "Hesanda Liyanage",
        "email": "130324291+HesandaLiyanage@users.noreply.github.com",
        "time": "Thu Sep 17 17:49:22 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 20:19:22 2026 +0800"
      },
      "message": "docs: align cluster and node discovery ports and remove etcd leftovers (#1355)"
    },
    {
      "commit": "6d6e4085858d4afbab9beb24bb35fb8e7bfcd708",
      "tree": "b072b85c2412360d6fc0b6e79b93ce20b55ab056",
      "parents": [
        "a4ec2d7e986d76bd99b284e18f820e083327755f"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Sep 17 13:39:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 13:39:41 2026 +0800"
      },
      "message": "feat(index): encode Property documents as native ICE v3 segment bytes (#1345)"
    },
    {
      "commit": "a4ec2d7e986d76bd99b284e18f820e083327755f",
      "tree": "9dc4a4b9e17545cb6ec8c30789c9b74a13e09b6f",
      "parents": [
        "403396797a8829e338fc37a440cf6d1872d2fde9"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Thu Sep 17 09:18:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 17 09:18:17 2026 +0800"
      },
      "message": "docs(design): add tag aggregation and time bucketing design for 0.12.0 (#1360)"
    },
    {
      "commit": "403396797a8829e338fc37a440cf6d1872d2fde9",
      "tree": "1b790b65c835d97d65da5696c9384519a674eff9",
      "parents": [
        "6542c5be632a34454e13ddb2f2820cb7a85a00bd"
      ],
      "author": {
        "name": "Bibek Jyoti Charah",
        "email": "bibekcharah@gmail.com",
        "time": "Wed Sep 16 12:44:12 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 15:14:12 2026 +0800"
      },
      "message": "chore: remove the row-based query path from measure, stream and trace (#1326)\n\n* chore: default the e2e and soak harnesses to the vectorized path\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "6542c5be632a34454e13ddb2f2820cb7a85a00bd",
      "tree": "a1fd351c41b4127192b0068a59cd5b193a4671f7",
      "parents": [
        "082ab2c3b202ddf48d78c322015a81561ab67b0b"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Wed Sep 16 13:50:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 13:50:16 2026 +0800"
      },
      "message": "fix(validate): allowlist path-safe names and bound proto validate.rules (#1358)\n\n* fix(validate): allowlist path-safe group and resource names\n\nGroup names are joined under catalog data roots; unrestricted names\nwith ../ or separators could mkdir/lock outside the storage root.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(validate): bound proto identifiers and schema name allowlists\n\nUntrusted schema/query strings only had min-length checks, so names\ncould escape catalog roots and repeated fields were unbounded.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* chore: format proto validate.rules for CI consistency\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(ci): wait for internal topN measure and bump grpc for CVEs\n\nThe bydbctl list-measure spec raced the async _top_n_result schema,\nand govulncheck failed on google.golang.org/grpc 1.83.0 (GO-2026-6443/6441/6348).\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* chore(deps): refresh dist/LICENSE for grpc v1.83.2\n\nCI check-format fails when license-dep rewrites the bundled NOTICE after the CVE bump.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* fix(validate): allow empty lifecycle selectors and raise property id cap\n\nPGV rejected omitted stage node_selector, and BuildPropertyID can exceed 512 at the 255-character name ceiling.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "082ab2c3b202ddf48d78c322015a81561ab67b0b",
      "tree": "a48961927f193b20e0ad628c8b875ccf7a65dcd9",
      "parents": [
        "46d6c56fb3373b965d7f145911b3d0eb568760c1"
      ],
      "author": {
        "name": "Sruhvx",
        "email": "dronsruhvx26@proton.me",
        "time": "Wed Sep 16 03:47:31 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 16 06:17:31 2026 +0800"
      },
      "message": "fix(storage): add cancellable jittered retry for snapshot syncers in stream, measure, and trace (#1352)"
    },
    {
      "commit": "46d6c56fb3373b965d7f145911b3d0eb568760c1",
      "tree": "9ea6cca0a05fe30721dde9d5b75fd5778f8b4ff3",
      "parents": [
        "a86a15bd73e584d494894556f07f6a7ad8d433b0"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Tue Sep 15 21:47:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 21:47:12 2026 +0800"
      },
      "message": "Fix wrong shard ID report in `collectDataInfo` protocol (#1357)\n\n* Fix wrong shard ID report in `collectDataInfo` protocol"
    },
    {
      "commit": "a86a15bd73e584d494894556f07f6a7ad8d433b0",
      "tree": "28453b6609727f1ac5c0f842d91cffe8314d0a4f",
      "parents": [
        "7f5e29fcfa4c85003fa97e96479f8031c932a3c3"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Sep 15 11:40:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 15 11:40:09 2026 +0800"
      },
      "message": "fix(observability): stop liaison gauge from stealing memory_state schema (#1346)"
    },
    {
      "commit": "7f5e29fcfa4c85003fa97e96479f8031c932a3c3",
      "tree": "486505d31451fe6d162020d30ed4cc0424014fd8",
      "parents": [
        "9241fb2f3b4e81018421f2ded4504711ac3795bd"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Sep 14 16:19:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 16:19:00 2026 +0800"
      },
      "message": "fix(metadata): tolerate unreachable peers in DNS discovery ListNode so non-meta nodes no longer deadlock in PreRun (#1354)"
    },
    {
      "commit": "9241fb2f3b4e81018421f2ded4504711ac3795bd",
      "tree": "1d54f13a2fbc7d1930f984f40aa61fb29a7745d8",
      "parents": [
        "d28ff6277845e2175b7d98e7f78b5d4d81da6f01"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Sep 14 14:49:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 14:49:27 2026 +0800"
      },
      "message": "fix(bydbql): reject deeply nested WHERE parentheses to prevent stack overflow (#1343)"
    },
    {
      "commit": "d28ff6277845e2175b7d98e7f78b5d4d81da6f01",
      "tree": "7759e945ef0ab703cb3e001c006f8ad00ba56c90",
      "parents": [
        "35009f696226935cdc508f77bf57add47c281fcf"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Sep 14 14:08:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 14:08:18 2026 +0800"
      },
      "message": "fix(query): bound Property/Stream/Trace query allocations (#1334)"
    },
    {
      "commit": "35009f696226935cdc508f77bf57add47c281fcf",
      "tree": "566e39ce50447d34aef3a4cd569ba87c06ce0036",
      "parents": [
        "0f49ae0c8a273637b164d77fbe77c1f8c183008e"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Sep 14 10:05:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 10:05:01 2026 +0800"
      },
      "message": "chore: slim AGENTS.md to focused project agent guidance (#1348)\n\nReplace the long duplicated lint checklist with a short completion,\nGo-conventions, and validation guide that points at .golangci.yml."
    },
    {
      "commit": "0f49ae0c8a273637b164d77fbe77c1f8c183008e",
      "tree": "9df0e8f06e17103ad999a5e01cadef9a713deeb7",
      "parents": [
        "fad0afa0dac3590e76666dd22996c49eee1e4d9e"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Mon Sep 14 09:59:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 09:59:03 2026 +0800"
      },
      "message": "fix(metadata): re-fetch discovery nodes before Start during PreRun (#1349)\n\nKeep unbounded schema-registry init retries, but let file/DNS ListNode\nre-fetch retry-queued peers before discovery Start so liaison can recover\nwhen data becomes reachable without restarting."
    },
    {
      "commit": "fad0afa0dac3590e76666dd22996c49eee1e4d9e",
      "tree": "cc0a24012563ce1204067d69eef30c1c80789d24",
      "parents": [
        "31b32ca2510a4c62e9fb2c9f9417a5805037b876"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Sat Sep 12 12:34:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 12 12:34:32 2026 +0800"
      },
      "message": "Update schema registry client init retry strategy (#1344)"
    },
    {
      "commit": "31b32ca2510a4c62e9fb2c9f9417a5805037b876",
      "tree": "d882cfef4e842b3ba6734f91601a28df9d2f8548",
      "parents": [
        "8364660839dc221bd74c6c593b8715a5db84cdde"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Sep 11 13:23:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 13:23:26 2026 +0800"
      },
      "message": "feat(index): page repair tuples natively and cut Property repair over to them (#1335)"
    },
    {
      "commit": "8364660839dc221bd74c6c593b8715a5db84cdde",
      "tree": "d5916762e6ef14223ef3d3cbbf4419382ab6cef6",
      "parents": [
        "17da658000a624847a1fa87eeece13ed72438d9c"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Sep 11 11:37:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 11:37:35 2026 +0800"
      },
      "message": "chore(deps): bump mcp and canopy npm packages for CVEs (#1342)"
    },
    {
      "commit": "17da658000a624847a1fa87eeece13ed72438d9c",
      "tree": "5ae7631ad78b8aeff45e8e4c612725b2695d6bb1",
      "parents": [
        "b4a602fce920dc012dd87eac017b892ce93f893f"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Fri Sep 11 10:40:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 10:40:55 2026 +0800"
      },
      "message": "fix(trace): enforce time ranges for non-timestamp sorted queries (#1333)\n\nFilter partially covered SIDX parts before trace deduplication and bypass timestamp checks for fully covered parts. Preserve user filters and projections, handle timestamp entities and conservative merge bounds, and add regression coverage and part-scan benchmarks.\n\nFixes apache/skywalking#14058"
    },
    {
      "commit": "b4a602fce920dc012dd87eac017b892ce93f893f",
      "tree": "fdaf517872746303576bd275c3f1643343de03c9",
      "parents": [
        "c664390cd6b8023c783ea4df7b0d28d0b6558078"
      ],
      "author": {
        "name": "李宏杰",
        "email": "982264618@qq.com",
        "time": "Fri Sep 11 06:45:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 11 06:45:11 2026 +0800"
      },
      "message": "fix: honor log level for native metrics (#1338)\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "c664390cd6b8023c783ea4df7b0d28d0b6558078",
      "tree": "86a63656710038a2c780fa99c6abc7a7cb6c1c79",
      "parents": [
        "e5f77574bc660757635431ae9ae83fd00c233697"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Thu Sep 10 20:47:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 20:47:18 2026 +0800"
      },
      "message": "Pre setting logging level before flags parse (#1337)\n\n* Pre setting logging level before flags parse\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "e5f77574bc660757635431ae9ae83fd00c233697",
      "tree": "5caab3ac23b9a1f780736c5bd84b6eb28e2e0bc6",
      "parents": [
        "05db202aed25a538459eb1cb208d08f402bb42f8"
      ],
      "author": {
        "name": "Bibek Jyoti Charah",
        "email": "bibekcharah@gmail.com",
        "time": "Thu Sep 10 15:34:21 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 10 18:04:21 2026 +0800"
      },
      "message": "perf(stream): bound the filtered index-order vectorized Top-N merge (#1331)\n\n* test: assert filtered index-order bounds the stream vec merge\n\nRed until the tag filter moves ahead of the merge (#14056).\n\n* perf(stream): run the criteria tag filter ahead of the vectorized merge\n\nA filtered index-order query left its vec merge uncapped because the tag filter\nran at egress, after the merge, so a cap could starve it. Move the filter ahead\nof the merge as a fusible that narrows batch.Selection: the merge then orders\nonly surviving rows and its maxElementSize cap bounds the top-N of the filtered\nset. Filtered timestamp-order queries are unchanged and still filter at egress.\n\n* test(stream): pin the ordered top-N of a filtered index-order query\n\n* test(vectorized): benchmark the pre-merge tag filter at both selectivities\n\n* fix(vectorized): reject a foreign batch schema in the pre-merge tag filter\n\n* docs(stream): correct the merge-cap rationale the tag-filter pushdown reverses\n\n* docs: correct the pushdown rationale in the golden case and the vec egress\n\nThe new golden case cannot regress on the tag-filter pushdown: duration\ncarries an inverted index rule, so the scan drops every non-matching row\nbefore the merge. State what the case does pin, and name\nsort_duration_no_index_limit as the pushdown guard.\n\nThe vec egress comment still described a merge that skipped the cap for\nindex order. That branch is gone.\n\n* test(stream): pin the duplicate-ElementID winner rule\n\n* stream: settle the duplicate-ElementID contract as filter-first\n\n---------\n\nCo-authored-by: Gao Hongtao \u003chanahmily@gmail.com\u003e"
    },
    {
      "commit": "05db202aed25a538459eb1cb208d08f402bb42f8",
      "tree": "b069a7a8f0671c16b21d3d93be1836bc1a753d54",
      "parents": [
        "59805944d5096ff0e642a13450d0a845d7ff7b39"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Wed Sep 09 09:22:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 09 09:22:56 2026 +0800"
      },
      "message": "Update topk related log to error level (#1336)"
    },
    {
      "commit": "59805944d5096ff0e642a13450d0a845d7ff7b39",
      "tree": "78318a1f259dac4fe18c62970a18a7bf2cb0a4f1",
      "parents": [
        "5d9a8438032b5b42d1d46d9d60d3418c4dd4bd97"
      ],
      "author": {
        "name": "Gao Hongtao",
        "email": "hanahmily@gmail.com",
        "time": "Tue Sep 08 13:32:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 13:32:25 2026 +0800"
      },
      "message": "feat(index): select stored documents by exact term and cut schema walks over to it (#1325)"
    },
    {
      "commit": "5d9a8438032b5b42d1d46d9d60d3418c4dd4bd97",
      "tree": "be88afe6e1a2915c87bfd8994387ebf3327245fd",
      "parents": [
        "a48ab167d00e1bce17f4c1ec2b3359a19561c4ca"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Sep 07 15:12:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 15:12:03 2026 +0800"
      },
      "message": "Unify the logging configuration across every BanyanDB binary (#1332)\n\n* Unify the logging configuration across every BanyanDB binary\n\n* fix comment"
    },
    {
      "commit": "a48ab167d00e1bce17f4c1ec2b3359a19561c4ca",
      "tree": "2ffc7f0470060152d6d2c8b9747faeeab0205535",
      "parents": [
        "2f39fb53d896ad3f1e685f77bba4cf862b9954fe"
      ],
      "author": {
        "name": "mrproliu",
        "email": "741550557@qq.com",
        "time": "Mon Sep 07 06:51:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 07 06:51:11 2026 +0800"
      },
      "message": "Fix FODC proxy `/metrics` returning partial data or timing out when concurrent scrapes overlap. (#1328)"
    },
    {
      "commit": "2f39fb53d896ad3f1e685f77bba4cf862b9954fe",
      "tree": "cdbdf15d3e9909bca04573027ba98561c1a2a8cf",
      "parents": [
        "0d1314fcfbbc550da668b428579fff5d1c38b6e0"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sat Sep 05 21:53:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 05 21:53:56 2026 +0800"
      },
      "message": "fix(canopy): enforce readonly role on /monitoring/* proxy (#1330)"
    },
    {
      "commit": "0d1314fcfbbc550da668b428579fff5d1c38b6e0",
      "tree": "3584bff6a5e20fdf7d83af61ae5955514f1e02cb",
      "parents": [
        "6a2eaf6167c36e9f5851536e2a6b165e22e047c0"
      ],
      "author": {
        "name": "Owen Willison",
        "email": "41498224+owenwillison-vajra@users.noreply.github.com",
        "time": "Sat Sep 05 12:56:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 05 12:56:10 2026 +0800"
      },
      "message": "chore(deps): close canopy and mcp Dependabot CVEs (#1329)"
    }
  ],
  "next": "6a2eaf6167c36e9f5851536e2a6b165e22e047c0"
}
