)]}'
{
  "log": [
    {
      "commit": "f21ee592305b50907390122c483199579d0a3666",
      "tree": "6aaa5e31ceba44136d97cc2f52ccdb33480f192b",
      "parents": [
        "9861d8a942fd4bd7ca47981c909f982587ba2835"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 10 16:06:36 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 15 14:11:29 2026 +0700"
      },
      "message": "[BUILD] Distributed APP: run tests in 2 surefire forks\n\nThe module runs 43 classes one after the other, each starting a full James\nserver. Two forks run them two at a time, like the Blob S3, Mailbox Cassandra\nand Web Admin Distributed modules already do. Each fork keeps its own\ncontainer singletons (random ports, UUID container names).\n\n### Before\nDistributed APP: 7 min 52 sec, 7 min 38 sec (local)\n\n### After\nDistributed APP: 5 min 34 sec, 5 min 11 sec, 5 min 04 sec (local, 136 tests, all green)\n"
    },
    {
      "commit": "9861d8a942fd4bd7ca47981c909f982587ba2835",
      "tree": "0d599ab412c5b0caba1e7d62eb3e09decf915bab",
      "parents": [
        "30e3bbba4c3ad98344c375dc4c7d8191fc700306"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 10 15:21:17 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 15 14:11:29 2026 +0700"
      },
      "message": "[BUILD] JpaPulsarSmtpStarttlsCommandTest: one server per class\n\nThe StartTLS scripts restarted the Postgres, Pulsar and S3 backed server for\neach of the 6 tests. Its Cassandra-RabbitMQ-S3 twin\n(AwsS3RabbitMQSmtpStarttlsCommandTest) already runs the same scripts on one\nserver per class.\n\n### Before\nJpaPulsarSmtpStarttlsCommandTest: 45.7 sec (local), 82 sec (CI, PR-3130 #55)\n\n### After\nJpaPulsarSmtpStarttlsCommandTest: 21.1 sec, 21.7 sec (local)\n"
    },
    {
      "commit": "30e3bbba4c3ad98344c375dc4c7d8191fc700306",
      "tree": "6a409eeaa0fc78d2b44a3aa6c42c92ff77fb0a5f",
      "parents": [
        "0c4df2b9267a001aa7425d98f41392d1123e96cd"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 10 15:15:46 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 15 14:11:29 2026 +0700"
      },
      "message": "[BUILD] FixingGhostMailboxTest: one server per class\n\nEach test corrupts one user\u0027s mailbox path with CQL and only checks that user\u0027s\nmailboxes. With a user per test, the 5 tests share one server instead of\nrestarting it for each.\n\n### Before\nFixingGhostMailboxTest: 101 sec (local, in the module run)\nWeb Admin Distributed: 4 min 56 sec, 4 min 48 sec (local)\n\n### After\nFixingGhostMailboxTest: 56 sec, 56 sec (local, alone, including the container start)\nWeb Admin Distributed: 4 min 49 sec, 4 min 44 sec (local)\n"
    },
    {
      "commit": "0c4df2b9267a001aa7425d98f41392d1123e96cd",
      "tree": "1de7d1e0f94080990c44e132a4cd7e713d63d5d0",
      "parents": [
        "af42ae8cc6c0e9a79e586aa47e2c4884d306a5e7"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 10 15:15:46 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 15 14:11:29 2026 +0700"
      },
      "message": "[BUILD] Web Admin Distributed: one server per class for user scoped task tests\n\nRabbitMQWebAdminServerTaskSerializationIntegrationTest restarted a full\nCassandra, OpenSearch, RabbitMQ and S3 server for each of its 17 tests. 11 of\nthem run a task scoped to one user, mailbox or message and only check that\ndata: they move to RabbitMQWebAdminServerUserTaskSerializationIntegrationTest,\non one server per class, each test with its own user. The 6 tests asserting\ncounts over the whole server (all messages, all users, dead letters, mail\nrepository) keep a server per test. Test count unchanged (107).\n\n### Before\nWeb Admin Distributed: 5 min 26 sec, 5 min 14 sec (local)\n\n### After\nWeb Admin Distributed: 4 min 56 sec, 4 min 48 sec (local)\n"
    },
    {
      "commit": "af42ae8cc6c0e9a79e586aa47e2c4884d306a5e7",
      "tree": "a930a88628689c3e4d162ee08b952c7d616413d0",
      "parents": [
        "dca4661778c0512a180d28fcba64326d55bf67d0"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 10 14:36:36 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 15 14:11:29 2026 +0700"
      },
      "message": "[BUILD] WebAdminServerIntegrationImmutableTest: move the mailbox export test out\n\nThe export task mails a download link to the exported user, so this test\nleaves a message on the server shared by the immutable tests. Depending on test\norder, RabbitMQWebAdminServerIntegrationImmutableTest.solveMessageInconsistenciesTasksShouldBeExposed\nthen counts 1 processed IMAP UID entry instead of 0: it failed 2 runs out of 2\nlocally, and shows as a flaky test on CI (fails, then passes on rerun with a\nfresh server).\n\nmailboxesExportTasksShouldBeExposed goes back to WebAdminServerIntegrationTest,\nwhich restarts the server for each test. Test counts per module unchanged.\n\nRun alone, the immutable class fails with the export test and passes without\nit; after the move, the immutable and mutable classes pass on the\nDistributed, Memory and Postgres modules.\n"
    },
    {
      "commit": "dca4661778c0512a180d28fcba64326d55bf67d0",
      "tree": "851d7445353c768f35e0045120ae5b35f3a96833",
      "parents": [
        "faaf280e3d46089786c1f0e5f4603883ef40ea45"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 10 13:20:59 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 15 14:11:29 2026 +0700"
      },
      "message": "[BUILD] surefire: disable the embedded Artemis disk usage check in tests\n\nSince the embedded mail queue moved to ActiveMQ Artemis, the broker blocks\nevery message send once disk usage exceeds 90% (Artemis maxDiskUsage default),\nwithout error nor timeout. On a machine with a nearly full disk, tests sending\nmail through it hang until the fork or pipeline timeout.\n\nArtemis applies brokerconfig.* system properties to the embedded broker:\nbrokerconfig.maxDiskUsage\u003d-1 turns the check off for test JVMs only.\nProduction keeps the Artemis default.\n\nReproduced locally at 92% disk usage with the Postgres app: the SMTP handler\nblocks in ClientProducerCreditsImpl.actualAcquire while enqueuing, and\nPostgresBlobStoreIntegrationTest, BodyDeduplicationIntegrationTest and\nPostgresWithOpenSearchDisabledTest never finish (killed after 10 min); with the\nproperty, their 19 tests pass in 47 sec.\n"
    },
    {
      "commit": "faaf280e3d46089786c1f0e5f4603883ef40ea45",
      "tree": "7a6efade1bd8e0b023f1fc0e07e658e6bd53aed1",
      "parents": [
        "2d7e913ff728ac1992d82c493aa9421e2abc0ea2"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 10 12:09:28 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 15 14:11:29 2026 +0700"
      },
      "message": "[BUILD] Distributed APP: one James server per class for MailsShouldBeWellReceived\n\nEight Distributed APP classes restarted a full Cassandra, OpenSearch, RabbitMQ\nand S3 James server for every test of the MailsShouldBeWellReceived contract,\nbecause its tests used fixed users and awaited exact mailbox counts. Each test\nnow creates its own sender and recipients, so the classes share one server.\n\nThe two blob count checks of the WithCassandra* classes count every blob of the\nserver: they move unchanged into WithCassandra*StorageTest classes, on a server\nof their own built the same way. Test count unchanged (136).\n\n### Before\nDistributed APP: 11 min 29 sec, 10 min 39 sec (local)\n\n### After\nDistributed APP: 7 min 54 sec, 7 min 48 sec (local)\n"
    },
    {
      "commit": "2d7e913ff728ac1992d82c493aa9421e2abc0ea2",
      "tree": "199f25b5e9eca725a4283264ca0cbf9a3cf0e104",
      "parents": [
        "1489b3066572fb68ab0ebe863a5205da9547b5f4"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Tue Oct 13 11:10:46 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Oct 14 09:14:47 2026 +0700"
      },
      "message": "JAMES-4223 Default S3 If-None-Match to false\n\nDefaulting `objectstorage.s3.ifNoneMatch.enable` to true breaks S3\ncompatible object storages that do not support conditional writes.\n\nThis was hit on OVH Object Storage (Swift backed, S3 API served by the\nSwift s3api middleware): Swift s3api rejects any PUT carrying an\n`If-None-Match` header with `501 Not Implemented` (`NotImplemented`:\n\"Conditional object PUTs are not supported.\"). Only Swift 2.36.0+\naccepts `If-None-Match: *`. Upgrading James without touching the\nconfiguration thus makes every blob write fail.\n\nConditional writes remain available as an opt-in through\n`objectstorage.s3.ifNoneMatch.enable\u003dtrue` on storages supporting them\n(AWS S3, MinIO...).\n"
    },
    {
      "commit": "1489b3066572fb68ab0ebe863a5205da9547b5f4",
      "tree": "7f4d1a9e44d3b40fea7d3b9d9796411cbd99fd7e",
      "parents": [
        "b8eabb3d9a3e4b8eebb13b8ad3429a2ae2baaff6"
      ],
      "author": {
        "name": "ilya terskov",
        "email": "96711442+prosgarz35@users.noreply.github.com",
        "time": "Mon Oct 12 22:10:27 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 17:10:27 2026 +0200"
      },
      "message": "SMTP: Consistently validate HELO and scope BAD_EHLO_HELO to connection (#3214)"
    },
    {
      "commit": "b8eabb3d9a3e4b8eebb13b8ad3429a2ae2baaff6",
      "tree": "388baaf07041931ab97cfe58778c74282f163b4f",
      "parents": [
        "455256dc602645b62b936e1901fc6542e399ef24"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Oct 07 22:20:37 2026 +0200"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Fri Oct 09 11:37:58 2026 +0700"
      },
      "message": "[ENHANCEMENT] GET /users: search by username prefix and domain via typed UsernamePredicate\n"
    },
    {
      "commit": "455256dc602645b62b936e1901fc6542e399ef24",
      "tree": "aca5cdc7afbd216e8eb444c96535e8797ed27053",
      "parents": [
        "6aa73cd6555724c6dccc11f866b8caf571c7a307"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Oct 07 21:53:07 2026 +0200"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Fri Oct 09 11:37:58 2026 +0700"
      },
      "message": "[FIX] Allow working with capped LDAP pages: paging for /users\n"
    },
    {
      "commit": "6aa73cd6555724c6dccc11f866b8caf571c7a307",
      "tree": "7cbd855c42ad05ba81a445ac18efa5361686d030",
      "parents": [
        "fcdb120cf162e189f75a191e883911391ca150d1"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 03 12:09:30 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 08 11:03:11 2026 +0700"
      },
      "message": "[BUILD] DeletedMessageVaultIntegrationTest: isolate using different users\n\nThe contract used fixed homer/bart/jack users, a domain added in each\n@BeforeEach and a clock some tests move one year ahead, so implementations\nhad to start a new James server for every test (35 tests).\n\nEach test now gets its own users (random suffix), adds the domain only if\nmissing, and resets the injected clock to NOW in @BeforeEach (same starting\npoint as the per-test clock created today). The Memory, Postgres, RabbitMQ\nPostgres and RabbitMQ implementations now share one server per class.\n\nRabbitMQDeletedMessageVaultIntegrationTest: 6 min 43 sec -\u003e 4 min 7 sec\n"
    },
    {
      "commit": "fcdb120cf162e189f75a191e883911391ca150d1",
      "tree": "f69bc918201c6bc460828975d50a260c2c07ac7b",
      "parents": [
        "12b00468d12005e7070b7d9b3ddd78b9d09808d5"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 03 02:27:01 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 08 11:03:11 2026 +0700"
      },
      "message": "[BUILD] RedisExtension: keep the Redis container across test classes\n\nDOCKER_REDIS_SINGLETON is a static container shared by the test JVM, but afterAll\nstopped it, so every following test class paid a Redis restart. beforeEach already\nflushes Redis, so stopping it between classes brings no extra isolation; Testcontainers\u0027\nreaper removes the container when the JVM exits. As the container now outlives a test\nclass, beforeAll unpauses it when a previous class left it paused (e.g. a failing\nassertion between inline pause/unpause calls), keeping that failure local.\n\nMeasured on Twake Mail (JMAP Distributed integration tests, fixed 15-class subset,\nCI smoke selection):\n\n### Before\ndistributed-jmap-integration-tests (subset): 2 min 25 sec\n\n### After\ndistributed-jmap-integration-tests (subset): 2 min 9 sec, then 2 min 7 sec (both green)\n\ntmail apps/distributed: 3 min 28 sec before and after (no change).\n"
    },
    {
      "commit": "12b00468d12005e7070b7d9b3ddd78b9d09808d5",
      "tree": "e7574e43207fba9d4b4bf8ea10d4b3f130ac6369",
      "parents": [
        "5a394e1a996bfaf43ceb5a202bcec04f18da82f8"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Wed Oct 07 15:10:30 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 08 11:02:49 2026 +0700"
      },
      "message": "[FIX] KeyRegistrationHandler: bound the event bus stop\n\nStopping a RabbitMQ event bus deleted its key registration queue first,\nwith a one minute timeout retried up to 8 times, and only then disposed the\nregistration consumer and its scheduler. With an unresponsive broker one\nbus could block stop for about ten minutes, then skip the local cleanup.\nEach bus is stopped in turn, and these stops now run on every server\nshutdown since provider-built singletons get their @PreDestroy called.\n\nThe consumer and scheduler are now disposed first. Deleting the queue is a\nsingle best effort attempt bounded to 10 seconds; a failure is logged\ninstead of thrown. The registration queue is auto-delete by default with\nclassic queues; a queue left behind otherwise is the same leftover a crash\nalready leaves.\n\nNew test: stopping the event bus while RabbitMQ is paused returns within\n30 seconds (it timed out before). RabbitMQEventBusTest: 81 tests green.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "5a394e1a996bfaf43ceb5a202bcec04f18da82f8",
      "tree": "21a42e342e68d2819f536b4a3549b711b9149f82",
      "parents": [
        "ee658a741f029a5d0aa5ab27b2d338296e04706f"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Oct 03 10:15:19 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Thu Oct 08 11:02:49 2026 +0700"
      },
      "message": "[FIX] Lifecycle: run @PreDestroy of provider-built singletons\n\n@PreDestroy methods were only registered for objects Guice constructs or\ninjects itself. Singletons returned by providers (@Provides methods,\nprovider instances or classes) were never stopped: RabbitMQ event buses,\nchannel pools, the Cassandra session...\n\nThey are now stopped by GuiceJamesServer.stop(), so a production shutdown\nreleases them, and restarting servers in one JVM no longer leaks ~160\nthreads per restart, which lets tests reuse surefire forks.\n\nThe SmtpGuiceProbe and ImapGuiceProbe workarounds destroying their server\nfactories by hand are removed.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ee658a741f029a5d0aa5ab27b2d338296e04706f",
      "tree": "92bab9a463912ab41c0a43270b30f607a4de4210",
      "parents": [
        "96eeaa4247f35ac9b95b75c9cba41c8851ba6ccf"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Tue Oct 06 07:36:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 06 07:36:03 2026 +0200"
      },
      "message": "[SITE] Remove 3.7.x from the download page (#3235)"
    },
    {
      "commit": "96eeaa4247f35ac9b95b75c9cba41c8851ba6ccf",
      "tree": "fe787ac59bc38eda1e49a1a1b0e22e61a2399a2a",
      "parents": [
        "f04989373b4eb397ba10dfa3aace787af1e11b65"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 25 09:41:30 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Oct 05 22:37:38 2026 +0200"
      },
      "message": "[RELEASE] 3.9.1 blog post\n"
    },
    {
      "commit": "f04989373b4eb397ba10dfa3aace787af1e11b65",
      "tree": "b8bafd981f61d75cc91a7c514463d148f06ca670",
      "parents": [
        "7364309d1a247c5b69bb8a8ad270e4005be833ee"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 25 09:39:41 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Oct 05 22:37:38 2026 +0200"
      },
      "message": "[RELEASE] 3.9.1 Upgrade instructions\n"
    },
    {
      "commit": "7364309d1a247c5b69bb8a8ad270e4005be833ee",
      "tree": "de47c6f64fcccebf452aa8b27df3847e05c57e6f",
      "parents": [
        "fa9cc093c7e0ae1a38c70884b073ffeef2b6adea"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 25 09:39:10 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Oct 05 22:37:38 2026 +0200"
      },
      "message": "[RELEASE] Documentation \u0026 dowloads 3.9.0 -\u003e 3.9.1\n"
    },
    {
      "commit": "fa9cc093c7e0ae1a38c70884b073ffeef2b6adea",
      "tree": "059ce4578589bd098abd31d404d5d4d7cc0dc85a",
      "parents": [
        "a1ec79bdd4667c062ab81307e1c2b9ac7d987a08"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 25 09:36:25 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Oct 05 22:37:38 2026 +0200"
      },
      "message": "[RELEASE] 3.9.1 changelog\n"
    },
    {
      "commit": "a1ec79bdd4667c062ab81307e1c2b9ac7d987a08",
      "tree": "6decac158598f39f07ffe8fac88f6b4175351df9",
      "parents": [
        "e49adae86b5ee26b5cb0d222fc4e1a6cc8d1fd6c"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Oct 05 11:47:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 11:47:43 2026 +0200"
      },
      "message": "JAMES-3536 Email/set create: reject bodyStructure and unknown properties (#3234)\n\nbodyStructure is not supported on Email/set create: it used to be\nsilently dropped, storing an email with an empty body. Unknown\nproperties were silently ignored as well.\n\nReject both with an invalidProperties SetError (RFC 8621 section 4.6,\nRFC 8620 section 5.3) listing the offending properties."
    },
    {
      "commit": "e49adae86b5ee26b5cb0d222fc4e1a6cc8d1fd6c",
      "tree": "312c909ca7bde86476aa0856dbeebc087e7ebbef",
      "parents": [
        "1f039b84a48557055edf5793fe40e05440044441"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Oct 05 11:45:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 11:45:38 2026 +0200"
      },
      "message": "[FIX] Memory: findMetadata ignored the messageId, Email/set update corrupted data and stalled (#3233)\n\nIt returned the metadata of every message of every mailbox. JMAP Email/set\nupdate then applied range updates (flags, moves) to unrequested messages.\n\ngroupBy + filterWhen left the groups of unreadable mailboxes unsubscribed:\ntheir elements stayed buffered and, once the groupBy prefetch (256) was\nreached, the Flux never completed.\n\nFilter each element against a per call cache of the Read right instead.\n\nDefensive: restrict the store metadata to the requested ids so that range\nupdates and the `updated` field can not span unrequested messages."
    },
    {
      "commit": "1f039b84a48557055edf5793fe40e05440044441",
      "tree": "75dc56511f658fdade3e17dd73fb6c6c9fe6399d",
      "parents": [
        "d2d6cdf343ba9fe2ef9666f3566e613f93d11f04"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Oct 05 11:37:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 05 11:37:05 2026 +0200"
      },
      "message": "[FIX] JMAP Email/get: combine read level after attachments (#3232)\n\nEmail/get failed with serverFail (NotImplementedError) whenever\n\"attachments\" was followed by another property, as ReadLevel.combine\ndid not handle FastViewWithAttachmentsMetadataReadLevel as first\nargument."
    },
    {
      "commit": "d2d6cdf343ba9fe2ef9666f3566e613f93d11f04",
      "tree": "464b3e2a5f5a7e2c5537d75c23641f3b5e6245e1",
      "parents": [
        "f6a00378ece67c9252b9a14b56c3eb348f052e17"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Oct 02 22:11:56 2026 +0200"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Mon Oct 05 10:31:20 2026 +0700"
      },
      "message": "[FIX] Improve PostgresExecutor cancelation support\n"
    },
    {
      "commit": "f6a00378ece67c9252b9a14b56c3eb348f052e17",
      "tree": "d397471697bf2902fb561889c78e14a2ebad815d",
      "parents": [
        "b3951b6fc55a0630abf2bed0a55fbb1fd894d3b2"
      ],
      "author": {
        "name": "ilya terskov",
        "email": "96711442+prosgarz35@users.noreply.github.com",
        "time": "Sat Oct 03 02:59:32 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 21:59:32 2026 +0200"
      },
      "message": "[ENHANCEMENT] Improve IMAP IDLE\n\n - Harden IMAP IDLE lifecycle and continuation handling"
    },
    {
      "commit": "b3951b6fc55a0630abf2bed0a55fbb1fd894d3b2",
      "tree": "371433364e2fce0ca26a7914e4b91383ae4cde3f",
      "parents": [
        "41c8d9e48824e1a18e3f60acff15a85fd69612eb"
      ],
      "author": {
        "name": "ilya terskov",
        "email": "96711442+prosgarz35@users.noreply.github.com",
        "time": "Sat Oct 03 02:58:09 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 21:58:09 2026 +0200"
      },
      "message": "[UPGRADE] Apache James ActiveMQ to Artemis (#3194)\n\n- Replace embedded ActiveMQ Classic with ActiveMQ Artemis (in-VM)\n- Remove ActiveMQ Classic proprietary BlobMessage implementation in favor of Artemis large messages\n- Update metrics and health checks for Artemis\n- Escape JMS property names to comply with Artemis identifier rules\n- Add system property james.mail.queue.jmx.activated (default false) to control JMX\n- Configure safe durability defaults in sample configuration\n- Document migration in ADR 0076 and upgrade instructions"
    },
    {
      "commit": "41c8d9e48824e1a18e3f60acff15a85fd69612eb",
      "tree": "af63ab8b64081b311ec8c52c6866780eb3718db2",
      "parents": [
        "b93e14fe2d9d4807933a5fa432b9337cd19ec91c"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Thu Oct 01 13:29:58 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Oct 02 14:05:26 2026 +0700"
      },
      "message": "[IMPROVEMENT] One RabbitMQ consumers health check fed by MonitoredRabbitMQConsumers\n\nEach consumer health check was its own class. Modules now only contribute\nMonitoredRabbitMQConsumers (name, connection pool of the RabbitMQ server,\nqueues, restart) with @ProvidesIntoSet, and a single\nRabbitMQConsumersHealthCheck checks them all: only the contributions having\na queue without consumer are restarted. Downstream projects can monitor\ntheir consumers, possibly on another RabbitMQ server, without a dedicated\nclass.\n\nContributions are checked concurrently, each on its own thread, so that an\nunresponsive RabbitMQ server does not delay the others, but restarted one\nat a time, as restarting the same component concurrently may not be safe. A\nrestart is given the connection used by the check, composed reactively so\nthat the check never blocks on another connection lookup, and run on the\nblocking call scheduler as restarts may block. Each restart and each error\nis logged with the contribution it concerns.\n\nThe event bus, distributed task manager and mail queue consumer health\nchecks are replaced by contributions (RabbitMQEventBusConsumers,\nRabbitMQMailQueueConsumers, and MonitoredRabbitMQConsumers.of for the task\nmanager). As before, restarting the mail queue consumers runs every\nReconnectionHandler, hence also restarts the other James consumers.\n\nVisible changes:\n - /healthcheck reports a single RabbitMQConsumers component instead of\n   EventbusConsumers-mailboxEvent, EventbusConsumers-jmapEvent,\n   EventbusConsumers-contentDeletionEvent, DistributedTaskManagerConsumers\n   and MailQueueConsumers. Its cause names the queue without consumer.\n - errors are reported as unhealthy, without hiding the other consumers,\n   instead of failing the whole health check call.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b93e14fe2d9d4807933a5fa432b9337cd19ec91c",
      "tree": "87ddf1c3afe417758e485acff6064885a4d87948",
      "parents": [
        "6a8b8bc8bdce3ab18598bf8a8be97fc2d28a60b4"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Thu Oct 01 13:21:52 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Oct 02 14:05:26 2026 +0700"
      },
      "message": "[IMPROVEMENT] One RabbitMQ dead letter queues health check fed by MonitoredDeadLetterQueue\n\nEach dead letter queue health check was its own class. Modules now only\ncontribute a MonitoredDeadLetterQueue (RabbitMQ configuration, queue)\nwith @ProvidesIntoSet, and a single RabbitMQDeadLetterQueuesHealthCheck\nchecks them all, concurrently, each on its own RabbitMQ server. Downstream\nprojects can monitor their dead letter queues without a dedicated class.\n\nThe mailbox, JMAP and content deletion event bus and the mail queue dead\nletter queue health checks are replaced by contributions.\n\nVisible changes:\n - /healthcheck reports a single RabbitMQDeadLetterQueues component\n   instead of RabbitMQMailboxEventBusDeadLetterQueueHealthCheck,\n   RabbitMQJmapEventBusDeadLetterQueueHealthCheck,\n   RabbitMQContentDeletionEventBusDeadLetterQueueHealthCheck and\n   RabbitMQMailQueueDeadLetterQueueHealthCheck. Its cause names the\n   affected queues.\n - an error on one queue makes the result unhealthy without hiding the\n   other queues. Each error is logged with the queue it concerns, and all\n   errors are kept, as suppressed exceptions, in the result.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "6a8b8bc8bdce3ab18598bf8a8be97fc2d28a60b4",
      "tree": "6d36f9565c804f1f41189ffb543f2d6df2ad5dbb",
      "parents": [
        "deddd71987df8f11d0131dfebebc611cd1b1af77"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Thu Oct 01 11:29:08 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Oct 02 14:05:26 2026 +0700"
      },
      "message": "[FIX] RabbitMQ mail queue consumer health check should restart consumers\n\nWhen a mail queue work queue had no consumer, the health check called each\nReconnectionHandler but never subscribed to the returned publishers, so no\nconsumer was restarted. This regressed when the health check was made\nreactive in d4bf925441: JAMES-3955 used to block on each handler.\n\nThe handlers are now subscribed in sequence, as SimpleConnectionPool does\non reconnection.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "deddd71987df8f11d0131dfebebc611cd1b1af77",
      "tree": "62ec80694eef7a5779765c81ceb749c7a802381b",
      "parents": [
        "b8567c4af189350a25212830841ec59355a21ce4"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 23:55:22 2026 +0200"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Fri Oct 02 09:24:28 2026 +0700"
      },
      "message": "[ENHANCEMENT] Add OIDC validation failure info in logs\n"
    },
    {
      "commit": "b8567c4af189350a25212830841ec59355a21ce4",
      "tree": "164b5d501d85e7541775f3dfdf37fa07045b97f7",
      "parents": [
        "ac241179b804fa36bd43f7e099530dec09f564a2"
      ],
      "author": {
        "name": "ilya terskov",
        "email": "96711442+prosgarz35@users.noreply.github.com",
        "time": "Thu Oct 01 16:29:44 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 11:29:44 2026 +0200"
      },
      "message": "[FIX] DSN hooks disconnect the SMTP session on malformed NOTIFY/ORCPT/ENVID parameters (#3217)\n\nWhy this is needed\nRFC 3461 §4.1 requires servers to reject malformed DSN parameters (NOTIFY, ORCPT, ENVID) with a syntax error — not to drop the connection. Right now, DSNMailParameterHook and DSNRcptParameterHook don\u0027t catch the IllegalArgumentException thrown by DsnParameters on invalid input, so it propagates all the way to Netty, which treats it as fatal and disconnects the TCP session.\n\nIn practice: any client that sends a slightly malformed DSN parameter — e.g. RCPT TO:\u003ca@x\u003e NOTIFY\u003dBOGUS, or ORCPT without the rfc822; prefix, or a non-xtext ENVID — gets its entire SMTP session killed instead of a 501 it could recover from. This is a spec-compliance bug and a minor DoS vector (one bad parameter costs the client its whole connection, not just the command).\n\nWhat changed\nBoth hooks now catch IllegalArgumentException around the existing DsnParameters parsing calls and return a 501 5.5.4 response, reusing the same HookResult pattern already used elsewhere in this module (MailSizeEsmtpExtension.SYNTAX_ERROR). No new abstractions, no changes to DsnParameters itself — its \"throw on invalid input\" contract is correct and tested at that layer; it just needs to be caught at the SMTP-protocol boundary.\n\nRET (already Optional-based, silently ignoring invalid values) is left untouched — out of scope for this fix."
    },
    {
      "commit": "ac241179b804fa36bd43f7e099530dec09f564a2",
      "tree": "0906d8ce6364143c3d4ca1e16212ba1f282d2cbe",
      "parents": [
        "9f898f0796a5fc29f7fdaa0a3572a3d137df2980"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Tue Sep 29 14:22:32 2026 +0700"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:28:13 2026 +0200"
      },
      "message": "JAMES-2586 Cancel the Postgres query upon jOOQ reactive timeout in executeTransaction\n\n`executeTransaction`, introduced by #3203, only logged the jOOQ reactive\ntimeout. The timed out query kept running on the Postgres server, and the\nerror only reached the caller once the connection was released, that is\nonce the query completed on its own: the caller and the pooled\nconnection stayed blocked for as long as the query ran.\n\nHandle its timeout like the other `PostgresExecutor` methods: cancel the\nrunning query through r2dbc-postgresql `cancelRequest()` before\npropagating the error and releasing the connection. The transaction is\nrolled back upon connection release.\n\n`PostgresExecutorTimeoutTest` covers it with a transaction inserting a\nrow then sleeping on the database side, on a single connection pool:\nthe timeout is surfaced right away, the connection is usable right after,\nand the row is not committed.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "9f898f0796a5fc29f7fdaa0a3572a3d137df2980",
      "tree": "7a7e9e40f080f415c0d305a2f83107d82c7336e3",
      "parents": [
        "b19553cd8be6a247a315b687d45f6b926aff6b02"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Sep 26 21:45:56 2026 +0700"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:28:13 2026 +0200"
      },
      "message": "JAMES-2586 Cancel the Postgres query upon jOOQ reactive timeout\n\nUpon TimeoutException, `PostgresExecutor` now asks Postgres to cancel\nthe running query through r2dbc-postgresql `cancelRequest()` (the pooled\nconnection being unwrapped to the driver connection) before propagating\nthe error and releasing the connection. The cancel request goes through\na dedicated connection, so it does not depend on the busy one.\n\nThe connection thus becomes usable again within milliseconds instead of\nstaying busy until the query completes on its own, which prevents a\nsingle slow query from cascading timeouts onto unrelated queries.\n\nThis applies to every execution method, including each page of\n`executeRowsPaginated`.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b19553cd8be6a247a315b687d45f6b926aff6b02",
      "tree": "f0c744f21bd0891305d20bd1a8c1f8837f64dd1f",
      "parents": [
        "eb9f0c0f85e27e2129a4ce2eabc5eb2a7e58f39a"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Sep 26 21:45:07 2026 +0700"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:28:13 2026 +0200"
      },
      "message": "JAMES-2586 Reproduce a pooled Postgres connection staying busy after a timed out query\n\nCancelling the reactive pipeline upon `jooq.reactive.timeout` does not\nstop the query on the Postgres server: the connection keeps processing\nit and is handed back to the pool in that state. The next query\nacquiring that connection queues behind the still running statement\nand times out in turn, which cascades into the \"everything needing\nPostgres fails, then sometimes recovers\" behaviour of\nlinagora/tmail-backend#1599.\n\nPostgresExecutorTimeoutTest reproduces it with a pool of a single\nconnection and a 60 seconds `pg_sleep`:\n - a query stalling on the database side must time out,\n - right after the timeout, a query on that connection must succeed.\nThe latter fails before the fix.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "eb9f0c0f85e27e2129a4ce2eabc5eb2a7e58f39a",
      "tree": "48192e0c8d199afe31309fbc435ff1e63da8ed66",
      "parents": [
        "0baecc4b26bc89cdc74e475b13df38dd58770ce5"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Fri Sep 25 19:32:26 2026 +0700"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:28:13 2026 +0200"
      },
      "message": "JAMES-2586 Upgrade jOOQ to 3.20.20 and r2dbc-postgresql to 1.1.3\n\nBoth releases carry fixes for the query cancellation scenarios the\n`jooq.reactive.timeout` safety net was introduced for:\n\n - jOOQ#20112 (fixed in 3.20.20): cancelling an in-flight R2DBC query\n   could orphan the row subscription and permanently poison the pooled\n   connection, every later query on it hanging silently.\n - r2dbc-postgresql#661 (fixed in 1.1.3): the client could get stuck on\n   a cancelled conversation, the connection never being drained.\n\n`PostgresConfigurationTest` is adapted to the more detailed invalid SSL\nmode message of the new driver.\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "0baecc4b26bc89cdc74e475b13df38dd58770ce5",
      "tree": "f33d0314736a253288b77921abd3893928d3a685",
      "parents": [
        "3e54de48f4181ca0a80f5564bd7cdd3b60d67264"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Sat Sep 26 21:41:22 2026 +0700"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:28:13 2026 +0200"
      },
      "message": "JAMES-2586 Regression test for throttled full re-indexing on Postgres\n\nA throttled full re-indexing on the Postgres app\n(`/mailboxes?task\u003dreIndex\u0026messagesPerSecond\u003dN`) used to fail after exactly\n`jooq.reactive.timeout` (10 seconds by default) with:\n\n  PostgresExecutor - Time out executing Postgres query. May need to check\n  either jOOQ reactive issue or Postgres DB performance.\n  java.util.concurrent.TimeoutException: Did not observe any item or\n  terminal signal within 10000ms in \u0027flatMapMany\u0027\n\nThe re-indexing lists every mailbox with a mailbox concurrency of 1 and\nthrottles the messages of each mailbox, so a streamed listing query was\nkept open while the first mailbox was slowly re-indexed, and the reactive\ntimeout fired while Postgres only waited for downstream demand.\n\nPaginated listings (see \"[FIX] PG: Generalise streaming with paging\") no\nlonger hold a query open during the consumption. This test locks in the\nreported scenario on a Guice Postgres server, with a 2 seconds timeout\nand 1 message per second over two mailboxes.\n\n`PostgresExtension.withJooqReactiveTimeout` allows tests to shorten the\ntimeout.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "3e54de48f4181ca0a80f5564bd7cdd3b60d67264",
      "tree": "7feb4c9470f0aefd96b47c81966d583f52d0b91f",
      "parents": [
        "9eb0bd40d7731a9d0ea8cc98c7888ca1318d7385"
      ],
      "author": {
        "name": "ilya terskov",
        "email": "96711442+prosgarz35@users.noreply.github.com",
        "time": "Thu Oct 01 16:27:11 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 11:27:11 2026 +0200"
      },
      "message": "[ENHANCEMENT] Apache James Blob File Sharding (#3197)\n\nReuses semantic of MinIO blobstore and enables it by default onto the file blob store"
    },
    {
      "commit": "9eb0bd40d7731a9d0ea8cc98c7888ca1318d7385",
      "tree": "46c354d7290a440cf65e1e157293155852eb9d95",
      "parents": [
        "7fcc86b199b52cb09c2311a222f4e79b402af67b"
      ],
      "author": {
        "name": "ilya terskov",
        "email": "96711442+prosgarz35@users.noreply.github.com",
        "time": "Thu Oct 01 16:25:38 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 11:25:38 2026 +0200"
      },
      "message": "[FIX] DNSJavaService: Avoid mutating unmodifiable collection and skipping fallback on resolution failure (#3211)\n\nFixes issues in DNSJavaService.findMXRecords:\n- Avoid modifying unmodifiable collection or throwing UnsupportedOperationException when raw MX records list is empty.\n- Do not execute A fallback when TemporaryResolutionException is thrown by raw MX lookup.\n- Include unit and non-regression tests in DNSJavaServiceTest."
    },
    {
      "commit": "7fcc86b199b52cb09c2311a222f4e79b402af67b",
      "tree": "d0796db8666dfddff626ac2d44059dd8757c11f9",
      "parents": [
        "12f81582a9671fe0529d40559de6d6992eaff598"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 30 09:44:25 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:24:40 2026 +0200"
      },
      "message": "[ENHANCEMENT] SolveMessageInconsistencies: offer to cleanup mailbox entry without backing content\n"
    },
    {
      "commit": "12f81582a9671fe0529d40559de6d6992eaff598",
      "tree": "3699f410af038625ee7479927fb21e5c55c3088d",
      "parents": [
        "a1a3581b37eb0b59ba86eeeb9511920d228894e0"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 30 09:19:26 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:24:40 2026 +0200"
      },
      "message": "[ENHANCEMENT] SolveMessageInconsistencies: do not propagate imapUidTable entries without messageV3\n\nAn orphan imapUidTable entry was blindly re-inserted into messageIdTable.\nWhen the message content (messageV3) is missing, typically because deleted\ndata got resurrected after tombstones were purged without repair, this\nexposes a message that can not be read.\n\nCheck messageV3 (READ profile, QUORUM by default) before propagating.\nWhen absent, skip the entry, log it and report it as an error.\n"
    },
    {
      "commit": "a1a3581b37eb0b59ba86eeeb9511920d228894e0",
      "tree": "93aa0b003dd1e0bc48f01731b4a8b46046ce6829",
      "parents": [
        "0ee35cd6c691613b0995c4e0e7968ea1364d0757"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 30 09:18:59 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:24:40 2026 +0200"
      },
      "message": "[FIX] Re-enable SolveMessageInconsistenciesServiceTest\n\nThe test was commented out by JAMES-3576 (message denormalization) and\nnever restored. Adapt it to the current DAO APIs and query strings.\n\nDoing so reveals that outdated messageIdTable entries were not fully\nfixed: flags were diffed against an empty set, so flags only present in\nthe stale record (eg \\Seen) were never removed.\n"
    },
    {
      "commit": "0ee35cd6c691613b0995c4e0e7968ea1364d0757",
      "tree": "76aaa42e0c89a6c4114a367bb8d438829c4969e2",
      "parents": [
        "9aac85900f94cb56db9f0b24c91b7c983cb49332"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Oct 01 11:24:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 11:24:28 2026 +0200"
      },
      "message": "[ENHANCEMENT] Store shall preserve ObjectNotFoundException (#3222)"
    },
    {
      "commit": "9aac85900f94cb56db9f0b24c91b7c983cb49332",
      "tree": "9eaac392207d2bd37600474bdfc88794fab8b0e7",
      "parents": [
        "51867068cf03c006836274f9baa8451a99ee2cde"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Tue Sep 29 22:48:00 2026 +0200"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Wed Sep 30 09:16:28 2026 +0700"
      },
      "message": "[FIX] Plug MailboxMerging error stream in parent task\n"
    },
    {
      "commit": "51867068cf03c006836274f9baa8451a99ee2cde",
      "tree": "e6cf07ba956503acc563d531d7c158051f0f0f3b",
      "parents": [
        "9a7b37b8627db56da404fc9309b6da92b45f00f1"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Tue Sep 29 12:05:50 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 12:05:50 2026 +0200"
      },
      "message": "[FIX] PG pagination: buffer next page locally (#3215)"
    },
    {
      "commit": "9a7b37b8627db56da404fc9309b6da92b45f00f1",
      "tree": "57d6bfb230d30541bcc66a46583e9e0b8bf78234",
      "parents": [
        "c75c5fd537b471e633eb93c270d49aaaa58029d3"
      ],
      "author": {
        "name": "ilya terskov",
        "email": "96711442+prosgarz35@users.noreply.github.com",
        "time": "Tue Sep 29 03:01:50 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 22:01:50 2026 +0200"
      },
      "message": "[IMPROVEMENT] PostgresExecutor: add reactive executeTransaction method (#3203)"
    },
    {
      "commit": "c75c5fd537b471e633eb93c270d49aaaa58029d3",
      "tree": "cd3b42f32ebbcaa913fec38a7641244f7adc7243",
      "parents": [
        "98222025ba6b94e79e50b46a5308d856506c1755"
      ],
      "author": {
        "name": "Serg Tanichev",
        "email": "tanichev@email-spam-tester.com",
        "time": "Mon Sep 28 21:59:50 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 21:59:50 2026 +0200"
      },
      "message": "[DOC] k8s checklist: verify inbox placement after setup (#3196)"
    },
    {
      "commit": "98222025ba6b94e79e50b46a5308d856506c1755",
      "tree": "71d36dc14b9754d7675b74e508eb755fc971de8f",
      "parents": [
        "274f65f94ddcae706d1d1017fe8d6afefb2daee5"
      ],
      "author": {
        "name": "ilya terskov",
        "email": "96711442+prosgarz35@users.noreply.github.com",
        "time": "Mon Sep 28 13:38:19 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 08:38:19 2026 +0200"
      },
      "message": "JAMES-4223 Default S3 If-None-Match to true to prevent silent blob overwrite"
    },
    {
      "commit": "274f65f94ddcae706d1d1017fe8d6afefb2daee5",
      "tree": "02a2531d61a35e226392c35547a85807e90599d2",
      "parents": [
        "dc7900624aaddd066f34c9e2ba76d6e38d259769"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 25 15:43:28 2026 +0200"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Mon Sep 28 11:34:49 2026 +0700"
      },
      "message": "[ENHANCEMENT] Prevent verbose logs when WS client disconnect during handshake\n\nSolves this:\n\njava.lang.NullPointerException: Cannot invoke \"java.lang.Boolean.booleanValue()\" because the return value of \"io.netty.util.Attribute.get()\" is null\n\tat reactor.netty.Connection.isPersistent(Connection.java:248)\n\tat reactor.netty.channel.ChannelOperations.isPersistent(ChannelOperations.java:607)\n\tat reactor.netty.ReactorNetty.addHandlerBeforeReactorEndHandlers(ReactorNetty.java:390)\n\tat reactor.netty.Connection.addHandlerLast(Connection.java:165)\n\tat reactor.netty.http.websocket.WebsocketInbound.lambda$aggregateFrames$0(WebsocketInbound.java:86)\n\tat reactor.netty.http.server.HttpServerOperations.withConnection(HttpServerOperations.java:250)\n\tat reactor.netty.http.server.HttpServerOperations.withConnection(HttpServerOperations.java:124)\n\tat reactor.netty.http.websocket.WebsocketInbound.aggregateFrames(WebsocketInbound.java:86)\n\tat reactor.netty.http.websocket.WebsocketInbound.aggregateFrames(WebsocketInbound.java:74)\n\tat org.apache.james.jmap.routes.WebSocketRoutes.handleWebSocketConnection(WebSocketRoutes.scala:119)\n"
    },
    {
      "commit": "dc7900624aaddd066f34c9e2ba76d6e38d259769",
      "tree": "7e878af60dfe08b899ca5fcb4d749ebb99b07d94",
      "parents": [
        "04ba2038348314c33c620e84815aedf86dc8fa81"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 25 15:14:16 2026 +0200"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Mon Sep 28 11:32:28 2026 +0700"
      },
      "message": "[FIX] PG: Generalise streaming with paging\n"
    },
    {
      "commit": "04ba2038348314c33c620e84815aedf86dc8fa81",
      "tree": "8369bde08619a587dc3f963824ef0c9c3f0af442",
      "parents": [
        "643e69a6818a1b2ce477e195c47a8a373665c60b"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Sat Sep 26 20:27:09 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Mon Sep 28 10:50:26 2026 +0700"
      },
      "message": "[ENHANCEMENT] Remove bidi control chars from attachment names\n"
    },
    {
      "commit": "643e69a6818a1b2ce477e195c47a8a373665c60b",
      "tree": "5f820b0fe82f3662fcb135ea8b58e65c982bca43",
      "parents": [
        "e9feb821cebdb6e435f465fbe98bd0dcc83db8fd"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Fri Sep 25 11:02:23 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Mon Sep 28 09:23:12 2026 +0700"
      },
      "message": "JAMES-4222 Disable flaky test deleteBucketConcurrentlyShouldNotFail for Ceph\n\nThe outdated Ceph demo image can return NoSuchKey during concurrent bucket deletion, making this a flaky test. \"\n        + \"Newer production Ceph is likely unaffected; related RGW admin API fix: \"\n        + \"https://tracker.ceph.com/issues/53731\n"
    },
    {
      "commit": "e9feb821cebdb6e435f465fbe98bd0dcc83db8fd",
      "tree": "56fd270f16d9996baa2448346cbb5cef8cb0d7c7",
      "parents": [
        "e30f399730bf88e872a0abc480541a922bbe58cf"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Fri Sep 25 10:35:31 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Mon Sep 28 09:23:12 2026 +0700"
      },
      "message": "JAMES-4222 Triage S3 Ceph against blob store DAO contract\n"
    },
    {
      "commit": "e30f399730bf88e872a0abc480541a922bbe58cf",
      "tree": "d11c8501f2e386ed04ea60e77597d65e5537b2bd",
      "parents": [
        "bf100353ac3c4fc76d9ecced7472528b43e1ca21"
      ],
      "author": {
        "name": "Quan Tran",
        "email": "hqtran@linagora.com",
        "time": "Tue Sep 08 09:27:41 2026 +0700"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Mon Sep 28 09:23:12 2026 +0700"
      },
      "message": "JAMES-4222 Add reusable Ceph S3 test container\n\nIntroduce an always-on Testcontainers fixture backed by pinned Ceph 19.2.0 Squid and cover basic S3 write/read compatibility. Later S3 compatibility work can reuse the container and JUnit extension.\n"
    },
    {
      "commit": "bf100353ac3c4fc76d9ecced7472528b43e1ca21",
      "tree": "6dfd7a549dd9631e910ea6ca78e3b0f6d054a05d",
      "parents": [
        "90b2617aa95ae3f6f1d8e388853d28358b92ccf6"
      ],
      "author": {
        "name": "Hesanda Liyanage",
        "email": "130324291+HesandaLiyanage@users.noreply.github.com",
        "time": "Thu Sep 24 11:59:04 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 24 08:29:04 2026 +0200"
      },
      "message": "[IMPROVEMENT] Zstd: Contract and test coverage for ZstdBlobStoreDAO atop file and memory implementations (#3199)\n\nFollowing PMC feedback regarding ZstdBlobStoreDAO working out of the box atop the file implementation:\n\n- Extract ZstdBlobStoreDAOContract interface extending BlobStoreDAOContract and MetadataAwareBlobStoreDAOContract.\n- Add ZstdFileBlobStoreDAOTest verifying ZstdBlobStoreDAO works out of the box atop FileBlobStoreDAO.\n- Add ZstdMemoryBlobStoreDAOTest for lightweight in-memory contract verification without requiring Docker.\n- Refactor ZstdBlobStoreDAOTest to implement ZstdBlobStoreDAOContract against S3BlobStoreDAO.\n- Add File and Postgres BlobStore module choosing tests in BlobStoreModulesChooserTest."
    },
    {
      "commit": "90b2617aa95ae3f6f1d8e388853d28358b92ccf6",
      "tree": "6c76329bd4d1dcaf24c492da90dce1d5e0598c62",
      "parents": [
        "c32d3fcc7da4841a16d254e0b66a0664685b200a"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 20:25:56 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] Postgres 42.7.7 -\u003e 42.7.13\n"
    },
    {
      "commit": "c32d3fcc7da4841a16d254e0b66a0664685b200a",
      "tree": "43b9e5d57680c01d442373fb648a63d58e7c0ef1",
      "parents": [
        "9947e1cac618b975726687a54d4ba151611a0c8e"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 20:25:28 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] Micrometer\n"
    },
    {
      "commit": "9947e1cac618b975726687a54d4ba151611a0c8e",
      "tree": "80af278e1c2f5d2d944fa7ce6b1b755f7289fb2e",
      "parents": [
        "c5d166fc8ab297c79033d7d20c77c9e4149eb7ce"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 20:25:12 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] logback 1.5.18 -\u003e 1.5.38\n"
    },
    {
      "commit": "c5d166fc8ab297c79033d7d20c77c9e4149eb7ce",
      "tree": "dbd944953748a14f2024d47564c70d3939e83f18",
      "parents": [
        "c564b92210b9c444ad183e2b1b057ec5109e14bd"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 20:24:43 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] angus-mail 2.0.3 -\u003e 2.0.5\n"
    },
    {
      "commit": "c564b92210b9c444ad183e2b1b057ec5109e14bd",
      "tree": "f08eaf7c5bddff5bbd515187748f0ccef31d8271",
      "parents": [
        "6114c357bba7bd03f5bcdef3472375dfd9565222"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 20:24:18 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] log4j2 2.24.3 -\u003e 2.25.5\n"
    },
    {
      "commit": "6114c357bba7bd03f5bcdef3472375dfd9565222",
      "tree": "757a4f6b193682f27181d8fc5ccb8b22fef391a5",
      "parents": [
        "fff51e8c13d60f5bfb2ba968beb803c13d44b2dc"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 20:23:46 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "POM: exclude ApacheHttpClient5Transport from OpenSearch code\n"
    },
    {
      "commit": "fff51e8c13d60f5bfb2ba968beb803c13d44b2dc",
      "tree": "65c44e85e07eb5e94b4bcb20d221e06675cf65eb",
      "parents": [
        "c087c368ea0119e661e00f3429574ce59c7a3c90"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 11 16:04:11 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] bouncycastle 1.82 -\u003e 1.85.2\n"
    },
    {
      "commit": "c087c368ea0119e661e00f3429574ce59c7a3c90",
      "tree": "c3e1094acf8cef23ea3df6787c13d8c92feb629a",
      "parents": [
        "956563ddf6c76589d5e2edc3858c157ef803a65c"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 11 16:02:26 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] amqp-client 5.33.1 -\u003e 5.35.0\n"
    },
    {
      "commit": "956563ddf6c76589d5e2edc3858c157ef803a65c",
      "tree": "255e9d046ec3fc2d63f16f4d711371d5c7740bcc",
      "parents": [
        "970285b0cf7db6fd5335cca046a5258c296b9a71"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 11 16:01:37 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] Jsoup 1.23.1 -\u003e 1.23.2\n"
    },
    {
      "commit": "970285b0cf7db6fd5335cca046a5258c296b9a71",
      "tree": "3a3a4ce411093ee785be4ac30be4547b79210276",
      "parents": [
        "5cd303d6cae66959796d042fdf028b4fcbc9366b"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 11 16:00:54 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Wed Sep 23 10:30:32 2026 +0700"
      },
      "message": "[UPGRADE] Spark http 3.0.4 -\u003e 3.0.5\n"
    },
    {
      "commit": "5cd303d6cae66959796d042fdf028b4fcbc9366b",
      "tree": "81bdfe35128cbf68d2bf71afa2003c5e95630ce1",
      "parents": [
        "956f9493a278fb549d5c9eaddd33602eae23c90f"
      ],
      "author": {
        "name": "Felix Auringer",
        "email": "felix.auringer@giz.berlin",
        "time": "Tue Sep 22 09:40:51 2026 +0200"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Tue Sep 22 16:39:35 2026 +0700"
      },
      "message": "fix: format of SMTP AUTH ehlo response line\n\nRFC 5321 (https://www.rfc-editor.org/info/rfc5321/#section-4.1.1.1)\nspecifies that a space must follow after the keyword in an EHLO\nresponse.\nHence, the correct format is `250-AUTH PLAIN LOGIN`.\nJames currently additionally sends `250-AUTH\u003dPLAIN LOGIN`.\nThis seems to be for backward compatibility with clients that\nare not RFC compliant. According to the postfix docs\n(https://www.postfix.org/postconf.5.html#broken_sasl_auth_clients),\nthis applies to very old clients, so this should not be the\ndefault behavior.\n"
    },
    {
      "commit": "956f9493a278fb549d5c9eaddd33602eae23c90f",
      "tree": "0e30dd43ed00def1e71a353f8cf5e9f174cfff07",
      "parents": [
        "3bd39da2f16a1d8e15964fc28bb450287ed7a07b"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Fri Sep 18 13:02:01 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 21 08:44:23 2026 +0200"
      },
      "message": "JAMES-4228 Advertize invalid recipients\n"
    },
    {
      "commit": "3bd39da2f16a1d8e15964fc28bb450287ed7a07b",
      "tree": "7ee3b49fa82a68a5ad1a4fb145c7bf1d8bf7c92b",
      "parents": [
        "9f6f43b1b3f01a706238bd739e7bd045d18ebcc4"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 14 07:04:14 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 21 08:44:23 2026 +0200"
      },
      "message": "JAMES-4228 Make integration tests per-class using peruser isolation strategy\n"
    },
    {
      "commit": "9f6f43b1b3f01a706238bd739e7bd045d18ebcc4",
      "tree": "15875cee82890f188b73ee45d7d9127fdd537ff4",
      "parents": [
        "534980c8973ec3339cc66a54d25a835687a374a0"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 10 14:18:09 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 21 08:44:23 2026 +0200"
      },
      "message": "JAMES-4228 Allow user to supply his own validations for EmailSubmission/set\n"
    },
    {
      "commit": "534980c8973ec3339cc66a54d25a835687a374a0",
      "tree": "3705f4c8eb1bbbe0fd0a32fc5bece6970ae0c95f",
      "parents": [
        "7f91ba459bbb411670ecc0d372d97612c10c2843"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 10 14:00:29 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 21 08:44:23 2026 +0200"
      },
      "message": "JAMES-4228 ValidRcptEmailSubmissionSetValidation integration test\n"
    },
    {
      "commit": "7f91ba459bbb411670ecc0d372d97612c10c2843",
      "tree": "b0571d2aacf061c6ad5007f3ea912e5d9281ab95",
      "parents": [
        "7153ba836fd12f67a161f823b0176b4b3a939761"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 10 13:37:11 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 21 08:44:23 2026 +0200"
      },
      "message": "JAMES-4228 Plug EmailSubmissionSetValidation into EmailSubmissionSetMethod\n"
    },
    {
      "commit": "7153ba836fd12f67a161f823b0176b4b3a939761",
      "tree": "f72f840277332864bd4b92e92dcba7c24474b01a",
      "parents": [
        "3be6d50880d6668fa7f13dbf07ac423d7436d998"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 10 13:01:18 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 21 08:44:23 2026 +0200"
      },
      "message": "JAMES-4228 ValidRcptEmailSubmissionSetValidation\n"
    },
    {
      "commit": "3be6d50880d6668fa7f13dbf07ac423d7436d998",
      "tree": "9fd08b6e3866b50083b2227327f8bb74a44568d5",
      "parents": [
        "e3957d0e1a4f50d88fee03698ce427e9e8d7c84d"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 10 12:44:12 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 21 08:44:23 2026 +0200"
      },
      "message": "JAMES-4228 Extract RecipientValidator into data-api\n"
    },
    {
      "commit": "e3957d0e1a4f50d88fee03698ce427e9e8d7c84d",
      "tree": "26d691da986bbfc98c2f982acbc6442e90173e90",
      "parents": [
        "9316b63a2b15e14128de9db3d1f81c5939ed5e29"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 16:17:43 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:13:17 2026 +0700"
      },
      "message": "[BUILD] Fix typo\n"
    },
    {
      "commit": "9316b63a2b15e14128de9db3d1f81c5939ed5e29",
      "tree": "f82e5696b4334119e3ce1228ce934a77749edb7a",
      "parents": [
        "021fd372629ade2a277e1e7ead00fa2c78d84ada"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 14:46:35 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:13:17 2026 +0700"
      },
      "message": "[BUILD] Webadmin integration tests: polling for vault tests\n"
    },
    {
      "commit": "021fd372629ade2a277e1e7ead00fa2c78d84ada",
      "tree": "e0066d9f84064143e20cfe368532c6c6d2120fdc",
      "parents": [
        "7051455daae1d0a573713a714a7f87cb4594af0e"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 14:45:19 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:13:17 2026 +0700"
      },
      "message": "[BUILD] Webadmin integration tests: improve PG lifecycle\n"
    },
    {
      "commit": "7051455daae1d0a573713a714a7f87cb4594af0e",
      "tree": "72078d80abaac4a6f55a889a7b7219470e90269b",
      "parents": [
        "0428a28c1326fc10f5699d77973369dd19a15812"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 14:43:58 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:13:17 2026 +0700"
      },
      "message": "[BUILD] Webadmin Integration test: move tests as immutable when possible\n"
    },
    {
      "commit": "0428a28c1326fc10f5699d77973369dd19a15812",
      "tree": "426b3c7c6018f0fae03955e46738fc4d385e8cc9",
      "parents": [
        "b37a5bd9e92e0240dce608d0a14dfb9945c13e14"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 09:42:29 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:10:02 2026 +0700"
      },
      "message": "[BUILD] S3: Reuse driver accross tests\n"
    },
    {
      "commit": "b37a5bd9e92e0240dce608d0a14dfb9945c13e14",
      "tree": "3a613f283ad1c6f22145739fd763563e75b0e9f4",
      "parents": [
        "a3987253c3e83e8f2b1c20b16d2771bc985bbb0f"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 09:41:14 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:10:02 2026 +0700"
      },
      "message": "[BUILD] S3: turn off expensive LOG_LEVEL trace\n"
    },
    {
      "commit": "a3987253c3e83e8f2b1c20b16d2771bc985bbb0f",
      "tree": "04812dbdd44912a3aa81e0a0039f0d038e8a5c1c",
      "parents": [
        "f3e75dc7efc85fb67c926183bd0da920940b736c"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 09:39:36 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:10:02 2026 +0700"
      },
      "message": "[BUILD] Cassandra: play the 100MB test once\n"
    },
    {
      "commit": "f3e75dc7efc85fb67c926183bd0da920940b736c",
      "tree": "bc25681260edda1cdb6f29c4045eb6c14a6a1c0c",
      "parents": [
        "cfc54791b408c43912bab5ba5daadc6b1b9918fe"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 09:39:12 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:10:02 2026 +0700"
      },
      "message": "[BUILD] Blob: 20 -\u003e 10 operation count for big saves\n"
    },
    {
      "commit": "cfc54791b408c43912bab5ba5daadc6b1b9918fe",
      "tree": "2bbec33cc130d51b2c765e1aba4ef532685d2172",
      "parents": [
        "ac86e0353cc82e6c9717c3f2c4d9fa27ec9ff9f0"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 09:38:42 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:10:02 2026 +0700"
      },
      "message": "[BUILD] S3: configurable healthcheck timeout\n"
    },
    {
      "commit": "ac86e0353cc82e6c9717c3f2c4d9fa27ec9ff9f0",
      "tree": "532eb34074749599ec7d46e47d302066e624f5a1",
      "parents": [
        "a422974e93ec3fbde4e3eb2e2eba3401cfedc263"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 09:37:31 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Fri Sep 18 14:10:02 2026 +0700"
      },
      "message": "[BUILD] Cassandra: max test played 500 -\u003e 1000\n"
    },
    {
      "commit": "a422974e93ec3fbde4e3eb2e2eba3401cfedc263",
      "tree": "2a358aed4baaa01ca6e746ea6fac90e602da8bc4",
      "parents": [
        "90b1bbe6ecae12e021e4dff9e01051259a330884"
      ],
      "author": {
        "name": "TianHengZhuang",
        "email": "39034691+TianHengZhuang@users.noreply.github.com",
        "time": "Fri Sep 18 14:49:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 08:49:01 2026 +0200"
      },
      "message": "Fix typo in RemoveMimeHeaderTest method name (Occured -\u003e Occurred) (#3178)"
    },
    {
      "commit": "90b1bbe6ecae12e021e4dff9e01051259a330884",
      "tree": "9394c48f8563cd5a4efbe20b21e219036e39eeae",
      "parents": [
        "b3a6cae131a2b2cb3813ab2fe6877633caba674b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Sep 17 15:10:15 2026 +0000"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Thu Sep 17 23:26:05 2026 +0200"
      },
      "message": "Bump com.rabbitmq:amqp-client from 5.33.1 to 5.34.0\n\nBumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.33.1 to 5.34.0.\n- [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases)\n- [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.33.1...v5.34.0)\n\n---\nupdated-dependencies:\n- dependency-name: com.rabbitmq:amqp-client\n  dependency-version: 5.34.0\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "b3a6cae131a2b2cb3813ab2fe6877633caba674b",
      "tree": "511e06602ff4b0ed8565c68090fbdf41b48a6eeb",
      "parents": [
        "73cb2e9daef2626095fb41aad2a9409f8eb03f14"
      ],
      "author": {
        "name": "Felix Auringer",
        "email": "felix.auringer@giz.berlin",
        "time": "Tue Sep 15 11:57:19 2026 +0200"
      },
      "committer": {
        "name": "Felix Auringer",
        "email": "felix.auringer@protonmail.com",
        "time": "Thu Sep 17 07:49:07 2026 +0200"
      },
      "message": "fix(webapi): Create domain mappings instead of domain alias mappings\n\nPreviously, only the PUT endpoint of /domainMappings used\ndomain alias mapppings. The GET and DELETE endpoints use\ndomain mappings.\n"
    },
    {
      "commit": "73cb2e9daef2626095fb41aad2a9409f8eb03f14",
      "tree": "b69a55942a0247ff8e4cc6e19ffc00e5f2b7a2cc",
      "parents": [
        "2745e651c6b9ee9b2cebfd09745428faf54d4209"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 14 10:49:36 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 20:08:27 2026 +0200"
      },
      "message": "[FIX] PGSQL: always init HSTORE correctly\n"
    },
    {
      "commit": "2745e651c6b9ee9b2cebfd09745428faf54d4209",
      "tree": "139a6e2a5a70cc7d6da98e905f39412ce511e891",
      "parents": [
        "7bcff4a630771a17afa77414ed9843c62bb40094"
      ],
      "author": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Wed Sep 16 14:10:17 2026 +0700"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 18:07:10 2026 +0200"
      },
      "message": "Apply suggestion from @quantranhong1999\n\nCo-authored-by: Trần Hồng Quân \u003c55171818+quantranhong1999@users.noreply.github.com\u003e"
    },
    {
      "commit": "7bcff4a630771a17afa77414ed9843c62bb40094",
      "tree": "9c6a417b10fd5ef8e5b715cb7f614f1f09cf015e",
      "parents": [
        "bbf264dbb76b8b597f150516ce3c3692c319f412"
      ],
      "author": {
        "name": "Rene Cordier",
        "email": "rcordier@linagora.com",
        "time": "Thu Jul 31 16:14:03 2025 +0700"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 18:07:10 2026 +0200"
      },
      "message": "JAMES-4142 Force memory settings for cassandra image even on the CI\n\nWith update to Cass 5 some tests are failing with an OOM docker container crash\n"
    },
    {
      "commit": "bbf264dbb76b8b597f150516ce3c3692c319f412",
      "tree": "161fe257dc7619d7972eaf620a571b09d8a5f7ff",
      "parents": [
        "ff5d0e8619202383b5367ac08d6b6cc9ee12853c"
      ],
      "author": {
        "name": "Rene Cordier",
        "email": "rcordier@linagora.com",
        "time": "Tue Jul 29 09:11:21 2025 +0700"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 18:07:10 2026 +0200"
      },
      "message": "JAMES-4142 Upgrade Docker cassandra image to 5.0.9\n"
    },
    {
      "commit": "ff5d0e8619202383b5367ac08d6b6cc9ee12853c",
      "tree": "ff98aa69eb031de07be161e9ea929dc3e99ce53f",
      "parents": [
        "fd11023bc539585cd67b0703be3bfab73be5720e"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Tue Sep 15 17:29:40 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 08:39:44 2026 +0200"
      },
      "message": "[UPGRADE] cassandra java-driver-core 4.19.1 -\u003e 4.19.3\n"
    },
    {
      "commit": "fd11023bc539585cd67b0703be3bfab73be5720e",
      "tree": "eefe282c0eca87777a6c9cb6915d10dc0a412625",
      "parents": [
        "ea68ee3a4d6c6a16ddfa7eb0aabf158d7b0ce3e9"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Tue Sep 15 15:41:19 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 08:39:44 2026 +0200"
      },
      "message": "[UPGRADE] Netty 4.1.132 -\u003e 4.1.135\n"
    },
    {
      "commit": "ea68ee3a4d6c6a16ddfa7eb0aabf158d7b0ce3e9",
      "tree": "3bdb92f0fb60307f73b8c4959d9b5f6541fb1071",
      "parents": [
        "20f566aacc659ce7137dffe7482be6595edb05a5"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Tue Sep 15 09:15:03 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 08:39:22 2026 +0200"
      },
      "message": "[FIX] Cassandra 5 support .withLZ4Compression(x, y) -\u003e .withLZ4Compression(x)\n"
    },
    {
      "commit": "20f566aacc659ce7137dffe7482be6595edb05a5",
      "tree": "b8df84132ffba1b5152665d56a99051537a1ffe6",
      "parents": [
        "aa4db35d8682c7b56ceead5fddb6d7ee71ab1370"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Tue Sep 15 08:50:27 2026 +0200"
      },
      "committer": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Wed Sep 16 08:39:22 2026 +0200"
      },
      "message": "[FIX] Cassandra 5 support dateof(now()) -\u003e toTimestamp(now())\n"
    },
    {
      "commit": "aa4db35d8682c7b56ceead5fddb6d7ee71ab1370",
      "tree": "34e9e8a6a76ce6e8bf2d46cb4c1b12ae4fcb8dcd",
      "parents": [
        "bd0988f49557600003ca5479310e2e310bdbc990"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 14 17:13:26 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Tue Sep 15 09:54:40 2026 +0700"
      },
      "message": "[BUILD] Deploy snapshot at once (avoid concurrency issues)\n"
    },
    {
      "commit": "bd0988f49557600003ca5479310e2e310bdbc990",
      "tree": "8b625996f555dcda6cd595fc2e129f87d379cb5f",
      "parents": [
        "0a26ed2f8d169ec0d9628035c1f05d8632d385f9"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 14 21:44:45 2026 +0200"
      },
      "committer": {
        "name": "Trần Hồng Quân",
        "email": "55171818+quantranhong1999@users.noreply.github.com",
        "time": "Tue Sep 15 09:53:45 2026 +0700"
      },
      "message": "Drop glowroot integration\n\n - Pinned release is no longer downloadable.\n - Integration do not make sense with a reactive stack\n"
    },
    {
      "commit": "0a26ed2f8d169ec0d9628035c1f05d8632d385f9",
      "tree": "7061cb253bfb8fc23b70f5c7793e6287f243a30c",
      "parents": [
        "6f2a9b799315de59ce8a12f186fb936e8dad0f73"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 14 16:22:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 16:22:00 2026 +0200"
      },
      "message": "[PERF] Allow using tcnative with Cassandra driver (#3181)"
    },
    {
      "commit": "6f2a9b799315de59ce8a12f186fb936e8dad0f73",
      "tree": "99995962898ec7ade9f4df824da6bdf4cecdd53d",
      "parents": [
        "ce40d7f1164533292b768584d352a026fe360cb6"
      ],
      "author": {
        "name": "Benoit TELLIER",
        "email": "btellier@linagora.com",
        "time": "Mon Sep 14 16:21:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 14 16:21:49 2026 +0200"
      },
      "message": "[UPGRADE] ActiveMQ Artemis 2.55.0 -\u003e 2.56.0 (numerous CVEs) (#3174)"
    },
    {
      "commit": "ce40d7f1164533292b768584d352a026fe360cb6",
      "tree": "79e66d03cafd6c3d39582cc741f6d203ee34f8de",
      "parents": [
        "ecf6152a30f004939d11e0f9ea66d5dc40b82901"
      ],
      "author": {
        "name": "TianHengZhuang",
        "email": "39034691+TianHengZhuang@users.noreply.github.com",
        "time": "Sat Sep 12 09:14:34 2026 +0800"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Mon Sep 14 09:40:15 2026 +0700"
      },
      "message": "Fix typo in StripAttachmentTest method name (Occured -\u003e Occurred)"
    },
    {
      "commit": "ecf6152a30f004939d11e0f9ea66d5dc40b82901",
      "tree": "443f08e9689582711517bb2e7150ec22f2e28ade",
      "parents": [
        "2273a954d87ac983521a44adbc2cff7f065a7a5e"
      ],
      "author": {
        "name": "TianHengZhuang",
        "email": "39034691+TianHengZhuang@users.noreply.github.com",
        "time": "Sat Sep 12 09:07:32 2026 +0800"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Mon Sep 14 09:39:30 2026 +0700"
      },
      "message": "Fix typo in LogMessageTest method name (Occured -\u003e Occurred)"
    },
    {
      "commit": "2273a954d87ac983521a44adbc2cff7f065a7a5e",
      "tree": "2e25f470f6c0ec5862062a45c70fb4ac35dd6067",
      "parents": [
        "39d43c553eb17241de50d9aab7563e30d947eaf8"
      ],
      "author": {
        "name": "TianHengZhuang",
        "email": "39034691+TianHengZhuang@users.noreply.github.com",
        "time": "Sat Sep 12 09:04:02 2026 +0800"
      },
      "committer": {
        "name": "Rene Cordier",
        "email": "rene.cordier@gmail.com",
        "time": "Mon Sep 14 09:39:05 2026 +0700"
      },
      "message": "Fix typo in docs README (enviroment -\u003e environment)"
    }
  ],
  "next": "39d43c553eb17241de50d9aab7563e30d947eaf8"
}
