)]}'
{
  "log": [
    {
      "commit": "beaa86a1fa821ce5874f3a2dd6a1609f7bd79698",
      "tree": "acab6693c4e740b8908ad16327418a3578eaee06",
      "parents": [
        "141547d1d7169bf1c9a9d156eb6b585f1d9d398c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 03:37:21 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 24 11:30:35 2025 -0700"
      },
      "message": "all: delete commit-message-style tool\n\nIt added significant latency.\nAll the caching options were unappealing.\n\nInstead, let users specify in dear_llm.md if they care,\nand default to simple, concise messages.\n\nAt some point (soon?), we will likely\nmake it easier in the UI to edit commit messages.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sbcd1f38735d091aek\n"
    },
    {
      "commit": "9dc2f62c6d44f53e057bd7319ffbcbc00ef5f2a0",
      "tree": "753ea15307dd1ee834ae6973f1a363858e09f4b5",
      "parents": [
        "ddd22da04ed405520012089ffb2bc244b82e41e7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 01:04:00 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 23 12:58:52 2025 -0700"
      },
      "message": "all: remove multiplechoice tool\n\nIt\u0027s rarely used; doesn\u0027t pull its weight.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s11d827ec20c6ddb8k\n"
    },
    {
      "commit": "3b44cc3120b595e82dcc2a6081b8a07fc24c739e",
      "tree": "3d4f3c2911390428c0c89aa8dcd13dbfb035ce31",
      "parents": [
        "f18aafd177a90b928b1c1babbe5e763f85eab56d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 02:28:14 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 22 20:10:27 2025 -0700"
      },
      "message": "loop: do slug generation outside the agent loop\n\n[This commit message written entirely by a human; it is all useful.]\n\nWe can make a slug based on the first message.\nIt\u0027s good enough.\nThat keeps it--and the slug tool--out of the agent\u0027s context.\nIt\u0027s also one fewer step for extremely short Sketch runs,\nwhich is the straw that broke this particular camel\u0027s back.\n\nThis is a mild UI regression, in that there\u0027s a slight stall\nafter the user types their first message, during which\nthe slug is being generated. See (2) below.\n\nWhile we\u0027re here, add handling of compaction agent messages.\n\nThis leaves two big TODOs outstanding:\n\n1.\n\nUntangle the awful rats nest that is slug and branch management;\nwe have callbacks back and forth and layers and locking and it\u0027s all confusing.\nOne visible for that this ugliness takes is that every time the agent tries out a slug,\nthe top bar in the webui updates, even if we then reject that slug as a duplicate.\nthere are other forms of ugliness, just less visible.\n\n2.\n\nMake slug generation concurrent with the rest of the agent,\nto avoid a short stall right after the user\u0027s first request (ick).\n\nWhen we make slug setting concurrent, we\u0027ll likely need to resuscitate\nthe bashPermissionCheck, except it\u0027ll be \"silently block and wait for\nbackground slug generation to complete\", rather than \"reject the tool call\".\nDitto for about_sketch, and any other tool call that expects\nthe slug or branch name to be set.\n\nGenerally, before undertaking this effort, we should fix (1) above,\nmake convos generally concurrency safe (maybe COW?), and\nfigure out to get race-enabled innie builds.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8ac5f6a9faa611ebk\n"
    },
    {
      "commit": "2e3337d7127d24e2d22fde945de32c9a35fbb3f0",
      "tree": "03feb48b8ee8d00d259420db70745ce9108f923e",
      "parents": [
        "0258add1c3e5858635a4286f3e308e32132f828a"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Jun 18 10:33:41 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Jun 18 10:38:16 2025 -0700"
      },
      "message": "loop: add docker to the system prompt\n"
    },
    {
      "commit": "c886ac5478194e95f93b166572a7a081eb6cadb8",
      "tree": "fd4be26cd6cf20162ff22ef21a8c1dc6e51e59d5",
      "parents": [
        "1bd636c83311a9195fca38515ee254bf07ae0d12"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Jun 13 23:40:03 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jun 14 01:03:45 2025 +0000"
      },
      "message": "loop: add special instruction field\n\nIncludes a demo.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc7078aeb8c59e49ak\n"
    },
    {
      "commit": "4c1cea85b222a1ec94890be8960c69f549870454",
      "tree": "fd605725458f4a3b010292b927368963aeb3fcdd",
      "parents": [
        "0113be559976cfb1ce0e78a9a69c19a6394b2c3d"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jun 09 14:16:52 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jun 09 14:16:52 2025 -0700"
      },
      "message": "Fix up sketch-wip handling when --commit is not specified.\n\nIf -git-remote-url and -commit are both specified, we check out\nsketch-wip. We should do so always when we\u0027re in a container, so\ndoing that now.\n\nThe new sketch-wip stuff is weird if we\u0027re not in a container (the\n\"unsafe\" mode without -outside-hostname). I\u0027ve changed the system\nprompt slightly to try to figure that out.\n"
    },
    {
      "commit": "715b8d9e46757b1254624e8b1329a9581baa10d3",
      "tree": "2e7d423e145ccd8746b1bf1e0c441224530e691a",
      "parents": [
        "cecba06431da9aa134898d23a353e1897f3e3625"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jun 06 12:36:38 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jun 06 12:36:38 2025 -0700"
      },
      "message": "loop: always use branch sketch-wip in innie\n\nModify innie sketch to always create and work on a dedicated \u0027sketch-wip\u0027\nbranch for all git operations, pushing this branch to outie instead of\npushing HEAD directly.\n\nHaving a dedicated branch name makes it clearer how to operate\ninside the container, for both humans and sketch.\nIt also prevents the container from pushing whatever transient\ncommits occur while sketch does (say) a bisection or other git work.\nIt should also prevent sketch from constantly spinning up new\nbranches as it starts new tasks in a long conversation.\n\nI\u0027d rather have called the branch \u0027sketch\u0027 instead of \u0027sketch-wip\u0027,\nbut that conflicts with all the branches called \u0027sketch/foo\u0027. Alas.\n\nThis was mostly written by Josh, but I made it work whether or not\nsketch-wip already exists as a branch.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s4ea6db2873a60129k\n"
    },
    {
      "commit": "19969a9af6da4b5b5e25d02aa635dabad196e464",
      "tree": "d4701576dce7bdffd962b1d11cd3e6b37d4be443",
      "parents": [
        "44f847a93e7e0953abd42880f5e87c8b3e213134"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jun 05 14:34:02 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jun 05 19:30:39 2025 -0700"
      },
      "message": "all: s/title/slug/, adjust branch handling\n\nThere are two intertwined changes here.\n\nFirst, replace title with slug, and precommit with commit-message-style.\n\nThe slug makes enough of a title, and it provides a single human-readable\nidentifier we can use everywhere.\n\nSecond, construct the branch name on the fly instead of storing it,\nout of slug, branch prefix, and retryNumber.\nThis removes some duplicated data, and makes the retry loop\neasier to follow and reason about."
    },
    {
      "commit": "43448c674f4cf1f6de7950f6ec9e2d197d7f700a",
      "tree": "65369f28dd9e2acd13a6506923ccc165d2240f3a",
      "parents": [
        "53ab24547cd684fc38254a6bd63759d7121ca7d6"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jun 04 11:51:04 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jun 04 14:00:10 2025 -0700"
      },
      "message": "loop: nudge agent towards less bouncy emoji babble"
    },
    {
      "commit": "5fe419fd73972bdecf86b4d537d0b284ebee75e3",
      "tree": "6fb22f893f5a65953c6201cdce72b2f5550206cd",
      "parents": [
        "f75ba2cf69069b8bc6be98fc7a837b3efe6837d6"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 30 11:49:02 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jun 02 17:12:12 2025 -0700"
      },
      "message": "loop: enable parallel tool calling"
    },
    {
      "commit": "b421a24f862d91101b9e5b4738f93693e18672eb",
      "tree": "2ccccb673504f5d5d3ca689816e95c92fd3c3041",
      "parents": [
        "00bcaef0355aaff1daea17ac0631fd17cabb0235"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 23:22:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 30 08:58:07 2025 -0700"
      },
      "message": "all: remove anthropic edit tool support\n\nThe Anthropic str_replace_editor tool implementation has rotted;\nit would require a bit of work to upgrade it for Claude 4.\n\nRemove it for now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6129e8703301600dk"
    },
    {
      "commit": "112b92376c97b8da64cc1c954896957cfc479f3d",
      "tree": "1497eb8b2927f1334d712aabb19625db11a148bf",
      "parents": [
        "d203b7de7d49cc5da03440d5a00b2efd0f8bb2c8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 11:26:33 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 12:50:41 2025 -0700"
      },
      "message": "loop: add todo checklist\n\nThis should improve Sketch\u0027s executive function and user communication."
    },
    {
      "commit": "d203b7de7d49cc5da03440d5a00b2efd0f8bb2c8",
      "tree": "4c24f0d862338bd9814da00f73d08480b8d02bcb",
      "parents": [
        "b509a5ddb86a4881eb19030f321857b305901022"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Sat May 24 12:35:30 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 29 12:50:41 2025 -0700"
      },
      "message": "loop: encourage e2e testing"
    },
    {
      "commit": "3b733a5e21229c1ff29389895bb587c0243d6ba7",
      "tree": "b7b600054987919fe0194a5f8d09f47d65e617d1",
      "parents": [
        "586ecb184b4466435507d9935e4240630e80f482"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 23 12:32:38 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Sat May 24 12:07:43 2025 -0700"
      },
      "message": "loop: add some coding guidelines\n\nThis should help tamp down wild comments.\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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "5cca56ff3aec7785494c6a9fcd4e846900968ed1",
      "tree": "25b99a05ae7450fc210110414252210d189ca993",
      "parents": [
        "4fcde4a88794aec937fd116d6059871297d974e7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 06 01:10:16 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 18:32:34 2025 -0700"
      },
      "message": "loop: migrate system prompt to Go templates\n\nIt was bound to happen eventually.\nBite the bullet now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "dbe02304e804066bb32fcf6f41690336a98e6531",
      "tree": "d27ed5e5b94b004167e202254b97f7d1806733bd",
      "parents": [
        "2b2090e7fa8fd53eda5dca132980c3e2fa4cb3b8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 16:44:23 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 16:44:23 2025 -0700"
      },
      "message": "loop: extract system prompt into a separate file\n\nThis will make swapping it out easier, if/when desired.\n"
    }
  ]
}
