)]}'
{
  "log": [
    {
      "commit": "d61a0cdaaa6e4ca3f56073603e77da730576a08c",
      "tree": "ea72c489fd79d2a07146d4daeb2d3f158ef13c1a",
      "parents": [
        "70796c029363919bed195871ee563393c9904d22"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Thu Oct 22 09:38:56 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Oct 22 13:49:04 2026 +0200"
      },
      "message": "Fix #1: Move Maven groupId to org.apache.camel\n"
    },
    {
      "commit": "70796c029363919bed195871ee563393c9904d22",
      "tree": "9e47c9e173febcceb82cf5669996cc0f93bd13cc",
      "parents": [
        "0f0016cb5f7df2f1cd099785b0b52a3ec82ba388"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Thu Oct 22 09:33:43 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Oct 22 10:05:22 2026 +0200"
      },
      "message": "chore: route issue notifications to commits@camel.apache.org\n"
    },
    {
      "commit": "0f0016cb5f7df2f1cd099785b0b52a3ec82ba388",
      "tree": "ba620b30c5dfa1f2e264ecfadbcb41df32b361a6",
      "parents": [
        "d4e681f66cbb8b849e053e9dbfe591c1131a4ffa"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Wed Oct 21 14:09:25 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Wed Oct 21 14:09:25 2026 +0200"
      },
      "message": "Fixed .asf.yaml error\n\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "d4e681f66cbb8b849e053e9dbfe591c1131a4ffa",
      "tree": "c18685354998e05aacf33cae3a8710afffcc0f12",
      "parents": [
        "6fc50b29905fd730367fe18ab8b8d3ef4ff9e2b2"
      ],
      "author": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Wed Oct 21 14:08:22 2026 +0200"
      },
      "committer": {
        "name": "Andrea Cosentino",
        "email": "ancosen@gmail.com",
        "time": "Wed Oct 21 14:08:22 2026 +0200"
      },
      "message": "Added .asf.yaml\n\nSigned-off-by: Andrea Cosentino \u003cancosen@gmail.com\u003e\n"
    },
    {
      "commit": "6fc50b29905fd730367fe18ab8b8d3ef4ff9e2b2",
      "tree": "9c6ca26c163dabd2452454c4ed123a48ebab30e2",
      "parents": [
        "b23c715082eb91f6d49378abaf62be82f5cdd516"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Tue Oct 20 20:29:56 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 21 11:30:46 2026 +0200"
      },
      "message": "fix #245:conditional instructions in the generated custom_modes.yaml\n"
    },
    {
      "commit": "b23c715082eb91f6d49378abaf62be82f5cdd516",
      "tree": "c7aea2a2ffb5f2fb1f1078d0c33370170625fd1e",
      "parents": [
        "20f9034b8677792ea08ccea3c6b27ebff2079294"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Tue Oct 20 17:13:21 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 21 11:30:46 2026 +0200"
      },
      "message": "fix #245: scope Bob execute-mode plan orchestration to /camel-execute\n"
    },
    {
      "commit": "20f9034b8677792ea08ccea3c6b27ebff2079294",
      "tree": "c925a3c136797a35bb21afc7091cfd8f5c3b09ae",
      "parents": [
        "6b5b882216523b7a519a25fd1fea6be396ee9034"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Tue Oct 20 09:14:27 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 21 11:30:46 2026 +0200"
      },
      "message": "fix #245: Address Copilot primary instructions and Bob2 mode routing\n"
    },
    {
      "commit": "6b5b882216523b7a519a25fd1fea6be396ee9034",
      "tree": "03952d9fe2ec5e824edf21a24a00840d53660571",
      "parents": [
        "d42b0bc5fd6730b272e6f906b3a32eb14404437b"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Mon Oct 19 15:31:58 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 21 11:30:46 2026 +0200"
      },
      "message": "fix #245: Address all reviewer feedback\n"
    },
    {
      "commit": "d42b0bc5fd6730b272e6f906b3a32eb14404437b",
      "tree": "14ee750fc94ad34a9a831f77028b4a2117011b64",
      "parents": [
        "a9105cf8de7c61245c8c2f1805ef664c45b8a7c7"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Mon Oct 19 11:53:38 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 21 11:30:46 2026 +0200"
      },
      "message": "fix #245: Address sourcery findings for direct mode ssafety and correctness\n"
    },
    {
      "commit": "a9105cf8de7c61245c8c2f1805ef664c45b8a7c7",
      "tree": "2d154b108b587f822c584314fe864cafded2090a",
      "parents": [
        "018d896de95fe27b00135348e8cea1a8b67f03ac"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Mon Oct 19 11:45:36 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 21 11:30:46 2026 +0200"
      },
      "message": "fix #245: Address sourcery findings for direct mode ssafety and correctness\n"
    },
    {
      "commit": "018d896de95fe27b00135348e8cea1a8b67f03ac",
      "tree": "354983e486539491718775c1148544dc8927e332",
      "parents": [
        "eb4f0338c24c772458eeafe32c0151451c43404f"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Mon Oct 19 11:28:57 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 21 11:30:46 2026 +0200"
      },
      "message": "fix #245: Add camel-migrate direct mode for concrete deliverable requests\n"
    },
    {
      "commit": "eb4f0338c24c772458eeafe32c0151451c43404f",
      "tree": "c7f8d372dedaf6bd96341ad0e22faaf5157c6194",
      "parents": [
        "ce4da8e7f89d9c950012281f69d846eaf118ca4a"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Tue Oct 20 09:53:32 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Oct 20 13:45:00 2026 +0200"
      },
      "message": "fix #246: Add cross-target regression test for Rule 9 and Rule 15 semantics\n"
    },
    {
      "commit": "ce4da8e7f89d9c950012281f69d846eaf118ca4a",
      "tree": "1eacf0e54648a9c86b3b6ff427eed579505ac0f6",
      "parents": [
        "d6f3426ef6493a48062ad77f3c78bebe65d4ebfa"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Tue Oct 20 09:35:30 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Oct 20 13:45:00 2026 +0200"
      },
      "message": "fix #246: Add cross-target regression test for Rule 9 and Rule 15 semantics\n"
    },
    {
      "commit": "d6f3426ef6493a48062ad77f3c78bebe65d4ebfa",
      "tree": "62f53c599b8c85f5a53b8c25d326b569a5dd69d6",
      "parents": [
        "5493c8d679d4f6ee0819bfdb7f1aa1a841e7d360"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Mon Oct 19 12:46:59 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Oct 20 13:45:00 2026 +0200"
      },
      "message": "fix #246: Apply optional reviewer nits for rules 9 and 15\n"
    },
    {
      "commit": "5493c8d679d4f6ee0819bfdb7f1aa1a841e7d360",
      "tree": "71f10399d833cae0d6e5bfb7c66772b7839d3876",
      "parents": [
        "311f2282d1d0be215c6c5a825e4ef6484fbbcceb"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Thu Oct 15 12:22:22 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Oct 19 09:41:12 2026 +0200"
      },
      "message": "fix #244:update stale CLAUDE.md description and add Ship qualifier to shared AGENTS.md\n"
    },
    {
      "commit": "311f2282d1d0be215c6c5a825e4ef6484fbbcceb",
      "tree": "c82223c631140f8e9a264a6d4193f33376850d59",
      "parents": [
        "3b796c31db85ecab524ad761f4b45f0105cfe119"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Wed Oct 14 23:08:42 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Oct 19 09:41:12 2026 +0200"
      },
      "message": "fix #244: import AGENTS.md in CLAUDE.md and make Ship opt-in\n"
    },
    {
      "commit": "3b796c31db85ecab524ad761f4b45f0105cfe119",
      "tree": "696b3b4409308fcdc71edce756bbaf732c849503",
      "parents": [
        "547071eaed5c888836720e929216db5205b0b46f"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Wed Oct 14 14:51:45 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 14 16:52:18 2026 +0200"
      },
      "message": "fix: use effective ValidateDocument after receive-location overrides (#247)\n"
    },
    {
      "commit": "547071eaed5c888836720e929216db5205b0b46f",
      "tree": "47c9cd71eded8edc45bc43e5d387a0012850d960",
      "parents": [
        "a5f3a161901e357b218b4ef67372630e8ded7f64"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Wed Oct 14 13:29:59 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 14 16:52:18 2026 +0200"
      },
      "message": "fix: address sourcery review — validator ordering, standalone validator, .btp settings, security flag, split qualifier (#247)\n"
    },
    {
      "commit": "a5f3a161901e357b218b4ef67372630e8ded7f64",
      "tree": "f717fed64a8ed301f9207bd8e89738065ab58d30",
      "parents": [
        "d7f65fb45ca5d6959e26ddda87b1bf40d6d63efb"
      ],
      "author": {
        "name": "Jinal Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Wed Oct 14 13:04:37 2026 +0100"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 14 16:52:18 2026 +0200"
      },
      "message": "fix: correct XMLReceive pipeline mapping — validation is conditional on ValidateDocument (#247)\n"
    },
    {
      "commit": "d7f65fb45ca5d6959e26ddda87b1bf40d6d63efb",
      "tree": "e5e42997c62f012c43edb363334b523b9e243645",
      "parents": [
        "448ebd57fed614c71a96e2948a35daa303b43d32"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Wed Oct 14 14:32:07 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Oct 14 14:38:54 2026 +0200"
      },
      "message": "[chore]: Request owner review with CODEOWNERS\n"
    },
    {
      "commit": "448ebd57fed614c71a96e2948a35daa303b43d32",
      "tree": "0ad8417c22f8ebbe7f59737a0274793abf31a184",
      "parents": [
        "f213aea07269f0020354a9093f4fd3f7dca90456"
      ],
      "author": {
        "name": "Jinal-Sarvaiya",
        "email": "jinal.sarvaiya@ibm.com",
        "time": "Tue Oct 13 17:15:02 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 18:15:02 2026 +0200"
      },
      "message": "Add native OpenAI Codex CLI execution for Ship (#241)\n\n* integrate native subagents for OpenAI Codex CLI\n\n* Fix stale Codex agent count in architecture docs\n\n* Address review findings: verify effective child isolation and reject unsupported native backend\n\n* fix: revise Codex Ship contract\n\n* fix: remove blanket command prohibition from native EXECUTE prompt"
    },
    {
      "commit": "f213aea07269f0020354a9093f4fd3f7dca90456",
      "tree": "0976904043694412c92166a0a2ddc6f784cded2c",
      "parents": [
        "871abbc5535650c5c348abef6bf02b12ffd2fa49"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Fri Oct 09 17:54:55 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Oct 13 09:48:50 2026 +0200"
      },
      "message": "Move workflow examples to camel-kit-examples\n"
    },
    {
      "commit": "871abbc5535650c5c348abef6bf02b12ffd2fa49",
      "tree": "7ff6bde2e1b88f89f11cf6fe8989dd799d1eca3e",
      "parents": [
        "72d77e04f4237bb04cd199ae89b1635345e60e85"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 21 16:39:34 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 21 16:39:34 2026 +0200"
      },
      "message": "Resume Camel Kit 0.4.2-SNAPSHOT after Knowledge 0.0.2 alignment\n"
    },
    {
      "commit": "72d77e04f4237bb04cd199ae89b1635345e60e85",
      "tree": "f3ace08af98ec7fe3421782f393509659b917d81",
      "parents": [
        "d59faad390dfa8d88ba51e030f6845378f63aced"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 21 16:24:32 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 21 16:24:32 2026 +0200"
      },
      "message": "Include Knowledge 0.0.2 in Camel Kit 0.4.1 release\n"
    },
    {
      "commit": "d59faad390dfa8d88ba51e030f6845378f63aced",
      "tree": "d778c477356a37c5c4c081b89ce9a640ff2cd07a",
      "parents": [
        "bbd7bc972935ab7002b927596d5bf2f9a6d9ef5e"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 21 15:01:25 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 21 15:01:25 2026 +0200"
      },
      "message": "Start Camel Kit 0.4.2-SNAPSHOT development\n"
    },
    {
      "commit": "bbd7bc972935ab7002b927596d5bf2f9a6d9ef5e",
      "tree": "5abdf8c586be2f08e61090980e559f27c807ca0f",
      "parents": [
        "689256ed4a2086297ce5b424cb06831e22583376"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 21 14:50:17 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 21 14:50:17 2026 +0200"
      },
      "message": "Include Forage 1.6.1 in the Camel Kit 0.4.1 release\n"
    },
    {
      "commit": "689256ed4a2086297ce5b424cb06831e22583376",
      "tree": "4458501e23ed5db687264412031541d751318cc9",
      "parents": [
        "0f2d7be624422da42d82353889f5b899ebe3d0f3"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Fri Sep 18 14:17:42 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Fri Sep 18 14:17:42 2026 +0200"
      },
      "message": "Prepare Camel Kit 0.4.1 release with Camel 4.22.1\n"
    },
    {
      "commit": "0f2d7be624422da42d82353889f5b899ebe3d0f3",
      "tree": "1c72fd2352f3a28567fc7c9c6bc5795167a8ef6d",
      "parents": [
        "b585787d40ee1642d1231f70d2db569bbf6c2c1f"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Fri Sep 18 10:47:18 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Fri Sep 18 11:13:16 2026 +0200"
      },
      "message": "Fix #238: align bean guidance and test fixtures\n"
    },
    {
      "commit": "b585787d40ee1642d1231f70d2db569bbf6c2c1f",
      "tree": "379e67638621c250094d19f9a5ceec363cd0b541",
      "parents": [
        "c9d99c0a247a2b15d336b72700beedb5615ba13d"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Fri Sep 18 09:46:27 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Fri Sep 18 11:13:16 2026 +0200"
      },
      "message": "Fix #238: prefer verified declarative bean construction\n"
    },
    {
      "commit": "c9d99c0a247a2b15d336b72700beedb5615ba13d",
      "tree": "09739397d8fded590055f498de2d1b0f3f54b66e",
      "parents": [
        "d0e0867ba540a32ef1f2ba95971d01b065b7aaa9"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 15 13:34:50 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 15 13:34:50 2026 +0200"
      },
      "message": "Start Camel Kit 0.4.1-SNAPSHOT development\n"
    },
    {
      "commit": "d0e0867ba540a32ef1f2ba95971d01b065b7aaa9",
      "tree": "ea332a5180af44dee82b2fda2dcc56f1a55db3c9",
      "parents": [
        "854f3f10cce1cff333efc87ae0759600faac06c8"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 15 12:40:56 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 15 12:40:56 2026 +0200"
      },
      "message": "Prepare Camel Kit 0.4.0 release\n"
    },
    {
      "commit": "854f3f10cce1cff333efc87ae0759600faac06c8",
      "tree": "793f10dc33816f71ec350a0eac4cba19b4f6a929",
      "parents": [
        "5efdd55fa29903bb087e1906bb2abead23289d23"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 15 10:52:04 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 15 10:58:48 2026 +0200"
      },
      "message": "[chore]: Consolidate unreleased changelog\n"
    },
    {
      "commit": "5efdd55fa29903bb087e1906bb2abead23289d23",
      "tree": "2b0cd06e9ac97e3a9e426cf7ffeb1c3c13cf57d5",
      "parents": [
        "b27d3f380d375d05595114193e13054586c356fe"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 14 17:00:27 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Sep 14 17:09:49 2026 +0200"
      },
      "message": "[ci]: Migrate GitHub Actions to Node 24\n"
    },
    {
      "commit": "b27d3f380d375d05595114193e13054586c356fe",
      "tree": "05873cb8800d75694fbd10235a5535a1d80b4f86",
      "parents": [
        "679fbe60233b6af042056aea482ca14da361a5d0"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 14 15:39:42 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Sep 14 15:55:13 2026 +0200"
      },
      "message": "[chore]: Address Ship preview wording review\n"
    },
    {
      "commit": "679fbe60233b6af042056aea482ca14da361a5d0",
      "tree": "4967fb2ab2c44d1d4f2193e5da0de08970f96a1e",
      "parents": [
        "d5be28eca3659626468eca43cd1703ffff088da6"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 14 14:22:03 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Sep 14 15:55:13 2026 +0200"
      },
      "message": "[chore]: Mark Camel Ship as Technology Preview\n"
    },
    {
      "commit": "d5be28eca3659626468eca43cd1703ffff088da6",
      "tree": "6c3fc229936ca2e52367ad449ef16bab2f2ca198",
      "parents": [
        "393d72ab9b1aadfbd962c4f2c23bd4f54c22aaf8"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Thu Sep 10 13:33:43 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Sep 10 13:51:00 2026 +0200"
      },
      "message": "Pin Ship execution-mode host labels as persisted values\n"
    },
    {
      "commit": "393d72ab9b1aadfbd962c4f2c23bd4f54c22aaf8",
      "tree": "6f30498a868cf55577a7f975b28a2f97ebfc1aae",
      "parents": [
        "29d675464fd5a9e1e2a0a44ed9de191dd1ddc01b"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Thu Sep 10 10:05:44 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Sep 10 13:51:00 2026 +0200"
      },
      "message": "Add native Claude Code execution for Ship (#222)\n"
    },
    {
      "commit": "29d675464fd5a9e1e2a0a44ed9de191dd1ddc01b",
      "tree": "232d00c7a5a371a4546f8310c2e39afbb45e4932",
      "parents": [
        "e3d6851d4c6be604b90f87e4dfecb04e9257edf8"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Thu Sep 10 07:55:09 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Sep 10 08:19:35 2026 +0200"
      },
      "message": "fix: address PR #231 review nits\n"
    },
    {
      "commit": "e3d6851d4c6be604b90f87e4dfecb04e9257edf8",
      "tree": "f17d0e7637c750c6897eac0e3978f04915fab303",
      "parents": [
        "69c025c05b77208747072770e3b264dace688082"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Wed Sep 09 23:04:53 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Sep 10 08:19:35 2026 +0200"
      },
      "message": "Add native Copilot CLI execution for Ship (#226)\n"
    },
    {
      "commit": "69c025c05b77208747072770e3b264dace688082",
      "tree": "bf7b2810bf0cfd6d6ac97698aeda1fae9e393fef",
      "parents": [
        "3a0f9c08eb832f83634dcd5117c11c8550fefa1a"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Wed Sep 09 17:39:31 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Sep 09 18:07:39 2026 +0200"
      },
      "message": "Fix Ship dependency JAR names during validation (#223)\n"
    },
    {
      "commit": "3a0f9c08eb832f83634dcd5117c11c8550fefa1a",
      "tree": "a0f94b75b18d8b54f76a93995511dfe0be168b94",
      "parents": [
        "3f7c7a189575ba70ede8daa58f8764ae6cb65850"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Wed Sep 09 15:37:04 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Sep 09 18:07:39 2026 +0200"
      },
      "message": "Fix Bob native Ship relay diagnostics and recovery (#223)\n"
    },
    {
      "commit": "3f7c7a189575ba70ede8daa58f8764ae6cb65850",
      "tree": "2a121ed0041dd9cddb2abae3c6813b29120aa985",
      "parents": [
        "9fa9771e15b3648b999883c4005de9f6383061b4"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Wed Sep 09 13:03:48 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Sep 09 18:07:39 2026 +0200"
      },
      "message": "Add Bob 2 native Ship controller handoff (#223)\n"
    },
    {
      "commit": "9fa9771e15b3648b999883c4005de9f6383061b4",
      "tree": "a641a62ab90f0a68afdbe4281379bd7ff67e53cd",
      "parents": [
        "82699fea1875a24c8771cb2f7ebf16e46ddc0484"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 08 20:10:59 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 20:18:32 2026 +0200"
      },
      "message": "fix: reject duplicate OpenCode project configuration keys\n\nDuplicate JSONC members could hide stale MCP entries, survive forced\nreinitialization and make Doctor report a healthy configuration.\n\nEnable duplicate detection in the shared JSONC parser so initialization and\nDoctor reject ambiguous keys in every OpenCode project configuration layer.\nKeep valid cross-file overrides and Antigravity validation intact, and name\nthe offending file and key with repair guidance.\n\nCover root and nested duplicates across all four configuration paths with\nregressions that verify no workspace writes and no misleading Doctor PASS.\nAlign the Antigravity MCP comment in the documented project tree.\n"
    },
    {
      "commit": "82699fea1875a24c8771cb2f7ebf16e46ddc0484",
      "tree": "674833ba82dfbca7b102e606301d4bdeade76e97",
      "parents": [
        "89f95c47c9e5afe735c992b370533296dfb62209"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 08 16:30:59 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 20:18:32 2026 +0200"
      },
      "message": "feat: replace Gemini with Antigravity and retire Bob 1\n\nMove the Google target to Antigravity\u0027s native skills, agents and MCP\nconfiguration while keeping Bob 2 as the default. Retired Gemini and\nBob 1 target names now provide migration guidance.\n\nPreserve custom MCP entries and Gemini rules during reinitialization.\nReject ambiguous duplicate MCP keys before writes and in Doctor so\ninvalid configuration cannot silently pass verification. Reuse shared\natomic writes and preserve custom text during legacy import removal.\n\nDocument supported inheritance, native paths and migration requirements.\n"
    },
    {
      "commit": "89f95c47c9e5afe735c992b370533296dfb62209",
      "tree": "499c10cd90b0d7c5c7496d6ef8add0276002c870",
      "parents": [
        "4b5533591547af17bd3dfd8e2516c1281e852e1f"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 14:14:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 08 14:14:04 2026 +0200"
      },
      "message": "[chore]: update Quarkus platform to 3.33.3.2 (#219)\n\nAlign generated Quarkus projects with the published platform BOM: Camel 4.18.3, platform 3.33.3.2, and Forage 1.4.0. Update supported-version mappings, configuration examples, documentation, and the changelog.\n\nCloses #219"
    },
    {
      "commit": "4b5533591547af17bd3dfd8e2516c1281e852e1f",
      "tree": "d1a8033c8cc653cb67ca1f184c5d9731515ec85d",
      "parents": [
        "2bb79b73b0ac5e6c248510798eb3889d4bd26688"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 08 12:25:24 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 12:40:28 2026 +0200"
      },
      "message": "Fix #217: refuse Git boundaries that a colon-containing path cannot express\n\nGit reads GIT_CEILING_DIRECTORIES as a colon-separated list, so a ceiling\nwhose path contains \u0027:\u0027 silently leaves discovery unbounded.\n\n- Move the ceiling helper to ShipTreePolicy and make it refuse a ceiling\n  path containing \u0027:\u0027 instead of launching unbounded; the local command\n  runner, the Execute Pi worker and the evidence runner all go through it.\n- Reject a project path containing \u0027:\u0027 at start (project-invalid) and a\n  state root containing \u0027:\u0027 before creating anything (state-root-invalid),\n  and deny \u0027:\u0027 in the tree policy\u0027s root lineage.\n- Native git regression with a colon-containing ancestor through both\n  runner environment paths; refusal tests for the worker, the evidence\n  sandbox, the snapshot root, the controller and the store.\n"
    },
    {
      "commit": "2bb79b73b0ac5e6c248510798eb3889d4bd26688",
      "tree": "8a60e04e5cb8e9e7b2f9dbd656ef20d51e8e3295",
      "parents": [
        "5accbe91b5d8dc0e1c4e9385dc1efa44ef031b1f"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 08 11:32:01 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 12:40:28 2026 +0200"
      },
      "message": "Fix #217: bound Git discovery, enforce the ignore rule and keep journals recoverable\n\nAddress the review of the project-local Ship state:\n\n- Bound Git discovery with GIT_CEILING_DIRECTORIES for the Execute Pi\n  worker, the local command runner and the frozen validation snapshot, so\n  Git commands inside the nested staged workspace cannot reach the live\n  repository. Native git regression in LocalCommandRunnerTest.\n- Rewrite an existing incompatible .gitignore in the state root and reject\n  a symbolic link there as state-corrupt.\n- Drop the tree-policy digest from the material identity (framing v2) and\n  accept the v1 identity of the retired policy in publication journal\n  comparisons, so a publication interrupted under an earlier release still\n  recovers or rolls back after the upgrade.\n- Print --project-dir in summary continuation commands when the run was\n  started with it, since the store is project-local.\n"
    },
    {
      "commit": "5accbe91b5d8dc0e1c4e9385dc1efa44ef031b1f",
      "tree": "35486fcdbed21d1e23dcd912d29755c7b0d016d9",
      "parents": [
        "7bc69f81231b50f86e932a2a8db213d8271f0f2c"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 08 10:25:46 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 12:40:28 2026 +0200"
      },
      "message": "Fix #217: store Ship run state under the project\u0027s .camel-kit/ship/ subtree\n\nThe controller now defaults its state root to \u003cproject\u003e/.camel-kit/ship/state\ninstead of $XDG_STATE_HOME/camel-kit/ship or ~/.local/state/camel-kit/ship.\nCAMEL_KIT_SHIP_STATE_HOME still overrides the location.\n\n- Reserve .camel-kit/ship/ for the controller: the tree policy denies it\n  (schema v6 -\u003e v7), so it is never staged, digested or published, and the\n  root-lineage rule admits .camel-kit only when followed by ship.\n- Accept that subtree, and only that subtree, in the five state/project\n  overlap checks (run store registry and run root, staged workspace, Pi\n  worker directories, local command evidence).\n- Write a self-ignoring .gitignore into the state root on first use.\n- Document the new default, the migration note for old runs and the policy\n  bump in docs/commands.md, docs/architecture.md and CHANGELOG.md.\n"
    },
    {
      "commit": "7bc69f81231b50f86e932a2a8db213d8271f0f2c",
      "tree": "f6ee123b2ff97a17511e7886f43c51f930317dc1",
      "parents": [
        "28556cc223278a308c0fc3ef9f4b00ceb5960e99"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 08 09:28:16 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 10:04:02 2026 +0200"
      },
      "message": "Fix #215: upgrade Citrus and MCP to 5.0.1\n"
    },
    {
      "commit": "28556cc223278a308c0fc3ef9f4b00ceb5960e99",
      "tree": "4f25170d15c409c026cc5e417920d4660e5d28d8",
      "parents": [
        "e70e40d854d40e19123df31b3c3b8fcef718d032"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Sep 08 08:31:17 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 09:04:51 2026 +0200"
      },
      "message": "Fix #213: diagnose Bob skill visibility and clarify native entry points\n"
    },
    {
      "commit": "e70e40d854d40e19123df31b3c3b8fcef718d032",
      "tree": "3f1bf6c1406df29d3b70cdf5695914eb2f043606",
      "parents": [
        "ea0b97926d983f33911e4b11aaac1c244b5871b5"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 07 20:28:53 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 08 09:04:51 2026 +0200"
      },
      "message": "Fix #213: expose Bob Shell native workflow skills\n"
    },
    {
      "commit": "ea0b97926d983f33911e4b11aaac1c244b5871b5",
      "tree": "58314f8514b9f8029d2c04a7dc10c593efbb0bd2",
      "parents": [
        "1822e746dfb5565fcd421f87aa3c685368ed487e"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 07 15:28:41 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 07 15:28:41 2026 +0200"
      },
      "message": "chore: prepare 0.4.0-SNAPSHOT development version\n"
    },
    {
      "commit": "1822e746dfb5565fcd421f87aa3c685368ed487e",
      "tree": "d27739311d79683ef5bf7e89793a208879d49434",
      "parents": [
        "311eef20e36a72523d26b2cd1552de117afdd3f1"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 07 14:49:21 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 07 14:49:21 2026 +0200"
      },
      "message": "docs: update and consolidate unreleased changelog\n"
    },
    {
      "commit": "311eef20e36a72523d26b2cd1552de117afdd3f1",
      "tree": "77ac2cba139c279c7672aed24e75944a2510cc75",
      "parents": [
        "e26490130f5170de1318690aac9ba07e138176b3"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 07 14:05:08 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 07 14:05:30 2026 +0200"
      },
      "message": "chore: correct agent template count in CLAUDE.md\n"
    },
    {
      "commit": "e26490130f5170de1318690aac9ba07e138176b3",
      "tree": "2dd6b3436bc09735095b76e91134e6c94c3bcbec",
      "parents": [
        "11c24126363d814d68ea7ace910b5fb49220c050"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Mon Sep 07 07:37:36 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Sep 07 07:50:21 2026 +0200"
      },
      "message": "Fix #208: address migration and Ship review findings\n"
    },
    {
      "commit": "11c24126363d814d68ea7ace910b5fb49220c050",
      "tree": "234767eb1929f8c4d0548ef55885f2b44b9b159f",
      "parents": [
        "96b11622f051694f4483f145db34b5c79f4189a3"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Sat Sep 05 09:02:20 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Sep 07 07:50:21 2026 +0200"
      },
      "message": "Fix #208: relay migration questions and retain Ship defaults\n"
    },
    {
      "commit": "96b11622f051694f4483f145db34b5c79f4189a3",
      "tree": "231a0f62cefcee0f23409a65a43bf17d2bbfe5d9",
      "parents": [
        "7550778d0c161ace07756ae88836deca9a55c772"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Sat Sep 05 07:42:48 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Sat Sep 05 08:07:02 2026 +0200"
      },
      "message": "Fix #207: record catalog verification evidence in design specs\n"
    },
    {
      "commit": "7550778d0c161ace07756ae88836deca9a55c772",
      "tree": "d0790f545a45d00600ad217421d1b735ce0fd5d2",
      "parents": [
        "499588f42b5b69a67c71ded161a397e98f2f30a9"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Fri Sep 04 19:18:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 04 19:18:01 2026 +0200"
      },
      "message": "Centralize distribution versions and move to Camel 4.22 LTS (#210)\n\n* Centralize distribution version rendering\n\nLoad scalar defaults from the packaged distribution properties, share version template data across generated assets, and derive Forage and Ship certification rows from the authoritative configuration. Add an idempotent helper for the unavoidable Maven model-time mirrors.\n\n* Move Camel defaults to the 4.22 LTS matrix\n\n* Fix knowledge snapshot repository"
    },
    {
      "commit": "499588f42b5b69a67c71ded161a397e98f2f30a9",
      "tree": "9760122cd6a20fcae7bdc7b7ae36c11c30a0620c",
      "parents": [
        "0df8644d97216d403b1a6613f274c3ae7d3e32ab"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Sep 03 18:43:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 18:43:56 2026 +0200"
      },
      "message": "Fix #205: extract a shared Camel security checklist (#206)\n\n* Fix #205: extract a shared Camel security checklist\n\nAdd skills/shared/camel-security-checklist.md as the single canonical\nsource for the five Camel security rules (no hardcoded credentials, TLS\neverywhere, no sensitive data in logs, input validation at every ingress,\nauthentication on external endpoints) and their configuration snippets.\n\nThe design guides (security.md, monitoring.md), the validation guides\n(security-analysis.md, anti-patterns.md, quality-checks.md), both guide\nmanifests, the quality-reviewer dispatch guide, and the code-quality\nreviewer persona now reference the checklist instead of restating the\nrules; critic-security keeps its inline boundary-facing subset and names\nthe checklist as its source of truth.\n\nThe drifted vault-reference and log-masking values are reconciled, and\nthe canonical snippets use documented Camel syntax verified against the\n4.21 manual, component docs, and catalog: {{env:}}, {{secret:}},\n{{hashicorp:secret:}}, {{aws:}} placeholder functions, camel.main.logMask\nwith additionalSensitiveKeywords, Kafka and HTTP TLS options, and the\ncamel-main embedded HTTP server body limit. The PostgreSQL example uses\nsslmode\u003dverify-full because sslmode\u003drequire accepts any certificate.\n\nTests: stale-token guards for the retired invented syntax, a\nsingle-source regression in ResourceConsistencyTest, and a Bob\ngenerated-workspace regression in BobGeneratorTest.\n\n* Fix #205: align remaining security restatements with the shared checklist\n\nFix the drift the extraction sweep found outside the issue\u0027s file list:\n\n- camel-implement advanced-patterns: drop the invented validation.* properties\n  block and point at checklist rule 4 (guarded by a new stale-token pattern)\n- patterns-foundational (both byte-identical copies): documented placeholder\n  functions instead of a bare {{ENV_VAR}} placeholder\n- constitution example (template and docs copy): sensitiveHeaders includes Cookie\n- Bob gates: implement gate TLS wording matches the validate gate; execute gate\n  security list gains authentication on external endpoints\n- anti-patterns summary example: severities match the check blocks\n- docs/architecture.md: shared-guides table lists the actual shared/ files\n\n* Fix #205: address PR #206 review findings\n\nRemediate the six Required findings from the Camel Kit Reviewer verdict at\nhttps://github.com/luigidemasi/camel-kit/pull/206#issuecomment-5526618368:\n\n1. camel-implement selection path: add shared/camel-security-checklist.md to\n   the camel-implement/SKILL.md guide manifest and to the Bob implement gate\n   (camel-implement.md) so the implementation engineer can load it when\n   generating security-sensitive ingress steps.\n\n2a. critic-security.md TLS subset: extend rule 3 (TLS Configuration) to include\n    database TLS with certificate/hostname verification (sslmode\u003dverify-full,\n    not sslmode\u003drequire) and TLS 1.2+ minimum, matching checklist rule 2.\n\n2b. anti-patterns.md SQL examples: the caching enrichment examples use Simple\n    expression interpolation in sql: URIs; add a NOTE that customerId must be an\n    internally-assigned identifier (not external free-text), and document the\n    :#customerId named-parameter alternative for external-origin values.\n\n3. Severity mismatch: align security-analysis.md MCP sample output with the\n   anti-pattern catalog — plain HTTP to an external system is Critical (not\n   Warning), and the summary counts/wording are updated to match.\n\n4. Kafka ingress size: the checklist already explains broker limits are outside\n   the Camel application; add explicit guidance to add an application-level\n   decoded-payload size check in a Camel Processor before parsing, with a code\n   example, noting broker limits are transport safeguards only.\n\n5. Vault rotation: security.md falsely said \"Vault rotates secrets\n   automatically\"; correct to clarify this only applies with a dynamic secrets\n   engine (database, PKI, AWS, etc.) — static KV secrets require explicit\n   updates. Add camel.vault.hashicorp.refreshEnabled as the refresh hook.\n\n6. Drift-prevention suite: expand ResourceConsistencyTest uniqueness check from\n   4 to 9 canonical property snippets (adds secret-reference examples and\n   maxBodySize); add assertion that camel-implement/SKILL.md references the\n   checklist; add intentional-duplicate guard asserting critic-security.md does\n   NOT restate canonical property config (inline prose only). Extend\n   BobGeneratorTest to verify the installed Bob implement gate references the\n   shared checklist.\n\n* Fix #205: complete security review remediation\n\nMake the shared checklist reachable from every implementation and validation path, align the critic and Bob gates with its complete semantics, and apply one blocking severity to every confirmed violation.\n\nCorrect Kafka decoded-value limits, Vault refresh and lease guidance, safe SQL enrichment and cache examples, and the pinned MCP validation contracts. Add regressions for installed Bob workflows, deliberate semantic duplicates, endpoint calls, and unsafe SQL mutations."
    },
    {
      "commit": "0df8644d97216d403b1a6613f274c3ae7d3e32ab",
      "tree": "2f04d2f59ff3ba63e629f106e7a1e765614d9918",
      "parents": [
        "8d4206b0de1ea5f8424733a9b108bea8723ef617"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Sep 03 13:04:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 13:04:25 2026 +0200"
      },
      "message": "chore: align drifted guide checklists with canonical sources (#204)\n\n* chore: align drifted guide checklists with canonical sources\n\n* chore: canonicalize Test Design Principles in camel-test guide and align chatty-interfaces threshold"
    },
    {
      "commit": "8d4206b0de1ea5f8424733a9b108bea8723ef617",
      "tree": "4a7c078631c51aef784e69d89edebb3901243164",
      "parents": [
        "e775ad618ddf6aa38d3b72fe3c7d208bcfd535b1"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Sep 03 11:49:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 11:49:37 2026 +0200"
      },
      "message": "chore: fix table delimiter column counts in biztalk-phase2 design-spec template (#203)\n\n* chore: fix table delimiter column counts in biztalk-phase2 design-spec template\n\n* chore: add table parity coverage and fix nested template fences in phase-2 guides"
    },
    {
      "commit": "e775ad618ddf6aa38d3b72fe3c7d208bcfd535b1",
      "tree": "e0dbf40cba338bbcb0676ab1cceba8aab860083b",
      "parents": [
        "8bc5c95650f03f9c32b2f66b8c9c8e7d59e485f1"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Sep 03 08:16:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Sep 03 08:16:22 2026 +0200"
      },
      "message": "Fix #78: add migration risk, runbook, and retirement analysis (#202)\n\n* #78: Add migration behavioral risk analysis\n\n* #78: Add source-retirement candidate analysis\n\n* #78: Add conditional migration strategy guidance\n\n* #78: Add migration deployment and rollback runbook"
    },
    {
      "commit": "8bc5c95650f03f9c32b2f66b8c9c8e7d59e485f1",
      "tree": "725f846429c6b8701fa6bab39adf6ceefeffb346",
      "parents": [
        "8e486ce78a5cc3293622ad961eb750522c9f34e2"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Sep 02 10:58:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 02 10:58:27 2026 +0200"
      },
      "message": "Fix #76: separate data and instruction authority (#201)\n\n* Fix #76: separate data and instruction authority\n\n* Fix #76: load Gemini context authority"
    },
    {
      "commit": "8e486ce78a5cc3293622ad961eb750522c9f34e2",
      "tree": "2dbbe2eecc29f455253fe24cd230a1a7282537d5",
      "parents": [
        "6892ac28bf8ecf5f5338ef2a6b8137f36485d194"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 01 18:54:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 18:54:16 2026 +0200"
      },
      "message": "Add explicit design scope boundaries (#200)\n\n* Fix #77: record explicit design scope boundaries\n\n* Address planning scope-boundary review\n\n* Clarify scope boundaries for migrations"
    },
    {
      "commit": "6892ac28bf8ecf5f5338ef2a6b8137f36485d194",
      "tree": "11e96daba45242028cade982e9724c0f91848e10",
      "parents": [
        "dd0936d4490fe9328a78396906f06e56d56bf34a"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 01 15:36:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 15:36:23 2026 +0200"
      },
      "message": "chore: rewrite CLAUDE.md as project guide, ignore docs/reviews/ (#199)\n\n* chore: rewrite CLAUDE.md as project guide, ignore docs/reviews/\n\nAlso drop the stray executable bit on camel-kit-main/dist/CamelKit.java.\n\n* chore: address Sourcery review — ship-resolver module, real parser list, 9 agent templates"
    },
    {
      "commit": "dd0936d4490fe9328a78396906f06e56d56bf34a",
      "tree": "3c5393a268889b6001af7b760981fe49e9101fb4",
      "parents": [
        "560f36ddbe652763e4920ec7ff7d25050b3057de"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 01 14:33:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 14:33:22 2026 +0200"
      },
      "message": "Fix #145: synchronize JBang release versions (#198)"
    },
    {
      "commit": "560f36ddbe652763e4920ec7ff7d25050b3057de",
      "tree": "34608f3a31ce3aee99e1487f430ff9199ffc3274",
      "parents": [
        "6c0cd72ff40a7f498300d2cbae9b288fed822055"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Sep 01 10:34:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 01 10:34:42 2026 +0200"
      },
      "message": "Fix #146: validate missing Citrus MCP servers (#197)\n\n* Fix #146: validate missing Citrus MCP servers\n\nUse the persisted Citrus MCP version to distinguish current workspaces from pre-Citrus configurations. Missing servers now fail for current JSON targets while legacy workspaces retain their upgrade warning. Cover missing servers and schema-specific allowlist drift.\n\n* Fix #146: harden Citrus Doctor compatibility"
    },
    {
      "commit": "6c0cd72ff40a7f498300d2cbae9b288fed822055",
      "tree": "5f8795eafd143337298b275c8b8f37f15ac28775",
      "parents": [
        "00bb5512fe0adf946b0aa78840d05225e8072f51"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Aug 31 17:46:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 31 17:46:15 2026 +0200"
      },
      "message": "Fix #169: harden tampered Pi marker recovery (#196)\n\n* Fix #169: pin tampered warning rejection\n\n* Fix #169: harden tampered failure recovery\n\nNormalize recovered failure text before applying the fallback so escaped NUL-only values cannot leave a run wedged in RUNNING. Cover the durable marker path and terminal retry behavior."
    },
    {
      "commit": "00bb5512fe0adf946b0aa78840d05225e8072f51",
      "tree": "764067bfe4a5f75ac1f3fc994c6bab694b960988",
      "parents": [
        "bc575b033fb838cee9fee35d533a5de9617b55fd"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Fri Aug 28 10:09:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 10:09:00 2026 +0200"
      },
      "message": "Fix #193: align plugin and generated workflows (#195)\n\n* Fix #193: align plugin and generated workflows\n\n* Fix #193: address generated workflow review\n\n* Fix #193: address second-round review feedback\n\n* Fix #193: address third-round review feedback\n\n- doctor warns instead of failing when a workspace generated before Citrus\n  MCP support has no citrus server, for every JSON-config agent; a present\n  but malformed citrus server still fails\n- Bob 2 regeneration no longer retires and reinstalls its own skill files\n- doctor reports OpenCode permission findings against the layer that\n  defines the offending rule instead of the last existing layer\n- JsoncObjectEditor keeps member indentation when expanding values, removes\n  a member\u0027s whole line instead of leaving indentation behind, and rejects\n  unterminated block comments and truncated objects instead of looping\n- OpenCode regeneration and doctor follow a symlinked opencode.json, treat\n  layers aliased through symbolic links as one file, report a dangling link\n  consistently, and treat whitespace-only layers as empty\n- JSONC preservation tests now also assert that the managed entries were\n  written; CHANGELOG records the OpenCode and doctor behaviour"
    },
    {
      "commit": "bc575b033fb838cee9fee35d533a5de9617b55fd",
      "tree": "dbe145bbd9b6a8922422320711e0153d3188294e",
      "parents": [
        "279e8ffd74768e98f8d9c73ac85c20f9a73cc926"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Aug 26 20:50:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 20:50:42 2026 +0200"
      },
      "message": "[ci]: use automatic model selection for website impact (#194)"
    },
    {
      "commit": "279e8ffd74768e98f8d9c73ac85c20f9a73cc926",
      "tree": "5fb085ce46dd69a68427a914368a9270db92c0f6",
      "parents": [
        "27cddff29b12ab6f5f3d6f179469c6365e464efb"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Aug 26 14:30:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 14:30:13 2026 +0200"
      },
      "message": "Clarify Ship plan route path contract (#192)\n\n* Clarify Ship plan route path contract\n\n* Invalidate legacy Ship plan results"
    },
    {
      "commit": "27cddff29b12ab6f5f3d6f179469c6365e464efb",
      "tree": "28d807cca5735c0b943c233af946cfb76a3afeb1",
      "parents": [
        "53e8e51ea0f87d4b229e14a35f89220eeb208a89"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Aug 26 09:47:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 26 09:47:58 2026 +0200"
      },
      "message": "Simplify Ship security and controller boundaries (#191)\n\n* Simplify Ship security and controller boundaries\n\n* Fix read-only directory rollback recovery\n\n* Clarify rollback directory handling"
    },
    {
      "commit": "53e8e51ea0f87d4b229e14a35f89220eeb208a89",
      "tree": "927d04825f9012f8bf68d6821cd72001b35e755f",
      "parents": [
        "a0a8dabc108bfa6123dce102ff770d5f8a8c2afa"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Aug 25 19:42:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 19:42:49 2026 +0200"
      },
      "message": "Simplify Pi worker recovery and redaction boundaries (#190)\n\n* Simplify Pi worker recovery boundaries\n\n* Harden cluster 5 recovery bounds\n\n* Fix bounded URL credential redaction\n\n* Preserve overlapping credential redaction\n\n* Restore URL secret extraction contract\n\n* Fix bounded credential redaction\n\n* Close residual redaction gaps"
    },
    {
      "commit": "a0a8dabc108bfa6123dce102ff770d5f8a8c2afa",
      "tree": "66550355af4c1a4e497b73f2bbab618acddd4524",
      "parents": [
        "256d7ae91c82287ccffc2aaf8973671685478585"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Aug 24 14:42:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 14:42:33 2026 +0200"
      },
      "message": "Land the reviewed product-boundary clusters and keep-going test fix (#184-#187) (#189)\n\n* Run VALIDATE evidence commands directly, without the attestation stack (#184)\n\n* Run VALIDATE evidence commands directly, without the attestation stack\n\nPart of #182 (issue #149 product-boundary alignment, cluster 2).\n\nEvidence commands now launch the payload JVM directly: the controller\u0027s\nown java, -cp on the ephemeral payload archive, a cleared environment\n(LANG, LC_ALL, HOME, TMPDIR, JAVA_TOOL_OPTIONS only), working directory\ninside the accepted snapshot, which is made read-only (0400/0500) to\nkeep the read-only-input guarantee the bind mount used to provide.\nLaunchers take --accepted-root instead of the hardcoded /workspace.\n\nRemoved: the bubblewrap namespace sandbox and its profile digests, the\nper-command whole-JDK freeze/copy/triple-digest, the payload content\nlock and its six verification passes (one in-memory round-trip check at\narchive write time remains), the sandboxed --payload-version echo (the\nStamp version comes from the controller-side expected value), the\noperator-quarantine marker files (a quarantined flag plus the recorded\nsandbox root replace them), and the validator\u0027s re-attestation of its\nown in-process runner output. CommandEvidence shrinks to the fields the\nStamp needs. CONTRACT_VERSION 2 -\u003e 3.\n\nNetwork containment for started routes remains stub-substitution and\nthe post-start component allowlist; the merged-/usr and bubblewrap host\nrequirements disappear (CI installs removed, docs updated).\n\n* Deliver sandbox JVM options through the launch argv\n\nHotSpot splits JAVA_TOOL_OPTIONS on whitespace, so a space-bearing state\nroot aborted every evidence launch as an unrecognized option. The\n-Duser.home/-Djava.io.tmpdir pins now ride the runner-built argv like the\nother run-local substitutions, and the scrubbed environment drops\nJAVA_TOOL_OPTIONS. The compatibility IT launches with space-bearing\nprivate directories to anchor the behavior.\n\nCommand evidence now records the planned controller java path on both\nexecutable and arguments[0], and the planned-form semantics of the\nevidence records, the bootstrap extraction directory, quarantined\nsandbox retention, and post-exit reaping are documented in place.\n\n* Drop the Maven Central double-download verification (#185)\n\n* Drop the Maven Central double-download verification\n\nPart of #182 (issue #149 product-boundary alignment, cluster 3).\n\nThe resolver fetched every exact artifact\u0027s bytes a second time\ndirectly from Maven Central and byte-compared them against what Aether\nhad just resolved, and the payload materialization repeated the same\nritual per artifact with SHA-512 - supply-chain attestation by its own\nerror strings, defending only against tampering of Ship\u0027s own private,\nper-command, must-start-empty repository by a same-user process the\nproduct boundary excludes. Aether resolution against the fixed Central\nrepository with CHECKSUM_POLICY_FAIL, UPDATE_POLICY_NEVER, offline\nmode, and the fail-closed descriptor policy remains the integrity\nmechanism, and the recorded artifact digests are still computed from\nthe resolved bytes for staleness detection. The pre-resolution symlink\nwalk goes too; the post-resolution walk in requireExactArtifact is the\nsingle remaining check. Proxy/trust-store tolerance and the\ncamel.extra.repos refusal are untouched, guard tests unchanged.\n\n* Record the local-trust contract left by the double-download removal\n\nRestore ONLINE-mode value coverage of resolveArtifacts: a warm-cache test\npins that the recorded contentSha256/contentLength match the cached bytes,\nwhich is also the accepted behavior now that checksum enforcement applies\nto downloads only. Document that contract on the resolver and catalog\nJavadoc, note the per-read REQUEST_TIMEOUT semantics and the post-resolution\ntiming of the symlink walk, and fix a stale fixture comment that still\ndescribed the removed Central verification as current.\n\n* Read catalog artifacts plainly, validate evidence sets once (#186)\n\n* Read catalog artifacts plainly, validate evidence sets once\n\nPart of #182 (issue #149 product-boundary alignment, cluster 4).\n\nCatalogArtifactReader bracketed every open with dev/ino/nlink/mode/uid/\ngid/ctime identity samples taken before, during, and after the read to\ndefeat a concurrent mutator of the controller\u0027s own private repository\n- the same-user attacker the product boundary excludes, and redundant\nwith the acquired-identity digest check at its only call site. The 438-\nline class folds into a 12-line bounded read (NOFOLLOW leaf open, size\ncap, single read); zip-bomb hygiene and the call-site digest check are\nuntouched. CatalogEvidenceSet stops re-validating and re-digesting in\nits compact constructor what only its own factory produces: creation-\ntime validation runs once in create(), digest composition unchanged.\n\n* Enforce the snapshot digest format in the CatalogEvidenceSet constructor\n\n* chore: restore keep-going coverage after a failing evidence command (#187)\n\n* Record a failed launch without quarantining the never-started sandbox\n\nA launcher that throws before returning a process leaves no process tree\nto reap and no log pumps to quiesce. Treat that state as resolved, as\nreadVersion did before the direct-launch rewrite, so the evidence\ndirectory is cleaned instead of being retained with a false\nprocess-tree-could-not-be-reaped error for every failed launch in the\nkeep-going VALIDATE loop.\n\n* Return the payload archive path directly and drop the unused identity machinery\n\nThe attestation-stack removal left JvmPayloadArchive.Identity.digest\nwithout a production reader, at the cost of a second full raw-archive\nscan per evidence command, and left SourceEntry.kind and identity\nunread after lockEntry was deleted. materialize, write, and roundTrip\nnow return the archive path; the per-entry round-trip verification is\nunchanged.\n\n* Document the direct-JVM VALIDATE model in the changelog"
    },
    {
      "commit": "256d7ae91c82287ccffc2aaf8973671685478585",
      "tree": "d2cffb42f0ece2e0c643134e9f01a514f9cb040e",
      "parents": [
        "b8fa1179da2fb7f2b0d73bbae5cf0c4dafdfd095"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Fri Aug 21 11:36:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 11:36:07 2026 +0200"
      },
      "message": "Remove the main-package evidence command (#183)\n\nPart of #182 (issue #149 product-boundary alignment, cluster 1).\n\nShipMainPackageMain deterministically packaged the accepted routes into\na JAR written to a private temp directory and deleted in the same\ninvocation; the reported package digest had no consumer, and every\ncheck it performed is already made controller-side. Remove the launcher,\nits main-package-inspect payload kind, the main-package-and-inspect\ncommand from the VALIDATE evidence plan, and the summary re-verification\nthat consumed its stdout. The empty-roots payload bypass goes with it:\nevery remaining payload kind resolves real dependency roots, so a lock\nwith no roots now fails closed. CONTRACT_VERSION bumps 1 -\u003e 2 per its\nown contract (mandatory validation semantics changed); in-flight runs\nrestart EXECUTE through the normal staleness path."
    },
    {
      "commit": "b8fa1179da2fb7f2b0d73bbae5cf0c4dafdfd095",
      "tree": "80ac11538657a2dd3f2618001d13b5673fe5f450",
      "parents": [
        "04d73d38ce04ffbb84e6909efd1d455404b8cd7d"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Aug 20 18:54:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 18:54:41 2026 +0200"
      },
      "message": "Fix #179: replace the closed Simple grammar with a bounded expression gate (#180)\n\n* fix #179: replace the closed Simple grammar with a bounded expression gate\n\nShipExpressionPolicy re-implemented a private subset of the Simple\nlanguage (approved-lookup allowlist, single-space comparison grammar,\n\u003d~ redefined as case-insensitive equality, a Unicode 16.0 format table\nfrozen in source) and silently rejected valid Simple such as\n${bodyAs(String)} and ${date:now:yyyyMMdd}.\n\nReduce the policy to what Ship must enforce before forwarding text:\nbounded UTF-8 size, no control or format characters (classified with\nthe running JDK, as the tree policy already does), no lone surrogates,\nand no indirect expansion. Simple syntax stays with the real authority:\nthe sandboxed camel-main startup, which keeps rejecting OGNL-style\ndotted lookups because the bean language is absent from the payload\nclasspath - its startup failures are now wrapped into the launcher\u0027s\nuniform IOException contract, a path the old pre-parser made\nunreachable. Drop the test-only selector helpers and the policy\nboundary-freeze test; extractor tests now pin that dotted lookups\nextract and camel-main decides.\n\n* fix #179: collapse the expression gate API and guard its payload boundary\n\nReview follow-up. The two public gate methods were identical forwarders\nand their caller ORed them (f(x) || f(x)); collapse both into a single\nisSafeSimple and delegate directly from CatalogExpressionInventory. Add\na jdeps capability test pinning the expression package to java.base\nonly - the gate is embedded in the validation payload archive, and the\ndeleted boundary-freeze test was the only java.base guard. Document the\ndeliberate gaps with the gate\u0027s contract: backslash escape sequences\nare plain source text here (runtime expansion belongs to sandboxed\ncamel-main) and an orphaned }init$ closing marker is inert without its\nopener; both now have acceptance tests."
    },
    {
      "commit": "04d73d38ce04ffbb84e6909efd1d455404b8cd7d",
      "tree": "f93ba1b1e05b454edd98e3515049725cda1b5450",
      "parents": [
        "ee5aa4d11308c7108d98841cab2d29da31815212"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Aug 20 18:54:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 18:54:22 2026 +0200"
      },
      "message": "Fix #177: honor JVM proxy and trust-store properties in the Ship resolver (#178)\n\n* fix #177: honor JVM proxy and trust-store properties in the Ship resolver\n\nThe resolver refused to run when any standard JVM transport property was\nset (https.proxyHost, javax.net.ssl.trustStore, ...) and forced a direct\nroute in both the Aether session and the Maven Central byte fetch, so\nShip could not resolve its validation payloads behind a corporate proxy.\n\nHonor the JVM\u0027s standard proxy and TLS system properties instead: enable\naether.connector.http.useSystemProperties, drop the forced null proxy\nselector and the NO_PROXY pin on the direct Central client, and reduce\nboth copies of the override refusal (resolver and JvmPayloadArchive) to\nthe true resolution-semantics keys camel.extra.repos and\ncamel.default.extra.repos.default.value. Checksum, offline, and redirect\npolicies are unchanged.\n\n* fix #177: drop the NoProxySelector pin from the payload Central client\n\nReview follow-up: JvmPayloadArchive.CENTRAL_CLIENT still hardwired\nProxy.NO_PROXY, so verifyCentralBytes failed behind a proxy even after\nthe resolver started honoring the JVM transport properties. Build the\nclient on the JVM default proxy selector, delete the dead\nNoProxySelector, and cover the narrowed override guard directly:\ntransport properties tolerated, camel.extra.repos still refused."
    },
    {
      "commit": "ee5aa4d11308c7108d98841cab2d29da31815212",
      "tree": "8aa9f70f9a06c517cbb0d95f613cecb2cf018a7a",
      "parents": [
        "9705f0feaf9edc8a21f53b2888676c71adfe2ece"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Aug 20 18:53:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 18:53:40 2026 +0200"
      },
      "message": "chore: remove dead and unreachable code from the Ship subsystem (#181)\n\n* chore: remove dead and unreachable code from the Ship subsystem\n\nEvery deletion was verified against callers before removal; net effect\nis -2,465/+156 lines plus a 33-line test bridge, with no behavior\nchange on any production path.\n\n- Catalog: delete the Spring Boot/Quarkus resolution chain and the\n  hand-rolled POM/XML preflight, both unreachable because every\n  production CatalogTarget is runtime\u003dmain (non-main now fails closed\n  with an explicit error); reduce CatalogUsageRecord to its two live\n  nested records; drop the three JSON schemas nothing reads.\n- Controller/coordinator: delete the test-only public API\n  (prepareWorkspace, report-less completeStage/completeExecuteStage\n  overloads, 1-arg withArtifacts, 8-arg constructor, 1-arg resume) and\n  rewire the tests onto the production seams; drop the unreachable\n  non-POSIX attribute fallback.\n- Worker: delete the curl-style credential argv mining that no\n  production argv can reach (env harvesting and log redaction stay)\n  and the uncalled Lifecycle accessors.\n- Artifact/evidence: delete zero-caller members (isHmacSha256,\n  validateCatalogDependencies, 1-arg evidence overloads, unused\n  EvidenceRunner constructors, the never-produced Support.INCOMPATIBLE)\n  and the POM-policy branches provably dead behind the exact-main\n  grammar gate; reduce ShipCitrusYamlMain\u0027s TestContract to the name\n  production reads, keeping every policy check.\n- Tests: drop the hand-rolled public-API signature-freeze harnesses\n  (the jdeps/capability tests stay), the redundant wall-clock bound\n  that flaked twice on Java 21 CI, two post-mortem sleeps, a magic\n  digest pin, and one vacuous assertion.\n\n* chore: fail the run store with an actionable error off POSIX filesystems\n\nReview follow-up: dropping the non-POSIX attribute fallback left the\ntwo-arg-constructor path (tests) to surface a bare JDK\nUnsupportedOperationException. Guard attributes() with the same\nin-class pattern the project registry root already uses, so a\nnon-POSIX filesystem gets a StoreException with a clear message\ninstead of a silent permission drop or an opaque crash."
    },
    {
      "commit": "9705f0feaf9edc8a21f53b2888676c71adfe2ece",
      "tree": "fdb05a35dbff44e8e1f3f8a728e029a6ed0ca6b7",
      "parents": [
        "a12e667aa3da0844bc0313164c69e21901110e5a"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Aug 20 10:20:31 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 10:20:31 2026 +0200"
      },
      "message": "chore: certify Pi 0.84.2 and carry certified Pi versions as a list (#176)\n\n* chore: update maintained Pi pin to 0.84.2\n\nPi 0.84.2 requires Node \u003e\u003d22.19.0, so the Node pin stays 22.22.2.\nUpdates the bundled default, the maintainer live-gate doc line, and the\npin-coupled expectations in DistributionConfigTest, ShipCommandTest,\nand ShipCoordinatorTest.\n\nVerified by a passing authenticated Pi/Linux live-gate run through the\nregistered camel-kit ship entry point on 2026-08-19: all five stages\ncompleted single-attempt and the Stamp records Pi 0.84.2 and Node\n22.22.2 as supported with all six mandatory checks passing.\n\n* chore: carry certified Pi versions as a list\n\nBoth Pi 0.84.2 and Pi 0.83.0 completed authenticated Pi/Linux live-gate\nruns through the registered camel-kit ship entry point on 2026-08-19,\nso the distribution now records them as a certified-version list\n(pi.supported) instead of replacing one pin with another. Support is\nlist membership; pi.version stays the primary install target named in\nguidance messages, and an absent list falls back to that primary.\nVersions outside the list keep the experimental warning behind\n--accept-experimental, and 0.80.3 stays denylisted.\n\n* chore: address review findings on the certified Pi version list\n\nPin the bundled pi.version/pi.supported ordering invariant in\nDistributionConfigTest instead of a runtime guard, which would break\nthe deliberately fail-open lenient load path and single-property\noverrides; document the ordering contract and the list-accessor\nrationale in the piSupportedVersions Javadoc; align the sensitive-value\nfixture with the production-shaped certified list; cover the primary\nversion in the experimental warning at unit level; and make\nsupportsEveryCertifiedPiVersion detect both certified versions."
    },
    {
      "commit": "a12e667aa3da0844bc0313164c69e21901110e5a",
      "tree": "25070f90b7b5e4fec15d93f4c30e7d2c7cab45e4",
      "parents": [
        "8a10fd13c6df94709e669b9c256192b8eb66e24f"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Aug 18 16:43:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 16:43:45 2026 +0200"
      },
      "message": "Replace prompt-owned Ship with thin CLI delegates (#175)\n\n* Replace prompt-owned Ship with thin CLI delegates\n\n* Address review findings on Ship delegates and init safety\n\n- Declare the Pi skill-only Ship carve-out as workflow-manifest data\n  (skill_only_agents) and derive the stub generator, retired-asset\n  cleanup, doctor expectations, and test expectations from it\n- Drop the undocumented {{args}} placeholder for bob/bob2 — IBM Bob\n  documents only positional $1/$2 command placeholders — and forward\n  the Ship options in prose instead, recording the doc citation in the\n  registry and pinning hard-coded golden stub expectations in tests\n- Abort initialization up front, before writing any project files, when\n  a managed agent path component is a symbolic link, with an actionable\n  error message and a CHANGELOG note for the upgrade path\n- Restore the exact-contents guarantee in assertGeneratedCommandFiles by\n  adding the seeded user-owned neighbors to the expected set instead of\n  filtering the listing to a camel- prefix\n- Mirror production commandsDir resolution (skills directory for\n  non-stub agents) in test contexts and assert codex/copilot against\n  their real legacy command paths"
    },
    {
      "commit": "8a10fd13c6df94709e669b9c256192b8eb66e24f",
      "tree": "fa7193aae608c846770082675ae13571fcf6e8a2",
      "parents": [
        "d56e0482c0cbcc541648a1786fe33a40e606e98d"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Aug 18 11:51:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 11:51:15 2026 +0200"
      },
      "message": "Register Ship with user configuration (#174)\n\n* Register Ship with user configuration\n\n* Address Ship registration review feedback\n\n* Preserve literal Ship context in Camel JBang"
    },
    {
      "commit": "d56e0482c0cbcc541648a1786fe33a40e606e98d",
      "tree": "4c00739cd532f2943e1c0bd32a51dc4eef76ed06",
      "parents": [
        "20ac419cba61278e85136940ab2eb70ab864a857"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Aug 17 19:54:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 19:54:56 2026 +0200"
      },
      "message": "Make Ship pauses interactive and status actionable (#173)\n\n* Make Ship pauses interactive and status actionable\n\n* Clarify Ship pause and resume outcomes"
    },
    {
      "commit": "20ac419cba61278e85136940ab2eb70ab864a857",
      "tree": "90faffdd6b273403c00d20b3455b48983d12e9e0",
      "parents": [
        "afd32e0d589dd04737ffed0d986f204fd11f1a4a"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Aug 17 17:02:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 17:02:39 2026 +0200"
      },
      "message": "Publish the validated Ship candidate into the live project (#172)\n\n* Publish the validated Ship candidate into the live project\n\nA Ship run validated its generated project and then stopped, leaving the\nresult under the run\u0027s workspace directory and the user\u0027s project\nuntouched. Publication is the missing step between a run that validates\nand a run that delivers.\n\nPublication is a controller-owned operation between VALIDATE and\nCOMPLETED rather than a sixth stage, because the stage order is part of\nthe recorded architecture: COMPLETED now means validated and published.\nShipPublicationService applies one candidate through a write-ahead\njournal, digest-guarded backups, per-file atomic replacement, and a\nwhole-tree verification, and the run-state write recording the\npublication is the commit point. Any failure restores the exact baseline\nper journal entry; a publication torn by process death is recovered by\nthe next locked operation, which refuses to touch a live tree matching\nneither the journalled baseline nor its candidate.\n\nShipRun carries a publication record, so a run cannot claim completion\nwithout one, and a resume that restarts EXECUTE voids the claim along\nwith its journal. The published candidate identity is accepted as a\nlegitimate live baseline, so resuming a published run no longer looks\nstale and re-runs the whole implementation.\n\n* Locate an invalid publication journal entry by position\n\nThe recovery failure named only the journal file, which is hard to act\non. The entry path itself cannot be printed: this branch is reached\nexactly when the tree policy rejects the path, and one of its rejection\nrules is that the value contains characters unsafe to display, so the\npolicy\u0027s own exception deliberately carries no value either.\n\n* Harden Ship publication recovery"
    },
    {
      "commit": "afd32e0d589dd04737ffed0d986f204fd11f1a4a",
      "tree": "96c5dfa9ef2d4cbbc1d1874de9dcc252a5ee9341",
      "parents": [
        "7a535e67f56f9b5112041bc679fcad5e4f4409bd"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Fri Jul 31 14:34:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 14:34:54 2026 +0200"
      },
      "message": "Wire the Ship command to the workflow coordinator (#171)\n\n* Wire the Ship command to the workflow coordinator\n\nStart, start-from, and resume now drive ShipCoordinator through a\npackage-private WorkflowLauncher seam, giving the wired --resume the\ncoordinator\u0027s durable-attempt recovery. ShipRuntime adds the public\nbootstrap: --pi/--node with absolute-only PATH discovery, a private\ndefault catalog repository under the state root, --stage-timeout, and\nexplicit --accept-experimental consent. The OS gate and coordinator\nconstruction fail fast before any run state exists; post-start\nfailures keep the run identifier reachable on the error line; workflow\nlegs exit nonzero when the run ends FAILED. Status and abort stay pure\ncontroller operations, and the command remains unregistered.\n\n* Clarify the interrupt-restore contract in statusAfterInterrupt\n\nThe javadoc described preserve-original stash/restore semantics while\nthe code deliberately re-asserts the flag unconditionally: reaching the\nmethod proves an interruption occurred, and a conditional restore would\ndrop the interruption when a caught InterruptedException arrives with\nthe flag already cleared. Comment-only change.\n\n* Pin the stage-timeout help default to the runtime constant\n\nThe 10-minute default lives in ShipRuntime.DEFAULT_STAGE_TIMEOUT while the\n--stage-timeout help text hardcodes \"(default: 10m)\", with only a comment\nkeeping the two in sync. A new help-output assertion renders the expected\ndefault from the constant, so changing one without the other now fails the\nbuild."
    },
    {
      "commit": "7a535e67f56f9b5112041bc679fcad5e4f4409bd",
      "tree": "b37107b0c2861a1d61fb69712ac571a8090183ca",
      "parents": [
        "80870a57976d48bcccdb50f89d0d0a1f1fea0eac"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Jul 30 20:24:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 20:24:15 2026 +0200"
      },
      "message": "Add Pi/Linux Ship acceptance boundaries (#170)\n\n* Add Pi/Linux Ship acceptance boundaries\n\n* Harden Ship abort polling"
    },
    {
      "commit": "80870a57976d48bcccdb50f89d0d0a1f1fea0eac",
      "tree": "0b9e155e161dd93e7858d0522fe2aa117f5b474e",
      "parents": [
        "96c4ba4e830690854c0c7e75994c0a28fdba819b"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Jul 30 10:57:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 30 10:57:08 2026 +0200"
      },
      "message": "Add local Ship workflow coordinator (#168)\n\n* Add local Ship workflow coordinator\n\n* Address Ship coordinator review findings"
    },
    {
      "commit": "96c4ba4e830690854c0c7e75994c0a28fdba819b",
      "tree": "07a2264631ea2d8a20520b4e01e67148c9633e2d",
      "parents": [
        "b455d12e991c2cf68f10f3468988865331fa5726"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Jul 29 14:21:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 14:21:53 2026 +0200"
      },
      "message": "Add recoverable Ship worker results (#167)\n\n* Add recoverable Ship worker results\n\n* Address Ship result recovery review\n\n* Harden Ship result publication recovery\n\n* Close Ship worker review observations\n\n* Pin Ship worker publication guards"
    },
    {
      "commit": "b455d12e991c2cf68f10f3468988865331fa5726",
      "tree": "1780866901c0b21150cd08961fd4c23e765f9ec6",
      "parents": [
        "be789e7aaf69e4f06f2dc17739e0946065a47dbf"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Jul 28 09:39:14 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 09:39:14 2026 +0200"
      },
      "message": "Add bounded Pi worker and local evidence substrate (#166)\n\n* Add bounded Pi worker and local evidence substrate\n\n* Address Pi worker review findings\n\n* Avoid short-value Pi transcript collisions\n\n* Parse Pi version before evidence redaction"
    },
    {
      "commit": "be789e7aaf69e4f06f2dc17739e0946065a47dbf",
      "tree": "7eb974f86491825df537524050352bb737bd15b8",
      "parents": [
        "4748054adf72ff60d618562355f5e8ec529893ee"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Fri Jul 24 10:56:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 10:56:37 2026 +0200"
      },
      "message": "Add compact local Ship controller substrate (#165)\n\n* Add compact local Ship controller substrate\n\n* Harden Ship controller trust boundaries\n\n* Tighten Ship controller boundary tests"
    },
    {
      "commit": "4748054adf72ff60d618562355f5e8ec529893ee",
      "tree": "9ebda056874aec859969b61f31abeaeef5d83794",
      "parents": [
        "aada9ecf677c336b3571d63b25d257572f18e8a1"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Jul 23 16:28:34 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 16:28:34 2026 +0200"
      },
      "message": "Reduce Ship to the local MVP substrate (#164)\n\n* Reduce Ship to the local MVP substrate\n\n* Address schema review findings\n\n* Cover valid catalog subject schema case"
    },
    {
      "commit": "aada9ecf677c336b3571d63b25d257572f18e8a1",
      "tree": "b1d9048423a9ddc0cd57b37d6d41e2024305dc5b",
      "parents": [
        "42c6b79e188ed49d041926b1f1d4317d822da89b"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Thu Jul 23 12:17:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 12:17:36 2026 +0200"
      },
      "message": "Add Ship legacy cutover and conformance evidence (#161)\n\n* Add Ship legacy cutover and conformance evidence\n\n* Test empty Ship conformance evidence"
    },
    {
      "commit": "42c6b79e188ed49d041926b1f1d4317d822da89b",
      "tree": "687a5c7ce9d4de51ec15ef36e2bdd6ff7d9d0456",
      "parents": [
        "18c0ee69093a2d9f155e1eea2048eeaba86a5a0e"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Jul 22 18:03:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 18:03:32 2026 +0200"
      },
      "message": "Add protected Ship broker, evidence, and publication (#160)\n\n* Add protected Ship broker, evidence, and publication\n\n* Harden protected Ship recovery and crash coverage\n\n* Close Ship publication crash recovery gaps"
    },
    {
      "commit": "18c0ee69093a2d9f155e1eea2048eeaba86a5a0e",
      "tree": "e83829564ac2b1d2adcf40016acd10114eaba1f6",
      "parents": [
        "e11c3620e6a5f4a520d9cf3885a09c4b4d2a909b"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Jul 22 10:40:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 10:40:40 2026 +0200"
      },
      "message": "Add controller-owned Ship orchestration (#159)\n\n* Add controller-owned Ship orchestration\n\n* Harden Ship orchestration replay boundaries\n\n* Polish Ship orchestration replay guards"
    },
    {
      "commit": "e11c3620e6a5f4a520d9cf3885a09c4b4d2a909b",
      "tree": "33b571efabe6ab5a3fb46bd63c308c8c21b65968",
      "parents": [
        "cc1617f367de554b4b424d5db9966914acba5a06"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Wed Jul 22 01:19:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 01:19:12 2026 +0200"
      },
      "message": "Add integrity-checked Ship storage and typed worker-contract substrate (#158)\n\n* Add integrity-checked Ship controller substrate\n\n* Harden Ship controller substrate boundaries\n\n* Complete Ship run-view invariant coverage"
    },
    {
      "commit": "cc1617f367de554b4b424d5db9966914acba5a06",
      "tree": "807e2fae13643211fad1599b38d0fb5e95cf4e12",
      "parents": [
        "a34b1061245bf56a477da02c62df68b8fe10a4b2"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Jul 21 19:26:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 19:26:05 2026 +0200"
      },
      "message": "Enforce Ship artifact policy and controller-owned evidence runners (#157)\n\n* Enforce Ship artifact policy and evidence runners\n\n* Provision Bubblewrap for Ship compatibility CI\n\n* Allow Bubblewrap namespaces in Ubuntu CI\n\n* Fix Bubblewrap namespace smoke test\n\n* Support Ubuntu libraries in the Ship sandbox\n\n* Harden Ship validation boundaries\n\n* Close remaining Ship validation review gaps"
    },
    {
      "commit": "a34b1061245bf56a477da02c62df68b8fe10a4b2",
      "tree": "96edbbd949af888c8b9d4801168498f8429a1043",
      "parents": [
        "0aadcbfe273f5157e092d37ea84db4ebe5c3b6c6"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Tue Jul 21 11:38:17 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Jul 21 12:20:37 2026 +0200"
      },
      "message": "Add fail-closed Ship adapter registry\n"
    },
    {
      "commit": "0aadcbfe273f5157e092d37ea84db4ebe5c3b6c6",
      "tree": "d96a46cc8e43db24e9e13db805d2124b90bd4730",
      "parents": [
        "f60c5ace66619de0df42e29bd012ff3485f3f887"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Jul 21 10:39:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 10:39:39 2026 +0200"
      },
      "message": "Add closed Ship expression policy (#155)\n\n* Add closed Ship expression policy\n\n* Pin Unicode expression policy ranges"
    },
    {
      "commit": "f60c5ace66619de0df42e29bd012ff3485f3f887",
      "tree": "418d198c941387ea0d1b9cc9ff473dba1749fdd7",
      "parents": [
        "87b78e7243fa54c03c5e53e1fb4fce10fa5be8b4"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Tue Jul 21 00:15:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 00:15:40 2026 +0200"
      },
      "message": "Add bounded Ship catalog evidence snapshots (#154)\n\n* Add bounded Ship catalog evidence snapshots\n\n* Stabilize Ship catalog boundaries across JDKs"
    },
    {
      "commit": "87b78e7243fa54c03c5e53e1fb4fce10fa5be8b4",
      "tree": "d29f8ff8baadde244072c5b3214f511ee20c559d",
      "parents": [
        "a2b5e43421950e7459efb3226d53270acc29c0dd"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "5583341+luigidemasi@users.noreply.github.com",
        "time": "Mon Jul 20 20:16:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 20:16:42 2026 +0200"
      },
      "message": "Harden Ship foundation capability boundaries (#153)\n\n* Harden Ship foundation capability boundaries\n\n* Add Ship boundary parser canaries\n\n* Centralize Ship policy class matching"
    },
    {
      "commit": "a2b5e43421950e7459efb3226d53270acc29c0dd",
      "tree": "547b397bb5662770a710209892f8d0c905021bbc",
      "parents": [
        "55e45f7938f64ce5e72e5f7c324910cd47dcc718"
      ],
      "author": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Sun Jul 19 01:17:39 2026 +0200"
      },
      "committer": {
        "name": "Luigi De Masi",
        "email": "ldemasi@redhat.com",
        "time": "Sun Jul 19 01:17:39 2026 +0200"
      },
      "message": "Harden Ship context boundaries\n"
    }
  ],
  "next": "55e45f7938f64ce5e72e5f7c324910cd47dcc718"
}
