)]}'
{
  "log": [
    {
      "commit": "613c0f5288dd0e18dc9fee09254161d78fc7acb7",
      "tree": "e909ee44b0e1f0a6c14e7fab714450326a7e0b3f",
      "parents": [
        "bd7b625d4ca17b5cb5207b4917a6e61ea398f2d0"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 15 16:36:22 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 15 23:42:04 2025 +0000"
      },
      "message": "logging: make -verbose -termui\u003dfalse log to stdout\n\nCommit d72563ac30bab6471121f561f3bb41991a3c91d1 made it so we never send\nlogs to stdout/stderr, but I prefer them on stderr when possible. So, if\ntermui isn\u0027t enabled, let\u0027s send them to stderr. --termui used to not be\npropogated; now it is.\n"
    },
    {
      "commit": "bd7b625d4ca17b5cb5207b4917a6e61ea398f2d0",
      "tree": "32c1588d9cd5854d1322615d0aa14cc35d33f3a9",
      "parents": [
        "e3c2f22ee87eb9830dad42ca0388b9743923ec59"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 15 16:21:36 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 15 15:14:37 2025 -0700"
      },
      "message": "webui: reposition working/idle banner over lightbulb/wrench icons\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sb695b8b61b1f5134k\n"
    },
    {
      "commit": "e3c2f22ee87eb9830dad42ca0388b9743923ec59",
      "tree": "6e6b8fe475c62eac64d6600fb8be82affec545ce",
      "parents": [
        "956626d63041ec76d3994bd3fda02448e49aab46"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 20:54:52 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 14:41:38 2025 -0700"
      },
      "message": "skabandclient: fix handling of empty skaband-addr\n\nThis had regressed considerably.\n\nFixes #96\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s4d698cae3417a4f9k"
    },
    {
      "commit": "956626d63041ec76d3994bd3fda02448e49aab46",
      "tree": "3723db8c989cbb1bc324aa2680bd60c2cce0b114",
      "parents": [
        "f163e9e785845bed2d7fba31ddf06a22a2e1e853"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 21:24:07 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 14:37:05 2025 -0700"
      },
      "message": "termui: add branch delete command\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s114722c8790c2a41k\n"
    },
    {
      "commit": "f163e9e785845bed2d7fba31ddf06a22a2e1e853",
      "tree": "c728e8da4f5c9a7a3d885f3130bc9bde13f28c3e",
      "parents": [
        "de5f74466b6db86c310762d627ea5f05b24cd08e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 12:38:30 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 13:17:42 2025 -0700"
      },
      "message": "claudetool/codereview: stop checking string iteration patterns\n\nEven frontier LLMs get confused by these recent language improvements.\nI\u0027m sick of fighting them (i.e. watching them fight themselves).\nWe\u0027ll just have to wait for them to either get more capable,\nor to learn the new idioms. Sigh.\n"
    },
    {
      "commit": "de5f74466b6db86c310762d627ea5f05b24cd08e",
      "tree": "12196afbbb7362c93883cf63fe8d94d5e87b5387",
      "parents": [
        "fbbf83bba97e2e2fd5e5ea1693c96efce1fdc3b1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 18:32:32 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 13:17:42 2025 -0700"
      },
      "message": "claudetool: ignore some gopls (/vet) checks\n\nFixes #95\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s934f225a42c1d576k\n"
    },
    {
      "commit": "fbbf83bba97e2e2fd5e5ea1693c96efce1fdc3b1",
      "tree": "968706f07817a92905dbbc28a5bcdd1125bf4467",
      "parents": [
        "a4092d26857aa5aeba70813e8942f321232e987c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 10:55:55 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 13:17:42 2025 -0700"
      },
      "message": "webui: tweak done tool card emojis\n\nDear Sketch, please stop using big red angry failure emojis.\nAlso, gender neutral is fine thank you very much.\n"
    },
    {
      "commit": "a4092d26857aa5aeba70813e8942f321232e987c",
      "tree": "3d8caf262c8f0b103010a2450bfea896bb07417e",
      "parents": [
        "74d690e7b4794f2c164a9da30dd106a002b935d9"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 18:32:53 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 13:17:39 2025 -0700"
      },
      "message": "loop: make about_sketch not experimental\n\nseems to work ok enough to unleash it on everyone else..."
    },
    {
      "commit": "74d690e7b4794f2c164a9da30dd106a002b935d9",
      "tree": "412f1ad777e599ed61904c7f80c53859315babab",
      "parents": [
        "039fc34bd9c8f7cf3e9f3c9aeee2e9677ce28e00"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 18:16:03 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 12:40:29 2025 -0700"
      },
      "message": "claudetool: remove knowledge base, focus on about sketch\n\nWe should have a more general kb.\nMeanwhile, this is important and standalone.\nMake it all clearer and sharper.\n"
    },
    {
      "commit": "039fc34bd9c8f7cf3e9f3c9aeee2e9677ce28e00",
      "tree": "d04e1be0103e486d0e1905e4aa431b7cc1820640",
      "parents": [
        "6ada85d6c4401ca82e3809fbd3af0178de1b7b11"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 21:24:12 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 12:40:08 2025 -0700"
      },
      "message": "loop/agent: add git commit hooks when running inside container\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8d03af4abcafd1dbk"
    },
    {
      "commit": "6ada85d6c4401ca82e3809fbd3af0178de1b7b11",
      "tree": "e95b40c49571b6777c386a85dcc500fcc4f487f1",
      "parents": [
        "f7bebdd0a51bfe6f4148d7717e833d8d3e4fe5a5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 22:08:09 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 12:24:07 2025 -0700"
      },
      "message": "ci: fix checkout reference in formatting workflow\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sb7ac2d84761d3e37k\n"
    },
    {
      "commit": "f7bebdd0a51bfe6f4148d7717e833d8d3e4fe5a5",
      "tree": "2e280111e0e016971322952860bc76e7402ab051",
      "parents": [
        "124c9421ab7650020428f5b26348a963b49f107f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 15:22:24 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 12:24:07 2025 -0700"
      },
      "message": "loop: attempt to stop sketch from bouncing around between branches"
    },
    {
      "commit": "124c9421ab7650020428f5b26348a963b49f107f",
      "tree": "7e2143b85574f4a6fd1b64245ee49e13f3662379",
      "parents": [
        "339b56efb8d84aa0c445071b01c48637e4943192"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 19:07:50 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 19:07:50 2025 +0100"
      },
      "message": "Improve Discord badge\n"
    },
    {
      "commit": "339b56efb8d84aa0c445071b01c48637e4943192",
      "tree": "0afd52f0b7e2eee21cd4d1ae8c834bb706ca91ac",
      "parents": [
        "75f93a1e5f32366c138c1584fdeb4919e257719d"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 14:48:07 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 15 15:01:30 2025 +0000"
      },
      "message": "webui: Implement drag-and-drop file upload in chat window\n\nFixes https://github.com/boldsoftware/sketch/issues/93\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s1ff4cfd325e3822ck\n"
    },
    {
      "commit": "75f93a1e5f32366c138c1584fdeb4919e257719d",
      "tree": "977a7932cbfd1c1f95b0b56cbe0930a5aeb5e7b8",
      "parents": [
        "a10f151746c0dafd073d4998755bedbec8f82db6"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 13:51:55 2025 +0000"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 14:24:48 2025 +0000"
      },
      "message": "codereview: Filter out non-existent files from related files suggestions\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8c2a925e22191308k\n"
    },
    {
      "commit": "a10f151746c0dafd073d4998755bedbec8f82db6",
      "tree": "882cde04e6d9fc0244f6fdb531532051e52ffb45",
      "parents": [
        "6525d826f22d12a57b9acb474a5e7b22b48ba7ea"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 13:53:26 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 15 14:14:03 2025 +0000"
      },
      "message": "webui: add copy button to markdown code blocks\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: skad1b3ffhsk\n"
    },
    {
      "commit": "6525d826f22d12a57b9acb474a5e7b22b48ba7ea",
      "tree": "6cb917c5c860c976c264a58d2753a5b6df44b57e",
      "parents": [
        "9007dd98202f8b41db1663b308fb4641476f8fa5"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 14:55:28 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 14:56:29 2025 +0100"
      },
      "message": "claudetool/kb: Prompt engineering to get sketch to more readily use kb\n"
    },
    {
      "commit": "9007dd98202f8b41db1663b308fb4641476f8fa5",
      "tree": "6a880e7eaf464d2367380b9ba43e8bfa1271fd67",
      "parents": [
        "3321939d46174ae7ab27483b8d37e0174e6476db"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 14:38:55 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 15 14:38:55 2025 +0100"
      },
      "message": "readme: Beautify GitHub README with improved formatting\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: seaae427aaa1b3246k\n"
    },
    {
      "commit": "3321939d46174ae7ab27483b8d37e0174e6476db",
      "tree": "77e9a4aa33aca4193a6136aeb30d25ac892e40ea",
      "parents": [
        "f84e88cd1c2455610de5cb73b8766972216bc14c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 20:43:24 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 15 03:44:20 2025 +0000"
      },
      "message": "Explaining relative paths to my dear llm.\n"
    },
    {
      "commit": "f84e88cd1c2455610de5cb73b8766972216bc14c",
      "tree": "c38c21c73bd2412d1d21f0846c8ba1ba95e276e9",
      "parents": [
        "da796543d8e7087e428b1e55b8f70bc8edf206ae"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 23:19:01 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed May 14 23:35:47 2025 +0000"
      },
      "message": "webui: Add file paste upload support\n\n- Add new /upload endpoint in loophttp.go to save pasted files to /tmp\n- Make the implementation generic to handle any file type, not just images\n- Implement paste event handling in sketch-chat-input.ts to detect files\n- Add logic to upload files and insert file paths in chat input\n- Improve random filename generation with better comments\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sff2e40b9b3e4c05ak\n\nwebui: Improve file upload UI experience\n- Use relative path for upload endpoint\n- Add loading indicator during file upload\n- Show error message if upload fails\n- Improve cursor position handling\n"
    },
    {
      "commit": "da796543d8e7087e428b1e55b8f70bc8edf206ae",
      "tree": "f68455c66d785be6099920e9c878883d84d79255",
      "parents": [
        "7bb1bf0dfe872ae2209308f6524edb206143b37e"
      ],
      "author": {
        "name": "Marc-Antoine Ruel",
        "email": "maruel@gmail.com",
        "time": "Wed May 14 08:20:11 2025 -0400"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 15:03:09 2025 -0700"
      },
      "message": "sketch: default -open\u003dfalse when SSH_CONNECTION is set, improve help\n\nI use sketch over ssh so I don\u0027t want a ton of web browsers window open remotely."
    },
    {
      "commit": "7bb1bf0dfe872ae2209308f6524edb206143b37e",
      "tree": "28667b522c7af3180f5dde5042434c7f1d2a458f",
      "parents": [
        "0e5b8c69d3d4436a8b591f48fd1a031a3912585a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 14:58:20 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 14:58:20 2025 -0700"
      },
      "message": "claudetool/kb: add kb info about sharing sketches"
    },
    {
      "commit": "0e5b8c69d3d4436a8b591f48fd1a031a3912585a",
      "tree": "186b38b488d1e4b0d8e4b2468c672b6fb7f79672",
      "parents": [
        "64f2aa8db137ee801120fe38b19f60103a2326dd"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 20:58:20 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 14:05:46 2025 -0700"
      },
      "message": "experiment: make memory (dear_llm.md) always enabled\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2bbca9bb0adeb9eek"
    },
    {
      "commit": "64f2aa8db137ee801120fe38b19f60103a2326dd",
      "tree": "b322e422ac17af0e9ed0e59ea9f6d91d40291f5c",
      "parents": [
        "b81d7d476ff2d104d34d3a637f2bd826a2a89eaf"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 18:31:05 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 13:53:29 2025 -0700"
      },
      "message": "loop: make multiplechoice tool calls end the turn\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8d507faf9c095824sk\n"
    },
    {
      "commit": "b81d7d476ff2d104d34d3a637f2bd826a2a89eaf",
      "tree": "43000fa14262e66e49434234ea99aeea9ab8e569",
      "parents": [
        "a5c971e132650339c92535106ffee77a95c051f8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 11:09:56 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 13:44:23 2025 -0700"
      },
      "message": "loop: strengthen guidance around suggested additions to dear_llm.md\n"
    },
    {
      "commit": "a5c971e132650339c92535106ffee77a95c051f8",
      "tree": "b3dab67621b2f79c5b4800dc66c857c0d44ca12d",
      "parents": [
        "7013e9ee282ef58104f91d64d85d4aec62f9c022"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:49:08 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 13:44:23 2025 -0700"
      },
      "message": "loop: make multiplechoice tool just a var\n"
    },
    {
      "commit": "7013e9ee282ef58104f91d64d85d4aec62f9c022",
      "tree": "baa2d5484c5a5e7add5f9caef2833a3da4abbe29",
      "parents": [
        "00442413a2d0e6d6978982f9eeec0268e533ba56"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed May 14 02:03:58 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed May 14 11:15:45 2025 -0700"
      },
      "message": "ssh: use local CA, add mutual container/host auth\n\nSee loop/server/local_ssh.md for a detailed description of how sketch uses\nnow uses a local CA to sign each container certificate instead of adding\na new entry to known_hosts for each container.\n\nThis also adds another layer of security by having the container\u0027s ssh\nserver verify that incoming ssh connections have valid host certificates,\nwhereas prior to this change the authentication was only one-way (verifying\nthat the sketch container you think you\u0027re ssh\u0027ing into really is the one\nyou think you\u0027re ssh\u0027ing into).\n\nThis is somewhat inspired by https://github.com/FiloSottile/mkcert - which\nplays a similar role as ssh_theater.go local for ssh connections, but mkcert\nuses a local CA to address local development use cases for TLS/https rather\nthan for ssh.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc7b3928295277d5dk\n"
    },
    {
      "commit": "00442413a2d0e6d6978982f9eeec0268e533ba56",
      "tree": "7cafceb162da7db94b4e13a848e512c2d2bfc797",
      "parents": [
        "7c58b02af6c7b7b2a8b237cdce6a3ff4c352401a"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 11:03:23 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 11:04:04 2025 -0700"
      },
      "message": "Log host URL in verbose mode.\n"
    },
    {
      "commit": "7c58b02af6c7b7b2a8b237cdce6a3ff4c352401a",
      "tree": "a73c5f8f8e57f6cc9117195c63aa434374c43e36",
      "parents": [
        "2044abb8f2f9d8bf4f42deb2b6c47b4ce847d6d1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 17:30:39 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:34:28 2025 -0700"
      },
      "message": "dockerimg: Use temp dir for temporary Dockerfile\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9af68b5763c2d5f0k\n"
    },
    {
      "commit": "2044abb8f2f9d8bf4f42deb2b6c47b4ce847d6d1",
      "tree": "2c498d749cec371399e8fe1d725f935eaa945298",
      "parents": [
        "c0a1e53bae35673dc77d69ba936f064439e25e1c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 17:31:20 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:33:19 2025 -0700"
      },
      "message": "cmd/sketch: increase default budget from  to 0\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s512e21ba98e811ddk\n"
    },
    {
      "commit": "c0a1e53bae35673dc77d69ba936f064439e25e1c",
      "tree": "697a470cbf1a0cabd9d153af1832804b49cf6551",
      "parents": [
        "436655e80bfeec05db1b3fce62990ba4d1374002"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 17:29:39 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:33:06 2025 -0700"
      },
      "message": "claudetool: remove telemetry endpoint and related functions\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s88833bbb3878c2a9k\n"
    },
    {
      "commit": "436655e80bfeec05db1b3fce62990ba4d1374002",
      "tree": "da698460cb71c9b9080b75bc65aee37873fe08c9",
      "parents": [
        "c488f227e3a6fa13ec34f7a957143ac89d5901e8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:20:25 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:25:15 2025 -0700"
      },
      "message": "experiment: support SKETCH_EXPERIMENT to set default sketch experiments\n"
    },
    {
      "commit": "c488f227e3a6fa13ec34f7a957143ac89d5901e8",
      "tree": "dda610048de4198f54303509a7aee51f5992abdc",
      "parents": [
        "49edc92f95cab092a7ee62c350c6e69275b50cc8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:15:16 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 14 10:15:16 2025 -0700"
      },
      "message": "loop: encourage completion of repetitive or tedious tasks\n\nLet\u0027s see if this helps.\n"
    },
    {
      "commit": "49edc92f95cab092a7ee62c350c6e69275b50cc8",
      "tree": "946b8359f6187ed630c4d08fa05e91fe1bc5a48d",
      "parents": [
        "52eeb15cf2f70caaadc4e0722a3b687ad9a91981"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 09:45:45 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed May 14 16:46:49 2025 +0000"
      },
      "message": "agent: move \"sketch-base\" into git\n\nThe agent\u0027s notion of \"initial commit\" is kind of special, in that it\nis used as the \"base\" for a bunch of git operations. It\u0027s hard for\nthe user to change (we only provide a workflow via restart), yet\nsometimes you want to do just that.\n\nSo, instead we put it as data inside of it, named as a tag sketch-base.\nIt\u0027s abusing tags, but branches are no better.\n"
    },
    {
      "commit": "52eeb15cf2f70caaadc4e0722a3b687ad9a91981",
      "tree": "5af2fe03e466157aee6fe067c7480f520ed7ab12",
      "parents": [
        "7231839efcb072bf6e256d56fee7d2d9b4510583"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed May 14 07:19:47 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed May 14 07:19:47 2025 -0700"
      },
      "message": ".clabot: add maruel\n"
    },
    {
      "commit": "7231839efcb072bf6e256d56fee7d2d9b4510583",
      "tree": "93231c027a5bd66d58513a65327aec37016270d1",
      "parents": [
        "eab12def4e6aacfd50bf8a460c714d20300706b7"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 02:56:07 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 20:05:05 2025 -0700"
      },
      "message": "webui: add agent state and status banner\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9f1c332aad2630dfk\n"
    },
    {
      "commit": "eab12def4e6aacfd50bf8a460c714d20300706b7",
      "tree": "4db97e5dfb30f73fc47435f3651eee55876a6b0b",
      "parents": [
        "8a1b89a210d3c48c6f02f0c8cf1feebb03cdffd5"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 02:35:53 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 02:36:01 2025 +0000"
      },
      "message": "loop: Add StateTransitionIterator and stream state updates\n\nImplement CodingAgent.NewStateTransitionIterator to observe state transitions.\nUpdate the /stream endpoint to send state updates when transitions occur.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s4b4f9a0689c94c54k\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s4b4f9a0689c94c54k\n"
    },
    {
      "commit": "8a1b89a210d3c48c6f02f0c8cf1feebb03cdffd5",
      "tree": "7d89b37aa585c23e8d6f640aea65e4f7c979263f",
      "parents": [
        "ec398cb9e4650d1e6043966166a99404879719fa"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 17:58:41 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 17:58:41 2025 -0700"
      },
      "message": "claudetool/bash: include partial output in error message for timeouts\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se1cb20e743a878d4k\n"
    },
    {
      "commit": "ec398cb9e4650d1e6043966166a99404879719fa",
      "tree": "247a29e8efb8391c9f1295197785ec799a0e7269",
      "parents": [
        "064f8ae0b93b8f0ea92bf9555416b1c51b2969e0"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 00:48:06 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 17:54:39 2025 -0700"
      },
      "message": "test: use \u0027any\u0027 instead of \u0027interface{}\u0027\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s0a5c6716b6ab25a7k\n"
    },
    {
      "commit": "064f8ae0b93b8f0ea92bf9555416b1c51b2969e0",
      "tree": "3e9ef9a84330abddcb38ed1488290e7f4e046a7d",
      "parents": [
        "208938f612a498ec6b594564a643fe9172da061f"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 00:47:41 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 17:54:39 2025 -0700"
      },
      "message": "claudetool/bash: include partial output when command times out\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s829d2dbdfda28988k\n"
    },
    {
      "commit": "208938f612a498ec6b594564a643fe9172da061f",
      "tree": "80a8c313fbd548fc488ffeab3f00357eb7286726",
      "parents": [
        "3e9d80c6b6315ccf1754996e9b691555915d9839"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 17:17:18 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 17:45:17 2025 -0700"
      },
      "message": "bash: Shorten bash tool default timeout to 10s.\n"
    },
    {
      "commit": "3e9d80c6b6315ccf1754996e9b691555915d9839",
      "tree": "9772d13103aa61fe4ffee76c3d25a54f5bd22b66",
      "parents": [
        "84a8ae60f6553c409089095e6e3baa33075c4fd4"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue May 13 23:35:23 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue May 13 17:03:37 2025 -0700"
      },
      "message": "dockerimg: update SSHTheater to use Ed25519 keys\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa8eb476bc38e0479k\n"
    },
    {
      "commit": "84a8ae60f6553c409089095e6e3baa33075c4fd4",
      "tree": "86ca5b22f2cf7008fdddb352aa32aa768d2dd70b",
      "parents": [
        "18e336804bb6f052b29d891f7db54bd45e1de503"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 16:36:01 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 16:36:01 2025 -0700"
      },
      "message": "tool cards: add TODO\n"
    },
    {
      "commit": "18e336804bb6f052b29d891f7db54bd45e1de503",
      "tree": "48a979aa7f5e89975cf8f579722ff9f363768985",
      "parents": [
        "34bb09adf0cfc2f7fa4a2615e72d634aa88a6016"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 16:34:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 16:34:21 2025 -0700"
      },
      "message": "browser: Add console log capture tools\n\nThis was entirely Sketch-coded.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc6bbdde6b1a71d8fk\n"
    },
    {
      "commit": "34bb09adf0cfc2f7fa4a2615e72d634aa88a6016",
      "tree": "d11fc262309a5d9ca704ebefe1ee43e20d8f572d",
      "parents": [
        "848572dcc2fff195e330d896530de63cd21b0f00"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue May 13 15:39:54 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue May 13 15:56:29 2025 -0700"
      },
      "message": "webui: fix client-side nav back button\n"
    },
    {
      "commit": "848572dcc2fff195e330d896530de63cd21b0f00",
      "tree": "87d93dadd66dbf5c8bc18060739d1235ef93c953",
      "parents": [
        "c31e29689eaf26e7904e074bf8dcb3f02150c1ac"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue May 13 22:27:42 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue May 13 22:31:22 2025 +0000"
      },
      "message": "webui: Add documentation explaining sketch-tool-card component architecture\n\nAdded DEAR_LLM.md that documents the relationship between LitElement\nsubclasses and the sketch-tool-card custom element. The document explains:\n- Component hierarchy and containment relationships\n- How composition (not inheritance) is used for specialized components\n- Shadow DOM encapsulation and CSS styling effects\n- Various styling techniques used in the components\n\nThis serves as a reference for understanding the web component architecture.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7f7a15baab05d7e9sk\n"
    },
    {
      "commit": "c31e29689eaf26e7904e074bf8dcb3f02150c1ac",
      "tree": "b935adaff69405877a3eb669550d1ea5d81f066a",
      "parents": [
        "7fb3499f45c55be818fe6d439fe61fa82ee59572"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Tue May 13 10:53:33 2025 +0000"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Tue May 13 10:54:18 2025 +0000"
      },
      "message": "dockerimg: print LLM output in verbose mode\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6f2e9c028be5b8b5k\n"
    },
    {
      "commit": "7fb3499f45c55be818fe6d439fe61fa82ee59572",
      "tree": "2f1219ca674e9c34c6bbb2653237bece4059e3f6",
      "parents": [
        "17b1094cadb489b38596527d2d1f693653797fad"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue May 13 02:23:55 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue May 13 02:23:55 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "17b1094cadb489b38596527d2d1f693653797fad",
      "tree": "854eea2340ab00e8d23b60bb8d24a4006e284f15",
      "parents": [
        "44d1f1ad69d7db4df1249b9e37a7f747e610ba59"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:19:42 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:22:34 2025 -0700"
      },
      "message": "loop: tell the agent that it is powering sketch\n\nThis makes the knowledge base verbiage make more sense,\nwhile avoiding anthropomorphization."
    },
    {
      "commit": "44d1f1ad69d7db4df1249b9e37a7f747e610ba59",
      "tree": "10032ac0eaa586036381e8889dae533d5802d447",
      "parents": [
        "385da541a187a3499bf8d6368a66c2ba1109c398"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:18:32 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:18:32 2025 -0700"
      },
      "message": "loop: instruction the agent not to make new branches\n\nThings always get muddled when it starts making lots of branches.\n"
    },
    {
      "commit": "385da541a187a3499bf8d6368a66c2ba1109c398",
      "tree": "611b347ce238f4201ba998d331f4798a35e73b6c",
      "parents": [
        "31785aed38e0f63fa736430c6240c8a76b8285dc"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:18:10 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:18:10 2025 -0700"
      },
      "message": "dear_llm: point out the meta\n\nHopefully this will reduce some of the confusion I\u0027ve been seeing..."
    },
    {
      "commit": "31785aed38e0f63fa736430c6240c8a76b8285dc",
      "tree": "35916d3dbedaeac296ece3dd57610efd82c99c8d",
      "parents": [
        "5c7f95714f34ea327b8f300238da6491dedd6adb"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 06 01:50:58 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:17:50 2025 -0700"
      },
      "message": "loop: add knowledge_base tool for on-demand information\n\nThe knowledge_base tool provides a way for agents to access specialized information\nwhen needed. Initial topics include:\n\n- sketch: how to use Sketch, including SSH, secrets, and file management\n- go_iterators: information about Go\u0027s iterator feature added in Go 1.22\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "5c7f95714f34ea327b8f300238da6491dedd6adb",
      "tree": "3e550d2deb91606405dc398782443fdd37a18e2f",
      "parents": [
        "8dff12f977fa4f52c27142e8f7b4c8c5d9293711"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue May 13 01:17:31 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue May 13 01:17:31 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "8dff12f977fa4f52c27142e8f7b4c8c5d9293711",
      "tree": "8bfb2d10bb9826d9b82435cbd3ca551ea22bb251",
      "parents": [
        "6d4c7eadb2d465aa665288acc3f45e693d9a76d3"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:48:36 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 18:16:14 2025 -0700"
      },
      "message": "loop: emphasize directory guidance\n\nMake it clearer and more emphatic that agents must check and read\ndirectory-specific guidance files before making changes to files.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s624b7b2b4c7c1054k"
    },
    {
      "commit": "6d4c7eadb2d465aa665288acc3f45e693d9a76d3",
      "tree": "2e5128fc06d72237a292d038008ab15bf59e9b59",
      "parents": [
        "98b64d1b30d8715a9238fcda7ecedd313c37b5b7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 12:14:24 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 17:36:19 2025 -0700"
      },
      "message": "dear_llm: update\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9141e33d762836c9k"
    },
    {
      "commit": "98b64d1b30d8715a9238fcda7ecedd313c37b5b7",
      "tree": "f50c5eafc52d823b81849fa1cd7f384cff5fa461",
      "parents": [
        "39ed5a59d0c3802b3895dbc5da0b38b358252ea3"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 19:42:43 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 17:36:19 2025 -0700"
      },
      "message": "webui: switch to chat view when user sends a message\n\nWhen a user sends a message by hitting the Send button or pressing Enter,\nautomatically switch them back to the Chat view so they can immediately\nsee that their message is being processed.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s35da158cf333d3abk\n"
    },
    {
      "commit": "39ed5a59d0c3802b3895dbc5da0b38b358252ea3",
      "tree": "44cb42e602c38346a136a3c34f7cb178ef671973",
      "parents": [
        "53b02a6f0c62a8df188fde4a79414099f9d0da95"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 17:34:45 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 12 17:36:19 2025 -0700"
      },
      "message": "readme: take a quick editing pass"
    },
    {
      "commit": "53b02a6f0c62a8df188fde4a79414099f9d0da95",
      "tree": "e8958aaffe7a251cc9975850543963448c23241f",
      "parents": [
        "ff2df6a1f379812b360f6f3d3e40e4b65aef369c"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 12 14:46:29 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 12 15:12:02 2025 -0700"
      },
      "message": "dockerimg: more exacting prompt for building a dockerfile\n\nThis morning\u0027s claude moving target has forgotten how a Dockerfile\nworks, and it tries injecting direct shell into the file. Tell it\neverything should start with RUN.\n\nFor #83\nFor #85\n"
    },
    {
      "commit": "ff2df6a1f379812b360f6f3d3e40e4b65aef369c",
      "tree": "3245cee772c43f37919c81820bda6286ed317130",
      "parents": [
        "39bcf01eb98e2949d383b65d1651bf804308cc0f"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 12 14:45:29 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 12 14:45:33 2025 -0700"
      },
      "message": "dockerimg: improve errors if dockerfile fails to build\n\nUpdates #83\n"
    },
    {
      "commit": "39bcf01eb98e2949d383b65d1651bf804308cc0f",
      "tree": "929ce5636cf29f0043d5d1a88af485edad2b5788",
      "parents": [
        "e577ef7f883e2b8d54cd6862a23b2f42510d33a0"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 12 10:07:40 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 12 10:07:50 2025 -0700"
      },
      "message": "Added FAQ about no space left.\n"
    },
    {
      "commit": "e577ef7f883e2b8d54cd6862a23b2f42510d33a0",
      "tree": "30b11d3880b5425ec2e64780858628be54159f23",
      "parents": [
        "7a1136201c3444009e2eeda2fb13cb76c943443f"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon May 12 10:29:00 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon May 12 10:29:00 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "7a1136201c3444009e2eeda2fb13cb76c943443f",
      "tree": "479b870608115a330cd4da100e988bfd2d198887",
      "parents": [
        "a9a786b458e989a1ea2d6e8e2b35fb24b79de2cf"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon May 12 10:58:45 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon May 12 11:23:12 2025 +0100"
      },
      "message": "loop: on git fetch or checkout failure, retry without hooks\n\nFix #10 by removing git hooks on git fetch or checkout failure to solve problem where hooks might require dependencies not available in the container (e.g., git-branchless). This prevents errors during container initialization when git operations trigger hooks.\n\nWe can revisit this approach if we find users who need their hooks to run in the container environment.\n"
    },
    {
      "commit": "a9a786b458e989a1ea2d6e8e2b35fb24b79de2cf",
      "tree": "38e4d49a92543141ab9864d580bd237ab0fd5170",
      "parents": [
        "e31d2a95da49b58cabe4675335c2de80039007ec"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon May 12 10:52:34 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon May 12 11:21:29 2025 +0100"
      },
      "message": "dockerimg: Fix development version detection when run with -C flag\n\nWhen running sketch with the `-C` flag to change directories, the check for\ndevelopment version should happen in the sketch directory, not the\ntarget directory.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "e31d2a95da49b58cabe4675335c2de80039007ec",
      "tree": "efc2dbe13a82cf2042979386bc39d159422dde71",
      "parents": [
        "04e778cbe6955cccf56a4e52c163a1c2220ff84a"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sun May 11 15:22:35 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sun May 11 15:22:35 2025 -0700"
      },
      "message": "webui: Fix message bubbles and tool calls overflow issues in timeline\n\nOn the bright side, Sketch fixed this with repeated \"hey, look at that\nscreenshot; there\u0027s horizontal truncation.\" On the downside, it got\nreally confused by shadow dom, and the solution doesn\u0027t look clean to\nme, with lots of inline CSS.\n\n~~~~~\n\nFixed various overflow issues in timeline component, particularly with\nhandling long bash commands in shadow DOM contexts:\n\n1. Message Bubbles:\n   - Added overflow constraints to message-bubble-container\n   - Changed max-width from 80% to 100% for better containment\n   - Added text-overflow: ellipsis for clean truncation\n\n2. Tool Cards:\n   - Implemented manual string truncation for bash commands\n   - Limited display to 80 chars with ellipsis for overflowing text\n   - Added CSS to constrain width in all contexts\n\n3. Shadow DOM Challenges:\n   - Standard CSS inheritance doesn\u0027t penetrate shadow DOM boundaries\n   - Component-specific styles required direct modification in render methods\n   - Parallel CSS and JS truncation needed for reliable overflow handling\n   - Multiple nested web components required coordinated width constraints\n\n4. Global Improvements:\n   - Added overflow-x: hidden to parent containers\n   - Used box-sizing: border-box for accurate sizing\n   - Fixed scroll container to prevent horizontal scrolling\n\nThe primary insight was that shadow DOM isolation prevented CSS-only\nsolutions from working reliably. Explicit string truncation in the\ncomponent code was needed alongside careful container width management.\nThis pattern may need to be applied to other web components that\ndisplay potentially lengthy content.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc937c08ac1b7766fk\n"
    },
    {
      "commit": "04e778cbe6955cccf56a4e52c163a1c2220ff84a",
      "tree": "fe0d1b60f73d113cf82a8f66759e6496d3414942",
      "parents": [
        "05224846741b500d8103bd6930a7717e1211ef01"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Sat May 10 22:08:04 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Sat May 10 23:27:10 2025 -0700"
      },
      "message": "webui: name:sketch-webui, export web-components\n\nThe purpose of this change is so we can re-use the\nsketch-timeline custom element in a different app\nin a different repo, specifically the app that\nrenders publicly shared sketch session transcripts\nat sketch.dev/messages/\u003csession ID\u003e\n"
    },
    {
      "commit": "05224846741b500d8103bd6930a7717e1211ef01",
      "tree": "54eaad583c19b5c00719384a268d8dccab0dd13e",
      "parents": [
        "80b488d853e2766b638e65cfe44a5904d7cb24ee"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 18:26:08 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 18:26:08 2025 -0700"
      },
      "message": "browser: add window resize tool with chromedp\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s68bdc7fb84309a7ck\n"
    },
    {
      "commit": "80b488d853e2766b638e65cfe44a5904d7cb24ee",
      "tree": "abd280ec3924efb4dbbd72622129bc4af56e28ca",
      "parents": [
        "6458e7c751856a9f7f4004367cb6274e564a1489"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 18:21:54 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Sun May 11 01:22:37 2025 +0000"
      },
      "message": "Browser tools: initialize lazily and add timeouts.\n\nAlso rename browser_screenshot to browser_take_screenshot for clarity\\n- Update both Go and UI code to maintain consistency\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8a5cabff914f88dfk\n"
    },
    {
      "commit": "6458e7c751856a9f7f4004367cb6274e564a1489",
      "tree": "42bebd39701d0866ebb6da556ec3970af8a96d01",
      "parents": [
        "5ebdbb819bcbfcc77356c600fb1ad736433b2f07"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 18:07:54 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 18:08:12 2025 -0700"
      },
      "message": "README: Add instructions about connecting to Sketch container\n"
    },
    {
      "commit": "5ebdbb819bcbfcc77356c600fb1ad736433b2f07",
      "tree": "b341e124bfc37d1e118c4d815dbe75d45100e354",
      "parents": [
        "72252cbcb97840d724133be67c4c69cc69ebb2d3"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 17:20:29 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 17:20:29 2025 -0700"
      },
      "message": "Adding User Guide to README.md\n"
    },
    {
      "commit": "72252cbcb97840d724133be67c4c69cc69ebb2d3",
      "tree": "a361499dc3fa6b9af2be3e74cfd59fd8ba34690e",
      "parents": [
        "7ce5fb76d8748ebf73c5adf9d6cd8eb67716fba8"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 17:00:08 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 17:00:08 2025 -0700"
      },
      "message": "llm and everything: Update ToolResult to use []Content instead of string for multimodal support\n\nThis was a journey. The sketch-generated summary below is acceptable,\nbut I want to tell you about it in my voice too. The goal was to send\nscreenshots to Claude, so that it could... look at them. Currently\nthe take screenshot and read screenshot tools are different, and they\u0027ll\nneed to be renamed/prompt-engineered a bit, but that\u0027s all fine.\n\nThe miserable part was that we had to change the return value\nof tool from string to Content[], and this crosses several layers:\n - llm.Tool\n - llm.Content\n - ant.Content \u0026 openai and gemini friends\n - AgentMessage [we left this alone]\n\nExtra fun is that Claude\u0027s API for sending images has nested Content\nfields, and empty string and missing needs to be distinguished for the\nText field (because lots of shell commands return the empty string!).\n\nFor the UI, I made us transform the results into a string, dropping\nimages. This would have been yet more churn for not much obvious\nbenefit. Plus, it was going to break skaband\u0027s compatibility, and ...\nyet more work.\n\nOpenAI and Gemini don\u0027t obviously support images in this same way,\nso they just don\u0027t get the tools.\n\n~~~~~~~~~~ Sketch said:\n\nThis architectural change transforms tool results from plain strings to []Content arrays, enabling multimodal interaction in the system. Key changes include:\n\n- Core structural changes:\n  - Modified ToolResult type from string to []Content across all packages\n  - Added MediaType field to Content struct for MIME type support\n  - Created TextContent and ImageContent helper functions\n  - Updated all tool.Run implementations to return []Content\n\n- Image handling:\n  - Implemented base64 image support in Anthropic adapter\n  - Added proper media type detection and content formatting\n  - Created browser_read_image tool for displaying screenshots\n  - Updated browser_screenshot to provide usable image paths\n\n- Adapter improvements:\n  - Updated all LLM adapters (ANT, OAI, GEM) to handle content arrays\n  - Added specialized image content handling in the Anthropic adapter\n  - Ensured proper JSON serialization/deserialization for all content types\n  - Improved test coverage for content arrays\n\n- UI enhancements:\n  - Added omitempty tags to reduce JSON response size\n  - Updated TypeScript types to handle array content\n  - Made field naming consistent (tool_error vs is_error)\n  - Preserved backward compatibility for existing consumers\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s1a2b3c4d5e6f7g8h\n"
    },
    {
      "commit": "7ce5fb76d8748ebf73c5adf9d6cd8eb67716fba8",
      "tree": "1890bd46f87cf7261ba5a6aaa3fd2d110e7d67cc",
      "parents": [
        "022b3638c2d2691d60f430d8984959c91eee46ab"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 06:26:22 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 06:26:29 2025 -0700"
      },
      "message": "Revert \"llm: add service.ModelName\"\n\nTurns out I don\u0027t need this.\n\nThis reverts commit 022b3638c2d2691d60f430d8984959c91eee46ab.\n"
    },
    {
      "commit": "022b3638c2d2691d60f430d8984959c91eee46ab",
      "tree": "7459ef27d1e6d2ed83773acb9a33741fddbd730c",
      "parents": [
        "a997be617bd5548a307c708cdba325ea6562acec"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 06:14:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 10 06:14:49 2025 -0700"
      },
      "message": "llm: add service.ModelName\n"
    },
    {
      "commit": "a997be617bd5548a307c708cdba325ea6562acec",
      "tree": "1890bd46f87cf7261ba5a6aaa3fd2d110e7d67cc",
      "parents": [
        "dce8d84fdcda62e03b13c95d7614ee7ab983ddca"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 22:52:46 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 15:32:45 2025 -0700"
      },
      "message": "claudetool/onstart: add codebase analysis tool and basic memory support\n\nThis is a preliminary approach. Big high level questions include:\n\n* should we keep the multichoice tool prompting?\n* should we push the list of quidance files or respond with them during codereview?\n* should we use the list of docs and build files at all?\n* are there other files we should hint (e.g. editor settings, something from aider, etc.)?\n\nWe should probably also blog about dear_llm.md to stop the endless proliferation of new files.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "dce8d84fdcda62e03b13c95d7614ee7ab983ddca",
      "tree": "bf7f0dad1b07863b80ae16ea0a183a9c2b270b34",
      "parents": [
        "f59df72da9277859885d4dd65afe76d6de70fd0d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 12:27:19 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 15:32:17 2025 -0700"
      },
      "message": "claudetool: remove mention of go doc"
    },
    {
      "commit": "f59df72da9277859885d4dd65afe76d6de70fd0d",
      "tree": "c5972e45b3666b5e66277bc864b923bb6339771b",
      "parents": [
        "113e2053753d5b3e08be0f3509a204fe24ba5e87"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 12:24:03 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 15:31:54 2025 -0700"
      },
      "message": "claudetool: don\u0027t list out available binaries in bash tool\n\nIt does what it wants to do; I\u0027ve never seen it use this information.\nAnd there\u0027s no impact on Go eval, and it biases the model\ntowards assuming it is working in Go.\n\n"
    },
    {
      "commit": "113e2053753d5b3e08be0f3509a204fe24ba5e87",
      "tree": "1d86ecce8062bd94d0daeb6052623cde019f5e99",
      "parents": [
        "e97a8e54e0c7e5c5cabf29a00bce6a81094a6ca9"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 21:59:40 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 15:06:33 2025 -0700"
      },
      "message": "git: add retry logic for checked out branch conflicts\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se1c139889d8c3e3fk\n"
    },
    {
      "commit": "e97a8e54e0c7e5c5cabf29a00bce6a81094a6ca9",
      "tree": "166a672959cbee9c81e56e720eed3572dc375505",
      "parents": [
        "51e8e2b0c970ef488094a33b3c259583fe142dc5"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 14:53:33 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 15:06:33 2025 -0700"
      },
      "message": "git: Make \"git fetch sketch-host\" update origin refs as well.\n"
    },
    {
      "commit": "51e8e2b0c970ef488094a33b3c259583fe142dc5",
      "tree": "6ecd15e35a40aece2c24231a0540466c7117292d",
      "parents": [
        "d03318d51ca1e707698f1aab8d18ed83fc159cbe"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 21:41:12 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 15:06:33 2025 -0700"
      },
      "message": "dockerimg: Run git fetch when .git/info/refs is requested\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sca37f0dfd43f13e9k\n"
    },
    {
      "commit": "d03318d51ca1e707698f1aab8d18ed83fc159cbe",
      "tree": "ae2ee324779b56baa1bc0670aa6852366a5ad9ab",
      "parents": [
        "8236cbc9eadb1bf775bbfa24ccf04be2c69faaaf"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 08 13:09:12 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 09 15:06:33 2025 -0700"
      },
      "message": "sketch: Introduce versions for sketch state\n"
    },
    {
      "commit": "8236cbc9eadb1bf775bbfa24ccf04be2c69faaaf",
      "tree": "8d0024ce5d69622f452315947c4db5b815bad2b0",
      "parents": [
        "d74572d85c7bbb52b36dfc29338f42dc723caba8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 09:57:57 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 09 11:47:36 2025 -0700"
      },
      "message": "llm/oai: add several more models\n"
    },
    {
      "commit": "d74572d85c7bbb52b36dfc29338f42dc723caba8",
      "tree": "e5db69c3873acb9ad8e8cbfbf208431aa39ac3be",
      "parents": [
        "078e85ae683cfcb6f0cc45dfbb7dd02aafec0046"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Fri May 09 13:50:04 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Fri May 09 13:50:04 2025 +0100"
      },
      "message": "docs: add DEAR_LLM.md with repository context for AI agents\n\nCreate a concise overview document to help AI agents understand\nthe Sketch repository architecture, components, and common development\nworkflows. Includes information about the dual binary pattern,\ncontainer system, and development gotchas that would be helpful\ncontext for future AI assistance.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "078e85ae683cfcb6f0cc45dfbb7dd02aafec0046",
      "tree": "750dbf13e8d47fefc1566a9922e7a393a0661b9c",
      "parents": [
        "15c9528318131e8b903199fa7dfe82dbe7b2ed91"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 08 17:28:34 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 08 17:28:34 2025 -0700"
      },
      "message": "ssh_theater: only edit conf if host doesn\u0027t resolve\n"
    },
    {
      "commit": "15c9528318131e8b903199fa7dfe82dbe7b2ed91",
      "tree": "15997f3dd5578e975288f30b5659e95b4c84c3bf",
      "parents": [
        "220a36d6404a3a86af2537ca8572b9e28c77bcb6"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 08 16:48:38 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu May 08 16:48:38 2025 -0700"
      },
      "message": "ssh_theater: ask the user before editing config\n"
    },
    {
      "commit": "220a36d6404a3a86af2537ca8572b9e28c77bcb6",
      "tree": "2329c0925b52432d519b7610b571328159ac5364",
      "parents": [
        "9320265a8e0ae7fb3091985c1999ed43bdae9525"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 08 19:06:26 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 08 12:44:11 2025 -0700"
      },
      "message": "experiment: remove not_done experiment\n\nIt didn\u0027t make a difference.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc2849bd18751e2cak\n"
    },
    {
      "commit": "9320265a8e0ae7fb3091985c1999ed43bdae9525",
      "tree": "25a424999bee4597b971764640985585ce46f792",
      "parents": [
        "4d54493fe3808ecd0c6a9a4d0bbcc7786e97b094"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 08 02:05:57 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 08 12:34:07 2025 -0700"
      },
      "message": "loop: update git commit instruction to use --trailer, add Change-ID\n\nWe have run \u0027git config\u0027 for the user, so we can trim those instructions and simplify.\n(And in unsafe mode, the user has \u0027git config\u0027 set up anyway.)\n\nInstead of prompting the model to manually add \u0027Co-Authored-By\u0027 as a line in the\ncommit message, now instruct it to use the --trailer option.\nThis streamlines adding a Change-ID trailer with a random string (s\u003crandom_hex\u003ek format).\n\nI\u0027d actually like to use precommmit hooks to automatically do all the trailer,\nbut that doesn\u0027t play nicely with -unsafe, so for now, do it this way.\nAt least we\u0027ll have Change-IDs that we can start using.\n(Pity the official change-id support in git hasn\u0027t landed yet.)\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9b68cbfa4c7eeb82k\n"
    },
    {
      "commit": "4d54493fe3808ecd0c6a9a4d0bbcc7786e97b094",
      "tree": "9877409fc95aaa32aed882426ea15464b8036e34",
      "parents": [
        "a4ad8af8b08a54326bbbd99d57110a42c459c54e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 13:33:53 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 08 19:25:30 2025 +0000"
      },
      "message": "all: support hiding subconvo output\n\nSome of it is systematically noisy.\n"
    },
    {
      "commit": "a4ad8af8b08a54326bbbd99d57110a42c459c54e",
      "tree": "91efd4a68b335315d91aa1fc41244e2faaeeb873",
      "parents": [
        "3b279a51ed0d83f3659be932d7e346609df42107"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 08 15:05:27 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Thu May 08 15:05:27 2025 +0100"
      },
      "message": "webui: Streamline playwright reporter config\n"
    },
    {
      "commit": "3b279a51ed0d83f3659be932d7e346609df42107",
      "tree": "4e15375aecbcf83a60d67b6da97c28fff7886dfc",
      "parents": [
        "b9e62fdfeb6d4050750aa7beceda13d7beb2223d"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 07 21:02:03 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 07 21:02:03 2025 -0700"
      },
      "message": "README.md: De-emphasize Go a bit.\n\nWe love Go, but Sketch works on other systems too!\n"
    },
    {
      "commit": "b9e62fdfeb6d4050750aa7beceda13d7beb2223d",
      "tree": "7544977472861074bea9ccac721026efdab8ad38",
      "parents": [
        "b529e733365034174f0e5c99e3f0fce347b34c5d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 18:34:53 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 19:17:50 2025 -0700"
      },
      "message": "loop: remove some Go-specific language from system prompt\n\nIt never used gopls anyway. :/"
    },
    {
      "commit": "b529e733365034174f0e5c99e3f0fce347b34c5d",
      "tree": "69491005dfacfdbabfbb244ac72468d85a5f7a99",
      "parents": [
        "d2f54c2e43ad3ad2c9b389068c1555c3e7f231f2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 22:06:46 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 19:17:50 2025 -0700"
      },
      "message": "loop: disable multiple choice tool in oneshot mode\n\nThis change disables the multiple choice tool when Sketch is running in one-shot mode.\nIt adds an OneShot flag to the AgentConfig struct and conditionally includes\nthe multiple choice tool based on this flag.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "d2f54c2e43ad3ad2c9b389068c1555c3e7f231f2",
      "tree": "a57204539b914c7109b5a53456148970b1293357",
      "parents": [
        "f392251fe06355e73d80eae868916410ab18b08b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 18:38:07 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 19:17:50 2025 -0700"
      },
      "message": "loop: improve update_tests.sh reliability\n\nEncouraging the agent to call the title tool immediately\nhas its drawbacks!"
    },
    {
      "commit": "f392251fe06355e73d80eae868916410ab18b08b",
      "tree": "a0719a5cc2a2b4d94bdf86e737dd0357fb14615d",
      "parents": [
        "fa66703d711e53c923109cd78a165ed58cbb29da"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 17:56:22 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 19:17:50 2025 -0700"
      },
      "message": "go.mod: bump to Go 1.24.3"
    },
    {
      "commit": "fa66703d711e53c923109cd78a165ed58cbb29da",
      "tree": "49eb4fe2e8891df4c43e0f6d1516736d4778bbed",
      "parents": [
        "6aaf6afdee5d097c23d5e80314ea13cf37bea491"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:13:27 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:13:27 2025 -0700"
      },
      "message": "llm/oai: add Mistral Medium 3 to oai models\n"
    },
    {
      "commit": "6aaf6afdee5d097c23d5e80314ea13cf37bea491",
      "tree": "add2c3678c614dd45b718ef1ff636bd2b012e8b2",
      "parents": [
        "6ab6fce0d5309447156935c39c3d29dc4977c49d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 20:47:13 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:04:30 2025 -0700"
      },
      "message": "experiment: make precommit always on\n\nRemove the precommit experiment flag and make commit message style guidance\nalways available when using the precommit tool.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "6ab6fce0d5309447156935c39c3d29dc4977c49d",
      "tree": "0f90c8ff0b221abc95cc3a05e72f9f1835edd497",
      "parents": [
        "1ed1cc459db26690eddb05da525e1580ae688b59"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 12:42:53 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:03:38 2025 -0700"
      },
      "message": ".dockerignore: add\n\nI\u0027m tired of sketch committing .DS_Store files.\n\nThere\u0027s probably a more general fix to be done here\nthat helps all users, but I don\u0027t see its shape,\nand this at least eases my frustration in the near term.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "1ed1cc459db26690eddb05da525e1580ae688b59",
      "tree": "d94c5ad81bdc6aa15af399081cac3d915592eadc",
      "parents": [
        "85de37e3be602ca67ef5e2f2185ee819323ec31c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 20:21:40 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:03:38 2025 -0700"
      },
      "message": "codereview: only run go mod tidy when go.mod has changed\n\nThis change modifies the codereview tool to only run \u0027go mod tidy\u0027 when\ngo.mod or go.sum files have been modified.\n\nThis makes sketch work better with non-Go projects.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "85de37e3be602ca67ef5e2f2185ee819323ec31c",
      "tree": "4332db4df2ab98f661731107102436291ae02ab9",
      "parents": [
        "a2a31508e1b7348a1337e2038c5560d4b1bc19d3"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 06:46:45 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:03:38 2025 -0700"
      },
      "message": "loop: encourage smaller diffs\n\nHopefully this will prevent the agent from being gratuitously \"helpful\".\nAnd small diffs are always welcome when reviewing.\n"
    },
    {
      "commit": "a2a31508e1b7348a1337e2038c5560d4b1bc19d3",
      "tree": "7c3234c35772260a8cbee23d78ec37d7775a1fc7",
      "parents": [
        "c3c202317359dae2647aee2bcdbe61382fa3b99f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 12:37:18 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:03:38 2025 -0700"
      },
      "message": "loop: split title tool into title and precommit tools\n\ntitle wants to be called early, as soon as the topic is clear.\nprecommit wants to be called late, just before first git commit.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "c3c202317359dae2647aee2bcdbe61382fa3b99f",
      "tree": "0ac08a058671319e2411df587a72f36e30d1935a",
      "parents": [
        "924a77070bc1edc1a861de6462a4ef7bb863e648"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 05:46:04 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:02:27 2025 -0700"
      },
      "message": "webui, termui: use 〰️ for tool call failures\n\nReplaces 🙈 and 🔔 and ❌ and ⚠️.\n\nMaybe this one will stick. It\u0027s low key and a little wobbly.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "924a77070bc1edc1a861de6462a4ef7bb863e648",
      "tree": "c29b5c835e41c7df9ead819659b8ec9283ade2fc",
      "parents": [
        "4936de3834a2c70db563d19975c072bb42d953cc"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 06 02:14:40 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:02:13 2025 -0700"
      },
      "message": "claudetool: improve commit message guidance in precommit tool\n\nThe precommit tool now:\n1. Directly executes git commands to extract example commit messages\n2. Displays actual commit message examples from the repository\n3. Includes stronger, mandatory language about following the commit style\n\nThis improves compliance with the repository\u0027s commit message style by\nproviding clear examples rather than just instructions on how to view them.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    }
  ],
  "next": "4936de3834a2c70db563d19975c072bb42d953cc"
}
