)]}'
{
  "log": [
    {
      "commit": "65c48c4b54bed08e7910037f92dfd8aea55494fd",
      "tree": "d0b1a7870c0100da19094d52d8049cfe1bf60679",
      "parents": [
        "a216a37ce0a3dfadfea88dc07c24437483ce0c12"
      ],
      "author": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Wed Oct 14 21:48:07 2026 +0000"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Thu Oct 15 18:27:37 2026 +0000"
      },
      "message": "[#8626] Make inbound email auto-reply verification case insensitive\n"
    },
    {
      "commit": "a216a37ce0a3dfadfea88dc07c24437483ce0c12",
      "tree": "a7cf105cb20277d6675fa10780d53597d16cd698",
      "parents": [
        "13406bf4c46659222aa0e8fa4e048994baa72f64"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Mon Oct 12 17:41:53 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 15 12:12:21 2026 -0600"
      },
      "message": "pytest.ini warning cleanup\n"
    },
    {
      "commit": "13406bf4c46659222aa0e8fa4e048994baa72f64",
      "tree": "835a6748f2d5ca7ad093e804ccd903e59c9f5cbe",
      "parents": [
        "5c15f02e2cf255e58f7230e31080748b5997a867"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Mon Oct 12 17:03:03 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 15 12:12:21 2026 -0600"
      },
      "message": "replace faust-cchardet with turbohtml charset detection, check BOM\n\n- faust-cchardet sometimes has slowdowns https://github.com/faust-streaming/cChardet/issues/57\n- and can be hard to compile if prebuilt wheel isn\u0027t available\n- turbohtml is just as fast, and we are depending on it now anyway\n- adds some tests too\n"
    },
    {
      "commit": "5c15f02e2cf255e58f7230e31080748b5997a867",
      "tree": "9d1d68424e6317ff75642ae7633d258517b94d79",
      "parents": [
        "bc9064002bb5b3811878f9ef3c74c39555153998"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Mon Oct 12 15:27:01 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 15 12:12:20 2026 -0600"
      },
      "message": "deal with argparse.FileType deprecation\n"
    },
    {
      "commit": "bc9064002bb5b3811878f9ef3c74c39555153998",
      "tree": "4012acd1511ecaf40e576d6709ae5f544a0f547e",
      "parents": [
        "466bd2fb68ad70cae44e859f17d5ae66e424a431"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Fri Oct 09 16:23:59 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 15 12:12:20 2026 -0600"
      },
      "message": "make memoize_cleanup work for instance methods and class methods on different python versions\n"
    },
    {
      "commit": "466bd2fb68ad70cae44e859f17d5ae66e424a431",
      "tree": "fb2e438356b3ba39497053925d59f4db1976c1d9",
      "parents": [
        "7702cc408cc8332dda3b0c61bbe7d4b8ee4ced8e"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 15 16:36:46 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 15 16:36:46 2026 +0000"
      },
      "message": "clean up lint warnings in tests and lib/plugin\n"
    },
    {
      "commit": "7702cc408cc8332dda3b0c61bbe7d4b8ee4ced8e",
      "tree": "b3934db23044d12ad090e6c13b8a04dfca7b0bb7",
      "parents": [
        "e0490e16b3a990c92e9d19cf88d204d4e1475234"
      ],
      "author": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Thu Sep 17 19:10:19 2026 +0000"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Thu Oct 15 14:37:06 2026 +0000"
      },
      "message": "[#8625] Add event types for audit log records\n"
    },
    {
      "commit": "e0490e16b3a990c92e9d19cf88d204d4e1475234",
      "tree": "80478320b87b20631bf6a7f4e0dc0e8cb3174c58",
      "parents": [
        "3254c1e4caaf416905df2c081753254137c4cae9"
      ],
      "author": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Tue Sep 15 20:14:11 2026 +0000"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Thu Oct 15 14:37:06 2026 +0000"
      },
      "message": "[#8625] Add encrypted field for audit log messages\n"
    },
    {
      "commit": "3254c1e4caaf416905df2c081753254137c4cae9",
      "tree": "7dad6ee1f9f8a504e57526108926c2080fec8e67",
      "parents": [
        "09758cd5d5e964a4208d247769f9009735e96df5"
      ],
      "author": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Wed Oct 14 20:52:20 2026 +0000"
      },
      "committer": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Wed Oct 14 20:52:20 2026 +0000"
      },
      "message": "Hide button to send an email to create a new topic for unauthenticated users\n"
    },
    {
      "commit": "09758cd5d5e964a4208d247769f9009735e96df5",
      "tree": "4e98b563ead355ec60354e1d32f0204b44d4ae06",
      "parents": [
        "807b2b87bf43f94cecabbe33bc7569507e27ac83"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Oct 12 15:16:38 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Oct 12 15:16:38 2026 -0400"
      },
      "message": "git: handle renames from non-utf8 filenames in file history\n\nPreviously the log for a file renamed from a non-utf8 name raised an error.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01LrwkUnX5f8m9At7MRwGC2P\n"
    },
    {
      "commit": "807b2b87bf43f94cecabbe33bc7569507e27ac83",
      "tree": "5925ee857b3d25bedc87800dc1dfa3ca0621727c",
      "parents": [
        "9687b8bacadf947f4a14f7056a5ae2a7750954ec"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Oct 12 15:13:46 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Oct 12 15:13:46 2026 -0400"
      },
      "message": "git: handle filenames git quotes (non-ASCII, \") in last-commit and rename logic\n\ngit log --name-only/--name-status quote such paths, so they never matched.\nUse -z for --name-only output and unquote rename paths from --name-status.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01LrwkUnX5f8m9At7MRwGC2P\n"
    },
    {
      "commit": "9687b8bacadf947f4a14f7056a5ae2a7750954ec",
      "tree": "7d9ab3b1e10ad519809ec08dc4b49a697144ee67",
      "parents": [
        "1006457c1dd039d8724f1c4e2fc5179f3fd51c08"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Oct 12 14:54:46 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Oct 12 14:54:46 2026 -0400"
      },
      "message": "update security content for 1.22.0 changes\n"
    },
    {
      "commit": "1006457c1dd039d8724f1c4e2fc5179f3fd51c08",
      "tree": "5175184b7d81f302b2bea84be61f539e2918bf71",
      "parents": [
        "0c8a917531ba2a17cae4a8a2f2cff2f10adfc109"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Fri Oct 09 12:00:07 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Fri Oct 09 12:00:07 2026 -0400"
      },
      "message": "CHANGES updated for ASF release 1.22.0\n"
    },
    {
      "commit": "0c8a917531ba2a17cae4a8a2f2cff2f10adfc109",
      "tree": "58fcf2716943abfb23f6abd98c263165d99dd9f6",
      "parents": [
        "3b58ceb835e96452fa53a557073ca9d0e80c699d"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Sep 30 14:22:04 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] use |tojson for user-supplied values in inline JS\n\nA trailing backslash or newline in a value inside a quoted JS string broke the page\u0027s script.\nAlso URL-encode the tarball status path, and JSON-encode flash messages (whose status came from the cookie unescaped).\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_018JD6LAhzatq5yPoNhq7BZr\n"
    },
    {
      "commit": "3b58ceb835e96452fa53a557073ca9d0e80c699d",
      "tree": "905478767d592080c3d0e0c28e30210bf41d4990",
      "parents": [
        "4edf7ca062d48b1f399801706c445a523d3045f3"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Sep 30 12:47:45 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] OAuth consent pages: show where the user will be redirected\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_0183NnrvxxAdqZVXaHi1j83F\n"
    },
    {
      "commit": "4edf7ca062d48b1f399801706c445a523d3045f3",
      "tree": "44fae119bf6732a63bb26ce0ad9566051df7e93e",
      "parents": [
        "09085e40caad82ac2a1fb4eaab2d0d2bb56e805d"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 29 15:51:52 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] 404 for deleted subprojects unless the user can manage them\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "09085e40caad82ac2a1fb4eaab2d0d2bb56e805d",
      "tree": "9af4357e9e9d336ba6062e806a37c79cbe188ce0",
      "parents": [
        "592f8528fc8531d4f78a85ab65db820d39a1b41f"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 29 15:51:51 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] hide soft-deleted projects\u0027 content from search, feeds, and activity\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\nClaude-Session: https://claude.ai/code/session_0183NnrvxxAdqZVXaHi1j83F\n"
    },
    {
      "commit": "592f8528fc8531d4f78a85ab65db820d39a1b41f",
      "tree": "f0a98cb05a9318c2e383d7342249894213e72798",
      "parents": [
        "bda02fd1fc70f9dfe539a20d3ca6dc92e308b623"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 29 15:44:17 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] forum email replies: only match posts in the same discussion tool\n\nAlso require post access before saving an email\u0027s attachments or alternate parts, since they skip\nThread.post(), and ignore a message whose id is already a post in a different thread.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\nClaude-Session: https://claude.ai/code/session_0183NnrvxxAdqZVXaHi1j83F\n"
    },
    {
      "commit": "bda02fd1fc70f9dfe539a20d3ca6dc92e308b623",
      "tree": "0aa5934877af50a6607cc107c9589d9f08463658",
      "parents": [
        "06638a5b774795c9fba517d5ae19bd9240d75c7f"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 29 15:43:02 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] GitHub importer: require saved OAuth state, single-use\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "06638a5b774795c9fba517d5ae19bd9240d75c7f",
      "tree": "d051b30d64f4abafa9f6d4b37406883075a27b1b",
      "parents": [
        "9c057644930cf79ea8468df8f6fe5e4f6ab7b064"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 29 15:41:37 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] ForgeFeedback: one review per user per project\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "9c057644930cf79ea8468df8f6fe5e4f6ab7b064",
      "tree": "5cced41e643e82a2ccb899c54f1a1ab45477b120",
      "parents": [
        "3def09b78b12cb8dac125d5b142da13c2a7ff48f"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 29 14:25:15 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] feeds: skip entries from tools the viewer can no longer read\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "3def09b78b12cb8dac125d5b142da13c2a7ff48f",
      "tree": "b5a35e1c173a6f2a9c5ef2124c189372af58f477",
      "parents": [
        "53e527a9a17eff540b18fffae6f3482e30e3a199"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 29 11:15:31 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] don\u0027t let shared caches store files served to logged-in users\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "53e527a9a17eff540b18fffae6f3482e30e3a199",
      "tree": "2849f423dfa456d98da9708442a3abb7c4b0c5bc",
      "parents": [
        "df3932e2f220ebbcb5ca735be5acb657839aab23"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 18:06:14 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] primary email must be one of the user\u0027s confirmed addresses\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "df3932e2f220ebbcb5ca735be5acb657839aab23",
      "tree": "b480d4c9efd8a5a524e798828b76ccb202240029",
      "parents": [
        "02cd1b243c82881ad232981ee0a273ae415daf02"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 16:40:49 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] ForgeFiles: hide delete activities from users without read\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "02cd1b243c82881ad232981ee0a273ae415daf02",
      "tree": "29d03550d9b351b4fc3f81810314c98c6dd959dd",
      "parents": [
        "8af81f1face8877781c334c4d0f9a96407f5631d"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 16:37:43 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] check viewer\u0027s access for \"Related\" artifacts on posts\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "8af81f1face8877781c334c4d0f9a96407f5631d",
      "tree": "8c744b6e1988db15fb59568b3b6e3086e8c85682",
      "parents": [
        "e2f8166492f6d570d465035281906e96e3b74ee6"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 16:37:19 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] password reset: prefer the confirmed owner of an email address\n\nThe legacy inbound mail sender lookup likewise only trusts a confirmed From address.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\nClaude-Session: https://claude.ai/code/session_0183NnrvxxAdqZVXaHi1j83F\n"
    },
    {
      "commit": "e2f8166492f6d570d465035281906e96e3b74ee6",
      "tree": "6009fe48fab08c5bc2664411eaf14b18a965a3b0",
      "parents": [
        "cc8d7549d739b20ff6a577f3810239b19170cfb7"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 16:35:04 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:27 2026 +0000"
      },
      "message": "[#8627] require ip_address_header for /auth/repo_permissions\n\nAlso treat disabled or pending users as unknown there, since User.by_username() returns them.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\nClaude-Session: https://claude.ai/code/session_0183NnrvxxAdqZVXaHi1j83F\n"
    },
    {
      "commit": "cc8d7549d739b20ff6a577f3810239b19170cfb7",
      "tree": "38b1574fbfb83ea471df35ae5a0877a1b5f7a749",
      "parents": [
        "346eef0a394329fe4150d5b7ee2c64f771536d56"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 16:33:00 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:26 2026 +0000"
      },
      "message": "[#8627] require read on the upstream repo to request a merge\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\n"
    },
    {
      "commit": "346eef0a394329fe4150d5b7ee2c64f771536d56",
      "tree": "750c0e8dd6bfbf1f806528685b95b1614aac3da8",
      "parents": [
        "1dc95733028856afac8b940e9353ae0aad45717e"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 16:30:26 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:26 2026 +0000"
      },
      "message": "[#8627] no API tokens for disabled or pending users\n\nReject their existing tokens, and don\u0027t issue new ones from OAuth2 refresh or authorization code grants,\nor the OAuth1 access token exchange.\n\nCo-Authored-By: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\nClaude-Session: https://claude.ai/code/session_0183NnrvxxAdqZVXaHi1j83F\n"
    },
    {
      "commit": "1dc95733028856afac8b940e9353ae0aad45717e",
      "tree": "eabe28c8b446f0491f1ce672f1b66bf9388a8a40",
      "parents": [
        "b97e6fb444121debd0d02cc3f8e8de23c425e9ab"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 16:28:59 2026 -0400"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Oct 08 20:52:26 2026 +0000"
      },
      "message": "[#8627] SVN: keep path lookups inside the repo\n\nBuild every path url with _path_url: drop . and .. segments, and quote every part (including %) so svn\ncan\u0027t decode %2E%2E or %2F into .. or / and reach another repo. Covers log, is_file, tarball, tree\nlisting, last commit ids, blob size, blob contents, and the checkout url check.\n\nTarball paths that clean to nothing now fall back to trunk, so the zip name matches the status check.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01S13yNaBk5K5EefQXbbJPsT\nClaude-Session: https://claude.ai/code/session_0183NnrvxxAdqZVXaHi1j83F\nClaude-Session: https://claude.ai/code/session_01Xfewtey8vhEVf4pZefV4K4\n"
    },
    {
      "commit": "b97e6fb444121debd0d02cc3f8e8de23c425e9ab",
      "tree": "75acd7118971b4dda60220a1d167b09da94fee9f",
      "parents": [
        "2bcbaa9f44c8d4231256e24432a90070ccfbea29"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Mon Oct 05 15:28:19 2026 +0000"
      },
      "committer": {
        "name": "Dillon Walls",
        "email": "dillon.walls@slashdotmedia.com",
        "time": "Thu Oct 08 16:27:42 2026 +0000"
      },
      "message": "[#8628] bumping EasyWidgets 0.4.3 -\u003e 0.5.0\n\n  * reverted security commits that are now included in the easywidgets itself\n  * add some new easywidgets tests\n"
    },
    {
      "commit": "2bcbaa9f44c8d4231256e24432a90070ccfbea29",
      "tree": "0888dc4e81f5b9eefa3b665694dd3bad7e91d6a1",
      "parents": [
        "1b3717eb4adae99ea8effd84dff8d5ded5a531b3"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Fri Oct 02 19:04:45 2026 +0000"
      },
      "committer": {
        "name": "Dillon Walls",
        "email": "dillon.walls@slashdotmedia.com",
        "time": "Thu Oct 08 16:26:15 2026 +0000"
      },
      "message": "Revert \"[#8623] keep inline script/style bodies raw under easywidgets autoescaping\"\n\nThis reverts commit c30ee2a8c03c5ddd701db2a2d609fcd3a1323b2a.\n"
    },
    {
      "commit": "1b3717eb4adae99ea8effd84dff8d5ded5a531b3",
      "tree": "606bf827490e59a94d30234d3abf5bcfbafceb2e",
      "parents": [
        "96e9d501d8088073cde876f126d7f6b6d49e1907"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Fri Oct 02 19:04:45 2026 +0000"
      },
      "committer": {
        "name": "Dillon Walls",
        "email": "dillon.walls@slashdotmedia.com",
        "time": "Thu Oct 08 16:26:15 2026 +0000"
      },
      "message": "Revert \"[#8623] bound the easywidgets resource cache and cap _slim requests\"\n\nThis reverts commit ebb6c7c87af22db90671b2eefa206a66a55d0991.\n"
    },
    {
      "commit": "96e9d501d8088073cde876f126d7f6b6d49e1907",
      "tree": "758687365fad0599ff1b83ad467606e1098c96da",
      "parents": [
        "afc6afa41e2d5f2ee8578c306bbee190d71b1702"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Tue Oct 06 16:19:21 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Tue Oct 06 16:19:21 2026 +0000"
      },
      "message": "[#8629] updating dependencies\n"
    },
    {
      "commit": "afc6afa41e2d5f2ee8578c306bbee190d71b1702",
      "tree": "14f0499694be791c9654508d47b8cfa82d7d035b",
      "parents": [
        "7c789d521fa5543cd1e5f649b61b95c10b450430"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Tue Oct 06 15:36:51 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Tue Oct 06 15:42:37 2026 +0000"
      },
      "message": "bump pymongocrypt 1.16.0 -\u003e 1.18.1\n"
    },
    {
      "commit": "7c789d521fa5543cd1e5f649b61b95c10b450430",
      "tree": "4d3d7ba37df98468620e847c976ac9ec24e18582",
      "parents": [
        "38df454c1237a6614e1207ef61b5831230aec113"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Mon Oct 05 20:28:05 2026 +0000"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Tue Oct 06 15:27:57 2026 +0000"
      },
      "message": "[#8629] bump pypeline 0.7.0 -\u003e 0.8.1\n"
    },
    {
      "commit": "38df454c1237a6614e1207ef61b5831230aec113",
      "tree": "a16557fe91691fa2ffe9fc932446fcbc67663633",
      "parents": [
        "586a514eda9c5e8e9b319d50968acc142bc4ea1a"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Tue Oct 06 15:24:19 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Tue Oct 06 15:24:19 2026 +0000"
      },
      "message": "bumping Werkzeug 3.1.6 -\u003e 3.1.9\n"
    },
    {
      "commit": "586a514eda9c5e8e9b319d50968acc142bc4ea1a",
      "tree": "ee2ede5b7abae5c9d38e92c06dd46829d3c7cea3",
      "parents": [
        "af4df40e89d5d6a7d72677a5e043f3c8d24d6ad4"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Tue Oct 06 15:17:53 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Tue Oct 06 15:17:53 2026 +0000"
      },
      "message": "bumping pymongo 4.17.0 -\u003e 4.18.2\n"
    },
    {
      "commit": "af4df40e89d5d6a7d72677a5e043f3c8d24d6ad4",
      "tree": "d9f67c0a0d2f0fec453f51caaa3275525ed284ca",
      "parents": [
        "7ce0d945f6d4b15803d01c9c98ca129f17a58245"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 16:06:14 2026 -0400"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Tue Oct 06 14:24:32 2026 +0000"
      },
      "message": "fix partialFilterExpression: can\u0027t do $gt a different type.  NEEDS INDEX DROP AND RECREATE\n"
    },
    {
      "commit": "7ce0d945f6d4b15803d01c9c98ca129f17a58245",
      "tree": "8dc9743f1278c53ebb186aaf403ebde6ce0946b7",
      "parents": [
        "b55b2ec8550e3f13a31600e7b779d4fb750073b8"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 01 16:22:47 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 01 16:22:47 2026 +0000"
      },
      "message": "bump python-discovery 1.4.4 -\u003e 1.6.1\n"
    },
    {
      "commit": "b55b2ec8550e3f13a31600e7b779d4fb750073b8",
      "tree": "3f83e470f9eaa38b4e7e5065f87db51adaa6d420",
      "parents": [
        "0d81070266adec653efc0e0c630ca8df95da1404"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 01 15:25:11 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Oct 01 15:25:19 2026 +0000"
      },
      "message": "bumping virtualenv 21.6.1 -\u003e 21.14.2\n"
    },
    {
      "commit": "0d81070266adec653efc0e0c630ca8df95da1404",
      "tree": "bdbcfc2bb8a74130d8ae0f6623aa87afa2e8a845",
      "parents": [
        "5b910a67f9c3b40c306f7d422095753dcae78b85"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Wed Sep 30 16:05:09 2026 +0000"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Wed Sep 30 16:05:09 2026 +0000"
      },
      "message": "docker-compose: try giving solr a longer start period to get healthy (has been unhealthy in CI sometimes)\n"
    },
    {
      "commit": "5b910a67f9c3b40c306f7d422095753dcae78b85",
      "tree": "e13ee0108dd64facf867d4383ab16da59f80de1c",
      "parents": [
        "28c64c7c90053b2dd7a28bcea6d9695f849c0653"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Wed Sep 30 15:38:57 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Wed Sep 30 15:38:57 2026 +0000"
      },
      "message": "bumping urllib3 2.7.0 -\u003e 2.8.0\n"
    },
    {
      "commit": "28c64c7c90053b2dd7a28bcea6d9695f849c0653",
      "tree": "165a344dbf9277d34f571ea700d6e9a8558011c3",
      "parents": [
        "ac10c905fbdbdf91ef29a49875eede80d1bbb8db"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Wed Sep 30 15:21:11 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Wed Sep 30 15:21:11 2026 +0000"
      },
      "message": "bumping oauthlib 3.3.1 -\u003e 4.0.0\n"
    },
    {
      "commit": "ac10c905fbdbdf91ef29a49875eede80d1bbb8db",
      "tree": "bf8578be0da82ad426d3d49df2cec117b66add7d",
      "parents": [
        "a9f564ca956d70edbfcd413ab3d8bb23e0be8d63"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 15:06:54 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Sep 28 15:08:06 2026 -0400"
      },
      "message": "rename CLAUDE.md \u003d\u003e AGENTS.md\n"
    },
    {
      "commit": "a9f564ca956d70edbfcd413ab3d8bb23e0be8d63",
      "tree": "bdf46741e75b7d817347ea4cb14cd401ae77378e",
      "parents": [
        "b61c5ab0f170bbe28554c8357bf0b747e1bfc43d"
      ],
      "author": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Fri Sep 18 15:27:45 2026 +0000"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Mon Sep 28 16:36:46 2026 +0000"
      },
      "message": "[#8626] Log raw email headers and SPF/DMARC/DKIM verification results for monitor mode\n"
    },
    {
      "commit": "b61c5ab0f170bbe28554c8357bf0b747e1bfc43d",
      "tree": "942101bb4398ec8dbfb75228d1d128ae1af6ceed",
      "parents": [
        "b25cdbb0682a1106ce10e89905a7285cb03c9748"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 15 15:33:30 2026 -0400"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] edit support for OAuth1 and OAuth2 apps\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b25cdbb0682a1106ce10e89905a7285cb03c9748",
      "tree": "3fe1785ba8d177313419446bca6320d62379ff54",
      "parents": [
        "f6e76e975cc20252a2ce81a592ff949dd29e8364"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 15 15:15:25 2026 -0400"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] validate OAuth1 callback URIs\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f6e76e975cc20252a2ce81a592ff949dd29e8364",
      "tree": "e52b885fbaea52e7f331478e1c13086b5b62161d",
      "parents": [
        "956e6a65898cbc9c6e4d2e7850660f34f7d2b888"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 15 13:35:07 2026 -0400"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] update SECURITY.md and post-install instructions\n"
    },
    {
      "commit": "956e6a65898cbc9c6e4d2e7850660f34f7d2b888",
      "tree": "cdaeda259a68aa7e204e81f89b01dde2def5a981",
      "parents": [
        "0732ea91cc4b20cc59e1b6e48559779df3669767"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 15 12:31:09 2026 -0400"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] deprecate ForgeChat\n"
    },
    {
      "commit": "0732ea91cc4b20cc59e1b6e48559779df3669767",
      "tree": "4ddd022e150bc2feca8fbb0f3a2b23a11477d00a",
      "parents": [
        "65c7cf1f258d918263bd34f8768be2fc4fdc36c4"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Wed Sep 16 20:42:22 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] ForgeFiles: scope the breadcrumb folder lookup to the current tool\n\nfolder_breadcrumbs() looked folders up by name alone, unlike every other\nquery in the controller, so a folder belonging to another project could be\nreturned and its ancestor names rendered into the breadcrumb links. Scope\nthe lookup by app_config_id, and skip a path segment that no longer\nresolves rather than failing on it.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "65c7cf1f258d918263bd34f8768be2fc4fdc36c4",
      "tree": "6f6abef4173db32cc54a3d46cd7fc7b3785351e6",
      "parents": [
        "1b1c7ce4d377c1c9fa2f8ad305fe890459560454"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Wed Sep 16 20:40:57 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] ForgeUserStats: skip projects the viewer cannot read\n\nThe \"preferred categories\" table on a user\u0027s stats page was built from\nUser.my_projects(), which filters only on deleted and applies no\npermission check, so it reported trove topics of private projects to any\nvisitor. Filter on read access the way ProjectsSectionBase.get_projects()\nalready does when listing a user\u0027s projects on their profile.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "1b1c7ce4d377c1c9fa2f8ad305fe890459560454",
      "tree": "f22f111de66920b54e45da5360d60dfde37004c2",
      "parents": [
        "73943fa8508b7e4d79d21cc94d543739594c7766"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 08 16:55:30 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] bound the pagination offset\n\nhandle_paging() capped the page size but not the page number, so the\nresulting offset could be made arbitrarily large from a query string and\nboth Solr and Mongo have to walk to it before returning a window. Clamp it\nto page_offset_max, which 0 disables.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "73943fa8508b7e4d79d21cc94d543739594c7766",
      "tree": "af885f4a5edd48bfd3c685a15f82860406261aad",
      "parents": [
        "419e069c11fc8b44f86310b91d508ad1349e48bd"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 08 16:52:37 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] sync content rate limiting in REST API with webpage limiting\n\nThe comment rate limit was only applied on the HTML path, so the same\naction through /rest/ skipped it. Apply it in ThreadRestController.new and\nPostRestController.reply, returning 429 rather than the HTML path\u0027s flash\nand redirect.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "419e069c11fc8b44f86310b91d508ad1349e48bd",
      "tree": "e4f0892283d213d8a6d2944c41faf6839bbd3eb3",
      "parents": [
        "5fe4c1dc98696a810a4f42a2a9bbae753a36971f"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 08 16:53:41 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] record OAuth1 nonces instead of accepting any\n\nvalidate_timestamp_and_nonce was a stub returning True, so a signed\nrequest could be replayed. Record each (client_key, timestamp, nonce) in a\nnew collection with a unique index, and reject timestamps outside the\naccepted window. A TTL index expires the rows, so no cleanup job is\nneeded.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "5fe4c1dc98696a810a4f42a2a9bbae753a36971f",
      "tree": "9ed543046661d89fd563db900959be6214b4268b",
      "parents": [
        "8f425af36369749dd78424f212255d370dc839c9"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 08 17:37:35 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] validate the solr sort parameter\n\nThe sort parameter was passed through to solr unchecked from every search\nentry point. Solr accepts function queries there, which are evaluated per\nmatching document, so a caller could choose an arbitrary and expensive\nsort expression. Require a field name with an optional direction, and drop\nanything else so the search still runs with solr\u0027s default ordering.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "8f425af36369749dd78424f212255d370dc839c9",
      "tree": "b8492af317e001b853fdac3b6636296f21a090ab",
      "parents": [
        "755c2134a89d272998d1d4ef4d0acafaef3e7cd8"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 08 16:53:26 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] validate search filter field names\n\nsearch_artifact() escaped filter values but built the field name into the\nfq clause unchanged, and the filter is parsed from caller-supplied JSON.\nRequire field names to be plain identifiers and coerce values to str, so a\nnon-string value no longer raises out of the request either.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "755c2134a89d272998d1d4ef4d0acafaef3e7cd8",
      "tree": "8107b476efc5376012872e7ce59ebf458865934d",
      "parents": [
        "5742e962c48cb0199a2f8d213b2932d0c5e8999c"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 08 16:51:57 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] apply the moderation status check to post permalinks\n\nPostController.index only checked whether a post was deleted, so a post\nheld for moderation or marked as spam was still rendered in full at its\nown URL even though it is filtered out of thread listings, feeds and\nsearch. Use the same check PostRestController.index already had.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "5742e962c48cb0199a2f8d213b2932d0c5e8999c",
      "tree": "a150b85bd1e2c324b211bfb1c8b5cbc0fc327feb",
      "parents": [
        "007daa95f41e65ddcbc36840a4ed916df2b9d195"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 08 16:50:43 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:54 2026 +0000"
      },
      "message": "[#8624] remove Feed entries when content is deleted or restricted\n\nFeed entries keep a copy of the artifact\u0027s title and body and are served\nwithout re-checking the artifact, but nothing removed them once created.\nArtifact.delete() now clears them, and a revoke_feed_entries() hook is\ncalled from the tracker/wiki/comment soft-delete and spam paths and when a\nticket is made private. ForgeBlog already did this in BlogPost.delete().\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "007daa95f41e65ddcbc36840a4ed916df2b9d195",
      "tree": "ef68f9c0f034f7eba806441c6551dcb7b243f33d",
      "parents": [
        "0832402abe685f0dd117471e604668c717fb08c3"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 08 16:42:48 2026 +0000"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:53 2026 +0000"
      },
      "message": "[#8624] ForgeBlog: restrict fields accepted by the REST create endpoint\n\nThe REST create handler forwarded arbitrary request parameters into\nBlogPost.new(), which set each one on the new artifact. Pass only the\ndocumented fields. Also run the spam check the HTML path already ran.\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01CbUqCrWrninjwW3vSrxxbC\n"
    },
    {
      "commit": "0832402abe685f0dd117471e604668c717fb08c3",
      "tree": "945796abb40380f569ffe1f7146101a8e8a94175",
      "parents": [
        "94329b7616f61851e3e1d140c57612c2b58193be"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Sep 16 14:04:46 2026 -0400"
      },
      "committer": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Mon Sep 21 14:57:53 2026 +0000"
      },
      "message": "[#8624] mark tests that need network, and a --no-network flag to skip them\n\nCo-Authored-By: Claude Opus 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "94329b7616f61851e3e1d140c57612c2b58193be",
      "tree": "75aa5d105e39952a6f240f71a4da50271edd0c20",
      "parents": [
        "ebb6c7c87af22db90671b2eefa206a66a55d0991"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Mon Sep 21 14:46:07 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Mon Sep 21 14:46:07 2026 +0000"
      },
      "message": "bumping soupsieve 2.8.4 -\u003e 2.9.2\n"
    },
    {
      "commit": "ebb6c7c87af22db90671b2eefa206a66a55d0991",
      "tree": "1b9d3e0d43b62a3d17b74adaa4475288f211a305",
      "parents": [
        "c30ee2a8c03c5ddd701db2a2d609fcd3a1323b2a"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Fri Sep 11 16:08:03 2026 +0000"
      },
      "committer": {
        "name": "Dillon Walls",
        "email": "dillon.walls@slashdotmedia.com",
        "time": "Fri Sep 18 15:26:29 2026 +0000"
      },
      "message": "[#8623] bound the easywidgets resource cache and cap _slim requests\n"
    },
    {
      "commit": "c30ee2a8c03c5ddd701db2a2d609fcd3a1323b2a",
      "tree": "0a3504843b2f77e859f971f952903bd50c4f0d7a",
      "parents": [
        "bd7668079f193e1a46aba97c2a37078cb66fa4d4"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Fri Sep 11 00:17:10 2026 +0000"
      },
      "committer": {
        "name": "Dillon Walls",
        "email": "dillon.walls@slashdotmedia.com",
        "time": "Fri Sep 18 15:26:29 2026 +0000"
      },
      "message": "[#8623] keep inline script/style bodies raw under easywidgets autoescaping\n"
    },
    {
      "commit": "bd7668079f193e1a46aba97c2a37078cb66fa4d4",
      "tree": "2e5ba310424a524566f92fea25d61ee63d586e72",
      "parents": [
        "281c0ba2c680877ba525e92593390700488d8670"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Sep 10 12:39:33 2026 -0600"
      },
      "committer": {
        "name": "Dillon Walls",
        "email": "dillon.walls@slashdotmedia.com",
        "time": "Fri Sep 18 15:26:29 2026 +0000"
      },
      "message": "security fixes: turn on autoescaping for widgets, fix tracker select XSS\n"
    },
    {
      "commit": "281c0ba2c680877ba525e92593390700488d8670",
      "tree": "401e56a3c1bdd57de80beaef22e5476c1332c9cb",
      "parents": [
        "17b40870a524a5738b52d0ccf69fe8fbe10d90eb"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Sep 17 20:24:50 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Sep 17 20:55:13 2026 +0000"
      },
      "message": "[#8618] optimze the way to read the raw stream and a small change since now the content is bytes\n"
    },
    {
      "commit": "17b40870a524a5738b52d0ccf69fe8fbe10d90eb",
      "tree": "e3ea34be8b051466dcc9242c8bb9a2ee879ce5b9",
      "parents": [
        "45090eb14c45a03ce83e86358f2ddafa4f2a6fd1"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Sep 09 14:08:50 2026 -0400"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Sep 17 20:55:13 2026 +0000"
      },
      "message": "[#8618] harden rev_parse() against git\u0027s relative-ref syntax\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "45090eb14c45a03ce83e86358f2ddafa4f2a6fd1",
      "tree": "796c3e38724965219862bd5b5a7c564bd8807e22",
      "parents": [
        "6903a0543b50290e09efee1445194ef02810a16d"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Sep 09 13:30:42 2026 -0400"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Sep 17 20:55:13 2026 +0000"
      },
      "message": "[#8618] read git blob content via a one-off subprocess, not the shared cat-file pipe\n\nopen_blob() now runs a dedicated `git cat-file -p \u003csha\u003e` subprocess per read\ninstead of going through GitPython\u0027s persistent, shared `cat-file --batch`\nprocess. A raw file download hands its blob content off to the WSGI layer as\na streaming response, and that response\u0027s consumption (and therefore its\ncleanup) is outside our control: a vanished client or a WSGI server that\ndoesn\u0027t reliably close an abandoned response iterator can leave the shared\nprocess holding unread bytes. Because MongoDB session cleanup for a streaming\nresponse is deferred until the response is closed or exhausted, a later,\nunrelated request on the same repo can end up reusing that same dirty\nsession and pipe, misreading the leftover bytes as its own response.\n\nblob_size() stays on the shared persistent process: it always finishes in\none synchronous call and is never handed off to a response iterator, so it\nisn\u0027t exposed to this risk, and keeping it on the fast path avoids adding\nsubprocess-spawn overhead to the common file-view/size-check case.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_012x5jtE8bYdSJRQuXBC2jzg\n"
    },
    {
      "commit": "6903a0543b50290e09efee1445194ef02810a16d",
      "tree": "4009931e8cab78e879a25d75e55f4a29e9281197",
      "parents": [
        "00120dbb4a58e0ba2e023e9aeb5c0f43e7e9f08d"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Sep 17 14:30:20 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Sep 17 14:30:20 2026 +0000"
      },
      "message": "bumping gitpython 3.1.59 -\u003e 3.1.62\n"
    },
    {
      "commit": "00120dbb4a58e0ba2e023e9aeb5c0f43e7e9f08d",
      "tree": "df64419c9ca8fcb805f5cea676fdba4945e11ec1",
      "parents": [
        "98bc2afb34a2b6b0996833c35506bdc2c69bbb36"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 15 10:59:03 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Sep 15 10:59:03 2026 -0400"
      },
      "message": "error handling around \"magic\" lib\n"
    },
    {
      "commit": "98bc2afb34a2b6b0996833c35506bdc2c69bbb36",
      "tree": "8af2dac1fb9f3ee4c44a3c10c58428867e9dd8ff",
      "parents": [
        "3aed169fbb9cff274483eb64de380f04951684aa"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:43:40 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Sep 10 13:02:20 2026 -0400"
      },
      "message": "[#8619] test for text_contains_hostname substring bypass\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_018KZ3wfWGSAzjfQj3neMfG3\n"
    },
    {
      "commit": "3aed169fbb9cff274483eb64de380f04951684aa",
      "tree": "3838d036c7d371fb3f022827a0f006dc37bc75bd",
      "parents": [
        "bea428ded93c481cb7b26cb6ccb579f63399e1a6"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:32:52 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Sep 10 13:02:20 2026 -0400"
      },
      "message": "[#8619] test for class/id sanitization on void elements\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_018KZ3wfWGSAzjfQj3neMfG3\n"
    },
    {
      "commit": "bea428ded93c481cb7b26cb6ccb579f63399e1a6",
      "tree": "5b48890579a72643b4f658d3fc7d7bd04d025d16",
      "parents": [
        "623230735c8934ff3130c4162d5fff464111c99b"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:31:56 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Sep 10 13:02:20 2026 -0400"
      },
      "message": "[#8619] test for iframe body mXSS via math/svg reparse\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_018KZ3wfWGSAzjfQj3neMfG3\n"
    },
    {
      "commit": "623230735c8934ff3130c4162d5fff464111c99b",
      "tree": "0be5fefcd2abd11ea32cced7b295b68736ccfaf2",
      "parents": [
        "2037366491d532a3948d815775c517622f17c8c7"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:31:03 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Sep 10 13:02:20 2026 -0400"
      },
      "message": "[#8619] test for SVG blocked, MathML allowed\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_018KZ3wfWGSAzjfQj3neMfG3\n"
    },
    {
      "commit": "2037366491d532a3948d815775c517622f17c8c7",
      "tree": "a074a442210f10f2df37b4208645a95b6eb6d8a6",
      "parents": [
        "b71f771a1ddcdc80bcd96b2000133b6d55b43f97"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:12:24 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Sep 10 13:02:20 2026 -0400"
      },
      "message": "[#8619] test for iframe followed by script\n"
    },
    {
      "commit": "b71f771a1ddcdc80bcd96b2000133b6d55b43f97",
      "tree": "369de4c8dc2bf3c74b361a14abd49ac4160b294b",
      "parents": [
        "981bd98f4226ec59eeaf1402a022f0d8d9121d22"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 17:03:37 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Sep 10 13:02:20 2026 -0400"
      },
      "message": "[#8621] test for FTP redirect bypassing internal-host protection\n\nNonPrivateUrl is only checked by our http/https handlers. A redirect\nto ftp:// reaches urllib\u0027s default FTPHandler, which has no such\ncheck, so it can reach internal/private hosts unvalidated.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "981bd98f4226ec59eeaf1402a022f0d8d9121d22",
      "tree": "370dbf8274d194769e2a15c9e8e35f5a7b2632e3",
      "parents": [
        "6696da52f1ecf782cd843a32414fb29b1a1b99b6"
      ],
      "author": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Thu Aug 20 22:24:36 2026 -0600"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Fri Sep 04 21:18:24 2026 +0000"
      },
      "message": "[#8617] Update User\u0027s set_tool_data to store encrypted tool data values\n"
    },
    {
      "commit": "6696da52f1ecf782cd843a32414fb29b1a1b99b6",
      "tree": "5c11bf5aba576343bc64ffdc7c072491be28323a",
      "parents": [
        "e518d9e13391b3ee14ae13f8cbbe60d23cddea6f"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Fri Sep 04 19:18:22 2026 +0000"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Fri Sep 04 19:18:22 2026 +0000"
      },
      "message": "add to SECURITY.md\n"
    },
    {
      "commit": "e518d9e13391b3ee14ae13f8cbbe60d23cddea6f",
      "tree": "d76fff4997e0fdb7b3e2cb3e9aad7fde9b446ac2",
      "parents": [
        "e0f558625020463a9ad2af7744bafdae9ee321ec"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Sep 03 12:52:24 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Sep 03 12:52:24 2026 -0400"
      },
      "message": "publicize CVEs in 1.21.0\n"
    },
    {
      "commit": "e0f558625020463a9ad2af7744bafdae9ee321ec",
      "tree": "b33c283c0b933b1ee9877dadef65fb8fca0de0ac",
      "parents": [
        "b172c8f045a37d52085083bc26384ec83ecff782"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Sep 02 12:05:07 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Sep 02 12:05:07 2026 -0400"
      },
      "message": "optimize _get_site_notification in case of users with many projects\n"
    },
    {
      "commit": "b172c8f045a37d52085083bc26384ec83ecff782",
      "tree": "b062b5029335d32debe0a4beef9cedc7d05347f2",
      "parents": [
        "467bdd4ede27ebddf001504b49492fe377845315"
      ],
      "author": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Fri Aug 14 15:59:40 2026 -0600"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dbrondsema@slashdotmedia.com",
        "time": "Tue Sep 01 16:30:37 2026 +0000"
      },
      "message": "[#6054] inbound sender authentication\n"
    },
    {
      "commit": "467bdd4ede27ebddf001504b49492fe377845315",
      "tree": "db152841cc626d617cd2d033aff220bd5a98d284",
      "parents": [
        "d938172aea9449586855733068c5363c8e729a63"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Aug 31 09:57:47 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Mon Aug 31 09:57:47 2026 -0400"
      },
      "message": "CHANGES updated for ASF release 1.21.0\n"
    },
    {
      "commit": "d938172aea9449586855733068c5363c8e729a63",
      "tree": "089b2af71ef2c14c1be373c5b10dee01ff040d3b",
      "parents": [
        "745fe1ac3a79789c24acdc41ca9634555d95943f"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Fri Aug 28 16:06:14 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Fri Aug 28 16:46:53 2026 -0400"
      },
      "message": "strengthen _verify_return_to and tests for webob upgrade\n"
    },
    {
      "commit": "745fe1ac3a79789c24acdc41ca9634555d95943f",
      "tree": "316269a5ff83bbd47b15130ba2ee543fc01dfef2",
      "parents": [
        "2ac3817ca2b77b813420da6070234c5ba4840dbf"
      ],
      "author": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Fri Aug 28 15:39:59 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Fri Aug 28 15:39:59 2026 +0000"
      },
      "message": "bumping webob 1.8.10 -\u003e 1.8.11\n"
    },
    {
      "commit": "2ac3817ca2b77b813420da6070234c5ba4840dbf",
      "tree": "047169b0333549319bf22e94d2efaa40893f92a7",
      "parents": [
        "6456d71694d8bbaafd0ac28f82902290e2a33829"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 16:07:25 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Fri Aug 28 11:13:07 2026 -0400"
      },
      "message": "update discussion thread logic for consistency\n"
    },
    {
      "commit": "6456d71694d8bbaafd0ac28f82902290e2a33829",
      "tree": "752acef51e0b5b6149056d9a690e22f35943f1fe",
      "parents": [
        "f09fad9a262f11a2a98df99f8230424d82a98fa1"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 16:32:32 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 16:32:32 2026 -0400"
      },
      "message": "add license to SECURITY.md\n"
    },
    {
      "commit": "f09fad9a262f11a2a98df99f8230424d82a98fa1",
      "tree": "1197c19b831a2a191aa7cfbda2a8cd4c903bb0c5",
      "parents": [
        "a1cae1ffa0d4009c71e8f4f4414095584c8042bb"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 15:37:10 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 15:37:10 2026 -0400"
      },
      "message": "retry test_markdown_many_bad_links a few times to avoid false-positive failures\n"
    },
    {
      "commit": "a1cae1ffa0d4009c71e8f4f4414095584c8042bb",
      "tree": "83eceb5d0f2a29ebd39df8f801e30f5c5dc4d7ba",
      "parents": [
        "e1dd8e4586c32f15ac15d0757c105c8fd5440eff"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 14:38:12 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 14:38:12 2026 -0400"
      },
      "message": "start a SECURITY.md\n"
    },
    {
      "commit": "e1dd8e4586c32f15ac15d0757c105c8fd5440eff",
      "tree": "d4e825efd95d3fbefecc1417acbc46b151dc0054",
      "parents": [
        "534a0b1f9f9321147259bef142aded0418e58775"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 12:34:22 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Thu Aug 27 12:34:22 2026 -0400"
      },
      "message": "increase ulimits on docker web to avoid \"Too many open files\" during test runs at least\n"
    },
    {
      "commit": "534a0b1f9f9321147259bef142aded0418e58775",
      "tree": "93cefd97bcca74e73d50e13065b2b21195eb4e8a",
      "parents": [
        "f00edcdb0456a9ef30e8d1222357a4896ddc2b94"
      ],
      "author": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Aug 27 14:50:29 2026 +0000"
      },
      "committer": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Thu Aug 27 14:51:51 2026 +0000"
      },
      "message": "Fix: Force push tests\n"
    },
    {
      "commit": "f00edcdb0456a9ef30e8d1222357a4896ddc2b94",
      "tree": "2abb3d7609ed50a62a91c6c566062b7d3611996e",
      "parents": [
        "065fd8c473fd5f0bbe1824374cc6b1afad787efb"
      ],
      "author": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Tue Aug 11 19:30:47 2026 +0000"
      },
      "committer": {
        "name": "Guillermo Cruz",
        "email": "guillermo.cruz@slashdotmedia.com",
        "time": "Thu Aug 27 08:38:26 2026 -0600"
      },
      "message": "[#11714] more Permissions-Policy values drop Feature-policy\n"
    },
    {
      "commit": "065fd8c473fd5f0bbe1824374cc6b1afad787efb",
      "tree": "d8cbfbae1b2791ac70cc0cf09ce03e6ebbefd006",
      "parents": [
        "c1313dd406e111a0259ea2777701fce9df9b8b0c"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Aug 26 17:21:02 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Aug 26 17:21:02 2026 -0400"
      },
      "message": "turn on scm.force_push.git.enabled by default\n"
    },
    {
      "commit": "c1313dd406e111a0259ea2777701fce9df9b8b0c",
      "tree": "98ff8b9c6eb199ed7a28717f1cf4b9c96bd48f3e",
      "parents": [
        "2476a67ee2d337d73d680fe67d9d41b4f0e64916"
      ],
      "author": {
        "name": "Kenton Taylor",
        "email": "ktaylor@slashdotmedia.com",
        "time": "Wed Aug 26 19:38:42 2026 +0000"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Aug 26 16:00:21 2026 -0400"
      },
      "message": "[#8622] Rework search result filtering\n"
    },
    {
      "commit": "2476a67ee2d337d73d680fe67d9d41b4f0e64916",
      "tree": "9e397396de001cb4d1dce3278bbb33a78695b7b4",
      "parents": [
        "1a2c209c071373c9224e95651d92729c355056b2"
      ],
      "author": {
        "name": "Daniel Castillo",
        "email": "daniel.castillo@slashdotmedia.com",
        "time": "Tue Aug 25 15:36:30 2026 +0000"
      },
      "committer": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Wed Aug 26 12:05:21 2026 -0600"
      },
      "message": "[#12049] Fix for sync repo config command\n"
    },
    {
      "commit": "1a2c209c071373c9224e95651d92729c355056b2",
      "tree": "68364469d3a78cf2b916775912a822bdcb43c600",
      "parents": [
        "2f76400493769b2916c0cb59fb47f3fcbaf21e1a"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 17:22:00 2026 -0400"
      },
      "committer": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Wed Aug 26 11:34:26 2026 -0600"
      },
      "message": "[#8621] drop ftp/file/data url handlers\n"
    },
    {
      "commit": "2f76400493769b2916c0cb59fb47f3fcbaf21e1a",
      "tree": "e15bc7be64e75616a2efdf7ed98d5a87934656f4",
      "parents": [
        "33d27d1c610f16f6fac2c6de766386e862018816"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 18:41:36 2026 -0400"
      },
      "committer": {
        "name": "Carlos Cruz",
        "email": "carlos.cruz@slashdotmedia.com",
        "time": "Wed Aug 26 11:33:47 2026 -0600"
      },
      "message": "[#8620] fix space handling in renamed files\n"
    },
    {
      "commit": "33d27d1c610f16f6fac2c6de766386e862018816",
      "tree": "1ed9ad09fb98cbd68d37fae57fbbdebcea6c7b8b",
      "parents": [
        "92173b8f69a00630b3f2fd9f64cd564ef331dac1"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:49:27 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Aug 26 11:47:59 2026 -0400"
      },
      "message": "[#8619] invalidate markdown caches\n"
    },
    {
      "commit": "92173b8f69a00630b3f2fd9f64cd564ef331dac1",
      "tree": "55112f5b5bbab0380609518a9b6fce15723846a7",
      "parents": [
        "241598ca5b64045fa1e297a5f35b5c770cb5c392"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:44:08 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Aug 26 11:47:59 2026 -0400"
      },
      "message": "[#8619] fix text_contains_hostname substring bypass\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_018KZ3wfWGSAzjfQj3neMfG3\n"
    },
    {
      "commit": "241598ca5b64045fa1e297a5f35b5c770cb5c392",
      "tree": "c60065c93239700374567a79758dc500619ec73b",
      "parents": [
        "9e70d61f14b5f87b307167be01485a2dcf1eb580"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:33:18 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Aug 26 11:47:59 2026 -0400"
      },
      "message": "[#8619] sanitize class/id on void elements too\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_018KZ3wfWGSAzjfQj3neMfG3\n"
    },
    {
      "commit": "9e70d61f14b5f87b307167be01485a2dcf1eb580",
      "tree": "1f635c1990eba8871ce4173aee3e3b608f5111ef",
      "parents": [
        "17f1a88131e015865354f90adc9c3d5a605a148d"
      ],
      "author": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Tue Aug 25 16:32:37 2026 -0400"
      },
      "committer": {
        "name": "Dave Brondsema",
        "email": "dave@brondsema.net",
        "time": "Wed Aug 26 11:47:59 2026 -0400"
      },
      "message": "[#8619] drop allowed iframe\u0027s body\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_018KZ3wfWGSAzjfQj3neMfG3\n"
    }
  ],
  "next": "17f1a88131e015865354f90adc9c3d5a605a148d"
}
