)]}'
{
  "log": [
    {
      "commit": "1823eeb0e6e32a3b55cce61a3c667bb7ef490c6e",
      "tree": "10079314b912e5510d4558746e52f55cccc8673b",
      "parents": [
        "65182fc1b1ae0b438238584e5d3140db9fd415ef",
        "f5fb8d419d53e0c5cc4e3529dcdb0b3d79af2d5c"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Wed Jun 03 11:07:06 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 11:07:06 2026 +0300"
      },
      "message": "Merge pull request #5 from apache/draw-line-per-algorithm\n\nDraw change-point lines for each algorithm at the same index"
    },
    {
      "commit": "f5fb8d419d53e0c5cc4e3529dcdb0b3d79af2d5c",
      "tree": "10079314b912e5510d4558746e52f55cccc8673b",
      "parents": [
        "65182fc1b1ae0b438238584e5d3140db9fd415ef"
      ],
      "author": {
        "name": "Alex Sorokoumov",
        "email": "aleksandr.sorokoumov@gmail.com",
        "time": "Tue Jun 02 09:33:40 2026 -0700"
      },
      "committer": {
        "name": "Alex Sorokoumov",
        "email": "aleksandr.sorokoumov@gmail.com",
        "time": "Tue Jun 02 15:22:40 2026 -0700"
      },
      "message": "Draw change-point lines for each algorithm at the same index\n\nWhen multiple algorithms detect a change point at the same index, draw\neach algorithm\u0027s line slightly offset from the index so all are visible\ninstead of stacking on top of one another.\n"
    },
    {
      "commit": "65182fc1b1ae0b438238584e5d3140db9fd415ef",
      "tree": "ff3b6e842329fcc771f94a28c3661104857e2293",
      "parents": [
        "3dfa7e4cd71dcd30505d21beb8e67a87750cc092",
        "cea07c35f36b631705417e8250f93316f537a81a"
      ],
      "author": {
        "name": "Alex Sorokoumov",
        "email": "918393+Gerrrr@users.noreply.github.com",
        "time": "Sun May 31 11:51:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 11:51:06 2026 -0700"
      },
      "message": "Merge pull request #4 from apache/custom-datasets\n\nAdd Dataset mode for comparing algorithms on real series"
    },
    {
      "commit": "cea07c35f36b631705417e8250f93316f537a81a",
      "tree": "ff3b6e842329fcc771f94a28c3661104857e2293",
      "parents": [
        "3dfa7e4cd71dcd30505d21beb8e67a87750cc092"
      ],
      "author": {
        "name": "Alex Sorokoumov",
        "email": "aleksandr.sorokoumov@gmail.com",
        "time": "Sat May 30 17:31:40 2026 -0700"
      },
      "committer": {
        "name": "Alex Sorokoumov",
        "email": "aleksandr.sorokoumov@gmail.com",
        "time": "Sat May 30 20:37:03 2026 -0700"
      },
      "message": "Add Dataset mode for comparing algorithms on real series\n\nAdds a third top-level mode to the web visualizer (\"Dataset\", alongside\n\"Single Pattern\" and \"Mix Patterns\") for loading real performance data and\nseeing where each Otava algorithm variant places change points on the same\nseries. The TigerBeetle dataset bundled in apache/otava\u0027s perf/perf_test.py\nships as the default preset; a \"Custom (paste below)\" option accepts\nJSON-array or whitespace/comma-separated numbers.\n\nThe Otava analysis panel now offers a checkbox per algorithm variant.\nIn addition to split-edivisive and orig-edivisive, I have also added\ndeterministic-edivisive to facilitate review of\nhttps://github.com/apache/otava/pull/154.\n\nBackend additions:\n- otava_test_data.datasets package + TIGERBEETLE preset.\n- GET /api/datasets — bundled-preset metadata.\n- GET /api/datasets/{name} — one preset\u0027s series + metadata.\n- GET /api/algorithms — which algorithm functions are available.\n- POST /api/compare — run multiple algorithms on a series, return all results.\n- /api/generate and /api/analyze accept otava_algorithm\u003dsplit|orig|deterministic\n  to pick which variant runs in single/mix mode.\n\nAlgorithm names are validated as Literal[\"split\",\"orig\",\"deterministic\"], so\nunknown values fail with 422 at the request boundary instead of returning\n200 with an embedded error string.\n\nDataset mode reuses the existing chart container with a single chart that\noverlays each enabled algorithm\u0027s change points as colour-coded vertical\nlines. The new \"Show All Graphs\" / \"Analyse\" buttons and the ground-truth\nsections (accuracy table, comparison tables, chart legend) are hidden in\nDataset mode. Compare requests are guarded by an AbortController so a slow\nearlier request can\u0027t race a newer one. The results table is built with\nDOM nodes (not string concatenation) so server-supplied strings can\u0027t inject\nHTML. Custom-paste input filters out non-numeric tokens and tells the user\nhow many were dropped.\n\nAlso fixes an existing latent bug: Starlette 1.x changed TemplateResponse\u0027s\npositional argument order. The pre-existing `/` route was using the old\nsignature, which crashed with \"unhashable type: dict\" once Jinja2\u0027s cache\nsaw the context dict as the template name. Both routes updated.\n"
    },
    {
      "commit": "3dfa7e4cd71dcd30505d21beb8e67a87750cc092",
      "tree": "79a7881523776a82b0c1d0fcb989bfce8f19e2af",
      "parents": [
        "8dac85d9c608e768aed56f462770761e61b749de"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Mon May 11 04:39:36 2026 +0300"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Mon May 11 04:39:36 2026 +0300"
      },
      "message": "Use Otava 0.8.0 and lots of fixes\n"
    },
    {
      "commit": "8dac85d9c608e768aed56f462770761e61b749de",
      "tree": "b38a2e5cab15fee405912d75de2bd93e2a5afe97",
      "parents": [
        "094f8be1247e3e01f022910e2850a02907d192b5"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Wed Feb 04 09:08:25 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Wed Feb 04 09:08:25 2026 +0200"
      },
      "message": "No body bg\n"
    },
    {
      "commit": "094f8be1247e3e01f022910e2850a02907d192b5",
      "tree": "aea9e40f015b1c21b632393e7fbb1f67b45daf75",
      "parents": [
        "2a59b7ca0d9bbe085f3c0430b30e40612e8e42a9"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Wed Feb 04 08:28:28 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Wed Feb 04 08:28:28 2026 +0200"
      },
      "message": "remove prints\n"
    },
    {
      "commit": "2a59b7ca0d9bbe085f3c0430b30e40612e8e42a9",
      "tree": "d03fff3e131e5edb5e70de97de718896a5faeb93",
      "parents": [
        "ac30e9a229a70c02cec1d6009203416a8a8f904d"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Wed Feb 04 08:24:23 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Wed Feb 04 08:24:23 2026 +0200"
      },
      "message": "Fix lots of stuff lost in merge\n"
    },
    {
      "commit": "ac30e9a229a70c02cec1d6009203416a8a8f904d",
      "tree": "b2dfaf680f4259782aa9d0f1a8aad97b5461cde5",
      "parents": [
        "32d29710f6ff363860fd44009aaabd04c49362e6",
        "49affc1f2dc2f64dc4a3d2ba46b87d0a352b5e51"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Tue Feb 03 23:01:40 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrk.io",
        "time": "Tue Feb 03 23:01:40 2026 +0200"
      },
      "message": "Merge remote-tracking branch \u0027claude/main\u0027\n"
    },
    {
      "commit": "49affc1f2dc2f64dc4a3d2ba46b87d0a352b5e51",
      "tree": "ed4e77749b8ea0fd8477c64a5ed9217530cef777",
      "parents": [
        "08623b105b55f892084d0a08cc680dd9498c0067"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Feb 03 22:29:04 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Feb 03 22:29:04 2026 +0200"
      },
      "message": "Revert \"Add .claude.md\"\n\nThis reverts commit 08623b105b55f892084d0a08cc680dd9498c0067.\n"
    },
    {
      "commit": "32d29710f6ff363860fd44009aaabd04c49362e6",
      "tree": "0f02d81f00cceb8f971d88791f1773b92871cc57",
      "parents": [
        "895271eed87d5eaca728d9490c91a87314334b3a",
        "c689208f480aa46370491ca75f23c16e4ad20b5d"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Tue Feb 03 11:43:54 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 03 11:43:54 2026 +0000"
      },
      "message": "Merge pull request #1 from nyrkio/jdrumgoole-updates\n\nMerge tutorial system and documentation updates"
    },
    {
      "commit": "c689208f480aa46370491ca75f23c16e4ad20b5d",
      "tree": "0f02d81f00cceb8f971d88791f1773b92871cc57",
      "parents": [
        "895271eed87d5eaca728d9490c91a87314334b3a",
        "4172647df22d8629c2b81968c536a90802bdd973"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Tue Feb 03 11:41:48 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Tue Feb 03 11:41:48 2026 +0000"
      },
      "message": "Resolve merge conflicts: combine visual grid with tutorial system\n\nMerged both feature sets:\n- Visual generator grid with mini preview charts (from nyrkio)\n- Tutorial system with help buttons and tooltips (from jdrumgoole)\n\nCombined initialization loads both generators and analysis methods,\nthen populates the generator grid.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "08623b105b55f892084d0a08cc680dd9498c0067",
      "tree": "f0e8b29fabccff3d939d1884a3434f2ce033e421",
      "parents": [
        "20e736d8a7cda70e0c7004c8606d8dadd55b28b6"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 20:03:44 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 20:03:44 2026 +0200"
      },
      "message": "Add .claude.md\n"
    },
    {
      "commit": "20e736d8a7cda70e0c7004c8606d8dadd55b28b6",
      "tree": "ed4e77749b8ea0fd8477c64a5ed9217530cef777",
      "parents": [
        "fb7e27e7258c55c45f3731aabc73035eae2cc64b"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 20:01:44 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 20:01:44 2026 +0200"
      },
      "message": "max-pvalue-input: Use type\u003dtext\n\nTypical values are on a logarithmic scale, so the arrow buttons\njust get in the way here.\n"
    },
    {
      "commit": "fb7e27e7258c55c45f3731aabc73035eae2cc64b",
      "tree": "6467ff4bd249c420f83e4816e79a43d34cdb810e",
      "parents": [
        "a6c341236c562be6636826a4b39bfbe6ba932d73"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 10:37:47 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 10:37:47 2026 +0200"
      },
      "message": "Fix analysis parameter changes not updating mix mode display\n\nAdd refreshDisplay() function that checks current mode and calls\nthe appropriate update function (computeAndDisplayMixedData for mix\nmode, generateData for single mode).\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "a6c341236c562be6636826a4b39bfbe6ba932d73",
      "tree": "89688de469e89070f82cf595775c5c7b1e48b6c5",
      "parents": [
        "c805dac5482d43e6b5f30a34433c272edaacc0c5"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 07:11:28 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 07:11:28 2026 +0200"
      },
      "message": "Change default Otava p-value to 0.001\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c805dac5482d43e6b5f30a34433c272edaacc0c5",
      "tree": "37d3501a5bfb1c3d699c15fc785f9c597dc88f8d",
      "parents": [
        "b81966a4794bc1acfdeaf3766b054e8820471b94"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 07:10:07 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 07:10:07 2026 +0200"
      },
      "message": "Add Mix Patterns mode for combining multiple generators\n\n- Add mode toggle (Single Pattern / Mix Patterns) above generator grid\n- Implement Sum and Append operations for combining patterns\n- Sum: element-wise addition with normalization to maintain baseline mean\n- Append: concatenation with change point index offsetting\n- Add /api/detect POST endpoint for running Otava on arbitrary data\n- Randomize x-axis position for outlier, step function, and regression patterns\n- Show count badges on tiles when patterns are added multiple times\n- Add mix recipe display showing current combination formula\n- Simplified mix mode grid to single row of clean patterns\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "4172647df22d8629c2b81968c536a90802bdd973",
      "tree": "89cb52b20d671e4e9eb01d70f645c44a196f87b9",
      "parents": [
        "b65be51259d60c3235e236b43d881aa757834707"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Mon Jan 26 23:14:59 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Mon Jan 26 23:14:59 2026 +0000"
      },
      "message": "Update project description and docs structure, bump version to 0.1.9\n\n- Update project description to \"Test data generators and Visualization\n  for Apache Otava change point detection\"\n- Restructure docs/index.md to lead with Web Visualizer section, matching\n  README.md structure\n- Add screenshots and feature highlights to docs landing page\n- Bump version from 0.1.8 to 0.1.9\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b81966a4794bc1acfdeaf3766b054e8820471b94",
      "tree": "52e22df11cf45ccebf04a1205b753b3c5161cf0e",
      "parents": [
        "bb92118e15cd32ea4f39f4ba73a732fa1e065de2"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:51:00 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:51:00 2026 +0200"
      },
      "message": "Update Detection Accuracy section to display table with all methods\n\nReplace single-method metric cards with a table showing accuracy for each\nenabled analysis method. Each row displays TP, CM, FP, FN, Precision, Recall,\nand F1 score for a method (Otava, Moving Average, Boundary, Threshold Alert,\nSliding Window, Std Dev). Color-coded columns improve readability.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "bb92118e15cd32ea4f39f4ba73a732fa1e065de2",
      "tree": "6beace152406db9721854510904b268dbf6acb6f",
      "parents": [
        "c49922cbc1147732357afa108210268b965a476e"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:41:37 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:41:37 2026 +0200"
      },
      "message": "Add standard deviation based change point detection\n\nFor each point P, compare to mean ± K standard deviations of M\nprevious points. Alert if P falls outside this range.\n\nParameters:\n- Window (M): number of previous points for baseline\n- Std Devs (K): number of standard deviations (e.g., 2σ ≈ 95%)\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c49922cbc1147732357afa108210268b965a476e",
      "tree": "4401983a98343656b2372bf050ad3726b0db2264",
      "parents": [
        "f937a7718681d4ac40b7d44d2ddd3ef4684680ee"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:27:18 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:27:18 2026 +0200"
      },
      "message": "Add close match (CM) category for change point detection\n\n- TP (exact match): tolerance 0, red circle\n- CM (close match): within 5 points, yellow diamond\n- FP (false positive): no match, orange triangle\n\nThis helps evaluate methods like sliding window that detect\nchanges but may not pinpoint the exact location.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f937a7718681d4ac40b7d44d2ddd3ef4684680ee",
      "tree": "3d6ace4be5a2aa29fece04e1b364953808b63e8c",
      "parents": [
        "9dc087d24c949c21584fd6191dd2fd9533629fbe"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:17:48 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:17:48 2026 +0200"
      },
      "message": "Add sliding window change point detection method\n\nCompare average of current window (N points) with reference window\noffset M points earlier. Detect change when percentage difference\nexceeds threshold.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "b65be51259d60c3235e236b43d881aa757834707",
      "tree": "dea6bcab14539d75cb1438a0b98f8e2aa8c6ab00",
      "parents": [
        "e529f6ea118bcafe11c68d5035cdea65ea29f03f"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Mon Jan 26 22:15:19 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Mon Jan 26 22:15:19 2026 +0000"
      },
      "message": "Update README.md images to recent screenshots and bump version to 0.1.8\n\n- Update README.md image links to use the recently captured screenshots\n  (step-function-sigma-2.png, multiple-changes.png, variance-change.png)\n- Bump version from 0.1.7 to 0.1.8\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "9dc087d24c949c21584fd6191dd2fd9533629fbe",
      "tree": "24d86944a3bab77d7bfc907174782161bb4b8927",
      "parents": [
        "71b6ccf1cfbb39748ff6e6485ab8d2c2ba9c66ce"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:06:48 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:06:48 2026 +0200"
      },
      "message": "Change default p-value to 0.00001\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "71b6ccf1cfbb39748ff6e6485ab8d2c2ba9c66ce",
      "tree": "18864c103e2e3b33ea469d651ca4bb7a157efd6e",
      "parents": [
        "895271eed87d5eaca728d9490c91a87314334b3a"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:06:02 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Tue Jan 27 00:06:02 2026 +0200"
      },
      "message": "Expand p-value range to 0.0-1.0\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e529f6ea118bcafe11c68d5035cdea65ea29f03f",
      "tree": "dd61e892227c38e90074b3129cc78dae1171e2f8",
      "parents": [
        "31756b5d2985fca4f08c9a1d7a941f669b68afdd"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Mon Jan 26 22:02:23 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Mon Jan 26 22:02:23 2026 +0000"
      },
      "message": "Update screenshots to show v0.1.7 UI with help buttons\n\n- Refresh all screenshots to show new help buttons next to inputs\n- Update screenshots to display v0.1.7 version in header\n- Screenshots now show meteor background in header\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "31756b5d2985fca4f08c9a1d7a941f669b68afdd",
      "tree": "0d9fef3fa06b0e0c88b2dc9f1e669d6fb84f086d",
      "parents": [
        "f334b801ebe520362fb7e95d9e7371a2e84267e4"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Mon Jan 26 20:09:09 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Mon Jan 26 20:09:09 2026 +0000"
      },
      "message": "Add tutorial system with help buttons and bump version to 0.1.7\n\n- Add tutorial panels for generators explaining patterns, use cases, and detection notes\n- Add tutorial panels for analysis methods (Otava, Moving Average, Boundary)\n- Add detection metrics tutorial explaining TP, FP, FN, and matching algorithm\n- Add contextual help buttons (?) next to parameters with tooltips\n- Position help buttons after input fields for better UX\n- Add meteor.webp background image for header\n- Update documentation with tutorial mode section and screenshots\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "895271eed87d5eaca728d9490c91a87314334b3a",
      "tree": "4f0e9c00604ec3475df7e872f7cb65d8fe77d373",
      "parents": [
        "687fa11e9c0fdd064688c2e7b58c62889b4a256a"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Mon Jan 26 22:01:25 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Mon Jan 26 22:01:25 2026 +0200"
      },
      "message": "Add visual generator grid with organized 4-row layout\n\nReplace generator dropdown with visual tile grid showing preview charts.\nOrganize generators into 4 rows:\n- Row 1: Clean single patterns (Constant, Outlier, Step, Regression, etc.)\n- Row 2: Clean multiple patterns (Multiple Outliers, Multiple Changes, etc.)\n- Row 3: Normal noise variants\n- Row 4: Uniform noise variants\n\nAdd new generators:\n- multiple_regression_fix, multiple_banding, multiple_phase_changes\n- Uniform noise variants: outlier_uniform, step_function_uniform, etc.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "687fa11e9c0fdd064688c2e7b58c62889b4a256a",
      "tree": "f3a87a01cd59b1e19fb9d8c3a3d048437a51263d",
      "parents": [
        "c0b968ddc1718a4e1e0de74245df45ec7a82b457"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Mon Jan 26 21:11:11 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Mon Jan 26 21:11:11 2026 +0200"
      },
      "message": "Simplify chart legend and unify detection markers\n\n- Hide chart legend (markers are self-explanatory)\n- Use consistent markers across all analysis methods:\n  - Red circles for true positives\n  - Orange triangles for false positives\n- Match TP/FP text colors in chart headers to marker colors\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c0b968ddc1718a4e1e0de74245df45ec7a82b457",
      "tree": "45a398eb3cc037dede9c5daf4d62502f3ea7202a",
      "parents": [
        "f334b801ebe520362fb7e95d9e7371a2e84267e4"
      ],
      "author": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Mon Jan 26 21:00:47 2026 +0200"
      },
      "committer": {
        "name": "Henrik Ingo",
        "email": "henrik@nyrkio.com",
        "time": "Mon Jan 26 21:00:47 2026 +0200"
      },
      "message": "Add threshold-based alerts analysis method\n\nAdd a new analysis method that alerts when a data point differs by more\nthan X% from a previous reference point. Features:\n- Configurable percentage threshold (default 5%)\n- Configurable comparison offset (default 1 \u003d previous point)\n- Visual indicators with star markers (pink for TP, orange for FP)\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "f334b801ebe520362fb7e95d9e7371a2e84267e4",
      "tree": "977734e319e21e271f6128457eeb5e4b13787c51",
      "parents": [
        "ab301b12bfd29c23ad746af82faed77e3be815e2"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Fri Jan 23 01:06:46 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Fri Jan 23 01:06:46 2026 +0000"
      },
      "message": "Update screenshots for new UI and bump version to 0.1.6\n\nScreenshots updated to reflect the new settings dialog UI with:\n- Settings gear icon in header\n- Left-aligned header content\n- Version display below header\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "ab301b12bfd29c23ad746af82faed77e3be815e2",
      "tree": "7f1a93eccc7ce4e8540a7c097f3ddf3193aac327",
      "parents": [
        "0945693493e993a454ac9a779742a79a88d41cdb"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Fri Jan 23 00:29:35 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Fri Jan 23 00:29:35 2026 +0000"
      },
      "message": "Add settings dialog and bump version to 0.1.5\n\n- Move length and seed parameters into a settings dialog\n- Add settings button (gear icon) to the right side of header\n- Left-align header title and subtitle\n- Display app version below the banner\n- Update visualizer documentation with settings dialog info\n- Sync version across pyproject.toml and __init__.py\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "0945693493e993a454ac9a779742a79a88d41cdb",
      "tree": "d674b4ea477261214100c5eb5bb2c8c1f5368be5",
      "parents": [
        "3c827e9ad5b49bcd4ecdcf58c38f891c5ecc4812"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Thu Jan 22 06:52:35 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Thu Jan 22 06:52:35 2026 +0000"
      },
      "message": "Add configurable slider bounds and update screenshots for v0.1.4\n\n- Add slider bound controls for Length and Y-Axis parameters\n- Make Y-Axis sliders 50% wider in Analysis Controls panel\n- Update all documentation screenshots with shot-scraper\n- Add automated screenshot script for future updates\n- Bump version to 0.1.4\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "3c827e9ad5b49bcd4ecdcf58c38f891c5ecc4812",
      "tree": "0d96490afe1e9e9488da1753b0dcbfb771841612",
      "parents": [
        "cbd50d414c5f7098d16b09eeead9d6a18e00d6fe"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 22:24:21 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 22:24:21 2026 +0000"
      },
      "message": "Add stacked charts for analysis methods and bump version to 0.1.3\n\nImplement separate vertically stacked charts for each enabled analysis\nmethod (Otava, Moving Average, Boundary) for better visualization and\ncomparison. Charts are dynamically shown/hidden based on checkbox\nselection. Also reduced marker sizes for cleaner display.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "cbd50d414c5f7098d16b09eeead9d6a18e00d6fe",
      "tree": "6a6faf7ebfa2e0ea24f6c1a2274764df3c694683",
      "parents": [
        "95736fee44a65a30faa90dd389728539f193817d"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:28:58 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:28:58 2026 +0000"
      },
      "message": "Add .python-version file specifying Python 3.11\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "95736fee44a65a30faa90dd389728539f193817d",
      "tree": "1065afbbdafb18f33caf7b9f92eab64537e6d025",
      "parents": [
        "c68a795d8f792febd2eee661036537a8edd4298b"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:26:56 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:26:56 2026 +0000"
      },
      "message": "Make apache-otava an optional dependency to fix RTD build\n\nMove apache-otava from main dependencies to optional web dependencies\nso that the docs can build on Read the Docs without requiring the\napache-otava package (which doesn\u0027t exist on PyPI yet). The web module\nnow gracefully handles the missing import.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c68a795d8f792febd2eee661036537a8edd4298b",
      "tree": "cba92afc1ca983023bfd3a324121090a355edabf",
      "parents": [
        "e5a421079488740bc4b74183f67b4f24bdb0eb13"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:12:53 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:12:53 2026 +0000"
      },
      "message": "Bump version to 0.1.2\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "e5a421079488740bc4b74183f67b4f24bdb0eb13",
      "tree": "03d1e76544b34950d1a7d6c642a34bc7196ef520",
      "parents": [
        "fceaaba667fe55aa005a858b32ba4cc92567709d"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:12:35 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:12:35 2026 +0000"
      },
      "message": "Fix README image URLs to use GitHub raw URLs\n\nRead the Docs URLs weren\u0027t working - switch to GitHub raw URLs\nwhich work immediately without waiting for RTD builds.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "fceaaba667fe55aa005a858b32ba4cc92567709d",
      "tree": "63f688d5027e86f472b8a017aa83317e066ee804",
      "parents": [
        "c3764755c305eab76dabcf2969a5f2777fbe05a8"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:07:32 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:07:32 2026 +0000"
      },
      "message": "Bump version to 0.1.1\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "c3764755c305eab76dabcf2969a5f2777fbe05a8",
      "tree": "1c8de26df0e7fc9a114a954f5d9248147cc79350",
      "parents": [
        "9d5619a9aa9c2e04dfcb00fba753032a02ef80b7"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:04:56 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 18:04:56 2026 +0000"
      },
      "message": "Update README to lead with web visualizer and add screenshots\n\n- Restructure README to showcase web visualizer first\n- Add three screenshots showing different detection patterns:\n  - Step function with 100% detection accuracy\n  - Multiple change points detection\n  - Variance change detection\n- Use Read the Docs URLs for PyPI image rendering\n- Streamline content and add documentation link\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "9d5619a9aa9c2e04dfcb00fba753032a02ef80b7",
      "tree": "bfdb36167a463b984496eeddc85c8b1f05772178",
      "parents": [
        "006a52f0670582617a627f36378d340eb6720d01"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 17:57:30 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 17:57:30 2026 +0000"
      },
      "message": "Add documentation for all three analysis methods with screenshots\n\n- Document Otava Analysis parameters (Window Length, Max P-Value) with\n  plain-English explanations for non-experts\n- Document Moving Average Analysis parameters (MA Window, Threshold σ)\n- Document Boundary Analysis parameters (Upper/Lower Bound)\n- Add comparison table of method strengths, weaknesses, and use cases\n- Add screenshots showing each analysis method in action\n- Update \"Compare All Patterns\" to \"Show All Graphs\"\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "006a52f0670582617a627f36378d340eb6720d01",
      "tree": "bafab32511e0de3f99d925e1d5e1c9d974b04047",
      "parents": [
        "3f0301e3c32daea0ff073c6b325a3bed0eb7063e"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 17:36:40 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 17:36:40 2026 +0000"
      },
      "message": "Add PyPI publish workflow and improve web visualizer UI\n\n- Add GitHub Actions workflow for automated PyPI publishing with trusted publishing\n- Add TestPyPI support for manual workflow dispatch\n- Add Read the Docs configuration\n- Add development documentation with release process\n- Improve web visualizer UI with compact Detection Accuracy and Stats panels\n- Add multiple analysis methods (Otava, Moving Average, Boundary)\n- Reorganize analysis controls panel layout\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "3f0301e3c32daea0ff073c6b325a3bed0eb7063e",
      "tree": "c43395f962dbade8bd3775df9ae82fc43c7358a6",
      "parents": [
        "84c7a95f2586c0aba93ed5d48263bb4d963adc45"
      ],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 11:24:55 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 11:24:55 2026 +0000"
      },
      "message": "Fix numpy serialization and add multiple_variance_changes generator\n\n- Add sanitize_for_json() utility to convert numpy types to Python native types\n- Fix numpy.int64 serialization in timeseries_to_dict() and compute_accuracy_metrics()\n- Register multiple_variance_changes generator that was imported but not in GENERATORS dict\n- Fixes 500 errors in Compare All Patterns feature\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    },
    {
      "commit": "84c7a95f2586c0aba93ed5d48263bb4d963adc45",
      "tree": "dcb47fa381a301e0ad0f8e5b49b06ff8527b92c4",
      "parents": [],
      "author": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 11:15:12 2026 +0000"
      },
      "committer": {
        "name": "Joe Drumgoole",
        "email": "joe@joedrumgoole.com",
        "time": "Wed Jan 21 11:15:12 2026 +0000"
      },
      "message": "Initial release: Otava test data generators and web visualizer\n\nFeatures:\n- Basic time series generators: constant, noise (normal/uniform), outlier,\n  step function, regression+fix\n- Advanced patterns: banding, variance change, phase change, multiple changes\n- TimeSeries dataclass with ground truth change point information\n- Combiner for mixing signals and adding noise\n- CLI tool (otava-gen) for batch data generation\n- FastAPI web visualizer with Otava integration\n- Accuracy metrics: precision, recall, F1 score\n- Invoke tasks for development workflow\n- 71 unit tests\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n"
    }
  ]
}
