)]}'
{
  "log": [
    {
      "commit": "160fb06bb7c8df956daecd4d3bdb3f94d8a93406",
      "tree": "9456f5a0df9eb51180d189d87f8d52016ccb5f40",
      "parents": [
        "0e8073a19a88ef5e7a03acc8b5f924bfda0afdd5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 22 21:04:22 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 11:30:35 2025 -0700"
      },
      "message": "claudetool: improve error message when all search terms match too much"
    },
    {
      "commit": "0e8073a19a88ef5e7a03acc8b5f924bfda0afdd5",
      "tree": "e5511fc6781ee80ec5f8c257e6a9a16446b27ab9",
      "parents": [
        "3e6a4c4abe8714ebb04c0d4834bcc7230f4d4a03"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 22 21:04:51 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 11:30:33 2025 -0700"
      },
      "message": "llm/ant: add Claude 4 sonnet/opus\n\nNot set as default yet.\nThere\u0027s a bit of prompt engineering work\nto do before we flip the switch."
    },
    {
      "commit": "3e6a4c4abe8714ebb04c0d4834bcc7230f4d4a03",
      "tree": "cf5b7dc0ed2ac2c55a949962d19416bae8553809",
      "parents": [
        "f4f929a48d358acb206a6cbc91dfdee813c45aed"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 17:29:57 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 11:30:07 2025 -0700"
      },
      "message": "dockerimg: mount Go caches for faster Docker race builds\n\nWhen building sketch binary with race detector in Docker, the system\nwas downloading all modules and rebuilding from scratch every time,\nmaking repeated builds slow and inefficient.\n\nThis adds host Go cache mounting to buildLinuxSketchBinWithDocker by:\n- Getting host GOCACHE and GOMODCACHE directories using \u0027go env\u0027\n- Mounting them as volumes in the Docker container:\n  -v $GOCACHE:/root/.cache/go-build\n  -v $GOMODCACHE:/go/pkg/mod\n\nThe optimization ensures:\n- First race build: Downloads modules (same time as before)\n- Subsequent race builds: Reuses cached modules (much faster)\n- Build artifacts persist between Docker container runs\n\nAdds helper functions getHostGoCacheDir() and getHostGoModCacheDir()\nto retrieve cache paths from the host environment, with proper error\nhandling and path validation.\n\nIncludes unit test to verify cache directory detection works correctly\non all platforms where Go is installed.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd279e56e1574e4e1k\n"
    },
    {
      "commit": "f4f929a48d358acb206a6cbc91dfdee813c45aed",
      "tree": "8f078c859c7f2b3bca003e39faf6cfeb46001147",
      "parents": [
        "3b5646ff27d0e644396524b8ca2c9a4c5891726c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 17:19:26 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 11:30:07 2025 -0700"
      },
      "message": "dockerimg: fix VCS stamping error when building with race detector\n\nWhen building the sketch binary with race detector enabled in Docker,\nGo\u0027s VCS stamping feature was failing with \u0027error obtaining VCS status:\nexit status 128\u0027 because it couldn\u0027t properly determine the Git status\nin the mounted repository (especially in detached HEAD states).\n\nThis adds -buildvcs\u003dfalse to the Docker build command to disable VCS\nstamping when building with the race detector, which avoids the error\nwhile still enabling race detection functionality.\n\nThe fix changes the Docker build command from:\n  go build -race -o /tmp/sketch-out/sketch sketch.dev/cmd/sketch\nto:\n  go build -buildvcs\u003dfalse -race -o /tmp/sketch-out/sketch sketch.dev/cmd/sketch\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sb8b2e8656c0802f6k\n"
    },
    {
      "commit": "3b5646ff27d0e644396524b8ca2c9a4c5891726c",
      "tree": "2fea328279fa22fedef6b570af10c4bb45aaaf7e",
      "parents": [
        "12989b0cf7cb542f1286d53c3dce86ae1d56773b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 16:47:53 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 10:06:40 2025 -0700"
      },
      "message": "llm/ant: prevent httprr cache misses from being retried\n\nPackage ant treated httprr\u0027s \u0027cached HTTP response not found\u0027 errors as\nretryable network errors, causing 30+ second delays and test\ntimeouts when httprr couldn\u0027t find matching requests.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s81a2a9035286ab41k"
    },
    {
      "commit": "12989b0cf7cb542f1286d53c3dce86ae1d56773b",
      "tree": "70b7cde65a4378b532c498725099a8a6380d74e6",
      "parents": [
        "4acf00626f50c342dc35f8525732074cf10e4d1a"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Fri May 23 11:27:47 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Fri May 23 11:27:47 2025 +0100"
      },
      "message": "fix: read API key from environment in host mode when not using skaband\n\nWhen running sketch in the default container mode with -skaband-addr\u003d,\nthe system was failing with \u0027x-api-key header is required\u0027 because the\nrunInHostMode function wasn\u0027t reading the ANTHROPIC_API_KEY environment\nvariable when skaband wasn\u0027t being used.\n\nThis change adds the missing logic to read the API key from environment\nvariables (ANTHROPIC_API_KEY for claude, or GEMINI_API_KEY for gemini)\nwhen skabandAddr is empty, matching the behavior in runInUnsafeMode.\n\nThe fix ensures that commands like:\nenvdir /path/to/env go run ./cmd/sketch -skaband-addr\u003d -prompt \u0027task\u0027\nnow work correctly by passing the API key to the Docker container\u0027s\ndockerfile creation process.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s592f0c893cafc931k\n"
    },
    {
      "commit": "4acf00626f50c342dc35f8525732074cf10e4d1a",
      "tree": "4096c36933030c1c238098a7cb2214adc86421c4",
      "parents": [
        "9bca61ef623ea8cd72a906752be73af572af02a9"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 13:53:46 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 13:53:46 2025 -0700"
      },
      "message": "dockerimg: Add race detector support to sketch binary build\n\nRun this with:\n\n\tgo run -race ./cmd/sketch -C $(pwd) -verbose -termui\u003dfalse\n\n-race requires CGO which makes cross compilation miserable, so, we punt,\nand we use the container to do it.\n\nThe big TODO is that there\u0027s no go caching, so it\u0027s kinda slower than it\nneeds to be. This is probably fixable with a docker volume.\n\nWhen the host binary is built with the race detector enabled (-race flag),\nthe inner sketch binary that runs in Docker will also be built with the race\ndetector. This helps with debugging race conditions in the inner binary.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s822ae1a915dcc857k\n"
    },
    {
      "commit": "9bca61ef623ea8cd72a906752be73af572af02a9",
      "tree": "4d6488b6e6e8543c3f0b5e1682d11e0927c27d1b",
      "parents": [
        "75bd37d2a3067b6f431d56e891064b73dc2def2c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 12:40:06 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 12:44:59 2025 -0700"
      },
      "message": "feat: enhance UI with commit pulsing animation and improved copy icon\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s80fdaac660ea645ek\n"
    },
    {
      "commit": "75bd37d2a3067b6f431d56e891064b73dc2def2c",
      "tree": "69580944c24bd99c5286ae0611cf2998a3b85035",
      "parents": [
        "8c3b53a97ae2a204842c0c86ca859947ce20b1dd"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 18:49:14 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 12:40:44 2025 -0700"
      },
      "message": "loop: auto-commit changes when saving in diff view\n\nWhat I\u0027ve done is create a git commit whenever the user edits things,\nand amend if possible. The existing detection logic pushes the commits\nto the host, BUT, I had to do some plumbing to make that happen. The\nagent state machine would be out of sorts if I did this (since we\u0027re\ndoing things outside of the loop), but, I didn\u0027t tell it, so... it\u0027s ok!\n\nIf the user has the agent running when editing, everyone can get\nconfused. There\u0027s no atomicity for the git operations, etc.\nI suspect in practice this will all be as fine as everything else is.\n\nI\u0027m not running the autoformatters. That\u0027s a weird editing experience.\n\nThe alternative was to do what the diff comments does, and let the agent\ndeal with the changes by sending it a message. I chose not to do that:\nfirst of all, I want the push to happen fast, since I don\u0027t like losing\nuser data. Second, the latency on an operation is distracting sometimes,\nand sometimes what I do next is just cherrypick my changes over, and I\u0027m\nnot interested in the pedantry of the agent and the code formatters and\nso forth. If they were faster, maybe.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sec50af415124810bk\n"
    },
    {
      "commit": "8c3b53a97ae2a204842c0c86ca859947ce20b1dd",
      "tree": "6532221877cdcb1bd572144fcc5926cfd4231ecb",
      "parents": [
        "456d5f9d4213deab28a1f528cb8edc3a1f8d5262"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 22 18:30:58 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu May 22 18:30:58 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "456d5f9d4213deab28a1f528cb8edc3a1f8d5262",
      "tree": "5529284acc56079240e1f2780c210f4431d9ea32",
      "parents": [
        "14fe75d6ece5116b3887b6fc027e564c4de518e6"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 11:29:50 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 11:29:50 2025 -0700"
      },
      "message": "Remove \"restart conversation\" backend functionality\n"
    },
    {
      "commit": "14fe75d6ece5116b3887b6fc027e564c4de518e6",
      "tree": "5a3e72a02da8d06818fcd3531147087f8741f81b",
      "parents": [
        "f28729932fdf9ecc67d3fabbfca297178a323a14"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 17:39:38 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 11:28:39 2025 -0700"
      },
      "message": "webui: Remove restart conversation button and modal component\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s0da284ec42d4da59k\n"
    },
    {
      "commit": "f28729932fdf9ecc67d3fabbfca297178a323a14",
      "tree": "5ae2eca28c1c139a95dde0648a17eeaba3e60bce",
      "parents": [
        "716bfee93847e19465723af2d7c553d23c9984df"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 10:35:28 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu May 22 11:28:35 2025 -0700"
      },
      "message": "Refactor agent git state into its own struct to tease apart its locking a bit.\n\nI want to invoke calling the git state when editing files, and that\nrequires separating it somewhat from the agent\u0027s messy and coarse\nlocking.\n"
    },
    {
      "commit": "716bfee93847e19465723af2d7c553d23c9984df",
      "tree": "6a14fd9aa287ec8fe7a1b50655a3a864151da43d",
      "parents": [
        "bc8c8dc5bc7abca6fa523c5ca45c9fd2c09384c2"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 18:32:31 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 18:32:31 2025 -0700"
      },
      "message": "Fix agent init of git repo from recent change.\n"
    },
    {
      "commit": "bc8c8dc5bc7abca6fa523c5ca45c9fd2c09384c2",
      "tree": "d59b7b3ef6965949376481cfa6108fee7312f6fd",
      "parents": [
        "1a648f34a53216a9ed88792d583fad50246f3d4b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 13:19:13 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 13:40:03 2025 -0700"
      },
      "message": "sketch main: migrating things from /init into cmdline flags\n\nAs much as possible, I want NewAgent() to take as many arguments as it\ncan, and try to avoid doing different things with Init().\n\nYou can\u0027t quite do everything because the port that Docker has\nopen for forwarding starts as \"0\" and we call \"docker port\" to find it,\nbut besides that, almost everything is knowable up front.\n"
    },
    {
      "commit": "1a648f34a53216a9ed88792d583fad50246f3d4b",
      "tree": "43c0eb12a4b13b4d9351666e44024c43dbb71d63",
      "parents": [
        "38411997b3ce4a6721f2942ebf0fc67131d94b6e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 17:15:04 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 12:56:49 2025 -0700"
      },
      "message": "llm/oai: add entry for Mistral Devstral model\n\nAdd the Mistral Devstral coding model (devstral-small-2505) to the llm/oai package.\nThis model is designed specifically for software engineering tasks and is available\nthrough the Mistral API at the same cost as Mistral Small 3.1.\n\nSee: https://mistral.ai/news/devstral\n\nHowever, we can\u0027t actually use it, because the Mistral API\ndoesn\u0027t parse out tool calls, and the model generates at least\nthree different tool calls formats. None of which contains a tool_call_id,\nwhich somehow the Mistral API requires on the way back in.\nI don\u0027t understand how this is supposed to work.\nBut fighting it now is an utter waste of time.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf3b4fcfc4b26e3b4k\n"
    },
    {
      "commit": "38411997b3ce4a6721f2942ebf0fc67131d94b6e",
      "tree": "e6445a72773f2c6d7731f02ec62051502642d9fc",
      "parents": [
        "0f1a3f86041fd04c33a9c9e4774f9abdf1c01c5f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 16 17:51:03 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 11:37:49 2025 -0700"
      },
      "message": "llm/oai: retry more on failure\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6b8e59e9e006f5bak\n"
    },
    {
      "commit": "0f1a3f86041fd04c33a9c9e4774f9abdf1c01c5f",
      "tree": "24fc7243f28c7fbabd43dd05b3c6d44e52f92cfc",
      "parents": [
        "ac761c9dd5ad664b09d8588261a09d4aecdace5d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 16 09:05:55 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 11:37:49 2025 -0700"
      },
      "message": "loop: strengthen guidance file wording a bit\n"
    },
    {
      "commit": "ac761c9dd5ad664b09d8588261a09d4aecdace5d",
      "tree": "343cae654689288c8ff6807b036150f7e22a08ae",
      "parents": [
        "e10f0e6c540ac0f6c038a4a6b729e9401dd39e52"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 16 18:58:45 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 11:37:49 2025 -0700"
      },
      "message": "cmd/sketch: add mount flag for container volumes\n\nAdd a mount flag that simplifies mounting host directories into the container.\nWhen specified with format /path/on/host:/path/in/container it\u0027s automatically\nconverted to a docker volume mount argument (-v) in the docker invocation.\nThis simplifies volume mounting compared to the more generic docker-args flag.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s67251d45fd28831ek\n"
    },
    {
      "commit": "e10f0e6c540ac0f6c038a4a6b729e9401dd39e52",
      "tree": "c3704ca3c01f833195fee4f16f5764b80e268544",
      "parents": [
        "564043144868f401515c8ed250d989f60ea2e1de"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 10:57:09 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 11:37:49 2025 -0700"
      },
      "message": "claudetool: ignore trailers in git commit style analysis\n\n"
    },
    {
      "commit": "564043144868f401515c8ed250d989f60ea2e1de",
      "tree": "960ddee651a508164343db8fc23d00c293d2326e",
      "parents": [
        "6f041f5ac59a17987efdfe63d1d05e487e23a89e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 16 08:48:10 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 11:36:32 2025 -0700"
      },
      "message": "loop: attempt some sycophancy reduction"
    },
    {
      "commit": "6f041f5ac59a17987efdfe63d1d05e487e23a89e",
      "tree": "fe277e0b16bff201ef26fb586b85eb639859a223",
      "parents": [
        "6e35332ceac45166d6dd549d1e3d94937f683320"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 17:31:08 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 11:36:32 2025 -0700"
      },
      "message": "claudetool/onstart: support .github/copilot-instructions.md as inject file\n\nUpdate categorizeFile function to recognize .github/copilot-instructions.md\nas an injectable file for the agent prompt, allowing GitHub Copilot\nguidance to be included in the system prompt.\n\nFixes #105\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s211c42575972fdbek\n"
    },
    {
      "commit": "6e35332ceac45166d6dd549d1e3d94937f683320",
      "tree": "87b4eeea74b9f6d9786d99983a976c1cf0f7ff05",
      "parents": [
        "8d8b7ac6b00b1d0b3a2c6d3a4079e2c2fb76cc8a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 18:21:24 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 21 11:36:32 2025 -0700"
      },
      "message": "all: remove testify\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s51244611964f2413k"
    },
    {
      "commit": "8d8b7ac6b00b1d0b3a2c6d3a4079e2c2fb76cc8a",
      "tree": "eb46d3770aa48f0a809594eef93e0a053075b0ee",
      "parents": [
        "35c72bcbf69cce28395bc34236df8ef9d615c0da"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 09:57:23 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 21 11:07:52 2025 -0700"
      },
      "message": "Add buildinfo to /debug on Sketch http\n"
    },
    {
      "commit": "35c72bcbf69cce28395bc34236df8ef9d615c0da",
      "tree": "c56e26f5ce42cacf9630f3187a98fd356a469a7b",
      "parents": [
        "7ce7b0294ba1efe6c7b3d462e905c1b2a7057a37"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Tue May 20 11:17:10 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 20 20:58:51 2025 -0700"
      },
      "message": "loop: send modified over-budget message\n"
    },
    {
      "commit": "7ce7b0294ba1efe6c7b3d462e905c1b2a7057a37",
      "tree": "9b0b92fbcf2b27a2b971481716e4d1dc99d3ec6f",
      "parents": [
        "9daa5183df5270beaf5611c20e4d77cd7cfe21f7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 16 11:35:51 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 20 20:49:05 2025 -0700"
      },
      "message": "claudetool: draw attention to commit message capitalization and punctuation"
    },
    {
      "commit": "9daa5183df5270beaf5611c20e4d77cd7cfe21f7",
      "tree": "84bd4bf7d7bfbc723925bfae2af828cd9e7ccd0b",
      "parents": [
        "55c87e3ababb0800b5710cbb11bec4dea8c13515"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 16 18:34:00 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 20 14:27:29 2025 -0700"
      },
      "message": "experiment: remove llm_review experiment and associated code\n\nIt creates confusion for the agent and doesn\u0027t provide much value.\nPerhaps with better prompt engineering, but I can\u0027t invest\nin that much right now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9f2a8c418876c498k"
    },
    {
      "commit": "55c87e3ababb0800b5710cbb11bec4dea8c13515",
      "tree": "13517efe8467be99714a65a24963873cbe18e137",
      "parents": [
        "9d7f0ccec1317b68c754b6b154f7c362395028c2"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Tue May 20 14:08:18 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Tue May 20 13:11:23 2025 +0000"
      },
      "message": "webui: Fix cursor jumping during image uploads\n\nWhen pasting an image and continuing to type while it\u0027s uploading,\nthe cursor position would jump when upload completed, disrupting typing.\n\nThis fix simply removes the explicit cursor positioning code after\nimage upload, allowing the browser to maintain the user\u0027s current cursor\nposition naturally. This provides a more intuitive experience, especially\nwhen typing while an image is uploading.\n\nThe approach is simpler and more robust than trying to track cursor\nposition changes and calculate offsets manually.\n"
    },
    {
      "commit": "9d7f0ccec1317b68c754b6b154f7c362395028c2",
      "tree": "baa47109cc854d5abc4326669e05e9ceb49a016c",
      "parents": [
        "da514fccdf1135cfa52a869b892855aac117ee05"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Tue May 20 11:43:26 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Tue May 20 10:51:10 2025 +0000"
      },
      "message": "loop/server: fix race condition in SSE stream iterators\n\nFix panic \u0027send on closed channel\u0027 when a client disconnects from SSE stream.\nThe issue occurred because iterators were created at the beginning of\nhandleSSEStream with defer iterator.Close(), but used in separate goroutines.\nWhen the client disconnected, the iterators were closed while goroutines\nwere still using them.\n\nMove iterator creation into the goroutines that use them to ensure their\nlifecycle matches the goroutines\u0027 lifecycle, preventing the race condition.\n\nFixes #108\n"
    },
    {
      "commit": "da514fccdf1135cfa52a869b892855aac117ee05",
      "tree": "7846b18cc33a04bc5c94098a6a135a513b18d2c7",
      "parents": [
        "9df94b5cf626971b7a84cd1b743ee49f5ae8e009"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon May 19 19:21:07 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon May 19 19:25:20 2025 -0700"
      },
      "message": "Update dockerfile tests.\n"
    },
    {
      "commit": "9df94b5cf626971b7a84cd1b743ee49f5ae8e009",
      "tree": "49a54416207ef2418b9684fb6289e54a35badfc0",
      "parents": [
        "fbe6478d2829fcc7e5e7cc0c1b87721927b18d57"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Sun May 18 03:43:14 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon May 19 19:25:20 2025 -0700"
      },
      "message": "dockerimg: Extract base Dockerfile to separate file\n\nExtract the dockerfileBase constant into a Dockerfile.base file and use Go embed\ndirectives to include it in the code. This improves maintainability by separating\nthe Docker configuration from the Go code while preserving the same functionality.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se66b902985dca8a1k\n"
    },
    {
      "commit": "fbe6478d2829fcc7e5e7cc0c1b87721927b18d57",
      "tree": "7b8090ef32ba34fa29d0f3a4ebc4582f739a7270",
      "parents": [
        "d6d12d188814c114ed4b2acb1df2d201c1cf96b5"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 13 18:24:31 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon May 19 19:25:20 2025 -0700"
      },
      "message": "docker: Add lsof and ss to base docker image\n\nThese are tools that the agent seems to want. It doesn\u0027t\ndo a great job of installing them, but they\u0027re pretty useful.\n"
    },
    {
      "commit": "d6d12d188814c114ed4b2acb1df2d201c1cf96b5",
      "tree": "2e2bc28d9882efe47d95c992f66b1c8f0d705540",
      "parents": [
        "e9eaf6c556fe058ccc6f9aa60b7db0f4a3ec77d3"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 19:19:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 19:19:21 2025 -0700"
      },
      "message": "Fail clearly when repo has no commits. (#109, #84)\n"
    },
    {
      "commit": "e9eaf6c556fe058ccc6f9aa60b7db0f4a3ec77d3",
      "tree": "22527d450d724872458b9258b9ec92d323ba3ed4",
      "parents": [
        "cabfa5520708460e4537216df26be15262c855e6"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 16:14:39 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 16:14:39 2025 -0700"
      },
      "message": "Add skaband heartbeat support.\n\nWe want Sketch to re-connect if its connection to skaband is busted. To\ndo so, we expect a heartbeat from skaband, and, if we\u0027ve missed it, we\nshut down the connection and re-connect.\n"
    },
    {
      "commit": "cabfa5520708460e4537216df26be15262c855e6",
      "tree": "27785b2f11ce1b0c360a781c4a1b2a8e2c513049",
      "parents": [
        "397871d299216f63dc38a9cc6f2ca386d0f4bd75"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 16:14:28 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 19 16:14:28 2025 -0700"
      },
      "message": "Pass -verbose flag to innie to see logs.\n"
    },
    {
      "commit": "397871d299216f63dc38a9cc6f2ca386d0f4bd75",
      "tree": "ea1cec9278f37739f972a390b0ec564a1fe9219f",
      "parents": [
        "a8322202f36c35f677b8834cdce8f21ab3d8c6dc"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon May 19 15:02:45 2025 +0100"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon May 19 14:03:43 2025 +0000"
      },
      "message": "webui: Add End button to shutdown container\n\nThis change adds a new button to the sketch-app-shell UI alongside the\nexisting Restart and Stop buttons. When clicked, the End button shows a\nconfirmation dialog and then sends a request to a new /end endpoint.\n\nThe /end endpoint gracefully shuts down the inner sketch container.\n\nFixes #88\n"
    },
    {
      "commit": "a8322202f36c35f677b8834cdce8f21ab3d8c6dc",
      "tree": "449d31ca4023b97fa87b5831c5a071864406e516",
      "parents": [
        "87d29ef5b027120ea0857a9aa5661a3fab7b25b9"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 17 06:54:34 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 17 06:54:37 2025 -0700"
      },
      "message": "loop: only do in-docker git init if connected to host git\n"
    },
    {
      "commit": "87d29ef5b027120ea0857a9aa5661a3fab7b25b9",
      "tree": "1e7a7555b3c2cf9e764c9a62fe02e31b6667f27e",
      "parents": [
        "8c4636270be67625cc27ce356f6da1a11e245069"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 20:25:28 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 20:26:06 2025 -0700"
      },
      "message": "docker: use consistent ephemeral port for SSH\n\nI sense that some versions of docker interpret -p 22 as 22:22\nand some as 0:22. We already use 0:80 for HTTP, so let\u0027s do the same\nfor SSH.\n\nThis is an optimistic fix for a user issue.\n"
    },
    {
      "commit": "8c4636270be67625cc27ce356f6da1a11e245069",
      "tree": "f6a4db58f1eb71033410150daa7290d4e41aca0a",
      "parents": [
        "5e3570280bf3bb0f84482ff9556739d34eb08093"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 16 21:54:17 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 16 21:54:17 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "5e3570280bf3bb0f84482ff9556739d34eb08093",
      "tree": "0721d16a93a8744466fb5206114d1f25b5b8cadb",
      "parents": [
        "272a90ee1a74bda5618d4866e03f4b7067947784"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 04:50:34 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:53:24 2025 -0700"
      },
      "message": "webui: Update status indicators\n\n- Remove green dot connection indicator\n- Add DISCONNECTED state with red styling when connection is lost\n- Update the status bar to show DISCONNECTED instead of IDLE/WORKING when disconnected\n- Create demo page to preview all three status states\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: skR3m0v3Gr3nD0tD1sc0nn3ct3dR3d\n\nChange-ID: sa2b3679b9cdcaf80k\n"
    },
    {
      "commit": "272a90ee1a74bda5618d4866e03f4b7067947784",
      "tree": "9baf4f84ce80b1c7073a95b6959f6dd11ab3b48b",
      "parents": [
        "d3ac112a45111abf0e57c327d55e2cc66a136abb"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:49:51 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:51:40 2025 -0700"
      },
      "message": "Add Monaco diff-view, the saga ...\n\nI set out to use Monaco to support the diff view. diff2html is lovely,\nbut there were a ton of usability improvements I wanted to make (line\nnumbers not making things double spaced, choosing which diff, editing\nthe right-hand side), and it seemed a dead end. Furthermore, Phabricator\nand Gerrit\u0027s experience is that diffs should be shown file by file,\nbecause you\u0027ll inevitably see a diff with a file that\u0027s too large, and\nthe GitHub PR view often breaks on big changes... so I wanted to show\nfiles diff-by-diff, with \"infinite\" context when unchanged sections are\nexpanded. So...\n\nUltimately, all of this was sketch-coded over maybe 30 Sketch sessions.\nI threw away a lot of branches. My git reflog is a superfund site.\n\nPrompting whole-hog didn\u0027t work. Or, rather, it made significant\nprogress, but something very serious wouldn\u0027t work, and I couldn\u0027t\nfigure out what, and nor could Sketch.\n\nInstead, I started by adding a new webcomponent that was just a\nplaceholder. Then, using https://rodydavis.com/posts/lit-monaco-editor,\nI nudged Sketch into adding Monaco to it. Sketch pulled out:\n\n   You\u0027re right, I should properly read the blog post before implementing the\n   solution. Let me check the referenced blog post.\n\nI worked heavily in the demo environment at first, but here I ran into\nthe issue that we have two different esbuild systems: one is vite and\none is esbuild.go, and they\u0027re configured differently enough.\n\nMonaco is unusable and confusingly so when its CSS isn\u0027t loaded. The right\nway to load it, I\u0027ve found, is via\n\n  @import url(\u0027./static/monaco/min/vs/editor/editor.main.css\u0027);\n\nI spent more time than I care to admit noticing that originally\nthis wasn\u0027t relative, and when we use a skaband setting, the\npaths need to be relative-aware.\n\nThe paths to the various workers need to be similarly correctly placed.\n\nGetting Sketch to build demo data but not put testing code into production\ncode was tricky. (I threw away a lot of efforts and factories and singletons...)\n\nWhen I set out to do the git commit selection, I wanted to do a bunch of\nbackend /git/* handlers. These were easy enough to code in sketch. I had\nto convince Sketch to put them in git_tools.go and not in the agent.\nIt doesn\u0027t really matter: these functions to parse git are pretty stateless,\nbut it\u0027s less work to have them separate. Sketch was mediocre at writing\ntests for them. Did you know that our container has an older version\nof git that doesn\u0027t have the same options to decorate ref names? Yeah, nor did\nI.\n\nHandling unstaged changes was fun. git diff --raw shows unstaged files\nas having identity 0000. Ideally we\u0027d be using jj and there\u0027d be\na synthetic commit, but instead uncommitted-possible files are read\nby content.\n\nA real big challenge was getting the Monaco view to use the right vertical and\nhorizontal space. I did this many, many times. I don\u0027t claim to understand flex\nand the virtual dom, and :host, and all the interactions. It would fix one\nthing and break another. The chat window would shrink. The terminal would\nshrink.\n\nScreenshot support was excellent. I eventually added paste support just so\nthat I could expedite my workflow, and Sketch coded that easily on the first\npass with minor feedback.\n\nI learned the hard way that Safari\u0027s support for WebComponents/shadow\ndom in its web inspector is rough. See https://fediverse.zachleat.com/@zachleat/114518629612122858\n\nI also learned the hard way that Chrome doesn\u0027t use fonts loaded in CSS\nin a shadow dom. That\u0027s why the codicon font had to be in the global\nstyle sheet.\n\nKudos to John Reese who kindly allowed me, a long time ago, to adapt a\nshell script he had at work to look over diffs into https://github.com/philz/git-vimdiff.\nThat\u0027s the inspiration for having the \"new code\" be editable when you\u0027re\nreviewing it; why shouldn\u0027t it be!?!\n\nThere are a handful of follow up tasks:\n\n* We lose state when we switch to the Chat view and back.\n* Need URL-based support for where we are.\n* Maybe need shortcut keys to move between diffs and changes.\n* Maybe need caching or look-ahead for downloading the next or previous\n  file.\n* We spend too much vertical real estate on all the diff selections;\n  could we scroll it out of the way, collapse it, tighten it, etc.\n* The workers sometimes throw errors into the console. I think they\u0027re\n  harmless and merely need to be caught and suppressed.\n* Needing to commit changes when things are saved is weird. Should we\n  commit automatically? Amend the previous commit? Have a button for\n  that? Show the git dirty state?\n* Our JS bundle is big. We could maybe delay loading the monaco bundle\n  to help.\n\nThanks for coming to my TED talk.\n"
    },
    {
      "commit": "d3ac112a45111abf0e57c327d55e2cc66a136abb",
      "tree": "7d2cab01515d7c482be1a39cc0492e9d9ac657e7",
      "parents": [
        "8bdf627180b64b0dc09018bf512f6ebf192ab674"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed May 14 02:54:18 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:51:40 2025 -0700"
      },
      "message": "git_tools: Implement git diff and show API\n\nAdded git_tools package providing structured access to git diff and show commands. Exposed these methods via HTTP endpoints in loophttp.\n\nThis is a stepping stone to a better diff view.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se75f0a1b2c3d4e5k\n"
    },
    {
      "commit": "8bdf627180b64b0dc09018bf512f6ebf192ab674",
      "tree": "47d9b1e5348a33846fc11704f99c3cf7151ec3f1",
      "parents": [
        "0ead54d4591b9de1dedb897302f3ffaf36454c8e"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 13:36:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 16 14:51:40 2025 -0700"
      },
      "message": "Playwright: don\u0027t use junit inside Sketch.\n\nI\u0027ve found Sketch doesn\u0027t understand the JUnit failure nearly\nas well as the usual way.\n"
    },
    {
      "commit": "0ead54d4591b9de1dedb897302f3ffaf36454c8e",
      "tree": "aebc7418f3d60df3fcdafab155412f123454bb26",
      "parents": [
        "5eccd68ca894e5591bd6cc689bbb12b97a869464"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 16 13:58:36 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 16 13:58:36 2025 -0700"
      },
      "message": "cmd/sketch: move NewSessionID function\n"
    },
    {
      "commit": "5eccd68ca894e5591bd6cc689bbb12b97a869464",
      "tree": "dde938683a329c38ecf657e585169b75479c8629",
      "parents": [
        "044a62e8e3d28a573c624d722f0fde38c30a19e2"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 16 07:09:30 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 16 07:09:36 2025 -0700"
      },
      "message": "cmd/sketch: invert bool to fix open flag default behavior\n"
    },
    {
      "commit": "044a62e8e3d28a573c624d722f0fde38c30a19e2",
      "tree": "cfed4a459489b6f8c08c7aa98aa6ea416dc0f427",
      "parents": [
        "276f460cc7136e50a07cf544ee5ef6bf2a1c2630"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Fri May 16 10:40:59 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri May 16 10:47:11 2025 +0000"
      },
      "message": "webui: Prevent sending messages while uploads are in progress\n\nThis fixes an issue where users could press Enter immediately after pasting an image,\nwhich would submit the message with just the \u0027[Uploading image.png...]\u0027 placeholder text.\n\nNow the system:\n1. Tracks uploads in progress\n2. Prevents message submission while uploads are active\n3. Shows visual feedback to the user\n4. Disables the send button during uploads\n"
    },
    {
      "commit": "276f460cc7136e50a07cf544ee5ef6bf2a1c2630",
      "tree": "0e00d887c0bac515e49775041be83eadbc174074",
      "parents": [
        "a4500c98a8f7c2e5500d330d7f4e82037fb38239"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 17:57:51 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 22:00:19 2025 -0700"
      },
      "message": "all: read agent.md files too\n\ntoo many agent rules files!\n"
    },
    {
      "commit": "a4500c98a8f7c2e5500d330d7f4e82037fb38239",
      "tree": "32f069d493f4e76ef425acfc8a87800f06d01091",
      "parents": [
        "613c0f5288dd0e18dc9fee09254161d78fc7acb7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 15:38:32 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 15 22:00:19 2025 -0700"
      },
      "message": "llm/ant: retry more on failure"
    },
    {
      "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"
    }
  ],
  "next": "5c7f95714f34ea327b8f300238da6491dedd6adb"
}
