)]}'
{
  "log": [
    {
      "commit": "af37fc93f275ebe64a3cd3553e572a7d84e17279",
      "tree": "f44649dd870bbd4c7f0d7de1d0a08e0ac6f5377a",
      "parents": [
        "d474841e9733b8cc1cbc54e825f0076663063bbd"
      ],
      "author": {
        "name": "Suyan",
        "email": "suyanhanx@gmail.com",
        "time": "Fri May 08 14:09:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 14:09:07 2026 +0800"
      },
      "message": "fix(services/gdrive): restore behavior CI semantics (#7486)\n\nRevert \"revert: fix gdrive behavior CI semantics (#7485)\"\n\nThis reverts commit f98505bd0970cc80cff70f299938dea0a1fe7cda."
    },
    {
      "commit": "d474841e9733b8cc1cbc54e825f0076663063bbd",
      "tree": "b074a9bfb13e5b5c56cb77f5ebee99f45b2ba706",
      "parents": [
        "e56a32ea6a91bb1a814c660c0ccb103e411d89a8"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Thu May 07 21:07:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 21:07:40 2026 +0800"
      },
      "message": "ci: fix check-msrv ci  (#7483)\n\n* ci: fix check-msrv ci\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e\n\n* relock\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e\n\n* fixup\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e\n\n---------\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e"
    },
    {
      "commit": "e56a32ea6a91bb1a814c660c0ccb103e411d89a8",
      "tree": "0cd40e3ac2994d22ac588fc8719a36340c882ef9",
      "parents": [
        "d3122b7bdbf5161df2dfb77bfba41104b7ead6d1"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Thu May 07 21:06:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 21:06:27 2026 +0800"
      },
      "message": "ci: harden rust release publishing (#7474)"
    },
    {
      "commit": "d3122b7bdbf5161df2dfb77bfba41104b7ead6d1",
      "tree": "6964a488572927d5d987d2744ebe30022e6e1026",
      "parents": [
        "f98505bd0970cc80cff70f299938dea0a1fe7cda"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu May 07 20:49:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 21:49:49 2026 +0900"
      },
      "message": "feat(bindings/python): expose stat_with_if_modified_since, stat_with_if_unmodified_since, stat_with_version in Capability (#7444)\n\n* feat(bindings/python): expose stat_with_if_modified_since, stat_with_if_unmodified_since, stat_with_version in Capability\n\nMap stat_with_if_modified_since, stat_with_if_unmodified_since, and\nstat_with_version from Rust core\u0027s Capability struct to the Python\nbinding Capability class.\n\nAdds focused test verifying the new fields are accessible from Python.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(bindings/python): use capability() method call instead of property\n\n---------\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "f98505bd0970cc80cff70f299938dea0a1fe7cda",
      "tree": "f202973086ad84ab6dbeccd026cf8fb86882d4b9",
      "parents": [
        "2ba04420aa5dd584e64d770d209cd3399fa0711d"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Thu May 07 20:34:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 20:34:13 2026 +0800"
      },
      "message": "revert: fix gdrive behavior CI semantics (#7485)\n\nRevert \"fix(services/gdrive): stabilize behavior CI semantics (#7390)\"\n\nThis reverts commit d5f7dcf1097a96429b3684057c567ccc090a6b77."
    },
    {
      "commit": "2ba04420aa5dd584e64d770d209cd3399fa0711d",
      "tree": "7fda8bbfacb73933696bc9455501c3502b0149f8",
      "parents": [
        "fa36a50dd777112f04f6cc94374b1e48a5806919"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu May 07 05:01:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 20:01:05 2026 +0800"
      },
      "message": "feat(metrics): add service operation to metrics label (#7407)\n\nCo-authored-by: tison \u003cwander4096@gmail.com\u003e"
    },
    {
      "commit": "fa36a50dd777112f04f6cc94374b1e48a5806919",
      "tree": "7f744fb63b4f25e6f4a63014aba0f203960e9c0c",
      "parents": [
        "d5f7dcf1097a96429b3684057c567ccc090a6b77"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu May 07 05:00:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 20:00:01 2026 +0800"
      },
      "message": "feat(retry): record more fields in the retry interceptor (#7406)\n\n* feat(retry): record more fields in the retry interceptor\n\n* breaking API doc\n\n* doc to 0.57\n\n* field construction\n\n* format error"
    },
    {
      "commit": "d5f7dcf1097a96429b3684057c567ccc090a6b77",
      "tree": "fa3a509a043d567dfab90e3a07f4bd98b202779d",
      "parents": [
        "113faa155f3b725ac81333baec10509853bb1931"
      ],
      "author": {
        "name": "Suyan",
        "email": "suyanhanx@gmail.com",
        "time": "Thu May 07 19:22:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 19:22:16 2026 +0800"
      },
      "message": "fix(services/gdrive): stabilize behavior CI semantics (#7390)\n\n* fix(services/gdrive): keep recent mutations visible to listers\n\n* fix(services/gdrive): stabilize recursive delete semantics\n\n* fix(services/gdrive): replace PathCacher with local path index\n\n* fix: close recursive gdrive list gaps and re-enable behavior CI\n\n* fix(services/gdrive): prefer latest duplicate match\n\n* test(ci): drop gdrive planner assertion\n\n* docs(services/gdrive): note duplicate-name resolution"
    },
    {
      "commit": "113faa155f3b725ac81333baec10509853bb1931",
      "tree": "b9b5ed5c8c0b25936f6b2a47e1693548a79ae803",
      "parents": [
        "01ca24e6dd94b24a73de057ef23e70525f019ec6"
      ],
      "author": {
        "name": "Krisztián Szűcs",
        "email": "szucs.krisztian@gmail.com",
        "time": "Thu May 07 13:18:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 19:18:26 2026 +0800"
      },
      "message": "docs(hf): document bucket support and update service table (#7387)\n\n- Add Storage Backends section describing git repos vs object store buckets\n- Update capabilities list to match implementation (add copy/rename/presign,\n  remove unimplemented entries)\n- Add bucket repo_type and HF_ENDPOINT env var to Configurations\n- Add bucket builder and URI examples\n- Link to Xet documentation\n- Add huggingface to Object Storage Services in README (alongside existing\n  Git Based Storage Services entry)"
    },
    {
      "commit": "01ca24e6dd94b24a73de057ef23e70525f019ec6",
      "tree": "bf76c94a5e28c068b616b94c1914edc57024daaf",
      "parents": [
        "dc26789d817ff614b6505220201d513b4ae32781"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Thu May 07 19:16:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 19:16:30 2026 +0800"
      },
      "message": "chore: upgrade ctro and quick-xml deps (#7479)\n\n* chore: upgrade ctro and quick-xml deps\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e\n\n* fixup\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e\n\n---------\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e"
    },
    {
      "commit": "dc26789d817ff614b6505220201d513b4ae32781",
      "tree": "7e720ed4ef4d60fa264c9b0afef7af8f8a103634",
      "parents": [
        "e3ebf82668e47ea66bc49754648d431c7c2260fe"
      ],
      "author": {
        "name": "Weny Xu",
        "email": "wenymedia@gmail.com",
        "time": "Thu May 07 19:04:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 19:04:07 2026 +0800"
      },
      "message": "feat(services/oss): support ECS RAM role credentials (#7480)"
    },
    {
      "commit": "e3ebf82668e47ea66bc49754648d431c7c2260fe",
      "tree": "57b3efefd96a129e5c9584274d8756f699c87c87",
      "parents": [
        "0f9f80cf188a0c599f872113c1168ac32e7e0502"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Tue May 05 18:47:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 19:47:53 2026 +0900"
      },
      "message": "feat(bindings/dart): add File.read and File.write with error mapping (#7473)\n\nAdd read/write async and sync methods to the Dart File class,\nmirroring Rust Operator::read and Operator::write.\n\nChanges:\n- rust/src/api/opendal_api.rs: add read/read_sync/write/write_sync\n  returning anyhow::Result so Rust errors surface as Dart exceptions\n- rust/Cargo.toml: add anyhow \u003d \"1.0\" dependency\n- lib/opendal.dart: add File.read()/readSync()/write()/writeSync()\n- tests/opendal_test.dart: add round-trip, missing-file throws, and\n  overwrite semantics tests\n- Regenerate FRB bindings for new methods\n\nDepends on FRB 2.12.0 upgrade (PR A).\n\nScope: bindings/dart only.\nAI-assisted: od-kimi-scout-050121.\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e"
    },
    {
      "commit": "0f9f80cf188a0c599f872113c1168ac32e7e0502",
      "tree": "ba890b6661b7e681317cd5a54f24148cd50c6dd0",
      "parents": [
        "2ac599f2fe5fdbc1eca5ebd06964603f986f5974"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue May 05 01:49:06 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 01:49:06 2026 +0900"
      },
      "message": "chore(deps): bump the docusaur group in /website with 3 updates (#7464)\n\nBumps the docusaur group in /website with 3 updates: [@docusaurus/core](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus), [@docusaurus/plugin-client-redirects](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-plugin-client-redirects) and [@docusaurus/preset-classic](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-preset-classic).\n\n\nUpdates `@docusaurus/core` from 3.9.2 to 3.10.1\n- [Release notes](https://github.com/facebook/docusaurus/releases)\n- [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/facebook/docusaurus/commits/v3.10.1/packages/docusaurus)\n\nUpdates `@docusaurus/plugin-client-redirects` from 3.9.2 to 3.10.1\n- [Release notes](https://github.com/facebook/docusaurus/releases)\n- [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/facebook/docusaurus/commits/v3.10.1/packages/docusaurus-plugin-client-redirects)\n\nUpdates `@docusaurus/preset-classic` from 3.9.2 to 3.10.1\n- [Release notes](https://github.com/facebook/docusaurus/releases)\n- [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/facebook/docusaurus/commits/v3.10.1/packages/docusaurus-preset-classic)\n\n---\nupdated-dependencies:\n- dependency-name: \"@docusaurus/core\"\n  dependency-version: 3.10.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: docusaur\n- dependency-name: \"@docusaurus/plugin-client-redirects\"\n  dependency-version: 3.10.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: docusaur\n- dependency-name: \"@docusaurus/preset-classic\"\n  dependency-version: 3.10.1\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: docusaur\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2ac599f2fe5fdbc1eca5ebd06964603f986f5974",
      "tree": "10153d86a9247dad288c26c708fe2c6b1a9f26e4",
      "parents": [
        "4ca79c62e11d9072ab5fbeffdc0b6b1d954bdb7d"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Mon May 04 14:23:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 15:23:36 2026 +0900"
      },
      "message": "fix(core): prevent integer overflow/underflow in BytesRange conversions (#7398)\n\n* fix(core): prevent integer overflow/underflow in BytesRange conversions\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix: rustfmt formatting\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "4ca79c62e11d9072ab5fbeffdc0b6b1d954bdb7d",
      "tree": "7a652fe9f21f0bd6ca92ad77e47fc210a3a61256",
      "parents": [
        "437ecc0865c16b785630f4a1c4b559b553b0538a"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Sun May 03 19:34:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 03 19:34:14 2026 +0800"
      },
      "message": "docs(bindings/dart): document local development workflow (#7478)\n\nCo-authored-by: od-codex-review-050121 \u003cod-codex-review-050121@slock.local\u003e"
    },
    {
      "commit": "437ecc0865c16b785630f4a1c4b559b553b0538a",
      "tree": "bd8a1a4cc27f6de93e5a6683accbdd35e1e8e5f2",
      "parents": [
        "611ad132c3c97aa5086076d097cada5833002d91"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Sun May 03 02:34:50 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 03 03:34:50 2026 +0900"
      },
      "message": "feat(bindings/nodejs): add presignDelete method and Capability getter (#7468)\n\n* feat(bindings/nodejs): Add presignDelete method for parity with presignRead/Write/Stat\n\nAdd the missing presign_delete capability to the Node.js binding, matching\nthe existing flat presign method pattern (presignRead/presignWrite/presignStat).\n\n- bindings/nodejs/src/lib.rs: Add presign_delete napi method\n- bindings/nodejs/generated.d.ts: Auto-generated TypeScript declaration\n- Intentionally flat only (no options variant) for sibling parity\n- No Capability getter added (deferred to uniform sweep)\n\nCloses: apache/opendal issue for presign_delete parity\nScope: Node.js binding only\nAI-assisted: DeepSeek v4-pro, reviewed by OpenDAL regression team\n\n* feat(bindings/nodejs): expose presignDelete capability\n\n---------\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e\nCo-authored-by: od-codex-review-050121 \u003cod-codex-review-050121@slock.local\u003e"
    },
    {
      "commit": "611ad132c3c97aa5086076d097cada5833002d91",
      "tree": "e2f7ddb7849868b4f3b2c6923c1be2d6ed977cd9",
      "parents": [
        "2ccbad4e860c5dc36f2af32fdad545ce422b41f4"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Sun May 03 02:34:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 03 03:34:20 2026 +0900"
      },
      "message": "feat(bindings/nodejs): add Entry.name getter (#7470)\n\nAdd name() getter to the Node.js Entry class, exposing the last\nsegment of the entry path. This mirrors Python Entry.name() and\nRust Entry::name().\n\nSigned-off-by: od-kimi-scout-050121 \u003cscout@opendal-reg.local\u003e\nCo-authored-by: od-kimi-scout-050121 \u003cscout@opendal-reg.local\u003e"
    },
    {
      "commit": "2ccbad4e860c5dc36f2af32fdad545ce422b41f4",
      "tree": "1625cfdc8280f0753b2a0ba4b1b4b80f4786e32d",
      "parents": [
        "be64f9caafa70431c3eeefbf369184169641dea0"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Sun May 03 02:33:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 03 03:33:31 2026 +0900"
      },
      "message": "chore(bindings/dart): upgrade flutter_rust_bridge to 2.12.0 and fix native library loading (#7472)\n\nUpgrade flutter_rust_bridge from 2.8.0 to 2.12.0 to resolve codegen/runtime\nversion mismatch that broke dart test.\n\nChanges:\n- pubspec.yaml: flutter_rust_bridge 2.8.0 → 2.12.0\n- rust/Cargo.toml: flutter_rust_bridge \u003d \"\u003d2.8.0\" → \"\u003d2.12.0\"\n- Regenerate all FRB bindings with matching codegen/runtime\n- Fix lib/opendal.dart constructor parameter: schemeStr → scheme (FRB generated),\n  but keep Storage.init(schemeStr:) public API wrapper unchanged\n- Fix macOS native library loading: fall back to rust/target/release/ when\n  cross-compilation target directory does not exist\n\nNo behavior changes; existing tests continue to pass.\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e"
    },
    {
      "commit": "be64f9caafa70431c3eeefbf369184169641dea0",
      "tree": "0baad9386f090a41abb2c4e24276d04d36960080",
      "parents": [
        "2a24aecc755277f2c4f83a01762721d704b56fae"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Sat May 02 21:17:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 21:17:42 2026 +0800"
      },
      "message": "ci: fix main workflow failures (#7476)"
    },
    {
      "commit": "2a24aecc755277f2c4f83a01762721d704b56fae",
      "tree": "6126e3eb29bd0ee2ca7415869a439504e2308446",
      "parents": [
        "12e02ebfcd37c924351f8db61bbb07e856936ee7"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Sat May 02 20:36:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 20:36:06 2026 +0800"
      },
      "message": "feat(bindings/nodejs): add Operator.fromUri static factory (#7471)\n\nAdd a static fromUri(uri, options?) factory method to the Node.js\nOperator class, mirroring Rust Operator::from_uri and Python\nOperator.from_uri (PR #6993).\n\nThe URI encodes scheme and configuration in a single string, e.g.\n  memory://localhost/\n  s3://bucket/path?region\u003dus-east-1\n\nOptional extra key-value options can be passed to override or\nsupplement values encoded in the URI.\n\nIntentional divergence: none. Direct 1:1 mapping of Rust\nOperator::from_uri((uri, options)) via IntoOperatorUri.\n\nScope: bindings/nodejs only (lib.rs + generated.d.ts).\nAI-assisted: od-claude-lead-050121, reviewed by OpenDAL regression team.\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e"
    },
    {
      "commit": "12e02ebfcd37c924351f8db61bbb07e856936ee7",
      "tree": "82c692d4361b184221f84236d53765e2e8b20b5e",
      "parents": [
        "2f059d85d89c1e7f86def0802e65bbe196292e01"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Fri May 01 20:24:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 11:24:25 2026 +0800"
      },
      "message": "feat(metrics): Add regression test for metrics recording (#7362)"
    },
    {
      "commit": "2f059d85d89c1e7f86def0802e65bbe196292e01",
      "tree": "26b0e610b065beb7c523dbf5c6e2b5ab57c2b662",
      "parents": [
        "7d55f31125de0d8704a2b7a487c3cb8d1b56aaa0"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu Apr 30 16:49:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 07:49:30 2026 +0800"
      },
      "message": "Revert \"fix(services/s3): support write if-none-match\" (#7462)"
    },
    {
      "commit": "7d55f31125de0d8704a2b7a487c3cb8d1b56aaa0",
      "tree": "b438c5f22daa6ac0407076626599b2270915248f",
      "parents": [
        "cd17e931a7522af1aace46309d4846d69675ca7f"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 23:01:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 01 00:01:03 2026 +0900"
      },
      "message": "fix(services/ghac): normalize cache URL joins (#7450)\n\nCo-authored-by: TennyZhuang \u003c9161438+TennyZhuang@users.noreply.github.com\u003e"
    },
    {
      "commit": "cd17e931a7522af1aace46309d4846d69675ca7f",
      "tree": "378566f7daed197ce63ca8a87021aa38856d8c48",
      "parents": [
        "19ab622100813b4ac2a9e937ff7d6082385b7eac"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:57:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:57:04 2026 +0900"
      },
      "message": "fix(layers/concurrent-limit): limit copy and rename (#7452)\n\nCo-authored-by: TennyZhuang \u003c9161438+TennyZhuang@users.noreply.github.com\u003e"
    },
    {
      "commit": "19ab622100813b4ac2a9e937ff7d6082385b7eac",
      "tree": "f8b3dd71d301380d758bd1bcb4719ddcfd1b3d11",
      "parents": [
        "5207106d9508591390b57940528c0f3cd241c338"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:55:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:55:46 2026 +0900"
      },
      "message": "fix(core): prevent integer overflow in parse_into_range for u64::MAX bounds (#7397)\n\n* fix(core): prevent integer overflow in parse_into_range for u64::MAX bounds\n\n`parse_into_range` uses `v + 1` to convert `Bound::Excluded` start and\n`Bound::Included` end bounds into a `Range\u003cu64\u003e`. When users pass\n`..\u003du64::MAX` or `(Bound::Excluded(u64::MAX), ..)`, this causes:\n- Panic in debug builds (integer overflow)\n- Silent wrap to 0 in release builds (incorrect range calculation)\n\nBoth are user-triggerable through public Reader methods like `read()`,\n`read_into()`, `into_stream()`, `into_futures_async_read()`, and\n`into_bytes_stream()`, all of which accept `RangeBounds\u003cu64\u003e`.\n\nFix: use `checked_add(1)` and return `ErrorKind::RangeNotSatisfied`\nwhen the bound value cannot be incremented.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix: rustfmt formatting for assert macro\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "5207106d9508591390b57940528c0f3cd241c338",
      "tree": "0b8932061752e15a77ebff5f5b8c7b0bd083410c",
      "parents": [
        "40a68edca61924eed061568ecc621c8689ce1555"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:54:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:54:17 2026 +0900"
      },
      "message": "fix(bindings/python): add RateLimited and RangeNotSatisfied exception kinds (#7437)\n\n* fix(bindings/python): add RateLimited and RangeNotSatisfied exception kinds\n\nTwo ErrorKind variants introduced in Rust core — RateLimited and\nRangeNotSatisfied — were not mapped in the Python bindings. Both were\nsilently swallowed by the catch-all `_ \u003d\u003e Unexpected::new_err(e)` in\nformat_pyerr_impl, making it impossible for Python callers to distinguish\nrate-limit responses (e.g. S3 429) or out-of-range reads from generic\nunexpected errors.\n\nThis commit adds:\n- create_exception! declarations for RateLimited and RangeNotSatisfied\n- Explicit arms in format_pyerr_impl for both new kinds\n- Registration in the exceptions module in lib.rs\n- .pyi stub entries (alphabetically sorted)\n- Tests verifying presence, raisability, and mutual distinctness of the\n  new exception classes\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(bindings/python): fix ruff EM101 linting errors in test_exceptions.py\n\nAssign exception message strings to variables before raising to comply\nwith ruff EM101 rule (no string literals in raise statements).\n\n* fix(bindings/python): fix cargo fmt formatting in errors.rs and lib.rs\n\n- Convert RateLimited create_exception! macro to single-line format\n  to match existing short-doc patterns (NotFound, IsSameFile)\n- Add trailing comma after RangeNotSatisfied in add_pyexceptions!\n  macro array in lib.rs (required by edition\u003d2024 rustfmt)\n\n* fix(bindings/python): fix ruff PT012 and remove unrelated release_java.yml change\n\n- Move variable assignments outside pytest.raises blocks to comply\n  with PT012 (single simple statement per raises block)\n- Replace try/except distinctness test with direct issubclass checks,\n  which is clearer and avoids PT012 violations\n- Revert unrelated -DskipStagingRepositoryClose\u003dtrue change in\n  release_java.yml that was not part of this PR\n\n---------\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "40a68edca61924eed061568ecc621c8689ce1555",
      "tree": "73d1d203edbc2452d0c9d28ec31b4066c54a7774",
      "parents": [
        "0899839c0429dc281c2e34e10c4f2b5c15367087"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:53:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:53:18 2026 +0900"
      },
      "message": "feat(bindings/python): expose DeleteOptions version and recursive params (#7443)\n\n* feat(bindings/python): expose version and recursive options for delete\n\nAdds optional `version` and `recursive` parameters to both sync and async\n`delete` methods, enabling:\n- Deletion of specific file versions on version-aware backends (S3 with versioning)\n- Recursive directory deletion via the delete endpoint\n\nUpdates `DeleteOptions` struct to include `recursive` field and adds\n`FromPyObject` impl for proper kwarg extraction.\n\nIncludes focused behavior tests verifying the new parameters are accepted.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* feat(bindings/python): expose delete_with_version and delete_with_recursive in Capability\n\nMap delete_with_version and delete_with_recursive from Rust core\u0027s\nCapability struct to the Python binding Capability class.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(bindings/python): fix missing recursive field in presign_delete DeleteOptions\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(bindings/python): add version/recursive kwargs to sync delete and fix test capability checks\n\n* fix(bindings/python): wrap long async test signatures to fix E501\n\n---------\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0899839c0429dc281c2e34e10c4f2b5c15367087",
      "tree": "73d1d203edbc2452d0c9d28ec31b4066c54a7774",
      "parents": [
        "1c4a989865d13d0dcbeeea1c2dbd3de0cc77f450"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:51:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:51:59 2026 +0900"
      },
      "message": "fix(services/s3): support write if-none-match (#7440)\n\nCo-authored-by: TennyZhuang \u003c9161438+TennyZhuang@users.noreply.github.com\u003e"
    },
    {
      "commit": "1c4a989865d13d0dcbeeea1c2dbd3de0cc77f450",
      "tree": "0f34ed5c8db978f1d53e02efd2638d1a43a8589d",
      "parents": [
        "e66fdcdcdec1858c43c2cf439c648ab6b32dfeaf"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:50:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:50:57 2026 +0900"
      },
      "message": "feat(bindings/python): expose if_not_exists option for copy (#7442)\n\n* feat(bindings/python): expose version and recursive options for delete\n\nAdds optional `version` and `recursive` parameters to both sync and async\n`delete` methods, enabling:\n- Deletion of specific file versions on version-aware backends (S3 with versioning)\n- Recursive directory deletion via the delete endpoint\n\nUpdates `DeleteOptions` struct to include `recursive` field and adds\n`FromPyObject` impl for proper kwarg extraction.\n\nIncludes focused behavior tests verifying the new parameters are accepted.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* feat(bindings/python): expose delete_with_version and delete_with_recursive in Capability\n\nMap delete_with_version and delete_with_recursive from Rust core\u0027s\nCapability struct to the Python binding Capability class.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(bindings/python): fix missing recursive field in presign_delete DeleteOptions\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(bindings/python): add version/recursive kwargs to sync delete and fix test capability checks\n\n* fix(bindings/python): wrap long async test signatures to fix E501\n\n---------\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "e66fdcdcdec1858c43c2cf439c648ab6b32dfeaf",
      "tree": "60d675665488d5177d67b262ec568e2a0a8094fc",
      "parents": [
        "ba6724fe75a52b3c907d5c1e5a5a0a8cd394226a"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:50:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:50:15 2026 +0900"
      },
      "message": "fix(core): validate range bounds to prevent underflow (#7441)\n\n- Reject invalid HTTP Range headers where end \u003c start in\n  BytesRange::from_str instead of silently underflowing\n- Reject invalid Content-Range headers where end \u003c start in\n  BytesContentRange::from_str\n- Use saturating arithmetic in BytesRange::from\u003cRangeBounds\u003e to avoid\n  underflow when converting invalid Rust ranges (e.g., 100..50)\n- Use saturating_add in both start-bound and end-bound arms to avoid\n  overflow on u64::MAX boundary\n- Add explicit check in BytesContentRange::len to return 0 when end \u003c start\n\nFixes #7337\n\nCo-authored-by: TennyZhuang \u003c9161438+TennyZhuang@users.noreply.github.com\u003e"
    },
    {
      "commit": "ba6724fe75a52b3c907d5c1e5a5a0a8cd394226a",
      "tree": "6354bb21f5e7619a76a647d930da15e031eb0d71",
      "parents": [
        "5b5a3e85e5b36f067be7d69e9155cb633482f976"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:48:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:48:22 2026 +0900"
      },
      "message": "feat(bindings/python): expose list_with_versions and list_with_deleted in Capability (#7445)\n\nThe Rust core already supports list_with_versions and list_with_deleted\ncapabilities, but the Python binding Capability struct did not expose them.\n\nThis commit:\n- Adds list_with_versions and list_with_deleted fields to Python Capability\n- Updates capability.pyi type stubs\n- Adds capability tests for the new list flags\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e"
    },
    {
      "commit": "5b5a3e85e5b36f067be7d69e9155cb633482f976",
      "tree": "a2e8a2008c588ad43b8760fb6c890453a804a464",
      "parents": [
        "92c89cd0a3a65a91874a8b64ed5c68eb011fed13"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:47:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:47:48 2026 +0900"
      },
      "message": "test(bindings/python): add focused behavior tests for write conditional options (#7446)\n\n* test(bindings/python): add focused behavior tests for write conditional options\n\nAdds tests verifying write() accepts if_match, if_none_match, and\nif_not_exists parameters for both sync and async operators.\n\nThese options were already exposed in the Python API but lacked\ndedicated behavior tests.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(bindings/python): gate write conditional tests on specific capabilities and fix line length\n\n---------\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "92c89cd0a3a65a91874a8b64ed5c68eb011fed13",
      "tree": "ef1c7c69405b464e5bcd269cc06a8eeb66853d5e",
      "parents": [
        "3c68fd94b77b8a3fdf4f9fedf79099831b6cb0f6"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:47:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:47:04 2026 +0900"
      },
      "message": "test(bindings/python): add focused behavior tests for stat conditional options (#7448)\n\n* test(bindings/python): add focused behavior tests for stat conditional options\n\nAdds tests verifying stat() accepts if_match, if_none_match, and\nversion parameters for both sync and async operators.\n\nThese options were already exposed in the Python API but lacked\ndedicated behavior tests.\n\nCo-Authored-By: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e\n\n* fix(bindings/python): gate stat conditional tests on specific capabilities and fix line length\n\n* fix(bindings/python): add stat_with_version to Capability struct and use real etag in if_match smoke tests\n\n---------\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e\nCo-authored-by: Claude Sonnet 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "3c68fd94b77b8a3fdf4f9fedf79099831b6cb0f6",
      "tree": "1a07948e38f518715f66eb8375218d09814a3b8d",
      "parents": [
        "ada28ff230e03055f0ddd3f8ea8abd3c162a0cf9"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Thu Apr 30 22:34:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 23:34:25 2026 +0900"
      },
      "message": "feat(bindings/python): add behavior tests for conditional read/write (#7449)\n\nThe Python bindings support conditional headers (if_match, if_none_match)\non read and write operations, but there were no behavior tests covering\nthese important HTTP semantics.\n\nThis commit adds focused behavior tests for both sync and async:\n- read with if_match: succeeds on matching etag, fails on mismatch\n- read with if_none_match: fails on matching etag, succeeds on mismatch\n- write with if_match: overwrites on matching etag, fails on mismatch\n- write with if_none_match: succeeds when file absent, fails when present\n\nTests gracefully skip when the backend does not return etags.\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e"
    },
    {
      "commit": "ada28ff230e03055f0ddd3f8ea8abd3c162a0cf9",
      "tree": "3f4838be6fa3b9b5fa284afbf340ac1360d7346a",
      "parents": [
        "c13db5c3c829e51c84aa276557a3f0812c396221"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Thu Apr 30 15:40:35 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 30 15:40:35 2026 +0800"
      },
      "message": "chore: Update .gitignore to remove bin and build entries (#7460)"
    },
    {
      "commit": "c13db5c3c829e51c84aa276557a3f0812c396221",
      "tree": "06123dd7777efe30ac48bb6d73c3bd28db88566e",
      "parents": [
        "1458b4973e2be62b5c47e859dd2ca8420e99e09b"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Tue Apr 28 13:08:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 13:08:46 2026 +0800"
      },
      "message": "feat(bindings/python): add behavior tests for stat (#7447)\n\nThe Python bindings had behavior tests for read, write, copy, rename,\nlist, delete, exists, and check, but no tests for the stat method.\n\nThis commit adds focused behavior tests for both sync and async stat:\n- stat on a file returns correct metadata\n- stat on a non-existent path raises NotFound\n- stat on a directory returns is_dir\u003dTrue\n- stat metadata fields (content_length, etag, content_type) are accessible\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e"
    },
    {
      "commit": "1458b4973e2be62b5c47e859dd2ca8420e99e09b",
      "tree": "8b44c83441ed933a63eec377c8cd80aaec5abf15",
      "parents": [
        "71fc10ae9e2e8e23b9438c9ac59c33359a32811a"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Tue Apr 28 12:53:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 12:53:48 2026 +0800"
      },
      "message": "ci(bindings/ocaml): avoid unnecessary dune cache install (#7457)"
    },
    {
      "commit": "71fc10ae9e2e8e23b9438c9ac59c33359a32811a",
      "tree": "725af3cd155c0ff01fd72a488894552465d90f6d",
      "parents": [
        "a5de7064afd2da9f91c6030eb1a328c22e4486a2"
      ],
      "author": {
        "name": "TennyZhuang",
        "email": "zty0826@gmail.com",
        "time": "Tue Apr 28 11:24:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 11:24:41 2026 +0800"
      },
      "message": "ci(bindings/ocaml): upgrade setup-ocaml to v3 to fix opam release download (#7455)\n\nThe ocaml/setup-ocaml@v2 action fails with:\n\"Could not retrieve the opam release matching the version constraint\"\n\nThis is because v2 cannot find matching opam binaries for current\nrunners. setup-ocaml@v3 (specifically \u003e\u003dv3.6.1) adds fallback logic\nfor opam releases and resolves this issue.\n\nChanges:\n- .github/actions/setup-ocaml/action.yaml: bump v2 -\u003e v3\n- Remove opam-depext parameter (not supported in v3)\n- Remove outdated comment about setup-ocaml/issues/872\n\nCo-authored-by: tianyizhuang \u003ctianyizhuang@tianyizhuangs-Mac-mini.local\u003e"
    },
    {
      "commit": "a5de7064afd2da9f91c6030eb1a328c22e4486a2",
      "tree": "c18cf833de73553062e8d5f2219c92ade7d4d528",
      "parents": [
        "ec30d16b7c1e77689e5e51deabb7974d2565d83a"
      ],
      "author": {
        "name": "ForwardXu",
        "email": "forwardxu315@gmail.com",
        "time": "Tue Apr 28 09:48:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 09:48:41 2026 +0800"
      },
      "message": "ci(s3): use curl -fLO to follow redirect when downloading mc (#7429)\n\nThe previous \u0027curl -O\u0027 did not follow HTTP redirects, so only a 141-byte\nredirect HTML body was saved as \u0027mc\u0027, causing:\n\n    ./mc: line 1: a: No such file or directory\n\nAdding -L makes curl follow the redirect and download the real binary,\nwhile -f makes curl fail fast on HTTP errors."
    },
    {
      "commit": "ec30d16b7c1e77689e5e51deabb7974d2565d83a",
      "tree": "d7c3b8685f954cd440bfd0386a4a71511e3bf4f4",
      "parents": [
        "d69cde5f7e18b7c3c91fe4402561f416668adb4d"
      ],
      "author": {
        "name": "tison",
        "email": "wander4096@gmail.com",
        "time": "Tue Apr 28 00:27:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 28 00:27:37 2026 +0800"
      },
      "message": "ci: drop skipStagingRepositoryClose for smoother staging (#7436)\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e"
    },
    {
      "commit": "d69cde5f7e18b7c3c91fe4402561f416668adb4d",
      "tree": "710cc7eefac5863fc5524baed9bb56fb0394e57c",
      "parents": [
        "0fce5ecbfff2f41b9767823df8d6a7375910766c"
      ],
      "author": {
        "name": "Fatorin",
        "email": "sksly789@gmail.com",
        "time": "Mon Apr 27 19:19:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 19:19:52 2026 +0800"
      },
      "message": "ci(bindings/dotnet): drive releases via workflow_dispatch with previe… (#7422)"
    },
    {
      "commit": "0fce5ecbfff2f41b9767823df8d6a7375910766c",
      "tree": "05968491a1acea1294209fbb446dd2eff4577c11",
      "parents": [
        "a3e4b24cd9a069f759f3a9229081cc52c5178da4"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Mon Apr 27 18:44:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 18:44:39 2026 +0800"
      },
      "message": "ci: fix release workflows for actions allowlist (#7432)"
    },
    {
      "commit": "a3e4b24cd9a069f759f3a9229081cc52c5178da4",
      "tree": "a24de0a5bfcf3b1829ddeda7dda6f72b1bf3ead9",
      "parents": [
        "a01984c58c33c5217f222ca4c170b80317cbdd17"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Mon Apr 27 16:52:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 16:52:10 2026 +0800"
      },
      "message": "docs: update changelog for v0.56.0 rc3 (#7431)"
    },
    {
      "commit": "a01984c58c33c5217f222ca4c170b80317cbdd17",
      "tree": "5a51f298c6e80a4a1e18426197e4a2916b222eff",
      "parents": [
        "f385a8e5c598dc36fe869a55175fb1400148f3a8"
      ],
      "author": {
        "name": "Chojan Shang",
        "email": "psiace@apache.org",
        "time": "Fri Apr 24 03:07:55 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 24 11:07:55 2026 +0900"
      },
      "message": "chore(license): add licensing comments to stub_gen.rs (#7426)"
    },
    {
      "commit": "f385a8e5c598dc36fe869a55175fb1400148f3a8",
      "tree": "91fe6e9b20ab88692cf5b53336759a9a6a5530c5",
      "parents": [
        "dab8ef22ce0d9532abdfd32e3142d8c5229c7f39"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Sun Apr 19 18:34:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 09:34:48 2026 +0800"
      },
      "message": "fix(s3): fix dead code to strip suffix (#7411)\n\n* fix(s3): fix dead code to strip suffix\n\n* fix region test"
    },
    {
      "commit": "dab8ef22ce0d9532abdfd32e3142d8c5229c7f39",
      "tree": "30520bcc7d44623ee073add467bf07de7d6aa899",
      "parents": [
        "28789836b400c4f2e8ca9c951f2648c4874b3d4e"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Sun Apr 19 18:34:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 09:34:17 2026 +0800"
      },
      "message": "fix(chaos): fix cases when error ratio \u003d 1 (#7412)"
    },
    {
      "commit": "28789836b400c4f2e8ca9c951f2648c4874b3d4e",
      "tree": "5075324b6c2b75225219758c5330414b41260fb3",
      "parents": [
        "8332367dd7629bebc7759a11a5bbbd941dd060e9"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Sun Apr 19 18:10:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 09:10:14 2026 +0800"
      },
      "message": "feat(s3): by default quite batch delete s3 objects (#7415)"
    },
    {
      "commit": "8332367dd7629bebc7759a11a5bbbd941dd060e9",
      "tree": "5a845fd2e6b86d17aad8c5526b3996f178788d65",
      "parents": [
        "82720486fa407f8da0b6ded1023562051481bcd2"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Fri Apr 17 08:04:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 08:04:40 2026 +0800"
      },
      "message": "fix: address clippy lints on Rust 1.95 (#7395)\n\n* fix: address clippy lints on Rust 1.95\n\n* fix(odev): satisfy Rust 1.95 clippy"
    },
    {
      "commit": "82720486fa407f8da0b6ded1023562051481bcd2",
      "tree": "7d9e88d6510fd7d847b780e6f2f5e617d4095952",
      "parents": [
        "2f3b9807fcc7f5bd94edfd9a529be526b75ed459"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Fri Apr 17 07:29:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 17 07:29:43 2026 +0800"
      },
      "message": "chore(release): prepare v0.56.0 release (#7392)\n\n* chore(release): prepare v0.56.0 release\n\n* docs: keep v0.55 upgrade notes and add v0.56 section\n\n* fix(ci): repair generated nodejs binding and dotnet retries"
    },
    {
      "commit": "2f3b9807fcc7f5bd94edfd9a529be526b75ed459",
      "tree": "b9e2c0fdea242f3fcb5a0e1099a1f14cba973f26",
      "parents": [
        "6909efcdfd12b3b2ac3a76f654c35ee576811512"
      ],
      "author": {
        "name": "flaneur",
        "email": "me.ssword@gmail.com",
        "time": "Thu Apr 16 17:16:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 17:16:16 2026 +0800"
      },
      "message": "feat: Add foyer service (#7160)\n\n* first commit to introduce Foyer as a service\n\n* use bincode for FoyerKey\n\n* rm unused examples/foyer_service.rs\n\n* fix register_foyer_service\n\n* allow lazy initialize foyer client\n\n* refactor the builder with uri\n\n* feat: add hybrid cache options in FoyerConfig\n\n* fix cargo fmt\n\n* fix taplo fmt\n\n* fix doctest\n\n* refactor(services/foyer): simplify foyer uri config\n\n---------\n\nCo-authored-by: Xuanwo \u003cgithub@xuanwo.io\u003e"
    },
    {
      "commit": "6909efcdfd12b3b2ac3a76f654c35ee576811512",
      "tree": "74314e71a6c61b7f686352997a37d15703704b8b",
      "parents": [
        "a0c1d81237f9a558e8682ec3d24773f865d3ceea"
      ],
      "author": {
        "name": "Oleks V",
        "email": "comphead@users.noreply.github.com",
        "time": "Wed Apr 15 23:06:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 14:06:16 2026 +0800"
      },
      "message": "feat: `get_ranges` 2x performance degradation  (#7380)\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n* feat: read HDFS ranges concurrently\n\n---------\n\nCo-authored-by: ovoievodin \u003co_voievodin@apple.com\u003e"
    },
    {
      "commit": "a0c1d81237f9a558e8682ec3d24773f865d3ceea",
      "tree": "4f38857c87350348d975fc9eb78162ab9fc021d8",
      "parents": [
        "2dcaf91aa38b238c22ea176ce2fc09a5611705cf"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Tue Apr 14 14:52:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 14:52:14 2026 +0800"
      },
      "message": "ci: temporarily disable gdrive behavior tests (#7385)"
    },
    {
      "commit": "2dcaf91aa38b238c22ea176ce2fc09a5611705cf",
      "tree": "feb7644d5726ed4b2f07669451c804246579d4a2",
      "parents": [
        "1755db1da44e0aad050cb1d62aebbb0b64266037"
      ],
      "author": {
        "name": "Santiago Pereyra Marchetti",
        "email": "santiagopereyramarchetti@gmail.com",
        "time": "Tue Apr 14 03:07:42 2026 -0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 14:07:42 2026 +0800"
      },
      "message": "feat(services/azfile): return write metadata (#7381)\n\nCo-authored-by: spereyra-dev \u003cspereyra-dev@users.noreply.github.com\u003e"
    },
    {
      "commit": "1755db1da44e0aad050cb1d62aebbb0b64266037",
      "tree": "c706d9350a33d1789635d5409d5b993b5ff8c9fa",
      "parents": [
        "0ff42a571cf27f93e67405ffa4d69aad91d51d99"
      ],
      "author": {
        "name": "Suyan",
        "email": "suyanhanx@gmail.com",
        "time": "Fri Apr 10 11:38:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 11:38:14 2026 +0800"
      },
      "message": "fix(services/cos): preserve list metadata etag and last_modified (#7331)"
    },
    {
      "commit": "0ff42a571cf27f93e67405ffa4d69aad91d51d99",
      "tree": "7f5025db4bbdc9b884f50d53c9d529caf31780d4",
      "parents": [
        "ecf840b04afd2be109830b9978ba89759adfee79"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Fri Apr 10 11:37:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 11:37:44 2026 +0800"
      },
      "message": "deps(core): bump reqwest to 0.13 (#7365)\n\n* deps(core): bump reqwest to 0.13\n\n* style(ci): format tracing cargo manifest\n\n* fix(tracing): enable otlp trace feature\n\n* deps(services/hf): bump reqwest to 0.13"
    },
    {
      "commit": "ecf840b04afd2be109830b9978ba89759adfee79",
      "tree": "af370c2c585c6868dc830138c6a437c0d375f69c",
      "parents": [
        "cd568fe62323a3aa1aad58f3a21443738c104944"
      ],
      "author": {
        "name": "Krisztián Szűcs",
        "email": "szucs.krisztian@gmail.com",
        "time": "Fri Apr 10 04:38:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 10:38:22 2026 +0800"
      },
      "message": "fix(hf): include folder deletions in git commit payload (#7375)\n\n* fix(services/hf): include folder deletions in git commit payload\n\n* test(behavior): skip remove_all_with_prefix_exists for Hugging Face git repos"
    },
    {
      "commit": "cd568fe62323a3aa1aad58f3a21443738c104944",
      "tree": "f6b42431187d639cb501fcbb63b098f42adc947a",
      "parents": [
        "a3cd6b085b474d89f3951774d5859e0cd537ed0f"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Fri Apr 10 10:37:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 10:37:29 2026 +0800"
      },
      "message": "ci: migrate seafile fixture to 13.x (#7373)\n\n* ci: migrate seafile fixture to 13.x\n\n* fix(services/seafile): implement native create_dir"
    },
    {
      "commit": "a3cd6b085b474d89f3951774d5859e0cd537ed0f",
      "tree": "df90bd2568cd24cbaeb11d40067394d0647785d8",
      "parents": [
        "2a12e2d12e39b882df31e478d999b7db3b44ea01"
      ],
      "author": {
        "name": "Krisztián Szűcs",
        "email": "szucs.krisztian@gmail.com",
        "time": "Fri Apr 10 04:37:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 10:37:16 2026 +0800"
      },
      "message": "fix(core): spawn blocking ops onto worker pool to avoid stack overflow (#7371)\n\n* fix(core): spawn blocking ops onto worker pool to avoid stack overflow\n\nblocking::Operator previously called Handle::block_on() which polls the\nentire async state machine on the calling thread\u0027s stack. For backends\nwith deep async call chains (e.g. HF/XET uploads going through retry\nlayers, bridge_async, upload commits, and CAS streams), this can exceed\nthe default 1 MB thread stack on Linux — causing SIGSEGV in the Java\nbinding where JVM threads use this default.\n\nReplace direct block_on() calls with spawn() + block_on(JoinHandle) for\nthe main I/O operations (stat, read, write, copy, rename, delete, list,\ncreate_dir). The async future now runs on tokio worker threads (which\nhave adequate stack space) while the calling thread only waits on a\nlightweight JoinHandle.\n\nCloses #7367\n\n* chore: cargo format"
    },
    {
      "commit": "2a12e2d12e39b882df31e478d999b7db3b44ea01",
      "tree": "8163a006f30bafd1503d291eeebbd8e5114533cf",
      "parents": [
        "9595f8ca0fcd2b0b5794ff633d26f203a6c2c3d1"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Fri Apr 10 00:26:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 00:26:23 2026 +0800"
      },
      "message": "fix(core): trim metadata debug output (#7366)"
    },
    {
      "commit": "9595f8ca0fcd2b0b5794ff633d26f203a6c2c3d1",
      "tree": "7694f1005620fdfa70431886b6089659f4419054",
      "parents": [
        "8d3dbcc3ef6a38a3ed2a6610cf826ef51dbe9013"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Fri Apr 10 00:25:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 00:25:59 2026 +0800"
      },
      "message": "ci(hf): isolate CI repos and stabilize binding tests (#7368)\n\n* fix(services/hf): bind xet session to active runtime\n\n* test(bindings): gate hf bucket list suites on create dir\n\n* ci(hf): use temporary repos per CI job to avoid concurrent commit races\n\nHF dataset tests were failing with 412 errors because multiple CI jobs\n(core, Go, Node.js, Java) committed to the same shared git-based repo\nsimultaneously. Each job now creates its own temporary HF repo/bucket\nand deletes it after the job via a node20 action post-run hook.\n\n* Revert \"test(bindings): gate hf bucket list suites on create dir\"\n\nThis reverts commit 3d88e0fd58c9f4c21dcc4b9fd6dba48828fd9bba.\n\n* Revert \"fix(services/hf): bind xet session to active runtime\"\n\nThis reverts commit 6a39f4e8e043579f1c42d626e11ce5ce83ca3b9c.\n\n* ci(bindings/java): disable hf behavior tests\n\n* ci(bindings/java): reference hf issue in test plan\n\n* refactor(services/hf): clarify core client naming\n\n* fix(tests): restore hf list gating and recursive delete\n\n* revert(core): keep simulate generic\n\n* fix(ci): create hf buckets via bucket endpoint\n\n* style: format hf test updates\n\n* fix(ci): ensure hf temp repos use unique names\n\n* fix(services/hf): retry branch update conflicts\n\n* fix(services/hf): classify branch update conflicts as temporary\n\n* docs(services/hf): explain branch update retries\n\n* fix(services/hf): cache xet metadata across retries\n\n* docs(services/hf): explain writer retry reentrancy\n\n* fix(services/hf): ignore virtual directories in git deletes\n\n* test(core): skip hf remove_all_basic\n\n* test(core): gate hf remove_all_basic skip\n\n* test(core): skip hf recursive delete behavior\n\n---------\n\nCo-authored-by: Krisztian Szucs \u003cszucs.krisztian@gmail.com\u003e"
    },
    {
      "commit": "8d3dbcc3ef6a38a3ed2a6610cf826ef51dbe9013",
      "tree": "96a1d5b2861c0574829a0d8afefbb07f469437d3",
      "parents": [
        "5e2fb81824733a593ddbe4223c657d3e6703697c"
      ],
      "author": {
        "name": "Krisztián Szűcs",
        "email": "szucs.krisztian@gmail.com",
        "time": "Wed Apr 08 11:59:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 17:59:37 2026 +0800"
      },
      "message": "feat(hf): support writing and reading from both http and xet (#7185)\n\n* feat(hf): support writing and reading from both http and xet\n\n* style(hf): cargo and taplo fmt\n\n* build(hf): switch to use github branch as xet-core optional dependency\n\n* fix(hf): support config from options\n\n* fix(hf): only enable write capability if token is provided\n\n* feat(hf): add support for deleting files\n\n* feat(hf): implement BatchDelete instead of OneShotDelete\n\n* feat(hf): retry requests by default\n\n* feat(hf): support multiple upload modes and more thorough testing\n\n* style(hf): run taplo format\n\n* chore(deps): remove tokio dependency and use backon for exponential backoff\n\n* chore(deps): align ctor version in xet\n\n* chore(deps): remove not unused tempfile dependency\n\n* refactor(hf): use a more recent streaming xet client\n\n* chore(hf): remove duplicate deleter tests\n\n* chore(hf): remove essentially unused size field from HfWriter\n\n* chore(hf): update XetClient.write() call after removing progress updater arguments\n\n* feat(hf): add support for buckets repository type\n\n* build(hf): switch to depend on subxet - a tree-shaken single crate version of xet-core\n\n* chore(hf): format cargo toml\n\n* chore(hf): adjustments after rebase\n\n* refactor(hf): make xet a mandatory dependency\n\n* refactor(hf): remove the option to disable xet in runtime\n\n* chore(hf): more explicit error handling\n\n* chore(hf): remove redundant retry logic\n\n* refactor(services/hf): migrate from subxet to xet-core data/cas_client APIs\n\nReplace subxet dependency with direct xet-core crate references (cas_client,\ndata, file_reconstruction, utils). Switch from XetClient to session-based\nFileUploadSession/FileDownloadSession with OnceCell lazy initialization.\n\n* chore(hf): upgrade xet dependency to consolidated xet-data/xet-client crates\n\n* chore(hf): switch xet deps to git ref with range-stream support\n\n* refactor(hf): cache TranslatorConfig instead of sessions, serialize integration tests\n\n- Cache Arc\u003cTranslatorConfig\u003e per read/write direction; create a fresh\n  FileUploadSession/FileDownloadSession per operation so that finalize()\n  on one write doesn\u0027t poison the next\n- Factor repeated config construction into xet_config(token_type)\n- Mark all write/delete integration tests with #[serial] to prevent\n  412 \"commit has happened since\" races on the shared test repo\n- Add serial_test dev-dependency\n\n* chore(hf): migrate to new XetSession API from xet-core PR #747\n\nReplace low-level xet-data/xet-client usage with the new high-level\nsession API from xet_pkg (hf-xet crate, lib name `xet`):\n\n- Single hf-xet dependency replaces xet-client + xet-data\n- ONE cached XetSession per HfCore (write token, serves both reads\n  and writes); removes XetTokenRefresher and TranslatorConfig handling\n- Writer: XetUploadCommit + XetStreamUpload replace FileUploadSession\n  + SingleFileCleaner; no Mutex needed since oio::Write is \u0026mut self\n- Reader: XetDownloadStream replaces DownloadStream; range converted\n  from BytesRange to Option\u003cRange\u003cu64\u003e\u003e for new download_stream() API\n\n* chore(hf): upgrade xet-core to 126f30b9 with per-operation token API\n\nMigrate to the latest xet-core API where CAS auth tokens move from\nsession-level to per-operation (UploadCommitBuilder/DownloadStreamGroupBuilder).\nUse token refresh URLs so xet-core manages JWT lifecycle automatically.\n\n* chore(hf): upgrade xet-core to 014ff2d7, remove XetSessionBuilder endpoint config\n\n* chore(hf): sort Cargo.toml dependencies with taplo\n\n* chore(hf): migrate hf-xet dependency from git to crates.io v1.5.0\n\n* chore(hf): use crates.io hf-xet 1.5.0, clean up per-service tests, fix 404 listing\n\n- Switch hf-xet from pinned git rev to crates.io v1.5.0\n- Remove per-service integration tests that duplicate behavior tests\n- Keep XET read tests (mbpp_operator) and bucket roundtrip test\n- Handle HF 404 as empty listing in HfLister\n- Remove serial_test dependency\n\n* feat(hf): always use XET for writes, fix bucket support, per-session isolation\n\n- Remove regular (base64 inline) write path; always use XET protocol\n- Remove base64 dependency (no longer needed)\n- Remove preupload API and determine_upload_mode\n- Remove create_dir capability (HF doesn\u0027t natively support it, same as S3)\n- Fix bucket tree URL: remove revision segment for buckets\n- Fix bucket stat: use HEAD on resolve URL instead of paths-info API\n- Fix bucket delete: use bucket_batch(DeleteFile) instead of git commit\n- Fix repo_path: convert operator-relative paths to repo-absolute for\n  commit/delete/batch payloads (fixes behavior tests with random root)\n- Create fresh XetSession per operation to avoid concurrent interference\n- Make writer close() retry-safe with CloseState enum tracking progress\n- Handle \"Already completed\" from commit.commit() gracefully on retry\n\n* fix(hf): prefix-based listing, CAS propagation retry\n\n- Restore prefix-based listing: when path doesn\u0027t end with \u0027/\u0027, list\n  parent directory and filter results by prefix. Fixes test_list_prefix,\n  test_list_file_with_recursive, and test_list_dir_with_file_path.\n- Add retry with exponential backoff for CAS propagation delays in\n  register_file(). The XET commit can complete before data is visible\n  to the HF API (bucket_batch or LFS commit). Retries on \"not found\n  in Xet storage\", \"LFS pointer\", and \"Invalid file change\" errors.\n\n* fix(hf): write metadata version mismatch, increase CAS retry delays\n\n- Don\u0027t set version on write metadata (stat doesn\u0027t return commit OID,\n  causing assert_metadata mismatch in test_write_returns_metadata)\n- Increase CAS propagation retry delays to 1s/2s/4s/8s (15s total)\n  to handle slower LFS registration on datasets\n\n* fix(hf): enable SimulateLayer create_dir via write_can_empty\n\n- Add write_can_empty capability so SimulateLayer can implement\n  create_dir by writing a zero-byte file at the directory path\n- Strip trailing \u0027/\u0027 from bucket paths in register_file() since\n  the bucket batch API rejects paths ending with \u0027/\u0027\n\n* revert(hf): remove write_can_empty and trailing slash strip\n\nwrite_can_empty doesn\u0027t help HF because the SimulateLayer writes\nzero-byte files at directory paths, but HF\u0027s directory concept comes\nfrom path hierarchy, not zero-byte objects. The create_dir tests\nremain unsupported (same as before write_can_empty was added).\n\n* fix(tests): gate create_dir-dependent list tests on create_dir capability\n\n8 behavior tests in async_list.rs call op.create_dir() without checking\nthe create_dir capability, causing failures on backends like HF where\ndirectories are implicit from file paths. Add early-return guards\nmatching the pattern already used by other tests (test_stat_dir,\ntest_delete_empty_dir, test_read_with_dir_path).\n\nAlso clean up HF backend: remove .gitkeep/create_dir workarounds,\nremove trailing-slash stripping from bucket_batch, remove .gitkeep\nfiltering from lister.\n\n* ci(hf): rename service dir to hf, add ephemeral bucket and dataset configs\n\nRename .github/services/huggingface to .github/services/hf so the\ntest framework uses OPENDAL_HF_* env vars (matching the hf scheme).\n\nAdd two new CI test variants with ephemeral repos:\n- huggingface_bucket: creates a private bucket per run, deletes after\n- huggingface_dataset: creates a private dataset per run, sequential\n\nBoth use hf CLI for repo lifecycle and 1Password for credentials.\nRepo names include GITHUB_RUN_ID for uniqueness.\n\nRequires 1Password vault entries under services/hf:\n- token (HF write token)\n- owner (HF user or org, e.g., \"opendal\")\n\n* refactor(hf): move XET session management into HfCore\n\n- Add xet_upload_commit() and xet_download_group() to HfCore,\n  encapsulating session creation, token refresh URL and headers\n- Restore XetSession as a field on HfCore (shared factory)\n- Make xet_token_refresh_headers() private\n- Simplify writer: remove CloseState enum, use Option\u003cXetStreamUpload\u003e\n- Simplify reader: replace inline XET setup with core.xet_download_group()\n- Rename upload_commit field to commit in HfWriter\n\n* refactor(hf): rename commit_files/bucket_batch to commit_git/commit_bucket\n\nAlign naming to clearly indicate both methods do the same thing\n(register/delete files) for different repo types:\n- commit_git: git-based repos (model/dataset/space)\n- commit_bucket: bucket repos via NDJSON batch API\n\n* refactor(hf): clean up writer, deleter, config\n\nWriter:\n- Rename commit/stream fields to xet_commit/xet_stream for clarity\n- Move XET CAS finalization into commit() method\n- Rename register_file() to commit()\n- Add docstrings explaining the XET-only upload flow\n\nDeleter:\n- Extract shared NotFound error handling from commit_git/commit_bucket\n\nConfig:\n- Hoist test imports to module level\n\n* refactor(hf): remove custom retry logic from writer\n\nRemove retry_on_cas_delay helper — CAS propagation retries should be\nhandled by OpenDAL\u0027s RetryLayer via temporary error marking, not by\ncustom retry loops in the writer. Simplify commit() to call\ncommit_bucket/commit_git directly.\n\n* refactor(hf): add HfCore::is_bucket() helper\n\nReplace verbose `self.core.repo.repo_type \u003d\u003d RepoType::Bucket` checks\nwith `self.core.is_bucket()` across backend, writer, reader, deleter.\nRemove now-unused RepoType imports from those modules.\n\n* refactor(hf): rename RepoType to HfRepoType, add docstrings\n\n- Rename RepoType to HfRepoType for clarity and namespace consistency\n- Import HfUri and HfRepoType at the top of core.rs\n- Add docstrings to HfCore::is_bucket() and HfCore::uri()\n\n* refactor(hf): remove HfListerWrapper, use bucket tree API natively\n\n- Remove HfListerWrapper — bucket tree API supports recursive\u003dfalse\n  and returns directory entries, so HierarchyLister is unnecessary\n- Simplify list() to always use PageLister\u003cHfLister\u003e\n- Pass recursive\u003dfalse explicitly for buckets (API defaults to recursive)\n- Move is_bucket() from HfCore to HfRepo, use repo.is_bucket() everywhere\n- Default PathInfo.size to 0 (bucket directory entries omit it)\n\n* refactor(hf): tighten visibility, simplify writer, fix error format\n\n* fix(hf): support deletedFolders in git commits, move commit_url to HfRepo\n\n- Add DeletedFolder type and deletedFolders field to git commit payload\n  matching HF\u0027s API which distinguishes file vs folder deletions\n- Split directory paths (trailing /) into deletedFolders, file paths\n  into deletedFiles when committing to git repos\n- Move git_commit_url() from HfUri to HfRepo (commit URL depends on\n  repo, not on a specific file path)\n- Make test_remove_all_with_prefix_exists skip gracefully when the\n  service has real directory semantics\n\n* fix(ci): rename CI actions, use pre-created repos, fix test probe\n\n- Rename huggingface_bucket → hf_bucket, huggingface_dataset → hf_dataset\n- Use pre-created repos with 1Password secrets (ephemeral cleanup can\u0027t\n  run after tests in the current CI action architecture)\n- Fix test_remove_all_with_prefix_exists: use a probe write to detect\n  file/dir coexistence support, keep original test paths intact\n\n1Password entries needed under services/hf:\n- token, bucket_repo_id, dataset_repo_id\n\n* chore(hf): remove unused async-trait dep, move futures to dev-deps"
    },
    {
      "commit": "5e2fb81824733a593ddbe4223c657d3e6703697c",
      "tree": "eb33424bcbbe7a7d38fe01f4a3bf4359e59a4317",
      "parents": [
        "2313ec0863a4d771b88e78b768456153c0b9a718"
      ],
      "author": {
        "name": "Matt Mastracci",
        "email": "matthew@mastracci.com",
        "time": "Wed Apr 08 02:29:14 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 16:29:14 2026 +0800"
      },
      "message": "feat(services/vercel): Add additional options to Vercel cache backend (#7334)\n\n* Add additional options to Vercel cache backend\n\n* Update bindings + example env\n\n---------\n\nCo-authored-by: Xuanwo \u003cgithub@xuanwo.io\u003e"
    },
    {
      "commit": "2313ec0863a4d771b88e78b768456153c0b9a718",
      "tree": "5677d634d6f9b3cd5a4f5b38e7554ecef52014fb",
      "parents": [
        "5f5fb107d45baf2d887d59b4885419e50ab2804c"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Wed Apr 08 01:20:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 16:20:19 2026 +0800"
      },
      "message": "fix(core): fix deadlock for concurrent read and concurrent limit layer (#7346)"
    },
    {
      "commit": "5f5fb107d45baf2d887d59b4885419e50ab2804c",
      "tree": "171ab9fab2e9cae40a734822d547a94f0e54bc23",
      "parents": [
        "17fceb6b3ce1b797412b6b99f09f4c573408c957"
      ],
      "author": {
        "name": "Gergely Nagy",
        "email": "ngg@users.noreply.github.com",
        "time": "Wed Apr 08 10:18:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 16:18:44 2026 +0800"
      },
      "message": "fix(core): use web-time only for wasm32-unknown-unknown target (#7360)\n\nSigned-off-by: Gergely Nagy \u003cngg@ngg.hu\u003e"
    },
    {
      "commit": "17fceb6b3ce1b797412b6b99f09f4c573408c957",
      "tree": "baa5a3f29561482985a8355c6432db65887ae5c5",
      "parents": [
        "c6f3f137cdc5f9b80008aac52797c82d4517c321"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Wed Apr 08 01:18:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 16:18:24 2026 +0800"
      },
      "message": "fix(metrics): fix missing errors total counter (#7357)\n\n* fix(metrics): fix missing errors total counter\n\n* simplify"
    },
    {
      "commit": "c6f3f137cdc5f9b80008aac52797c82d4517c321",
      "tree": "05b67bc2a61883db01be002ff37e59cf1a89f113",
      "parents": [
        "ab9274cf197287239132ef02f6f73327c05a59bb"
      ],
      "author": {
        "name": "Fatorin",
        "email": "sksly789@gmail.com",
        "time": "Wed Apr 08 15:40:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 15:40:30 2026 +0800"
      },
      "message": "feat(bindings/dotnet): standardize naming to OpenDAL and enforce RC releases (#7355)\n\nCo-authored-by: tison \u003cwander4096@gmail.com\u003e"
    },
    {
      "commit": "ab9274cf197287239132ef02f6f73327c05a59bb",
      "tree": "f455a1055dfea0c54251f380bd5a3ae04d63306e",
      "parents": [
        "3665c8ba096b89ca32f52df9a5c408c029560037"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Sat Apr 04 02:16:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 02:16:39 2026 +0800"
      },
      "message": "ci: publish all rust crates in dependency order (#7352)\n\n* ci: publish all split Rust crates\n\n* ci: publish all rust crates in dependency order\n\n* ci: extract rust release planning script"
    },
    {
      "commit": "3665c8ba096b89ca32f52df9a5c408c029560037",
      "tree": "dd3ca031d2015319906a7e7ca4ea7acf06d88f84",
      "parents": [
        "4ea60b0b91b4a14a52663cbfd0299ed99e723aea"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Wed Apr 01 02:28:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 17:28:18 2026 +0800"
      },
      "message": "fix(s3): add missing content write content disposition capability (#7349)"
    },
    {
      "commit": "4ea60b0b91b4a14a52663cbfd0299ed99e723aea",
      "tree": "acece5872d6a3417079f30d44b2f20be264d6d5c",
      "parents": [
        "2562dfbf41da609462be2f4375dd609d6e2e2c31"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Tue Mar 31 18:42:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 18:42:14 2026 +0800"
      },
      "message": "fix(dev): sync release package versions (#7342)"
    },
    {
      "commit": "2562dfbf41da609462be2f4375dd609d6e2e2c31",
      "tree": "9038a33fe9b8615e93b387c1e5cccbf62097d3ca",
      "parents": [
        "b9940269f8c2f7ac4337c3d787557a36a2939d1c"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Tue Mar 31 18:41:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 18:41:15 2026 +0800"
      },
      "message": "docs: refresh split release documentation (#7344)"
    },
    {
      "commit": "b9940269f8c2f7ac4337c3d787557a36a2939d1c",
      "tree": "a24fa42614d756cc492eaa09a57ac18bdb3f0859",
      "parents": [
        "611784f8decbba29ad1471a641edbb3a301c3b80"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Tue Mar 31 18:40:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 18:40:52 2026 +0800"
      },
      "message": "ci: update path filters for split core layout (#7343)"
    },
    {
      "commit": "611784f8decbba29ad1471a641edbb3a301c3b80",
      "tree": "c557a8de5a904e6ccb94db3dcf760b123b93c658",
      "parents": [
        "88815c3be7ec33cdfacc2f5a86bfb6bbed636bdd"
      ],
      "author": {
        "name": "qingfeng-occ",
        "email": "qing.feng@zte.com.cn",
        "time": "Tue Mar 31 18:03:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 18:03:29 2026 +0800"
      },
      "message": "feat(services/hdfs-native): service hdfs-native support high availability (HA) cluster (#7248)\n\nSigned-off-by: qingfeng \u003cqing.feng@zte.com.cn\u003e"
    },
    {
      "commit": "88815c3be7ec33cdfacc2f5a86bfb6bbed636bdd",
      "tree": "ff548f01244983a73087dc97e5e188ef47da41e1",
      "parents": [
        "834d4981f9e99c6a6faae994ce288ff0c862003e"
      ],
      "author": {
        "name": "Suyan",
        "email": "suyanhanx@gmail.com",
        "time": "Tue Mar 31 18:03:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 18:03:05 2026 +0800"
      },
      "message": "fix(bindings/ocaml): clean up OCaml API docs (#7332)\n\n* fix(bindings/ocaml): clean up OCaml API docs\n\n* docs(bindings/ocaml): fix invalid example syntax"
    },
    {
      "commit": "834d4981f9e99c6a6faae994ce288ff0c862003e",
      "tree": "7e16dc2319d146743c286d42a7ec25b743701cb8",
      "parents": [
        "d3bd6eb633244c120d90502c17650c0365241245"
      ],
      "author": {
        "name": "Brice Arnould",
        "email": "unbrice@vleu.net",
        "time": "Tue Mar 31 12:01:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 18:01:47 2026 +0800"
      },
      "message": "feat(services/sftp): add write_with_if_not_exists support (#7251)\n\nfeat(services/sftp): Add write_with_if_not_exists support\n\nEnable the write_with_if_not_exists capability for the SFTP service.\nOpenSSH servers return a generic SSH_FX_FAILURE when an exclusive create fails.\nTo accurately report ErrorKind::ConditionNotMatch, the implementation performs\na post-check stat to confirm the file\u0027s existence. This approach preserves\nserver-side atomicity while ensuring consistent error reporting."
    },
    {
      "commit": "d3bd6eb633244c120d90502c17650c0365241245",
      "tree": "f66e32d8ef77c5f9e55c73df97921d99538c1711",
      "parents": [
        "69114d2715ce3863b77b84392050aa1c3dc85037"
      ],
      "author": {
        "name": "Matt Mastracci",
        "email": "matthew@mastracci.com",
        "time": "Mon Mar 30 23:10:57 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 13:10:57 2026 +0800"
      },
      "message": "fix(services/azblob): Remove let-chain for Rust 1.85 support (#7336)\n\nfix(services/azblob): Remove let-chain for Rust 1.85"
    },
    {
      "commit": "69114d2715ce3863b77b84392050aa1c3dc85037",
      "tree": "3f066c5fc7b4e10dc91f165ed83fac79c3709873",
      "parents": [
        "993b00e6b59333c20273a61939644dc5b3e57fc9"
      ],
      "author": {
        "name": "Fatorin",
        "email": "sksly789@gmail.com",
        "time": "Mon Mar 30 20:27:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 20:27:05 2026 +0800"
      },
      "message": "feat(bindings/dotnet):Bindings dotnet publish to nuget (#7323)\n\n* feat(dotnet): Update project settings and add release workflow for DotOpenDAL\n\n* fix(dotnet): Update OSX target architecture from x86_64 to arm64\n\n* fix(dotnet): Update AsyncState to include Context property and improve cancellation handling"
    },
    {
      "commit": "993b00e6b59333c20273a61939644dc5b3e57fc9",
      "tree": "3581a0dfdeeab29b4fa1f953d67f5ef114798434",
      "parents": [
        "87d6145702992f80f6bbc7ca0d697d4f74a563b0"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Fri Mar 27 03:02:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 27 18:02:06 2026 +0800"
      },
      "message": "fix(s3): fix missing complete multipart upload headers (#7327)"
    },
    {
      "commit": "87d6145702992f80f6bbc7ca0d697d4f74a563b0",
      "tree": "f054389a43465b229ed0f14cffd350568d8ad775",
      "parents": [
        "8232a8d6ee279f26b1e8c4ee61171f9599a6fcf0"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu Mar 26 08:19:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 23:19:23 2026 +0800"
      },
      "message": "fix(correctess check): validate copy capability and request (#7322)"
    },
    {
      "commit": "8232a8d6ee279f26b1e8c4ee61171f9599a6fcf0",
      "tree": "70624747b738f06ccd403c8c0d70aa40abdde5dd",
      "parents": [
        "d6a69f6d635ea854f09645b5eab17900787fad5f"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu Mar 26 08:19:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 23:19:01 2026 +0800"
      },
      "message": "fix(correctness check): add missing conditional write capability check (#7320)"
    },
    {
      "commit": "d6a69f6d635ea854f09645b5eab17900787fad5f",
      "tree": "fd3546c946967fa1a2bd2002d8548434814a2ea0",
      "parents": [
        "7129069a80604a694e20a3a75dde8a1115e4127f"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu Mar 26 08:18:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 23:18:33 2026 +0800"
      },
      "message": "fix(copy): Fix error propagation operation (#7318)"
    },
    {
      "commit": "7129069a80604a694e20a3a75dde8a1115e4127f",
      "tree": "7338fb931d700aa1f71c3dfda4c030e0a2f13af9",
      "parents": [
        "e9ae021ee9a5a08d4eddbb6ad716414f83535801"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu Mar 26 08:18:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 23:18:07 2026 +0800"
      },
      "message": "fix(util): Fix panic on invalid bytes range (#7314)\n\n* fix(util): Fix panic on invalid bytes range\n\n* 0 size -\u003e invalid"
    },
    {
      "commit": "e9ae021ee9a5a08d4eddbb6ad716414f83535801",
      "tree": "c98ed23d9d41309527674863385090ff1da6d9c6",
      "parents": [
        "c8cfb19f011f6c9692e77a86b398cea7a24641c0"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu Mar 26 08:17:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 23:17:04 2026 +0800"
      },
      "message": "feat(s3): validate checksum before making HTTP requests (#7296)"
    },
    {
      "commit": "c8cfb19f011f6c9692e77a86b398cea7a24641c0",
      "tree": "07e599c6949ee34b607ad133feb58015ad7f0a94",
      "parents": [
        "173feb6d22a35d176e354bd5e20e2802dc28b93f"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Thu Mar 26 04:38:52 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 19:38:52 2026 +0800"
      },
      "message": "fix(delete): poll deleter close future on exit (#7316)"
    },
    {
      "commit": "173feb6d22a35d176e354bd5e20e2802dc28b93f",
      "tree": "ae684237b9c0edd04fdc4344a4c0958d31332cce",
      "parents": [
        "7f32b1ba925666827b125d94f15af6f79847a58b"
      ],
      "author": {
        "name": "Oleks V",
        "email": "comphead@users.noreply.github.com",
        "time": "Wed Mar 25 22:46:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 13:46:07 2026 +0800"
      },
      "message": "chore: Bump `object_store` to 0.13, `datafusion` to 53.0.0 (#7243)\n\n* chore: Bump `object_store` to 0.13, `datafusion` to 52.3.0\n\n* chore: Bump `object_store` to 0.13, `datafusion` to 52.3.0\n\n* chore: Bump `object_store` to 0.13, `datafusion` to 53.0.0\n\n* chore: Bump `object_store` to 0.13, `datafusion` to 53.0.0\n\n* chore: Bump `object_store` to 0.13, `datafusion` to 53.0.0\n\n* chore: Bump `object_store` to 0.13, `datafusion` to 53.0.0\n\n* chore: Bump `object_store` to 0.13, `datafusion` to 53.0.0\n\n* chore: Bump `object_store` to 0.13, `datafusion` to 53.0.0\n\n---------\n\nCo-authored-by: ovoievodin \u003co_voievodin@apple.com\u003e"
    },
    {
      "commit": "7f32b1ba925666827b125d94f15af6f79847a58b",
      "tree": "571ae4ee04d33da5773d21d05748c8dc3122fb57",
      "parents": [
        "11c49fc51c545881838390e95e00ff78ff39e863"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Wed Mar 25 04:27:15 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 19:27:15 2026 +0800"
      },
      "message": "fix(s3): Fix entry mode and raw entry assertion (#7308)"
    },
    {
      "commit": "11c49fc51c545881838390e95e00ff78ff39e863",
      "tree": "2a4a5bbe6f57c758d5de65be8c379c04c9817cee",
      "parents": [
        "16c4543414c04ea71c45d035005a10aac94f1511"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Wed Mar 25 12:47:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 12:47:53 2026 +0800"
      },
      "message": "ci(fixtures): pin owncloud image tag (#7305)"
    },
    {
      "commit": "16c4543414c04ea71c45d035005a10aac94f1511",
      "tree": "3b84dc800ec4129fba63c8bf460428e8af84f4b0",
      "parents": [
        "cc1f90bbf53ed95cf9827336b7dd645fb71f6d72"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Tue Mar 24 20:56:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 11:56:47 2026 +0800"
      },
      "message": "fix(observability): Fix failed operation/request gauge on timeout (#7303)\n\n* fix(observability): Fix failed operation/request gauge on timeout\n\n* track error status on poll failure or timeout"
    },
    {
      "commit": "cc1f90bbf53ed95cf9827336b7dd645fb71f6d72",
      "tree": "e72c2ce04f8981fc6d0470e23398a884493d74c4",
      "parents": [
        "60d58fc0e99a92b225c68651ba9071bf423e11ab"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Tue Mar 24 11:53:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 02:53:54 2026 +0800"
      },
      "message": "fix(s3): fix incorrect md5 for list operations (#7298)"
    },
    {
      "commit": "60d58fc0e99a92b225c68651ba9071bf423e11ab",
      "tree": "7b5c1c2b5706be52db1d10e1bd75010d871915df",
      "parents": [
        "285919bc073556ba92192cd6f5c52b55dfe6fca7"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Tue Mar 24 11:36:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 25 02:36:03 2026 +0800"
      },
      "message": "fix(observability): fix executing operation gauge on timeout (#7301)"
    },
    {
      "commit": "285919bc073556ba92192cd6f5c52b55dfe6fca7",
      "tree": "ae5bc58cb7fecb76747ec57b6e5a478f2ec5d261",
      "parents": [
        "7c901f77552f60f90d86093d5ec80f3eaa4adb02"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Tue Mar 24 18:54:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 18:54:58 2026 +0800"
      },
      "message": "ci: pin approved GitHub Actions refs (#7290)\n\n* ci: pin approved GitHub Actions refs\n\n* ci: avoid 1Password configure subpath action"
    },
    {
      "commit": "7c901f77552f60f90d86093d5ec80f3eaa4adb02",
      "tree": "bd171a85507d894f9385ebb3ecc47f668fb474ea",
      "parents": [
        "22e673117ab9e92e9521fd1ca48137bd385a29d8"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Tue Mar 24 03:54:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 18:54:47 2026 +0800"
      },
      "message": "fix(tracing): fix trace span instrumentation (#7292)\n\n* fix(tracing): fix trace span instrumentation\n\n* formart"
    },
    {
      "commit": "22e673117ab9e92e9521fd1ca48137bd385a29d8",
      "tree": "8307f747da5e07940c1eeb6d21a229a648986a5c",
      "parents": [
        "51d61b503612ca9c7b1c32c9f4556a6752da3d85"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Tue Mar 24 03:53:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 18:53:59 2026 +0800"
      },
      "message": "fix(s3): Fix improper handle for copy response (#7294)\n\n* fix(s3): Fix improper handle for copy response\n\n* comment\n\n* format"
    },
    {
      "commit": "51d61b503612ca9c7b1c32c9f4556a6752da3d85",
      "tree": "dbd8910864a91ce8dc5ae812f64bb1966adeeddf",
      "parents": [
        "0f45d6aff459c4cddbbd8432027455801115db49"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Tue Mar 24 01:59:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 16:59:02 2026 +0800"
      },
      "message": "fix(reader): Fix reader fetch with empty ranges (#7286)"
    },
    {
      "commit": "0f45d6aff459c4cddbbd8432027455801115db49",
      "tree": "2de52b1734d57a36ca82cec723fdd6367a664c35",
      "parents": [
        "fbf6924563bb34380674a31a3c448898e0a7b630"
      ],
      "author": {
        "name": "Xuanwo",
        "email": "github@xuanwo.io",
        "time": "Tue Mar 24 14:49:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 14:49:38 2026 +0800"
      },
      "message": "refactor(core): route reqsign send via accessor http client (#7234)\n\n* refactor(core): route reqsign send via accessor http client\n\n* code tidy (#7235)\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e\n\n* refactor(core): upgrade reqsign to 3.0.0\n\n---------\n\nSigned-off-by: tison \u003cwander4096@gmail.com\u003e\nCo-authored-by: tison \u003cwander4096@gmail.com\u003e"
    },
    {
      "commit": "fbf6924563bb34380674a31a3c448898e0a7b630",
      "tree": "ddfea025ac83c385522c094ac6c4c59b8dc575c4",
      "parents": [
        "ffc9d97f94c734065b57323839a889ea0297e0be"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Mon Mar 23 23:38:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 14:38:34 2026 +0800"
      },
      "message": "fix(reader): fix potential out-of-bound seek (#7282)"
    },
    {
      "commit": "ffc9d97f94c734065b57323839a889ea0297e0be",
      "tree": "a50b381aa8d54f4b8dd6829b0e229b593a29eb4e",
      "parents": [
        "f6a70fd8487a377a64f0d51cea24df30e3c76618"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Mon Mar 23 22:04:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 13:04:26 2026 +0800"
      },
      "message": "fix(layers/timeout): Fix timeout wrapper for delete operation (#7279)\n\nfix(timeout): Fix timeout wrapper for deletion"
    },
    {
      "commit": "f6a70fd8487a377a64f0d51cea24df30e3c76618",
      "tree": "a37ae25d9f3942b84ce65a78432e28b14acaed70",
      "parents": [
        "90328cf176519bf4acd3cb4629a1884655127ba4"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Mon Mar 23 21:57:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 12:57:45 2026 +0800"
      },
      "message": "fix(doc): Fix documentation on multipart upload (#7272)"
    },
    {
      "commit": "90328cf176519bf4acd3cb4629a1884655127ba4",
      "tree": "69fdf24751b1f6a04fc6461f73f9a3abfbfb99ca",
      "parents": [
        "53c4d83e6fcac2bb462f74dbf0c9039d77670886"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Mon Mar 23 21:56:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 12:56:38 2026 +0800"
      },
      "message": "fix(s3): respect content encoding for multipart upload initialization (#7274)"
    },
    {
      "commit": "53c4d83e6fcac2bb462f74dbf0c9039d77670886",
      "tree": "617041a8803e0fc9623614e8ebb5bb86d5cc18c5",
      "parents": [
        "bc6e2e4f889dd08268a3188e74e6c6c3b0f82b82"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Mon Mar 23 21:54:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 12:54:49 2026 +0800"
      },
      "message": "fix(s3): Fix missing user-provided write operation for S3 on presign (#7276)"
    },
    {
      "commit": "bc6e2e4f889dd08268a3188e74e6c6c3b0f82b82",
      "tree": "a523c7ca7c8c2133fa2641507828dbb0986b0d21",
      "parents": [
        "195a7931b61a350863c31c37e004d1e48b9e3449"
      ],
      "author": {
        "name": "dentiny",
        "email": "dentinyhao@gmail.com",
        "time": "Mon Mar 23 21:53:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 12:53:25 2026 +0800"
      },
      "message": "fix(observability): do not account processed entries count when the list operation returns none (#7269)"
    }
  ],
  "next": "195a7931b61a350863c31c37e004d1e48b9e3449"
}
