)]}'
{
  "log": [
    {
      "commit": "b06e9fee7de070a4984a419d7c322c28cf82857d",
      "tree": "6a3cabcc712be8bc067d94b4d52471a5fa9e310a",
      "parents": [
        "1fe57668093cb26004277d5f5e21393871d0ed79"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 23:21:51 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 17:21:51 2026 -0500"
      },
      "message": "feat(catalog/sql): support renaming views (#2532)\n\n* feat(catalog/sql): support renaming views\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* feat(catalog): expose view rename capability\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "1fe57668093cb26004277d5f5e21393871d0ed79",
      "tree": "ada99139ed4458051d322562edb2cf89333dd98f",
      "parents": [
        "59a237668bb762a270fc60e10a587353b3ac3390"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 23:16:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 17:16:52 2026 -0500"
      },
      "message": "perf(table): project filter columns for position deletes (#2543)\n\n* perf(table): project filter columns for position deletes\n\nSigned-off-by: fallintoplace \u003c38443830+fallintoplace@users.noreply.github.com\u003e\n\n* test(table): cover nested scan projection\n\n---------\n\nSigned-off-by: fallintoplace \u003c38443830+fallintoplace@users.noreply.github.com\u003e"
    },
    {
      "commit": "59a237668bb762a270fc60e10a587353b3ac3390",
      "tree": "07128b32c3b22ef1d811cb274295e95640bad26b",
      "parents": [
        "1c59703419dea8e486d2f851d527a0fd4ec9ee20"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 23:16:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 17:16:24 2026 -0500"
      },
      "message": "feat(table): configure Parquet read page limits (#2544)\n\n* feat(table): configure Parquet read page limits\n\nSigned-off-by: fallintoplace \u003c38443830+fallintoplace@users.noreply.github.com\u003e\n\n* docs(table): clarify Parquet page limit scope\n\n---------\n\nSigned-off-by: fallintoplace \u003c38443830+fallintoplace@users.noreply.github.com\u003e"
    },
    {
      "commit": "1c59703419dea8e486d2f851d527a0fd4ec9ee20",
      "tree": "c5f19b69714775227f5f1665537d5cd1de3e4197",
      "parents": [
        "92476e48dccb59c31eff790d7909b93cca72f680"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 22:47:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 16:47:38 2026 -0500"
      },
      "message": "fix(table): return errors from delete record readers (#2541)\n\n* fix(table): return errors from delete record readers\n\nSigned-off-by: fallintoplace \u003c38443830+fallintoplace@users.noreply.github.com\u003e\n\n* test(table): use delete file target for error paths\n\n---------\n\nSigned-off-by: fallintoplace \u003c38443830+fallintoplace@users.noreply.github.com\u003e"
    },
    {
      "commit": "92476e48dccb59c31eff790d7909b93cca72f680",
      "tree": "aeefe30fd5f9d3c7a8b91a48b048ad914d7fb321",
      "parents": [
        "4a6aa67bc78d29745c487495e7419832313dddda"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Wed Nov 11 15:45:48 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 16:45:48 2026 -0500"
      },
      "message": "feat(rest): support rest.auth.type\u003dsigv4 and keep the delegate Authorization header (#2547)\n\n* feat(rest): support rest.auth.type\u003dsigv4 and keep the delegate Authorization header\n\n* docs(release): note SigV4 keeps the token as Original-Authorization"
    },
    {
      "commit": "4a6aa67bc78d29745c487495e7419832313dddda",
      "tree": "3389c502e87a949992cafbaa1ccf66142fdd8eec",
      "parents": [
        "5cd34f485805824098048e78ec1bb711689ecbe9"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 22:42:51 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 16:42:51 2026 -0500"
      },
      "message": "feat(table): support per-column Parquet statistics settings (#2526)\n\n**What**\n\n- Support `write.parquet.stats-enabled.column.*` for data files.\n\n**Why**\n\n- Callers need to choose which Parquet columns store statistics.\n\n**Implementation**\n\n- Resolve logical column names to Parquet paths by field ID.\n- Carry settings through renames and remove them when fields are deleted.\n- Keep delete-file statistics independent from data-column settings.\n\n**References**\n\n- [Spec: file metrics and statistics](https://iceberg.apache.org/spec/#field-level-metrics-and-statistics)\n- [Java: column statistics settings](https://github.com/apache/iceberg/blob/014b3ce5ffbf7c1c51dabb144f4d94e45addcd88/parquet/src/main/java/org/apache/iceberg/parquet/Parquet.java#L361-L376)\n- [Java: settings during schema changes](https://github.com/apache/iceberg/blob/014b3ce5ffbf7c1c51dabb144f4d94e45addcd88/core/src/main/java/org/apache/iceberg/SchemaUpdate.java#L506-L529)"
    },
    {
      "commit": "5cd34f485805824098048e78ec1bb711689ecbe9",
      "tree": "bdf3101f37aa9e99b1ccccef2c3e95178793db84",
      "parents": [
        "6f4b91d71c3aa9445ee107d6cceebf951ce454f2"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 22:18:54 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 16:18:54 2026 -0500"
      },
      "message": "feat(table): support delete-specific Parquet settings (#2529)\n\n* feat(table): support delete-specific Parquet settings\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): accept Java Parquet setting values\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): validate delete Parquet settings independently\n\n* refactor(table): share Parquet codec parsing\n\n* fix(table): ignore data Bloom settings for delete writes\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "6f4b91d71c3aa9445ee107d6cceebf951ce454f2",
      "tree": "79f53d50ea22db39c255393f07bc067c1bcf9560",
      "parents": [
        "4a931b04dbfb4f50f08d94178d7bdb14278b8e92"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 22:15:45 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 16:15:45 2026 -0500"
      },
      "message": "fix(literals): match Java float ordering (#2514)\n\n* fix(literals): match Java float ordering\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): preserve signed-zero predicate semantics\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): keep signed zero set pruning conservative\n\n* test(table): cover signed zero deletes for regular writes\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "4a931b04dbfb4f50f08d94178d7bdb14278b8e92",
      "tree": "0409749814ce30e3fbd87bfe4189b27b786b5871",
      "parents": [
        "a34aaed680785b3d92a14a3efb5b02b5527145d6"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 22:09:57 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 16:09:57 2026 -0500"
      },
      "message": "feat(table): normalize changelog rows and compute update images (#2536)\n\n* feat(table): normalize changelog rows and compute update images\n\nSigned-off-by: fallintoplace \u003c38443830+fallintoplace@users.noreply.github.com\u003e\n\n* perf(table): gather normalized changelog rows in batches\n\n---------\n\nSigned-off-by: fallintoplace \u003c38443830+fallintoplace@users.noreply.github.com\u003e"
    },
    {
      "commit": "a34aaed680785b3d92a14a3efb5b02b5527145d6",
      "tree": "8c6eeb21ae13b692e36fe8fd878c02fbbea95584",
      "parents": [
        "e006e876d7fc61e9e540b4a121eba005ea38f1fc"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 22:03:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 16:03:11 2026 -0500"
      },
      "message": "feat(table): support per-column Parquet compression (#2524)\n\n* feat(table): support per-column Parquet compression\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* refactor(table): simplify Parquet column compression overrides\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* style(table): format Parquet column compression tests\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): preserve column properties across schema evolution\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* style(table): format column property tests\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "e006e876d7fc61e9e540b4a121eba005ea38f1fc",
      "tree": "254e5574109eeb3d4a2deb392bc3454ec3a588bc",
      "parents": [
        "198dc9ec98bad41759eb34fc6d911b0faf78c72b"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 21:56:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:56:39 2026 -0500"
      },
      "message": "feat(catalog/dynamodb): implement DynamoDB catalog (#2535)\n\n* feat(catalog/dynamodb): implement DynamoDB catalog\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(catalog/dynamodb): handle commit conflicts and namespace checks\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "198dc9ec98bad41759eb34fc6d911b0faf78c72b",
      "tree": "b1956414ee79f05ac601c057af3f0da9cb4db2f7",
      "parents": [
        "c17940e8794650d660f9cedcd14bbe21bb919da9"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 21:45:28 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:45:28 2026 -0500"
      },
      "message": "feat(table): support delete target file size (#2528)\n\n* feat(table): support delete target file size\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* docs: document delete-file size upgrade behavior\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "c17940e8794650d660f9cedcd14bbe21bb919da9",
      "tree": "15d5fbaeddb1b85a423964535c9246abed71fb85",
      "parents": [
        "43f24d3efbb722122a102774473ac7cd140de282"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 21:34:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:34:42 2026 -0500"
      },
      "message": "feat(encryption/awskms): add AWS KMS client (#2531)\n\n* feat(encryption/awskms): add AWS KMS client\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(encryption/awskms): honor kms.endpoint in registry\n\nLoad registry-managed AWS KMS clients with the configured service endpoint.\nCover Encrypt, Decrypt and GenerateDataKey through the registry loader.\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* style(encryption/awskms): format endpoint regression test\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "43f24d3efbb722122a102774473ac7cd140de282",
      "tree": "4a149e10728b1d2fd259521ba3995a3f5f268703",
      "parents": [
        "592809dee9d48a92c4e0e15fa58416e302029b79"
      ],
      "author": {
        "name": "Shruthi",
        "email": "sruthi1reddy3@gmail.com",
        "time": "Wed Nov 11 12:33:36 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:33:36 2026 -0500"
      },
      "message": "fix(table): reject duplicate field IDs when creating table metadata (#2475)\n\n* fix(table): reject duplicate field IDs when creating table metadata\n\nCloses #2393\n\nSigned-off-by: Shruthi Yaramada \u003cshrutyar@amazon.com\u003e\n\n* refactor(table): keep duplicate field ID check unexported, add compatibility note\n\nSigned-off-by: Shruthi Yaramada \u003cshrutyar@amazon.com\u003e\n\n---------\n\nSigned-off-by: Shruthi Yaramada \u003cshrutyar@amazon.com\u003e\nCo-authored-by: Shruthi Yaramada \u003cshrutyar@amazon.com\u003e"
    },
    {
      "commit": "592809dee9d48a92c4e0e15fa58416e302029b79",
      "tree": "c603fe8ab820b4baaf8e01d58c7dd5597b001faf",
      "parents": [
        "8dc22069a491ec234815ac3a10ffccbf32414dbc"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Wed Nov 11 14:33:09 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:33:09 2026 -0500"
      },
      "message": "feat(rest): support rest.auth.type\u003dbasic (#2538)"
    },
    {
      "commit": "8dc22069a491ec234815ac3a10ffccbf32414dbc",
      "tree": "97a333c663276dfba541183d73316f42470029e6",
      "parents": [
        "cd78cdcfb7a4796583ad0d227660e71333c5b20f"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 21:27:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:27:39 2026 -0500"
      },
      "message": "fix(table): project missing equality delete fields (#2482)\n\n* fix(table): project missing equality delete fields\n\n* fix(table): satisfy linter in equality projection\n\n* refactor(table): share missing equality field projection\n\n* fix(table): key read plans by equality fields\n\n* fix(table): preserve physical rows in equality delete projections\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "cd78cdcfb7a4796583ad0d227660e71333c5b20f",
      "tree": "0876fcb10ce99ea7e4cea514905ef7f2615674d1",
      "parents": [
        "f515561aecc3c30285af520ef6767e2f206dd934"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 21:24:50 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 15:24:50 2026 -0500"
      },
      "message": "feat(catalog): add view version rollback helper (#2534)\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "f515561aecc3c30285af520ef6767e2f206dd934",
      "tree": "e44e29df41a7e3b3c66e57d02bd0423c695643a2",
      "parents": [
        "3bf14fc0c4d08db52e7022f52379d5dea4f574a9"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 19:06:47 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 13:06:47 2026 -0500"
      },
      "message": "fix(schema): preserve 64-bit JSON defaults (#2494)\n\n* fix(schema): preserve 64-bit JSON defaults\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(schema): preserve nested default number precision\n\nUse json.Number for values in object and list defaults, cover map/list\nand non-long expression cases, and document the decoding change.\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(view): fix invalid long defaults in metadata fixture\n\n* style(schema): fix long default decoding lint\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "3bf14fc0c4d08db52e7022f52379d5dea4f574a9",
      "tree": "860cf705f2499a12a8f7b52cab631622a8f378ea",
      "parents": [
        "d560930ed4d7eb44890860895b339ce8605499db"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 18:52:57 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 12:52:57 2026 -0500"
      },
      "message": "fix(table): write small-precision decimals as Parquet integers (#2527)\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "d560930ed4d7eb44890860895b339ce8605499db",
      "tree": "602b60cd368c289e2f4334d53b2f490615da2844",
      "parents": [
        "7cff263a6d95909bd4bd8457257e90b152d5d9f7"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 18:52:23 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 12:52:23 2026 -0500"
      },
      "message": "fix(table): isolate object-store paths across tables (#2499)\n\n* fix(table): isolate external object-store paths\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* docs: note external object-store path compatibility\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "7cff263a6d95909bd4bd8457257e90b152d5d9f7",
      "tree": "32bd70e7db9cd9093af7f07ca285b39312fd24f2",
      "parents": [
        "0d6657c406b2418c86462236f74fb0cf707a79bf"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 18:51:45 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 12:51:45 2026 -0500"
      },
      "message": "feat(table): support sort order replacement in transactions (#2438)\n\nAdd the transaction sort-order replacement builder with staged schema binding,\ntransform validation, historical order reuse, and scoped case-insensitive\nname collision checks. Cover the behavior with regression tests and docs."
    },
    {
      "commit": "0d6657c406b2418c86462236f74fb0cf707a79bf",
      "tree": "48804d644369662108c7c20060b5835088b76eab",
      "parents": [
        "968530942605bfc1359edaed09ff90d4b5510d93"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Wed Nov 11 11:24:57 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 12:24:57 2026 -0500"
      },
      "message": "feat(rest): select authentication with rest.auth.type and add Google auth (#2502)\n\n* feat(rest): select authentication with rest.auth.type and add Google auth\n\n* docs(rest): note that Google token requests skip the catalog transport\n\n* test(rest): use maps.Copy in auth registry test helper"
    },
    {
      "commit": "968530942605bfc1359edaed09ff90d4b5510d93",
      "tree": "cd4c65ecfc672b7432ae07a441fcd08e0989fc2a",
      "parents": [
        "8986b1ad07207c9e73292863e02f91697cd9d0b1"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 13:26:16 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 13:26:16 2026 +0100"
      },
      "message": "refactor(table): preserve removals from single-use manifest iterators (#2509)"
    },
    {
      "commit": "8986b1ad07207c9e73292863e02f91697cd9d0b1",
      "tree": "01b86085d626c8190230a6bc3ff497b170231712",
      "parents": [
        "271c6a6b660051d183452590e6c742f9d3aa8590"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 11:37:59 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 11:37:59 2026 +0100"
      },
      "message": "feat(table,cli): support snapshot branch promotion (#2384)"
    },
    {
      "commit": "271c6a6b660051d183452590e6c742f9d3aa8590",
      "tree": "6230427661ec10495880d42c8671e81e77778346",
      "parents": [
        "df0fe9a488985734575e21cf8999c5e68e4e1e6d"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 11 11:34:45 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 11:34:45 2026 +0100"
      },
      "message": "refactor(io)!: add context to rename operations (#2450)"
    },
    {
      "commit": "df0fe9a488985734575e21cf8999c5e68e4e1e6d",
      "tree": "1fa481741512f30eccd8484675fd4b4c47375f49",
      "parents": [
        "a073e6d3dd4b5c7091ce0941df4c0014e62ca4b3"
      ],
      "author": {
        "name": "Rahul Shivu Mahadev",
        "email": "51690557+rahulsmahadev@users.noreply.github.com",
        "time": "Wed Nov 11 02:08:41 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 11 11:08:41 2026 +0100"
      },
      "message": "feat(catalog/rest): use the REST spec User-Agent format (#2516)\n\nSend iceberg-go/\u003cversion\u003e (go \u003cgo version\u003e) as the default User-Agent,\nfollowing the format recommended by the REST catalog spec\n(apache/iceberg#17727). Headers configured by the caller still take\nprecedence over the default."
    },
    {
      "commit": "a073e6d3dd4b5c7091ce0941df4c0014e62ca4b3",
      "tree": "37405df0f7eac741db1fb482188b8abfdaaa4174",
      "parents": [
        "759fff94c2f4a8310543700d1b6e0b9167d7ff75"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 22:37:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 16:37:42 2026 -0500"
      },
      "message": "fix(table): omit negative snapshot ref retention (#2506)\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "759fff94c2f4a8310543700d1b6e0b9167d7ff75",
      "tree": "bbdaf7340dbe6a5bec3e868e0d03819bfd5ce4c9",
      "parents": [
        "8b487ffa3934567cba05ed296503ed8c924cb89e"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 22:36:51 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 16:36:51 2026 -0500"
      },
      "message": "fix(table): preserve snapshot encryption key IDs (#2505)\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "8b487ffa3934567cba05ed296503ed8c924cb89e",
      "tree": "61846a8fa62a3f72812c5316995ecef9671fb6c5",
      "parents": [
        "7c93b271c97ed8424cfacb1bf9140b51e6e93309"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 22:36:20 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 16:36:20 2026 -0500"
      },
      "message": "fix(literals): compare decimals across scales (#2504)\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "7c93b271c97ed8424cfacb1bf9140b51e6e93309",
      "tree": "ad834b6c27fd8fc0a30183b63f03be2d27f324bb",
      "parents": [
        "fd938954ba8638db84f9e087e0be2633056c0267"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 22:34:19 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 16:34:19 2026 -0500"
      },
      "message": "fix(table): preserve multi-source partition IDs (#2503)\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "fd938954ba8638db84f9e087e0be2633056c0267",
      "tree": "e8a778ffa98290e463d678bcf3cbbbacfdec3651",
      "parents": [
        "00397437f0949bdfe9bd829f8c28c6fcdb6e03f0"
      ],
      "author": {
        "name": "Akriti",
        "email": "akriti.shakya@datazip.io",
        "time": "Wed Nov 11 02:57:02 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 16:27:02 2026 -0500"
      },
      "message": "fix(table): treat ErrDataFilesMissing as a terminal validation error (#2463)\n\n* Make ErrDataFilesMissing terminal instead of retryable\n\n* Fix doc comments and drop the release note\n\n* Address review comments\n\n* Document ErrDataFilesMissing as terminal"
    },
    {
      "commit": "00397437f0949bdfe9bd829f8c28c6fcdb6e03f0",
      "tree": "50f0f32a1d5a97d8411b33c1bee33993b9d7cbe5",
      "parents": [
        "722126d0e1e19932544b5e36e28479e8b47b8fe5"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 20:58:26 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 14:58:26 2026 -0500"
      },
      "message": "fix(dv): write row-position field metadata (#2501)\n\n* fix(dv): write row-position field metadata\n\n* test(dv): remove redundant file close"
    },
    {
      "commit": "722126d0e1e19932544b5e36e28479e8b47b8fe5",
      "tree": "4685904027a865ca3c771d09b4bd74da5c68d9e6",
      "parents": [
        "548f83f28d24dc75a9abc55c50bc5c0f3a4a7675"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 20:48:51 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 14:48:51 2026 -0500"
      },
      "message": "fix(table): treat missing null counts as unknown (#2498)\n\n* fix(table): treat missing null counts as unknown\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(table): use testify in NOT STARTS WITH metrics cases\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "548f83f28d24dc75a9abc55c50bc5c0f3a4a7675",
      "tree": "4ffca7ef7aecc9c411ae19149a06fb8b7581cfbd",
      "parents": [
        "68c2f00274855163e98a73ad252b561853ec6262"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 20:46:03 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 14:46:03 2026 -0500"
      },
      "message": "fix(puffin): reject missing required footer fields (#2497)\n\n* fix(puffin): reject missing required footer fields\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(puffin): simplify footer validation diagnostics\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "68c2f00274855163e98a73ad252b561853ec6262",
      "tree": "cb3bd953c9e1b82d19a3e914317d521d6bd42106",
      "parents": [
        "2314aefaa03fce1a7eb226dacde2c23f735459b7"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 20:25:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 14:25:42 2026 -0500"
      },
      "message": "fix(types): reject timestamp-to-nanosecond overflow (#2500)\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "2314aefaa03fce1a7eb226dacde2c23f735459b7",
      "tree": "03a213afa10e4ca2e648503a19c869a942829087",
      "parents": [
        "739d6ac2aca80fe4474ea1804a576e8f437d9948"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Tue Nov 10 12:35:08 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 13:35:08 2026 -0500"
      },
      "message": "refactor: use nested type constructors in catalog, cmd and view tests (#2496)"
    },
    {
      "commit": "739d6ac2aca80fe4474ea1804a576e8f437d9948",
      "tree": "d8784200b45f78e2bd297b64d94d9ce170a5ee93",
      "parents": [
        "80ec6372925b16e8a2c8210864d75577681d2fd2"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 19:25:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 13:25:21 2026 -0500"
      },
      "message": "fix(table): preserve multi-source sort IDs (#2495)\n\nfix(table): preserve multi-source sort IDs during reassignment\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "80ec6372925b16e8a2c8210864d75577681d2fd2",
      "tree": "3a880a6dfdee5a18e3eb77f1c19290afbd99a92e",
      "parents": [
        "7998201aa25863bacfa3d1ce68535fb51549b9cc"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 19:22:16 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 13:22:16 2026 -0500"
      },
      "message": "fix(literals): decode bounds after numeric type promotion (#2493)\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "7998201aa25863bacfa3d1ce68535fb51549b9cc",
      "tree": "e416fd20ffb89fcc8780b20c063a894c5a026cfe",
      "parents": [
        "1efc21ed132754971df193308845bc65f5e1388b"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 19:19:20 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 13:19:20 2026 -0500"
      },
      "message": "fix(schema): validate identifier field IDs (#2481)\n\n* fix(schema): validate identifier fields before metadata serialization\n\n* fix(table): reject invalid row identifiers during schema writes\n\n* test(schema): cover identifier ID constraints and JSON round trips\n\n* test(table): reject invalid identifiers before committing schemas\n\n* test(schema): use a valid identifier in round-trip fixture\n\n* test(view): correct invalid identifier in metadata fixture\n\n* fix(schema): address identifier validation review"
    },
    {
      "commit": "1efc21ed132754971df193308845bc65f5e1388b",
      "tree": "073f7f732ce3079517ceba280fe441d97bd1064f",
      "parents": [
        "87fae3d0cd06ded02796120fb25c24c358a53c13"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 19:15:02 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 13:15:02 2026 -0500"
      },
      "message": "fix(table): normalize promoted equality delete keys (#2474)\n\n* fix(table): normalize promoted equality delete keys\n\n* fix(table): allow date promotion for equality delete keys\n\n* test(table): cover promoted equality key encoding\n\n* test(table): assert equality delete results through promotion\n\n* refactor(table): require typed equality delete encoders\n\n* refactor(table): centralize equality delete type validation\n\n* test(table): assert surviving long row after equality delete promotion\n\n* test(table): cover changelog equality key promotion and required types\n\n* test(table): initialize equality delete key types in fixtures\n\n* test(table): initialize equality delete key types in fixtures\n\n* test(table): initialize equality delete key types in fixtures\n\n* test(table): initialize equality delete key types in fixtures\n\n* test(table): initialize equality delete key types in fixtures\n\n* style(table): group equality delete test imports\n\n* test(table): complete synthetic equality delete type metadata\n\n* perf(table): use long delete index for promoted int values"
    },
    {
      "commit": "87fae3d0cd06ded02796120fb25c24c358a53c13",
      "tree": "2ae4a80a43e416805e2d213be09c1e6eaa94f136",
      "parents": [
        "00b99bd0f43ace091e6fcb3f8bce38584da17620"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 18:40:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:40:24 2026 -0500"
      },
      "message": "feat(table): cherry-pick snapshots (#2382)\n\n* feat(table): cherry-pick append snapshots\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* perf(table): skip inherited manifests during snapshot cherry-pick\n\nOnly manifests created by the source snapshot can contain its added entries.\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): fast-forward directly applicable cherry-picks\n\n* test(table): cover cherry-pick fast-forward and v3 row lineage\n\n* test(table): exercise non-append cherry-picks only on divergent branches\n\n* test(table): verify direct fast-forward of overwrite snapshots\n\n* fix(table): prevent forged WAP publication on cherry-pick\n\n* fix(table): avoid propagating staged WAP IDs on cherry-pick\n\n* fix(table): avoid propagating staged WAP IDs on cherry-pick\n\n* test(table): verify cherry-pick preserves source WAP provenance\n\n* fix(table): clarify unsupported cherry-pick operations\n\n* test(table): reject cherry-picking files already live on target\n\n* style(table): satisfy nlreturn in cherry-pick regression test\n\n* test(table): cover v1 snapshot cherry-pick\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): avoid name mapping changes during cherry-pick\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(table): preserve name mapping on cherry-pick\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): reject cherry-picks when target ancestry is incomplete\n\n* test(table): reject cherry-picks with omitted target ancestors\n\n* fix(table): retain typed missing-source error with refs-mode hint\n\n* test(table): document refs-mode hint on missing cherry-pick source\n\n* docs(table): explain expired ancestry in cherry-pick validation\n\n* fix(table): make snapshot cherry-picks safe under retries and partial history\n\n* test(table): cover cherry-pick WAP ancestry and partition spec evolution\n\n* test(table): guard cherry-pick of source published on main concurrently\n\n* fix(table): call partition spec ID on addressable values\n\n* test(table): fix cherry-pick test lint\n\n* test(table): strengthen cherry-pick branch and history coverage\n\n* fix(table): address cherry-pick concurrency and REST history review\n\n* test(table): check concurrent main head on cherry-pick replay\n\n* fix(table): preserve refs-only history on staged tables\n\n* test(rest): guard cherry-picks on staged refs-only tables\n\n* test(rest): use offline IO for refs-only cherry-pick lifecycle\n\n* test(table): seed branch retention in base metadata for cherry-pick\n\n* fix(table): pass context to cherry-pick manifest readers\n\n* test(table): cover WAP validation on cherry-pick fast-forward\n\n* fix(table): retry cherry-pick fast-forwards\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(table): remove unused cherry-pick test assignment\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "00b99bd0f43ace091e6fcb3f8bce38584da17620",
      "tree": "3a04330abd1ff03ae4405d3b61aa0ab6f7c8a0ac",
      "parents": [
        "89aac66d2fd9449473e5c688d3553cf2c8d74d02"
      ],
      "author": {
        "name": "Shivam Sharma",
        "email": "192242476+ShivamSharma43@users.noreply.github.com",
        "time": "Tue Nov 10 23:07:04 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:37:04 2026 -0500"
      },
      "message": "fix(view): reuse existing versions from base metadata (#2470)\n\nReplacing a view with a definition it already had (for example,\nreverting to an earlier query) failed with \"duplicate version-id\".\naddVersion found the matching version and reused its ID, but only\nskipped the append if the version had been added in the current\nbuilder. Versions from the base metadata were appended again.\n\nReturn the existing version ID whenever the version is already known,\nas Java\u0027s ViewMetadata.Builder.addVersionInternal does. The last added\nversion ID is only set when the version was added in this builder.\n\nSigned-off-by: Shivam Sharma \u003c192242476+ShivamSharma43@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "89aac66d2fd9449473e5c688d3553cf2c8d74d02",
      "tree": "e89c5c18f4a462eecfe8975cb5e5870f753d243b",
      "parents": [
        "730e028e3aeb786bbdacdadaad161d1a168d1639"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 18:35:58 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:35:58 2026 -0500"
      },
      "message": "feat(table): convert equality deletes to deletion vectors (#2434)\n\n**What**\n- Convert v3 equality deletes to file-specific deletion vectors.\n\n**Why**\n- Reduce repeated equality-delete work in later CDC scans.\n\n**Implementation**\n- Read each data file targeted by an applicable equality delete.\n- Commit the conversion in one replace snapshot.\n- Reject conversion when an unscoped or partition-scoped position delete would remain.\n- Reject concurrent first DVs in merge-on-read `DELETE` with `ErrConflictingDeleteFiles`.\n- A concurrent branch commit may fail with `ErrCommitFailed`; refresh and retry.\n- Abandoned staged transactions may leave Puffin files for orphan cleanup.\n\n**Benchmark**\n- Same synthetic local scan: one 10k-row file with 10% deletes: upstream/main 2.062 ms / 3.10 MB; branch 1.648 ms / 2.81 MB (median of 3 runs).\n\n**References**\n- Java [BaseDVFileWriter](https://github.com/apache/iceberg/blob/main/core/src/main/java/org/apache/iceberg/deletes/BaseDVFileWriter.java) and [DeleteFile](https://github.com/apache/iceberg/blob/main/api/src/main/java/org/apache/iceberg/DeleteFile.java).\n- Iceberg spec: [Deletion Vectors](https://iceberg.apache.org/spec/#deletion-vectors) and [Equality Delete Files](https://iceberg.apache.org/spec/#equality-delete-files)."
    },
    {
      "commit": "730e028e3aeb786bbdacdadaad161d1a168d1639",
      "tree": "beca3b37739fe7029ca21b8403301e354c5f7915",
      "parents": [
        "7cec336696e9785e9a68fb3537d0759c62903259"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 18:35:26 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:35:26 2026 -0500"
      },
      "message": "feat(table): compare live files between snapshots (#2394)\n\n* feat(table): compare live files between snapshots\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): reject duplicate live files in snapshot comparisons\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): identify non-vector content files by path in snapshot diffs\n\n* test(table): reject content-path collisions and changed file types\n\n* fix(table): make snapshot file diff scalable and align inspection API\n\n* test(table): use modern Go pointer expressions for DV range cases\n\n* test(table): avoid assuming manifest order in branch diff test\n\n* style(table): fix snapshot diff test formatting\n\n* fix(table): drain parallel manifest readers and simplify test fixtures\n\n* test(table): cover branch deletes in physical snapshot diffs\n\n* fix(table): reject deletion vectors without referenced data files\n\n* fix(table): pass context when reading snapshot diff manifests\n\n* refactor(table): use public manifest provider in snapshot diffs\n\n* fix(table): remove slice capacities from manifest iterators\n\n* test(table): cover snapshot diff edge cases\n\n* style(table): format snapshot diff test literals\n\n* docs: align snapshot file diff support marker\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "7cec336696e9785e9a68fb3537d0759c62903259",
      "tree": "e42b175a4fa886287ebdc910f10f9212035231b4",
      "parents": [
        "748dfa4443da4019cb4d76df834cca968cceb47a"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 18:27:14 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:27:14 2026 -0500"
      },
      "message": "feat(table): support transaction table location updates (#2435)\n\n* feat(table): support transaction table location updates\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(table): account for implicit branch ref requirement\n\n* fix(table): resolve staged location and properties for transaction writes\n\n* fix(table): write transaction data files under the staged table location\n\n* fix(table): write staged position deletes under the updated location\n\n* fix(table): write equality deletes under the transaction location\n\n* fix(table): write transaction manifests using staged paths\n\n* fix(table): write transaction partition stats using staged paths\n\n* test(table): cover relocated data and manifest paths in transactions\n\n* test(table): retain existing file references after location updates\n\n* test(table): cover staged equality-delete file locations\n\n* fix(table): address location update review findings\n\n* style(table): format location regression test spacing\n\n* fix(table): correct staged compaction and manifest test calls\n\n* fix(table): reject Azure container moves in SetLocation\n\n* test(table): cover staged overwrite, CoW and position-delete paths\n\n* style(table): format transaction location regression tests\n\n* test(table): read old and relocated data files after table reload\n\n* test(table): verify all files added by location update snapshots\n\n* fix(table): honor staged location in dynamic partition overwrite\n\n* test(table): cover relocated partition overwrite across multiple partitions\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "748dfa4443da4019cb4d76df834cca968cceb47a",
      "tree": "a50ab9bfcb19e916b9bbf95202f48df975aab2d4",
      "parents": [
        "e1023497d4fe6aff28d24d85c7503f98c8b2b623"
      ],
      "author": {
        "name": "Shivam Sharma",
        "email": "192242476+ShivamSharma43@users.noreply.github.com",
        "time": "Tue Nov 10 22:55:51 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:25:51 2026 -0500"
      },
      "message": "fix(table): omit snapshot totals the parent summary does not report (#2490)\n\nupdateSnapshotSummaries read a missing or unparseable previous total as\n0, so a new snapshot could report e.g. total-data-files\u003d1 on a table\nwith thousands of files when the parent summary lacked that total.\n\nWrite a total only when the previous one is present, parses and is\nnon-negative, matching Java\u0027s SnapshotProducer.updateTotal. A nil\nprevious summary still starts every total at 0.\n\nSigned-off-by: Shivam Sharma \u003c192242476+ShivamSharma43@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "e1023497d4fe6aff28d24d85c7503f98c8b2b623",
      "tree": "aebdf724bbbe156a6ce826991e1fa9235a793197",
      "parents": [
        "c59ac5c1bb14ef42c55671d3483f49e7b318f60f"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 18:25:16 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:25:16 2026 -0500"
      },
      "message": "fix(table): keep both signed zeros in Parquet Bloom predicates (#2480)\n\n* fix(table): keep both signed zeros in Parquet Bloom predicates\n\n* style(table): format signed-zero Bloom predicate tests\n\n* style(table): separate Bloom pruning returns"
    },
    {
      "commit": "c59ac5c1bb14ef42c55671d3483f49e7b318f60f",
      "tree": "327e3f5735e289fbe6d7c64f2b2a31f28047da23",
      "parents": [
        "fc8a68fea54bb8ca09e565b4257ed5945e117dc2"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 18:23:50 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:23:50 2026 -0500"
      },
      "message": "fix(table): skip missing v1 manifest lists during snapshot cleanup (#2477)\n\n* fix(table): skip missing v1 manifest lists during snapshot cleanup\n\n* style(table): format v1 snapshot expiry test"
    },
    {
      "commit": "fc8a68fea54bb8ca09e565b4257ed5945e117dc2",
      "tree": "70a8ea5585bf99f0ebe060398aa16c2926854a5d",
      "parents": [
        "055371ab8c31e62e15fcfbc479a55fd173b3502d"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 18:23:33 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:23:33 2026 -0500"
      },
      "message": "perf(table): prune manifests for dynamic partition overwrite (#2447)\n\n* perf(table): prune manifests for dynamic partition overwrite\n\nUse partition summaries to avoid opening unrelated manifests during Arrow\noverwrite planning while retaining incomplete summaries and older-spec\nmanifests conservatively. Keep duplicate-path checks for prewritten files.\n\nAdd coverage for incomplete summaries and unreliable old-spec counts.\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* style(table): simplify iterator declarations\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "055371ab8c31e62e15fcfbc479a55fd173b3502d",
      "tree": "3cf3d4798836a5d0b39d57ae1af79d3fd96a4a82",
      "parents": [
        "4ca8e06407bc06faf705d142c46da39a8838b117"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Tue Nov 10 18:09:13 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:09:13 2026 -0500"
      },
      "message": "fix(catalog/rest): make ErrEndpointNotSupported an ErrNotImplemented (#2488)\n\nAn operation the server does not advertise failed with an error that did\nnot match iceberg.ErrNotImplemented, though a server answering 501 for the\nsame operation produces one. catalogtest asserts ErrNotImplemented for a\ncatalog without rename or namespace properties, so it failed against any\nREST server that leaves those optional endpoints out."
    },
    {
      "commit": "4ca8e06407bc06faf705d142c46da39a8838b117",
      "tree": "e8a186f119e917a21ac40365bfe478170ca1685b",
      "parents": [
        "72ace2a8a23b6e57df7ea04bfdaf79a2f8448acb"
      ],
      "author": {
        "name": "Harrison Crosse",
        "email": "harrison@crosse.dev",
        "time": "Tue Nov 10 12:07:34 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 12:07:34 2026 -0500"
      },
      "message": "refactor(table): move stagedReplay into its own file (#2483)\n\nMove `stagedReplay` to `staged_replay.go` because it handles every retried transaction, not only snapshot expiry. `expire_replay.go` keeps expiry replanning and assertions. No behavior changes.\n\nSigned-off-by: Harrison Crosse \u003charrison@crosse.dev\u003e"
    },
    {
      "commit": "72ace2a8a23b6e57df7ea04bfdaf79a2f8448acb",
      "tree": "030c4925a63b85da281af3ee4f1bb0588020c119",
      "parents": [
        "71fd798de8212bc44c3bac5ceb24da4cd70bb212"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Tue Nov 10 10:58:09 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 11:58:09 2026 -0500"
      },
      "message": "refactor: use nested type constructors in root package tests (#2484)"
    },
    {
      "commit": "71fd798de8212bc44c3bac5ceb24da4cd70bb212",
      "tree": "6a985b440355e17d99343696ed9dafe5e46971bf",
      "parents": [
        "59f6074d51df750bb83bc9c44a4e3ee2176cb6a6"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 17:55:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 11:55:24 2026 -0500"
      },
      "message": "fix(table): avoid strict metrics proofs for nested columns (#2478)\n\n* fix(table): avoid strict metrics proofs for nested columns\n\n* test(table): cover nested strict metrics with null parents"
    },
    {
      "commit": "59f6074d51df750bb83bc9c44a4e3ee2176cb6a6",
      "tree": "b732789d633528f26fa6e36b8c9945b96c634579",
      "parents": [
        "0a72dfee24f9b42d1979d23b3c7b236a6bd31695"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 17:53:15 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 11:53:15 2026 -0500"
      },
      "message": "feat(table): read Avro data files (#2398)\n\n* feat(table): read Avro data files\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): honor cancellation while iterating Avro batches\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* style(table): format Avro record reader methods\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): reject unsafe Avro unions and reused file streams\n\n* fix(table): report invalid nested Avro batches without panicking\n\n* fix(table): prevent incompatible Avro timestamp retagging\n\n* test(table): reject incompatible Avro timestamp schemas\n\n* fix(table): resolve Avro scan lint failures\n\n* Avro reader: strengthen validation and resolve Go lint\n\n* Avro format: strengthen validation and resolve Go lint\n\n* test(table): cover reserved field IDs and reader guards\n\n* style(table): gofmt Avro retag regression tests\n\n* fix(table): reject unsupported Avro column selection\n\n* fix(table): bound Avro schema nesting depth\n\n* test(table): reject unsupported Avro projection without consuming reader\n\n* test(table): reject deeply nested Avro schemas\n\n* style(table): gofmt Avro schema validation test\n\n* test(table): cover Avro table reads and field IDs\n\n* test(table): compare Arrow table column count as int64\n\n* fix(table): avoid Avro file I/O on canceled contexts\n\n* test(table): reject canceled Avro opens before I/O\n\n* test(table): scan Avro data files in v1 tables\n\n* fix(table): guard Avro decoder batches and in-flight cancellation\n\n* refactor(table): decode Avro OCF with twmb into Arrow builders\n\n* fix(table): close twmb Avro reader once and validate map values\n\n* style(table): fix Avro reader lint and formatting\n\n* fix(table): preserve Iceberg UUID types in Avro scans\n\n* style(table): address remaining Avro gofumpt and nlreturn checks\n\n* fix(table): satisfy nlreturn in Avro Arrow type mapping\n\n* style(table): fix remaining Avro nlreturn diagnostics\n\n* test(table): cover Avro records across multiple Arrow batches\n\n* chore(table): remove leftover Avro decoder dependencies from go.mod\n\n* chore(table): remove leftover Avro decoder dependencies from go.sum\n\n* style(table): fix nlreturn in Avro Arrow builders\n\n* style(table): separate remaining Avro builder returns\n\n* style(table): resolve remaining Avro nlreturn lint errors\n\n* style(table): fix Avro reader nlreturn lint\n\n* style(table): fix remaining Avro nlreturn lint\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "0a72dfee24f9b42d1979d23b3c7b236a6bd31695",
      "tree": "525d8ba2e61107b99fff242f980d55ee9d84b656",
      "parents": [
        "bc758ef0cd19d950cec5631b2b6a0118e0ee456e"
      ],
      "author": {
        "name": "Neelesh Salian",
        "email": "nssalian@users.noreply.github.com",
        "time": "Tue Nov 10 08:47:30 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 11:47:30 2026 -0500"
      },
      "message": "fix(table): infer small variant integers as int32 when shredding (#2375)\n\n* fix(table): infer small variant integers as int32 when shredding\n\nSigned-off-by: Neelesh Salian \u003cn_salian@apple.com\u003e\n\n* PR comment fixes\n\n* write variant int bounds at the typed column\u0027s width\n\n---------\n\nSigned-off-by: Neelesh Salian \u003cn_salian@apple.com\u003e"
    },
    {
      "commit": "bc758ef0cd19d950cec5631b2b6a0118e0ee456e",
      "tree": "9e3b442d75d7289ea8f87ca71bf2d4cfe8dc9ddc",
      "parents": [
        "be2ab9891961ccca26f9f01b99c8779b6baf37cd"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 17:45:00 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 11:45:00 2026 -0500"
      },
      "message": "fix(view): validate required metadata fields (#2466)\n\n* fix(view): validate required metadata fields\n\n* fix(view): normalize nil required fields and read legacy nulls\n\n* test(view): cover legacy nulls, nil round trips, and SQL fields"
    },
    {
      "commit": "be2ab9891961ccca26f9f01b99c8779b6baf37cd",
      "tree": "bee62cdb93cc5cd3af94905cf917ce3901c5f4bb",
      "parents": [
        "a929eec575ad373b1fa341297a38145ff37eabb9"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Tue Nov 10 17:43:03 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 11:43:03 2026 -0500"
      },
      "message": "refactor(io)!: add context to ReadFileIO.ReadFile (#2449)\n\n* refactor(io)!: add context to ReadFileIO.ReadFile\n\n* test(io): verify ReadFile uses the caller deadline and context\n\n* test(io): cover context-aware and plain FS read cancellation"
    },
    {
      "commit": "a929eec575ad373b1fa341297a38145ff37eabb9",
      "tree": "3769899c865988aa9ba268ecf6c47ee726686484",
      "parents": [
        "9199115b6e8e26d0f2043002cdfc05fcd97f564c"
      ],
      "author": {
        "name": "Andrei Tserakhau",
        "email": "laskoviymishka@gmail.com",
        "time": "Tue Nov 10 00:12:25 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 10 00:12:25 2026 +0100"
      },
      "message": "feat(table)!: retry conflicting commits 4 times by default (#2462)\n\ncommit.retry.num-retries has defaulted to 0 since #912, when a retry\nre-sent the same stale commit. #945 added refresh-and-replay, so that\nreason is gone, and Java and PyIceberg both default to 4. A writer\nported from either client, or sharing a table with them, failed on the\nfirst conflict with nothing in the code pointing at retries.\n\nThe default is now 4, and the docs and a compatibility note say so.\nSetting commit.retry.num-retries to 0 keeps the old fail-fast behavior.\nTests that exercise the no-retry and resume paths now set it explicitly,\nand a new test checks that a conflict is retried within one Commit by\ndefault.\n\nCloses #1015.\nRefs #2062."
    },
    {
      "commit": "9199115b6e8e26d0f2043002cdfc05fcd97f564c",
      "tree": "008c4659e3824145f630fc60d2bac395fc6ccf60",
      "parents": [
        "e561c00b2d0cf57f00c772d88c89c6f5dd3d0d6c"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Mon Nov 09 15:02:13 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 16:02:13 2026 -0500"
      },
      "message": "feat: add nested type constructors and StructType field accessors (#2431)"
    },
    {
      "commit": "e561c00b2d0cf57f00c772d88c89c6f5dd3d0d6c",
      "tree": "22a566824742a6276bb07ca961bc41d91d23ff43",
      "parents": [
        "f4f0f0e760c57a3681041ff21897d640ef4c2afb"
      ],
      "author": {
        "name": "Harrison Crosse",
        "email": "harrison@crosse.dev",
        "time": "Mon Nov 09 15:48:04 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 15:48:04 2026 -0500"
      },
      "message": "fix(table): use one transaction replay path and renew snapshot timestamps (#2468)\n\n* fix(table): replay every retried transaction through stagedReplay\n\n`Transaction.Commit` created `stagedReplay` only for transactions with snapshot expiry. Other retries used `rebuildSnapshotUpdates`, which ignored staged ref moves. After a peer committed to another branch, a retry could undo `RollbackToSnapshot` by rebuilding the following append on the head from before the rollback. A ref reset between two appends could also give the second append the wrong parent.\n\nUse `stagedReplay` for every refreshed attempt and remove `rebuildSnapshotUpdates`. `Transaction.Commit` supplies replay state, and `doCommit` creates it when none is supplied. `stagedReplay.requirements` supplies expiry assertions for each attempt.\n\nIf a staged update cannot apply after refresh, return `ErrTransactionUnusable` for every transaction. Preserve the metadata builder\u0027s cause, including `ErrCommitFailed` for conflicts. A catalog rejection on the first attempt still returns `ErrCommitRejected` and leaves the transaction resumable. A later `Commit` refreshes and replays, and ends the transaction if the update cannot apply.\n\nSigned-off-by: Harrison Crosse \u003charrison@crosse.dev\u003e\n\n* fix(table): renew snapshot timestamps when replaying a retry\n\nA retry kept each staged snapshot\u0027s original timestamp, whether it rebuilt or reused the manifest list. If a peer wrote metadata more than a minute after staging, the metadata builder rejected the snapshot and ended the transaction. Replaying every transaction locally also exposed this rejection for REST catalogs. A server using Java\u0027s `TableMetadata` could accept this retry on a branch other than `main`, or when the peer added no entry to the snapshot log for `main`.\n\nStamp each replayed producer snapshot with the current time, or one millisecond after its parent if that is later. This follows Java\u0027s `SnapshotProducer` timestamp rule. The manifest list, summary and IDs do not carry the timestamp, so renewal changes only the snapshot\u0027s timestamp and metadata derived from it.\n\nThe committed timestamp reflects the successful attempt rather than staging time. If `ExpireSnapshots` was staged after the write in the same transaction, retry replanning keeps the renewed snapshot because it is newer than the expiry cutoff. Java instead expires the snapshot selected on its first attempt.\n\nSigned-off-by: Harrison Crosse \u003charrison@crosse.dev\u003e\n\n---------\n\nSigned-off-by: Harrison Crosse \u003charrison@crosse.dev\u003e"
    },
    {
      "commit": "f4f0f0e760c57a3681041ff21897d640ef4c2afb",
      "tree": "85cedefa8d0c8c60599653a600835ade8c2dc577",
      "parents": [
        "887694fbf014564040c8607cf635af89d76badda"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 21:23:49 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 15:23:49 2026 -0500"
      },
      "message": "fix(table): validate path-scoped position delete partitions (#2471)\n\nfix(table): validate path-scoped position deletes"
    },
    {
      "commit": "887694fbf014564040c8607cf635af89d76badda",
      "tree": "d4da92c6b901d06fc4770dfa833e1a6ea123ed82",
      "parents": [
        "059d0b7ba8cd050c53a83eb75bde17ae655a41f1"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 20:47:18 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 14:47:18 2026 -0500"
      },
      "message": "fix(table): keep main as a branch (#2472)\n\nfix(table): require main snapshot ref to be a branch"
    },
    {
      "commit": "059d0b7ba8cd050c53a83eb75bde17ae655a41f1",
      "tree": "c4a539f8d1d65765f82cfdbb7767f0803ebd8a9c",
      "parents": [
        "170be776b9a9aa93a8dc22a3e61a60b23819999f"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 20:45:57 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 14:45:57 2026 -0500"
      },
      "message": "fix(table): rename void field before reusing its name (#2473)\n\nfix(table): preserve void tombstones when renaming fields"
    },
    {
      "commit": "170be776b9a9aa93a8dc22a3e61a60b23819999f",
      "tree": "02bb5b313a8bdeb0fba699ee1bd6c81f72edb871",
      "parents": [
        "ed823616ba729ee4b1afdd93487d4c80ef934942"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 20:21:40 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 14:21:40 2026 -0500"
      },
      "message": "fix(view): compare metadata properties (#2464)"
    },
    {
      "commit": "ed823616ba729ee4b1afdd93487d4c80ef934942",
      "tree": "bde0ede55efbfe6017367553ae389669a0659c41",
      "parents": [
        "b1206c60aeabb6a9a31f72daccf98305dcf5d759"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 20:18:06 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 14:18:06 2026 -0500"
      },
      "message": "fix(view): snapshot builder properties (#2465)"
    },
    {
      "commit": "b1206c60aeabb6a9a31f72daccf98305dcf5d759",
      "tree": "bc81c8edcb936d92515edf087d12107702f769cf",
      "parents": [
        "7a4fc6c8ca4d344ec385fcede944b7ed2eb84d9c"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 19:23:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 13:23:52 2026 -0500"
      },
      "message": "feat(table): support dynamic partition overwrite (#2381)\n\n* feat(table): support dynamic partition overwrite\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): honor cancellation before dynamic overwrite staging\n\nCheck cancellation before writing files and registering commit requirements.\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): preserve dynamic overwrite semantics for empty and unpartitioned partitions\n\n* test(table): cover unpartitioned dynamic overwrite and new partitions\n\n* perf(table): reuse validated paths during partition overwrite\n\n* test(table): cover v1 dynamic partition overwrite\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(table): verify dynamic overwrite ref pin with commit retries\n\n* fix(table): validate touched partitions on dynamic overwrite\n\n* test(table): cover v3 and mixed-spec dynamic overwrite\n\n* test(table): verify dynamic overwrite retry and branch fencing\n\n* docs(table): clarify partition predicate scope\n\n* test(table): fix partition iterator and assert shape rejection\n\n* test(table): preserve only untouched partition deletes\n\n* style(table): satisfy nlreturn in overwrite helpers\n\n* style(table): satisfy nlreturn in partition test\n\n* fix(table): inherit v3 row IDs during dynamic overwrite\n\n* fix(table): resolve dynamic overwrite lint and test assertion\n\n* test(table): cover null and date dynamic partition overwrites\n\n* test(table): cover dynamic overwrite delete conflicts and DV cleanup\n\n* style(table): satisfy nlreturn in dynamic overwrite tests\n\n* style(table): gofmt dynamic overwrite integration tests\n\n* fix(table): pass context to dynamic overwrite manifest APIs\n\n* test(table): keep main intact on branch dynamic overwrite\n\n* fix(table): preserve old specs in dynamic overwrite\n\n* fix(table): remove unused overwrite locals\n\n* fix(table): preserve deletes for surviving partition-spec data\n\n* fix(table): fence old-spec writes in unpartitioned overwrite retries\n\n* style(table): format dynamic overwrite regression tests\n\n* test(table): filter delete files from dynamic overwrite data assertion\n\n* docs(table): clarify dynamic overwrite with evolved partition specs\n\n* test(table): cover staged dynamic overwrite and Arrow table API\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "7a4fc6c8ca4d344ec385fcede944b7ed2eb84d9c",
      "tree": "cb5f8761b5cb52b277ba6244f7601bf12cf192ac",
      "parents": [
        "4c10131375cb8a9674d90645280d183a3dcefafc"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 19:18:07 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 13:18:07 2026 -0500"
      },
      "message": "feat(table): support data-preserving rewrites by file path (#2383)\n\n* feat(table): stage data-preserving file rewrites by path\n\nRebase on main after partitioned Parquet imports.\nCompare only complete metrics, tolerate missing null and NaN counts,\nand retain missing-column protection with regression tests.\n\n* style(table): gofmt path rewrite metric regression fixture\n\n* fix(table): reject concurrent reuse of path rewrite outputs\n\n* fix(table): pass context when checking rewrite delete entries\n\n* fix(table): pass context when loading transaction entries"
    },
    {
      "commit": "4c10131375cb8a9674d90645280d183a3dcefafc",
      "tree": "b94010d9c8e2ab1f317bbdde0b1a4c1d5bb864e1",
      "parents": [
        "45d5a65c16b8c58bcccd3aa0d699f218a4821cfe"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 19:03:55 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 13:03:55 2026 -0500"
      },
      "message": "feat(view): resolve historical versions by timestamp (#2436)\n\n* feat(view): resolve retained view versions by history\n\n* test(view): cover historical version lookup and rollbacks\n\n* fix(view): use reverse slice iteration\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* refactor(view): clarify timestamp history lookup boundaries\n\n* test(view): cover duplicate timestamps and Java-style history expiry\n\n* fix(view): match Java-style timestamp ordering in version lookups\n\n* test(view): cover clock skew, timestamp ties, and inclusive time travel\n\n* perf(view): use indexed lookup for retained versions\n\n* fix(view): resolve as-of versions by latest eligible log entry\n\n* test(view): cover builder rollback and log-order timestamp ties\n\n* docs(view): list historical version accessors\n\n* fix(view): use slices.Backward for version history lookup\n\n* test(view): cover builder-created history and rollback\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "45d5a65c16b8c58bcccd3aa0d699f218a4821cfe",
      "tree": "39b826f408f553251afdd3aac65856f9415182fb",
      "parents": [
        "d840452bda30329cf76ce27597c8bd721aa0f5dc"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 19:01:56 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 13:01:56 2026 -0500"
      },
      "message": "feat(table): register Puffin statistics in transactions (#2437)\n\n* feat(table): register Puffin statistics files in transactions\n\n* test(table): cover Puffin statistics registration and validation\n\n* fix(table): align Puffin statistics registration with Java\n\n* test(table): assert unchanged metadata for no-op statistics transaction\n\n* test(table): preserve registered statistics on unmatched removal\n\n* fix(table): address Puffin statistics review feedback\n\n* test(puffin): cover writer size accessors across codecs"
    },
    {
      "commit": "d840452bda30329cf76ce27597c8bd721aa0f5dc",
      "tree": "27f112b9e56fb8f5e8751179a0f62ae867086fbe",
      "parents": [
        "b8e4b2eeb6e113e72c408506f41123e6eab041b6"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 18:55:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:55:21 2026 -0500"
      },
      "message": "feat(table): rename snapshot branches (#2441)\n\n* feat(table): rename snapshot branches atomically\n\n* test(table): cover branch rename and concurrent ref changes\n\n* style(table): format branch rename tests\n\n* fix(table): reject branch rename to same name\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): match snapshot ref field name\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* style(table): format branch rename test\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(table): assign valid sequence to concurrent branch snapshot\n\n* style(table): gofmt concurrent branch rename test\n\n* docs(table): clarify rename branch concurrency guarantees\n\n* test(table): cover branch renames with optional retention\n\n* fix(table): guard renamed branch type in local commits\n\n* test(table): reject concurrent rename source changes\n\n* test(table): verify branch rename REST commit payload\n\n* refactor(table): stage branch renames in transactions\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "b8e4b2eeb6e113e72c408506f41123e6eab041b6",
      "tree": "aabb03040c990277c291d64006a61b52fa65ef03",
      "parents": [
        "a9bb6fd24444f49de987aa949cd6c26d9691b9df"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Mon Nov 09 18:45:33 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:45:33 2026 -0500"
      },
      "message": "refactor(io)!: add context to StatIO.Stat (#2448)\n\n* refactor(io)!: add context to StatIO.Stat\n\n* fix(io): preserve stat operation context and propagate errors"
    },
    {
      "commit": "a9bb6fd24444f49de987aa949cd6c26d9691b9df",
      "tree": "2a2470ecb8fda31ff43515103de93b8888f22a70",
      "parents": [
        "910200843e12a78fd25aa4f9236151e55a984306"
      ],
      "author": {
        "name": "Ayaan",
        "email": "103879986+AynSiddiqui@users.noreply.github.com",
        "time": "Mon Nov 09 23:08:18 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:38:18 2026 -0500"
      },
      "message": "docs: set AWS_S3_ENDPOINT in integration test instructions (#2456)\n\n* docs: set AWS_S3_ENDPOINT in integration test instructions\n\nSigned-off-by: Ayaan \u003cayaansiddiqui68@gmail.com\u003e\n\n* docs: use localhost S3 endpoint and scope integration test packages\n\nSigned-off-by: Ayaan \u003cayaansiddiqui68@gmail.com\u003e\n\n* docs: use absolute README link so it resolves on the docs site\n\n---------\n\nSigned-off-by: Ayaan \u003cayaansiddiqui68@gmail.com\u003e"
    },
    {
      "commit": "910200843e12a78fd25aa4f9236151e55a984306",
      "tree": "37e7637bb4ae1c7c5430a64fe916df1092d02796",
      "parents": [
        "0b7901ba54e12e515551e3a43d86f584255000a3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Nov 09 12:37:16 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:37:16 2026 -0500"
      },
      "message": "build(deps): bump the gomod_updates group with 9 updates (#2461)\n\nBumps the gomod_updates group with 9 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) | `1.47.4` | `1.47.5` |\n| [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) | `1.33.10` | `1.33.13` |\n| [github.com/aws/aws-sdk-go-v2/credentials](https://github.com/aws/aws-sdk-go-v2) | `1.20.10` | `1.20.13` |\n| [github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager](https://github.com/aws/aws-sdk-go-v2) | `0.4.19` | `0.5.2` |\n| [github.com/aws/aws-sdk-go-v2/service/glue](https://github.com/aws/aws-sdk-go-v2) | `1.172.0` | `1.172.2` |\n| [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) | `1.114.5` | `1.114.6` |\n| [github.com/aws/smithy-go](https://github.com/aws/smithy-go) | `1.28.6` | `1.28.7` |\n| [github.com/twmb/murmur3](https://github.com/twmb/murmur3) | `1.2.1` | `1.2.2` |\n| [google.golang.org/api](https://github.com/googleapis/google-api-go-client) | `0.307.0` | `0.310.0` |\n\n\nUpdates `github.com/aws/aws-sdk-go-v2` from 1.47.4 to 1.47.5\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.47.4...v1.47.5)\n\nUpdates `github.com/aws/aws-sdk-go-v2/config` from 1.33.10 to 1.33.13\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/config/v1.33.10...config/v1.33.13)\n\nUpdates `github.com/aws/aws-sdk-go-v2/credentials` from 1.20.10 to 1.20.13\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/emr/v1.20.10...credentials/v1.20.13)\n\nUpdates `github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager` from 0.4.19 to 0.5.2\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/feature/s3/transfermanager/v0.4.19...feature/s3/transfermanager/v0.5.2)\n\nUpdates `github.com/aws/aws-sdk-go-v2/service/glue` from 1.172.0 to 1.172.2\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ec2/v1.172.0...service/glue/v1.172.2)\n\nUpdates `github.com/aws/aws-sdk-go-v2/service/s3` from 1.114.5 to 1.114.6\n- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)\n- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.114.5...service/s3/v1.114.6)\n\nUpdates `github.com/aws/smithy-go` from 1.28.6 to 1.28.7\n- [Release notes](https://github.com/aws/smithy-go/releases)\n- [Changelog](https://github.com/aws/smithy-go/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/aws/smithy-go/compare/v1.28.6...v1.28.7)\n\nUpdates `github.com/twmb/murmur3` from 1.2.1 to 1.2.2\n- [Commits](https://github.com/twmb/murmur3/compare/v1.2.1...v1.2.2)\n\nUpdates `google.golang.org/api` from 0.307.0 to 0.310.0\n- [Release notes](https://github.com/googleapis/google-api-go-client/releases)\n- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)\n- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.307.0...v0.310.0)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/aws/aws-sdk-go-v2\n  dependency-version: 1.47.5\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: gomod_updates\n- dependency-name: github.com/aws/aws-sdk-go-v2/config\n  dependency-version: 1.33.13\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: gomod_updates\n- dependency-name: github.com/aws/aws-sdk-go-v2/credentials\n  dependency-version: 1.20.13\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: gomod_updates\n- dependency-name: github.com/aws/aws-sdk-go-v2/feature/s3/transfermanager\n  dependency-version: 0.5.2\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: gomod_updates\n- dependency-name: github.com/aws/aws-sdk-go-v2/service/glue\n  dependency-version: 1.172.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: gomod_updates\n- dependency-name: github.com/aws/aws-sdk-go-v2/service/s3\n  dependency-version: 1.114.6\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: gomod_updates\n- dependency-name: github.com/aws/smithy-go\n  dependency-version: 1.28.7\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: gomod_updates\n- dependency-name: github.com/twmb/murmur3\n  dependency-version: 1.2.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: gomod_updates\n- dependency-name: google.golang.org/api\n  dependency-version: 0.310.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: gomod_updates\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": "0b7901ba54e12e515551e3a43d86f584255000a3",
      "tree": "96040924ddbbf0ea0f0b3ebd4e40a8e68d19017b",
      "parents": [
        "5cf3cbe68f0c6d3ec0866408f8fc41363acf12ad"
      ],
      "author": {
        "name": "jj.lee",
        "email": "63435794+jx2lee@users.noreply.github.com",
        "time": "Tue Nov 10 02:37:09 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:37:09 2026 -0500"
      },
      "message": "fix(catalog/rest): report missing namespace on RenameView 404 (#2454)\n\n* report missing ns on RenameView 404\n\nSigned-off-by: jx2lee \u003cdev.jaejun.lee.1991@gmail.com\u003e\n\n* add comments above req\n\n---------\n\nSigned-off-by: jx2lee \u003cdev.jaejun.lee.1991@gmail.com\u003e"
    },
    {
      "commit": "5cf3cbe68f0c6d3ec0866408f8fc41363acf12ad",
      "tree": "350efe9645595d339c0f63dc96ecc0ab31867c72",
      "parents": [
        "96be131bdfd6b3d7704982410039b409248eeb55"
      ],
      "author": {
        "name": "slfan1989",
        "email": "55643692+slfan1989@users.noreply.github.com",
        "time": "Tue Nov 10 01:34:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:34:42 2026 -0500"
      },
      "message": "fix(cli): reject unsupported format versions in upgrade dry runs (#2460)\n\nSigned-off-by: slfan1989 \u003cslfan1989@apache.org\u003e"
    },
    {
      "commit": "96be131bdfd6b3d7704982410039b409248eeb55",
      "tree": "da974e9a4b427a893a633f7521351ac89d4606b5",
      "parents": [
        "a1e50aa5c9b0bace998eaece66a5c0850af8977e"
      ],
      "author": {
        "name": "Shivam Sharma",
        "email": "192242476+ShivamSharma43@users.noreply.github.com",
        "time": "Mon Nov 09 23:00:43 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:30:43 2026 -0500"
      },
      "message": "fix(literals): reject string-to-decimal casts that would round (#2458)\n\nStringLiteral.To(DecimalType) used decimal128.FromString, which rounds\nto the target scale. A predicate bound with more fractional digits than\nthe column\u0027s scale was silently rounded, so price \u003e \"12.345\" on a\ndecimal(9, 2) column bound as price \u003e 12.35 and dropped rows equal to\n12.35.\n\nReturn ErrBadCast when the string needs more fractional digits than the\nscale. Values the scale represents exactly still convert as before.\n\nCloses #2457\n\nSigned-off-by: Shivam Sharma \u003c192242476+ShivamSharma43@users.noreply.github.com\u003e\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a1e50aa5c9b0bace998eaece66a5c0850af8977e",
      "tree": "02063cc8e632e9d948b88ca8ffacb4c917097823",
      "parents": [
        "379dbf7d3d9ae16d592e0d7cef553b8a9f8e14de"
      ],
      "author": {
        "name": "Shruthi",
        "email": "sruthi1reddy3@gmail.com",
        "time": "Mon Nov 09 09:27:28 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:27:28 2026 -0500"
      },
      "message": "fix(table): avoid duplicate column IDs when last-column-id is stale (#2453)\n\n* fix(table): return error from UpdateSchema when last-column-id is below assigned field IDs\n\nSigned-off-by: Shruthi Yaramada \u003cshrutyar@amazon.com\u003e\n\n* fix(table): seed column ID counter from schema history\n\nSigned-off-by: Shruthi Yaramada \u003cshrutyar@amazon.com\u003e\n\n---------\n\nSigned-off-by: Shruthi Yaramada \u003cshrutyar@amazon.com\u003e\nCo-authored-by: Shruthi Yaramada \u003cshrutyar@amazon.com\u003e"
    },
    {
      "commit": "379dbf7d3d9ae16d592e0d7cef553b8a9f8e14de",
      "tree": "4a715ee719ef889a0671a44598ac0b2c7f89297a",
      "parents": [
        "94102c5cb24f437a7c33e6bf53e2acb4efacdcc5"
      ],
      "author": {
        "name": "Harrison Crosse",
        "email": "harrison@crosse.dev",
        "time": "Mon Nov 09 12:24:04 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 09 12:24:04 2026 -0500"
      },
      "message": "perf(table): match single-column equality deletes per dictionary entry (#2442)\n\nWhen a single string or binary equality key column arrives as a dictionary\nno larger than the batch, match each dictionary entry once and map rows\nthrough their indices instead of encoding a key per row.\n\nSigned-off-by: Harrison Crosse \u003charrison@crosse.dev\u003e"
    },
    {
      "commit": "94102c5cb24f437a7c33e6bf53e2acb4efacdcc5",
      "tree": "a590154e212f49687c79553eb673cd7f5528a1ac",
      "parents": [
        "2e69b8adb8f0db0ecdd7a48cf4280737f4704fe6"
      ],
      "author": {
        "name": "Harrison Crosse",
        "email": "harrison@crosse.dev",
        "time": "Sun Nov 08 16:17:02 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Nov 08 22:17:02 2026 +0100"
      },
      "message": "feat(table): replan snapshot expiration on commit retry (#2354)"
    },
    {
      "commit": "2e69b8adb8f0db0ecdd7a48cf4280737f4704fe6",
      "tree": "78290e3263e07aade6ac00b17956881da641f550",
      "parents": [
        "e7f50c3a2d6fa9a4bdd8f03e85c91bc6e88c1787"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Nov 05 21:12:15 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 15:12:15 2026 -0500"
      },
      "message": "perf(internal): avoid quadratic packing with large lookback (#2363)\n\n* perf(internal): avoid quadratic packing with large lookback\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(internal): compare indexed packing with linear across weight transitions\n\n* fix(internal): correct reverse iterator test declaration\n\n* test(internal): use integer range in packing test\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "e7f50c3a2d6fa9a4bdd8f03e85c91bc6e88c1787",
      "tree": "1792e35197342ebd0f56d68841449e8d55ae957a",
      "parents": [
        "6db54d61a20ad383a4112373716527abd9977138"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Nov 05 21:10:13 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 15:10:13 2026 -0500"
      },
      "message": "perf(compaction): reduce split task normalization work (#2377)\n\n* perf(compaction): reduce split task normalization work\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(compaction): address split normalization review\n\nMove the shared-delete-slice acceptance case alongside file-grain tests,\nremove redundant test coverage, and clarify the slice shortcut comment.\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "6db54d61a20ad383a4112373716527abd9977138",
      "tree": "3da4427eca8f07b3ea8425d00c23ee32526940f4",
      "parents": [
        "95d8c7d99d37ac3d0f4795c1d942619a203fd41f"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Nov 05 21:08:23 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 15:08:23 2026 -0500"
      },
      "message": "feat(table): support sort order satisfaction checks (#2439)\n\n* feat(table): add Java-compatible sort-order satisfaction checks\n\n* test(table): cover Java sort-order satisfaction rules\n\n* fix(table): avoid conflicting sort transform helper\n\n* fix(table): reject sort satisfaction without source IDs\n\n* test(table): cover source IDs and Java transform edge cases\n\n* style(table): format multi-source sort order test\n\n* test(table): cover full Java time sort satisfaction matrix\n\n* docs(table): clarify limits of Java sort satisfaction"
    },
    {
      "commit": "95d8c7d99d37ac3d0f4795c1d942619a203fd41f",
      "tree": "2cbf48cbf1f76d8bb3cf7705a7f4f8407e5fae49",
      "parents": [
        "f3c9f72261e34c9365582cfd51479820e004c0c3"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Thu Nov 05 21:05:03 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 15:05:03 2026 -0500"
      },
      "message": "feat(table): roll back snapshots by timestamp (#2440)\n\n* feat(table): add timestamp-based transaction rollback\n\n* test(table): cover timestamp rollback ancestry and conflicts\n\n* style(table): satisfy nlreturn in timestamp rollback\n\n* style(table): separate early test return"
    },
    {
      "commit": "f3c9f72261e34c9365582cfd51479820e004c0c3",
      "tree": "d5ead71c9c92bb0a6412d5126fe534f65835c25d",
      "parents": [
        "10002573905efc80336d4cce8fb49d51f2bf117a"
      ],
      "author": {
        "name": "Anirudh Sriram",
        "email": "anirudhsriram1995@gmail.com",
        "time": "Thu Nov 05 09:54:07 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 12:54:07 2026 -0500"
      },
      "message": "fix(table): skip rows already removed by position deletes in merge-on-read deletes (#2422)\n\n* fix(table): skip rows already removed by position deletes in merge-on-read deletes\n\nmakePositionDeleteRecordsForFilter built its scan tasks without the\nfiles\u0027 existing position delete files, so a v2 merge-on-read delete\nmatched rows an earlier delete had already removed and wrote position\ndeletes for them again. Take each file\u0027s delete files from scan\nplanning so those rows are filtered out first.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Anirudh Sriram \u003canirudh@artie.com\u003e\n\n* fix(table): pin the existing-deletes scan to the transaction\u0027s branch\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nSigned-off-by: Anirudh Sriram \u003canirudh@artie.com\u003e\n\n---------\n\nSigned-off-by: Anirudh Sriram \u003canirudh@artie.com\u003e\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "10002573905efc80336d4cce8fb49d51f2bf117a",
      "tree": "ac4689d42b124a513966bbd27217a0f19bf87dca",
      "parents": [
        "7abe24a0ac0177db40545e28591daf1ec06daa53"
      ],
      "author": {
        "name": "Andrei Tserakhau",
        "email": "laskoviymishka@gmail.com",
        "time": "Thu Nov 05 18:36:55 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 12:36:55 2026 -0500"
      },
      "message": "fix(table): write statistics blob metadata Java can read (#2358)\n\n* fix(table): write statistics blob metadata Java can read\n\nA statistics blob with no properties was written as \"properties\": null,\nand one with no fields as \"fields\": null, in table metadata and\nset-statistics updates. Iceberg Java 1.12 rejects both in\nTableMetadataParser and MetadataUpdateParser, so the whole metadata load\nfails. Metadata Java wrote hit it too: Java omits empty properties, Go\ndecoded that to a nil map, and the next Go write emitted null.\n\nOmit empty properties and write nil fields as [], which is what Java\nwrites for the same blobs.\n\n* fix(table): write empty statistics blob metadata as []\n\nA StatisticsFile with no blobs was written as \"blob-metadata\": null,\nwhich Java\u0027s StatisticsFileParser rejects."
    },
    {
      "commit": "7abe24a0ac0177db40545e28591daf1ec06daa53",
      "tree": "626492dc0bf337caa8fe24dabbcf6000b4596811",
      "parents": [
        "5c233d43981d997696756bd906412d72d2b8b594"
      ],
      "author": {
        "name": "Andrei Tserakhau",
        "email": "laskoviymishka@gmail.com",
        "time": "Thu Nov 05 18:30:12 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 12:30:12 2026 -0500"
      },
      "message": "refactor!: thread context through manifest and deletion-vector reads (#2357)\n\n* refactor!: thread context through manifest and deletion-vector reads\n\nSnapshot.Manifests, ManifestFile.Entries, iceberg.EntriesWithProjection,\ndv.ReadDV and dv.ReadDVs opened files with context.Background(), so a\nstalled open on these read paths couldn\u0027t be cancelled. They now take a\ncontext.Context first argument and pass it to IO.Open.\n\nCallers pass the context they already have: scan planning, commits and\nconflict validation (conflictContext now keeps the commit\u0027s context),\nsnapshot producers, rewrite-manifests, metadata tables and the CLI. New\ntests check that the caller\u0027s context reaches IO.Open for each function.\n\nio.StatIO.Stat still takes no context, so sizing embedded manifests\nthrough Stat is not covered.\n\nRefs #2062.\n\n* fix(cmd/iceberg): pass the command context to tbl.FS in Files\n\nCo-authored-by: Isaac \u003cno-reply@databricks.com\u003e\n\n---------\n\nCo-authored-by: Isaac \u003cno-reply@databricks.com\u003e"
    },
    {
      "commit": "5c233d43981d997696756bd906412d72d2b8b594",
      "tree": "17c18b7a83441441776abe70cf6343713450d571",
      "parents": [
        "65da9a886fec8126fd5ebe9a506d78a8949374fe"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Thu Nov 05 11:18:15 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 12:18:15 2026 -0500"
      },
      "message": "feat(rest): export NewOauth2AuthManager for custom token sources (#2433)"
    },
    {
      "commit": "65da9a886fec8126fd5ebe9a506d78a8949374fe",
      "tree": "1f9518e8a1bcb68ea73a9cef69609825d46a0d3f",
      "parents": [
        "19a6ef2f377fe88be2b9b41d06561b331cf2f290"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Thu Nov 05 11:11:59 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 12:11:59 2026 -0500"
      },
      "message": "fix!: store binary and fixed defaults as hex strings in schemas (#2372)\n\n* refactor!: store binary and fixed defaults as hex strings in schemas\n\n* docs: scope the hex default conversion to binary and fixed fields"
    },
    {
      "commit": "19a6ef2f377fe88be2b9b41d06561b331cf2f290",
      "tree": "85d2f812aaeae66b32662142161e81b9612b14eb",
      "parents": [
        "19c888720daf8f3fd8d0a2bb14cd9e8e32ce0a51"
      ],
      "author": {
        "name": "Tanmay Rauth",
        "email": "t_rauth@apple.com",
        "time": "Thu Nov 05 09:11:34 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Nov 05 12:11:34 2026 -0500"
      },
      "message": "feat(table): add Theta sketch NDV helper (#2347)\n\n* feat(table): add Theta sketch NDV helper\n\nAdd table/stats with a DataSketches Theta-sketch wrapper for computing\nnumber-of-distinct-values, mutually readable with the sketches\nIceberg-Java stores in apache-datasketches-theta-v1 Puffin blobs. Pins\nthe same seed (9001), lgK (12), and compact serialization, skips empty\nvalues as Java does, and produces results through a K-trimmed union.\n\nParity is covered by fixtures generated from Iceberg-Java\u0027s\nThetaSketchAgg path (dev/theta-fixtures), compared on decoded sketch\nstate per type.\n\n* docs(table): note Sketch result methods rebuild a union per call"
    },
    {
      "commit": "19c888720daf8f3fd8d0a2bb14cd9e8e32ce0a51",
      "tree": "0f155b5d01ad3e01053c5a163fa1d3d34dc59d99",
      "parents": [
        "b95d4fc8018ed6a6def40a97e4926401577af005"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 19:38:51 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:38:51 2026 -0500"
      },
      "message": "feat(table): rewrite v2 position delete files (#2409)\n\n* feat(table): rewrite position delete files\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): preserve unscoped position deletes and validate positions\n\n* fix(table): skip ineligible position delete rewrites and clean partial outputs\n\n* test(table): cover no-op delete rewrites with read-only file IO\n\n* fix(table): repair delete rewrite lint and preserve no-op behavior\n\n* fix(table): compact position deletes across source sequences\n\n* test(table): cover source sequences in delete rewrite chunks\n\n* test(table): retain delete applicability across commit sequences\n\n* style(table): satisfy nlreturn in position delete rewrite\n\n* test(table): assert position delete rewrites stop on pinned ref conflict\n\n* fix(table): preserve cross-spec position deletes\n\n* refactor(table): stage position delete rewrites in transactions\n\n* fix(table): match location provider signature in position delete rewrite\n\n* style(table): fix position delete rewrite test formatting\n\n* style(table): fix position delete rewrite test formatting\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "b95d4fc8018ed6a6def40a97e4926401577af005",
      "tree": "b55a091eb999f2e2270090add54f0d8c73ae8059",
      "parents": [
        "b00fada37e8238e4538ec409eef822850fe32053"
      ],
      "author": {
        "name": "Revanth",
        "email": "revanthcse1@gmail.com",
        "time": "Wed Nov 04 12:29:14 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:29:14 2026 -0500"
      },
      "message": "fix!: reject NaN literals when binding predicates (#2432)"
    },
    {
      "commit": "b00fada37e8238e4538ec409eef822850fe32053",
      "tree": "5e0071a6da48dae8e6c6ed61f36944ef6aeb8fc3",
      "parents": [
        "d6831edf0f98c7554d00fb2957ac2b51ba897822"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 19:20:30 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:20:30 2026 -0500"
      },
      "message": "feat(table): remove dangling delete files (#2408)\n\n* feat(table): remove dangling delete files\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): preserve partition-scoped deletes during dangling cleanup\n\n* perf(table): avoid scanning data manifests without dangling delete candidates\n\n* test(table): cover scoped delete references and fix nlreturn lint\n\n* perf(table): index only explicitly referenced data paths\n\n* test(table): verify dangling delete cleanup without delete manifests is a no-op\n\n* test(table): fence dangling delete cleanup with retries enabled\n\n* fix(table): include unpartitioned tables in dangling delete cleanup\n\n* test(table): verify unpartitioned dangling delete cleanup\n\n* fix(table): match Java scan-based dangling delete cleanup\n\n* style(table): remove trailing blank lines in dangling delete tests\n\n* refactor(table): stage dangling delete cleanup in transactions\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "d6831edf0f98c7554d00fb2957ac2b51ba897822",
      "tree": "471113232bff2a1352cd82c077a25a6e85d71cca",
      "parents": [
        "2ee04d9b2dc9937986f2a749501055770df4a459"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 19:11:40 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:11:40 2026 -0500"
      },
      "message": "feat(table): import bucket-partitioned Parquet files (#2395)\n\n* feat(table): import bucket-partitioned Parquet into v1 tables\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): preserve file import API compatibility\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): snapshot partition values before concurrent imports\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): reject unknown partition transforms during file import\n\n* test(table): prevent unknown transform bypass via supplied partition tuple\n\n* fix(table): validate supplied partition values against Parquet bounds\n\n* style(table): sort arrow utils imports\n\n* fix(table): preserve addFilesOperation comparability\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "2ee04d9b2dc9937986f2a749501055770df4a459",
      "tree": "d925723d1c4090cf8c8a4454f9afa1dff3c62d8a",
      "parents": [
        "a19082e2d50d24d27710968d759338d931ba8442"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 19:08:17 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:08:17 2026 -0500"
      },
      "message": "feat(table): validate snapshot manifests (#2397)\n\n* feat(table): validate snapshot manifests\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): validate tombstone entry content during snapshot audit\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(table): exercise snapshot tombstones with valid fixtures\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): reject missing required v2/v3 manifest counts\n\n* test(table): cover required manifest-list counts\n\n* feat(table): validate deletion vector targets\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): report invalid deletion vector blob ranges during audits\n\n* test(table): cover invalid and missing deletion vector ranges\n\n* style(table): align snapshot validation issue constants\n\n* fix(table): align snapshot audit with inspect and projected manifests\n\n* fix(table): do not mark canceled snapshot audits complete\n\n* fix(table): use snapshot lookup sentinels in validation\n\n* fix(table): infer optional v1 embedded manifest spec IDs in audit\n\n* test(table): verify v1 snapshot audit without header spec IDs\n\n* style(table): satisfy nlreturn in snapshot audit\n\n* test(table): use a non-empty manifest for v1 header validation\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): de-duplicate snapshot manifest audit issues and share v1 spec parsing\n\n* docs(table): preserve escaped newlines in snapshot audit example\n\n* fix(table): validate embedded v1 header specs during snapshot audits\n\n* fix(table): reject deletion vector blob ranges beyond file size\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "a19082e2d50d24d27710968d759338d931ba8442",
      "tree": "d6a5e970cb28e35163ec322334e18f739a6bb0e6",
      "parents": [
        "c5661c0caab434d72861424b5239c62708baaf13"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 19:05:04 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:05:04 2026 -0500"
      },
      "message": "feat(puffin): write compressed blobs (#2401)\n\n* feat(puffin): read compressed blobs\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(puffin): reject trailing zstd frames\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* feat(puffin): write compressed blobs\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(puffin): validate metadata first and verify frame sizes\n\n* fix(puffin): reject compressed deletion vectors on read\n\n* test(puffin): reject compressed DV footer and external metadata\n\n* test(puffin): verify offsets of mixed-codec blobs\n\n* fix(puffin): allow common zstd windows for small blobs\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(puffin): defer DV compression rejection to blob reads\n\n* test(puffin): preserve DV reader error contract\n\n* style(puffin): use complete ASF license header\n\n* style(puffin): use complete ASF license header\n\n* docs(puffin): clarify per-blob compression input\n\n* test(puffin): cover LZ4 frame checksum and raw blocks\n\n* fix(puffin): reject explicit empty compression codec\n\n* refactor(puffin): share LZ4 and Zstd codec constants\n\n* fix(puffin): handle unused encoder cleanup result\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "c5661c0caab434d72861424b5239c62708baaf13",
      "tree": "70deed1b2d467237578af1d9b0737873ab7a4e11",
      "parents": [
        "24cd5be0f33cdb0defd2c1a5cd77c0449f9cc9ec"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 19:03:48 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:03:48 2026 -0500"
      },
      "message": "feat(table): write and register v1 partition statistics (#2396)\n\n* feat(table): compute and write v1 partition statistics\n\n* test(table): cover v1 partition statistics schema, sorting and metadata updates\n\n* fix(table): order binary and UUID partition tuples without reflection copy panic\n\n* test(table): use schema field slice in partition statistics assertions\n\n* test(table): verify partition statistics from live manifests and deleted entries\n\n* fix(table): guard partition statistics for unsupported layouts\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): refuse duplicate files in partition statistics\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): sort decimal partition statistics by numeric value\n\n* test(table): cover decimal partition statistics ordering\n\n* feat(table): support embedded partition statistics manifests\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(table): infer omitted v1 embedded manifest spec IDs\n\n* fix(table): accept legacy v1 fields without explicit IDs\n\n* test(table): cover optional v1 partition spec IDs\n\n* fix(table): match Java partition statistics ordering and API\n\n* test(table): cover float and UUID partition statistics sorting\n\n* style(table): separate early returns in partition statistics comparator\n\n* refactor(table): share embedded v1 manifest spec parsing with audit\n\n* fix(table): normalize decoded decimal partition statistics\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "24cd5be0f33cdb0defd2c1a5cd77c0449f9cc9ec",
      "tree": "f9f7e8158d72324dc0f48d45a766029fe2635e5f",
      "parents": [
        "622967e983a9ad3ee3d8fd26e32afabc0d7abdf7"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 19:01:58 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 13:01:58 2026 -0500"
      },
      "message": "feat(puffin): read compressed blobs (#2400)\n\n* feat(puffin): read compressed blobs\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(puffin): reject trailing zstd frames\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(puffin): reject compressed deletion vectors on read\n\n* test(puffin): reject compressed DV footer and external metadata\n\n* fix(puffin): allow common zstd windows for small blobs\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(puffin): defer DV compression rejection to blob reads\n\n* test(puffin): preserve DV reader error contract\n\n* fix(puffin): reject explicit empty compression codec\n\n* refactor(puffin): share LZ4 and Zstd codec constants\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "622967e983a9ad3ee3d8fd26e32afabc0d7abdf7",
      "tree": "e8b121274e7b51be1d2e22daad4441696ecd3ede",
      "parents": [
        "774b4be6da83c730500995614fc7e1e47c9ba558"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 18:59:27 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 12:59:27 2026 -0500"
      },
      "message": "refactor(table): centralize unique manifest traversal (#2404)\n\n* refactor(table): expose unique manifest stream\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* test(table): cover manifest stream prefetch and error propagation\n\n* test(table): cover v1 embedded manifests in unique stream\n\n* refactor(table): keep unique manifest stream internal until inspect extraction\n\n* test(table): trim redundant manifest traversal coverage\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "774b4be6da83c730500995614fc7e1e47c9ba558",
      "tree": "112c656acdab0901146683599262926e78f24cf1",
      "parents": [
        "bc6105cb408d0da5493d8d768424da927ef1cd5e"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 18:55:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 12:55:39 2026 -0500"
      },
      "message": "perf(table): simplify equality delete conflict filters (#2380)\n\n* perf(table): simplify equality delete conflict filters\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* refactor(table): address equality delete filter review\n\nRestore conflict-filter rationale and reuse source field types.\nRemove arbitrary grouping threshold and consolidate test coverage.\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* perf(table): group high-precision decimal equality delete partitions\n\nCompare decimal scale against the source field instead of literal precision.\nAvoid unused group maps and add cast and decimal regression coverage.\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* style(table): fix nlreturn in equality delete literal guard\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    },
    {
      "commit": "bc6105cb408d0da5493d8d768424da927ef1cd5e",
      "tree": "46400c85e914ba8018942115b0fe15e2a21d967b",
      "parents": [
        "346019c1795621675a6c04d77eea2a8e794f7028"
      ],
      "author": {
        "name": "Minh Vu",
        "email": "vuhoangminh97@gmail.com",
        "time": "Wed Nov 04 18:44:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Nov 04 12:44:39 2026 -0500"
      },
      "message": "refactor(catalog/sql)!: align view APIs with ViewCatalog (#2378)\n\n* refactor(catalog/sql)!: align view APIs with ViewCatalog\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e\n\n* fix(catalog/sql): satisfy gofumpt and nlreturn\n\n* fix(catalog/sql): satisfy gofumpt and nlreturn\n\n* fix(catalog/sql): satisfy gofumpt and nlreturn\n\n---------\n\nSigned-off-by: Minh Vu \u003cvuhoangminh97@gmail.com\u003e"
    }
  ],
  "next": "346019c1795621675a6c04d77eea2a8e794f7028"
}
