)]}'
{
  "log": [
    {
      "commit": "530f7bf027a1c316b0926369a22f0f92fe81c189",
      "tree": "6fef9b820d3bef9ce31b00b5cc207c94d0039c4a",
      "parents": [
        "ba058f832a014da9970f40902c9762b9d25ec204"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 30 08:08:14 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 30 08:08:14 2026 +0100"
      },
      "message": "build(deps-dev): bump org.jacoco:jacoco-maven-plugin (#2839)\n\nBumps the maven group with 1 update: [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco).\n\n\nUpdates `org.jacoco:jacoco-maven-plugin` from 0.8.15 to 0.8.16\n- [Release notes](https://github.com/jacoco/jacoco/releases)\n- [Commits](https://github.com/jacoco/jacoco/compare/v0.8.15...v0.8.16)\n\n---\nupdated-dependencies:\n- dependency-name: org.jacoco:jacoco-maven-plugin\n  dependency-version: 0.8.16\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: maven\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": "ba058f832a014da9970f40902c9762b9d25ec204",
      "tree": "905d0dfc6a11a12ecd92946d91f93a38f3a1c1eb",
      "parents": [
        "471431607af561188ee5a50954d17b8063af1275"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 29 10:06:49 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 29 10:06:49 2026 +0100"
      },
      "message": "build(deps): bump the maven group with 2 updates (#2838)\n\nBumps the maven group with 2 updates: [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) and [ch.qos.logback:logback-core](https://github.com/qos-ch/logback).\n\n\nUpdates `ch.qos.logback:logback-classic` from 1.6.5 to 1.6.6\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.5...v_1.6.6)\n\nUpdates `ch.qos.logback:logback-core` from 1.6.5 to 1.6.6\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.5...v_1.6.6)\n\nUpdates `ch.qos.logback:logback-core` from 1.6.5 to 1.6.6\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.5...v_1.6.6)\n\n---\nupdated-dependencies:\n- dependency-name: ch.qos.logback:logback-classic\n  dependency-version: 1.6.6\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: ch.qos.logback:logback-core\n  dependency-version: 1.6.6\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: ch.qos.logback:logback-core\n  dependency-version: 1.6.6\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: maven\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": "471431607af561188ee5a50954d17b8063af1275",
      "tree": "d65d21f613889e00bfe51f4f0291931fc034040a",
      "parents": [
        "e508986244f4430b435e48ff50d06e1029686b0e"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 28 00:14:36 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 28 00:14:36 2026 +0100"
      },
      "message": "fix(plc4go/bacnetip): cancel cov subscriptions instead of making them indefinite\n\nUnsubscribe sent SubscribeCOV with lifetime 0, which ASHRAE 135 13.14.1\ndefines as a subscription of indefinite lifetime. The device kept the\nsubscription forever and went on notifying a handle the client had dropped.\nA cancellation is the same request without issueConfirmedNotifications and\nlifetime; Unsubscribe now sends that. Subscribing with lifetime 0 still\nsubscribes indefinitely.\n"
    },
    {
      "commit": "e508986244f4430b435e48ff50d06e1029686b0e",
      "tree": "187284368bcf1ae0d45b6ddafa3f78d973b0929c",
      "parents": [
        "fff423709ae7f3c3fdf60e2d909d17860d990ca6"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 23:52:38 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 23:52:38 2026 +0100"
      },
      "message": "fix(plc4go/bacnetip): allocate cov subscriber process ids per connection\n\nEvery subscription request builder creates its own Subscriber, and each one\ncounted its SubscribeCOV process ids from 1. A COV notification reaches all\nsubscribers of the connection and each routes it by process id alone, so two\nSubscribe calls on one connection handed out the same id and one object\u0027s\nnotifications updated the other object\u0027s tag too.\n\nThe connection now owns the counter and every Subscriber draws from it.\n"
    },
    {
      "commit": "fff423709ae7f3c3fdf60e2d909d17860d990ca6",
      "tree": "c9ac3c2c24ac2429d67fd85306390323041a1238",
      "parents": [
        "810cb284193d01dfc2d8e1e98e06604c570689f8"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 23:22:15 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 23:22:15 2026 +0100"
      },
      "message": "fix(plc4go/bacnetip): refresh COV subscriptions before their lifetime runs out\n\nThe Subscriber claimed to re-issue SubscribeCOV at lifetime/2, but nothing\ndid: every subscription died on the device after CovLifetimeSeconds (600 s by\ndefault) while the handle stayed registered and the connection cache kept the\nconnection alive for it.\n\nConnect now starts a refresh loop that ticks every second and re-issues each\nsubscription whose lifetime is half used up. A failed refresh is retried after\na tenth of the lifetime, not on every tick. Unsubscribe and the refresh loop\nserialize on the handle, so a refresh in flight cannot re-create a cancelled\nsubscription. Close stops the loop.\n"
    },
    {
      "commit": "810cb284193d01dfc2d8e1e98e06604c570689f8",
      "tree": "f44e9029562f28086ff7b119f42b95a25cbe0ca4",
      "parents": [
        "0d90d5bbe5431a74bb6cb12fd4a60a9d3e25dee1"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 09:14:31 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 09:14:31 2026 +0100"
      },
      "message": "fix(plc4go/s7): split reads and writes that exceed the PDU\n\nThe Go driver put every tag of a request into one S7 message, whatever\nthe negotiated PDU size, so a read or write of many tags or of one big\narray was refused by the CPU or answered with a truncated response.\n\nRequests.go ports plc4j\u0027s base optimizer: splitRead groups the tags\ninto reads the PDU can hold, request and response alike, and reads a\ntag too big for one PDU in byte fragments of its read payload, which\nare reassembled and decoded once they are all in. splitWrite groups the\nserialized write items the same way; an item too big for any PDU fails\nits tag with INVALID_DATA without stopping the other tags, since a\nwrite cannot be split without changing what it writes. The parts go\nout one after another through exchange, which sends one request and\nwaits for its response. A tag read or written in several items keeps\nthe first failure.\n\nA request that fits into one PDU goes out exactly as before.\nToPlc4xReadResponse and ToPlc4xWriteResponse became the per-request\napplyReadResponse and applyWriteResponse.\n"
    },
    {
      "commit": "0d90d5bbe5431a74bb6cb12fd4a60a9d3e25dee1",
      "tree": "6533da2cdbfc2cbbb0b968e91a020867539667b2",
      "parents": [
        "0817c8482110fe1419bb288849f6a76258e1033b"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 09:07:28 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 09:07:28 2026 +0100"
      },
      "message": "fix(s7): subscribe cyclic tags with the address a read uses\n\nA cyclic subscription took the tag\u0027s data type, element count and bit\naddress as they are, while a read converts them first: a BOOL array is\nread as the bytes its bits are packed into, a string as its characters,\na type without an own transport size as its bytes. A subscription to\n%DB1:16.6[0..3]:BOOL therefore asked for four BITs at 16.6 - a request a\nread never makes - and its pushes were decoded as if they were a read\nfrom bit 0, as was a STRING subscribed with a count of strings, or a\nTIME subscribed with transport size code 0x00, which the CPU rejects.\n\nBoth drivers now build the cyclic item from the read address\n(S7Optimizer.toS7Address in plc4j, readAddressOf in plc4go), so a push\ncarries what a read returns and decodes the same way. With every\nrequest addressing a BOOL array from bit 0, parsePlcValue takes the bit\noffset from the tag rather than a parameter.\n"
    },
    {
      "commit": "0817c8482110fe1419bb288849f6a76258e1033b",
      "tree": "fc0f505be4992dc3e8606b3f10a3fdd4032a552a",
      "parents": [
        "2d3e1d08cf0debbfda8b1ae6dead67bfb85d34c3"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 09:03:51 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 09:03:51 2026 +0100"
      },
      "message": "fix(plc4j/s7): decode tags split across PDUs\n\nA tag too big for one PDU was split by elements, using the transport\nsize as the element size, and the reassembled bytes were handed back\nas a PlcRawByteArray whatever the type: an INT or REAL array came back\nas raw bytes, and a fixed-length STRING array, whose elements are\nbigger than STRING\u0027s one-byte transport size, read the wrong ranges.\n\nThe read payload now has one definition, S7Optimizer.payloadBytes: what\nthe read address asks for. A tag that does not fit is fetched as byte\nfragments of that payload and decoded with parsePlcValue once every\nfragment is in. It replaces the three hand-kept size formulas\n(sliceLengthFor, tagSizeInBytes and the response estimate), which also\nsizes a var-length STRING right: it reads 256 bytes but was estimated\nas 2 and sliced to 1, so on a 240 byte PDU it failed outright.\n\nA fragment that fails now fails the tag; a later one that succeeded\nused to replace the error with a zero-filled OK value.\nBinding.elementOffset is fragmentByteOffset, since it is one.\n"
    },
    {
      "commit": "2d3e1d08cf0debbfda8b1ae6dead67bfb85d34c3",
      "tree": "305178693498e9276c7a46ab3b4f94c0283ebf36",
      "parents": [
        "2cba3f0d97bd4db17673760714d2cde11a7d1aa5"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 08:57:59 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 08:57:59 2026 +0100"
      },
      "message": "fix(s7): write only a BOOL array\u0027s own bits\n\nA BOOL array was written as the whole bytes its bits are packed into,\npacked from bit 0. Writing %DB1:16.0[0..9]:BOOL cleared 17.2 to 17.7,\nwhich belong to something else, and an array starting inside a byte\nwas written onto the wrong bits.\n\nThe bytes an array covers completely are still written packed; each\nbit it shares a byte with something else now goes out as a BIT item of\nits own, leaving the rest of that byte alone. %DB1:16.6[0..11]:BOOL is\n16.6, 16.7, byte 17, 18.0 and 18.1 - five items. A tag written in\nseveral items reports the first item that failed.\n\nIn plc4j S7WriteChunk now carries the items rather than tag names, and\nthey may span PDUs; a value with fewer elements than the array is\nreported as INVALID_DATA without writing any of it, where it used to\nfail the request with an IndexOutOfBoundsException. In plc4go every\nitem still goes into the one request, and ToPlc4xWriteResponse maps the\nstatuses back through the same decomposition.\n"
    },
    {
      "commit": "2cba3f0d97bd4db17673760714d2cde11a7d1aa5",
      "tree": "b146ca6c546dac5660550d6ad7fd9ccda9b886cf",
      "parents": [
        "40570383e8b83391efa6cd0ddebeebaa6f2a84f8"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 08:51:02 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 08:51:02 2026 +0100"
      },
      "message": "fix(s7): read BOOL arrays that start at a bit offset other than 0\n\nA BOOL array is read as the bytes its bits are packed into, but the\nrequest carried the tag\u0027s bit offset on a byte read and asked for\nceil(n/8) bytes, and the decoder unpacked from bit 0. An array starting\ninside a byte, such as %DB1:16.6[0..3]:BOOL, came back shifted, missing\nthe bits that spill into the next byte, or refused by the PLC.\n\nThe read now asks for every byte the bits touch, from bit 0 of the start\nbyte, and unpacks from the tag\u0027s bit offset - in plc4j (S7Optimizer) and\nplc4go (encodeS7Address/parsePlcValue). Cyclic subscriptions address the\ntag by its bit address and keep decoding from bit 0.\n\nIn plc4j the response size of a BOOL array is now the bytes it covers\nrather than one per element, and an array too big for one PDU is fetched\nas byte fragments and unpacked once they are all in. It used to be split\nas if each BOOL were a byte, which read the wrong ranges and returned\nraw bytes.\n"
    },
    {
      "commit": "40570383e8b83391efa6cd0ddebeebaa6f2a84f8",
      "tree": "3890629f69c7b519850a0ef1a637bef4c7bac268",
      "parents": [
        "7901757a451ec6f67876ab027d49fb99006f9827"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 08:42:50 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 08:43:21 2026 +0100"
      },
      "message": "fix(s7): step the start of a BOOL array selection by bits\n\nThe start of a selection moved the address by the element size in\nbytes, which is right for every type but BOOL: BOOLs are packed eight to\na byte, and TransportSize.BOOL reports one byte, so %DB1:16.0[4]:BOOL\nresolved to 20.0 instead of 16.4. For BOOL the start now counts bits\nfrom the written bit offset, carrying into the next byte, in both plc4j\n(S7Tag.resolveBitAddress) and plc4go (applySelection).\n\nThe S7 address docs still showed the pre-unification :BOOL[{Count}]\nsuffix, which the parser rejects; they now show the selection before\nthe type and say how it counts for BOOL.\n"
    },
    {
      "commit": "7901757a451ec6f67876ab027d49fb99006f9827",
      "tree": "17f85e9964dd3db4efb939c78d9556547687a2d6",
      "parents": [
        "a447b7b152f6c4aab565e256f3b5ff49b39693c5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 27 08:33:26 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 08:33:26 2026 +0100"
      },
      "message": "build(deps): bump the maven group with 3 updates (#2835)\n\nBumps the maven group with 3 updates: [net.bytebuddy:byte-buddy](https://github.com/raphw/byte-buddy), [net.bytebuddy:byte-buddy-agent](https://github.com/raphw/byte-buddy) and [com.google.code.gson:gson](https://github.com/google/gson).\n\n\nUpdates `net.bytebuddy:byte-buddy` from 1.18.15 to 1.18.16\n- [Release notes](https://github.com/raphw/byte-buddy/releases)\n- [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md)\n- [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.18.15...byte-buddy-1.18.16)\n\nUpdates `net.bytebuddy:byte-buddy-agent` from 1.18.15 to 1.18.16\n- [Release notes](https://github.com/raphw/byte-buddy/releases)\n- [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md)\n- [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.18.15...byte-buddy-1.18.16)\n\nUpdates `com.google.code.gson:gson` from 2.14.0 to 2.15.0\n- [Release notes](https://github.com/google/gson/releases)\n- [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/google/gson/compare/gson-parent-2.14.0...gson-parent-2.15.0)\n\nUpdates `net.bytebuddy:byte-buddy-agent` from 1.18.15 to 1.18.16\n- [Release notes](https://github.com/raphw/byte-buddy/releases)\n- [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md)\n- [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.18.15...byte-buddy-1.18.16)\n\n---\nupdated-dependencies:\n- dependency-name: net.bytebuddy:byte-buddy\n  dependency-version: 1.18.16\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: net.bytebuddy:byte-buddy-agent\n  dependency-version: 1.18.16\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.google.code.gson:gson\n  dependency-version: 2.15.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: maven\n- dependency-name: net.bytebuddy:byte-buddy-agent\n  dependency-version: 1.18.16\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\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": "a447b7b152f6c4aab565e256f3b5ff49b39693c5",
      "tree": "361f01dc4455633400d8ab956edd29eab57650bd",
      "parents": [
        "1cf629a0818892a039652c2859598dd7f7512ebe"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 08:30:58 2026 +0100"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 27 08:32:27 2026 +0100"
      },
      "message": "fix(plc4j/s7): unpack BOOL arrays from packed bytes on read\n\nA BOOL array is requested as packed bytes - eight elements to a byte,\nleast significant bit first - but S7CotpConnection.parsePlcValue parsed\nit one DataItem per element. The first element consumed the only byte,\nthe rest failed with BufferUnderflowException, were left null, and\nPlcBOOL.of(null) then threw the NPE that failed the tag with\nINTERNAL_ERROR. The legacy driver unpacked the bits (3a08112369, #2215);\nthat branch was lost when the driver moved to the new SPI. plc4go already\ndecodes them this way.\n\nThe bits are unpacked again, and a response too short for the element\ncount fails the tag. For the other array types a failed element now\nfails the tag with its cause instead of being left null for the value\nhandler to trip over.\n\nFixes #2742\n"
    },
    {
      "commit": "1cf629a0818892a039652c2859598dd7f7512ebe",
      "tree": "8e7891d9fcfba9cdeae18398b91f3a028a3ae908",
      "parents": [
        "0afc5c5a63a93b163846ca69644cc2e332324a83"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 26 08:18:57 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 08:18:57 2026 +0100"
      },
      "message": "build(deps): bump the maven group with 4 updates (#2834)\n\nBumps the maven group with 4 updates: [tel.schich:javacan-core](https://github.com/pschichtel/JavaCAN), [org.apache.maven.plugins:maven-failsafe-plugin](https://github.com/apache/maven-surefire), [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) and com.gradle:develocity-maven-extension.\n\n\nUpdates `tel.schich:javacan-core` from 3.5.2 to 3.5.3\n- [Release notes](https://github.com/pschichtel/JavaCAN/releases)\n- [Commits](https://github.com/pschichtel/JavaCAN/compare/javacan-3.5.2...javacan-3.5.3)\n\nUpdates `org.apache.maven.plugins:maven-failsafe-plugin` from 3.6.0 to 3.6.1\n- [Release notes](https://github.com/apache/maven-surefire/releases)\n- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.6.0...surefire-3.6.1)\n\nUpdates `org.apache.maven.plugins:maven-surefire-plugin` from 3.6.0 to 3.6.1\n- [Release notes](https://github.com/apache/maven-surefire/releases)\n- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.6.0...surefire-3.6.1)\n\nUpdates `com.gradle:develocity-maven-extension` from 2.6.0 to 2.6.1\n\n---\nupdated-dependencies:\n- dependency-name: tel.schich:javacan-core\n  dependency-version: 3.5.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: org.apache.maven.plugins:maven-failsafe-plugin\n  dependency-version: 3.6.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: org.apache.maven.plugins:maven-surefire-plugin\n  dependency-version: 3.6.1\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.gradle:develocity-maven-extension\n  dependency-version: 2.6.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\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": "0afc5c5a63a93b163846ca69644cc2e332324a83",
      "tree": "ee023e29a2d03e1bed99ba0feffcbd6ddcd56d5c",
      "parents": [
        "f4da378c402954571992b6a6ded3fbd762997a1a"
      ],
      "author": {
        "name": "Peter Fichtner",
        "email": "1958485+pfichtner@users.noreply.github.com",
        "time": "Sun Oct 25 15:12:08 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 15:12:08 2026 +0100"
      },
      "message": "build(deps): upgrade virtualavr to 0.4.0 and testcontainers-virtualavr to 0.0.5 (#2833)\n\nCo-authored-by: Peter Fichtner (pfichtner) \u003cpfichtner@users.noreply.github.com\u003e"
    },
    {
      "commit": "f4da378c402954571992b6a6ded3fbd762997a1a",
      "tree": "6e0351f116a1d83b37a4b85801deed2df598844f",
      "parents": [
        "90f6bec9e425ecab3ed1917a784aa6e70ca0773e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 21 10:05:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 10:05:48 2026 +0200"
      },
      "message": "build(deps): bump the maven group with 7 updates (#2829)\n\nBumps the maven group with 7 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) | `2.22.3` | `2.22.4` |\n| [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson-databind) | `2.22.3` | `2.22.4` |\n| [com.fasterxml.jackson.dataformat:jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml) | `2.22.3` | `2.22.4` |\n| [com.fasterxml.jackson.dataformat:jackson-dataformat-yaml](https://github.com/FasterXML/jackson-dataformats-text) | `2.22.3` | `2.22.4` |\n| com.fasterxml.jackson.datatype:jackson-datatype-jsr310 | `2.22.3` | `2.22.4` |\n| [com.palantir.javapoet:javapoet](https://github.com/palantir/javapoet) | `0.21.0` | `0.22.0` |\n| [io.github.pfichtner:testcontainers-virtualavr](https://github.com/pfichtner/virtualavr) | `0.0.3` | `0.0.4` |\n\n\nUpdates `com.fasterxml.jackson.core:jackson-core` from 2.22.3 to 2.22.4\n- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.22.3...jackson-core-2.22.4)\n\nUpdates `com.fasterxml.jackson.core:jackson-databind` from 2.22.3 to 2.22.4\n- [Commits](https://github.com/FasterXML/jackson-databind/compare/jackson-databind-2.22.3...jackson-databind-2.22.4)\n\nUpdates `com.fasterxml.jackson.dataformat:jackson-dataformat-xml` from 2.22.3 to 2.22.4\n- [Commits](https://github.com/FasterXML/jackson-dataformat-xml/compare/jackson-dataformat-xml-2.22.3...jackson-dataformat-xml-2.22.4)\n\nUpdates `com.fasterxml.jackson.dataformat:jackson-dataformat-yaml` from 2.22.3 to 2.22.4\n- [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.22.3...jackson-dataformats-text-2.22.4)\n\nUpdates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.22.3 to 2.22.4\n\nUpdates `com.fasterxml.jackson.core:jackson-databind` from 2.22.3 to 2.22.4\n- [Commits](https://github.com/FasterXML/jackson-databind/compare/jackson-databind-2.22.3...jackson-databind-2.22.4)\n\nUpdates `com.fasterxml.jackson.dataformat:jackson-dataformat-xml` from 2.22.3 to 2.22.4\n- [Commits](https://github.com/FasterXML/jackson-dataformat-xml/compare/jackson-dataformat-xml-2.22.3...jackson-dataformat-xml-2.22.4)\n\nUpdates `com.fasterxml.jackson.dataformat:jackson-dataformat-yaml` from 2.22.3 to 2.22.4\n- [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.22.3...jackson-dataformats-text-2.22.4)\n\nUpdates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.22.3 to 2.22.4\n\nUpdates `com.palantir.javapoet:javapoet` from 0.21.0 to 0.22.0\n- [Release notes](https://github.com/palantir/javapoet/releases)\n- [Commits](https://github.com/palantir/javapoet/compare/0.21.0...0.22.0)\n\nUpdates `io.github.pfichtner:testcontainers-virtualavr` from 0.0.3 to 0.0.4\n- [Release notes](https://github.com/pfichtner/virtualavr/releases)\n- [Commits](https://github.com/pfichtner/virtualavr/compare/0.0.3...0.0.4)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-core\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.fasterxml.jackson.core:jackson-databind\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-xml\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.fasterxml.jackson.core:jackson-databind\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-xml\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.palantir.javapoet:javapoet\n  dependency-version: 0.22.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: maven\n- dependency-name: io.github.pfichtner:testcontainers-virtualavr\n  dependency-version: 0.0.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\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": "90f6bec9e425ecab3ed1917a784aa6e70ca0773e",
      "tree": "1984fa82a72be28525b8f2df4bc9b37c168312ec",
      "parents": [
        "edd6fe70fa1ee07273e3d0eda77285883bb17d58"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 19 16:21:11 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 19 17:14:29 2026 +0200"
      },
      "message": "refactor(plc4go): move the zerolog PLC message marshaller to spi/utils\n\npkg/api/logging was deprecated (\"use options to configure logging\"), but\nthe options only configure the logger; nothing replaced the zerolog\ninterface marshaller that renders Serializable PLC messages as JSON,\nstring, XML or bytes, so users of it (spi/testutils, downstream code)\nwere stuck on a deprecated package.\n\nThe package is removed and the marshaller moves to spi/utils, next to\nthe Serializable and write buffer types it builds on:\nZerologMessageInterfaceMarshalFunc, ZerologDefaultInterfaceMarshalFunc,\nZerologInterfacePLCMessageFormat and the PLCMessageAs* formats keep\ntheir names. The 1.0.0 migration guide shows the new import.\n"
    },
    {
      "commit": "edd6fe70fa1ee07273e3d0eda77285883bb17d58",
      "tree": "411383d34d082333d4ac99d204c828cf91bd4814",
      "parents": [
        "f620322a1a1d7e557b37c9c35318fcb6686d5c47"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 13:47:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 13:47:52 2026 +0200"
      },
      "message": "build(deps): bump the maven group across 1 directory with 3 updates (#2827)\n\nBumps the maven group with 3 updates in the / directory: [net.bytebuddy:byte-buddy](https://github.com/raphw/byte-buddy), [net.bytebuddy:byte-buddy-agent](https://github.com/raphw/byte-buddy) and [com.palantir.javapoet:javapoet](https://github.com/palantir/javapoet).\n\n\nUpdates `net.bytebuddy:byte-buddy` from 1.18.14 to 1.18.15\n- [Release notes](https://github.com/raphw/byte-buddy/releases)\n- [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md)\n- [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.18.14...byte-buddy-1.18.15)\n\nUpdates `net.bytebuddy:byte-buddy-agent` from 1.18.14 to 1.18.15\n- [Release notes](https://github.com/raphw/byte-buddy/releases)\n- [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md)\n- [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.18.14...byte-buddy-1.18.15)\n\nUpdates `com.palantir.javapoet:javapoet` from 0.20.0 to 0.21.0\n- [Release notes](https://github.com/palantir/javapoet/releases)\n- [Commits](https://github.com/palantir/javapoet/compare/0.20.0...0.21.0)\n\nUpdates `net.bytebuddy:byte-buddy-agent` from 1.18.14 to 1.18.15\n- [Release notes](https://github.com/raphw/byte-buddy/releases)\n- [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md)\n- [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.18.14...byte-buddy-1.18.15)\n\n---\nupdated-dependencies:\n- dependency-name: net.bytebuddy:byte-buddy\n  dependency-version: 1.18.15\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: net.bytebuddy:byte-buddy-agent\n  dependency-version: 1.18.15\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\n- dependency-name: com.palantir.javapoet:javapoet\n  dependency-version: 0.21.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: maven\n- dependency-name: net.bytebuddy:byte-buddy-agent\n  dependency-version: 1.18.15\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: maven\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": "f620322a1a1d7e557b37c9c35318fcb6686d5c47",
      "tree": "e9bda2382ee974162e5a022e3bce31c2e2a638bf",
      "parents": [
        "369238de9c737ce5c791dc50091188114511a846"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 19 11:39:15 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 19 11:39:15 2026 +0200"
      },
      "message": "chore(deps): remove exclusion, this should be possible by just mention it with ignore\n"
    },
    {
      "commit": "369238de9c737ce5c791dc50091188114511a846",
      "tree": "08a2c2516b1c53c88b87994771386d84ed393205",
      "parents": [
        "0cd122ea000d1f85f9b023bac886b12b78c59328"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 19 10:39:50 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 19 10:39:50 2026 +0200"
      },
      "message": "chore(deps): exclude woodstox\n"
    },
    {
      "commit": "0cd122ea000d1f85f9b023bac886b12b78c59328",
      "tree": "c81f761aca1982a8180a8cdc3708e5d24074d2b9",
      "parents": [
        "36ac40d01f95a405d6ba621bc9092a1f1508ce56"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 19 10:36:14 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 19 10:36:14 2026 +0200"
      },
      "message": "chore(deps): exclude woodstox\n"
    },
    {
      "commit": "36ac40d01f95a405d6ba621bc9092a1f1508ce56",
      "tree": "6468b34786dcc0aadfdf4bd654108dd250b6e70f",
      "parents": [
        "1980c1b6b29625159db0d1315b385c3f4fa32aff"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Mon Oct 19 16:29:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 10:29:34 2026 +0200"
      },
      "message": "docs(plc4net): update README status and build requirements (#2825)"
    },
    {
      "commit": "1980c1b6b29625159db0d1315b385c3f4fa32aff",
      "tree": "05044949dd53ae232ee593fa510ca98a3a58d288",
      "parents": [
        "86e32ec6b357ece9625006105140d9f5a19d3f88"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Thu Oct 15 14:46:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 08:46:12 2026 +0200"
      },
      "message": "chore(plc4net): organize solution projects (#2821)"
    },
    {
      "commit": "86e32ec6b357ece9625006105140d9f5a19d3f88",
      "tree": "f8b8259aef417afab20b26872896aeb67ee44cb6",
      "parents": [
        "01934c5bfc3b60e28af99b1679c18146c29c79f5"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 15:55:36 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 15:56:39 2026 +0200"
      },
      "message": "test(plc4j/s7): keep the CotpFramingTest peer sockets reachable\n\naTpktLengthThatDescribesNoPacketDoesNotStall failed on about half of the\nJDK 21 macOS runs, always at its 4 second deadline. Its fake PLC\u0027s socket\nwas referenced only by a future the test discarded. Once the server task\nreturned, a GC let the socket\u0027s cleaner close it, so the transport saw\nthe peer hang up. COTP\u0027s getNumBytesAvailable() reports 0 once the TCP\nside is closed, and the test polled until its deadline. CI logs show the\nresync working and then \"Transport is closed\" on the test\u0027s close().\nForcing GCs during the test reproduces this on Linux.\n\nThe test now keeps both tests\u0027 peer sockets in a list and closes them in\ntearDown. With the fix the test passes under the same forced GCs.\n"
    },
    {
      "commit": "01934c5bfc3b60e28af99b1679c18146c29c79f5",
      "tree": "72aeba86de5690ec03201f61ee61bb844ffecc82",
      "parents": [
        "f9d84f01cc12fbc42a9824ee26372e200ec1dcae"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Wed Oct 14 21:39:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 15:39:12 2026 +0200"
      },
      "message": "feat(plc4net): add UDP transport (#2818)\n\n* feat(plc4net): add UDP transport\n\n* fix(plc4net): harden UDP shutdown and configuration\n\n* fix(plc4net): validate UDP transport options"
    },
    {
      "commit": "f9d84f01cc12fbc42a9824ee26372e200ec1dcae",
      "tree": "134ba3db5b4383c421e4bc1430c4f2c508013555",
      "parents": [
        "a03149562bb9729d53e26b172f39caa10dc4a915"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 14 14:07:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 14:07:58 2026 +0200"
      },
      "message": "build(deps): bump golang.org/x/tools in /plc4go in the go group (#2819)\n\nBumps the go group in /plc4go with 1 update: [golang.org/x/tools](https://github.com/golang/tools).\n\n\nUpdates `golang.org/x/tools` from 0.51.0 to 0.52.0\n- [Release notes](https://github.com/golang/tools/releases)\n- [Commits](https://github.com/golang/tools/compare/v0.51.0...v0.52.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/tools\n  dependency-version: 0.52.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: go\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": "a03149562bb9729d53e26b172f39caa10dc4a915",
      "tree": "33e1cc274090cf69b1247aed608fcee65ba71afc",
      "parents": [
        "a86c95655eb8ab0e8a9796cc5b447b6f3eca13be"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Wed Oct 14 13:48:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 13:48:58 2026 +0200"
      },
      "message": "build: drop the unused maven-dependency-tree enforcer dependency (#2801)\n\nextra-enforcer-rules no longer uses maven-dependency-tree since 1.8.0, so no rule loads it."
    },
    {
      "commit": "a86c95655eb8ab0e8a9796cc5b447b6f3eca13be",
      "tree": "12890251b7b499782996050349e4b938fca5fb6a",
      "parents": [
        "558dd0303c0a8425c00e280a801287dd34194c8f"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 13:39:14 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 13:39:14 2026 +0200"
      },
      "message": "ci: let the introduction request target one pull-request on demand\n\nA manual run can now name a pull-request. That pull-request is asked even\nwhen its author, age or existing maintainer comments would make the\nscheduled run skip it, so a maintainer can apply the request to an older\nor already discussed pull-request. A pull-request that was already asked\nis still skipped, and a closed pull-request or invalid number fails the\nrun. The input is read from the event payload rather than interpolated\ninto the script.\n"
    },
    {
      "commit": "558dd0303c0a8425c00e280a801287dd34194c8f",
      "tree": "a5311825ac69e182f6f4940f36e1a930ec5386e0",
      "parents": [
        "7e5314679229339638c49779231864c327f9b6bb"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 13:30:00 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 13:30:00 2026 +0200"
      },
      "message": "ci: ask first-time contributors to introduce themselves on dev@\n\nThe contribution guidelines ask new contributors to introduce themselves on\ndev@plc4x.apache.org before we review their pull-requests. So far a\nmaintainer had to post that request by hand on each pull-request.\n\nA scheduled workflow now does it. Every four hours it looks at open\npull-requests from authors without a merged contribution\n(FIRST_TIME_CONTRIBUTOR, FIRST_TIMER or NONE) opened in the last 14 days.\nIt posts the request, linking the guidelines and the dev@ subscription,\nand adds a needs-introduction label, which it creates on first use.\nIt skips bots, pull-requests it already asked, pull-requests a\nmaintainer has already commented on, and pull-requests that already\ncarry the label. Closing stays a maintainer\u0027s decision.\n\nIt runs on a schedule instead of on pull_request because a first-time\ncontributor\u0027s fork run waits for approval and only gets a read-only\ntoken, and pull_request_target is disabled for ASF repositories. It\nnever checks out pull-request code and runs on ubuntu-slim.\n\nA pull-request template now asks for a dev@ thread link on a first\ncontribution, so contributors can provide it before the bot asks. The\ncontributing page mentions the bot and the label.\n"
    },
    {
      "commit": "7e5314679229339638c49779231864c327f9b6bb",
      "tree": "3542169dd55de8cb6ffaad5d340da199eb3e06da",
      "parents": [
        "048aa22df66a9006e52ba2b65cc5488a83455494"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Wed Oct 14 18:49:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 12:49:56 2026 +0200"
      },
      "message": "feat(plc4net): add S7 driver and tests (#2815)\n\n* feat(plc4net): add S7 driver and tests\n\n* style(plc4net): add final newlines to S7 sources\n\n* fix(plc4net): honor negotiated S7 PDU limit\n\n* fix(plc4net): pack S7 jobs to PDU boundaries\n\n* fix(plc4net): harden S7 request waiting\n\n* fix(plc4net): plan S7 jobs without stale padding\n\n* fix(plc4net): wait for S7 transport data"
    },
    {
      "commit": "048aa22df66a9006e52ba2b65cc5488a83455494",
      "tree": "869538bfe8133abc988724450e7af779d0f49318",
      "parents": [
        "9ce443d216c626069916778eeded9ea268f912dc"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 12:47:23 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 12:47:23 2026 +0200"
      },
      "message": "ci: pin external actions to commit SHAs, drop the dead Trivy workflow\n\nInfra\u0027s GitHub Actions policy requires every action outside apache/*,\ngithub/* and actions/* to be pinned to a full commit SHA and approved in\napache/infrastructure-actions. Three workflows didn\u0027t comply.\n\n- release-drafter v7.10.0 and BobAnkh/auto-generate-changelog v1.3.2 are\n  approved at any SHA. Both now pin the commit their tag points to, with\n  the tag in a comment so Dependabot keeps updating them.\n- sast.yaml ran aquasecurity/trivy-action@master, which isn\u0027t on the\n  approved list at all. Its only job has been disabled with `if: false`\n  since 1b51fa91da (April 2024), so the workflow is removed rather than\n  ported to the approved lhotari/sandboxed-trivy-action.\n"
    },
    {
      "commit": "9ce443d216c626069916778eeded9ea268f912dc",
      "tree": "c0569016f27fe512d9cc00dd85c44a9788eb4161",
      "parents": [
        "d012eb4e9697be394987a5effade3db99bb0c07c"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 12:45:13 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 12:45:13 2026 +0200"
      },
      "message": "docs(agents): point agents at the ASF GitHub Actions rules\n\n#2816 cut the load PLC4X puts on the shared ASF runners: a PR-scoped\nconcurrency group on the platform workflows, ubuntu-slim for short jobs,\nand grouped Dependabot updates. Nothing in the repository says why those\nsettings exist, so the next new or edited workflow can quietly drop them.\n\nAGENTS.md now links Infra\u0027s mandatory GitHub Actions policy and its queue\nguidance, and lists what that means here: the concurrency block to copy,\nwhen to use ubuntu-slim, grouped Dependabot ecosystems, SHA-pinned and\napproved external actions, no pull_request_target, and the matrix limit.\n"
    },
    {
      "commit": "d012eb4e9697be394987a5effade3db99bb0c07c",
      "tree": "753529431b3d5881fec1e20e149c04db84b64b2a",
      "parents": [
        "19d94349ef4ff180052dedc5271b179ed8afb22d"
      ],
      "author": {
        "name": "Justin Mclean",
        "email": "jmclean@apache.org",
        "time": "Wed Oct 14 11:40:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 12:40:52 2026 +0200"
      },
      "message": "ci: cut shared runner load from Dependabot and superseded PR runs (#2816)\n\n* ci: cut shared runner load from Dependabot and superseded PR runs\n\nGroup Dependabot version and security updates per ecosystem so each day opens one PR per ecosystem rather than one per dependency. Add a concurrency group to the platform workflows so a new push to a PR cancels its earlier queued runs. Pushes to develop are not cancelled.\n\n* ci: run the short jobs on ubuntu-slim\n\nDependency Review, Release Drafter and the two .NET generation checks each finish in under two minutes but waited over five hours for an ubuntu-latest runner on 13 Oct. Infra\u0027s slim runners skip that queue."
    },
    {
      "commit": "19d94349ef4ff180052dedc5271b179ed8afb22d",
      "tree": "f8fad88c2ecdc22dd5d458626014302f5d31d40d",
      "parents": [
        "2596101817433ed78e356a262432a29b8f9bc9c6"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 12:39:35 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Oct 14 12:39:35 2026 +0200"
      },
      "message": "fix(code-generation): drop compile-phase Karaf verify from the IT poms\n\nThe C, Go and Python code-generation integration-test poms still bound the\nkaraf-maven-plugin verify goal at compile, copied from the old driver poms.\nSince 2596101817 the root pluginManagement gives that goal real descriptors,\nso it now resolves the module\u0027s feature before the jar exists and fails on\ntarget/classes (\"Is a directory\"). This broke every Java CI job:\nplc4j-go-mspec-test on Linux and macOS, plc4j-c-mspec-test on Windows.\n\nDrop the goal from the compile execution, as was done for the driver poms.\nThe invoker only runs these projects up to test, so the root verify-phase\nexecution never runs there either; they are not real Karaf features.\n"
    },
    {
      "commit": "2596101817433ed78e356a262432a29b8f9bc9c6",
      "tree": "037aa6431754845959fadce011b77ed3913d0160",
      "parents": [
        "ecf411c4c357c9b63b5de1d664965be3191d7d51"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 13 16:08:25 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 13 16:08:25 2026 +0200"
      },
      "message": "fix(plc4j): make the generated Karaf driver features installable\n\nThe features generated for the plc4j drivers could not work on their own.\nThey held only the driver\u0027s dependencies, not the driver bundle itself.\nThey lacked plc4j-osgi, which holds every driver\u0027s and transport\u0027s\nBundle-Activator. And they pulled in two bundles that don\u0027t resolve on a\nplain Karaf: transports-api required an SCR implementation, and the plain\nslf4j-api 2.x bundle required SPI Fly plus a separate SLF4J provider.\nThe karaf-maven-plugin verify goal ran in every driver module, but with\nno descriptors configured it checked nothing and passed regardless.\n\n- karaf-maven-plugin defaults now live in the root pluginManagement: the\n  feature includes the project artifact, and slf4j-api is left out\n  because Karaf\u0027s pax-logging exports org.slf4j. The verify goal resolves\n  the module\u0027s own feature against Karaf\u0027s framework and standard\n  features. It runs at verify, once the jar exists, instead of at compile.\n- plc4j-osgi is a compile dependency of every driver (via plc4j-drivers)\n  and transport, since the feature generator only collects compile\n  scope. Its osgi.core is now provided, so plain Java users only gain\n  the plc4j-osgi jar itself. The dependency analyzer can\u0027t see a manifest\n  header, so plc4j-osgi is ignored for unused-declared checks.\n- OsgiTransportManager is gone. The DS component never had transports to\n  bind, and the registry-backed lookup in plc4j-osgi replaces it.\n  Removing it also removes the SCR requirement and the DS annotation\n  bundles from every feature.\n\nThe duplicated Service-Component entries seen in local jars only happened\nwhen building without clean, and only for that DS component.\n\nAll 21 driver features now verify. Without the plc4j-drivers dependency,\nCANopen fails verification with the missing\norg.apache.plc4x.java.osgi import, so the check catches this kind of\nbreak. In a fresh Karaf 4.4.11, `feature:install plc4j-driver-s7\nplc4j-driver-modbus plc4j-driver-ctrlx` starts all 22 bundles with\nnothing installed by hand. S7 and Modbus connections then reach \"Connection\nrefused\" on a closed port.\n"
    },
    {
      "commit": "ecf411c4c357c9b63b5de1d664965be3191d7d51",
      "tree": "43706946c50bd07aed6934011b0f1670a42cacd5",
      "parents": [
        "08c65a497ef86251f47ff386a501e88762f7c995"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 13 15:36:55 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Oct 13 15:40:45 2026 +0200"
      },
      "message": "fix(plc4j/osgi): resolve transports through the service registry\n\nIn Karaf every connection failed with \"Unsupported transport\", e.g.\n\"Unsupported transport cotp\" for S7 (reported in #2768). Two things broke\nin the SPI rework (372501287d):\n\n- DriverBase resolves transports with a DefaultTransportManager, which runs\n  ServiceLoader against the thread context class loader when the driver is\n  constructed. DriverActivator constructs the drivers during bundle start,\n  where the context class loader is whatever bundle triggered the start\n  (sshd\u0027s, in a Karaf shell) and sees none of the transport bundles.\n- No transport bundle declared Bundle-Activator: TransportActivator any\n  more, so nothing registered the transports as OSGi services either.\n\nThe transport bundles get their activator back, and DriverActivator now\nhands each driver a ServiceRegistryTransportManager, which looks the\ntransport up in the registry on every call, so bundle start order doesn\u0027t\nmatter. Drivers opt in through the new TransportManagerAware interface,\nwhich DriverBase implements. Outside OSGi nothing changes.\n\nplc4j-osgi had no tests. It now has tests that run the activators against\nan embedded Felix 7.0.5, the framework Karaf 4.4 runs on. Checked\nend-to-end in Karaf 4.4.11: before, S7 failed with \"Unsupported transport\ncotp\"; now it gets as far as \"Connection refused\" on a closed port.\n\nCloses #2768\n"
    },
    {
      "commit": "08c65a497ef86251f47ff386a501e88762f7c995",
      "tree": "debfd2ba39c192e6d3f1d19629ca55ace8b1d5bd",
      "parents": [
        "de08e7705cad809465bdaceccc3e14e0062d3ccb"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Tue Oct 13 19:18:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 13:18:49 2026 +0200"
      },
      "message": "build(plc4net): add model generation checks (#2814)\n\n* build(plc4net): add model generation checks\n\n* fix(plc4net): clarify model drift diagnostics"
    },
    {
      "commit": "de08e7705cad809465bdaceccc3e14e0062d3ccb",
      "tree": "50a5f763bf775215e17c795c3e1a587fa5fdfb70",
      "parents": [
        "349c727a7db968127f1eb05dcae0285d32bbfcec"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Tue Oct 13 17:03:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 11:03:03 2026 +0200"
      },
      "message": "feat(plc4net): add the generated S7 model (#2813)"
    },
    {
      "commit": "349c727a7db968127f1eb05dcae0285d32bbfcec",
      "tree": "9ab72ea501be8d2f4abc67e4fe0a4e514f20b25a",
      "parents": [
        "b262cd172fe8826ca57c01f10fdea80b869d890d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 09:56:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:56:53 2026 +0200"
      },
      "message": "build(deps): bump golang.org/x/net from 0.59.0 to 0.61.0 in /plc4go (#2806)\n\nBumps [golang.org/x/net](https://github.com/golang/net) from 0.59.0 to 0.61.0.\n- [Commits](https://github.com/golang/net/compare/v0.59.0...v0.61.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/net\n  dependency-version: 0.61.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "b262cd172fe8826ca57c01f10fdea80b869d890d",
      "tree": "b0b56117ed0609df1455f8ea1725b938431da1fa",
      "parents": [
        "e855852e3481053c640972fd1f6f02976313b2fe"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 09:56:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:56:28 2026 +0200"
      },
      "message": "build(deps): bump io.github.pfichtner:testcontainers-virtualavr (#2807)\n\nBumps [io.github.pfichtner:testcontainers-virtualavr](https://github.com/pfichtner/virtualavr) from 0.0.2 to 0.0.3.\n- [Release notes](https://github.com/pfichtner/virtualavr/releases)\n- [Commits](https://github.com/pfichtner/virtualavr/compare/0.0.2...0.0.3)\n\n---\nupdated-dependencies:\n- dependency-name: io.github.pfichtner:testcontainers-virtualavr\n  dependency-version: 0.0.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "e855852e3481053c640972fd1f6f02976313b2fe",
      "tree": "ece5f4f6f01271fa3bd814763e90e170f71ccb26",
      "parents": [
        "fc6933bad8d5105a75ae85090a52c58bd8418ca9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 09:56:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:56:03 2026 +0200"
      },
      "message": "build(deps): bump github/codeql-action from 4.38.2 to 4.38.3 (#2808)\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.38.2 to 4.38.3.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4.38.2...v4.38.3)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.38.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "fc6933bad8d5105a75ae85090a52c58bd8418ca9",
      "tree": "d16566c3b40d6c09fe502152e27661880417e4d9",
      "parents": [
        "ddf69932cc1bb9537f1c96fcb06a7ed6405631cd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 09:55:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:55:42 2026 +0200"
      },
      "message": "build(deps): bump release-drafter/release-drafter from 7.9.0 to 7.10.0 (#2809)\n\nBumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 7.9.0 to 7.10.0.\n- [Release notes](https://github.com/release-drafter/release-drafter/releases)\n- [Commits](https://github.com/release-drafter/release-drafter/compare/v7.9.0...v7.10.0)\n\n---\nupdated-dependencies:\n- dependency-name: release-drafter/release-drafter\n  dependency-version: 7.10.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "ddf69932cc1bb9537f1c96fcb06a7ed6405631cd",
      "tree": "5e32816f45fdbb2af5e3ecc5f032407905a4cd60",
      "parents": [
        "8de73050146e777c842a0ad60faeaf82042a36e8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 13 09:55:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:55:19 2026 +0200"
      },
      "message": "build(deps): bump commons-codec:commons-codec from 1.22.1 to 1.23.0 (#2810)\n\nBumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.22.1 to 1.23.0.\n- [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt)\n- [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.22.1...rel/commons-codec-1.23.0)\n\n---\nupdated-dependencies:\n- dependency-name: commons-codec:commons-codec\n  dependency-version: 1.23.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "8de73050146e777c842a0ad60faeaf82042a36e8",
      "tree": "7156218de26e09ed0f894377b17e1d45c7ae8677",
      "parents": [
        "3d96e261af99caa228445ce3adb8bcf4b41e43dc"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Tue Oct 13 15:54:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:54:46 2026 +0200"
      },
      "message": "feat(plc4net): let a protocol\u0027s static helper be written by hand (#2812)\n\nCSharpGenerator refused every STATIC_CALL it has no implementation for, so a\nprotocol whose helper functions are written by hand (S7\u0027s string, time and date\ncodings) could not be generated at all.\n\n--manual-static-calls (manualStaticCalls on CSharpGenerator) leaves exactly\nthose calls to the hand-written part of the protocol\u0027s partial StaticHelper\nclass, as plc4j and plc4go do. The generated code calls\n\u003cProtocol\u003eStaticHelper.\u003cFunction\u003e(...) as the mspec writes it, the generated\nhalf of the class does not declare the function, and a function that nobody\nwrote fails the compile of the driver.\n\nWithout the option a call that has no implementation still fails the\ngeneration, and the message now names the option. The option changes nothing\nfor a protocol whose calls are all generated: the Modbus model is identical\nwith and without it, which a test pins."
    },
    {
      "commit": "3d96e261af99caa228445ce3adb8bcf4b41e43dc",
      "tree": "321c9fb181631c15fd9c9d3a88c17d064e141626",
      "parents": [
        "59f293ab9ae13db8eb427d67d576554ca0d0f1a5"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:25:11 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:25:11 2026 +0200"
      },
      "message": "fix(plc4j/firmata): compile the sketch for virtualavr 0.3 and pin the image\n\nFirmataVirtualAvrIT has failed on every platform since pfichtner/virtualavr\n0.3.0 became `latest` on 2026-10-08, which is what has kept the Java Platform\ncompatibility workflow red. 0.3.0 moved sketch compilation out of\nvirtualavr.js into the image\u0027s entrypoint: virtualavr.js now expects a HEX\nfile. The IT\u0027s image replaces that entrypoint and still handed virtualavr.js\nsketch.ino, so the simulator died parsing it (\"Line 1 does not start with a\ncolon\") on every accept, never opened its WebSocket port, and Testcontainers\ntimed out waiting for it.\n\nThe sketch is now compiled once at image build time with the image\u0027s own\nvirtualavr-compile-arduino, and the simulator is started on the HEX - which\nalso drops the per-connection compile 0.2 used to do. The base image is\npinned to 0.3.1 so an upstream release can\u0027t break the IT unannounced again.\n"
    },
    {
      "commit": "59f293ab9ae13db8eb427d67d576554ca0d0f1a5",
      "tree": "1feb4da8a231004107e2cbadc35749e1ce5932c6",
      "parents": [
        "53f2ed55c08191aa78d6472028be0a050f37114d"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:21:27 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:21:27 2026 +0200"
      },
      "message": "docs(readme): point the Maven Central and last-commit badges somewhere useful\n\nThe Maven Central badge linked to its own image and the last-commit badge\nhad an empty link; they now open the plc4j-api artifact page and the develop\ncommit history.\n"
    },
    {
      "commit": "53f2ed55c08191aa78d6472028be0a050f37114d",
      "tree": "84f47321618ceb167cad9546cf568ab361922091",
      "parents": [
        "247758db52acb4f8bad0c786060fbe5ad2974389"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:19:41 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:19:41 2026 +0200"
      },
      "message": "docs(readme): add the .NET Platform compatibility badge\n\nEvery other platform workflow has a badge; dotnet-platform.yml didn\u0027t.\n"
    },
    {
      "commit": "247758db52acb4f8bad0c786060fbe5ad2974389",
      "tree": "f1dfedd22f554df0552f13b7fb7b145ef1d118f4",
      "parents": [
        "0f2acd14d6092352585bfecbb8252198509cf00e"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:17:29 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:17:46 2026 +0200"
      },
      "message": "feat(plc4go,plc4net): add the response codes the two bindings were missing\n\nplc4go had no NOT_READY or OUT_OF_RANGE; they get the next free values (0x13,\n0x14) in its own numbering. plc4net had no InvalidData, RemoteBusy,\nRemoteError, NotReady or OutOfRange; they are appended so the existing\nmembers keep their values, and documented as in plc4j. With this every\nbinding has the same set of response codes.\n"
    },
    {
      "commit": "0f2acd14d6092352585bfecbb8252198509cf00e",
      "tree": "03b6f2adb863c4b62986c45c1e7aced14fb5ab7c",
      "parents": [
        "75891b9c04dbb113616b2539fb0fe8983edba91e"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:13:21 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:17:46 2026 +0200"
      },
      "message": "feat(plc4py): add the NOT_READY and OUT_OF_RANGE response codes\n\nplc4py was the only binding without them. They are appended after\nREQUEST_TIMEOUT, so the auto() values of the existing codes don\u0027t move, and\nthe getting-started page lists them.\n"
    },
    {
      "commit": "75891b9c04dbb113616b2539fb0fe8983edba91e",
      "tree": "562cbc93222a6b61807554c817f6cc5e304369b9",
      "parents": [
        "268e7640f3ee4b874f7ea7fb5aa1444d8089bc98"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:12:43 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 14:17:46 2026 +0200"
      },
      "message": "docs(website): list every response code each language actually has\n\nThe getting-started lists of non-OK response codes stopped at the original\nhandful. The plc4j and virtual-modbus pages now list the whole plc4j enum,\nand the plc4py page the plc4py one (which has NOT_CONNECTED instead of\nNOT_READY and OUT_OF_RANGE).\n"
    },
    {
      "commit": "268e7640f3ee4b874f7ea7fb5aa1444d8089bc98",
      "tree": "d3366f2f8a500775eb6196761a5e2d79445f1a49",
      "parents": [
        "a9282438d464587ebd54e3a17c19d2161dc952b3"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Mon Oct 12 20:15:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 14:15:54 2026 +0200"
      },
      "message": "feat(plc4net): add the Modbus TCP and RTU drivers (#2792)\n\n* fix(plc4net): write generated files without a final newline\n\nThe repository\u0027s .editorconfig sets insert_final_newline\u003dfalse, and every\nother .cs file ends at its closing brace. The generator ended each file\nwith a newline, so a protocol model checked in from it would be flagged by\ndotnet format. Write the files without it, and say so in the README.\n\n* fix(plc4net): keep the wire discriminators that a case does not pin\n\nA case of a discriminated type that lists no value for a discriminator\nread from the wire left that discriminator to the type\u0027s default. Modbus\u0027\nModbusPDUError pins errorFlag but not functionFlag, so a parsed exception\nresponse lost its function code: it serialized as 0x80 instead of 0x83 and\ndid not round-trip the shared ParserSerializer vector. Because the\ngenerated RTU parser checks the CRC over the re-serialized PDU, every RTU\nexception response would also have failed its CRC check.\n\nplc4j keeps such a value as it was read from the wire. Do the same: the\nchild takes the discriminator as a trailing constructor and StaticParse\nparameter, the type switch of the parent hands down what it has read, and\nthe discriminator accessor returns it. A discriminator that is a parser\nargument rather than a field read from the wire is still not kept.\n\n* feat(plc4net): add the Modbus TCP and RTU drivers\n\nAdd the Modbus drivers on top of the generated protocol model, so no frame\nis encoded or decoded by hand: the PDUs, the TCP and RTU ADUs, the RTU CRC\nand the register values all come from model/, which plc4net-code-gen\ngenerates from modbus.mspec.\n\n- modbus-tcp (default port 502) and modbus-rtu over the serial transport.\n  TCP frames responses by the MBAP length and matches them by transaction\n  identifier (1 to 0xFFFE, as in plc4j). RTU frames them by function code,\n  takes a frame only when the generated parser accepts it, CRC included,\n  and skips noise, corrupted frames and frames for another address or\n  function. The echo of a read request that a half-duplex adapter sends\n  back is discarded.\n- Tags use plc4j\u0027s syntax, {area}:{address}[:{TYPE}], with the address\n  counted from 1: the areas coil, discrete-input, holding-register and\n  input-register, and the types BOOL, INT, UINT and WORD. The rest of the\n  syntax (arrays, string lengths, tag configuration, extended registers,\n  the short forms) is rejected with an explanation rather than read as\n  something else. Reads and writes handle one value per tag.\n- The parameters follow plc4j: default-unit-identifier and\n  request-timeout-ms (5000 by default). The older unit-identifier and\n  request-timeout are still read. A malformed value is an error, not a\n  default.\n- The model is checked in under drivers/modbus/model, and a CI job\n  regenerates it and compares.\n\nThe tests parse and serialize the shared Modbus ParserSerializer vectors\nthrough the model, cover both connections against a scripted transport,\ncover the TCP driver against a loopback Modbus slave over real sockets, and\nrepeat the requests and answers of plc4j\u0027s own driver test data for the\nsupported tags.\n\n* ci(plc4net): run the generated-model check when the Modbus mspec changes\n\nThe Generated protocol models job regenerates the checked-in Modbus\nmodel and compares it, but the workflow\u0027s paths filter listed only\nplc4net/**, the mspec grammar, and the workflow itself, so a change to\nprotocols/modbus/** alone - the job\u0027s input - did not trigger it. Add\nthat path to the push and pull_request filters.\n\n* fix(plc4net): map ACKNOWLEDGE to Ok and reject non-ASCII digits in tag addresses\n\n- a device that answers the ACKNOWLEDGE exception has accepted the request,\n  so the response reports Ok, as plc4j does. The remaining exception codes\n  have no better counterpart in PlcResponseCode than the values they map\n  to already\n- a tag address matches ASCII digits only: \\d also matches non-ASCII\n  decimal digits, which then blew up in int.Parse instead of failing at\n  the address as a PlcInvalidFieldException\n- pin the write-echo frame length for Write Multiple Coils and Write\n  Multiple Registers at 8 bytes as well: the response echoes the starting\n  address and the quantity\n\n* fix(plc4net): harden Modbus response validation\n\nHarden RTU framing against noisy serial input while avoiding per-offset allocations during lookahead. Validate the generated parser through a bounded zero-copy read-buffer window, and cover its boundaries.\\n\\nReject unknown Modbus areas explicitly and discard Modbus TCP responses whose unit identifier does not match the connection. Add regression coverage for RTU resynchronization, tag parsing, TCP unit matching, and read-buffer windows."
    },
    {
      "commit": "a9282438d464587ebd54e3a17c19d2161dc952b3",
      "tree": "4596658925402a9cdc17ee3c451244a304f73b77",
      "parents": [
        "3581a6fc559e57d1dddbb63458eac4476f922e67"
      ],
      "author": {
        "name": "Oleksandr Klymenko",
        "email": "alexanderklmn@gmail.com",
        "time": "Mon Oct 12 13:57:09 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 12:57:09 2026 +0200"
      },
      "message": "fix(plc4j/spi): RequestThrottle silently drops a limit reduction while requests are in flight (#2734)\n\n* fix(plc4j/spi): Don\u0027t drop the part of a limit reduction that cannot be applied at once\n\nadjustMaxConcurrentRequests() took permits away with\n\n    int toDrain \u003d Math.min(-difference, semaphore.availablePermits());\n\nand then updated maxConcurrentRequests unconditionally. A permit that is in\nflight cannot be taken back, so whenever more requests were running than the new\nlimit allows, the clamped-away part of the reduction was silently discarded\nwhile the field claimed it had been applied. As the running requests returned\ntheir permits the semaphore climbed back to the old count and stayed there, so\nthe throttle permanently allowed more concurrent requests than it was configured\nfor - the one thing the class exists to prevent. Repeated adjustments compound\nit: shrinking under load and raising the limit again leaves the pool over budget.\n\nThis is not limited to the case where no permit is free. With 3 permits, 2 of\nthem in flight, reducing to 1 takes the single free permit and drops the second.\n\nRemember the part that cannot be applied immediately as a permit debt and settle\nit out of the permits the running requests return, so the reduction takes effect\nas soon as it can rather than being lost. Reducing no longer blocks either: the\nold acquireUninterruptibly() could wait, under the instance monitor, for permits\nthat only the in-flight requests could hand back, because availablePermits() may\ndrop between the check and the call.\n\ngetInFlightRequests() derived its result from the maximum and the free permits,\nwhich could go negative - already before this change, on the growth path, where\nrelease(difference) ran before the field was updated, so a request started by\nthe drain in between saw a negative count. Track the permits handed out in a\ncounter instead, which cannot go negative and does not depend on an adjustment\nbeing atomic with the read.\n\nAn adjustment that could not be applied in full now says so in the log; without\nthat there is nothing to go on when concurrency does not drop as expected.\n\nThe 15 existing tests are unchanged and keep passing. 12 are added. Four of them\nread the permit debt through a package-private accessor and therefore only\ncompile against this version; drop those four together with their helper and the\nremaining 8 compile against develop, where all 8 fail.\n\nSigned-off-by: alxkm \u003calexanderklmn@gmail.com\u003e\n\n* fix(plc4j/spi): Settle a returned permit and a limit reduction under one lock\n\nA permit returned while adjustMaxConcurrentRequests() was applying a reduction\ncould be counted twice. The completing request read a debt of zero and released\nits permit, while the reduction failed to acquire that same permit and recorded\nit as debt instead, so the throttle offered free permits although the reduced\nlimit was already taken by the requests still running.\n\nThe debt check and the release now run under the same lock as the reduction\u0027s\ntry-acquire, so a returned permit either goes back to the pool or retires part\nof the reduction, never both. drain() runs outside the lock, so no request is\nstarted while it is held.\n\n* fix(plc4j/spi): Address review remarks on RequestThrottle\n\n- Word the unsettled-debt log message so it also fits a raise that only\n  cancels part of an earlier reduction.\n- Fail fast when the race test\u0027s threads do not all get ready, instead of\n  running the attempt with the threads not aligned.\n- Run the race test 500 times instead of 2000; on the unfixed code it fails\n  within the first couple of hundred attempts.\n\n* test(plc4j/spi): Don\u0027t leave the race test\u0027s threads spinning when it fails\n\nIf an attempt failed before every thread was let go, the threads still in the\nspin loop ignored the interrupt from shutdownNow() and kept spinning for the\nrest of the test JVM. They now give up when interrupted. The test also gets\nan overall timeout, so a slow or contended machine cannot stretch it out\nwithout bound.\n\n* test(plc4j/spi): Park between checks in the race test and bound it by time\n\nWhile waiting to be let go, the race test\u0027s threads now spin briefly and then\npark between checks instead of spinning the whole time. Besides not holding on\nto a core, this lets go of the threads closely enough to hit the race within\nthe first few attempts on the unfixed code, so 100 attempts are enough. The\nattempts are also bounded by time, so a slow machine runs fewer of them\ninstead of running into the timeout.\n\n---------\n\nSigned-off-by: alxkm \u003calexanderklmn@gmail.com\u003e"
    },
    {
      "commit": "3581a6fc559e57d1dddbb63458eac4476f922e67",
      "tree": "d5d2d9b6b0f658f9253477302b77a1c31bb0c95f",
      "parents": [
        "a0d3378bbe26c30c8022ae9d3b06fb814255317d"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:46:53 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:46:53 2026 +0200"
      },
      "message": "feat(plc4c): add the response codes plc4c was missing and report them from the proxy\n\nplc4c had no INVALID_DATA, REMOTE_BUSY, REMOTE_ERROR, UNSUPPORTED, NOT_READY\nor OUT_OF_RANGE, so the plc4x proxy driver still reported those as\nINTERNAL_ERROR. They are added at the end of plc4c_response_code, keeping the\nexisting values\u0027 numbers, with messages, and the proxy driver now maps every\ncode the protocol defines onto its plc4c counterpart. Only a value the\nprotocol doesn\u0027t define is still INTERNAL_ERROR.\n"
    },
    {
      "commit": "a0d3378bbe26c30c8022ae9d3b06fb814255317d",
      "tree": "b48d5bc2387adbb7508e2296f6f8f4bffdc6e5c4",
      "parents": [
        "fc7f8b9ad7baddef898245ef0c44da07239cf4df"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:37:05 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:37:05 2026 +0200"
      },
      "message": "fix(plc4c/plc4x): report the proxy\u0027s response code instead of INTERNAL_ERROR\n\nThe plc4x proxy driver turned every response code other than OK into\nINTERNAL_ERROR, for reads and writes alike, so a C caller couldn\u0027t tell a\nmissing tag, a denied access or a timeout apart. The code is now mapped to the\nmatching plc4c one where plc4c has it (OK, NOT_FOUND, ACCESS_DENIED,\nINVALID_ADDRESS, INVALID_DATATYPE, RESPONSE_PENDING, REQUEST_TIMEOUT); the\ncodes plc4c has no counterpart for are still INTERNAL_ERROR.\n\nThe test covers every wire code and fails when one is added without deciding\nits mapping.\n"
    },
    {
      "commit": "fc7f8b9ad7baddef898245ef0c44da07239cf4df",
      "tree": "40634a14e4ecd8b0f3e183070d3d981b5c1a6074",
      "parents": [
        "ed5878ff936dda7475f4ef62dbdbeb82ae045602"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:20:58 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:20:58 2026 +0200"
      },
      "message": "feat(protocols/plc4x): carry NOT_READY, OUT_OF_RANGE and REQUEST_TIMEOUT on the wire\n\nThe proxy protocol\u0027s response code enums (plc4x Plc4xResponseCode and\nplc4x-api PlcResponseCode) stopped at RESPONSE_PENDING, while the plc4j API\nhas since gained NOT_READY (0x0D), OUT_OF_RANGE (0x0E) and REQUEST_TIMEOUT\n(0x0F). The proxy maps codes between the two by name, so none of the three\ncould be carried. Both enums now match the API value for value.\n\nRegenerated the committed plc4j and plc4c code for the plc4x protocol.\n"
    },
    {
      "commit": "ed5878ff936dda7475f4ef62dbdbeb82ae045602",
      "tree": "8a9b0848dea7dcfecbe073872f945e4494e76809",
      "parents": [
        "357af647b920dbfa7a4bfc68867fb149e4590d0e"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:14:45 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:14:45 2026 +0200"
      },
      "message": "fix(plc4go/spi): keep the codes of a sub-read that failed when merging reads\n\nProcessReadResponses dropped the response of any sub-read that also carried\nan error, so its tags were missing from the merged response altogether - the\nsame defect ProcessWriteResponses had. The error is still aggregated; the\ncodes and values the sub-read did report are now kept next to it.\n"
    },
    {
      "commit": "357af647b920dbfa7a4bfc68867fb149e4590d0e",
      "tree": "e416fcf6af9fc3d86d3c719a6846f65f443a3921",
      "parents": [
        "85afc28415e6fbf900a2ba9a3586a5316acf9451"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:12:56 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 12:12:56 2026 +0200"
      },
      "message": "fix(plc4go/modbus): report only a read that ran out of time as REQUEST_TIMEOUT\n\nThe block reader marked every tag of a block REQUEST_TIMEOUT whenever the\ncodec\u0027s error handler fired, but the codec calls it for more than an expired\nexpectation: Disconnect and a failing transport fail every pending\nexpectation too. A read the caller cancelled was reported as a timeout by the\nouter wait as well.\n\nAll three failure sites now go through one decision: REQUEST_TIMEOUT when the\nerror is a timeout (utils.IsTimeoutError), INTERNAL_ERROR otherwise - the\nsame rule the writer uses.\n"
    },
    {
      "commit": "85afc28415e6fbf900a2ba9a3586a5316acf9451",
      "tree": "61612a7d99f59e5e656cf81a41346b5763b33ad6",
      "parents": [
        "5c783292492481bb0d20f79e97cee35894934a03"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 10:55:12 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 10:55:12 2026 +0200"
      },
      "message": "fix(plc4go/modbus): report a write the device never answers as REQUEST_TIMEOUT\n\nThe modbus writer delivered an unanswered write as an error with no\nresponse, while the reader reports a block that timed out as\nREQUEST_TIMEOUT for its tags, and plc4j now does the same for a write.\n\nThe writer now delivers REQUEST_TIMEOUT for the tag together with the\nerror when the request timed out - the codec\u0027s expectation expired, or\nthe write ran out of time while waiting its turn - so a caller that only\nchecks the error still sees the write failed. Any other failure, a\ndisconnect say, stays an error without a response. An unanswered write\nis never re-sent: whether the device executed it is unknown. The error\nhandler\u0027s wrap text no longer claims every failure is a timeout.\n\nSingleItemRequestInterceptor.ProcessWriteResponses dropped the response\nof a sub-write that also carried an error, so in a multi-tag write the\ntimed-out tag went missing from the merged response (reading back as\nNOT_FOUND). It now keeps the codes of such a sub-write and still\naggregates its error.\n"
    },
    {
      "commit": "5c783292492481bb0d20f79e97cee35894934a03",
      "tree": "f8687e79a94515824eca99249e1b5f4890be99c9",
      "parents": [
        "355944bc057c326216f843ad09ab91e2c771e231"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 10:03:07 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 10:03:07 2026 +0200"
      },
      "message": "fix(plc4j/modbus): report a timed-out transaction as REQUEST_TIMEOUT per tag\n\nonRead and onWrite of the TCP, RTU and ASCII connections combine their\nper-block (read) or per-tag (TCP write) futures with\nCompletableFuture.allOf, which fails as soon as one of them fails. A\nsingle unanswered transaction therefore failed the whole request with a\nTimeoutException, dropping the values of every block the device did\nanswer - and, for a multi-tag TCP write, the information which writes\nit acknowledged.\n\nA transaction that runs into the request timeout now resolves to\nREQUEST_TIMEOUT for the tags it covered, and the rest of the request\nkeeps its results, as plc4go\u0027s Modbus reader already reports it.\nSingle-tag RTU/ASCII writes answer with REQUEST_TIMEOUT instead of\nfailing too. An unanswered write is still never re-sent: whether the\ndevice executed it is unknown. Any other failure (connection loss, a\nsend error) still fails the request as before.\n\nThe loopback Modbus TCP peer of the unit-identifier correlation test\nmoves into FakeModbusTcpServer so the new timeout tests can share it.\n"
    },
    {
      "commit": "355944bc057c326216f843ad09ab91e2c771e231",
      "tree": "90cf8b165441eaa2fb66f68849e7d6fcea96d1b0",
      "parents": [
        "cd5d5e0fcd8b39eb8c03f1447200bd9e35355bc2"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 09:56:40 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 09:56:40 2026 +0200"
      },
      "message": "feat: add a REQUEST_TIMEOUT response code to plc4j, plc4py and plc4c\n\nA request that got no matching response within the request timeout had\nno response code of its own in plc4j: the closest, RESPONSE_PENDING,\nsays a result is still on its way, while after a timeout the driver has\nstopped waiting and none will follow - for a write, whether the device\nexecuted it is unknown. plc4go (PlcResponseCode_REQUEST_TIMEOUT) and\nplc4net (RequestTimeout) already have such a code; add it to plc4j,\nplc4py and plc4c, and list it in the getting-started pages.\n\nThe Plc4xResponseCode / PlcResponseCode enums of the plc4x and plc4x-api\nmspecs are wire formats and stay unchanged, as they did for NOT_READY\nand OUT_OF_RANGE.\n"
    },
    {
      "commit": "cd5d5e0fcd8b39eb8c03f1447200bd9e35355bc2",
      "tree": "99ae94d4fca0966f153e02dbe8459ac9d4b98d1e",
      "parents": [
        "7ef364e617247074cfaf5e291d16799af2472dc7"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 09:49:13 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 09:49:13 2026 +0200"
      },
      "message": "test(plc4j/modbus): assert the timeout a discarded response leads to\n\nThe unit-identifier correlation test accepted either a failed request or\na non-OK response code for a request whose only answer was discarded,\non the assumption that two timers race. There is only one: the\nper-transaction orTimeout in ModbusTcpConnection.sendRequest. onRead and\nonWrite combine their block futures with CompletableFuture.allOf, which\nfails as soon as any block fails, so such a request always completes\nwith an ExecutionException caused by a TimeoutException. Assert exactly\nthat.\n\nFollow-up to #2798.\n"
    },
    {
      "commit": "7ef364e617247074cfaf5e291d16799af2472dc7",
      "tree": "97d0b0271723bf6ce9e1bb21d2927586e9f04c19",
      "parents": [
        "b76445c7678000849ab76d9517265c45ac035e6c"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 09:42:44 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 09:44:36 2026 +0200"
      },
      "message": "fix(plc4j/modbus): reject Modbus TCP responses from another unit\n\nModbusTcpConnection correlated a response to its request by transaction\nidentifier alone, so behind a TCP-to-serial gateway a frame answered by\nunit 2 completed a read or write addressed to unit 1 whenever the\ntransaction id matched - returning the other slave\u0027s data as OK.\n\nA pending request now remembers the unit identifier it was sent to\n(including a per-tag unit-id override), and a response must echo it.\nA mismatching frame is logged and discarded without touching the\npending entry, the same policy plc4go\u0027s tcpAduFactory.acceptsResponse\nand the Java RTU/ASCII connection already apply: the request keeps\nwaiting for a matching response until its timeout, and a rejected\nwrite acknowledgement is never replayed.\n\nplc4go is not affected - its matcher already requires both the\ntransaction and the unit identifier to match.\n\nCloses #2798\n"
    },
    {
      "commit": "b76445c7678000849ab76d9517265c45ac035e6c",
      "tree": "c9eaecb38d293e9dc9a2d3cf38141ec99c1b17f4",
      "parents": [
        "493c6619d92b8bded427a494043f1af7a3b9fafa"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 12 09:42:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:42:41 2026 +0200"
      },
      "message": "build(deps): bump github.com/gopacket/gopacket in /plc4go (#2793)\n\nBumps [github.com/gopacket/gopacket](https://github.com/gopacket/gopacket) from 1.7.3 to 1.7.4.\n- [Release notes](https://github.com/gopacket/gopacket/releases)\n- [Commits](https://github.com/gopacket/gopacket/compare/v1.7.3...v1.7.4)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/gopacket/gopacket\n  dependency-version: 1.7.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "493c6619d92b8bded427a494043f1af7a3b9fafa",
      "tree": "dedff4b80f3bec3e0fe2ddbe03b62d3951c2b7e4",
      "parents": [
        "345744f821072056bed4aeef2e98acf7bccdce70"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 12 09:42:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:42:19 2026 +0200"
      },
      "message": "build(deps): bump logback.version from 1.6.4 to 1.6.5 (#2794)\n\nBumps `logback.version` from 1.6.4 to 1.6.5.\n\nUpdates `ch.qos.logback:logback-classic` from 1.6.4 to 1.6.5\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.4...v_1.6.5)\n\nUpdates `ch.qos.logback:logback-core` from 1.6.4 to 1.6.5\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.4...v_1.6.5)\n\n---\nupdated-dependencies:\n- dependency-name: ch.qos.logback:logback-classic\n  dependency-version: 1.6.5\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: ch.qos.logback:logback-core\n  dependency-version: 1.6.5\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\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": "345744f821072056bed4aeef2e98acf7bccdce70",
      "tree": "deda2beda8d6764419f97bdccc0f635008c48815",
      "parents": [
        "195ff8b6690fe1c1dc22a288653d66aedf8c7b59"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 12 09:41:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:41:47 2026 +0200"
      },
      "message": "build(deps): bump release-drafter/release-drafter from 7.7.0 to 7.9.0 (#2795)\n\nBumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 7.7.0 to 7.9.0.\n- [Release notes](https://github.com/release-drafter/release-drafter/releases)\n- [Commits](https://github.com/release-drafter/release-drafter/compare/v7.7.0...v7.9.0)\n\n---\nupdated-dependencies:\n- dependency-name: release-drafter/release-drafter\n  dependency-version: 7.9.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "195ff8b6690fe1c1dc22a288653d66aedf8c7b59",
      "tree": "5a69cb0a633cc1337e54a0bf2d4be17a2a8c9a73",
      "parents": [
        "bb5a05e659b1f19beef76ce5f7dbf876eecc41f3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 12 09:41:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:41:12 2026 +0200"
      },
      "message": "build(deps): bump com.google.guava:guava from 33.7.1-jre to 33.7.2-jre (#2796)\n\nBumps [com.google.guava:guava](https://github.com/google/guava) from 33.7.1-jre to 33.7.2-jre.\n- [Release notes](https://github.com/google/guava/releases)\n- [Commits](https://github.com/google/guava/commits)\n\n---\nupdated-dependencies:\n- dependency-name: com.google.guava:guava\n  dependency-version: 33.7.2-jre\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "bb5a05e659b1f19beef76ce5f7dbf876eecc41f3",
      "tree": "c34fc42f2d1cb8bf84a82135e84e28ef2c59c2ba",
      "parents": [
        "ea456a7cf9c2f2556939ecf13c74ce578ec8fafd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 12 09:40:50 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:40:50 2026 +0200"
      },
      "message": "build(deps): bump joda-time:joda-time from 2.14.4 to 2.15.0 (#2797)\n\nBumps [joda-time:joda-time](https://github.com/JodaOrg/joda-time) from 2.14.4 to 2.15.0.\n- [Release notes](https://github.com/JodaOrg/joda-time/releases)\n- [Changelog](https://github.com/JodaOrg/joda-time/blob/main/RELEASE-NOTES.txt)\n- [Commits](https://github.com/JodaOrg/joda-time/compare/v2.14.4...v2.15.0)\n\n---\nupdated-dependencies:\n- dependency-name: joda-time:joda-time\n  dependency-version: 2.15.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "ea456a7cf9c2f2556939ecf13c74ce578ec8fafd",
      "tree": "1c672b6853d31c7574783ee16699f98e74739177",
      "parents": [
        "2b1095c45dbce86ff61cc7e7ab0763ff9204cec8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 12 09:32:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:32:28 2026 +0200"
      },
      "message": "build(deps): bump golang.org/x/tools from 0.50.0 to 0.51.0 in /plc4go (#2799)\n\nBumps [golang.org/x/tools](https://github.com/golang/tools) from 0.50.0 to 0.51.0.\n- [Release notes](https://github.com/golang/tools/releases)\n- [Commits](https://github.com/golang/tools/compare/v0.50.0...v0.51.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/tools\n  dependency-version: 0.51.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "2b1095c45dbce86ff61cc7e7ab0763ff9204cec8",
      "tree": "2c2235af15029f4176a0f484b3d4448ff5948f15",
      "parents": [
        "0d41b34927556949d4c16aaecd400a9527de34a8"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 09:28:15 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Oct 12 09:30:05 2026 +0200"
      },
      "message": "fix(plc4go): guard serial TransportInstance.Write against concurrent\n\nClose nils serialPort/armer/pacer under stateChangeMutex, but Write and\nSetReadDeadline read those fields unguarded: a data race, and a nil-pointer\npanic when Close lands between Write\u0027s nil check and its use of the port.\n\nSnapshot the fields under the lock (not held across the blocking write);\na write racing Close now fails on the closed port instead.\n\nCloses #2802\n"
    },
    {
      "commit": "0d41b34927556949d4c16aaecd400a9527de34a8",
      "tree": "3da0f539aec9589ffdb4475ce569368c970ce051",
      "parents": [
        "d1117c5bf6bf38ea4835b814e0f688c8e86bb7b0"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 12 09:27:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 09:27:31 2026 +0200"
      },
      "message": "build(deps): bump dorny/test-reporter from 3.0.0 to 3.2.0 (#2800)\n\nBumps [dorny/test-reporter](https://github.com/dorny/test-reporter) from 3.0.0 to 3.2.0.\n- [Release notes](https://github.com/dorny/test-reporter/releases)\n- [Changelog](https://github.com/dorny/test-reporter/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/dorny/test-reporter/compare/a43b3a5f7366b97d083190328d2c652e1a8b6aa2...d1b5dff021aa968b288b02285a8bf47471c5928a)\n\n---\nupdated-dependencies:\n- dependency-name: dorny/test-reporter\n  dependency-version: 3.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "d1117c5bf6bf38ea4835b814e0f688c8e86bb7b0",
      "tree": "3fce0de4be2a225816cb09b42d86253b068fbc06",
      "parents": [
        "50249f5b15791e62e571eaab95ca8a744045acc8"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Oct 05 12:25:59 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Oct 05 12:25:59 2026 +0200"
      },
      "message": "doc: Added a link to the security page of Apache Security.\n"
    },
    {
      "commit": "50249f5b15791e62e571eaab95ca8a744045acc8",
      "tree": "9d13f23ba4dbf8febede0d0db336d4927e549262",
      "parents": [
        "ddc3080d64a8c0ab3fac3bd90b4e62fb7eb9cce4"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Fri Oct 02 15:42:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 09:42:15 2026 +0200"
      },
      "message": "feat(plc4net): add serial and COTP transports (#2788)\n\n* feat(plc4net): add serial transport\n\n* feat(plc4net): add COTP transport\n\n* fix(plc4net): harden serial and COTP transports\n\n* fix(plc4net): harden COTP transport shutdown, handshake and TPKT framing\n\n- Keep the handshake lock out of the blocking socket write. Writers are\n  serialized by a dedicated lock, and Close() closes the inner transport\n  before it takes the state lock, so a send stalled on a peer that stopped\n  reading can no longer block Close() or the polling reads.\n- Revalidate that the handshake is still the current one before Open()\n  publishes success, so a Close() that raced the Confirm is not undone.\n- Treat Disconnect Request, Disconnect Confirm (0xC0) and TPDU Error as\n  session-ending: close the transport and report the teardown instead of\n  leaving a session that looks usable.\n- Reject payloads that do not fit the 16-bit TPKT length field instead of\n  silently truncating the length.\n- Correct the CotpTransport remarks about who performs the handshake and\n  the framing.\n\n* fix(plc4net): keep delivered payload readable after a COTP peer teardown\n\n- When the peer ends the COTP session (Disconnect Request, Disconnect\n  Confirm or TPDU Error), keep the payload it already delivered readable\n  instead of discarding it with the closed session. The transport still\n  closes right away, so IsOpen turns false and Write() fails, but the\n  teardown is reported only once no delivered bytes are left, or when a\n  read asks for more than arrived. Write() and Open() now fail with the\n  teardown reason instead of claiming that Open() was never called.\n- Reject a null inner transport with ArgumentNullException instead of a\n  NullReferenceException.\n- Reject write-timeout\u003d0 in the serial configuration: SerialPort only\n  accepts a positive WriteTimeout or -1.\n- Add a test with two concurrent multi-fragment writers, which pins the\n  write lock, and make the stalled-write test check how the blocked\n  writer ends.\n\nEach fix is covered by a test that fails without it."
    },
    {
      "commit": "ddc3080d64a8c0ab3fac3bd90b4e62fb7eb9cce4",
      "tree": "54d8a964426092d9c32d62b4aa404017ff3b28cf",
      "parents": [
        "b878affa2d7b6234cc26f49084751b98f7bb4a15"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 02 09:29:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 02 09:29:51 2026 +0200"
      },
      "message": "build(deps): bump org.apache.maven:maven-artifact from 3.9.16 to 3.10.0 (#2790)\n\nBumps org.apache.maven:maven-artifact from 3.9.16 to 3.10.0.\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.maven:maven-artifact\n  dependency-version: 3.10.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "b878affa2d7b6234cc26f49084751b98f7bb4a15",
      "tree": "b9c0b7c5d8c57d1f8dcb3bf5380e8db5352fd24c",
      "parents": [
        "aeb1ba2571d9712f4d9852c6ed85ec8177e17976"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Wed Sep 30 15:47:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 09:47:47 2026 +0200"
      },
      "message": "feat(plc4net): add the MSpec C# generator (#2785)\n\n* fix(plc4net): preserve expression literal semantics\n\n* ci(plc4net): verify generated parser artifacts\n\n* feat(plc4net): render expressions as C#\n\n* feat(plc4net): add the MSpec C# generator\n\n* docs(plc4net): clarify code generator usage\n\n* Fix generated expression helpers and enum accessors\n\n* Harden plc4net code generation boundaries\n\n* Fix generated parser validation and virtual fields"
    },
    {
      "commit": "aeb1ba2571d9712f4d9852c6ed85ec8177e17976",
      "tree": "f27eb12312787eeecc208099b8f9cfb4e5f2580d",
      "parents": [
        "9c02724b9920139f818e2363445a6add6d6fb7c1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 30 08:53:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 08:53:11 2026 +0200"
      },
      "message": "build(deps): bump github.com/gopacket/gopacket in /plc4go (#2786)\n\nBumps [github.com/gopacket/gopacket](https://github.com/gopacket/gopacket) from 1.7.2 to 1.7.3.\n- [Release notes](https://github.com/gopacket/gopacket/releases)\n- [Commits](https://github.com/gopacket/gopacket/compare/v1.7.2...v1.7.3)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/gopacket/gopacket\n  dependency-version: 1.7.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "9c02724b9920139f818e2363445a6add6d6fb7c1",
      "tree": "a9d08ae8b6a715ac09cd898cd81f7334e71bf231",
      "parents": [
        "3ed95f81d8d7dc6baafd8a83b53bc676444efb6f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 30 08:52:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 30 08:52:52 2026 +0200"
      },
      "message": "build(deps): bump org.apache.commons:commons-lang3 from 3.20.0 to 3.21.0 (#2787)\n\nBumps org.apache.commons:commons-lang3 from 3.20.0 to 3.21.0.\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.commons:commons-lang3\n  dependency-version: 3.21.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "3ed95f81d8d7dc6baafd8a83b53bc676444efb6f",
      "tree": "9808ef5e9b80abc5d44a8fd8c5670394e07790dc",
      "parents": [
        "1ed71067a2b889cb1473a852e4d01c6d0d0c8fdd"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Wed Sep 30 00:18:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 18:18:03 2026 +0200"
      },
      "message": "feat(plc4net): add expression semantic model (#2784)"
    },
    {
      "commit": "1ed71067a2b889cb1473a852e4d01c6d0d0c8fdd",
      "tree": "c508e68c582676cb02fec326ac3bc021990fff2e",
      "parents": [
        "4b0207148d75d562d39d7d6018127b0d7ac1ae87"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Tue Sep 29 17:21:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 29 11:21:53 2026 +0200"
      },
      "message": "feat(plc4net): add the generated C# parsers for the mspec and expression grammars (#2783)\n\n* feat(plc4net): add the generated C# parsers for the mspec and expression grammars\n\nCheck in the ANTLR C# front-end for the mspec language, generated from the\ngrammars in code-generation/protocol-base-mspec (MSpec.g4 and\nexpression/Expression.g4), which are used unchanged. The lexer\u0027s\nEmptyLine rule calls getCharPositionInLine(), the ANTLR Java runtime\u0027s\nname for the C# runtime\u0027s Column; a small partial class supplies it for\nthe C# lexer. The generated parsers, lexers and listeners are committed so\nday-to-day .NET work needs no JDK, and every checked-in artifact carries\nthe ASF header; only the .interp debug files are left out, since ANTLR\nregenerates them on every run. The project is a class library at this\nstage; the generator and its CLI land in a follow-up change.\n\n* test(plc4net): cover parser generation and runtime"
    },
    {
      "commit": "4b0207148d75d562d39d7d6018127b0d7ac1ae87",
      "tree": "884e67a19fafda246ec3e0b858f94ea7a579c2fa",
      "parents": [
        "24103198721a9c8a8838e051529ef774fb9e0408"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Sep 28 09:29:19 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Sep 28 09:30:28 2026 +0200"
      },
      "message": "fix(plc4j/opcua): stop PlcConsumerRegistration.unregister() from recursing\n\nOpcuaConnection.onUnregisterConsumer() called registration.unregister(),\nwhich goes straight back through ConnectionBase.unregisterConsumer() into\nonUnregisterConsumer(), so every unregister ended in a StackOverflowError.\nIt now drops the registration and detaches its consumer from each OPC UA\nsubscription handle, like the other drivers do.\n\nThe handle never removed a consumer once registered, so without that\ndetach step unregister() would have returned but events kept arriving.\nOpcuaSubscriptionHandle.unregister(Consumer) removes it from both the\nsubscription and the per-tag consumers. Both collections are now\nconcurrent, since consumers are removed from the caller\u0027s thread while\nthe publish and cyclic threads iterate them.\n\nFixes #2775\n"
    },
    {
      "commit": "24103198721a9c8a8838e051529ef774fb9e0408",
      "tree": "24743f03dfafb78e510556d270ca5953fcacf52f",
      "parents": [
        "a11a71bb3acf027004595b0a326b9fe6c1bcf33a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 09:14:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 09:14:23 2026 +0200"
      },
      "message": "build(deps): bump logback.version from 1.6.3 to 1.6.4 (#2776)\n\nBumps `logback.version` from 1.6.3 to 1.6.4.\n\nUpdates `ch.qos.logback:logback-classic` from 1.6.3 to 1.6.4\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.3...v_1.6.4)\n\nUpdates `ch.qos.logback:logback-core` from 1.6.3 to 1.6.4\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.3...v_1.6.4)\n\n---\nupdated-dependencies:\n- dependency-name: ch.qos.logback:logback-classic\n  dependency-version: 1.6.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: ch.qos.logback:logback-core\n  dependency-version: 1.6.4\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\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": "a11a71bb3acf027004595b0a326b9fe6c1bcf33a",
      "tree": "4273ac141cde095a9dd326f8c8e83599d228b25e",
      "parents": [
        "748117663d56677dc1dae99f133c20126500b693"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 09:13:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 09:13:53 2026 +0200"
      },
      "message": "build(deps): bump com.gradle:develocity-maven-extension (#2777)\n\nBumps com.gradle:develocity-maven-extension from 2.5.0 to 2.6.0.\n\n---\nupdated-dependencies:\n- dependency-name: com.gradle:develocity-maven-extension\n  dependency-version: 2.6.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "748117663d56677dc1dae99f133c20126500b693",
      "tree": "28aea2909852f6ebd913f822a16eb6db52f88262",
      "parents": [
        "419d0e7ba261ecc58a2a1464044d5df6e877bb2b"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Mon Sep 28 15:13:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 09:13:30 2026 +0200"
      },
      "message": "feat(plc4net): add the TCP transport (#2774)\n\n* feat(plc4net): add the TCP transport\n\nAdd the \"tcp\" transport to plc4net, reworked for the current SPI:\n\n- The transport SPI is synchronous, so opening a connection returns a\n  connected instance and the constructor has to block its caller. The\n  blocking happens in exactly one place: the async connect runs on the\n  thread pool under a cancellation token tied to the connect timeout, so\n  an attempt that runs out of time is actually aborted, not abandoned.\n- Host-name resolution gets the same deadline and treatment, with the\n  lookup injected as a seam so tests can stand in for DNS. A literal\n  address skips the lookup, and the first IPv4 answer wins so that a\n  v6-first resolver result cannot produce a socket that cannot reach a\n  v4-only PLC.\n- Close() never waits for the read loop: closing the socket is what ends\n  the loop, and waiting would deadlock a Close() made from inside a\n  listener callback. A peer hang-up still releases the socket, from the\n  read loop\u0027s own thread, and is reported to the disconnect listener\n  only when our own Close() did not get there first. A write that the\n  close itself interrupts also ends silently: the close marks the\n  instance before it touches the socket, so a write waking up from that\n  shutdown is recognized as self-inflicted rather than surfaced as\n  \"Failed to write data\".\n- ITransportInstance.RegisterDisconnectListener takes an\n  Action\u003cException?\u003e, null meaning an orderly close by the remote end.\n\nAddresses accept host, host:port, [ipv6]:port and an optional\n/driver-config suffix; connection-string options follow the Java\nprefixing scheme and are written with or without the \"tcp.\" prefix, but\nthe option names are this port\u0027s own, so a connection string copied from\nJava needs its option names translated. Tests run against a real\nloopback TcpListener, because the read loop, the locks and the teardown\npaths only misbehave once there is a peer that can hang up.\n\n* fix(plc4net): #2771 improvements\n\nRead and write requests now take their own copy of the tag map, so\nreusing a builder, or changing the map passed to a request constructor,\nno longer changes a request that was already built.\n\nBoth builders reject a duplicate tag name instead of silently replacing\nthe earlier tag, as the SPI3 builders do. The ten typed AddTag overloads\nof the write builder now forward to AddTag\u003cT\u003e, so the check lives in one\nplace.\n\nThe write builder rejects a call with no value instead of storing null.\nSeveral values for one tag stay unsupported, with the same explicit\nerror as before: array writes need a tag-aware value model (a PlcList,\nas in SPI3) and driver support first.\n\nTestTransportInstance.WaitForWrittenData now fails as soon as the\ninstance is closed instead of waiting out the full timeout.\n\nPlcLTIME.GetDuration reads the raw 64 bits as the signed nanosecond\ncount that IEC 61131-3 defines for LTIME, as plc4j does. Negative\ndurations such as LT#-1s used to come out as roughly +584 years.\nPlcLTIME_OF_DAY.GetTime drops a clamp that the constructor\u0027s range\ncheck already made unreachable.\n\n* fix(plc4net/spi): Refine exception handling in TcpTransportInstance\n\nHandle ObjectDisposedException for transport write failures.\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n---------\n\nCo-authored-by: Sebastian Rühl \u003csebastian.ruehl.os@pm.me\u003e\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "419d0e7ba261ecc58a2a1464044d5df6e877bb2b",
      "tree": "511045cc343a28eac63bc668b1229d9cc6bc6631",
      "parents": [
        "c1dcb276ea80435e4c55eed9270f66a5ccda8573"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 09:09:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 09:09:54 2026 +0200"
      },
      "message": "build(deps): bump github/codeql-action from 4.38.1 to 4.38.2 (#2778)\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 4.38.1 to 4.38.2.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v4.38.1...v4.38.2)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: 4.38.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "c1dcb276ea80435e4c55eed9270f66a5ccda8573",
      "tree": "36f20bd6442652b710ac41b55947585343894a13",
      "parents": [
        "9ca756306835eaf124b87bdcd950ceb3e17e3789"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 09:09:35 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 09:09:35 2026 +0200"
      },
      "message": "build(deps): bump actions/setup-dotnet from 5 to 6 (#2780)\n\nBumps [actions/setup-dotnet](https://github.com/actions/setup-dotnet) from 5 to 6.\n- [Release notes](https://github.com/actions/setup-dotnet/releases)\n- [Commits](https://github.com/actions/setup-dotnet/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-dotnet\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "9ca756306835eaf124b87bdcd950ceb3e17e3789",
      "tree": "a0b3d6de0cd8c73c71e6e101fa41d198afe768b3",
      "parents": [
        "1fe623472f5dcfb05ee4dab44f6ea1d16e9a88c8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 09:05:59 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 09:05:59 2026 +0200"
      },
      "message": "build(deps): bump mockito.version from 5.23.0 to 5.24.0 (#2779)\n\nBumps `mockito.version` from 5.23.0 to 5.24.0.\n\nUpdates `org.mockito:mockito-core` from 5.23.0 to 5.24.0\n- [Release notes](https://github.com/mockito/mockito/releases)\n- [Commits](https://github.com/mockito/mockito/compare/v5.23.0...v5.24.0)\n\nUpdates `org.mockito:mockito-junit-jupiter` from 5.23.0 to 5.24.0\n- [Release notes](https://github.com/mockito/mockito/releases)\n- [Commits](https://github.com/mockito/mockito/compare/v5.23.0...v5.24.0)\n\n---\nupdated-dependencies:\n- dependency-name: org.mockito:mockito-core\n  dependency-version: 5.24.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: org.mockito:mockito-junit-jupiter\n  dependency-version: 5.24.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "1fe623472f5dcfb05ee4dab44f6ea1d16e9a88c8",
      "tree": "b111c02356df593a101b16e0eca6bc12508bbb71",
      "parents": [
        "231c05bb564ab89ec4b60fc64d343b0803782b22"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 09:05:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 09:05:41 2026 +0200"
      },
      "message": "build(deps): bump org.slf4j:slf4j-api from 2.0.19 to 2.0.20 (#2781)\n\nBumps org.slf4j:slf4j-api from 2.0.19 to 2.0.20.\n\n---\nupdated-dependencies:\n- dependency-name: org.slf4j:slf4j-api\n  dependency-version: 2.0.20\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "231c05bb564ab89ec4b60fc64d343b0803782b22",
      "tree": "f62745fbedd67badf8455c6a1e9f4b37792bab45",
      "parents": [
        "994a2851a87e134d9d6cb35236247d14705d83e2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Sep 28 09:05:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 28 09:05:20 2026 +0200"
      },
      "message": "build(deps-dev): bump org.apache.karaf.tooling:karaf-maven-plugin (#2782)\n\nBumps org.apache.karaf.tooling:karaf-maven-plugin from 4.4.11 to 4.4.12.\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.karaf.tooling:karaf-maven-plugin\n  dependency-version: 4.4.12\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\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": "994a2851a87e134d9d6cb35236247d14705d83e2",
      "tree": "c580dcbdb7d109be9cebec76ed4cfccfef13699e",
      "parents": [
        "9f955ca81a000867b3630f7dcf47749539418f49"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:50:33 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:50:33 2026 +0200"
      },
      "message": "test(plc4j/opcua): let Maven fetch the Milo jar for the test server image\n\nThe OPC UA test server image downloaded the Milo server-examples jar with\na Dockerfile ADD from Maven Central. Central now rejects that client with\n\"429 Too Many Requests ... identified as abusive and/or wasteful\", which\nfails OpcuaPlcDriverTest on the Ubuntu CI legs (the only ones running\nDocker). An ADD of a URL is also re-fetched on every image build, cached\nor not, so every run hit Central.\n\nmaven-dependency-plugin:copy now places the jar next to the Dockerfile,\nresolved from the local repository (cached in CI) or the configured\nmirror, and the Dockerfile COPYs it. Only that single jar is fetched, so\nMilo\u0027s dependency tree still stays off the test classpath. The version\nmoves to the milo.version property in the module pom.\n"
    },
    {
      "commit": "9f955ca81a000867b3630f7dcf47749539418f49",
      "tree": "7cdddd181dc323f1a3d2ec6757326366fb4aacb6",
      "parents": [
        "6ce26fe4fa998cee95f2a906d5ae4773a1506307"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:32:05 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:32:05 2026 +0200"
      },
      "message": "fix(plc4py): fall back to a port of ElementTree.indent on Python 3.8\n\nWriteBufferXmlBased.to_xml_string() called ET.indent, which only exists\nfrom Python 3.9 on, so the test added in 40dea56570 fails on the 3.8 leg\nof the Python workflow. The failure stayed hidden while the root license\ncheck was breaking every build first.\n"
    },
    {
      "commit": "6ce26fe4fa998cee95f2a906d5ae4773a1506307",
      "tree": "644e8186d290980b8b58f66f0e7e196b22a292dc",
      "parents": [
        "c3006e987924c6efc23b781898b9c4940fe7932e"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:12:09 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:13:24 2026 +0200"
      },
      "message": "chore(plc4net): drop the .sln license-check exclusion, the solution file carries the header\n"
    },
    {
      "commit": "c3006e987924c6efc23b781898b9c4940fe7932e",
      "tree": "5ca0218c16eab1a55820050699cfb70a3da85a96",
      "parents": [
        "6d6f6f126955d996be20fb0f17d540106068f470"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:07:24 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:08:03 2026 +0200"
      },
      "message": "chore(ads): drop the outdated flag-layout comments from AdsSymbolTableEntry\n\nRefs #2773\n"
    },
    {
      "commit": "6d6f6f126955d996be20fb0f17d540106068f470",
      "tree": "0ad1a7617f0d5c10fcb5a4f794d3bf73a274d666",
      "parents": [
        "be330eba692b2dd66b577f7cfaf1f6eabcb274f1"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:07:23 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:07:23 2026 +0200"
      },
      "message": "build(plc4net): restore the Apache license header in plc4net.sln\n\n#2771 regenerated the solution file and dropped its license header, which\nfails the root apache-rat license-check. The .NET workflow does not run it,\nso the break only surfaced on the next commit touching the other languages.\n"
    },
    {
      "commit": "be330eba692b2dd66b577f7cfaf1f6eabcb274f1",
      "tree": "04832e2d6cf588bb353a111c001bf8901f99fe6a",
      "parents": [
        "676de7ee3e0b8c70f96b04636d1a5e544b548a18"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 12:45:29 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Sep 25 13:01:32 2026 +0200"
      },
      "message": "fix(ads): parse symbol table entry flags per TcAdsDef.h\n\nBits 15..8 of the ADS symbol flags were mapped wrongly: bits 11..8 are\nnot flags but the 4-bit task/context id (ADSSYMBOLFLAG_CONTEXTMASK\n0x0F00), and attributes/static/init-on-reset/extended-flags sit at bits\n12..15. A symbol in context 2 (0x0200) was therefore read as carrying an\nattribute block, so the parser ran past the end of the entry into the\nnext one and failed with \"Actual value 64 for field nameTerminator\ndoesn\u0027t match expected 0\" while uploading a large symbol table.\n\ncontextMask is now the 4-bit field inside the flags; the optional uint32\nthat was read after the comment for it does not exist on the wire and is\ngone, as are flagCompilerGenerated and flagSystemServiceSymbol, which\nhad no counterpart in TcAdsDef.h. Regenerated plc4j and plc4go; no other\nlanguage generates ADS code.\n\nFixes #2773\n"
    },
    {
      "commit": "676de7ee3e0b8c70f96b04636d1a5e544b548a18",
      "tree": "4841ac970ea4d9a5345f337ace2ef9a1560f12ef",
      "parents": [
        "01c5747a714e00f1ed0ea8cfeb29ab5c708e17b9"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "chaotomzhu@gmail.com",
        "time": "Fri Sep 25 16:17:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 10:17:29 2026 +0200"
      },
      "message": "feat(plc4net): add .NET 8 API and SPI foundation (#2771)\n\n* feat(plc4net): add .NET 8 API and SPI foundation\n\n* fix(plc4net): resolve Copilot review findings on nullable and numeric safety\n\nConsolidates three related fixes into a single commit:\n\n1. Enable nullable analysis (Directory.Build.props) and correct nullable contracts\n   - Switches from \u0027annotations\u0027 to \u0027enable\u0027 for full null-safety checking\n   - Annotates feature-gated builders, transports, authentication as nullable\n   - Makes PlcValueAdapter reference-type accessors throw instead of returning null\n\n2. Align DefaultDotNetType table to native .NET storage types\n   - WORD/DWORD/LWORD: short/int/long → ushort/uint/ulong (unsigned)\n   - USINT/UINT/UDINT: ushort/uint/ulong → byte/ushort/uint (unsigned)\n   - WCHAR: short → char (actual storage)\n   - DATE/LDATE: DateTime → DateOnly (actual storage)\n   - TIME_OF_DAY/LTIME_OF_DAY: TimeSpan → TimeOnly (actual storage)\n\n3. Add numeric bounds validation for temporal fields\n   - PlcLTIME.GetDuration(): check nanoseconds overflow\n   - PlcDATE_AND_LTIME: validate nanosecondsOfSecond in [0, 999_999_999]\n   - PlcDATE_AND_LTIME.OfSegments(): validate nanoseconds parameter\n   - PlcLTIME_OF_DAY: guard against overflow on large values\n\nTests: 138/138 passing\nBuild: 0 errors, 0 warnings"
    },
    {
      "commit": "01c5747a714e00f1ed0ea8cfeb29ab5c708e17b9",
      "tree": "ea465a46be81078ebc0fddb7c525f48873eb9b91",
      "parents": [
        "bc6854e8d2ea257f570fa1db909ee58210f7c233"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 25 10:13:38 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 10:13:38 2026 +0200"
      },
      "message": "build(deps): bump jackson.version from 2.22.2 to 2.22.3 (#2772)\n\nBumps `jackson.version` from 2.22.2 to 2.22.3.\n\nUpdates `com.fasterxml.jackson.core:jackson-core` from 2.22.2 to 2.22.3\n- [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.22.2...jackson-core-2.22.3)\n\nUpdates `com.fasterxml.jackson.core:jackson-databind` from 2.22.2 to 2.22.3\n- [Commits](https://github.com/FasterXML/jackson-databind/compare/jackson-databind-2.22.2...jackson-databind-2.22.3)\n\nUpdates `com.fasterxml.jackson.dataformat:jackson-dataformat-xml` from 2.22.2 to 2.22.3\n- [Commits](https://github.com/FasterXML/jackson-dataformat-xml/compare/jackson-dataformat-xml-2.22.2...jackson-dataformat-xml-2.22.3)\n\nUpdates `com.fasterxml.jackson.dataformat:jackson-dataformat-yaml` from 2.22.2 to 2.22.3\n- [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.22.2...jackson-dataformats-text-2.22.3)\n\nUpdates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.22.2 to 2.22.3\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-core\n  dependency-version: 2.22.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: com.fasterxml.jackson.core:jackson-databind\n  dependency-version: 2.22.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-xml\n  dependency-version: 2.22.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml\n  dependency-version: 2.22.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310\n  dependency-version: 2.22.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "bc6854e8d2ea257f570fa1db909ee58210f7c233",
      "tree": "14caf8a65d10c559e9e4ac5918f07b5480de0c02",
      "parents": [
        "d4166b8420612eea57bfdc63cf39ebdbefc13b18"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 23 09:10:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 09:10:21 2026 +0200"
      },
      "message": "build(deps): bump org.apache:apache from 39 to 40 (#2769)\n\nBumps [org.apache:apache](https://github.com/apache/maven-apache-parent) from 39 to 40.\n- [Release notes](https://github.com/apache/maven-apache-parent/releases)\n- [Commits](https://github.com/apache/maven-apache-parent/commits)\n\n---\nupdated-dependencies:\n- dependency-name: org.apache:apache\n  dependency-version: \u002740\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "d4166b8420612eea57bfdc63cf39ebdbefc13b18",
      "tree": "ceae2eb319e2d2aeecc2027f70c4f34e1d754b3f",
      "parents": [
        "0f5fa055fac83afda1d863e14474177d32d5ff61"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Sep 23 09:10:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 09:10:02 2026 +0200"
      },
      "message": "build(deps): bump joda-time:joda-time from 2.14.3 to 2.14.4 (#2770)\n\nBumps [joda-time:joda-time](https://github.com/JodaOrg/joda-time) from 2.14.3 to 2.14.4.\n- [Release notes](https://github.com/JodaOrg/joda-time/releases)\n- [Changelog](https://github.com/JodaOrg/joda-time/blob/main/RELEASE-NOTES.txt)\n- [Commits](https://github.com/JodaOrg/joda-time/compare/v2.14.3...v2.14.4)\n\n---\nupdated-dependencies:\n- dependency-name: joda-time:joda-time\n  dependency-version: 2.14.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\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": "0f5fa055fac83afda1d863e14474177d32d5ff61",
      "tree": "6520135eea6af4afb18522ccaebe221c4743f690",
      "parents": [
        "bf4057a1b639737acd4bf1fddb287a87e6f5d239"
      ],
      "author": {
        "name": "TomNewChao",
        "email": "tom_toworld@163.com",
        "time": "Wed Sep 23 11:26:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 07:26:19 2026 +0400"
      },
      "message": "chore(plc4net): remove the abandoned net452 knxproj driver (#2761)"
    },
    {
      "commit": "bf4057a1b639737acd4bf1fddb287a87e6f5d239",
      "tree": "4690febdcf53ea7e89387acc88de738490190d71",
      "parents": [
        "892d49ae0297cf13b427a398f137a3ec307a8368"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Sep 22 20:12:45 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Sep 22 20:12:45 2026 +0200"
      },
      "message": "chore: Hopefully now the release picks the right key to sign.\n"
    },
    {
      "commit": "892d49ae0297cf13b427a398f137a3ec307a8368",
      "tree": "0a435e7a5d4ac1e2663dee48cc72613e31601e16",
      "parents": [
        "c35e9c889b3bf5cdbeb616a2b36085cb0c1fa784"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Sep 22 17:58:26 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Sep 22 17:58:26 2026 +0200"
      },
      "message": "fix(plc4go/bacnetip): stop injecting a port-sharing option nothing reads\n\nThe driver set a port-sharing option under a bare name while the udp transport\nreads it under the transport\u0027s own code, so it never arrived where it was meant\nto go. Its only effect was the driver reporting one of its own options as\nunknown and ignoring it.\n\nSetting the name the transport does read would not have helped either. The\nsocket option behind it is documented as a no-op: SO_REUSEPORT does not deliver\nbroadcast traffic to several host-local BACnet stacks, because the kernel hashes\neach broadcast to a single socket, so a second stack still misses traffic.\nSharing the well-known port needs a userland demultiplexer, which is what the\ndiscoverer already says in the comment where it gave the approach up.\n\nRemove the injection, and pin that the driver hands the transport no option\nwithout a reader.\n"
    }
  ],
  "next": "c35e9c889b3bf5cdbeb616a2b36085cb0c1fa784"
}
