)]}'
{
  "log": [
    {
      "commit": "b8b89adf8e0da09883d89fc4622f66cf4e0ac319",
      "tree": "dc0081b0fdeeea484a8984a139f71da84cd5aad3",
      "parents": [
        "3e08839b32f64a31640b87ba9eb71b18828c9332"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Aug 14 10:45:41 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Aug 14 10:45:41 2026 -0400"
      },
      "message": "Tidy-up of documentation\n"
    },
    {
      "commit": "3e08839b32f64a31640b87ba9eb71b18828c9332",
      "tree": "058c9ee53febaad4b299577c4d969a07eb2792bf",
      "parents": [
        "15a376e18d3ce8fc97be31d07e1213d10182c014"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 12 15:50:36 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 12 15:50:36 2026 -0400"
      },
      "message": "Add shim auto-discovery and --shims/--exclude-shims CLI filtering\n\nReplace hardcoded CLIENT_INFO dicts and per-shim registration blocks\nwith manifest-based auto-discovery. Each shim directory now contains a\nshim.json declaring name, type, and broker_prefix. The discover_shims()\nfunction scans shims/*/shim.json at collection time, eliminating the\nneed to edit Python source when adding new shims.\n\nUnify the JMS shim entry point: java-qpid-jms now has a shim.sh\ndispatcher (delegates to sender.sh/receiver.sh) so all shims share\nthe same shim.sh {send|receive} invocation pattern.\n\nAdd --shims and --exclude-shims pytest options for Jenkins downstream\nruns that need to restrict which shims participate in the test matrix.\n\nAssisted-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "15a376e18d3ce8fc97be31d07e1213d10182c014",
      "tree": "0b95beae8d7fd849f55fcfce8196163a70244874",
      "parents": [
        "4f8fa4cc5be59ff30014fccf8624cb881313073c"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 11 11:07:53 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 11 11:13:59 2026 -0400"
      },
      "message": "Remove unused uuid dependency from Rhea shim\n\nThe uuid package (v9) had a Dependabot security alert (CVE-2026-41907:\nbuffer bounds check in v3/v5/v6). The import was dead code — uuidv4\nwas imported but never called. Remove the dependency entirely.\n\nAssisted-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "4f8fa4cc5be59ff30014fccf8624cb881313073c",
      "tree": "f2541715919f2e12bc56536aac71a2ee8d2a19c4",
      "parents": [
        "72cff54ecf5b3a584f29334c01f2d7f261a84f7d"
      ],
      "author": {
        "name": "Kim van der Riet",
        "email": "kpvdr@users.noreply.github.com",
        "time": "Tue Aug 11 11:01:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 11:01:52 2026 -0400"
      },
      "message": "Add CodeQL analysis workflow configuration"
    },
    {
      "commit": "72cff54ecf5b3a584f29334c01f2d7f261a84f7d",
      "tree": "d8f2dcf603beb66850e88b2023c41e431b61e809",
      "parents": [
        "b26d6c922cc11c09881fcaa6950e2e2364c2586c"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 11 09:45:39 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 11 09:45:39 2026 -0400"
      },
      "message": "Release cleanup: remove dev docs, add CHANGES, RAT compliance\n\n- Remove 10 development-phase status/planning docs\n- Remove bug-repros/ directory (kept in separate repo)\n- Add ASF license header to docker/configure-broker.sh\n- Add CHANGES file documenting 0.3.0 to 2.0.0 evolution\n- Add .rat-excludes and scripts/run-rat.sh for release auditing\n- RAT passes with 0 unapproved files (57 standards checked)\n\nAssisted-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b26d6c922cc11c09881fcaa6950e2e2364c2586c",
      "tree": "a7185af5c5ae224c5127127c95edf11ccd940eeb",
      "parents": [
        "a99d0deb2144acf2d0d445d79ff02035d90ae713"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 10 17:13:50 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 10 17:13:50 2026 -0400"
      },
      "message": "Update to .gitignore\n"
    },
    {
      "commit": "a99d0deb2144acf2d0d445d79ff02035d90ae713",
      "tree": "2e40dba1f3a84ff40b0188d5d58d9bbca6c6d2e9",
      "parents": [
        "1526afca12badc78c3da25d42a310abea28a273e"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 10 16:07:10 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 10 16:07:10 2026 -0400"
      },
      "message": "Fix javascript-rhea shim: restore shebang to line 1\n\nThe ASF license header was prepended before the #!/usr/bin/env node\nshebang, pushing it to line 20 where Node.js parsed it as invalid\nsyntax. This caused all 508 javascript-rhea tests to fail in run 99.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "1526afca12badc78c3da25d42a310abea28a273e",
      "tree": "bd1ccee5ccd1fcd8947130b655d64c52034af378",
      "parents": [
        "d5288c840abc4ea9230c81dbf1b48d5dd27f56b6"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 10 14:26:15 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 10 14:26:15 2026 -0400"
      },
      "message": "Restore executable permissions on scripts and shims\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "d5288c840abc4ea9230c81dbf1b48d5dd27f56b6",
      "tree": "3f45fc8945c089b6c2f0755d5452a50825b06117",
      "parents": [
        "e4ef29bf0e0918198382e595350f4364ca395924"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 10 14:26:02 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 10 14:26:02 2026 -0400"
      },
      "message": "Add ASF license headers, LICENSE/NOTICE files, and shim authoring guide\n\nPrepare QIT 2.0 for migration to apache/qpid-interop-test repository:\n- Add Apache License 2.0 full text (LICENSE) and NOTICE file\n- Add ASF license headers to all 55 source files (Python, Shell, C++,\n  C#, Java, JavaScript, XML, CMake, TOML)\n- Add docs/SHIM_HOWTO.md: comprehensive guide for writing new language\n  shims covering CLI contract, JSON I/O, type encoding, JMS emulation,\n  AMQP headers, large content LCG algorithm, and registration\n- Update README.md with SHIM_HOWTO and LICENSE/NOTICE references\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e4ef29bf0e0918198382e595350f4364ca395924",
      "tree": "c3e588b2aef052434a0e39067e2a3b42ca1bad39",
      "parents": [
        "a27b3e4171845d4260cf0911c0983fab4f00fd31"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Aug 07 16:45:43 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Aug 07 16:45:43 2026 -0400"
      },
      "message": "Add client library bug documentation with standalone reproducers\n\nDocument 14 bugs found across ProtonJ2, Proton .NET, and Rhea during\nQIT 2.0 interop testing. Each bug has a minimal standalone repro script\nin docs/bug-repros/ that demonstrates the failure independently of QIT.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "a27b3e4171845d4260cf0911c0983fab4f00fd31",
      "tree": "db4810eabc15d34712759052de1e3740166352da",
      "parents": [
        "6496068acb1c6c6da19b5d55cb1738c00a92b952"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Aug 07 16:37:50 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Aug 07 16:37:50 2026 -0400"
      },
      "message": "Reorganize repo: add QIT 2.0 summary, move docs and scripts\n\n- Add docs/QIT2_SUMMARY.md with full project summary and comparison to\n  original QIT\n- Move 11 status/architecture md files from root to docs/\n- Move 3 debug/manual test scripts from root to scripts/\n- Update README.md with current test counts (2076) and fixed doc links\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "6496068acb1c6c6da19b5d55cb1738c00a92b952",
      "tree": "a8992172cee7adfded02af8aa0afcd3a056cb849",
      "parents": [
        "e863df902d9d3eefa0685b4ac7dedc83226a07ba"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Aug 07 11:34:03 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Aug 07 11:34:03 2026 -0400"
      },
      "message": "Phase 2d: Add AMQP message header section interop tests (275 tests)\n\nAdd --message-header CLI arg to all 5 AMQP shims and test that durable,\npriority, ttl, first-acquirer, and delivery-count round-trip correctly\nacross the full 5×5 client matrix through Artemis.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e863df902d9d3eefa0685b4ac7dedc83226a07ba",
      "tree": "2f6b228306dbd65eaeacaeb8690ac0d47240442e",
      "parents": [
        "b234a80978a93a4ab22f27f4b5a2214f2361a105"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 14:56:18 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 14:56:18 2026 -0400"
      },
      "message": "Phase 4c: Add multi-frame-size large content tests\n\nAdd 500 tests (200 default + 200 extended + 100 from new frame-size\nvariants) that run large content payloads through Artemis acceptors\nconfigured with 4KB (port 5673) and 1MB (port 5674) AMQP frame sizes.\n\nSession-scoped fixtures verify the broker\u0027s negotiated max_frame_size\nvia Proton before any tests run — if the broker isn\u0027t advertising the\nexpected frame size, all dependent tests fail immediately with a clear\ndiagnostic rather than silently passing with default framing.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b234a80978a93a4ab22f27f4b5a2214f2361a105",
      "tree": "10dd3a87d3a30197e89a895b9109ec0f5b0b0b31",
      "parents": [
        "fcaf7330989142bbc60724bd8311ed4b1e9ee643"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 13:25:59 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 13:25:59 2026 -0400"
      },
      "message": "Phase 4b: Add large collection content tests (list/array/map/described)\n\nTests collection types with elements sized to straddle AMQP frame\nboundaries (128KB). Sub-frame elements (43KB × 24) and super-frame\nelements (192KB × 5) verify multi-frame transfer of structured data.\n\nDefault tier: list + array (122 tests, ALL_PAIRS + AMQP_PAIRS)\nExtended tier: map + described (122 tests, behind --large-content)\n\nAll 6 shims implement collection send/receive with PRNG verification.\nJMS supports list (StreamMessage) and map (MapMessage).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "fcaf7330989142bbc60724bd8311ed4b1e9ee643",
      "tree": "24f870f681c0306dd089dc25ed6f3950f46af4ee",
      "parents": [
        "73464df374882eaffb71bc97305f66a2b5ac6c79"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 13:02:26 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 13:02:26 2026 -0400"
      },
      "message": "Add parallel test execution to orchestrator (-j/--workers)\n\nThreadPoolExecutor runs test cases concurrently (each uses a unique\nqueue name so they don\u0027t interfere). Default remains sequential (-j 1).\nLocal benchmark: 25 tests in 13s parallel vs 39s sequential (3x speedup).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "73464df374882eaffb71bc97305f66a2b5ac6c79",
      "tree": "a60a395aee6746a5328e7a20f00d36473d579122",
      "parents": [
        "5e98260c4f01a914ffb38854b7d8029ae20dde2b"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 12:29:44 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 12:29:44 2026 -0400"
      },
      "message": "Enable parallel test execution with pytest-xdist (-n 4)\n\nReduces test suite wall-clock time ~3-4x by running 4 workers in parallel.\nEach test already uses a unique random queue name, so no interference.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "5e98260c4f01a914ffb38854b7d8029ae20dde2b",
      "tree": "54010d050a5c0d3086e0a39d480e473e5efda539",
      "parents": [
        "65f9b0452a5ae5120fbdac9fa12f023435ad1bbf"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 11:25:29 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Aug 05 11:25:29 2026 -0400"
      },
      "message": "Phase 4: Add large content interop tests (1MB binary/string × 36 pairs)\n\nExercise AMQP multi-frame transfer and broker large message handling by\nsending 1MB binary and string messages across all 36 client pairs (11 JMS\nstar + 25 AMQP N×N). Both sender and receiver independently generate the\nsame pseudo-random data using a seeded LCG PRNG — no large data flows\nthrough CLI args, files, or stdout.\n\nAll 6 shims (Python, JS Rhea, C++, .NET, Java ProtonJ2, Java JMS) now\nsupport --large-content binary|string --size N --seed S for both send and\nreceive. Extended 10MB tier available via pytest --large-content flag.\n\n72 tests pass, 0 fail. Existing 351 JMS + AMQP tests unaffected.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "65f9b0452a5ae5120fbdac9fa12f023435ad1bbf",
      "tree": "a81bc84152b7ad856e3f1d63ff00bd10ed562642",
      "parents": [
        "33d15ff94b235c0a02319c63cb79a9a2d1364513"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 04 19:01:30 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 04 19:01:30 2026 -0400"
      },
      "message": "Phase 2e: Add JMS application properties interop (8 types × 11 pairs)\n\nAdd round-trip testing for all 8 JMS property types (boolean, byte,\nshort, int, long, float, double, string) across 6 client libraries\nusing star configuration. All properties use hex encoding with fixed\nwidths for numeric types.\n\n88 new tests: 83 pass, 5 xfail (Rhea loses AMQP type info in JS).\nSuite total: 363 tests (351 pass, 12 xfail, 0 fail).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "33d15ff94b235c0a02319c63cb79a9a2d1364513",
      "tree": "40b958bc6d5202485d4556e4ada58599f55b37e8",
      "parents": [
        "183efa4603dc95034872307ef30e7d2d3ad7e3b6"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 04 16:21:09 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 04 16:21:09 2026 -0400"
      },
      "message": "Phase 2d: Add JMS headers interop (correlation ID, reply-to, type)\n\nAdd JMS header round-trip testing across all 6 client libraries using\nstar configuration (132 new tests: 126 pass, 6 xfail).\n\nHeaders implemented: JMSCorrelationID (string + binary), JMSReplyTo\n(queue + topic via x-opt-jms-reply-to annotation), JMSType (via AMQP\nsubject). All shims use annotation-based reply-to type detection\nrather than address prefixes.\n\nKnown limitations (xfail): .NET Proton and Java ProtonJ2 cannot send\nbinary correlation IDs (AMQP message-id type restriction). ProtonJ2\nalso decodes binary correlation IDs as UTF-8 strings.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "183efa4603dc95034872307ef30e7d2d3ad7e3b6",
      "tree": "8f8f9fdebf07e145fc5df7f6d415284772d46b78",
      "parents": [
        "670cca3057f0a2a7d6e81246e8a9cb813fd50008"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 04 12:51:15 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 04 12:51:15 2026 -0400"
      },
      "message": "Phase 3b: Add xfail framework for known client library limitations\n\nFix QIT bugs (float comparison, Python float32 decode ordering) and add\nan expected-failure framework so known upstream issues don\u0027t block CI.\n\nFramework:\n- KnownFailure registry (21 entries) in src/qit/core/xfail.py\n- Diff classification: genuine failures vs xfail vs xpass\n- Send error xfail handling (Rhea RangeError, .NET/Java ListTypeEncoder NRE)\n- JUnit XML: xfails emit \u003cskipped\u003e, correct suite counts\n- --strict flag: exit 1 if any xfails exist (honest failure count)\n\nQIT bugs fixed:\n- Python receiver float32 decode: check Proton type_name before isinstance(float)\n- Float comparison: normalize both sides to integer bit-patterns\n- Hex normalization: use prefix strip instead of str.replace(\"0x\", \"\")\n\nTest data restored (previously hidden by workarounds):\n- binary/timestamp in list indices 3 and 8\n- Null-after-non-null list case (index 7)\n- Nested ubyte array test (array index 7)\n\nResult: 550 tests — 479 passed, 0 failed, 71 xfail (known issues)\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "670cca3057f0a2a7d6e81246e8a9cb813fd50008",
      "tree": "128418c991204d3945d58fd0d2a8499f947cc1e0",
      "parents": [
        "4ae64f50e1af449ee6ddae5fd3aee949276cf0ee"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 04 09:38:05 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Tue Aug 04 09:38:05 2026 -0400"
      },
      "message": "Phase 3: Add AMQP complex types (array, list, map, described) with N×N testing\n\nAdd complex type support across all 5 shims (python-proton, javascript-rhea,\ncpp-proton, dotnet-proton, java-protonj2) with recursive encode/decode using\ntyped-element notation. All 100 tests pass (5×5 shims × 4 types).\n\nKey fixes for cross-shim interop:\n- .NET: AmqpValue body sections for arrays, typed C# arrays (CreateTypedArray),\n  UUID endianness helpers, IProtonBuffer/Symbol handling, ListTypeEncoder NRE\n  workaround (null-first ordering)\n- Java: primitive arrays for ProtonJ2 codec (boolean[], float[], etc.),\n  Integer→\"int\" type inference (was \"char\"), Character for AMQP char encoding\n- Test data: binary omitted from lists (Proton .NET byte[]/array-of-ubyte\n  ambiguity), timestamp omitted from lists (Proton .NET decodes as long),\n  nested arrays use ushort to avoid byte[]/binary confusion\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "4ae64f50e1af449ee6ddae5fd3aee949276cf0ee",
      "tree": "461adbacb13e0f8bc3f05afaaae7faf001a94464",
      "parents": [
        "35193458bdc153cfb393c5cab98bfac54023acf0"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 13:57:35 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 13:57:35 2026 -0400"
      },
      "message": "Fix Rhea JMS annotation: use string key instead of JS Symbol\n\nRhea\u0027s wrap_map uses for...in which skips Symbol-keyed properties,\nso message_annotations with Symbol.for() keys produced an empty map\non the wire. TextMessage/BytesMessage passed by coincidence (JMS\ninfers type from body content), but MapMessage/StreamMessage had no\nsuch fallback. Using a plain string key lets wrap_symbolic_map\ncorrectly encode it as an AMQP Symbol.\n\n142 tests passing (+ 1 xfail).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "35193458bdc153cfb393c5cab98bfac54023acf0",
      "tree": "6e23889cbda56153414b56a98129810a6d89d7e9",
      "parents": [
        "7c31bbc6fa53279a6899eddc29dfb8ff3737be8a"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 12:40:48 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 12:40:48 2026 -0400"
      },
      "message": "Fix Rhea MapMessage/StreamMessage encoding and decoding\n\n- Sender: use plain object for map body (auto-encoded as AmqpValue map)\n- Sender: use sequence_section() for list body (produces AmqpSequence)\n- Receiver: unwrap Section objects for StreamMessage list body\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7c31bbc6fa53279a6899eddc29dfb8ff3737be8a",
      "tree": "2dfa5daa7a2b37a4927289dac21abea1b9d0bf38",
      "parents": [
        "c8ca9a4e8a5732aae85737cb442a41ab95d6a291"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 12:06:36 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 12:06:36 2026 -0400"
      },
      "message": "Phase 2c.2: Add MapMessage and StreamMessage interop support\n\nAdd map/list encoding to all 5 AMQP shim senders and fix map/list\ndecoding in all 5 AMQP shim receivers. Test count: 99 → 143 tests.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c8ca9a4e8a5732aae85737cb442a41ab95d6a291",
      "tree": "10d169b8ddaa2e5a64cecad0ec6fd1131b8fe43f",
      "parents": [
        "ebb35df87a970f84ced4c070b6bf900b2ad39c60"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 11:06:42 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 11:06:42 2026 -0400"
      },
      "message": "Fix JS BytesMessage receiver for Rhea Section objects\n\nRhea wraps AMQP Data sections in Section objects — extract .content\nbefore converting to Buffer. Mark javascript-rhea→jms Message test as\nxfail (Rhea sends AmqpValue(null) for empty body, JMS maps to TextMessage).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ebb35df87a970f84ced4c070b6bf900b2ad39c60",
      "tree": "82ab8f0940d389ab0f2ac9f962ec913e3b067643",
      "parents": [
        "e6fca1535f91465226fb14052704bc5647de20b3"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 10:31:51 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 10:31:51 2026 -0400"
      },
      "message": "Fix BytesMessage and Message interop failures across 4 shims\n\n- Python/JS receivers: handle non-bytes/Buffer body from JMS Data section\n- .NET receiver: return empty bytes for null BytesMessage body\n- JS sender: omit body for null type (Rhea encodes null as AmqpValue)\n- JMS receiver: use GsonBuilder().serializeNulls() to preserve null values\n- Test harness: defensive .get(\"value\") in compare_messages\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e6fca1535f91465226fb14052704bc5647de20b3",
      "tree": "471c8e16914cc628cbb493e423c99948fc5bf927",
      "parents": [
        "c79257760a509548b58fac0428aa275c4fcf8ff5"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 09:33:49 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Mon Aug 03 09:33:49 2026 -0400"
      },
      "message": "Phase 2c.1: Add BytesMessage and Message interop tests (55 → 99 tests)\n\nAdd BytesMessage (3 hex values × 11 star pairs \u003d 33 tests) and empty\nMessage (1 value × 11 pairs \u003d 11 tests). Refactor run_sender to accept\namqp_type/jms_type params. Add hex normalization for bytes comparison.\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c79257760a509548b58fac0428aa275c4fcf8ff5",
      "tree": "244f1252df72383b39470961bfbcc6a93945e805",
      "parents": [
        "c4b1f314a0642d2b2c59bfc4196f2c720d950c70"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 31 10:13:07 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 31 10:13:07 2026 -0400"
      },
      "message": "Restructure: JMS test matrix from N×N to star configuration (180 → 55 tests)\n\nCenter every test pair on the JMS client so only real JMS interop is tested,\nnot AMQP-to-AMQP with JMS annotations. Star pairs: JMS→AMQP, AMQP→JMS,\nJMS→JMS (11 pairs × 5 values).\n\nCo-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c4b1f314a0642d2b2c59bfc4196f2c720d950c70",
      "tree": "7d7dd98773b6b43d9019fe2261ac005e605be1f0",
      "parents": [
        "1b21705a49d5aad3dfb0a8875e629fb1cf638ac8"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 23:34:35 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 23:34:35 2026 -0400"
      },
      "message": "Phase 2b.5: Add Java ProtonJ2 JMS emulation\n\nComplete full 6×6 unified JMS interoperability test matrix (180 tests).\n\nChanges:\n- Java ProtonJ2 shim: Add --jms-mode flag support\n- Java sender: Add JMS message type annotation via message.annotation()\n- Java receiver: Detect and decode JMS TextMessage via hasAnnotation()/annotation()\n- Enable java-protonj2 in ENABLED_CLIENTS list\n\nTechnical details:\n- Used message.annotation(\"x-opt-jms-msg-type\", byte) for annotation\n- Used message.hasAnnotation() and annotation() for detection\n- Map AMQP string → JMS TextMessage (type 5)\n- Decode JMS TextMessage as type \u0027text\u0027\n\nTest results: 180/180 tests passing locally (6×6 matrix)\n- All 6 AMQP clients now support JMS TextMessage emulation\n- Full interoperability achieved across Python, JMS, JavaScript, C++, .NET, Java ProtonJ2\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "1b21705a49d5aad3dfb0a8875e629fb1cf638ac8",
      "tree": "c9203882d766eea9f5b1e732165303b23c1839c9",
      "parents": [
        "dcb654c53a8d7e0e5b5a91817872a808ae9f814a"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 23:05:12 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 23:05:12 2026 -0400"
      },
      "message": "Phase 2b.4: Add .NET Proton JMS emulation\n\nExpand JMS interop test matrix from 4×4 to 5×5 (125 tests).\n\nChanges:\n- .NET shim: Add --jms-mode flag support\n- .NET sender: Add JMS message type annotation via SetAnnotation()\n- .NET receiver: Detect and decode JMS TextMessage via HasAnnotation()/GetAnnotation()\n- Enable dotnet-proton in ENABLED_CLIENTS list\n\nTechnical details:\n- Used message.SetAnnotation(\"x-opt-jms-msg-type\", sbyte) for annotation\n- Used message.HasAnnotation() and GetAnnotation() for detection\n- Map AMQP string → JMS TextMessage (type 5)\n- Decode JMS TextMessage as type \u0027text\u0027\n\nTest results: 125/125 tests passing locally (5×5 matrix)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "dcb654c53a8d7e0e5b5a91817872a808ae9f814a",
      "tree": "74134523264ea156b36987de85f99ba9dc25264e",
      "parents": [
        "5f71c450ae5c395a2471442fe91cc356dde41ee3"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 22:34:45 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 22:34:45 2026 -0400"
      },
      "message": "Phase 2b.3: Add C++ Proton JMS emulation\n\nExpand JMS interop test matrix from 3×3 to 4×4 (80 tests).\n\nChanges:\n- C++ shim: Add --jms-mode flag support\n- C++ sender: Add JMS message type annotation (x-opt-jms-msg-type)\n- C++ receiver: Detect and decode JMS TextMessage\n- Enable cpp-proton in ENABLED_CLIENTS list\n\nTechnical details:\n- Used proton::annotation_key and proton::symbol for annotation key\n- Used annotation_map.put()/get()/exists() API instead of std::map\n- Map AMQP string → JMS TextMessage (type 5)\n- Decode JMS TextMessage as type \u0027text\u0027\n\nTest results: 80/80 tests passing locally (4×4 matrix)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "5f71c450ae5c395a2471442fe91cc356dde41ee3",
      "tree": "957ec9545acfc21395652be2c7beb8d7fbf737b5",
      "parents": [
        "7382d07b7ad51a86bf0fbbf19de71aa7829e7657"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 22:09:23 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 22:09:23 2026 -0400"
      },
      "message": "Phase 2b.2: Add JavaScript (Rhea) JMS emulation\n\nChanges:\n- JavaScript shim: Add --jms-mode flag support\n- Sender: Add JMS annotation with Symbol key and byte value\n- Receiver: Detect and decode JMS messages from annotation\n- Test: Enable javascript-rhea in ENABLED_CLIENTS (3×3 matrix)\n\nImplementation:\n- parseArgs: Support boolean flags (--jms-mode)\n- getJmsMessageType: Map AMQP types to JMS (string→5, binary→3, null→0)\n- Sender: message.message_annotations \u003d {[Symbol.for(\u0027x-opt-jms-msg-type\u0027)]: rhea.types.wrap_byte(5)}\n- decodeJmsMessage: Decode JMS TextMessage as type \u0027text\u0027\n\nTechnical Details:\n- Use Symbol.for() for annotation key (matches Qpid JMS Client)\n- Use rhea.types.wrap_byte() for value (byte, not ubyte)\n- Receiver checks multiple Symbol representations for compatibility\n\nTest Results (Local):\n- 45/45 tests pass (100%)\n- 3×3 client matrix × 5 text values\n- Python↔JMS↔JavaScript - all combinations working\n- Duration: ~54 seconds\n\nExpected Build #70:\n- AMQP: 364/450 (unchanged)\n- JMS: 45/45 (was 20/20 in Build #69)\n- Total: 409/495 (82.6%)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7382d07b7ad51a86bf0fbbf19de71aa7829e7657",
      "tree": "2c3a88b09351e71f54bb578c2b00c680773e11ad",
      "parents": [
        "67f55822e83a72472a90fc4981ce0d436b2a687c"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 21:01:09 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 21:01:09 2026 -0400"
      },
      "message": "Restructure: Unified JMS test matrix (2×2 → 6×6 incremental)\n\nChanges:\n- New test_jms_unified.py with N×N client matrix structure\n- Matches AMQP test_types.py pattern for consistency\n- Consolidates test_jms.py (baseline) + test_jms_interop.py (cross-client)\n- Phase 2b.1: Python + JMS enabled (2×2 \u003d 4 combinations)\n- Future: Incrementally add JS, C++, .NET, Java (→ 6×6 \u003d 36 combinations)\n\nStructure:\n- ENABLED_CLIENTS list for incremental activation\n- CLIENT_INFO metadata for each client\n- Single test function: test_jms_textmessage_interop\n- Parametrized: sender × receiver × text_value\n- Result: 2 × 2 × 5 \u003d 20 tests\n\nBenefits:\n✓ Consistent with AMQP tests (same matrix pattern)\n✓ JMS baseline preserved (JMS→JMS always in matrix)\n✓ No duplication (JMS→JMS tested once)\n✓ Incremental growth (enable 1 client at a time)\n✓ Clear reporting (single unified matrix)\n\nTest Breakdown (Phase 2b.1):\n- python-proton → python-proton (5 tests)\n- python-proton → jms (5 tests)\n- jms → python-proton (5 tests)\n- jms → jms (5 tests)\nTotal: 20 tests (was 15 in split structure)\n\nNote: Old test files (test_jms.py, test_jms_interop.py) will be\ndeprecated once Build #69 validates this structure.\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "67f55822e83a72472a90fc4981ce0d436b2a687c",
      "tree": "10c10811d94f6659c059acfeae34dd6aaa852cef",
      "parents": [
        "cebaae43670f3ae70fbd8f623e4adc0ec4a65178"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 20:25:47 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 20:25:47 2026 -0400"
      },
      "message": "Fix: Use symbol key and byte value for JMS annotations\n\nRoot Cause:\n- Python→JMS tests failing (0/5 messages received)\n- Used plain string \"x-opt-jms-msg-type\" instead of symbol()\n- Used ubyte(5) instead of byte(5)\n- Qpid JMS Client expects: {symbol(\"x-opt-jms-msg-type\"): byte(5)}\n\nFix (from QIT v1 working code):\n- Sender: msg.annotations \u003d {symbol(\"x-opt-jms-msg-type\"): byte(jms_type)}\n- Receiver: annotation_key \u003d symbol(\"x-opt-jms-msg-type\")\n- Import: from proton import byte, symbol (not ubyte)\n\nWhy This Matters:\n- AMQP annotations have typed keys (symbol vs string are different)\n- AMQP types matter: byte vs ubyte are encoded differently\n- Qpid JMS Client strictly matches this wire format\n\nReference: QIT v1 qit_jms_types.py create_annotation()\n\nExpected Build #68 Results:\n- Python→JMS: 5/5 passing (was 0/5)\n- JMS→Python: 5/5 passing (unchanged)\n- Python roundtrip: 5/5 passing (unchanged)\n- Total: 15/15 (100%)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "cebaae43670f3ae70fbd8f623e4adc0ec4a65178",
      "tree": "ba8d8939b90ef273a1198becbff0325feed8e09c",
      "parents": [
        "1467b20c5e73d62ee99a1097cca61b02d770f60c"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 19:44:34 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 19:44:34 2026 -0400"
      },
      "message": "Phase 2b: Add JMS emulation to Python shim\n\nChanges:\n- Python shim: Add --jms-mode flag for JMS message emulation\n- Python sender: Add x-opt-jms-msg-type annotation (maps string→TextMessage)\n- Python receiver: Detect and decode JMS messages from annotation\n- New test suite: test_jms_interop.py (Python↔JMS TextMessage tests)\n- Test helper: test_python_jms_mode.py (local validation script)\n\nImplementation:\n- JMS message type constants: MESSAGE(0), BYTES(3), TEXT(5)\n- Sender maps AMQP types to JMS: string→TEXT, binary→BYTES, null→MESSAGE\n- Receiver decodes JMS annotation and returns type \u0027text\u0027 for TextMessage\n- Backward compatible: JMS mode is opt-in via --jms-mode flag\n\nTest Coverage:\n- 15 test cases: Python→JMS, JMS→Python, Python↔Python roundtrip\n- 5 text values: empty, ASCII, quotes, Unicode, long text\n- Validates type conversion and value preservation\n\nPhase 2b.1: Python↔JMS (TextMessage only) ✅ READY\nPhase 2b.2: Other AMQP clients (deferred)\nPhase 2b.3: Other message types (deferred)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "1467b20c5e73d62ee99a1097cca61b02d770f60c",
      "tree": "214fc72a732feabfd0e3761b5b3d52b258d7d35e",
      "parents": [
        "8296ac9ec0b4e4b126efc1b26e8aaa0b1e4e370c"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 18:49:11 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 18:49:11 2026 -0400"
      },
      "message": "Update .gitignore: exclude JMS shim build artifacts\n\nIssue: shims/java-qpid-jms/target/ files were being tracked in git\nand showing as modified after rebuilds.\n\nFix:\n- Added shims/java-qpid-jms/target/ to .gitignore\n- Removed previously-committed build artifacts from git tracking\n\nBuild artifacts (compiled .class files and JAR files) should not\nbe tracked in git as they are generated by Maven during build.\nJenkins will rebuild them fresh for each build.\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "8296ac9ec0b4e4b126efc1b26e8aaa0b1e4e370c",
      "tree": "18b4894c7a0f269b30b63a3998b27b2bd1a0670c",
      "parents": [
        "7713a21a3db4e260b108644573d6e3b98ceba37c"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 18:43:35 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 18:43:35 2026 -0400"
      },
      "message": "Fix: Handle Long.MIN_VALUE in parseNumber()\n\nIssue: Build #65 - 3 JMS tests failed with NumberFormatException\nwhen parsing -0x8000000000000000 (Long.MIN_VALUE).\n\nRoot Cause: The value -0x8000000000000000 has an absolute value\nof 0x8000000000000000 (9223372036854775808), which exceeds\nLong.MAX_VALUE (9223372036854775807). The code was trying to\nparse the hex part as a signed long, then negate it, which fails.\n\nSolution: Use Long.parseUnsignedLong() for the hex part, then\nnegate the result. This correctly handles Long.MIN_VALUE where\nthe absolute value exceeds Long.MAX_VALUE.\n\nFailed Tests (Build #65):\n- test_jms_bytesmessage\n- test_jms_mapmessage\n- test_jms_streammessage\n\nAll failed on the same value: -0x8000000000000000\n\nExpected: Build #66 will have 16/16 JMS tests passing (100%)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7713a21a3db4e260b108644573d6e3b98ceba37c",
      "tree": "517bdc4b824d330561d72fcb217e4743cf8407c4",
      "parents": [
        "3873d35d74662dac56e8cbba13032fb264a1237b"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 16:30:15 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 16:30:15 2026 -0400"
      },
      "message": "Phase 2: Add JMS interoperability testing\n\nImplements JMS message types, headers, and properties testing.\n\nNew Components:\n- JMS shim (Java Qpid JMS Client 2.5.0)\n  - Supports all 5 JMS message types\n  - Supports JMS headers (CorrelationID, ReplyTo, Type)\n  - Supports 8 application property types\n  - Uses Jakarta JMS API (jakarta.jms.*)\n  - Fat JAR: 5.1MB with dependencies\n\n- JMS test suite (test_jms.py)\n  - 16 pytest test cases\n  - Message types: Message, BytesMessage, MapMessage, StreamMessage, TextMessage\n  - Headers: JMSCorrelationID, JMSReplyTo, JMSType\n  - Properties: boolean, byte, short, int, long, float, double, string\n  - Test matrices based on QIT v1 patterns\n\nPhase 2a Status:\n- JMS→JMS baseline testing (self-test)\n- Maven build with Google Mirror (avoids rate limiting)\n- Integrated with QIT 2.0 pytest framework\n\nFiles:\n- shims/java-qpid-jms/pom.xml\n- shims/java-qpid-jms/src/main/java/org/apache/qpid/qit/JmsSender.java\n- shims/java-qpid-jms/src/main/java/org/apache/qpid/qit/JmsReceiver.java\n- shims/java-qpid-jms/sender.sh\n- shims/java-qpid-jms/receiver.sh\n- tests/test_jms.py\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "3873d35d74662dac56e8cbba13032fb264a1237b",
      "tree": "9b20994d66205b88a4849c59f946d306cfb964d8",
      "parents": [
        "aafd56f19c464897432a37dcebe78ad04c5d5e07"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 15:11:05 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 15:11:05 2026 -0400"
      },
      "message": "Fix Python shim char decoding bug\n\nPython receiver fails to parse char values from other shims.\nHandle three cases for char values:\n- Empty string or \\x00 escape → code point 0\n- Single character → use ord() to get code point\n- Numeric string → parse as int\n\nFixes 4 test failures where Java/C++/.NET send to Python receiver.\n\nPrevious fix attempt was in Java encoder (wrong side).\nThe issue was Python decoder failing with:\n\u0027invalid literal for int() with base 10: \\x00\u0027\n"
    },
    {
      "commit": "aafd56f19c464897432a37dcebe78ad04c5d5e07",
      "tree": "5887f4efd81201641f6910f1156ba05ca7c7adcf",
      "parents": [
        "fcebaede8b56e0c35d958e69ffbf58305b3af4ac"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 14:53:11 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Fri Jul 17 14:53:11 2026 -0400"
      },
      "message": "Fix shim bugs: JavaScript null handling and Java char encoding\n\nJavaScript Rhea (shim.js):\n- Fix TypeError when testValue is null\n- Add null check before accessing testValue.value property\n- Fixes 6 test failures for null type\n\nJava ProtonJ2 (TypeCodec.java):\n- Fix char decoding to handle null character (\\x00)\n- Handle three cases: empty string, single char, numeric code point\n- Fixes 4 test failures for char type\n\nExpected improvement: 361/450 → 371/450 (82.4% pass rate)\n"
    },
    {
      "commit": "fcebaede8b56e0c35d958e69ffbf58305b3af4ac",
      "tree": "f5eca4fd9910a21e56a95a6bbe9b4a15ed3a074e",
      "parents": [
        "fe5e1877dc4255525743718a89d8e556153a5d0b"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Thu Jul 16 12:17:54 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Thu Jul 16 12:17:54 2026 -0400"
      },
      "message": "Fix .gitignore to allow pom.xml files\n\nThe *.xml pattern in .gitignore was preventing pom.xml from being\ncommitted. Changed to only ignore test result XML files while\nexplicitly allowing pom.xml files with ! negation pattern.\n\nAdded missing shims/java-protonj2/pom.xml which is required for\nMaven build of Java ProtonJ2 shim.\n"
    },
    {
      "commit": "fe5e1877dc4255525743718a89d8e556153a5d0b",
      "tree": "bce3f5ab3ac20ce3cc1c58f6200ad2c63258f54c",
      "parents": [
        "727e79a819e80d6de8e78989ace772ea24630572"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 16:02:07 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 16:02:07 2026 -0400"
      },
      "message": "Remove Jenkins-specific files from public repository\n\nJenkins configuration moved to internal GitLab repository:\nhttps://gitlab.cee.redhat.com/messaging/qpid-interop-test-2.0.git\n\nRemoved:\n- Jenkinsfile (contains internal references)\n- .jenkins/ directory (internal setup docs)\n- CI_CD_SETUP.md (Jenkins-specific configuration)\n- CI_CD_INTEGRATION_SUMMARY.md (internal references)\n\nKept public-useful features:\n- JUnit XML output support (--junit-xml option)\n- Local testing scripts (scripts/run-ci-locally.sh)\n- Architecture proposals\n- README with CI/CD overview\n\nThe JUnit XML feature remains available for any CI/CD system,\nnot just Jenkins.\n"
    },
    {
      "commit": "727e79a819e80d6de8e78989ace772ea24630572",
      "tree": "3d25b4f2979aaa28c830bad2da8291f13c5a9142",
      "parents": [
        "7c8060114a4ee3bfbec8ef49dd55894d24b423e1",
        "af03691a458bf52faeb0b40713727a1e21472e22"
      ],
      "author": {
        "name": "Kim van der Riet",
        "email": "kpvdr@users.noreply.github.com",
        "time": "Wed Jul 15 15:22:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 15:22:38 2026 -0400"
      },
      "message": "Merge pull request #1 from kpvdr/cicd-pipeline\n\nCicd pipeline"
    },
    {
      "commit": "af03691a458bf52faeb0b40713727a1e21472e22",
      "tree": "3d25b4f2979aaa28c830bad2da8291f13c5a9142",
      "parents": [
        "f624bb7facd3dc7b89b4f64e33a28a88aa82af66"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 14:47:10 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 14:47:10 2026 -0400"
      },
      "message": "Add architecture proposal for concurrent execution\n\nDocumentation for future enhancement to run sender/receiver concurrently\nin receiver-first pattern to improve test performance.\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f624bb7facd3dc7b89b4f64e33a28a88aa82af66",
      "tree": "c82dd15d4c6eb572a096661356c48da285b90d63",
      "parents": [
        "7c8060114a4ee3bfbec8ef49dd55894d24b423e1"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 14:46:45 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 14:46:45 2026 -0400"
      },
      "message": "Add CI/CD pipeline with JUnit XML reporting\n\nImplements complete Jenkins pipeline for automated testing:\n\n**JUnit XML Reporting:**\n- New generate_junit_xml() method in Orchestrator\n- CLI --junit-xml option for CI integration\n- Standard format compatible with Jenkins/CI tools\n- Detailed failure information with message diffs\n- Test duration tracking\n\n**Jenkins Pipeline (Jenkinsfile):**\n- 6 stages: Preparation → Setup → Build → Broker → Test → Cleanup\n- Parallel shim builds (JavaScript, C++, .NET, Java)\n- Automatic broker lifecycle with Docker Compose\n- JUnit test result publishing and trending\n- Test artifact archiving (30 builds retained)\n- Graceful handling of missing build tools\n- 10-15 minute execution time\n\n**Documentation:**\n- CI_CD_SETUP.md - Complete setup guide (400+ lines)\n- .jenkins/README.md - Quick reference\n- CI_CD_INTEGRATION_SUMMARY.md - Integration summary\n\n**Local Testing:**\n- scripts/run-ci-locally.sh - Simulates full CI pipeline\n- Color-coded output, prerequisite checks\n- One command to test everything locally\n\n**Features:**\n✅ 450 tests executed automatically\n✅ JUnit XML for trending and analysis\n✅ Parallel builds for speed\n✅ Zero manual setup - broker, shims, all automated\n✅ Works even if some build tools missing\n✅ Coexists with QIT 1.0 pipelines\n\nTested and verified:\n- JUnit XML generation (passing and failing tests)\n- Local simulation script runs end-to-end\n- All documentation complete\n\nReady for Jenkins deployment.\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "7c8060114a4ee3bfbec8ef49dd55894d24b423e1",
      "tree": "ff3c259421549aea4a610f3c148085ed55c75799",
      "parents": [
        "f8ccd9482e26910289cc60b921df090845f0a92b"
      ],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 14:46:08 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 14:46:08 2026 -0400"
      },
      "message": "Add .NET and Java shims, expand to 5 languages\n\n- .NET Apache Qpid Proton shim (C# 12, .NET 8)\n  * Perfect type detection via reflection\n  * Clean build in \u003c1 second\n  * 100% self-compatibility\n\n- Java ProtonJ2 shim\n  * Maven-based build\n  * Working type detection\n\nTest matrix expanded:\n- 450 tests (18 types × 5 senders × 5 receivers)\n- 80.2% pass rate (361/450 passing)\n- All failures are known library limitations\n\nLanguages tested:\n1. Python (Proton)\n2. JavaScript (Rhea)\n3. C++ (Proton)\n4. .NET (Proton) ← NEW\n5. Java (ProtonJ2) ← NEW\n\nThe .NET shim demonstrates excellent cross-compatibility (72-89%)\nwith other shims and perfect self-compatibility.\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f8ccd9482e26910289cc60b921df090845f0a92b",
      "tree": "184172c2a77a5e7ff0ac15096c91f9c99a9b46e5",
      "parents": [],
      "author": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 14:45:49 2026 -0400"
      },
      "committer": {
        "name": "QIT Development Team",
        "email": "qit-dev@example.com",
        "time": "Wed Jul 15 14:45:49 2026 -0400"
      },
      "message": "Initial commit: QIT 2.0 core framework\n\n- Modern Python framework with orchestrator, shims, type system\n- 3 working shims: Python Proton, JavaScript Rhea, C++ Proton\n- Docker Compose broker management (Apache Artemis)\n- CLI interface with automatic shim discovery\n- 18 AMQP primitive types with comprehensive test values\n- Type-aware message comparison engine\n- 162 tests (18 types × 3 senders × 3 receivers)\n- 82.7% pass rate with all failures documented\n\nMajor improvements over QIT 1.0:\n- Receivers detect types instead of being told (exposes real issues)\n- Modern packaging with uv\n- Automated broker lifecycle\n- Clean architecture with separation of concerns\n- JavaScript type detection fix (monkey-patch solution)\n\nCo-Authored-By: Claude Sonnet 4.5 \u003cnoreply@anthropic.com\u003e\n"
    }
  ]
}
