)]}'
{
  "log": [
    {
      "commit": "35f713ddd8cda4c2282d456a724d41c0c8b7bd27",
      "tree": "137a0b7a12a1beec2667b2c05adea83ddbca9901",
      "parents": [
        "1bee1b5e5cc9a17f04dbb493ef6a293040a5f427"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 29 09:32:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 09:32:40 2026 +0200"
      },
      "message": "build(deps): bump logback.version from 1.6.0 to 1.6.1 (#2658)\n\nBumps `logback.version` from 1.6.0 to 1.6.1.\n\nUpdates `ch.qos.logback:logback-classic` from 1.6.0 to 1.6.1\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.0...v_1.6.1)\n\nUpdates `ch.qos.logback:logback-core` from 1.6.0 to 1.6.1\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.6.0...v_1.6.1)\n\n---\nupdated-dependencies:\n- dependency-name: ch.qos.logback:logback-classic\n  dependency-version: 1.6.1\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.1\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": "1bee1b5e5cc9a17f04dbb493ef6a293040a5f427",
      "tree": "c0fb05ffc291248b00b3580f574e96c3ba5c4756",
      "parents": [
        "e58d364d382394ebe71368d8fafb3fc4e80b016f"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Jul 28 13:23:46 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Jul 28 13:23:46 2026 +0200"
      },
      "message": "chore: thighten PR approvals\n"
    },
    {
      "commit": "e58d364d382394ebe71368d8fafb3fc4e80b016f",
      "tree": "2d578db8e079589620d0a94e3b428e5270c4ce32",
      "parents": [
        "2ef3f7e1064804c5026503698f7cdee96998fa4e"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 28 10:33:38 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 28 10:33:38 2026 +0200"
      },
      "message": "doc: Fixed an invalid link in the vote email temlpate.\n"
    },
    {
      "commit": "2ef3f7e1064804c5026503698f7cdee96998fa4e",
      "tree": "748a44e22cecae30801ba5e565441db9f7dda10a",
      "parents": [
        "360a18d7597594906a6f6bfad4f855b5f67fefa4"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 14:12:05 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 14:12:05 2026 +0200"
      },
      "message": "chore: Updated the release-scripts to be more maven4-style\n"
    },
    {
      "commit": "360a18d7597594906a6f6bfad4f855b5f67fefa4",
      "tree": "7f08d3c7c875ace070bdb06eb5cca8a19086971c",
      "parents": [
        "94e5305b7c14e80bf133d32e4a205cd901f1492a"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 11:58:27 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 11:58:27 2026 +0200"
      },
      "message": "chore: Updated the \"apache\" parent to the latest version throughout the project.\n"
    },
    {
      "commit": "94e5305b7c14e80bf133d32e4a205cd901f1492a",
      "tree": "8e679a81e5941a0c9a4013195990362ee7badc97",
      "parents": [
        "511844a715db7b96a8bdddba9754cb528a7b3622"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 11:56:57 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 11:56:57 2026 +0200"
      },
      "message": "doc: Updated the NOTICE files to the current year.\n"
    },
    {
      "commit": "511844a715db7b96a8bdddba9754cb528a7b3622",
      "tree": "683c8d9f1e19b4ab3148dbdfeb8015613630bcb7",
      "parents": [
        "df25bdef74f9f888814afb69af345893fa40401c"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 11:55:42 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 11:55:42 2026 +0200"
      },
      "message": "doc: Updated the RELEASE_NOTES in preparation for an upcoming release.\n"
    },
    {
      "commit": "df25bdef74f9f888814afb69af345893fa40401c",
      "tree": "836ef109f9bd2b0b6253537f9a97861ebd5f84a1",
      "parents": [
        "7f851ab2592082850b2467db330fa54a7a4cb9a6"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 11:06:53 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 11:06:53 2026 +0200"
      },
      "message": "chore: Updated the BACnet and KNX Vendor IDs\n\nchore: Some unrelated changes in go (no idea where they came from ;-) )\n"
    },
    {
      "commit": "7f851ab2592082850b2467db330fa54a7a4cb9a6",
      "tree": "a309da8be7bd25e769cc6d6e8c363326247f3454",
      "parents": [
        "e6b19dd4cfcbd8bb19a78b649e4553128e9c52a7"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 10:48:04 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 10:48:04 2026 +0200"
      },
      "message": "feat: Updated all drivers that currently didn\u0027t support subscriptions natively to use the new subscription emulation.\n"
    },
    {
      "commit": "e6b19dd4cfcbd8bb19a78b649e4553128e9c52a7",
      "tree": "2d79ed882b04b92c30952fb3390e2674253b6d8d",
      "parents": [
        "422ff98d35379e5c9e9d378c591f712b52bf71ae"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 10:47:16 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 10:47:16 2026 +0200"
      },
      "message": "chore: Streamlined the artifactIds of some of the \"tools\" to match the general pattern.\n\nchore: Removed the scraper.\n"
    },
    {
      "commit": "422ff98d35379e5c9e9d378c591f712b52bf71ae",
      "tree": "08a3dd35063822b60ef07839e89ec9945be69086",
      "parents": [
        "f7b8557fc4df792d4a23ded53ed0396d1326a56f"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 10:14:09 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 27 10:14:09 2026 +0200"
      },
      "message": "chore: Updated the BACnet and KNX Vendor IDs\n"
    },
    {
      "commit": "f7b8557fc4df792d4a23ded53ed0396d1326a56f",
      "tree": "b274b83b2059b413b72778b7eab97b834fca7030",
      "parents": [
        "37160dfd75a2279d1f615737fd35b087c1925b25"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 27 09:09:21 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 27 09:09:28 2026 +0200"
      },
      "message": "chore: licence fix\n"
    },
    {
      "commit": "37160dfd75a2279d1f615737fd35b087c1925b25",
      "tree": "96bd80ffe9a3c94c95b1571dfaaa495b199d0c71",
      "parents": [
        "a9c5517298f796889237e086f76cf96402f72039"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 27 09:08:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 09:08:20 2026 +0200"
      },
      "message": "build(deps): bump joda-time:joda-time from 2.14.2 to 2.14.3 (#2657)\n\nBumps [joda-time:joda-time](https://github.com/JodaOrg/joda-time) from 2.14.2 to 2.14.3.\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.2...v2.14.3)\n\n---\nupdated-dependencies:\n- dependency-name: joda-time:joda-time\n  dependency-version: 2.14.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": "a9c5517298f796889237e086f76cf96402f72039",
      "tree": "b0132d07b9c834e4f5159eae933b0f9f57a540f9",
      "parents": [
        "5e4fb8e202a618eca3a491f50c825966f35d23b1"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 24 11:39:32 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 24 11:48:42 2026 +0200"
      },
      "message": "test(plc4go/bacnetip): routed-addressing roundtrip coverage\n\nCompletes the test coverage for the RemoteNetwork/RemoteAddress routed\naddressing: a fake BACnet router asserting the outgoing destination\nspecifiers and replying source-specified (TestNativeBacnetRead_RoutedViaRouter),\nplus a serialization pin that a source-specified NPDU carrying a ComplexACK\nround-trips with its APDU intact.\n"
    },
    {
      "commit": "5e4fb8e202a618eca3a491f50c825966f35d23b1",
      "tree": "b4424fe41ef46e0f2894669515d59b6b10f40e47",
      "parents": [
        "6ac074eb98e198d9055a71ba9e0680df0348ac57"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 24 11:38:19 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 24 11:48:42 2026 +0200"
      },
      "message": "feat(plc4go/bacnetip): segmented request sending via peer-capability connection options\n\nA confirmed request whose APDU exceeds the target device\u0027s declared\nMaxApduLengthAccepted now goes out as a segmented request per ASHRAE 135\nclause 5.4: segment 0 alone, then windows of segments paced by the peer\u0027s\nSegmentAcks (actual window size honored, NAK-driven rewind, bounded\nretransmission on ack timeout). The final service response is matched by a\npre-armed expectation that explicitly ignores SegmentAcks, since both wait\non the same invoke id.\n\nThe peer\u0027s capabilities arrive as two new connection options mirroring the\nI-Am vocabulary: PeerMaxApduLengthAccepted\u003d\u003coctets\u003e and\nPeerSegmentationSupported\u003d\u003csegmented-both|segmented-receive|...\u003e. With no\ndeclared ceiling nothing changes (requests are never segmented); with a\nceiling but no segmentation support an oversized request fails fast with an\nactionable error instead of provoking a device-side abort. An unknown peer\ncapability conservatively means no-segmentation — deliberately the opposite\ndefault of our OWN capability parsing.\n\nReader and Writer share the transmit machinery (large ReadPropertyMultiple\naccess lists segment too); the previously unconsumed outboundSegmenter now\ndrives the wire format: segment 0 carries the service-choice byte as its\nfirst payload byte, follow-up segments repeat the choice in the discrete\nsegmentServiceChoice field, matching the generated model\u0027s parse conditions.\n\nRoundtrip tests run a fake clause-5.4 receive-side device: window sizes 1\nand 3, NAK continuation, fail-fast without peer support, and a fitting\nrequest staying unsegmented.\n"
    },
    {
      "commit": "6ac074eb98e198d9055a71ba9e0680df0348ac57",
      "tree": "6ce69d43a9d7efc4f6b1287f240b1b1c77434e67",
      "parents": [
        "8e5f34701387a9803d363a24db63e55a4d6a2267"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 24 09:04:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 09:04:47 2026 +0200"
      },
      "message": "build(deps): bump logback.version from 1.5.38 to 1.6.0 (#2653)\n\nBumps `logback.version` from 1.5.38 to 1.6.0.\n\nUpdates `ch.qos.logback:logback-classic` from 1.5.38 to 1.6.0\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.38...v_1.6.0)\n\nUpdates `ch.qos.logback:logback-core` from 1.5.38 to 1.6.0\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.38...v_1.6.0)\n\n---\nupdated-dependencies:\n- dependency-name: ch.qos.logback:logback-classic\n  dependency-version: 1.6.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: ch.qos.logback:logback-core\n  dependency-version: 1.6.0\n  dependency-type: direct:development\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": "8e5f34701387a9803d363a24db63e55a4d6a2267",
      "tree": "a0ac188edb9d00de2d60a3e6ee76b4699d2f5553",
      "parents": [
        "130d77d37b647d8e6426463de7a61198d9b33471"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 23 16:20:06 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 23 16:21:39 2026 +0200"
      },
      "message": "feat(plc4go/bacnetip): routed BACnet addressing via RemoteNetwork/RemoteAddress connection options\n\nA connection whose target device sits behind a BACnet router (ASHRAE 135\nclause 6) can now reach it: connect to the ROUTER\u0027s IP and set\nRemoteNetwork\u003d\u003cdnet\u003e\u0026RemoteAddress\u003d\u003cip:port|0xhex\u003e. Every outgoing NPDU\n(Reader, Writer, Subscriber, segment acks) then carries the destination\nspecifier (DNET/DLEN/DADR, hop count 255) so the router forwards it onto\nthe target\u0027s network; replies match on invoke id as before.\n\nThe discovery side mirrors the same vocabulary: a routed I-Am\u0027s NPDU\nsource specifier (SNET/SADR) is surfaced on the PlcDiscoveryItem as\nRemoteNetwork/RemoteAddress options — copy-paste ready for the routed\nconnection URL, with 6-octet SADRs rendered as B/IP \u003cip\u003e:\u003cport\u003e and other\ndatalink MACs as 0x hex.\n\nThis wires the first slice of the Phase 6 routed-addressing plan; the\nDeviceInfoCache/StaticDevices scaffolding stays available for multi-device\nconnections later.\n"
    },
    {
      "commit": "130d77d37b647d8e6426463de7a61198d9b33471",
      "tree": "c812f0536886d66c2de89a171651efcd4baf3c5a",
      "parents": [
        "b480a2494aac84b4e2ff61581a50255d69dac741"
      ],
      "author": {
        "name": "Martin Kribs",
        "email": "53047082+mkribs@users.noreply.github.com",
        "time": "Thu Jul 23 13:59:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 13:59:10 2026 +0200"
      },
      "message": "fix(plc4j/transports-tcp): close SocketChannel on failed bind/socket-option setup (#2645)\n\n* fix(plc4j/transports-tcp): close SocketChannel on failed bind/socket-option setup\n\nTcpTransportInstance\u0027s constructor only assigned the opened SocketChannel\nto the socketChannel field after bind(), socket options and connect() all\nsucceeded. If bind() or a socket-option call threw (e.g. a pinned local\nport still held by a previous failed attempt), the already-open channel\nwas never closed - each such failure leaked one fd. connect() failures\n(timeout/refused) are unaffected since Socket.connect() already closes\nitself internally on failure.\n\n* fix(plc4j/transports-tcp): tighten fd-leak test assertion per review\n\ngrown \u003c attempts still passed if the leak only fired on some (but not all) iterations. Assert grown \u003c\u003d 1 instead, so any per-attempt leak is caught, not just a leak on every single attempt.\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* fix(plc4j/transports-tcp): address Copilot review feedback on fd-leak test\n\n* fix(plc4j/transports-tcp): close channel on any constructor failure, not just IOException\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "b480a2494aac84b4e2ff61581a50255d69dac741",
      "tree": "cb9f6d770387b4c3ee4d52a7fcf5a7a0feef60c2",
      "parents": [
        "9f298a1bcc175f255066e109a9b69805298ad398"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Jul 23 08:54:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 08:54:37 2026 +0200"
      },
      "message": "build(deps-dev): bump org.apache.maven.plugins:maven-jar-plugin (#2652)\n\nBumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.5.0 to 3.5.1.\n- [Release notes](https://github.com/apache/maven-jar-plugin/releases)\n- [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.5.0...maven-jar-plugin-3.5.1)\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.maven.plugins:maven-jar-plugin\n  dependency-version: 3.5.1\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": "9f298a1bcc175f255066e109a9b69805298ad398",
      "tree": "3548a7328367316a3191952eaeafe2d92b83dfc2",
      "parents": [
        "361e32201df3c1ea00b0604b7f358d334d479a14"
      ],
      "author": {
        "name": "LivingLikeKrillin",
        "email": "143606756+LivingLikeKrillin@users.noreply.github.com",
        "time": "Tue Jul 21 19:41:43 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 12:41:43 2026 +0200"
      },
      "message": "feat(plc4j/slmp): add Batch Write (0x1401) support (#2651)\n\n* feat(plc4j/slmp): model Batch Write (0x1401) request in the mspec\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* test(plc4j/slmp): pin the Batch Write 0x1401 frame bytes\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* docs(plc4j/slmp): sync mspec header section index and SlmpRequestData docblock for Batch Write\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* feat(plc4j/slmp): add SlmpDataType.encode (mirror of decode)\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* feat(plc4j/slmp): map Batch Write endCode to a per-tag response code\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* feat(plc4j/slmp): implement Batch Write onWrite path\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* refactor(plc4j/slmp): generalize single-frame ceiling wording for batch Read/Write\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* test(plc4j/slmp): end-to-end Batch Write driver-testsuite case\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/slmp): declare write capability in SlmpDriver\n\nSlmpDriver overrode canRead() but not canWrite(), so it inherited\nDriverBase.canWrite() -\u003e false, unlike every other writeable driver\n(S7, Modbus, ADS, EIP). Now that Batch Write (command 0x1401) is\nsupported, override canWrite() to return true. Adds SlmpDriverTest\nasserting the driver reports both canRead()\u003d\u003dtrue and canWrite()\u003d\u003dtrue,\nmirroring the reflection idiom in S7DriverTest/AdsPlcDriverTest.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* docs(plc4j/slmp): drop stale read-only wording now that Batch Write is supported\n\nThe mspec \u0027Scope of this initial version\u0027 comment still described the\nprotocol as read-only even though it lists Batch Write (command 0x1401).\nRemove the contradictory \u0027read-only\u0027 from the scope sentence and soften\nthe \u0027read-only road-map\u0027 phrase in the device-code comment to \u0027initial\nroad-map\u0027. Comment-only edits; generated sources are unchanged.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* docs(plc4j/slmp): drop stale read-only wording from the driver POM description\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* docs(plc4j/slmp): correct SH-080008 section references against the manual\n\nVerified the citations against SH(NA)-080008 (ed. AB): device access is\nchapter 8, where section 8.1 is \"Data to be Specified\" (devices, device code\nlist, points), section 8.2 is \"Batch Read and Write\" (batch read 0x0401 AND\nbatch write 0x1401), 8.3 Random, 8.4 Multiple Blocks. The header\u0027s \"Batch Read\ndata layout ... section 8.1\" was inaccurate (batch read/write is 8.2, not 8.1);\nmerge it with Batch Write under 8.2 and point the command list at chapter 7.\n\nAlso fix the same 8.1 mislabel on the batch-read worked example in\nParserSerializerTestsuite.xml and SlmpRequestBuildTest, and quote the full\n8.2 section title (\"Batch Read and Write\") in the SlmpWriteRequest comment.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* refactor(plc4j/slmp): address review feedback\n\n- encode(): an un-coercible PlcValue (PlcIncompatibleDatatypeException) is an\n  expected caller error that maps to INVALID_DATA -- log it at DEBUG without a\n  stack trace instead of WARN; genuine buffer/encoding failures keep the WARN.\n- SlmpDriverTest: drop the reflection -- the test shares the driver\u0027s package,\n  so the protected canRead()/canWrite() are directly accessible.\n- SlmpTag: normalize the ceiling wording to \"Batch Read/Write\".\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/slmp): echo builder error items instead of NPE-masking them as INTERNAL_ERROR\n\nThe request builders store a DefaultPlcTagErrorItem (INVALID_ADDRESS for an\nunparseable address, INVALID_DATA for an un-coercible value) instead of\nthrowing; for such a tag getTag()/getPlcValue() return null. onWrite cast the\nnull and NPEd in writeSingleTag, so the per-tag aggregation reported\nINTERNAL_ERROR and masked the correct code. onRead had the same pre-existing\nflaw for INVALID_ADDRESS and is fixed symmetrically.\n\nBoth loops now check request.getTagResponseCode(tagName) first (the pattern\nSimulatedConnection.onWrite established) and echo a non-OK code straight into\nthe response without sending anything for that tag.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/slmp): reject unexpected payload on write success; document timed-out-write semantics\n\nPer SH-080008 a Batch Write success response carries no data, so a zero\nendCode with a non-empty payload is the signature of a mis-attributed\nresponse (e.g. a late read answer arriving after its own request timed out;\n3E has no correlation id). mapWriteTag now takes the response payload, warns\nand maps that combination to REMOTE_ERROR instead of a false OK.\n\nAlso generalizes the sendRequest javadoc caveat from reads to all requests\nand spells out that a timed-out write may still have been applied by the\ndevice (so retrying on REMOTE_ERROR may double-apply), renames the driver\ntestsuite to \u0027SLMP 3E Batch Read/Write\u0027 now that it covers writes, and\nupdates the stale mspec scope comment: the typed value codec and tag layer\nare owned by the driver layer by design, not \u0027not built yet\u0027 (comment-only,\nno generated-source changes).\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n---------\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e"
    },
    {
      "commit": "361e32201df3c1ea00b0604b7f358d334d479a14",
      "tree": "96758bbdd544431ac801eec687d43d9aa1850c07",
      "parents": [
        "69f65244fa33bbfa4cbf90873166aed6c9a33713"
      ],
      "author": {
        "name": "LivingLikeKrillin",
        "email": "143606756+LivingLikeKrillin@users.noreply.github.com",
        "time": "Tue Jul 21 18:51:14 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 11:51:14 2026 +0200"
      },
      "message": "perf(plc4j/spi/buffers): speed up byte-aligned integer read/write (#2650)\n\n* perf(plc4j/spi/buffers): speed up byte-aligned integer read/write\n\nThe byte buffers sit on every driver\u0027s hottest path (every primitive\nfield of every message). Measured with JMH on a 32x uint16 batch (JDK 21):\n~6x faster reads, ~5.6x faster writes, ~38% less allocation, with all 775\nbuffer tests (incl. fuzz) and the Modbus parser/serializer suite green.\n\n- AbstractBuffer: use ArrayDeque for the option-context stack instead of\n  java.util.Stack (a synchronized Vector). A buffer is a single-threaded,\n  per-message scratch object -- positionInBits and the backing array are\n  already unsynchronized -- so the monitor enter/exit on every getContext()\n  guarded nothing. (Changing the protected context field type is\n  binary-incompatible for subclasses that read it directly; all in-repo\n  buffer modules recompile.)\n- ByteOrderBigEndian: expose a shared stateless INSTANCE and return it from\n  getByteOrder() instead of allocating one per field.\n- Read/WriteBufferByteBased: add a zero-allocation fast path for whole-byte,\n  byte-aligned, big-endian, plain-binary integer fields (unsigned and signed\n  short/int/long) that reads/writes straight from the backing array. Gated\n  on the concrete EncodingUnsignedBinary / EncodingTwosComplement (not the\n  broader EncodingDefault) so BCD/float/etc. fall through to the slow path\n  unchanged; covered by new regression tests.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/spi/buffers): correct byte alignment for non-byte-aligned sub-buffers\n\nisAligned() (used by the whole-byte arraycopy fast paths in readBits/writeBits, and\nnow by the integer fast-path guards) tested only positionInBits, ignoring startBit.\nA sub-buffer created at a non-byte-aligned offset has a non-zero startBit while its\nown positionInBits is 0, so a whole-byte read/write took the byte-copy fast path and\nindexed the backing array by (startBit + positionInBits) / 8 -- truncating the sub-byte\noffset and reading/writing from the wrong byte. Test it on the absolute bit index.\n\nAlso gate the integer fast-path guards on isAligned() (absolute) instead of\npositionInBits alone, and use `getByteOrder() instanceof ByteOrderBigEndian` instead\nof reference-equality with the singleton, so an explicitly big-endian-configured buffer\n(ServiceLoader instance) is still eligible for the fast path.\n\nAdds a regression test: a whole-byte unsigned read from a non-byte-aligned sub-buffer\nnow returns the correct value.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* perf(plc4j/spi/buffers): resolve encoding/byte order once per integer field\n\nThe fast-path eligibility guards resolved the encoding and byte order, and\nwhen the fast path was not taken (e.g. a little-endian buffer or a non-binary\nencoding) the slow path resolved both again -- an extra context/manager lookup\nper whole-byte aligned integer field. Resolve them once in each read/write\nmethod and reuse the resolved values for both the eligibility check and the\nslow path. The BE-specific guards collapse into a single structural\nisByteAlignedWholeBytes check combined with instanceof tests on the already\nresolved values. (EncodingRaw paths now resolve the byte order they do not\nuse -- a negligible constant -- in exchange for exactly-once resolution\neverywhere else.)\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/spi/buffers): honour startBit in writeBit; gate the fast path on exact codec classes\n\nTwo hardening items in the same alignment/fast-path family as the previous\ncommits:\n\n- writeBit indexed the backing array by positionInBits alone, ignoring\n  startBit -- unlike readBit and the whole-byte arraycopy path in writeBits,\n  which both use the absolute bit index. A WriteBufferByteBased constructed\n  with a non-zero startBit therefore wrote from the start of the backing\n  array. Index by (startBit + positionInBits), mirroring readBit, with a\n  regression test (writeHonoursNonByteAlignedStartBit).\n\n- The integer fast-path gates checked `instanceof EncodingUnsignedBinary` /\n  `EncodingTwosComplement` / `ByteOrderBigEndian`. The slow path dispatches\n  virtually, so a subclass registered through the Encoding/ByteOrder managers\n  with overridden codec behaviour would have been silently bypassed whenever\n  a field was byte-aligned. Gate on the exact class (getClass() \u003d\u003d ...)\n  instead: multiple instances remain eligible, subclasses fall through to the\n  virtual-dispatch slow path.\n\nAlso document that writeAlignedBytesBE relies on the caller\u0027s\nensureAvailable(numBits) (it has no internal capacity check), and drop the\ndead value mask in writeUnsignedShort\u0027s fast path (the range check already\nguarantees a non-negative value, and the mask was inconsistent with the\nother five write sites).\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n---------\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e"
    },
    {
      "commit": "69f65244fa33bbfa4cbf90873166aed6c9a33713",
      "tree": "b09b038915a126f6cf42fd2f0dae0e9f593c3f94",
      "parents": [
        "99a0299d6ab2674f25271a1cc92972f6c7d5db22"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 20 13:58:10 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 20 13:58:10 2026 +0200"
      },
      "message": "fix(plc4go): defaultCodec.Connect started workers before running\u003dtrue - worker could die at startup\n\nA worker goroutine that got scheduled between startWorkers() and\nrunning.Store(true) observed running\u003d\u003dfalse twice - in its mainLoop\ncondition and in its restart defer - and terminated permanently while\nConnect still returned success. A codec without its expire worker never\ntimes out expectations, so SendRequest callers waiting on handleError\nhang forever. This is what intermittently wedged\nTestReader_sendMessageOverTheWire (internal/cbus) under -race: the\ntimeout dump shows a live ReceiveWork but no ExpireWork goroutine.\n\nStore running\u003dtrue before starting the workers; the goroutine-creation\nhappens-before edge then guarantees both workers observe true.\n\nFalsification test probes worker liveness after Connect via a blocking\nsend on the unbuffered notify channels (received iff a worker sits in\nits select). Verified RED first: expire worker died within ~5 of 1000\niterations pre-fix; 5000 iterations green post-fix, and the cbus test\nsurvives 30 -race iterations (previously hung within 10).\n"
    },
    {
      "commit": "99a0299d6ab2674f25271a1cc92972f6c7d5db22",
      "tree": "d5725f7f37c8031aa315d0d9ad96a5af03321347",
      "parents": [
        "529811d7676a265b1336365a3d1f731f656f2918"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 20 13:28:43 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 20 13:28:43 2026 +0200"
      },
      "message": "test(plc4go): fix three -race flakes in spi test hygiene\n\n- spi/default: Test_defaultCodec_Connect built the codec by hand without\n  ctx/ctxCancel - the expire/receive workers panic on the nil-ctx select,\n  and teardown joined wg instead of activeWorker, so the recover path\n  logged through the finished test\u0027s logger (log-after-test panic, then\n  SIGSEGV of the test binary). Give the codec a real ctx and join both\n  worker groups in t.Cleanup.\n- spi/transactions: Test_requestTransaction_AwaitCompletion appended to\n  runningRequests under workLogMutex.RLock - wrong mutex, and a read\n  lock for a write. Use runningRequestMutex.Lock like production code.\n- spi/utils: TestStopWarn\u0027s logHook mutated its slices concurrently from\n  the StopWarn ticker goroutine and the test goroutine\u0027s deferred stop\n  (which logs before joining). Guard Run with a mutex.\n\nAll three reproduced reliably with go test -race -count\u003e\u003d20 and are green\nfor 50-500 iterations after the fix.\n"
    },
    {
      "commit": "529811d7676a265b1336365a3d1f731f656f2918",
      "tree": "0057cdcc89147e36881a33a189c7792e7a182d5b",
      "parents": [
        "b77805187ac9bc8dfdfd5c57a38d35ca118cec45"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 20 11:28:11 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 20 11:28:11 2026 +0200"
      },
      "message": "fix(plc4go): TCP Write() armed a READ deadline (copy-paste) - write unbounded, sticky deadline broke late replies\n\nTransportInstance.Write set tcpConn.SetReadDeadline from the caller\u0027s\ncontext deadline (copied from the read path), so the write itself was\nnever bounded - a peer that stops draining the connection blocked\nWrite() past any context deadline - and the read deadline stuck to the\nconnection forever: once expired, every socket read failed instantly\nwith i/o timeout, so a reply arriving after the request deadline sat\nunread in the kernel buffer until the NEXT write re-armed a fresh\ndeadline. The SetReadDeadline METHOD additionally called\ntcpConn.SetDeadline, arming BOTH directions - an (expired) read\ndeadline made writes fail too.\n\nThe accidental sticky read deadline was also the only thing unblocking\nthe receive worker\u0027s bare Peek(1) polls (DefaultCodec drives Receive\nwith a deadline-less long-lived context), so it cannot simply be\ndropped: without a bound, one Receive goroutine per receiveTimeout\ncycle piles up on a silent connection, and they race on the shared\nbufio.Reader once data finally arrives.\n\nFix, mirroring the serial transport:\n- Write arms SetWriteDeadline from the context deadline (and clears a\n  leftover one when the context carries no deadline - an expired armed\n  deadline would fail later unbounded writes instantly).\n- A tcp deadlineReader (port of serial\u0027s) feeds the bufio.Reader:\n  an explicit per-operation deadline wins and auto-clears once observed\n  expired; otherwise a 1s fallback keeps deadline-less polls bounded\n  (retryable timeout, not fatal, for the codecs\u0027 error classification).\n- The SetReadDeadline method routes to the deadlineReader instead of\n  arming conn-wide SetDeadline.\n\nNew falsification tests (all fail against the old code): late reply\nafter write-deadline expiry must be readable, write must honor its\ncontext deadline against a non-draining peer, a read deadline must not\nbound writes, an expired write deadline must not stick, and bare polls\nmust be fallback-bounded. deadlineReader unit tests ported from serial.\n"
    },
    {
      "commit": "b77805187ac9bc8dfdfd5c57a38d35ca118cec45",
      "tree": "5d7da41dc1b3e93dce361959d95c6c8640e4a061",
      "parents": [
        "9dafc70746966e10654663776c607b586ee4faf4"
      ],
      "author": {
        "name": "Gerd Aschemann",
        "email": "github@aschemann.net",
        "time": "Mon Jul 20 08:54:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 08:54:05 2026 +0200"
      },
      "message": "chore(build): Enable consumer POM flattening for Maven 4 RC-6 readiness (#2647)\n\nSince apache/maven#11780 (first shipping with 4.0.0-rc-6), installing or\ndeploying a POM-packaged project whose model cannot be downgraded to\n4.0.0 fails fast. The PLC4X parent uses 4.1.0-only features (subprojects,\nbuild sources), so every \u0027mvn install\u0027 will break on RC-6 without\nmaven.consumer.pom.flatten\u003dtrue.\n\nWith flattening enabled, jar module consumer POMs become self-contained\nmodel-4.0.0 (no parent reference), which also fixes Maven 3/Gradle\nconsumption of published artifacts (apache/maven#11772). Verified with\n4.0.0-rc-5 (current wrapper pin) and a current 4.0.0-SNAPSHOT: full\nreactor builds green with both.\n\nCo-authored-by: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "9dafc70746966e10654663776c607b586ee4faf4",
      "tree": "5f204b799f943b939dc3346e01f561828471a792",
      "parents": [
        "c48edd34a8317d8e211f7c00f1feaf28d3a6c9e2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 20 08:52:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 08:52:27 2026 +0200"
      },
      "message": "build(deps): bump actions/setup-python from 6 to 7 (#2648)\n\nBumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-version: \u00277\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": "c48edd34a8317d8e211f7c00f1feaf28d3a6c9e2",
      "tree": "41e2547145bba67b38426e2547588ae619494560",
      "parents": [
        "6a72ab50231d5579b3d727335a4806deaa364197"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 20 08:52:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 08:52:17 2026 +0200"
      },
      "message": "build(deps): bump org.json:json from 20260522 to 20260719 (#2649)\n\nBumps [org.json:json](https://github.com/douglascrockford/JSON-java) from 20260522 to 20260719.\n- [Release notes](https://github.com/douglascrockford/JSON-java/releases)\n- [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md)\n- [Commits](https://github.com/douglascrockford/JSON-java/compare/20260522...20260719)\n\n---\nupdated-dependencies:\n- dependency-name: org.json:json\n  dependency-version: \u002720260719\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": "6a72ab50231d5579b3d727335a4806deaa364197",
      "tree": "4f2fd6deeee886998bb3232413a9952a72c6b8f8",
      "parents": [
        "45f56667258ffb6bc9910de5f982741524da4168"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 18:11:49 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 18:11:49 2026 +0200"
      },
      "message": "fix: Added a missing Apache header (wonder why it didn\u0027t report this locally)\n"
    },
    {
      "commit": "45f56667258ffb6bc9910de5f982741524da4168",
      "tree": "51b8f14e43b0098fa4c8c550396cfc2f10d12b18",
      "parents": [
        "12b0cb979e53818ac07e9546f8cdfda975f11e4e"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 17:25:21 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 17:25:21 2026 +0200"
      },
      "message": "fix: Removed an unneeded parameter (which I first thought was useful and forgot to remove)\n"
    },
    {
      "commit": "12b0cb979e53818ac07e9546f8cdfda975f11e4e",
      "tree": "8d2cc8c8a787ef7df474981678c3d4781254b694",
      "parents": [
        "7b58f2f631ea161422c2a358992895e8bd4f4027"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 17:23:16 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 17:23:16 2026 +0200"
      },
      "message": "fix: Removed an unneeded parameter (which I first thought was useful and forgot to remove)\n"
    },
    {
      "commit": "7b58f2f631ea161422c2a358992895e8bd4f4027",
      "tree": "04595901cec3d1665537e29216aa204f67799984",
      "parents": [
        "2c5680ef03ee74da9b252bca4f0b7e33c9776381"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 16:46:33 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 16:46:33 2026 +0200"
      },
      "message": "chore: Updated the pom to maven 4\n"
    },
    {
      "commit": "2c5680ef03ee74da9b252bca4f0b7e33c9776381",
      "tree": "69f0ab2a3b453f87ab2771b436db0965cd9f930e",
      "parents": [
        "c5860b198b1e82554a7ba23cb550dc887258d712"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 16:45:51 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 16:45:51 2026 +0200"
      },
      "message": "feat: Added base classes for a subscription-eumulation layer.\n"
    },
    {
      "commit": "c5860b198b1e82554a7ba23cb550dc887258d712",
      "tree": "9eca68985b271652ef90129e3147600afc82e2bc",
      "parents": [
        "83023b00006470ad006af82540f0d2c2c478d19a"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 15:45:07 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 15:45:07 2026 +0200"
      },
      "message": "chore: Cleaned up the no longer needed pcap-shared module\n"
    },
    {
      "commit": "83023b00006470ad006af82540f0d2c2c478d19a",
      "tree": "6a6c6dca7d3b48c31fd6f32887f12bc48c77f743",
      "parents": [
        "e155c1ade31404ca6fae5536110376595bbe1d94"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 15:44:47 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 15:44:47 2026 +0200"
      },
      "message": "feat: Implemented a new component for fetching data from remote PLCs (replacement for the scraper)\n"
    },
    {
      "commit": "e155c1ade31404ca6fae5536110376595bbe1d94",
      "tree": "b21c4651c56611fa453aeb1569f516a61f1129b9",
      "parents": [
        "40c42672489d8e89eafd089d2e9f3d14ad5f6b84"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 15:44:01 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Thu Jul 16 15:44:09 2026 +0200"
      },
      "message": "chore: Updated the BACnet Vendor IDs\n"
    },
    {
      "commit": "40c42672489d8e89eafd089d2e9f3d14ad5f6b84",
      "tree": "bd29e4aac0d03518e395a175df955c6215863f28",
      "parents": [
        "29b335726bf06c7d608a1bc4bb499e9575210edd"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 16 08:49:28 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 16 08:57:28 2026 +0200"
      },
      "message": "fix(plc4go): make TCP TransportInstance.Reset a no-op (raced the receive worker, could desync stream framing)\n\nSame defect class as the UDP transport fix: Reset() poked the read\ndeadline, drained one socket read into a discard buffer, and swapped\nm.reader - unsynchronized, and invoked from outside the receive worker\n(connection-cache lease grants, DefaultCodec retryable-error handling)\nwhile the worker concurrently drives Peek/Read on the same conn and\nreader. On a stream the damage is worse than on datagrams: the drain can\nconsume a fresh reply, and discarding bytes the reader had already\nbuffered desyncs the protocol framing for everything that follows. The\nswap also silently shrank the reader from the 100k buffer Connect\ncreates to bufio\u0027s 4k default.\n\nSerial\u0027s Reset was already a no-op; TCP now matches UDP and serial.\nStale complete frames from abandoned exchanges are handled by the\ncodec\u0027s response matching, and reconnection semantics live in\nClose/Connect.\n\nNew tests: a deterministic buffered-frame-survives-Reset check and a\nworker-vs-Reset storm that fails under -race against the old code.\nFull modbus/eip/s7/cbus/ads/codec/cache suites green under -race.\n"
    },
    {
      "commit": "29b335726bf06c7d608a1bc4bb499e9575210edd",
      "tree": "b2c3203ea35026b5772d9388ffd0436bd6808480",
      "parents": [
        "80241491a629e07a4ea5ef3be3adc20d1acdc44c"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 22:41:06 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 22:41:06 2026 +0200"
      },
      "message": "chore: Cleaning up in the maven and maven-wrapper settings.\n"
    },
    {
      "commit": "80241491a629e07a4ea5ef3be3adc20d1acdc44c",
      "tree": "7711e6b6bf808775e7459db618fb569dbbba1e71",
      "parents": [
        "5238b33c611e751f0e50e02f83a8db001fdfe282"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 21:28:13 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 21:28:13 2026 +0200"
      },
      "message": "doc: Updated the title of the RELEASE_NOTES section from 0.14.0 to 1.0.0\n"
    },
    {
      "commit": "5238b33c611e751f0e50e02f83a8db001fdfe282",
      "tree": "fd4a36cf34eeb38ccc855f4008ae79c690271ee5",
      "parents": [
        "162260187a33a319fc6123fd46581bf0b6dccaa7"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 14:55:15 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 14:55:15 2026 +0200"
      },
      "message": "fix(plc4go): make UDP TransportInstance.Reset a no-op (lease-time Reset raced the receive worker and ate inbound datagrams)\n\nReset() poked the read deadline, drained one datagram into a discard\nbuffer, and swapped m.reader - all unsynchronized, and all invoked from\noutside the receive worker: the connection cache runs Reset on every\nsuccessful lease, and DefaultCodec runs it on retryable errors. The\nreceive worker concurrently drives GetNumBytesAvailableInBuffer/Peek on\nthe same socket and bufio.Reader, so the drain could eat a fresh\ndatagram off the socket and the reader swap could throw away bytes the\nworker had just buffered.\n\nField evidence (BACnet): a WriteProperty SimpleAck reached the host\ninterface with a good checksum 0.8ms after the request, was never\nsurfaced by the codec, and the write hung until its expectation\nexpired. The new roundtrip tests reproduce the exact production shape -\na no-TTL connection cache re-leasing the same live connection (Reset on\na live socket under an active 10ms receive poll) - and fail under\n-race against the old Reset.\n\nFor UDP nothing needs resetting: datagram framing means stale buffered\ndata is just a complete late reply, which expectation matching already\ndrops. Reconnection semantics stay in Close/Connect. The TCP transport\nhas the same unlocked pattern but stream framing makes a plain no-op\nwrong there; that remains open.\n"
    },
    {
      "commit": "162260187a33a319fc6123fd46581bf0b6dccaa7",
      "tree": "7061a61455859f4ab8eb7a520cd43a5da1e54d93",
      "parents": [
        "3ca6dd935d265dd949a182d603cced97923db343"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 13:57:43 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 13:57:43 2026 +0200"
      },
      "message": "feat(plc4go): exempt subscription-carrying connections from cache idle TTL\n\nWithMaxIdleTime reaps connections that sat idle in the cache past the\nconfigured age. For connections carrying stateful subscriptions (BACnet\nCOV: server-side registrations plus client-side lifetime/2 refresh\ntimers) a reap silently destroys that state - passive updates stop until\nthe client happens to re-subscribe, which may be hours away.\n\nThe cache now consults an optional capability interface\n(ActiveSubscriptionCount) before declaring an idle connection expired:\nconnections reporting active subscription handles are kept regardless of\nage. The BACnet connection implements the capability by summing live\nhandles across its subscribers (newly mutex-guarded, as the cache calls\nin from outside the connect path). Drivers without the capability keep\nthe existing TTL behavior unchanged.\n"
    },
    {
      "commit": "3ca6dd935d265dd949a182d603cced97923db343",
      "tree": "cf5fc9646f2fc04d4c183b716a21612cbc628e2f",
      "parents": [
        "2a7d7f2cfdd53ca6ed488a7466a05aff350a5b1d"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 12:27:55 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 12:27:55 2026 +0200"
      },
      "message": "fix(website): install driver modules before building the site\n\nSince the Maven 4 migration the site build fails on the clean\ngit-websites node: Maven 4 no longer resolves modules of the current\nproject from remote repositories when they are excluded from the\nreactor via -pl, so all plc4j driver snapshots came up \u0027(absent)\u0027.\n\nBuild and install the driver modules (and their upstream modules)\nfirst, skipping tests, coverage, rat, javadoc and sources for speed,\nso the two existing site invocations can resolve them again.\n"
    },
    {
      "commit": "2a7d7f2cfdd53ca6ed488a7466a05aff350a5b1d",
      "tree": "f0b0d2e7c0a1a6ce4ada7a8af9d0ed64f6836c39",
      "parents": [
        "01593f3aa9ca90c8581a29eef6f31f502cf335d4"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 10:16:19 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 10:16:19 2026 +0200"
      },
      "message": "fix: Fixed the issue in the site-generation build\n"
    },
    {
      "commit": "01593f3aa9ca90c8581a29eef6f31f502cf335d4",
      "tree": "aa2f51b06fe720fd0d38eca5852ba6752f746f7a",
      "parents": [
        "369c946d018b1ae7165e0474342bbf03da18b124"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 10:09:58 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 10:10:07 2026 +0200"
      },
      "message": "chore: Removed the old code-gen and renamed the new one to replace the old.\n"
    },
    {
      "commit": "369c946d018b1ae7165e0474342bbf03da18b124",
      "tree": "191c986484683fde8a4a3ccfa654b5d9c1b71eb4",
      "parents": [
        "04527e01c3aa1845d6a47d2d84527f819cf47e5c"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 09:50:24 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 09:51:57 2026 +0200"
      },
      "message": "fix(plc4go): adopt DeliverResult in the remaining drivers\n\nFollow-up to 18ce26d7f9: converts the API-facing request/result channel\nsends in ads, cbus, eip, knxnetip, opcua and s7 (readers, writers,\nsubscribers, ads browser) to utils.DeliverResult. All these channels\nhave capacity 1 and a consumer that reads at most one result, so a\nsurplus send - late timeout handler, duplicate error-handler\ninvocation, abandoned caller - blocked its goroutine forever and, via\nthe codec WaitGroup, wedged Disconnect.\n\nNotes:\n - knxnetip\u0027s ConnectionDriverSpecificOperations already delivered\n   non-blocking through its sendResponse select/default helper and is\n   left untouched.\n - The knxnetip Writer had no logger; it now takes the usual options\n   and gets the connection\u0027s logger for the drop warning.\n - s7 Writer struct-literal results were normalized to the\n   NewDefaultPlcWriteRequestResult constructor.\n - Connection-internal handshake channels (eip/s7/cbus Connection,\n   knxnetip ConnectionInternalOperations, opcua SecureChannel and the\n   deliberately oversized opcua subscribe channels) are out of scope:\n   their consumers are driver-internal with bounded waits.\n"
    },
    {
      "commit": "04527e01c3aa1845d6a47d2d84527f819cf47e5c",
      "tree": "cc4274843ea96f8fb85131e1593b6a99da107460",
      "parents": [
        "d6bb8ba31ba932ab13cf9444b7a5dd66fac7e570"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 09:16:44 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Wed Jul 15 09:51:56 2026 +0200"
      },
      "message": "fix(plc4go): never block result delivery to abandoned request channels\n\nDrivers hand results to the caller over a channel with capacity 1 whose\nconsumer reads at most one result - and a caller whose context expired\nreads none. Any surplus send therefore blocks its goroutine forever once\nthe buffer slot is taken. Field goroutine dumps (gateway stuck for days)\nshow exactly this chain on modbus:\n\n 1. the poll caller times out and abandons the result channel\n 2. SendRequest fails against the dead device; the send-error result\n    fills the single buffer slot\n 3. the expectation registered by SendRequest is left behind and fires\n    its error handler on timeout 60s later - that second send blocks\n    forever, pinned in the codec\u0027s WaitGroup (378 accumulated)\n 4. connection close -\u003e defaultCodec.Disconnect -\u003e wg.Wait() hangs\n    indefinitely, wedging the caller\u0027s shutdown/restart path\n\nFixes, each sufficient on its own for the observed chain:\n\n - spi/default: SendRequest removes its expectation again when Send\n   fails; the caller already got the error directly, a later timeout\n   would double-fire the error handler for the same request.\n - spi/utils: new DeliverResult helper that drops a result (with a\n   warning) instead of blocking when the channel is full and abandoned.\n - modbus, bacnetip: deliver all read/write/subscribe results through\n   DeliverResult. The modbus Writer additionally delivers the send\n   error as a result instead of only logging it - callers without\n   their own deadline otherwise wait forever.\n\nThe remaining drivers (ads, cbus, eip, knxnetip, opcua, s7) share the\nsame hand-rolled pattern and should adopt DeliverResult in a follow-up.\n"
    },
    {
      "commit": "d6bb8ba31ba932ab13cf9444b7a5dd66fac7e570",
      "tree": "05fd9bf4c33da2009511327110fd8f36fbd2a2bf",
      "parents": [
        "20f08cc25315487832ffabb38678a15eb0cbaf40"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 00:36:56 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 15 00:36:56 2026 +0200"
      },
      "message": "chore: After 10000 commits and allmost 9 years, the Apache PLC4X project decided it\u0027s time for finally aiming for a 1.0.0 release ... so let\u0027s celebrate this big step :-)\n\n This commit is highly approved by Toddy\n"
    },
    {
      "commit": "20f08cc25315487832ffabb38678a15eb0cbaf40",
      "tree": "c8da2a09c3292784e4a123902c633bab5e3e7bec",
      "parents": [
        "80958c9add638a44e56f86eae492f417d09ebff0"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 23:48:47 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 23:48:47 2026 +0200"
      },
      "message": "feat(plc4j/opcua): Implemented initial support for reading and writing structs in OPC-UA.\n"
    },
    {
      "commit": "80958c9add638a44e56f86eae492f417d09ebff0",
      "tree": "87ecea5e0eb3814196c6f9654b571cab12a6f97a",
      "parents": [
        "d221862ef0635bb23c6b6811944252e2a4bf1f21"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 20:11:12 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 20:11:12 2026 +0200"
      },
      "message": "fix: Added a missing dependency.\n"
    },
    {
      "commit": "d221862ef0635bb23c6b6811944252e2a4bf1f21",
      "tree": "eae2a753bd3c63c903825042886a9ac6215932e7",
      "parents": [
        "f8fcee41bead38f4f19f894027e1fe59ebda8a53"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 19:25:34 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 19:25:34 2026 +0200"
      },
      "message": "feat: Implemented correct array handling in OPC-UA also added a lot of new namespace tests.\n"
    },
    {
      "commit": "f8fcee41bead38f4f19f894027e1fe59ebda8a53",
      "tree": "8b39c054f2e6e47ab3de66843da400cfee9cc2fe",
      "parents": [
        "7b90aefae71d522636cbfc94d486bb2ba747016b"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 17:07:09 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 17:07:09 2026 +0200"
      },
      "message": "doc: Updated the driver partials and updated the slmp to use the newly generated partial.\n"
    },
    {
      "commit": "7b90aefae71d522636cbfc94d486bb2ba747016b",
      "tree": "c72a4fe50bb8bf3bcaadfa2f6699a0679b040e37",
      "parents": [
        "24daaca625e85d7df4cf6d28d27918f42c2b5397"
      ],
      "author": {
        "name": "LivingLikeKrillin",
        "email": "143606756+LivingLikeKrillin@users.noreply.github.com",
        "time": "Tue Jul 14 23:43:53 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 16:43:53 2026 +0200"
      },
      "message": "feat(plc4j/slmp): add read-only SLMP (MELSEC 3E) driver (#2640)\n\n* feat(plc4j/slmp): scaffold read-only driver module, generate 3E classes\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* feat(plc4j/slmp): add SlmpDataType word-unit value decoding\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* feat(plc4j/slmp): add SlmpTag address parsing and tag handler\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* feat(plc4j/slmp): add driver and tcp transport configuration\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* feat(plc4j/slmp): add 3E TCP message codec and request-build test\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* feat(plc4j/slmp): add connection, driver and response mapping\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* test(plc4j/slmp): add end-to-end DriverTestsuite and merge IT coverage\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* refactor(plc4j/slmp): clarify timeout/correlation semantics, tidy logs\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* test(plc4j/slmp): run ParserSerializerTestsuite, fix enum XML form\n\nAdd SlmpParserSerializerTest (extends ParserSerializerTestsuiteRunner) so the\n3E frame reference vectors in ParserSerializerTestsuite.xml are actually\nexercised instead of sitting unused, and wire in the protocols-slmp test-jar\nso the testsuite resource is on the driver test classpath.\n\nCorrect the deviceCode enum fields in the testsuite from the shorthand\n\u003cdeviceCode\u003eD\u003c/deviceCode\u003e to the canonical \u003cSlmpDeviceCode .../\u003e element form\nso the vectors round-trip through parse/serialize.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* chore(plc4j/slmp): integrate driver into project conventions\n\n- Add SLMP protocol documentation page to the website and nav\n- Add release-notes entry for the new driver\n- Register the driver in the plc4j-driver-all bundle\n- Migrate the module POM to the Maven 4.1.0 model used repo-wide\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/slmp): surface per-tag failures, don\u0027t fail the whole read\n\nCompletableFuture.allOf completes exceptionally when any tag future\nfails, and thenApply never runs on exceptional completion - so the\nper-tag error mapping (timeout -\u003e REMOTE_ERROR, anything else -\u003e\nINTERNAL_ERROR) was unreachable and a single failed tag failed the\nentire read request, contrary to the documented partial-failure\nisolation. Assemble the response in handle() instead.\n\nAdd SlmpConnectionFailurePathTest (modeled on\nModbusRtuConnectionRequestChainTest) covering timeout isolation,\ntransport loss, send failure and unsolicited frames.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* test(plc4j/slmp): cover the documented 0x-prefixed address form\n\nThe docs advertise W0x1A:WORD[10]; the 0x prefix, datatype and quantity\nwere each tested separately but never combined in one address.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* docs(plc4j/slmp): add SLMP to the protocol feature-matrix tables\n\nLanguage table: Java marked work-in-progress (read-only v0).\nFeature table: read single/multiple green, everything else red.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* docs(plc4j/slmp): describe the 960-word cap as a conservative ceiling\n\nAlign the website wording with the code comment: 960 is this driver\u0027s\nconservative per-request ceiling, not asserted as the device maximum.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/slmp): clear timed-out correlation slot only if still owned\n\nThe timeout cleanup ran pendingResponse \u003d null unconditionally on the\ndelayer thread. CompletableFuture dependents complete LIFO, so the\nthrottle releases the next request before that cleanup runs; in that\nwindow the successor installs its own slot, which the cleanup then\nwiped - dropping the successor\u0027s genuine response as unsolicited and\nspuriously timing it out as well. Hold the slot in an AtomicReference\nand compare-and-clear against the owning future; claims in\nhandleIncomingMessage/failPending use getAndSet.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* chore(plc4j/slmp): tidy import order, javadoc wording and late-drop log\n\n- order the AtomicReference import per ASCII convention\n- state the LIFO dependent ordering as OpenJDK behavior, and note the\n  compare-and-clear is correct regardless of it\n- log when a late response is dropped against an already-completed\n  request, matching the unsolicited-frame log\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/slmp): validate quantity, monitoring-timer and request-timeout inputs\n\nHarden three edge inputs surfaced by review, so bad values fail with a\nclear, typed error instead of a raw exception or silent wire corruption:\n\n- SlmpTag: wrap the quantity parse in try/catch so a value past\n  Integer.MAX_VALUE (e.g. D0:WORD[999999999999]) raises\n  PlcInvalidTagException, consistent with the device-number parse in the\n  same method, rather than a raw NumberFormatException.\n- SlmpConnection: validate config at connect time. monitoring-timer is\n  serialized as an unsigned 16-bit 3E field, so reject values outside\n  [0, 65535] before they can be truncated on the wire; request-timeout\n  feeds CompletableFuture.orTimeout, so reject non-positive values that\n  would time out every request immediately. Validation lives in onConnect\n  because the configuration is populated by direct field injection, which\n  bypasses the setters.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(plc4j/slmp): validate device-number range and point-count overflow\n\nTwo parse-time guards in SlmpTag.of(), matching the existing\nfail-with-PlcInvalidTagException-at-parse philosophy rather than\nleaking a low-level serialization error later:\n\n- Device numbers are a 24-bit unsigned field in the 3E frame; values\n  above 0xFFFFFF (e.g. D16777216) now raise PlcInvalidTagException\n  instead of failing during serialization with a BufferException.\n- numberOfPoints is computed as (long) quantity * wordsPerElement so a\n  large int-range quantity (e.g. 2147483647 with a 2-word type) can no\n  longer overflow negative and slip past the MAX_POINTS ceiling.\n\nCovered by SlmpTagTest.rejectsDeviceNumberExceeding24Bit and\nrejectsQuantityWhoseWordCountOverflowsInt.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n---------\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e"
    },
    {
      "commit": "24daaca625e85d7df4cf6d28d27918f42c2b5397",
      "tree": "a006d023ab40a06ad5f2dd60070a1477a8f679ff",
      "parents": [
        "015924e6999857e693a676239cd029efd77bca37"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Jul 14 14:57:16 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Jul 14 14:58:24 2026 +0200"
      },
      "message": "test(plc4go): pin BACnet write SimpleAck handling across codec, driver, and UDP transport\n\nRegression tests from a ugagent write-hang investigation (three rounds) that\nexonerated plc4go at every layer:\n\n- WriteRoundtrip_test.go: codec-level — a wire-shaped SimpleAck (matching\n  invoke id + service choice) resolves WriteProperty Execute with OK; wrong\n  invoke id does not resolve; Error-PDU maps to ACCESS_DENIED.\n- IdleWriteRoundtrip_test.go: driver-level — writes resolve after idle gaps\n  and with delayed replies (cache idle-reconnect included).\n- DelayedReply_test.go: UDP transport — the per-poll receive deadline is\n  re-armed across arbitrary idle periods; delayed datagrams still reach the\n  codec.\n\nLeft for a future change (identified, not fixed here): TransportInstance\nReset() runs unlocked on every lease and can data-race the receive worker.\n"
    },
    {
      "commit": "015924e6999857e693a676239cd029efd77bca37",
      "tree": "86f7e0bccd74fdad04e1a6598aa393120dce63f6",
      "parents": [
        "5fbbea71a4f13caed56d5bba693cbcac35380754"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 14:25:28 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 14:25:28 2026 +0200"
      },
      "message": "chore: Updated the KNX Vendor IDs\n"
    },
    {
      "commit": "5fbbea71a4f13caed56d5bba693cbcac35380754",
      "tree": "f7ce772e868d1bf429833933a698c211ada0649f",
      "parents": [
        "955486e0fb42c858fc14aa9832e6533233fff300"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 14:25:20 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 14:25:20 2026 +0200"
      },
      "message": "feat: Extended the opc-ua driver to derive the types for simple type tags from the server model (Instead of guessing it based on the input data)\n"
    },
    {
      "commit": "955486e0fb42c858fc14aa9832e6533233fff300",
      "tree": "f6630b331bf57f7eaa266cf8bbe9392ef89cc585",
      "parents": [
        "8c0d7d914a93bb472c3bd655a88d9385c0419aaa"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 13:40:19 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 13:40:19 2026 +0200"
      },
      "message": "fix: Make the lease-time decision deterministic (purely idle-time based, plus the force flag)\n"
    },
    {
      "commit": "8c0d7d914a93bb472c3bd655a88d9385c0419aaa",
      "tree": "551b9421a70662f863c7cd303fea4efd682e93ec",
      "parents": [
        "f7bd21f7529a882499534f8a365c1623e160a6cf"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 12:01:37 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 12:01:37 2026 +0200"
      },
      "message": "fix: Hopefully hardened a flaky test.\n"
    },
    {
      "commit": "f7bd21f7529a882499534f8a365c1623e160a6cf",
      "tree": "9a2aa81228aa917bfbba69b2506012d3415b586a",
      "parents": [
        "d9899d21fabda1c92718541f86f95c652f052a7b"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 09:50:58 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 10:07:56 2026 +0200"
      },
      "message": "feat(plc4j): OPC-UA browse now resolves server-side types \u0026 access rights\n"
    },
    {
      "commit": "d9899d21fabda1c92718541f86f95c652f052a7b",
      "tree": "4099af95e5538651db2c4042e8d95677ed886b91",
      "parents": [
        "2631a7ccb65dc75911e306bd9be133e2a1f89750"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 09:54:54 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Tue Jul 14 09:54:54 2026 +0200"
      },
      "message": "fix: Fixed an error in the opc-ua testuite.\n"
    },
    {
      "commit": "2631a7ccb65dc75911e306bd9be133e2a1f89750",
      "tree": "336fa46c8f37e8cb6bdc4ce437e069b88f319a84",
      "parents": [
        "8cbd2740757cfb52af783139b81a2cd8fb1aa16e"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 13 16:33:18 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 13 16:33:18 2026 +0200"
      },
      "message": "feat: Added browse support for PLC4J OPC-UA\n"
    },
    {
      "commit": "8cbd2740757cfb52af783139b81a2cd8fb1aa16e",
      "tree": "e0b80f463f189783d3981ffcabdfe8509a1ae59b",
      "parents": [
        "e1cf24439cff146f9ed9f450ac963f6404f30e77"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 13 11:43:07 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 13 11:43:07 2026 +0200"
      },
      "message": "fix: Addressed two issues in the OPC-UA driver\n- Discovery + encrypted-policy hang\n- divide-by-zero on missing server cert issue\n"
    },
    {
      "commit": "e1cf24439cff146f9ed9f450ac963f6404f30e77",
      "tree": "fc7b289dc9afa006fa8a146c027550fbcf29059b",
      "parents": [
        "83dd291816f9218d4370da63781f489e3a69cd70"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 13 11:26:10 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Mon Jul 13 11:26:10 2026 +0200"
      },
      "message": "doc: Added information on S7-200 support from the PR and Issues on GitHub.\n"
    },
    {
      "commit": "83dd291816f9218d4370da63781f489e3a69cd70",
      "tree": "c6ffc9eb513731776e248733916fecb5d26b7c35",
      "parents": [
        "adfe11e4633db5f01ab4d016b61d68e10a952664"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 13 09:07:37 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 13 09:08:49 2026 +0200"
      },
      "message": "fix(plc4j): Migrated the OSGi TransportActivator to the new transports SPI.\n\nThe SPI rework moved Transport from org.apache.plc4x.java.spi.transport\n(old plc4j-spi jar, now a pom-only aggregator) to\norg.apache.plc4x.java.spi.transports.api in plc4j-transports-api,\nbreaking compilation of plc4j-osgi.\n"
    },
    {
      "commit": "adfe11e4633db5f01ab4d016b61d68e10a952664",
      "tree": "2cc64b920f5ae6741d77fa96066a18b4e687b8ff",
      "parents": [
        "3a4f4fb4da9011729d97d2172bc360fb6007809d"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 13 08:57:48 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 13 09:08:42 2026 +0200"
      },
      "message": "fix(plc4j): Updated DefaultPlcValueHandlerTest to match the new multi-value handling for non-array tags.\n\nSince a2dbb6bfc0 multiple values for a tag without array metadata are\nintentionally converted into a PlcList (drivers like OPC UA don\u0027t encode\narray size in the tag address) instead of throwing a PlcRuntimeException.\nThe test still asserted the old behavior.\n"
    },
    {
      "commit": "3a4f4fb4da9011729d97d2172bc360fb6007809d",
      "tree": "b6a65322ac22620afe699dd44e232db548d99bf3",
      "parents": [
        "e8a1efca786b1912b948739c9197f47f1af136c8"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 13 08:47:17 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 13 08:47:17 2026 +0200"
      },
      "message": "fix: Added tests covering TransportInstance.getDriverConfig to fix the JaCoCo coverage check in plc4j-transports-api.\n\nThe default method added to the TransportInstance interface made JaCoCo\ncount the interface as a class without any coverage, violating the\nCLASS MISSEDCOUNT rule. Also covers the new driverConfig getter/setter\nin BaseTransportInstance.\n"
    },
    {
      "commit": "e8a1efca786b1912b948739c9197f47f1af136c8",
      "tree": "60bb8455a02520a8fced31b2c3c0d975d94c7d03",
      "parents": [
        "4179122b04b620e9bd095b664fd8ad64463350ed"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 08:41:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 08:41:19 2026 +0200"
      },
      "message": "build(deps): bump bouncycastle.version from 1.84 to 1.85 (#2642)\n\nBumps `bouncycastle.version` from 1.84 to 1.85.\n\nUpdates `org.bouncycastle:bcpkix-jdk18on` from 1.84 to 1.85\n- [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html)\n- [Commits](https://github.com/bcgit/bc-java/commits)\n\nUpdates `org.bouncycastle:bcprov-jdk18on` from 1.84 to 1.85\n- [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html)\n- [Commits](https://github.com/bcgit/bc-java/commits)\n\nUpdates `org.bouncycastle:bcutil-jdk18on` from 1.84 to 1.85\n- [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html)\n- [Commits](https://github.com/bcgit/bc-java/commits)\n\nUpdates `org.bouncycastle:bctls-jdk18on` from 1.84 to 1.85\n- [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html)\n- [Commits](https://github.com/bcgit/bc-java/commits)\n\n---\nupdated-dependencies:\n- dependency-name: org.bouncycastle:bcpkix-jdk18on\n  dependency-version: \u00271.85\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: org.bouncycastle:bcprov-jdk18on\n  dependency-version: \u00271.85\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: org.bouncycastle:bcutil-jdk18on\n  dependency-version: \u00271.85\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: org.bouncycastle:bctls-jdk18on\n  dependency-version: \u00271.85\u0027\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": "4179122b04b620e9bd095b664fd8ad64463350ed",
      "tree": "870289256cbd5f958fed396372d03c41fffe7fe1",
      "parents": [
        "a2dbb6bfc0ef0060674d5614d99f32da0c749795"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 13 08:41:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 08:41:07 2026 +0200"
      },
      "message": "build(deps): bump org.junit:junit-bom from 6.1.1 to 6.1.2 (#2643)\n\nBumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 6.1.1 to 6.1.2.\n- [Release notes](https://github.com/junit-team/junit-framework/releases)\n- [Commits](https://github.com/junit-team/junit-framework/compare/r6.1.1...r6.1.2)\n\n---\nupdated-dependencies:\n- dependency-name: org.junit:junit-bom\n  dependency-version: 6.1.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": "a2dbb6bfc0ef0060674d5614d99f32da0c749795",
      "tree": "c9b87611dc41c1e3244810c209a159b2b73f2744",
      "parents": [
        "5a4d5bdb4c1b0e9356eff00af198bdb6aa960f26"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Fri Jul 10 19:18:45 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Fri Jul 10 19:18:45 2026 +0200"
      },
      "message": "fix: Addessed various issues with the OPC-UA driver and it\u0027s testsuite.\n"
    },
    {
      "commit": "5a4d5bdb4c1b0e9356eff00af198bdb6aa960f26",
      "tree": "55c0467c75d3493aae77845f505e94570d587dba",
      "parents": [
        "25a7a0f893607d633460b47671b07081e7c50e0b"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Fri Jul 10 14:01:04 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Fri Jul 10 14:01:04 2026 +0200"
      },
      "message": "fix: Addessed various issues regarding to parsing of potentially corrupt or mallicious responses which could cause OOM errors.\n"
    },
    {
      "commit": "25a7a0f893607d633460b47671b07081e7c50e0b",
      "tree": "9a05f166ddd95f5591393876452da0c33bea4aae",
      "parents": [
        "a4632bc527e7c00dbcace8a040a0de4d782ba900"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Fri Jul 10 13:59:33 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Fri Jul 10 13:59:33 2026 +0200"
      },
      "message": "fix: Fixed an issue making IntelliJ not pick up the change to maven 4\n"
    },
    {
      "commit": "a4632bc527e7c00dbcace8a040a0de4d782ba900",
      "tree": "b2a1c2d2b97d10cfe0dc7cbc1408ba1788d4998b",
      "parents": [
        "181d976470b6564067607b7f859255ee4f26107d"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Fri Jul 10 13:59:07 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Fri Jul 10 13:59:07 2026 +0200"
      },
      "message": "chore: Updated the KNX Vendor IDs\n"
    },
    {
      "commit": "181d976470b6564067607b7f859255ee4f26107d",
      "tree": "116a68ee3382e35290b6c22989204064295fce0e",
      "parents": [
        "8a30a6e0e9dfc193148601f788fcbf9cc370b6d9"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 10 09:11:23 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 10 09:12:25 2026 +0200"
      },
      "message": "chore(plc4j/opm): port to restructured SPI and re-enable module\n\nThe opm module was parked in the plc4j-tools reactor by the SPI\nrestructuring (372501287d). The main sources were unaffected; only the\ntests referenced classes at their old SPI locations, resolved through\nthe obsolete monolithic plc4j-spi test dependency:\n\n- spi.messages.utils.(Default)PlcResponseItem\n  -\u003e spi.drivers.messages.items.(Default)PlcResponseItem\n- spi.messages.DefaultPlcRead/WriteRequest/Response\n  -\u003e spi.drivers.messages.*\n- spi.messages.PlcReader/PlcWriter -\u003e spi.drivers.functions.*\n- spi.connection.PlcTagHandler -\u003e spi.drivers.tags.PlcTagHandler\n\nReplace the plc4j-spi test dependency with plc4j-spi-drivers and\nplc4j-spi-values, update the imports, and re-enable the module in the\nreactor. All 40 tests pass (6 skips are pre-existing @Disabled).\n\nscraper-ng stays disabled: it is an empty skeleton (no sources, its\ndependencies commented out and still referencing 0.12.0-era artifacts\nlike plc4j-connection-pool), so there is nothing to port yet.\n"
    },
    {
      "commit": "8a30a6e0e9dfc193148601f788fcbf9cc370b6d9",
      "tree": "7bee41952d27f08bb6fe5d06b0ab8b24d9b68c6f",
      "parents": [
        "be0da3931904b4fdd95717eee31e3dcd42132c96"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 10 09:10:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 10 09:10:10 2026 +0200"
      },
      "message": "build(deps): bump logback.version from 1.5.37 to 1.5.38 (#2639)\n\nBumps `logback.version` from 1.5.37 to 1.5.38.\n\nUpdates `ch.qos.logback:logback-classic` from 1.5.37 to 1.5.38\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.37...v_1.5.38)\n\nUpdates `ch.qos.logback:logback-core` from 1.5.37 to 1.5.38\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.37...v_1.5.38)\n\n---\nupdated-dependencies:\n- dependency-name: ch.qos.logback:logback-classic\n  dependency-version: 1.5.38\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: ch.qos.logback:logback-core\n  dependency-version: 1.5.38\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": "be0da3931904b4fdd95717eee31e3dcd42132c96",
      "tree": "3bd9aa7da16b209f23ec109ed05e904723d4bd1e",
      "parents": [
        "11b103d82dfa70b09719832429bac20a624c7969"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 10 08:57:54 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 10 08:57:54 2026 +0200"
      },
      "message": "fix(plc4j/scraper): supply default connection manager, port to new SPI, re-enable module\n\nThe connection-cache re-implementation (1b961389c8) made\nCachedPlcConnectionManager.Builder.build() throw an IllegalStateException\nunless a PlcConnectionManager is set via withConnectionManager().\nThe config-based convenience constructors of ScraperImpl and\nTriggeredScraperImpl still built the cache without one, so every\nconsumer using them failed at construction time (first observed as the\nplc4x-extras Apache Calcite and Kafka CI failures).\n\n- ScraperImpl/TriggeredScraperImpl: pass new DefaultPlcDriverManager()\n  explicitly, restoring the documented pre-rework default\n- Add regression tests covering the config-based constructors (they were\n  previously only exercised by a @Disabled manual test, which is why CI\n  never caught this)\n- Port the scraper tests to the restructured SPI:\n  DefaultPlcResponseItem moved to plc4j-spi-drivers\n  (org.apache.plc4x.java.spi.drivers.messages.items)\n- Re-enable the scraper module in the plc4j-tools reactor; it was\n  parked by the SPI restructuring (372501287d) pending exactly this\n  port and now builds and tests green (opm/scraper-ng stay disabled)\n"
    },
    {
      "commit": "11b103d82dfa70b09719832429bac20a624c7969",
      "tree": "9fc2c27cbd321f32660cfa71af9e649350397fab",
      "parents": [
        "75847e32c617647be2ec6016d429d36f658fb413"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 09 09:13:27 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 09 09:13:27 2026 +0200"
      },
      "message": "build(deps): update 3rd party deps\n\nCloses #2634\nCloses #2635\nCloses #2636\nCloses #2637\n"
    },
    {
      "commit": "75847e32c617647be2ec6016d429d36f658fb413",
      "tree": "45f0617ab4c227a7dfb5cf4b7256b8f4fc3dcd49",
      "parents": [
        "c3a65515b6a54e4310374b1fdd1deb9eca16fbf6"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 09 08:39:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 09 08:39:27 2026 +0200"
      },
      "message": "chore(build): maven 4 migration (#2337)\n\n* chore(build): maven 4 migration\n\nhttps://maven.apache.org/guides/mini/guide-migration-to-mvn4.html\n\n* chore(build): move deploy/install settings to the top\n\nhttps://maven.apache.org/guides/mini/guide-migration-to-mvn4.html\n\n* chore(build): upgrade to newer rc\n\n* chore(build): migrate poms added on develop since branch creation to maven 4\n\n* chore(build): apply mvnup inference optimizations\n\nApplied \u0027mvnup apply\u0027 from Maven 4.0.0-rc-5:\n- drop explicit modelVersion (inferred from the 4.1.0 POM namespace)\n- drop subprojects lists that exactly match the direct child directories\n  (automatic subproject discovery)\n\n* chore(build): drop obsolete installAtEnd/deployAtEnd workarounds, update README\n\nThe TODO workarounds forcing installAtEnd/deployAtEnd\u003dfalse are no longer\nneeded: the effective maven-install/deploy-plugin 3.1.4 (pinned via\napache parent 39) defaults to false anyway, and a release-profile build\nwith -DinstallAtEnd\u003dtrue (the Maven 4 plugin-line default) now completes\nsuccessfully on 4.0.0-rc-5, with installs correctly deferred to the end\nof the reactor.\n\nAlso update the README build requirements to Maven 4.0.0-rc-5+.\n\n* fix(build): repair code-generation integration tests under Maven 4\n\nThree distinct issues broke the CI platform workflows (all failing since\nthe branch was created):\n\n1. maven-invoker-plugin:install resolved in-reactor dependency POMs\n   through the workspace reader, which serves the raw 4.1.0 build POM.\n   In repository-mode model building the omitted parent \u003cversion\u003e is not\n   inferred, producing an unresolvable versionless coordinate\n   (org.apache.plc4x:plc4x-code-generation:pom:). Restore explicit\n   parent versions across the code-generation subtree.\n\n2. The invoker IT project POMs pointed \u003crelativePath\u003e four levels up,\n   which from the cloned target/integration-tests location resolves to\n   the wrong POM. Maven 3 silently fell back to repository resolution on\n   the coordinate mismatch; Maven 4 follows the path and fails with a\n   parent-cycle error. Use an empty \u003crelativePath/\u003e so the parent is\n   resolved from the invoker-provisioned local repository.\n\n3. The plc4py IT POM declared exec-maven-plugin twice, which Maven 4\n   treats as a hard error. Merge into a single declaration.\n\n* fix(build): restore explicit parent versions in all reactor poms\n\nOmitting the parent \u003cversion\u003e (model 4.1.0 inference) breaks any plugin\nthat resolves in-reactor artifact descriptors through the repository\nsystem: the workspace reader serves the raw build POM, and\nrepository-mode model building does not apply parent-version inference\n(relativePath is not followed there). maven-invoker-plugin:install hits\nthis for every in-reactor dependency of the code-generation language\nmodules (first plc4x-code-generation, then plc4j once the full reactor\nis in the session).\n\nKeep the rest of the model 4.1.0 features (subprojects auto-discovery,\nsources element, omitted modelVersion) which are unaffected."
    },
    {
      "commit": "c3a65515b6a54e4310374b1fdd1deb9eca16fbf6",
      "tree": "6ea5fcf48572b376614b80af349557cc62a0570c",
      "parents": [
        "54f4419e91452ef8ad36b5b62764e6191f7b6230"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Apr 10 06:35:04 2026 +0000"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 09 07:19:00 2026 +0200"
      },
      "message": "build(deps): bump actions/github-script from 8.0.0 to 9.0.0\n\nBumps [actions/github-script](https://github.com/actions/github-script) from 8.0.0 to 9.0.0.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/v8.0.0...v9.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/github-script\n  dependency-version: 9.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "54f4419e91452ef8ad36b5b62764e6191f7b6230",
      "tree": "b6218c3f5e0d7a52b770c32dbf463520f8d51147",
      "parents": [
        "7ac57b3cede971093167d72958868fd189b99efc"
      ],
      "author": {
        "name": "Hervé Boutemy",
        "email": "hboutemy@apache.org",
        "time": "Wed Jul 08 22:39:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 22:39:45 2026 +0200"
      },
      "message": "restore skip-code-generation property usage (#2407)"
    },
    {
      "commit": "7ac57b3cede971093167d72958868fd189b99efc",
      "tree": "65586f8f6d60e05c4585c1c194c41e18a5127fae",
      "parents": [
        "0a0219821873642eb2e543628f5e8e033c365edf"
      ],
      "author": {
        "name": "LivingLikeKrillin",
        "email": "143606756+LivingLikeKrillin@users.noreply.github.com",
        "time": "Thu Jul 09 05:34:24 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 22:34:24 2026 +0200"
      },
      "message": "feat: Add SLMP (MELSEC Communication 3E) protocol module (read-only wire layer) (#2597)\n\n* feat: Add SLMP (MELSEC Communication 3E) protocol module - read-only wire layer\n\nAdds the codegen-layer protocol module for SLMP / MELSEC Communication\nprotocol (Mitsubishi PLCs), as proposed in the SLMP driver proposal issue:\n\n- slmp.mspec modelling the 3E binary frame (request/response), with\n  Batch Read (0x0401), Random Read (0x0403) and Batch Read Multiple\n  Blocks (0x0406) in word units, read-only\n- ParserSerializer test suite with vectors derived from the worked\n  examples in the public Mitsubishi reference manual SH-080008\n  (sections 8.1/8.3/8.4)\n- Root type declares the new-SPI encoding defaults (little-endian)\n\nThe driver module (plc4j/drivers/slmp) will follow on top of the new\nSPI as a separate step.\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e\n\n* fix(slmp): use canonical enum form for deviceCode in test vectors\n\ndeviceCode is a numeric enum (SlmpDeviceCode), but the ParserSerializer\ntest vectors used the shorthand \u003cdeviceCode\u003eD\u003c/deviceCode\u003e form. That\ndoes not round-trip through the generated parser/serializer, which\nexpects the full enum element with its numeric value:\n\n    \u003cdeviceCode\u003e\n      \u003cSlmpDeviceCode dataType\u003d\"uint\" bitLength\u003d\"8\" stringRepresentation\u003d\"D\"\u003e168\u003c/SlmpDeviceCode\u003e\n    \u003c/deviceCode\u003e\n\nConvert all deviceCode occurrences in ParserSerializerTestsuite.xml to\nthe canonical form so the vectors round-trip once the generated driver\ntypes exercise them.\n\n---------\n\nSigned-off-by: Jooyoung Jung \u003clivinglikekrillin@gmail.com\u003e"
    },
    {
      "commit": "0a0219821873642eb2e543628f5e8e033c365edf",
      "tree": "16f76641798f3c1e84b7f9c6f5c6422ff0ecf08e",
      "parents": [
        "cf28d43fe6f74ece501cff835bdeaec088db3fbf"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 08 22:17:19 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 08 22:31:17 2026 +0200"
      },
      "message": "chore: Updated the KNX Vendor IDs\n"
    },
    {
      "commit": "cf28d43fe6f74ece501cff835bdeaec088db3fbf",
      "tree": "f13672f019a3ab8e79563511f6c592f002a5be92",
      "parents": [
        "e7264cf6c8d6a3391d362b43faa0a659f802fd36"
      ],
      "author": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 08 22:17:11 2026 +0200"
      },
      "committer": {
        "name": "Christofer Dutz",
        "email": "christofer.dutz@c-ware.de",
        "time": "Wed Jul 08 22:31:17 2026 +0200"
      },
      "message": "fix: Addressed a Deadlock caused by obtaining connection\n\ncloses:  #2631\n"
    },
    {
      "commit": "e7264cf6c8d6a3391d362b43faa0a659f802fd36",
      "tree": "1c03f4b3a8db9b0b7b73cb21e59fb380e976f588",
      "parents": [
        "ebe6b0ee1e2d47a601fd7ffa161ec93a5e35954c"
      ],
      "author": {
        "name": "sole",
        "email": "soledomini@gmail.com",
        "time": "Wed Jul 08 18:16:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 18:16:24 2026 +0200"
      },
      "message": "fix(plc4j/ads): connect handshake honors configured AMS ports instead of hardcoded RUNTIME_SYSTEM_01 (851) (#2630)\n\nCo-authored-by: Dominik Solenicki \u003cdbsole@proton.me\u003e"
    },
    {
      "commit": "ebe6b0ee1e2d47a601fd7ffa161ec93a5e35954c",
      "tree": "ddeedc3196c88fd321570aa567461df18baaaa32",
      "parents": [
        "420e7e6a39eada49b96825ab243686fa6ba8ec43"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 08 09:00:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 09:00:08 2026 +0200"
      },
      "message": "build(deps): bump com.fasterxml.jackson.datatype:jackson-datatype-jsr310 (#2633)\n\nBumps com.fasterxml.jackson.datatype:jackson-datatype-jsr310 from 2.22.0 to 2.22.1.\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310\n  dependency-version: 2.22.1\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": "420e7e6a39eada49b96825ab243686fa6ba8ec43",
      "tree": "838f28b85ee984665edc67298a16d634a8c6f269",
      "parents": [
        "1fa31234a97232090972dda914282152bf82cddf"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Jul 07 13:51:54 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Jul 07 13:51:54 2026 +0200"
      },
      "message": "fix(plc4j/modbus): validate response function codes and make request-timeout cover queueing\n\nSerial connections (RTU/ASCII) correlated responses by unit id only, so a\nlate response from a timed-out request could complete the next request on\nthe same unit. Responses are now also validated against the pending\nrequest\u0027s function code (exception frames answer any request; the generated\nerror PDU carries no fc). Mismatches are logged and discarded while the\npending request stays armed. Same-fc late responses remain\nindistinguishable — inherent to RTU, documented.\n\nThe request timeout is now armed at submission instead of dispatch, making\nit a total wall-clock budget; requests that expire while queued fail fast\nwith a TimeoutException and never reach the wire (small dispatch margin,\ndocumented in the config description).\n"
    },
    {
      "commit": "1fa31234a97232090972dda914282152bf82cddf",
      "tree": "a07552a5b21f1350f9ad157340e80632a058e633",
      "parents": [
        "8006ee0e83f01acf1a682f395be3e511f1025058"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Jul 07 11:38:11 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Tue Jul 07 11:38:17 2026 +0200"
      },
      "message": "fix(plc4j): harden Modbus serial connections and shared-port dispatch\n\nSerialize requests per connection with an async tail chain (Modbus\nserial is a single-outstanding-transaction protocol): concurrent\nrequests to the same unit no longer overwrite each other\u0027s pending\nfuture and receive each other\u0027s responses. Map unknown Modbus exception\ncodes to REMOTE_ERROR instead of failing with an NPE. Dispatch each\nconnection\u0027s data callbacks on their own thread in shared-port mode so\none blocked callback no longer stalls every connection on the port, and\ngrow the receive rings from 8 KiB to 64 KiB. Connections sharing a port\nmust target distinct unit ids (documented; RTU has no transaction ids).\n"
    },
    {
      "commit": "8006ee0e83f01acf1a682f395be3e511f1025058",
      "tree": "d5ac3005b794721bec296018c855ae3f783dc097",
      "parents": [
        "edcddb0e88f2ba604f14c8b5bf3668051570df3d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 07 09:25:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 09:25:42 2026 +0200"
      },
      "message": "build(deps): bump golang.org/x/text from 0.38.0 to 0.39.0 in /plc4go (#2628)\n\nBumps [golang.org/x/text](https://github.com/golang/text) from 0.38.0 to 0.39.0.\n- [Release notes](https://github.com/golang/text/releases)\n- [Commits](https://github.com/golang/text/compare/v0.38.0...v0.39.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/text\n  dependency-version: 0.39.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": "edcddb0e88f2ba604f14c8b5bf3668051570df3d",
      "tree": "6768c04b1db327157b4da9fda8d5576196817f56",
      "parents": [
        "a361d8b238c732fcbd1a4f8a2f47a2e690a6a573"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 21:43:46 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 21:43:46 2026 +0200"
      },
      "message": "fix(plc4j): frame Modbus RTU responses by function code with resync\n\nThe RTU codec treated everything available as a single frame (RTU has no\nlength field), discarding trailing frames in batched deliveries and\nlosing partial frames. Responses are now sized by function code\n(exceptions 5, reads and file-record ops 5+byteCount, write echoes 8),\nvalidated from a peek by the CRC-checking parser before being consumed,\nand unparseable bytes are skipped one at a time until the stream\nresynchronizes. This makes multi-slave reuse-port serial setups work\nend to end: every frame in a broadcast batch reaches its connection.\n"
    },
    {
      "commit": "a361d8b238c732fcbd1a4f8a2f47a2e690a6a573",
      "tree": "34b017abc75585f6d0f1b2c1bddfd0213e213fe3",
      "parents": [
        "b5259d7916f6bec449613ea18225f876d2ed0f62"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 20:52:54 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 20:52:54 2026 +0200"
      },
      "message": "fix(plc4j): single broadcast reader for shared serial ports\n\nAlign the Java shared serial port with the plc4go reference design:\nSharedPort owns the one reader per physical device and broadcasts every\nchunk to per-connection subscribers (previously each instance ran its\nown competing reader, splitting responses randomly between connections).\nAcquiring with a differing configuration now fails instead of silently\nreusing the first one. The new WritePacer enforces inter-frame silence\nmeasured from the last write or received data, re-checked mid-wait, on\nshared and dedicated ports alike. Teardown is exactly-once (CAS) with\nfatal-error eviction that releases the device before notifying\nlisteners, so reconnects re-open cleanly.\n"
    },
    {
      "commit": "b5259d7916f6bec449613ea18225f876d2ed0f62",
      "tree": "7f711eafb1209b5d76cba4519958818692ebf1d0",
      "parents": [
        "ce8cff4d2f71d47771aebcd0ea0c26b2b6ae10eb"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 16:24:59 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 16:24:59 2026 +0200"
      },
      "message": "feat(plc4go): shared serial ports and inter-frame write pacing\n\nNew serial options: \"reuse-port\" shares one physical port between\nmultiple connections (multi-slave Modbus RTU) — broadcast reads into\nper-subscriber bounded drop-oldest buffers, serialized writes, a\nrefcounted per-transport registry with hard errors on config mismatch —\nand \"interframe-delay\" enforces minimum write silence measured from the\nlater of last-write-end and last-received-byte, on shared and dedicated\nports alike. Subscriptions implement the serialport.Port interface, so\nthe deadline/buffering/codec layers are unchanged.\n"
    },
    {
      "commit": "ce8cff4d2f71d47771aebcd0ea0c26b2b6ae10eb",
      "tree": "b9f5f872613607ded60114e816d16e0899a57c56",
      "parents": [
        "b257386f0714952175c3dd039a6b0dfa140040fa"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 15:24:24 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 15:24:24 2026 +0200"
      },
      "message": "fix(plc4j): align serial transport options with the plc4go vocabulary\n\nRemove the unused break-enabled, receive-buffer-size and send-buffer-size\noptions, drop the RTS_CTS_XON_XOFF combined flow-control mode, and reject\ninvalid parity/flow-control values with a TransportException naming the\noption instead of silently falling back to defaults. Values are now\ncase-insensitive with \"-\"/\"_\" interchangeable (canonical: none, odd,\neven, mark, space; none, rts-cts, xon-xoff). Website config-doc partials\nregenerate from the updated annotations at the next site build.\n"
    },
    {
      "commit": "b257386f0714952175c3dd039a6b0dfa140040fa",
      "tree": "b58b15db5b8a03018d32f65dd6c31937ee7f2c6e",
      "parents": [
        "dc620ad3017e77040f7093c2a9ba5e65c4a4d21f"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 14:49:47 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 14:49:47 2026 +0200"
      },
      "message": "feat(plc4go): full serial option support in connection strings\n\nThe serial transport now parses data-bits, stop-bits, parity (incl.\nmark/space), flow-control (rts-cts, xon-xoff), dtr, rts, read-timeout\nand write-timeout. Timeouts act as fallback deadlines: an explicit\ncontext deadline always wins; deadline-less reads/writes are bounded by\nthe configured timeout (default 1000 ms, 0 \u003d blocking). Invalid option\nvalues fail connection creation naming the option; enum values are\ncase-insensitive with \"-\"/\"_\" interchangeable.\n\nBreaking: default baud-rate changed from 115200 to 9600; deadline-less\nI/O no longer blocks indefinitely by default (see RELEASE_NOTES).\n"
    },
    {
      "commit": "dc620ad3017e77040f7093c2a9ba5e65c4a4d21f",
      "tree": "9d20b26a44cbb0e42e57f20f90e5c4aaa010fa65",
      "parents": [
        "2a52d8f66871efb654e8c277c5b5d7e30b410e0d"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 14:05:03 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 14:05:03 2026 +0200"
      },
      "message": "fix(plc4go): make spi/transports/pcap buildable without cgo\n\ngopacket/pcap is cgo-only on every platform except Windows (all versions,\nnot a regression from the 1.7.0 bump), so CGO_ENABLED\u003d0 builds — including\nall cross-compilation — failed on the pcap transport. Gate the real\nimplementation behind `cgo || windows` and add a stub that returns a clear\nerror from CreateTransportInstance in nocgo builds.\n"
    },
    {
      "commit": "2a52d8f66871efb654e8c277c5b5d7e30b410e0d",
      "tree": "6dc8ee245a8a52d35442aec7cfb1ff0f80e1502d",
      "parents": [
        "04a37a2d699525dff68fb426248e577d2fb3a730"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 13:45:58 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 13:45:58 2026 +0200"
      },
      "message": "feat(plc4go): complete serialport feature set (ControlPort, ListPorts)\n\nPhase 2 of the internalized serial-port package: a ControlPort interface\n(implemented by every Port that Open returns) adds modem control lines\n(DTR/RTS set, CTS/DSR/DCD/RI read), timed break, flush/drain, and runtime\nreconfiguration via SetConfig; Config gains XON/XOFF software flow control\nand mark/space parity (Linux/Windows; clean error elsewhere); ListPorts\nenumerates ports on Linux/macOS/FreeBSD/Windows.\n\nSame testing discipline as phase 1: portable spec-pinned mappings for all\nWindows DCB/escape/modem constants, thin per-OS shims, PTY integration\ntests for everything the pty driver supports, race-checked, cross-compiled\nfor six GOOS targets.\n"
    },
    {
      "commit": "04a37a2d699525dff68fb426248e577d2fb3a730",
      "tree": "b33676f6173027c7496c5fb9bff28291d5736758",
      "parents": [
        "c91211bbc3fe6c1569529ab8593ea6df43e62074"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 11:37:56 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 11:37:56 2026 +0200"
      },
      "message": "fix(plc4go): serial transport deadline and connected-state follow-ups\n\n- Write: clear the write deadline when the context has none, so a lapsed\n  deadline from a previous call no longer fails later writes with a\n  spurious i/o timeout\n- IsConnected: key on the connected flag (like the TCP transport) instead\n  of a lock-free read of the port field\n"
    },
    {
      "commit": "c91211bbc3fe6c1569529ab8593ea6df43e62074",
      "tree": "d80980e4a64f8106cfa5b28673fa489316835034",
      "parents": [
        "65e1935300710c5a5c07c8ee72ca969382b0fafd"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 11:21:09 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 11:21:09 2026 +0200"
      },
      "message": "feat(plc4go): replace jacobsa/go-serial with internal serialport package\n\nInternalize the unmaintained (2018) github.com/jacobsa/go-serial dependency\nas spi/transports/serial/serialport, a rewrite with net.Conn-like semantics:\n\n- POSIX: non-blocking *os.File on the runtime poller, so\n  SetReadDeadline/SetWriteDeadline work natively (Linux TCSETS2+BOTHER,\n  Darwin TIOCSETA+IOSSIOSPEED, FreeBSD TIOCSETA; stub elsewhere)\n- Windows: DCB/COMMTIMEOUTS-based port with deadline emulation in bounded\n  slices and a cancellation-safe Close (compile-gated, logic spec-tested\n  portably)\n- Tested without hardware: spec-pinned tables for termios and DCB values,\n  PTY integration tests for the full open/configure/read/write/deadline/\n  close path, race-checked, cross-compiled for windows/darwin/freebsd/openbsd\n\nThe serial TransportInstance now wires real read/write deadlines (removes\nboth \"TODO: big oof\" no-ops) and fixes a latent bug where Connect never set\nthe connected flag, so Write always failed with \"Not connected\".\n\nAlso: attribution entry in LICENSE for the two derived files, dependency\nremoved from go.mod/go.sum/tools.mod/tools.sum and the code-generation Go\ntest fixture.\n"
    },
    {
      "commit": "65e1935300710c5a5c07c8ee72ca969382b0fafd",
      "tree": "a9577c8434311abd582f89daea5099826eb7e8d7",
      "parents": [
        "018c107808fcb50b0ee766e2de5105acf0f853d7"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Fri Jul 03 09:39:50 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Mon Jul 06 09:16:25 2026 +0200"
      },
      "message": "fix(plc4go): data race in testutils.shouldNoColor under parallel tests\n\nshouldNoColor writes the global color.NoColor and is invoked by\nProduceTestingLogger for every test - parallel subtests in consumers\ntrip the race detector on the unsynchronized concurrent writes. The\nresult only depends on the environment, so compute it exactly once.\n"
    },
    {
      "commit": "018c107808fcb50b0ee766e2de5105acf0f853d7",
      "tree": "7a446e5f3a1f2e31b186a9fdd891cf8624b74d9a",
      "parents": [
        "13644660eac38dc5ba43847d328b09f0a090bb43"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 06 09:14:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 06 09:14:04 2026 +0200"
      },
      "message": "build(deps): bump groovy.version from 5.0.6 to 5.0.7 (#2627)\n\nBumps `groovy.version` from 5.0.6 to 5.0.7.\n\nUpdates `org.apache.groovy:groovy-test-junit5` from 5.0.6 to 5.0.7\n- [Commits](https://github.com/apache/groovy/commits)\n\nUpdates `org.apache.groovy:groovy` from 5.0.6 to 5.0.7\n- [Commits](https://github.com/apache/groovy/commits)\n\nUpdates `org.apache.groovy:groovy-templates` from 5.0.6 to 5.0.7\n- [Commits](https://github.com/apache/groovy/commits)\n\nUpdates `org.apache.groovy:groovy-ant` from 5.0.6 to 5.0.7\n- [Commits](https://github.com/apache/groovy/commits)\n\nUpdates `org.apache.groovy:groovy-xml` from 5.0.6 to 5.0.7\n- [Commits](https://github.com/apache/groovy/commits)\n\n---\nupdated-dependencies:\n- dependency-name: org.apache.groovy:groovy-test-junit5\n  dependency-version: 5.0.7\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.apache.groovy:groovy\n  dependency-version: 5.0.7\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.apache.groovy:groovy-templates\n  dependency-version: 5.0.7\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.apache.groovy:groovy-ant\n  dependency-version: 5.0.7\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.apache.groovy:groovy-xml\n  dependency-version: 5.0.7\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": "13644660eac38dc5ba43847d328b09f0a090bb43",
      "tree": "c4e90ef0695c5169d3de9ec6d3388d9e174bb644",
      "parents": [
        "bd94847cc3ba914ae4ea136a72171c369c90f7e3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 03 17:05:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 17:05:54 2026 +0200"
      },
      "message": "build(deps): bump github.com/gopacket/gopacket in /plc4go (#2624)\n\nBumps [github.com/gopacket/gopacket](https://github.com/gopacket/gopacket) from 1.6.1 to 1.7.0.\n- [Release notes](https://github.com/gopacket/gopacket/releases)\n- [Commits](https://github.com/gopacket/gopacket/compare/v1.6.1...v1.7.0)\n\n---\nupdated-dependencies:\n- dependency-name: github.com/gopacket/gopacket\n  dependency-version: 1.7.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": "bd94847cc3ba914ae4ea136a72171c369c90f7e3",
      "tree": "0c2c7251f9033108417cc909708d9fc2cbf2164b",
      "parents": [
        "a0917eb55bcdaa98dccf6ea5e01a8fb76caa094f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 03 17:05:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 17:05:36 2026 +0200"
      },
      "message": "build(deps): bump org.codehaus.gmavenplus:gmavenplus-plugin (#2625)\n\nBumps [org.codehaus.gmavenplus:gmavenplus-plugin](https://github.com/groovy/GMavenPlus) from 4.3.1 to 5.1.0.\n- [Release notes](https://github.com/groovy/GMavenPlus/releases)\n- [Commits](https://github.com/groovy/GMavenPlus/compare/4.3.1...5.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: org.codehaus.gmavenplus:gmavenplus-plugin\n  dependency-version: 5.1.0\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": "a0917eb55bcdaa98dccf6ea5e01a8fb76caa094f",
      "tree": "ac89498f12c9ceee55a3944ef8594dc3cc7b7727",
      "parents": [
        "ca4c25643618cb85a7aa21e7a5ce7ba6c92eb64e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 03 17:05:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 17:05:21 2026 +0200"
      },
      "message": "build(deps): bump net.bytebuddy:byte-buddy from 1.18.10 to 1.18.11 (#2626)\n\nBumps [net.bytebuddy:byte-buddy](https://github.com/raphw/byte-buddy) from 1.18.10 to 1.18.11.\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.10...byte-buddy-1.18.11)\n\n---\nupdated-dependencies:\n- dependency-name: net.bytebuddy:byte-buddy\n  dependency-version: 1.18.11\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": "ca4c25643618cb85a7aa21e7a5ce7ba6c92eb64e",
      "tree": "bc10cb123bb7312233d23c9d40ebfa2990e6e2fc",
      "parents": [
        "220b7760cb8723beeefb89ae80900ab1d96af955"
      ],
      "author": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 02 17:36:21 2026 +0200"
      },
      "committer": {
        "name": "Sebastian Rühl",
        "email": "sruehl@apache.org",
        "time": "Thu Jul 02 17:36:21 2026 +0200"
      },
      "message": "feat(plc4go): add WithMaxIdleTime to the connection cache\n\nRemotes routinely reap idle TCP connections without a FIN/RST ever\nreaching the client (half-open TCP) - a death that no liveness flag can\ndetect, as it only surfaces when the first write hits the dead socket.\nField data against Modbus TCP gateways shows pooled connections dying\nthis way between poll cycles, costing retry attempts on every affected\npoll.\n\nWithMaxIdleTime(d) discards cached connections that sat idle for longer\nthan d and re-establishes them transparently on the next lease (0 \u003d keep\nforever, the default - previous behavior is unchanged). The idle clock\nstarts when a connection becomes idle (after connect and on lease\nreturn). As a side effect, connection slots on connection-limited\nremotes are freed between bursts instead of being parked indefinitely.\n"
    }
  ],
  "next": "220b7760cb8723beeefb89ae80900ab1d96af955"
}
