)]}'
{
  "log": [
    {
      "commit": "88795b70a6115d7b7c69304499667fa34e133f0e",
      "tree": "8c98f64fd5fdb2ac4616034bb16855ef89d83bb5",
      "parents": [
        "e2d4d2c11195bfb9bc70224f47d55868e53cbea2"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Oct 30 12:31:00 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Oct 30 12:31:00 2026 -0400"
      },
      "message": "Look the right place for Podling releases.\n"
    },
    {
      "commit": "e2d4d2c11195bfb9bc70224f47d55868e53cbea2",
      "tree": "3aa5d7d0da192810cce8bf9ca8bd7054886f1863",
      "parents": [
        "b84c3bc93d6609b1c6c4cff58fcfbf3197419f6c"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Oct 30 10:41:28 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Oct 30 10:41:28 2026 -0400"
      },
      "message": "Re-style nav tabs\n"
    },
    {
      "commit": "b84c3bc93d6609b1c6c4cff58fcfbf3197419f6c",
      "tree": "e96bee20f3eb93b118abdfe35ecbc9e289c0d349",
      "parents": [
        "e184c5726aca97c76a7ab5d9e82061ae75e3725b"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Oct 30 09:12:56 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Oct 30 09:12:56 2026 -0400"
      },
      "message": "Unified theme with projects.a.o\n"
    },
    {
      "commit": "e184c5726aca97c76a7ab5d9e82061ae75e3725b",
      "tree": "cae4fe9280b2af99df1eaf7206365ece57e1fccc",
      "parents": [
        "a780a70c70bafee23000af67787e03c17026a882"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Oct 24 16:46:31 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Oct 24 16:46:31 2026 +0100"
      },
      "message": "Unused\n"
    },
    {
      "commit": "a780a70c70bafee23000af67787e03c17026a882",
      "tree": "980dba760ea409dcc285b65202e75abd68c61816",
      "parents": [
        "8aaf3b997c6586ba518a59dc9db06b148ddbf8d3"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Oct 19 10:16:40 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Oct 19 10:16:40 2026 +0100"
      },
      "message": "Add some more timings\n"
    },
    {
      "commit": "8aaf3b997c6586ba518a59dc9db06b148ddbf8d3",
      "tree": "4a78505d2f106c0f7cef287566cca084abd552ef",
      "parents": [
        "92e1f32055a207cb464636b267e585c4b579566d"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Oct 19 10:05:43 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Oct 19 10:05:43 2026 +0100"
      },
      "message": "Match build\n"
    },
    {
      "commit": "92e1f32055a207cb464636b267e585c4b579566d",
      "tree": "c8d606635fbd1f2a306ce7e5806c63702d9f2cb6",
      "parents": [
        "c647929b681081de0efba5c4353f33d8ea77a964"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Oct 16 14:07:34 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Oct 16 14:07:34 2026 +0100"
      },
      "message": "Add timing information for batch jobs\n"
    },
    {
      "commit": "c647929b681081de0efba5c4353f33d8ea77a964",
      "tree": "855c44c49312eb9fcaef850d86b845ce4aa13f52",
      "parents": [
        "2d4a2b9123bbe3c04ff866ad14f3b73b65ba127c"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Oct 16 13:23:51 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Oct 16 13:23:51 2026 +0100"
      },
      "message": "Show failing URL\n"
    },
    {
      "commit": "2d4a2b9123bbe3c04ff866ad14f3b73b65ba127c",
      "tree": "e200e078a3fbe945db8b804f5e7e5a224388f69e",
      "parents": [
        "61c270981dfcbcf21290450e9a60b2f46e67c4f6"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Oct 16 13:23:26 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Oct 16 13:23:26 2026 +0100"
      },
      "message": "Fix perl svn location\n"
    },
    {
      "commit": "61c270981dfcbcf21290450e9a60b2f46e67c4f6",
      "tree": "03d6f3d5139753e531bd1b31fa68f9302834215a",
      "parents": [
        "5f4572191fd6a94b41fd59498090cc18b5f5a5c8"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Oct 16 11:47:34 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Oct 16 11:47:34 2026 +0100"
      },
      "message": "Now on projects.a.o\n"
    },
    {
      "commit": "5f4572191fd6a94b41fd59498090cc18b5f5a5c8",
      "tree": "63d4561207690b5200410afe3dcd0e8c33c57313",
      "parents": [
        "36908d0c6110c0f0886b557ac5dbfb7287466499"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Thu Oct 08 13:54:25 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Thu Oct 08 13:54:25 2026 +0100"
      },
      "message": "extra spaces so dates align in log\n"
    },
    {
      "commit": "36908d0c6110c0f0886b557ac5dbfb7287466499",
      "tree": "40518ad2120ad65f967ea0ea6e741719ad623b73",
      "parents": [
        "c3a13a22adbfb7e79a54a42408a45eea3e926aff"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Oct 05 16:22:24 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Oct 05 16:22:24 2026 +0100"
      },
      "message": "Preserve 1st param\n"
    },
    {
      "commit": "c3a13a22adbfb7e79a54a42408a45eea3e926aff",
      "tree": "8d65edb669261121d2dae35fd0f57c876cfe4100",
      "parents": [
        "5087f2116201ccacd9c8629e60ecce8c6e7dfc18"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Oct 04 12:11:19 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Oct 04 12:11:19 2026 +0100"
      },
      "message": "Add timestamps\n\nChange to weekly/daily to better document crontab frequency\n"
    },
    {
      "commit": "5087f2116201ccacd9c8629e60ecce8c6e7dfc18",
      "tree": "2bd5f98c79ddd26ea73c25dbafc61f21a9678546",
      "parents": [
        "c5c7caf8780470ccd23882267fc3bb396cb20516"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebbASF@users.noreply.github.com",
        "time": "Thu Oct 01 22:05:56 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 01 22:05:56 2026 +0100"
      },
      "message": "Modify full run to refresh repositories\n\nUpdated the full run command to always refresh repositories."
    },
    {
      "commit": "c5c7caf8780470ccd23882267fc3bb396cb20516",
      "tree": "235ab0af938053e4c1b45dddcbb9b33466efda1a",
      "parents": [
        "e20f4c6baf33790538b250fdd1359505f8b52e7b"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Thu Oct 01 21:56:53 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Thu Oct 01 21:56:53 2026 +0100"
      },
      "message": "Change to deployed site\n"
    },
    {
      "commit": "e20f4c6baf33790538b250fdd1359505f8b52e7b",
      "tree": "d586af08a129d2abc1558c4b6f6389f6e3d358a7",
      "parents": [
        "b574abcd550889121bd2d6f17a50b8449de0386b"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Thu Oct 01 21:06:24 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Thu Oct 01 21:06:24 2026 +0100"
      },
      "message": "Allow uv to be found under cron\n"
    },
    {
      "commit": "b574abcd550889121bd2d6f17a50b8449de0386b",
      "tree": "6b327c6603b3e43688de16e1901e2476929fcce3",
      "parents": [
        "409bad095accb27d1a4560a91d2b133cdc26405d"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Tue Sep 29 17:37:00 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Tue Sep 29 17:37:00 2026 +0100"
      },
      "message": "Initial stab at build script\n"
    },
    {
      "commit": "409bad095accb27d1a4560a91d2b133cdc26405d",
      "tree": "980f3829a33bd2b883bf7632ce7521d6068a1d9c",
      "parents": [
        "c7779fb0c8b00a562595067354283baa0bd2cb2d",
        "118a54707ffc10c577628df1755b7ab80e6283dc"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 25 17:35:44 2026 -0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 25 17:35:44 2026 -0300"
      },
      "message": "Merge pull request #10 from apache/rbowen-participants\n\nDisplay number of mailing list participants each month"
    },
    {
      "commit": "118a54707ffc10c577628df1755b7ab80e6283dc",
      "tree": "980f3829a33bd2b883bf7632ce7521d6068a1d9c",
      "parents": [
        "31cd13407066ec6801906cca7a6f246e77681e2f"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 25 16:33:34 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 25 16:33:34 2026 -0400"
      },
      "message": "Parallelize per-month participant API calls (max 4 concurrent)\n\nRun the per-month numparts requests for high-volume months\nconcurrently via a bounded thread pool instead of serially.\nCapped at 4 in-flight requests to stay a polite consumer of the\nshared Pony Mail API. Roughly halves cold-refresh time on\nhigh-volume projects with no change to results.\n\n- Bounded ThreadPoolExecutor (max 4 workers) in the hybrid\n  participant counter; small months still counted client-side\n- Thread-safe per-month call counter (lock-guarded)\n- No change to counts, accuracy, or cache format\n"
    },
    {
      "commit": "31cd13407066ec6801906cca7a6f246e77681e2f",
      "tree": "c4f696981bc56cd0b0596c087051e7e3c43eeea5",
      "parents": [
        "c7779fb0c8b00a562595067354283baa0bd2cb2d"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 25 16:26:53 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 25 16:26:53 2026 -0400"
      },
      "message": "Add per-month participant counts to mailing list metrics\n\nShow distinct participants alongside message volume in the Monthly\nMessages view: a participants column in the list table and a\nparticipant line overlaid on the chart.\n\n- Parse authors from stats.json emails[], normalizing \"(via GitHub)\"\n  relays to the underlying username\n- Hybrid counting: client-side from emails[] for low-volume months,\n  per-month numparts API calls for high-volume months where emails[]\n  is capped\n- Fetch one month wider than the reporting window so the chart\u0027s\n  leftmost month has participant data\n- Fix chart tooltip z-index so it renders above all bars\n- Add per-project timing and API-call instrumentation to the CLI\n"
    },
    {
      "commit": "c7779fb0c8b00a562595067354283baa0bd2cb2d",
      "tree": "7838d14e4c1fe9f995ac99e75e50c8d4223f4103",
      "parents": [
        "077a082090d0cf3d385874a2dae28c5d36af1c1e"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 25 17:56:11 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 25 17:56:11 2026 +0100"
      },
      "message": "Ensure updates to HTML files are not cached\n"
    },
    {
      "commit": "077a082090d0cf3d385874a2dae28c5d36af1c1e",
      "tree": "beab31bf3f783dafdef021d72b6c3e527368a36c",
      "parents": [
        "364ad3ed8868468338b85950ceae6ff0a4020849"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 20 00:34:58 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 20 00:34:58 2026 +0100"
      },
      "message": "Parameter is unused but still passed; unnecessary f-strings\n"
    },
    {
      "commit": "364ad3ed8868468338b85950ceae6ff0a4020849",
      "tree": "4bd98ffa998378d6102889f6019fd698f1fda58d",
      "parents": [
        "e8b1ce7233811730b4fc3db956f37dbcc02082f1"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 20 00:27:50 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 20 00:27:50 2026 +0100"
      },
      "message": "Unused\n"
    },
    {
      "commit": "e8b1ce7233811730b4fc3db956f37dbcc02082f1",
      "tree": "0c4f9a35ffd06cd7bac6f9fdf256f4543f0a2538",
      "parents": [
        "d17ce3eddb060f59cfb239a963810765b34bda97"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 20 00:24:22 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 20 00:24:22 2026 +0100"
      },
      "message": "Specify open encoding\n"
    },
    {
      "commit": "d17ce3eddb060f59cfb239a963810765b34bda97",
      "tree": "0f3e9d62cb1be8a689491c0844bd4482243bf2a2",
      "parents": [
        "cb40374f8aadfcd0628a6b2b0941b278e29e92ab"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 20 00:11:02 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 20 00:11:02 2026 +0100"
      },
      "message": "Unused\n"
    },
    {
      "commit": "cb40374f8aadfcd0628a6b2b0941b278e29e92ab",
      "tree": "5dd7360e82338ee70665a546bdf6d56a44ca4137",
      "parents": [
        "55fe4bd4260d6b944703520b1ec89227daf45743"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Sep 19 18:13:50 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Sep 19 18:13:50 2026 +0100"
      },
      "message": "Bug: cache being used for 2 different things\n"
    },
    {
      "commit": "55fe4bd4260d6b944703520b1ec89227daf45743",
      "tree": "4879a03dcdc571e53b50a4902a2a80465b3e2e22",
      "parents": [
        "dac39affac1fb2374da27a77448f46925a124c53"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Sep 19 17:49:30 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Sep 19 17:49:30 2026 +0100"
      },
      "message": "Unused imports\n"
    },
    {
      "commit": "dac39affac1fb2374da27a77448f46925a124c53",
      "tree": "f0593952065ca01d1667ba4849935c01bc0c3e0e",
      "parents": [
        "de0a9281d7cc176a41835d50dae11b25fa4451db"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Sep 19 00:06:11 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Sep 19 00:06:11 2026 +0100"
      },
      "message": "Fix alignment\n"
    },
    {
      "commit": "de0a9281d7cc176a41835d50dae11b25fa4451db",
      "tree": "b592939cb40e72755615de0ae3a3619b51969264",
      "parents": [
        "7a4de19063d9a9a3e35d61e200a47ab8a8aeb3ae"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 23:29:46 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 23:29:46 2026 +0100"
      },
      "message": "Document new workflow\n"
    },
    {
      "commit": "7a4de19063d9a9a3e35d61e200a47ab8a8aeb3ae",
      "tree": "c0e5347f56420293de2977ac8c401f8aa8a31607",
      "parents": [
        "ffe59296505980983273da7441803526a669e069"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 23:21:59 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 23:21:59 2026 +0100"
      },
      "message": "No longer needed\n"
    },
    {
      "commit": "ffe59296505980983273da7441803526a669e069",
      "tree": "9fc5c75fd835a029e28b553c5300712a674fa73c",
      "parents": [
        "68b979163cc1f44b629ee47e8845bc3ee139e6db"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 23:19:02 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 23:19:02 2026 +0100"
      },
      "message": "Run code without expensive data refetch\n"
    },
    {
      "commit": "68b979163cc1f44b629ee47e8845bc3ee139e6db",
      "tree": "df626ee58015935de36c788de22b79c4b3ce5a53",
      "parents": [
        "20801a547fde59bc04f36becb270c32fe20e17c0"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:28:00 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:28:00 2026 -0400"
      },
      "message": "Fix build_project_map test fixtures — add missing default_branch field\n"
    },
    {
      "commit": "20801a547fde59bc04f36becb270c32fe20e17c0",
      "tree": "b55af35f81c4101c9e21ab36ccee681e7cbf0dde",
      "parents": [
        "0d21ed5e07c364c05e14458ee6b9686cc39b97ef"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:26:01 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:26:01 2026 -0400"
      },
      "message": "Add unit test suite with pytest\n\n33 pure unit tests covering:\n- collectors/cache.py: date helpers, cache load/save/invalidate\n- config.py: path resolution, constants, config loading\n- collectors/github_repos.py: repo classification, project map building\n- trends.py: quarter determination, trend computation\n- collectors/projects_apache_org.py: active project extraction\n- output/json_api.py: JSON file writing\n\nAll tests are pure (no network, no mocking) — filesystem tests use\npytest\u0027s tmp_path fixture.\n\nAlso:\n- Add pytest\u003e\u003d8.0 as a dev dependency ([dependency-groups] in pyproject.toml)\n- Add tests/ to project structure in README\n- Add Testing section to README\n- Add cache.py to project structure listing\n"
    },
    {
      "commit": "0d21ed5e07c364c05e14458ee6b9686cc39b97ef",
      "tree": "5447d4b22947733aa31b11a2d1bfaa31bbb6c677",
      "parents": [
        "07c009f49cfd532fb36bf34822bcca6a17cc45f2"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:16:16 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:16:16 2026 -0400"
      },
      "message": "Fix leftover docstring fragment from cache refactor\n\nThe regex removal of _cache_is_current() in git_activity.py left\nbehind the function\u0027s docstring body and implementation lines,\ncausing a SyntaxError. Remove the orphaned lines.\n\nPart of #2\n"
    },
    {
      "commit": "07c009f49cfd532fb36bf34822bcca6a17cc45f2",
      "tree": "e04fafbce896950565b7757deeeba70abb342c5f",
      "parents": [
        "ca802df9f9c8dcc8d74a0e72d897a18f23ba94e8"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:12:35 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:12:35 2026 -0400"
      },
      "message": "Extract shared cache utilities into collectors/cache.py (#2)\n\nThe mailing list and git activity collectors had 7 near-identical\nprivate functions for cache management (load, save, invalidate,\ndate helpers). Extract them into a shared cache.py module\nparameterized by collector name.\n\nAlso deduplicate GITHUB_API constant — now defined only in\ngithub_repos.py and imported by git_activity.py.\n\nPublic API unchanged: invalidate_cache() and invalidate_git_cache()\nremain as thin wrappers so cli.py imports don\u0027t change.\n\nPart of #2\n"
    },
    {
      "commit": "ca802df9f9c8dcc8d74a0e72d897a18f23ba94e8",
      "tree": "c3ea0c2d5645832a131693e7f13aaa355dd03ecf",
      "parents": [
        "90e6a9573d6b63e3cc90cd20fea3985f80eda191"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:06:57 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 13:06:57 2026 -0400"
      },
      "message": "Extract shared path constants and helpers into config.py (#2)\n\nThe default JSON output directory \u0027./site/data/\u0027 and subdirectory names\n(_cache, _state, _project_map.json, etc.) were duplicated as raw strings\nacross 7 files. Extract them into named constants and helper functions\nin config.py so they\u0027re defined in one place.\n\nNew constants in config.py:\n\n    DEFAULT_JSON_DIR      \u003d \u0027./site/data/\u0027\n    CACHE_SUBDIR          \u003d \u0027_cache\u0027\n    STATE_SUBDIR          \u003d \u0027_state\u0027\n    PROJECT_MAP_FILE      \u003d \u0027_project_map.json\u0027\n    MAILING_SUMMARY_FILE  \u003d \u0027mailing_summary.json\u0027\n    NEW_COMMITTERS_FILE   \u003d \u0027new_committers.json\u0027\n    FOUNDATION_FILE       \u003d \u0027_foundation\u0027\n\nNew helper functions:\n\n    get_json_dir(config)   -\u003e Path to output dir (from config or DEFAULT_JSON_DIR)\n    get_cache_dir(config)  -\u003e get_json_dir() / CACHE_SUBDIR\n    get_state_dir(config)  -\u003e get_json_dir() / STATE_SUBDIR\n\nAll three helpers create the directory if it doesn\u0027t exist.\n\nCloses #2\n"
    },
    {
      "commit": "90e6a9573d6b63e3cc90cd20fea3985f80eda191",
      "tree": "3f3c8d2c2574ba4a9cb4a57ac2054eb02a47f127",
      "parents": [
        "f2fb3192ccf9112ef9af13382d39d3237176fa15"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 12:46:06 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 12:46:35 2026 -0400"
      },
      "message": "Just-added projects with 30 new PMC members have a very different weight\nthan an older project with the same, so call that out.\n"
    },
    {
      "commit": "f2fb3192ccf9112ef9af13382d39d3237176fa15",
      "tree": "9f75475d0de8d5165a8b238f5e050ce2f83e732e",
      "parents": [
        "b6104431bdb0cf1b2ab5537ee448946947999517"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 17:45:42 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 17:45:42 2026 +0100"
      },
      "message": "Files were renamed\n"
    },
    {
      "commit": "b6104431bdb0cf1b2ab5537ee448946947999517",
      "tree": "a6e4bcbbd86386d5fa3bc875317ee6d6b2f9db42",
      "parents": [
        "0041a676fca0e25dc7933fb57b2eb6d65fba032c"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 17:43:54 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 17:43:54 2026 +0100"
      },
      "message": "Files were renamed\n"
    },
    {
      "commit": "0041a676fca0e25dc7933fb57b2eb6d65fba032c",
      "tree": "8e4b2c8780764f0ef2bc3733d8f3e8fbd8e39541",
      "parents": [
        "88b32e426f386c94d93d77d4299e355d401dc626"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 14:16:24 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Fri Sep 18 14:16:24 2026 +0100"
      },
      "message": "Standardise notifications\n"
    },
    {
      "commit": "88b32e426f386c94d93d77d4299e355d401dc626",
      "tree": "f3b74ec9228e66a8735435fad300f595bec1bc2a",
      "parents": [
        "3c501c9821e45a263d22e287bc5c987d42bf52ea",
        "1ccdeebcf78941412449f445cf9e054680b200c9"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Fri Sep 18 08:33:40 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 18 08:33:40 2026 -0400"
      },
      "message": "Merge pull request #6 from apache/dont-say-health\n\nStops using \"Health\". Addresses issue #5"
    },
    {
      "commit": "3c501c9821e45a263d22e287bc5c987d42bf52ea",
      "tree": "3ec7127e0731386bb5fdcac3f1878424d7f8c195",
      "parents": [
        "2513def3bb2e4d2f8f51ef409cc8983a710f2e02"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 17:21:44 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 17:21:44 2026 -0400"
      },
      "message": "Use Whimsy committee-info.json for mail domain resolution (#3)\n\nReplace the hardcoded domain_overrides table in mailing_lists.py with\na map derived from the mail_list field in Whimsy\u0027s committee-info.json.\nThis automatically handles all committees whose mailing list domain\ndiffers from their committee id (comdev→community, infrastructure→infra,\nwhimsy→whimsical, and any future additions).\n\nCloses #3\n"
    },
    {
      "commit": "2513def3bb2e4d2f8f51ef409cc8983a710f2e02",
      "tree": "4c71dd7c2082b820b792902871a509ff16ec9840",
      "parents": [
        "c93a488db2197ffbcc891ce55a3203077b80a7f4"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 16:16:11 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 16:16:11 2026 -0400"
      },
      "message": "Document JSON data API on About page\n\nList all published JSON files with URL patterns and descriptions\nso people can consume the data directly for their own analysis.\n"
    },
    {
      "commit": "c93a488db2197ffbcc891ce55a3203077b80a7f4",
      "tree": "58438bc044776c7d00329d6bb053f1ec23222f6f",
      "parents": [
        "da6c8f30f89d11cc1cecf6fd90b8eaeac05f9891"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 15:57:56 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 15:57:56 2026 -0400"
      },
      "message": "Move projects.apache.org link to breadcrumb bar\n\nThe cross-link was buried in a \u0027Project Info\u0027 section deep in the\npage. Now it sits in the breadcrumb bar at the top, right-aligned\nnext to the \u0027All Projects\u0027 back link.\n"
    },
    {
      "commit": "1ccdeebcf78941412449f445cf9e054680b200c9",
      "tree": "b5f7399cfc2de6dce4e193541fa17d61d6838303",
      "parents": [
        "da6c8f30f89d11cc1cecf6fd90b8eaeac05f9891"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 13:18:02 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 13:18:02 2026 -0400"
      },
      "message": "Stops using \"Health\". Addresses issue #5\n"
    },
    {
      "commit": "da6c8f30f89d11cc1cecf6fd90b8eaeac05f9891",
      "tree": "4838c03da03e0a41b3445f0e293cbd30c2804b7c",
      "parents": [
        "773cc8489169baa9b4ee1f1d014665fbfd494b65"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 13:03:23 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 13:03:23 2026 -0400"
      },
      "message": "Update README to reflect new realities.\n"
    },
    {
      "commit": "773cc8489169baa9b4ee1f1d014665fbfd494b65",
      "tree": "4f0539ea20f4425f00c7914cfc0b4abd44bdc489",
      "parents": [
        "9a56602602c20efb502fad731f6ad8a2795a0a33"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 13:02:34 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 13:02:34 2026 -0400"
      },
      "message": "Update flow and data sources to reflect github workflow.\n"
    },
    {
      "commit": "9a56602602c20efb502fad731f6ad8a2795a0a33",
      "tree": "717c6439206250791c759649e46aaff75448e019",
      "parents": [
        "dfbf83d5601578cd7b2394419a8f7b4809c898cc"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 12:58:37 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 12:58:37 2026 -0400"
      },
      "message": "Stop saying \u0027Health\u0027\n"
    },
    {
      "commit": "dfbf83d5601578cd7b2394419a8f7b4809c898cc",
      "tree": "8edc24659e02b6b2f645a7816fb6ea885980c99f",
      "parents": [
        "8f94afe527d2870c87dd9c9ef1904782cce611d5"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 12:57:11 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 12:57:11 2026 -0400"
      },
      "message": "Avoid \"Health\"\n\nI\u0027m trying to avoid using the term \"Health\", since that\u0027s very\nsubjective, and umbers vary hugely from one project to another. Instead,\ntalk about trends and metrics and so on. The project must determine for\nitself what \"Health\" looks like.\n"
    },
    {
      "commit": "8f94afe527d2870c87dd9c9ef1904782cce611d5",
      "tree": "f8a19db2458c119222454d337ed9c15c16af47c1",
      "parents": [
        "e7f63f754c77133c87fb23792e0e3315423fcc73"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 12:51:36 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 12:51:36 2026 -0400"
      },
      "message": "Update data sources to reflect changes.\n"
    },
    {
      "commit": "e7f63f754c77133c87fb23792e0e3315423fcc73",
      "tree": "6c374c35fb59bec2bc72446676f367c10a10dfcf",
      "parents": [
        "8bf4764cf99d175240e193f89ba6542bbec7c24e"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 12:48:14 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Thu Sep 17 12:48:14 2026 -0400"
      },
      "message": "Update PLAN to reflect what\u0027s been accomplished.\n"
    },
    {
      "commit": "8bf4764cf99d175240e193f89ba6542bbec7c24e",
      "tree": "7f46ef237702a5dfbeb4ebd78367402954293e6b",
      "parents": [
        "bfe10a98683ebda4c561b8b3f1976ba4fa1c31b7"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 01:11:22 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 01:11:22 2026 +0100"
      },
      "message": "Typo\n"
    },
    {
      "commit": "bfe10a98683ebda4c561b8b3f1976ba4fa1c31b7",
      "tree": "dde732c3b74c4078bee512833a87073e61ddecd5",
      "parents": [
        "8248e2fed2841676d7b4b993d4b18de90886131b"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 01:09:20 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 01:09:20 2026 +0100"
      },
      "message": "Check branch\n"
    },
    {
      "commit": "8248e2fed2841676d7b4b993d4b18de90886131b",
      "tree": "448f20e789cab85e3190be4b0d5229ab8ec1a416",
      "parents": [
        "0c4df6c0c263e30736aad6c79349cfa9d08b402d"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 01:05:44 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 01:05:44 2026 +0100"
      },
      "message": "How to get branch\n"
    },
    {
      "commit": "0c4df6c0c263e30736aad6c79349cfa9d08b402d",
      "tree": "7189cc9f3301f9f805a664d8bc722df8872f5393",
      "parents": [
        "8bb45d98baf42d17067ffd561bfd67700e426028"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:32:43 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:32:43 2026 +0100"
      },
      "message": "Duh\n"
    },
    {
      "commit": "8bb45d98baf42d17067ffd561bfd67700e426028",
      "tree": "8b7e3d7f17685ac111c0692d9cc8c1b274e38da0",
      "parents": [
        "c6bdbf969513f857d943b8d339e0ad35c1fde8b2"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:29:11 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:29:11 2026 +0100"
      },
      "message": "WHat is the correct syntax\n"
    },
    {
      "commit": "c6bdbf969513f857d943b8d339e0ad35c1fde8b2",
      "tree": "125da74d233eb3360afacda1d85142da6a773933",
      "parents": [
        "a5832a9af8054933d74dbe54c00f49b42eb8fd73"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:26:51 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:26:51 2026 +0100"
      },
      "message": "Forgot token\n"
    },
    {
      "commit": "a5832a9af8054933d74dbe54c00f49b42eb8fd73",
      "tree": "1bb245507d26564ee605097c431a8f29425d274b",
      "parents": [
        "76d58d488458802eb404fb5d5acbcb6d0287a0ff"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:25:27 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:25:27 2026 +0100"
      },
      "message": "Test getting latest cache file\n"
    },
    {
      "commit": "76d58d488458802eb404fb5d5acbcb6d0287a0ff",
      "tree": "a8e5b06759200b5a2be4aa727057e2425c3ea3b5",
      "parents": [
        "079e0c3c654209581d3d997f7c384e8a93d13fb4"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:02:32 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Wed Sep 16 00:02:32 2026 +0100"
      },
      "message": "Full build - fingers crossed!\n"
    },
    {
      "commit": "079e0c3c654209581d3d997f7c384e8a93d13fb4",
      "tree": "e0ddc77864aaeba61252f0fc3ba87fb4dacdf687",
      "parents": [
        "9d5f68b60d4ce8c2f47b2be590d6d5ba8e3ba895"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Tue Sep 15 15:41:58 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Tue Sep 15 15:41:58 2026 +0100"
      },
      "message": "Add Whimsy overrides\n"
    },
    {
      "commit": "9d5f68b60d4ce8c2f47b2be590d6d5ba8e3ba895",
      "tree": "ee0232fc9304cf0a67ed7582a7f8bf603476fabf",
      "parents": [
        "7f2b989d48f8f6056be7cff249993d8e780aa1ab"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Tue Sep 15 14:52:32 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Tue Sep 15 14:52:32 2026 +0100"
      },
      "message": "Fetch Git for attic\n"
    },
    {
      "commit": "7f2b989d48f8f6056be7cff249993d8e780aa1ab",
      "tree": "f47a2349bea8971c3a021a3e37a3846378528381",
      "parents": [
        "00d55ea28aacbb3ddb0bc78c0f34990cde495d30"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Tue Sep 15 11:25:53 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Tue Sep 15 11:25:53 2026 +0100"
      },
      "message": "Create test site\n"
    },
    {
      "commit": "00d55ea28aacbb3ddb0bc78c0f34990cde495d30",
      "tree": "dbe4c91654a4f825ae27b43dec8c6df45a85fdf9",
      "parents": [
        "cba171ca031332823436de8d69ab36b2e0f87e22"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Sep 14 17:04:41 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Sep 14 17:04:41 2026 +0100"
      },
      "message": "Disable GH deploy for now\n"
    },
    {
      "commit": "cba171ca031332823436de8d69ab36b2e0f87e22",
      "tree": "e7f307325831f6ea950ed70480d00bd69092fc6e",
      "parents": [
        "78c9cca73d029ed8d6d78a2d649f354536d0e9f2"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Sep 14 16:49:48 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Sep 14 16:49:48 2026 +0100"
      },
      "message": "Fixes: action name and tar dir\n"
    },
    {
      "commit": "78c9cca73d029ed8d6d78a2d649f354536d0e9f2",
      "tree": "7d17b5fed98f76ca9c9477f7a5a4db22cf3389d1",
      "parents": [
        "24b320f989716a03517ccc8f3c5b5ffbe1df52e4"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Sep 14 15:40:15 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Sep 14 15:40:15 2026 +0100"
      },
      "message": "Rework to use gh-pages\n"
    },
    {
      "commit": "24b320f989716a03517ccc8f3c5b5ffbe1df52e4",
      "tree": "23ff5a5b2a8b548c0e96fd45f6dbb38d03eb9842",
      "parents": [
        "a865d71f2ec128380bd42d642229db9f9a0b780a"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Sep 14 01:04:12 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Mon Sep 14 01:04:12 2026 +0100"
      },
      "message": "Always drop data cache if present\n"
    },
    {
      "commit": "a865d71f2ec128380bd42d642229db9f9a0b780a",
      "tree": "e80eb04f121a0aba26345d5e98e5d0ba69a1885e",
      "parents": [
        "528f2a4b9f8f07024211fd6629b77e5bb96d24a5"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 23:12:41 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 23:12:41 2026 +0100"
      },
      "message": "Wrong fix\n"
    },
    {
      "commit": "528f2a4b9f8f07024211fd6629b77e5bb96d24a5",
      "tree": "ed1814008208cdd147c45c1c20c87b2563418ecb",
      "parents": [
        "db4c931feb3331c15c8826bdf6eca15a139f0ef0"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 23:04:31 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 23:04:31 2026 +0100"
      },
      "message": "Duh wromng action name\n"
    },
    {
      "commit": "db4c931feb3331c15c8826bdf6eca15a139f0ef0",
      "tree": "9a5c41722cdc953ede51a5d28b32a91449b3c52b",
      "parents": [
        "50d158f35254db3c1b44b9809e6216b19e744ccc"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 22:55:09 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 22:55:09 2026 +0100"
      },
      "message": "Docco\n"
    },
    {
      "commit": "50d158f35254db3c1b44b9809e6216b19e744ccc",
      "tree": "c6d8934b6ff460f4a16adfb076665c41a3d82ae0",
      "parents": [
        "9a1b9d83716322888d6c859380fe0f602a9b3893"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 17:55:38 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 17:55:38 2026 +0100"
      },
      "message": "These are needed\n"
    },
    {
      "commit": "9a1b9d83716322888d6c859380fe0f602a9b3893",
      "tree": "985d2c81050438d6a6b77176c9aff08ff1241b1d",
      "parents": [
        "f1c8213da233901dd1d5710a298f59060805e4ba"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 17:22:10 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 17:22:10 2026 +0100"
      },
      "message": "Unused\n"
    },
    {
      "commit": "f1c8213da233901dd1d5710a298f59060805e4ba",
      "tree": "e928b770b540f01ecf12925050500a9d830020ac",
      "parents": [
        "eb50f6ce2bd349be28d660a723a44bd61fc9b48d"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 17:21:48 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 17:21:48 2026 +0100"
      },
      "message": "Don\u0027t want to commit these either\n"
    },
    {
      "commit": "eb50f6ce2bd349be28d660a723a44bd61fc9b48d",
      "tree": "0a97b06af980f0ce80ae2252cf3b2a8597267570",
      "parents": [
        "434bf1278a764a555455d6a21a8917751f243c63"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 16:55:37 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 16:55:37 2026 +0100"
      },
      "message": "Colon not allowed in bare text\n"
    },
    {
      "commit": "434bf1278a764a555455d6a21a8917751f243c63",
      "tree": "a2e7bb19ac8afbf9c04538b6e242128a53d9b5aa",
      "parents": [
        "f9354a05b5ea1ac73dbd803fe5f394347ee2d66f"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 16:54:07 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 16:54:07 2026 +0100"
      },
      "message": "Try git\n"
    },
    {
      "commit": "f9354a05b5ea1ac73dbd803fe5f394347ee2d66f",
      "tree": "aa365b5ccfe2ee4aee56443b50311c9c5fcd0b02",
      "parents": [
        "450bef198781e9f97b9d5c7be5f2c2a177d60f4b"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 16:50:03 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 16:50:03 2026 +0100"
      },
      "message": "New source home\n"
    },
    {
      "commit": "450bef198781e9f97b9d5c7be5f2c2a177d60f4b",
      "tree": "b9094fbbbef38adab3fbc84c57e931d7af5b541a",
      "parents": [
        "5e03ed27aaf5e9e27321e3a2f083551f9936be48"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 16:02:16 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 16:02:16 2026 +0100"
      },
      "message": "Ensure data directories exist\n"
    },
    {
      "commit": "5e03ed27aaf5e9e27321e3a2f083551f9936be48",
      "tree": "b854df5a7a26593834974860462d0eb164fa29d8",
      "parents": [
        "682276c0eb850b66ad6af65e9bde0f8c1778ed4d"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 15:53:01 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 15:53:01 2026 +0100"
      },
      "message": "Show cache restore\n"
    },
    {
      "commit": "682276c0eb850b66ad6af65e9bde0f8c1778ed4d",
      "tree": "c45cf05c9efd23d65e9ea0058cccc36b06765026",
      "parents": [
        "680788fbea15736672291c41a418546777826475"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 15:50:16 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 15:50:16 2026 +0100"
      },
      "message": "Fix missing file\n"
    },
    {
      "commit": "680788fbea15736672291c41a418546777826475",
      "tree": "eaf309d84fb83db2111bb402f03b1d309eda0ead",
      "parents": [
        "b21205a8b7c763d61bc66fe355150698fed2d736"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 15:47:56 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sun Sep 13 15:47:56 2026 +0100"
      },
      "message": "Initial stab at metrics run\n"
    },
    {
      "commit": "b21205a8b7c763d61bc66fe355150698fed2d736",
      "tree": "76b358506ebbeca2e433840d2578c5c628c977af",
      "parents": [
        "9b3c707b083a9091b0d7a8db9fe5bfc1119faf34"
      ],
      "author": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Sep 12 11:13:01 2026 +0100"
      },
      "committer": {
        "name": "Sebb",
        "email": "sebb@apache.org",
        "time": "Sat Sep 12 11:13:01 2026 +0100"
      },
      "message": "Initial asf.yaml\n"
    },
    {
      "commit": "9b3c707b083a9091b0d7a8db9fe5bfc1119faf34",
      "tree": "30bc2b0c027dc44fb80b1cab0ab6f089c1f66c92",
      "parents": [
        "81367e29492a43117bd223e84ba5f99618f005d8"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Tue Jul 21 09:45:37 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Tue Jul 21 09:45:37 2026 -0400"
      },
      "message": "Avoid calling it \"health\". More just-the-facts phrasing.\n"
    },
    {
      "commit": "81367e29492a43117bd223e84ba5f99618f005d8",
      "tree": "f1429636b64738156ce224fe4897f40433dfb98f",
      "parents": [
        "0d1a9b55318a6667d7948afef0af4990949c1db4"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 13:37:25 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 13:37:25 2026 -0400"
      },
      "message": "Reflect recent changes to data sources and process.\n"
    },
    {
      "commit": "0d1a9b55318a6667d7948afef0af4990949c1db4",
      "tree": "f9ed07ed5c0382415e26c678db8e3a673e2f10c6",
      "parents": [
        "a811ba7eca395c8d989ebdf215ebaae2a3cc6048"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 11:45:56 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 11:45:56 2026 -0400"
      },
      "message": "Various tweaks:\n\nLinks to mailing lists\nHealth status (declining, at risk, dormant)\nPhrasing/legend updates for clarity\n"
    },
    {
      "commit": "a811ba7eca395c8d989ebdf215ebaae2a3cc6048",
      "tree": "0c8f59805a7e32984451ae1e68b782e954fe46a1",
      "parents": [
        "cc22e7f71a5d41e785a9a39e43046076dc0a3005"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 11:11:01 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 11:11:01 2026 -0400"
      },
      "message": "catch failure to load data\n"
    },
    {
      "commit": "cc22e7f71a5d41e785a9a39e43046076dc0a3005",
      "tree": "836414e59fdd0d99c3b93987ed3ed09d1a46cef6",
      "parents": [
        "020fc6eae7a637ebfadac5c73fa4be41a90dc3c2"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 11:05:39 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 11:05:39 2026 -0400"
      },
      "message": "Adds declining and at-risk reporting\n"
    },
    {
      "commit": "020fc6eae7a637ebfadac5c73fa4be41a90dc3c2",
      "tree": "c320f23697f993466ac2618330399e1526a6af99",
      "parents": [
        "7a5f8705b355d3b81cfb13457ff22f0043b3cb47"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 10:10:49 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 10:10:49 2026 -0400"
      },
      "message": "PMC Members rather than PMC. :)\n"
    },
    {
      "commit": "7a5f8705b355d3b81cfb13457ff22f0043b3cb47",
      "tree": "cbbd38038a54db82353472fd119105e672e9ee58",
      "parents": [
        "e90451fba6098209621e9a5d635ea978d5edbfe4"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 10:08:43 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 10:08:43 2026 -0400"
      },
      "message": "Bug: Apache Foo and foo are the same project\n"
    },
    {
      "commit": "e90451fba6098209621e9a5d635ea978d5edbfe4",
      "tree": "795cb03b87b19135c0ea74c68d2d708582c701d7",
      "parents": [
        "6a04d9e7671f56a65903fb8883a74ac90920ae4f"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 10:03:53 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 10:03:53 2026 -0400"
      },
      "message": "Split pmc members, committers in new community metrics\n"
    },
    {
      "commit": "6a04d9e7671f56a65903fb8883a74ac90920ae4f",
      "tree": "29541d0705cc2f585ca1aeddab5130005015f9b9",
      "parents": [
        "aee5e4e45ab05d2cd81e01820b7ea964c5bad221"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 09:40:28 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 09:40:28 2026 -0400"
      },
      "message": "List data sources\n"
    },
    {
      "commit": "aee5e4e45ab05d2cd81e01820b7ea964c5bad221",
      "tree": "9caa1d6e1a22df3740b0cb55933273c0c248a3ad",
      "parents": [
        "f87a6cae4157e70e72c7b2108af1cc018edd2581"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 09:39:09 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Mon Jul 13 09:39:09 2026 -0400"
      },
      "message": "Clarify labels. Split PMC members and new committers\n"
    },
    {
      "commit": "f87a6cae4157e70e72c7b2108af1cc018edd2581",
      "tree": "566958c6009dc81c6652ccb5acdc8422fab1862d",
      "parents": [
        "b9edc4ae933720b9701ad8085e9ab11206784140"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:27:40 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:27:40 2026 -0400"
      },
      "message": "Remove date targets; update status of TODO items.\n"
    },
    {
      "commit": "b9edc4ae933720b9701ad8085e9ab11206784140",
      "tree": "2c4565af6dabaf997bec43cfdedce3688b1c2b84",
      "parents": [
        "3cc821151f0408d217af7e99305fdac5ae8e9fb9"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:22:21 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:22:21 2026 -0400"
      },
      "message": "Remove stuff that\u0027s no longer relevant, or already done\n"
    },
    {
      "commit": "3cc821151f0408d217af7e99305fdac5ae8e9fb9",
      "tree": "9323f46f52f0d6914dd0503264470c5e1beb5a9a",
      "parents": [
        "319b4e565910932b4e25751206fa2fff18f3a756"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:14:43 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:14:43 2026 -0400"
      },
      "message": "Remove cruft\n"
    },
    {
      "commit": "319b4e565910932b4e25751206fa2fff18f3a756",
      "tree": "6d55866f01486cad206a414d85f1adf5417b7014",
      "parents": [
        "ecf2a65c2ce9cb62b06e01cee296c664a9a0e2aa"
      ],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:12:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 12 12:12:23 2026 -0400"
      },
      "message": "Add Apache License 2.0 to the project"
    },
    {
      "commit": "ecf2a65c2ce9cb62b06e01cee296c664a9a0e2aa",
      "tree": "84d519dcf546e426e3c7824d48913b77732a924d",
      "parents": [],
      "author": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:10:35 2026 -0400"
      },
      "committer": {
        "name": "Rich Bowen",
        "email": "rbowen@rcbowen.com",
        "time": "Sun Jul 12 12:10:35 2026 -0400"
      },
      "message": "Initial commit - prototype ASF project metrics.\n"
    }
  ]
}
