)]}'
{
  "log": [
    {
      "commit": "596aa33bf96e9003ad645403fb1f7dd6fafa2b0f",
      "tree": "a4ef8a3fc77ca20e5ef0d304143f9f35d0ae8d39",
      "parents": [
        "7de3bdd597e962ab2533f67018545c6fd2a33d16"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 19:00:39 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 19:13:58 2025 -0700"
      },
      "message": "webui: silence build noise\n\n**again**\n\nlast one was f8954383da9fbe04125c35548afbc6bf9d5272eb,\nwhich was earlier today.\n\ndear sketch: successful builds are SILENT. kthxbye.\n"
    },
    {
      "commit": "7de3bdd597e962ab2533f67018545c6fd2a33d16",
      "tree": "5c3116b9e2fc88f47f820014a1ce071d104b1773",
      "parents": [
        "ebe74cdcc911d70afd804b6218bab25744513578"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 01:51:53 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 19:13:58 2025 -0700"
      },
      "message": "webui: hide GitHub link in push dialog for non-GitHub remotes\n\nOnly show \"Open on GitHub\" button when pushing to GitHub remotes.\nThe dialog now checks the remote\u0027s is_github property before generating\na branch URL, returning empty string for non-GitHub remotes.\n\nChanges:\n- Modified _computeBranchURL() to check selectedRemote.is_github\n- Added test coverage for GitHub, GitLab, and self-hosted remotes\n- Updated demo mock to include non-GitHub remotes for testing\n\nThis prevents the confusing \"Open on GitHub\" button from appearing\nwhen pushing to GitLab, self-hosted Git servers, or other non-GitHub\nremote repositories.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sb441bfcebf8fea07k\n"
    },
    {
      "commit": "ebe74cdcc911d70afd804b6218bab25744513578",
      "tree": "9f8fa6d00356bfe97283dad9fbc1754c6625196d",
      "parents": [
        "3a41f1501568811b7a6a83e6d674f19188595848"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:57:34 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:57:34 2025 -0700"
      },
      "message": "sketch/dockerimg: reduce error text on some refused pushes\n"
    },
    {
      "commit": "3a41f1501568811b7a6a83e6d674f19188595848",
      "tree": "2545072c225a258ac2b2d0fe35eb862c237ecc76",
      "parents": [
        "75b45f5665fad8d386d36f88bf7dc37808a8dcac"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 01:51:54 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 01:51:54 2025 +0000"
      },
      "message": "webui: update Push button tooltip to indicate it opens a dialog\n\nChange tooltip from \u0027Push current HEAD to remote\u0027 to \u0027Open push dialog\nto push current HEAD to remote\u0027 to better communicate that clicking\nthe button opens a dialog interface rather than immediately pushing.\n\nUser changes from diff view.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa22bbc9efe9d6ad2k\n"
    },
    {
      "commit": "75b45f5665fad8d386d36f88bf7dc37808a8dcac",
      "tree": "484353433b24d7906740ea22108f6873257f3a4b",
      "parents": [
        "c3b65d73caf6ea873ef6981aa926ef8ea9d31e83"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:47:32 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:04:23 2025 -0700"
      },
      "message": "cmd/sketch: keep public keys separate per skaband\n\nChange the layering a bit.\nAlways create a public key, for better telemetry.\nKeep separate things separate.\nThis could use a touch more refactoring,\nbut good enough for today.\n"
    },
    {
      "commit": "c3b65d73caf6ea873ef6981aa926ef8ea9d31e83",
      "tree": "78471ccaceb9941d4e349cab0465986efa9957f1",
      "parents": [
        "7208bb4b7fbdfec4a86843020eb8d384ac9889e7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:35:34 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:04:23 2025 -0700"
      },
      "message": "cmd/sketch: add version check at startup\n"
    },
    {
      "commit": "7208bb4b7fbdfec4a86843020eb8d384ac9889e7",
      "tree": "b5b577fdde5d46c00d624595ddba49209701e7a4",
      "parents": [
        "254c49faa2537d79e1394c4109f48a6e0990967c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 18 00:44:11 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 18:04:13 2025 -0700"
      },
      "message": "webui: add tooltips for upper-right corner buttons\n\nFixes https://github.com/boldsoftware/sketch/issues/160\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7884db8812a87864k\n"
    },
    {
      "commit": "254c49faa2537d79e1394c4109f48a6e0990967c",
      "tree": "3b13d86f48e45846dc225ccd24253f5b0dca0398",
      "parents": [
        "55b4ab50d0ee61e15825cb4254cfc63b8f5489bd"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 17 17:26:24 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 18 00:40:30 2025 +0000"
      },
      "message": "sketch: \"git push\" button\n\nUltimately, we want to allow users to push their changes to github, and\nthereby do a good chunk of work without resorting to the terminal (and\nfiguring out how to move the git references around, which requires a\nbunch of esotiric and annoying expertise).\n\nThis commit introduces:\n\n1. For outtie\u0027s HTTP server (which is now comically Go HTTP -\u003e\n   CGI-effing-bin -\u003e git -\u003e shell script -\u003e git in this case), there\u0027s a\n   custom git hook that forwards changes to refs/remotes/origin/foo to\n   origin/foo. This is a git proxy of sorts. By forwarding the\n   SSH_AUTH_SOCK, we can use outtie\u0027s auth options without giving innie\n   the actual credentials. This works by creating a temporary directory\n   for git hooks (for outtie).\n\n2. Innie sets up a new remote, \"upstream\" when a \"passthrough-upstream\"\n   flag is pasksed. This remote kind of looks like the real upstream (so\n   upstream/foo) is fetched. This will let the agent handle rebases\n   better.\n\n3. Innie exposes a /pushinfo handler that returns the list of remotes\n   and the current commit and such. These have nice display names for\n   the outtie\u0027s machine and github if useful.\n\n   There\u0027s also a /push handler. This is the thing that knows about the\n   refs/remotes/origin/foo thing. There\u0027s no magic git push refspec that\n   makes this all work without that, I think. (Maybe there is? I don\u0027t\n   think there is.)\n\n   Note that there\u0027s been some changes about what the remotes look like,\n   and when we use the remotes and when we use agent.GitOrigin().\n   We may be able to simplify this by using git\u0027s insteadof\n   configurations, but I think it\u0027s fine.\n\n4. The web UI exposes a button to push, choose the remote and branch,\n   and such. If it can\u0027t do the push, you\u0027ll get a button to try to get\n   the agent to rebase.\n\n   We don\u0027t allow force pushes in the UI. We\u0027re treating those\n   as an advanced feature, and, if you need to do that, you can\n   figure it out.\n\nThis was collaboration with a gazillion sketch sessions.\n"
    },
    {
      "commit": "55b4ab50d0ee61e15825cb4254cfc63b8f5489bd",
      "tree": "fd9d27682d1274b5b0cc25acd44bea281aeeddbe",
      "parents": [
        "e3e886b93d5a5d632de26afa5ba3a0d0fa0f6488"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:31:45 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:31:45 2025 -0700"
      },
      "message": "build: remove output from webui.sh\n\nUnix says: if everything goes well, remain silent.\n"
    },
    {
      "commit": "e3e886b93d5a5d632de26afa5ba3a0d0fa0f6488",
      "tree": "7c815a328b20dba07c9dc0fc85614cb7c58c5eac",
      "parents": [
        "b6affffad340ca6a7ff76000f469f80b065200c2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:31:16 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:31:16 2025 -0700"
      },
      "message": "build: shfmt webui.sh\n"
    },
    {
      "commit": "b6affffad340ca6a7ff76000f469f80b065200c2",
      "tree": "a230ee62a73d06934de9b91588e6cd5ff86cee9d",
      "parents": [
        "5e91d1352bfa7b97bcf9d4e2394b58294eead6a9"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:22:46 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:27:59 2025 -0700"
      },
      "message": "cmd/sketch: simplify code\n\nsilly llm-generated faff\n"
    },
    {
      "commit": "5e91d1352bfa7b97bcf9d4e2394b58294eead6a9",
      "tree": "1f5da8aa4174410d4651b4b6bf3dc307c8917c24",
      "parents": [
        "89ba5f420da139d126c3160794ca1b55821d661a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 21:56:13 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 15:22:09 2025 -0700"
      },
      "message": "sketch: eval symlinks in pwd on startup\n\nFixes #205\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s14259a0fe01511d1k\n"
    },
    {
      "commit": "89ba5f420da139d126c3160794ca1b55821d661a",
      "tree": "b44c981402b7a9f03e3a83cb0de61b3c19ad3578",
      "parents": [
        "d561a0e0eeda7cef031056c199ee2ce5a0c05202"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 14:21:43 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 14:30:44 2025 -0700"
      },
      "message": "sketch/termui: add \"v\" as a synonym for \"b\"\n"
    },
    {
      "commit": "d561a0e0eeda7cef031056c199ee2ce5a0c05202",
      "tree": "3ed39c3185e4f7019f9d8d74542606aaaf338eaf",
      "parents": [
        "e79a44b8334dd9196105e26d446e44de7ef5d255"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 20:24:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 17 13:29:31 2025 -0700"
      },
      "message": "sketch: fix goreleaser homebrew config\n\nFix build failure.\nFix deprecations.\n"
    },
    {
      "commit": "e79a44b8334dd9196105e26d446e44de7ef5d255",
      "tree": "efb6536262c9d3b469fc8d21bc2287bcd63c1c93",
      "parents": [
        "0269340cb3925dd8c5f5ed8ad7ebcd743f66fe6c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 21:00:43 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 17 12:59:54 2025 -0700"
      },
      "message": "Updating Sketch\u0027s dear_llm\n"
    },
    {
      "commit": "0269340cb3925dd8c5f5ed8ad7ebcd743f66fe6c",
      "tree": "e57fb0d4f57ed29e3defc33e00350a941017ce33",
      "parents": [
        "2cc7563b105e381982b0732279609fde49c0ce2d"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 17 17:10:10 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 17 18:08:33 2025 +0000"
      },
      "message": "sketch: fix Timeline messages width overflow issue\n\nFix issue where Timeline messages don\u0027t fit within their designated width,\ncausing text to overflow beyond message bubble boundaries and overlap with\nother UI elements.\n\nRoot cause was that max-width constraints were not being applied properly:\n- max-w-[calc(100%-160px)] Tailwind class wasn\u0027t being computed correctly\n- markdown-content div was missing proper overflow-wrap and word-break CSS\n- message content div was missing max-width constraints\n\nChanges:\n- Add explicit style attributes for max-width constraints on bubble containers\n- Add proper word-break and overflow-wrap CSS properties to markdown content\n- Update global CSS to ensure consistent word breaking behavior\n- Add overflow: hidden to prevent content from overflowing containers\n- Create test page to verify fix works in normal and compact padding modes\n\nThe fix ensures messages wrap properly within their containers in both normal\nmode (with 160px margin) and compact padding mode (full width) while\nbreaking long URLs and unbreakable strings appropriately.\n\nFixes https://github.com/boldsoftware/sketch/issues/201\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7eaa3905ab8c4595k\n"
    },
    {
      "commit": "2cc7563b105e381982b0732279609fde49c0ce2d",
      "tree": "b648353d0e8027abcf9d8c0188f2ee621e9b7530",
      "parents": [
        "c5c3bea08ccfcd2e785bb4b13e9d8618e0f46364"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 17 17:10:17 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 17 17:42:00 2025 +0000"
      },
      "message": "webui: fix copy button in markdown code blocks\n\nThe copy button in markdown code blocks was not working because the click\nevent listener was attached to the .markdown-content div, but the copy\nbutton was rendered outside of that scope in the .code-block-header.\n\nMove the event listener to the message content container level so it can\nproperly handle clicks on copy buttons through event delegation.\n\nFixes https://github.com/boldsoftware/sketch/issues/203\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s888913f32dc41c3fk\n"
    },
    {
      "commit": "c5c3bea08ccfcd2e785bb4b13e9d8618e0f46364",
      "tree": "f365ebcbb0f7802f3c7c60469a024309e5673591",
      "parents": [
        "c314f0c95a5b10cb10904181a181c4ce0d8d1a4b"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 17 10:11:35 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 17 17:24:05 2025 +0000"
      },
      "message": "update web components DEAR_LLM.md\n"
    },
    {
      "commit": "c314f0c95a5b10cb10904181a181c4ce0d8d1a4b",
      "tree": "420df7effcd472dd86cb5b3d92bafe2ce35b65db",
      "parents": [
        "4f833b1678175fbc83c908fc347eae87a89a59db"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:48:46 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:48:46 2025 -0700"
      },
      "message": "github: set include-slow-tests\u003dfalse in queue-main and queue-dev workflows\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s732f68156ca2ab2ek\n"
    },
    {
      "commit": "4f833b1678175fbc83c908fc347eae87a89a59db",
      "tree": "e5cc3d356a290e38747f750413fd89904c094141",
      "parents": [
        "09b86f40dd7b2fd26b92dc49add2d8555785749c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:30:41 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:31:02 2025 -0700"
      },
      "message": "github: add main-cron workflow and include-slow-tests flag\n\nAdd main-cron workflow that runs every 6 hours with same test suite as\nqueue-main but with slow tests disabled for faster feedback. Also add\ninclude-slow-tests flag to go_test.yml workflow.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf1670b17c28d88e2k\n"
    },
    {
      "commit": "09b86f40dd7b2fd26b92dc49add2d8555785749c",
      "tree": "67302c7233854cc9e1318a6a4bb27d6a193fe146",
      "parents": [
        "fb56a5cb097451f5702372da7af8356e35806a73"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:23:03 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 16:23:03 2025 -0700"
      },
      "message": "webui: optimize npm ci caching for faster builds\n\nAdd caching for npm ci in webui build process by tracking\npackage-lock.json changes separately from other source files.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sce58f3444bbcc029k\n"
    },
    {
      "commit": "fb56a5cb097451f5702372da7af8356e35806a73",
      "tree": "56bee60df451d595fce50e71f76fb8f8948027d9",
      "parents": [
        "cbf8c32b26ae73e4d3cf486a93a2bce5866195df"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 22:38:38 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 15:59:08 2025 -0700"
      },
      "message": "sketch: fix Discord notifications to show all commits in stack\n\nThe COMMITS_TO_NOTIFY command was only returning the top commit instead of\nall commits being pushed to main. This happened because in GitHub Actions\ncontext, the origin/main reference might not be current.\n\nFix by fetching the latest main branch reference and using the local main\nbranch as the base for the git log range calculation instead of origin/main.\n\nThis ensures all commits in the stack are properly included in Discord\nnotifications.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: seddc0c760b07e1adk\n"
    },
    {
      "commit": "cbf8c32b26ae73e4d3cf486a93a2bce5866195df",
      "tree": "8139bbc29ff5723bb2358eb9ee4762b19942ff91",
      "parents": [
        "390f847edb6fe450fc547938c2e806db693d9e61"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 15:25:39 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 16 15:25:39 2025 -0700"
      },
      "message": "Revert \"sketch: fix Discord notifications to show all commits in stack\"\n\nThis reverts commit af1e5d99704e3657fdf4b18ec0a68c2d7c22e3c6.\n"
    },
    {
      "commit": "390f847edb6fe450fc547938c2e806db693d9e61",
      "tree": "25ee5ba6832307d13801139fe0dc2329c0085421",
      "parents": [
        "a8561f70c1701376e88a5b63d78e7d09a7ae3ed8"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 16 20:09:45 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 16 20:09:45 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "a8561f70c1701376e88a5b63d78e7d09a7ae3ed8",
      "tree": "6093a6ba26567089bf33a70f74399eca2c149391",
      "parents": [
        "b58bbf30db0ced33cc110dd44d6c14995977737f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 23:47:59 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 13:08:59 2025 -0700"
      },
      "message": "sketch/webui: add untracked files notification to diff view\n\nAdd warning in diff view about untracked files.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s45fbbdf5b3d703e4k\n"
    },
    {
      "commit": "b58bbf30db0ced33cc110dd44d6c14995977737f",
      "tree": "bc136bb11a4bc43f8b8679c06677de6601cb9e34",
      "parents": [
        "f3d739fcb7391c0a4413e79c69322129da9df5cc"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 18:33:34 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 12:00:26 2025 -0700"
      },
      "message": "goreleaser: add experimental homebrew tap support\n\nThink it\u0027s right, but not sure whether it\u0027ll actually work.\nTomorrow, if it functions, we\u0027ll declare it no longer experimental.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s5126ee115c362b2ck\n"
    },
    {
      "commit": "f3d739fcb7391c0a4413e79c69322129da9df5cc",
      "tree": "9dc6e1a4b4a9e8e8d97ea575fa9df3ca36a528f5",
      "parents": [
        "246132065e858778359e65250bc7f2e19d477710"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 18:06:38 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 16 12:00:26 2025 -0700"
      },
      "message": "readme: tweak installation instructions\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s53fd17542f72975ak"
    },
    {
      "commit": "246132065e858778359e65250bc7f2e19d477710",
      "tree": "a937884247db726e6c9d7e475334e77659b6a88f",
      "parents": [
        "183d114ef7f3b806b77ff6691bcadbbf5bdd805c"
      ],
      "author": {
        "name": "philz",
        "email": "philip.zeyliger@gmail.com",
        "time": "Tue Jul 15 20:56:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Jul 15 20:56:31 2025 -0700"
      },
      "message": "sketch: create empty commit on empty repo, both in innie and outtie\n\nLife\u0027s a bit too short to fail when the git repo exists but is empty.\nFor innie (e.g., using -unsafe on an empty repo), we just create the\nempty commit. For outtie, we do the same thing, since initializing an\nempty repo would be a weird different code path.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se0a9606cc9f43388k\n"
    },
    {
      "commit": "183d114ef7f3b806b77ff6691bcadbbf5bdd805c",
      "tree": "9da45eaa832a700e3f533712a2bcfe0acdec341b",
      "parents": [
        "3ad8c8d9847a3a6d2c69f8ef76e1af4758ff845e"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 17:10:23 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 17:10:32 2025 -0700"
      },
      "message": "build: do the innie builds concurrently\n\nfor SPEED\n"
    },
    {
      "commit": "3ad8c8d9847a3a6d2c69f8ef76e1af4758ff845e",
      "tree": "71f39eb5c3c79c697ade4c930839b7aa122f866a",
      "parents": [
        "9022ae08d3483b711bc9bf6673e280aef633e8a0"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Jul 15 21:05:23 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Tue Jul 15 21:05:23 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "9022ae08d3483b711bc9bf6673e280aef633e8a0",
      "tree": "f0d208ef1dc5ba47fa045e0aa0f51267398cae6e",
      "parents": [
        "0af5fbe505d9b3fb76e5d2cbd5a7ef964f9c06a8"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 20:52:30 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Jul 15 13:53:41 2025 -0700"
      },
      "message": "sketch: dump message history to /tmp on conversation compaction and include filename in summary\n\nAdd dumpMessageHistoryToTmp method that dumps complete agent message history to timestamped JSON file during conversation compaction, returning filename for inclusion in compaction summary message.\n\nWhen conversation compaction occurs, the agent now:\n- Dumps entire a.history array to /tmp/sketch-messages-{sessionID}-{timestamp}.json as formatted JSON\n- Returns filename from dumpMessageHistoryToTmp for reference in summary message\n- Includes dump file location in compaction summary: \"The complete message history has been dumped to {filename} for your reference if needed\"\n- Continues compaction process even if dump fails to avoid blocking conversation flow\n\nImplementation:\n- Added dumpMessageHistoryToTmp method returning (filename, error)\n- Modified CompactConversation to call dump before generating summary\n- Enhanced summary message to conditionally include dump file reference\n- Uses 2-space JSON indentation for readability and 0644 file permissions\n- Creates timestamped filenames to avoid conflicts across multiple compactions\n\nThe implementation provides access to complete conversation history during epoch restarts while maintaining conversation compaction benefits.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s3784d6168585f9c4k\n"
    },
    {
      "commit": "0af5fbe505d9b3fb76e5d2cbd5a7ef964f9c06a8",
      "tree": "b449b249adcc1f08b61ac0d6f03961c9c625a317",
      "parents": [
        "369f2628fdc10ceb46a776d98c168d48ecd1f22b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 19:40:48 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 10:49:38 2025 -0700"
      },
      "message": "selfupdate: add -update\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s236be243dde9276dk\n"
    },
    {
      "commit": "369f2628fdc10ceb46a776d98c168d48ecd1f22b",
      "tree": "b2ff54d6b7ed6b194b417994f97d60e55f708bbb",
      "parents": [
        "2e967e55c5619e08b45a5a1e162774a0de859dab"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 15 00:02:59 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 17:25:50 2025 -0700"
      },
      "message": "sketch/loop: handle existing git repos in innie sketch\n\nCheck if /app/.git already exists before attempting to clone. If it exists\n(e.g., from skaband images or user images with existing git repos), configure\nthe origin remote and fetch instead of cloning.\n\nThis fixes compatibility with skaband dockerfiles that create images with\nexisting git repositories, and adapts to the object-only approach introduced\nin commit 9e8f5c78e8cef4c73e7b2629b2270ab572d530f8.\n\nThe implementation uses a helper function upsertRemoteOrigin that handles\nboth setting the URL for existing origin remotes and adding new ones.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9625bfa389b6b7dek\n"
    },
    {
      "commit": "2e967e55c5619e08b45a5a1e162774a0de859dab",
      "tree": "04122adf524dc7341eeb371577104d9a4ba7e0cc",
      "parents": [
        "2edd62e8a2f23331d936621f0f0e344fe41c21b3"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 21:09:31 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 17:25:50 2025 -0700"
      },
      "message": "llm: make MustSchema validate minimum schema requirements\n\nSome OpenAI endpoints are fussy about these.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s74cb7cc9fd0e036dk\n"
    },
    {
      "commit": "2edd62e8a2f23331d936621f0f0e344fe41c21b3",
      "tree": "3c4c0cd8d3272d9d04553168f7fcb7156bf85ce7",
      "parents": [
        "327c1966f1949b922463f77384acc5bfa9492fd3"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 12:44:51 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 17:25:50 2025 -0700"
      },
      "message": "llm/oai: add kimi-k2 configs\n\nDoesn\u0027t work yet, though.\n"
    },
    {
      "commit": "327c1966f1949b922463f77384acc5bfa9492fd3",
      "tree": "406bfeefe514762d79a4862baed994619b07f51f",
      "parents": [
        "5a3cd2a0d93e45bb551b1617a9ace281d5788b59"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 16:08:51 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 16:08:51 2025 -0700"
      },
      "message": "sketch: fix Discord notifications to show all commits in stack\n\nVibe-coding an improvement to the Discord notifications.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s9b380343c76d40dck\n"
    },
    {
      "commit": "5a3cd2a0d93e45bb551b1617a9ace281d5788b59",
      "tree": "ebb7dcefee1bbd7b14deed7d596643837f246858",
      "parents": [
        "43a0bfc2227f07db26ff785470fbac35d309499a"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 15:16:06 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 15:16:06 2025 -0700"
      },
      "message": "ci: update GitHub workflows to use Go 1.24.5\n\nUpdate Go version references in GitHub workflow cache configurations to\nmatch the Go version specified in go.mod files across the repository.\n\nI\u0027m unclear whether putting the go version in here is necessary,\nbut not rocking that boat right now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf306dbc03d8b2709k\n"
    },
    {
      "commit": "43a0bfc2227f07db26ff785470fbac35d309499a",
      "tree": "e1900f7602fed9ac779181b59790f6b1e0b44a7f",
      "parents": [
        "d9acaa785a8cc8b3cc14d6efcdd7ce45ffe3737f"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 14:54:27 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 15:13:41 2025 -0700"
      },
      "message": "sketch: add debug handler to dump conversation history as JSON\n\nAdd HTTP debug endpoint /debug/conversation-history to dump agent conversation\nhistory as pretty-printed JSON for debugging purposes.\n\nSometimes, you just want to see what went on.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6c9e876db9b3aa5ck\n"
    },
    {
      "commit": "d9acaa785a8cc8b3cc14d6efcdd7ce45ffe3737f",
      "tree": "c3c615b10db1e8f9bd9c3d88c13f81f61c1a83b6",
      "parents": [
        "a50a3bf9e4b996498289df50744bdce09a59cc13"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 14:51:55 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 15:04:32 2025 -0700"
      },
      "message": "sketch: optimize code copy button performance\n\nThere was a setTimeout(..., 100) for no good reason.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s1d721e710776c3eck\n"
    },
    {
      "commit": "a50a3bf9e4b996498289df50744bdce09a59cc13",
      "tree": "92194e1c19ef8805b1fc725cf74d54a919d99fb9",
      "parents": [
        "9b39aa66590f68f9039a8efc0c4e1917551016e6"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 19:40:48 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 14 13:18:34 2025 -0700"
      },
      "message": ".goreleaser: simplify and harden signing\n\nPass envvar via stdin instead of writing to a file.\nRemove base64.\nRestrict secret to release-build environment.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: saf0aa2158a183abek\n"
    },
    {
      "commit": "9b39aa66590f68f9039a8efc0c4e1917551016e6",
      "tree": "6ac5e639d348bf2b2a3017abbc147411b79cf9bf",
      "parents": [
        "333aa67a4c1639f49c7ba03edab4ace3c6439e2b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 11:56:02 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Jul 14 11:56:24 2025 -0700"
      },
      "message": "sketch: exclude internal processes (headless-chrome) from port monitoring\n\nAdd SKETCH_IGNORE_PORTS environment variable to headless-shell browser processes\nand modify port monitoring to exclude processes with this variable.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sff3b145df27ee3bek\n"
    },
    {
      "commit": "333aa67a4c1639f49c7ba03edab4ace3c6439e2b",
      "tree": "9bb97e108a92eaf51e4ad7f12b07042ec3b96e8b",
      "parents": [
        "dc27c395443e6d08de8cba3c9c4a85242f11ade6"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Sun Jul 13 19:49:21 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Mon Jul 14 02:44:44 2025 +0000"
      },
      "message": "sketch: remove shadowDOM dependency from tool card components\n\nReplace shadowDOM-based slot system with property-based composition in all\nsketch-tool-card-[TOOL_NAME] components to support shadowDOM-free architecture.\n\nProblem Analysis:\n- sketch-tool-card component relied on HTML5 template slots which require shadowDOM\n- 13 tool card components used sketch-tool-card as composition base via slots\n- shadowDOM dependency blocked broader effort to reduce shadowDOM usage\n- Need to preserve all existing functionality while removing slot dependency\n\nSolution Implementation:\n- Created sketch-tool-card-base component with property-based content injection\n- Replaced slot system with summaryContent, inputContent, resultContent properties\n- Maintained all existing styling, behavior, and expand/collapse functionality\n- Migrated all 13 existing tool card components to use new base component\n\nComponents Migrated:\n- sketch-tool-card-about-sketch\n- sketch-tool-card-browser-clear-console-logs\n- sketch-tool-card-browser-click\n- sketch-tool-card-browser-eval\n- sketch-tool-card-browser-get-text\n- sketch-tool-card-browser-navigate\n- sketch-tool-card-browser-recent-console-logs\n- sketch-tool-card-browser-resize\n- sketch-tool-card-browser-scroll-into-view\n- sketch-tool-card-browser-type\n- sketch-tool-card-browser-wait-for\n- sketch-tool-card-read-image\n- sketch-tool-card-take-screenshot\n\nMigration Pattern:\n- Changed from: \u003cslot name\u003d\"summary\"\u003econtent\u003c/slot\u003e\n- Changed to: .summaryContent\u003dhtml content\n- Preserved all component-specific styling and logic\n- Maintained existing API surface for parent components\n\nArchitecture Benefits:\n- Removes shadowDOM requirement from 13+ components\n- Enables future shadowDOM-free component development\n- Maintains backward compatibility during migration\n- Preserves all existing tool card functionality\n\nFiles Added:\n- sketch/webui/src/web-components/sketch-tool-card-base.ts (new shadowDOM-free base)\n\nFiles Modified:\n- All 13 sketch-tool-card-[TOOL_NAME].ts components migrated to use new base\n\nVerification:\n- TypeScript compilation passes without errors\n- Demo pages render correctly with consistent styling\n- Expand/collapse behavior preserved across all tool types\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa3288c1d986356e5k\n"
    },
    {
      "commit": "dc27c395443e6d08de8cba3c9c4a85242f11ade6",
      "tree": "0ed1fef06da72f23ff8d59b28ce3dee535b1ae30",
      "parents": [
        "b80db9c74081f89810ee13789345add0d6210297"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 11 18:36:14 2025 -0700"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Fri Jul 11 18:36:26 2025 -0700"
      },
      "message": "fix clipped right edge of messages\n"
    },
    {
      "commit": "b80db9c74081f89810ee13789345add0d6210297",
      "tree": "00c40c65f93d3d3f91aa4ef7f2d311abdd59915f",
      "parents": [
        "ea5504c438ff5f61e51375e6229b3bfc003ef138"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jul 12 01:20:36 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Jul 12 11:27:18 2025 +1000"
      },
      "message": "sketch: fix nightly releases being marked as pre-releases\n\nRemove the GitHub workflow step that was explicitly marking releases as pre-releases.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf9e8db3a7bac9e0dk\n"
    },
    {
      "commit": "ea5504c438ff5f61e51375e6229b3bfc003ef138",
      "tree": "c2886f3764fefc1cd5254843b7761c150c77f021",
      "parents": [
        "fa424f563e7f75c7ad07ad83def8fe928241f49d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 16:30:52 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 16:30:52 2025 -0700"
      },
      "message": "go.mod: bump to Go 1.24.5\n"
    },
    {
      "commit": "fa424f563e7f75c7ad07ad83def8fe928241f49d",
      "tree": "c2867a2150e9df6e233c97c537acc0f1740ecef0",
      "parents": [
        "784d5bd5d850f90359edc850484c01f15b6ce173"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 18:43:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 16:24:27 2025 -0700"
      },
      "message": "dockerimg: restore go mod download functionality\n\nRestore the go mod download functionality that was lost during the\ntransition to only copying git objects.\n\nThis pre-populates the Go module cache during image build time.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s0941bfb3f9ba2251k\n"
    },
    {
      "commit": "784d5bd5d850f90359edc850484c01f15b6ce173",
      "tree": "fdc0467922309487f0d28988b2664c51fac99c68",
      "parents": [
        "eb91caaa81362c5528bd0e3a8ca0f2b61de43852"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 00:09:30 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 16:24:01 2025 -0700"
      },
      "message": "dockerimg: add only git objects to docker image\n\nInstead of copying the entire working directory\n(including uncommitted changes, hooks, and config files),\ncreate a bare git repository and use git clone --reference.\n\nThis approach:\n- Avoids copying uncommitted changes, hooks, and local config files\n- Works correctly with git worktrees and submodules\n- Reduces Docker image size substantially\n- Maintains all git history and functionality\n\nFixes boldsoftware/sketch#190\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s6af36147e2c4df00k\n"
    },
    {
      "commit": "eb91caaa81362c5528bd0e3a8ca0f2b61de43852",
      "tree": "79e392448584cfcc64184365936fe8914a974437",
      "parents": [
        "5e97dfc62b2c26cd6f483b06c1f5b034307c9791"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 15:29:18 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 15:29:30 2025 -0700"
      },
      "message": "sketch/loop: minor cleanup\n\nSuggested by Ye Olde IDEe.\n"
    },
    {
      "commit": "5e97dfc62b2c26cd6f483b06c1f5b034307c9791",
      "tree": "459cd8afe14721c1aae4676c68aa225877c33e2d",
      "parents": [
        "61fa306b9a6e7677b63b66e3599f5fe5af2015a7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 18:14:07 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 14:56:19 2025 -0700"
      },
      "message": ".goreleaser.yml: add binary-only releases and ed25519 signatures\n\nThis lays the groundwork for future secure self-updates.\nThe corresponding public key is in selfupdate/ed25519.pem.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s5b7440b1a9e2c5e3k\n"
    },
    {
      "commit": "61fa306b9a6e7677b63b66e3599f5fe5af2015a7",
      "tree": "e17b3d13728ca3874a5f7992ff596bbf86038cc8",
      "parents": [
        "a96f9d2d783a04042352618087ec0a292e3d23e2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 10:21:13 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 10:21:13 2025 -0700"
      },
      "message": "sketch/embedded: embed webui in outie\n\nThis makes the web interface work with -unsafe.\n\nI hate to add a third copy of webui to outie.\n\nThere are any number of workarounds for this, including (but surely\nnot limited to):\n\n- copy webui into the container, like before\n- have innie forward all webui requests to outie\n- for releases, load content-addressable webui from a CDN\n- have outie parse and grab webui from an innie binary for -unsafe\n\nBut for now, let\u0027s keep things simple and straightforward.\n\nFixes #195\n"
    },
    {
      "commit": "a96f9d2d783a04042352618087ec0a292e3d23e2",
      "tree": "32c87ca9b3a0e11853028233d97c0bc8c1bf5531",
      "parents": [
        "17b2fd9b8ed388f341b380c88e7c4c6f88494573"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 11 02:47:33 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 10 20:08:20 2025 -0700"
      },
      "message": "sketch: set relpath at runtime, not build time\n\nPreviously, relpath was baked into the docker container at build time by setting\nthe working directory with \u0027docker create -w /app/relpath\u0027. This was incorrect\nbecause relpath can vary between different invocations of sketch.\n\nNow:\n- Remove -w flag from docker container creation\n- Pass relpath as -C flag to sketch binary at runtime\n- Container always starts with working directory /app (git root)\n- Inner sketch process changes to correct directory at startup\n\nThis ensures sketch works correctly regardless of which subdirectory it\u0027s\ninvoked from, without hardcoding paths into the container image.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2da1f8f867cd0e96k\n"
    },
    {
      "commit": "17b2fd9b8ed388f341b380c88e7c4c6f88494573",
      "tree": "1c1679f6ead6c587e8bf5add8ffcb978449c6703",
      "parents": [
        "39eb24f7dfb82c802dfe7b4caac500acde26a907"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 22:47:13 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 10 19:38:07 2025 -0700"
      },
      "message": "claudetool: replace timeout parameter with slow_ok boolean\n\nEmpirically, the agent doesn\u0027t set timeouts long enough,\nand doesn\u0027t retry on failure.\n\nGive it only one decision to make: Is this maybe a slow command?\n\nIf, horror of horrors, your project can\u0027t accomplish tasks within the\ndefault timeouts, there\u0027s a new command line flag to adjust them.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sc26e3516f28c22d4k\n"
    },
    {
      "commit": "39eb24f7dfb82c802dfe7b4caac500acde26a907",
      "tree": "388f5ee8a5781513c339e5503409d8b1de9247d0",
      "parents": [
        "fadffe3cfb867760be035e72b7096946554255a1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 10 01:46:33 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 21:04:41 2025 -0700"
      },
      "message": "build: do simple content-based hashing of webui builds\n\nThis dramatically speeds up no-op rebuilds.\n\nIt does a full rebuild for any changes whatsoever\nin the webui directory.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa46a41c964391e31k\n"
    },
    {
      "commit": "fadffe3cfb867760be035e72b7096946554255a1",
      "tree": "eb66acbe6f8d6f9825a1da92a3b9df0b3b7f0901",
      "parents": [
        "e3c0f4d054cc7ec2859cffd3f61383d8a122a53c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 10 00:08:38 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 19:23:57 2025 -0700"
      },
      "message": "sketch/loop: fuss more with /git/cat and 204s\n\nFor unknown reasons, switching to 204s made the diff view noticeably slower.\nBe more explicit about things in the hope that it helps.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s52c5ab6557e1f9dbk\n"
    },
    {
      "commit": "e3c0f4d054cc7ec2859cffd3f61383d8a122a53c",
      "tree": "9366347855084fb5690b257e99bf02f27d197d08",
      "parents": [
        "6ae637a035e22fcc375bd522d24d9c22f281fec5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 15:22:07 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 15:22:07 2025 -0700"
      },
      "message": "sketch: add missing tag to goreleaser config\n\nIt got lost during some git undo shenanigans.\n"
    },
    {
      "commit": "6ae637a035e22fcc375bd522d24d9c22f281fec5",
      "tree": "adfbe68d9bce24daf42bce1a52055430df221718",
      "parents": [
        "a002a23a60dcc21353681a887a90cd12867e7f44"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 12:41:56 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 14:55:56 2025 -0700"
      },
      "message": "all: re-organize build/release\n\n- extract steps into shell files\n- fix GoReleaser builds (I hope)\n- rely more on the toolchain for version information\n- allow non-standard builds, but print a warning\n\nSuggested-by: Marc-Antoine Ruel \u003cmaruel@gmail.com\u003e\n"
    },
    {
      "commit": "a002a23a60dcc21353681a887a90cd12867e7f44",
      "tree": "e554f73faa6681dec2cbee396f30b03b972ab66b",
      "parents": [
        "5ab8fb8dc17299df5d134d7a95f33d41b170f102"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 19:38:03 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 14:37:14 2025 -0700"
      },
      "message": "webui: delete non-gzip\u0027d assets\n\nReduces webui assets from 83M to 16M.\nAlmost all browsers support gzip.\nFor those that don\u0027t, we provide on-the-fly decompression.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sbc10790564044d6bk\n"
    },
    {
      "commit": "5ab8fb8dc17299df5d134d7a95f33d41b170f102",
      "tree": "bbc6f1a77e2eeffc2ab759270711e0fbe6a9118a",
      "parents": [
        "b7ec9c837a549abd9bbbc1230e6d96090c98af52"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 09 12:34:55 2025 -0700"
      },
      "committer": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 09 12:42:12 2025 -0700"
      },
      "message": "webui: display context window size in info box\n"
    },
    {
      "commit": "b7ec9c837a549abd9bbbc1230e6d96090c98af52",
      "tree": "c4dc6e6b0d159b0ae8a21456c591cb2e12dc3e63",
      "parents": [
        "973413b1c24f1d2ab5f56729ae236892c4221fdf"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 09 10:16:39 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 09 17:17:12 2025 +0000"
      },
      "message": "add link to gh user page under chat msg\n"
    },
    {
      "commit": "973413b1c24f1d2ab5f56729ae236892c4221fdf",
      "tree": "22aeb8d11f7198e1bbe2530f725c763a0ca8ff1f",
      "parents": [
        "b843146dd360f53c2feb2942d4a6ef4ccc9109fb"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 19:35:05 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 21:53:37 2025 -0700"
      },
      "message": ".goreleaser.yml: use make in GoReleaser\n\nTeach GoReleaser to use make for our nightly releases.\n\nUntested--we\u0027ll know better tomorrow whether this works.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s4d8aed2fbf3aae3fk\n"
    },
    {
      "commit": "b843146dd360f53c2feb2942d4a6ef4ccc9109fb",
      "tree": "1be327ecc49991def691d5fd19ba0486dc678654",
      "parents": [
        "e7ca73df4b61cff1847c4f63feac89c580e998c7"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Jul 09 13:10:32 2025 +1000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Jul 09 13:14:12 2025 +1000"
      },
      "message": "server: Wait on terminal process for cleanup\n\nThe bash shell for the termianl is an exec.Cmd that is Start()ed\nin the github.com/creack/pty package. We do a lot of cleanup\nwhen that shell exits, but we never Wait() on it (and neither\ndoes the pty package), so the bash process gets left behind\nas a zombie.\n\nFixes boldsoftware/sketch#181\n"
    },
    {
      "commit": "e7ca73df4b61cff1847c4f63feac89c580e998c7",
      "tree": "2e76b9f8b9751578c7daeeaa8d274e0f9d64d0e6",
      "parents": [
        "5ae245bd47becaf2aaa862b5c7e9bcec71e17831"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 16:37:09 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 19:49:34 2025 -0700"
      },
      "message": "all: cull dead code\n\nMostly from moving builds to use make.\n"
    },
    {
      "commit": "5ae245bd47becaf2aaa862b5c7e9bcec71e17831",
      "tree": "36438abd1d864685384a3b2a4e9f25e7bccbe0d1",
      "parents": [
        "c9898fd814de9bb9cf75a953336439241e7e900c"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 22:00:24 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 15:02:23 2025 -0700"
      },
      "message": "sketch: add multi-architecture binary support\n\nBuild both amd64 and arm64 Linux binaries and embed them both.\nSimplify API to use single LinuxBinary(arch) function for architecture\nselection. Update copyEmbeddedLinuxBinaryToContainer to detect Docker\nserver architecture using \u0027docker version --format\u0027 and automatically\nuse the correct binary.\n\nThis enables sketch to work correctly on both x86_64 and ARM64\nDocker environments without requiring architecture-specific builds.\nUnsupported architectures return nil instead of panicking.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd498605bf58e984ek\n"
    },
    {
      "commit": "c9898fd814de9bb9cf75a953336439241e7e900c",
      "tree": "66a13bd9f437520bf193fcb16cf4b64e68b447d3",
      "parents": [
        "5c29b3e17fa526aa912d3ba400cf8a1a9c83fd80"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 21:09:18 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 14:24:05 2025 -0700"
      },
      "message": "dockerimg: stream tar to docker cp\n\nStop writing a temp file.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7f35a450897c1efek\n"
    },
    {
      "commit": "5c29b3e17fa526aa912d3ba400cf8a1a9c83fd80",
      "tree": "a57a2cf6f5420e866c4cd86d8184d0d2dd8b87ad",
      "parents": [
        "1c18ec94b0d2edcc6d69d1b96f89e3c6e630fc11"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 18:07:28 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 13:44:11 2025 -0700"
      },
      "message": "sketch/loop: return 204 for not-found files in /git/cat\n\nThis isn\u0027t actually an error; no reason to return a 500.\nThe front-end handles this identically,\nbut without js console log spam,\nwhich is the motivation for this change.\n"
    },
    {
      "commit": "1c18ec94b0d2edcc6d69d1b96f89e3c6e630fc11",
      "tree": "994dbcf813d9c772da320ccccfc2e2f5fe826155",
      "parents": [
        "e1a6e1b25d1cf7f3aec4b98e155be7cf3701a1b0"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 10:55:54 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 13:06:43 2025 -0700"
      },
      "message": "all: use make to build\n\nThis overhauls the build system.\nWe used to use a just-in-time clever build system\nso that \u0027go run\u0027 and \u0027go install\u0027 Just Worked.\n\nThis was really nice, except that it make it\nall but impossible to ship a single binary.\nIt also required our uses to install npm,\nwhich some folks have an understandably negative reaction to.\n\nThis migrates to a makefile for building.\nThe core typescript building logic is mostly still in Go,\nand untouched (boy did I learn that lesson the hard way).\n\nThe output is a single file that includes the webui, innie, and outie.\n\n(There are still very mild shenanigans in which we write outie\nout to a temp file and then \u0027docker cp\u0027 it into the docker container.\nBut this is pretty manageable.)\n\nThere are some significant follow-ups left after this commit:\n\n- convert the nightly release builds to use the makefile\n- lots of dead code removal\n- maybe add -race support using a dockerfile for the cgo compilation\n- maybe use \u0027docker cp\u0027 stdin reading with tar to avoid the temp outtie file\n- all the rest of the \"better release\" todos (brew install, etc.)"
    },
    {
      "commit": "e1a6e1b25d1cf7f3aec4b98e155be7cf3701a1b0",
      "tree": "b4088c64ed5e09c4e8d68143dc4a5a959653d1e5",
      "parents": [
        "39ee05a289740544030b5a2f83cd673839efd08f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 04 03:10:24 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 12:02:47 2025 -0700"
      },
      "message": "cmd/sketch: combine (and alphabetize) imports"
    },
    {
      "commit": "39ee05a289740544030b5a2f83cd673839efd08f",
      "tree": "ef2e09c6519775586475648d9279468cf662a9f4",
      "parents": [
        "454f8864b1830ff13f19a49dd53d91b5a201baf7"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 11:20:01 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 12:02:47 2025 -0700"
      },
      "message": "webui: bump esbuild version"
    },
    {
      "commit": "454f8864b1830ff13f19a49dd53d91b5a201baf7",
      "tree": "d52cec3d8a26fe8f6f0883008aaef86b425e55cb",
      "parents": [
        "289525bcecca82247e0908c5ff1f213213d9c9a4"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 04:12:28 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 21:14:34 2025 -0700"
      },
      "message": "sketch/loop: remove flaky TestPortMonitor_IntegrationDemo test\n\nDelete the integration test that was still flaky despite previous fixes.\n\nRoot Cause:\n- Test suffered from inherent race condition with system-wide port resources\n- After closing test ports, other processes could immediately bind to same port numbers\n- Race condition window existed between port closure and PortMonitor detection\n- Cannot be made truly hermetic because port numbers are OS-managed system resources\n\nTest Coverage Analysis:\n- Integration test added minimal unique value over existing unit tests\n- Agent.pushToOutbox already tested in agent_test.go\n- Port detection logic thoroughly tested in port_monitor_test.go\n- TCP filtering, sorting, added/removed detection all covered by unit tests\n- Core functionality has excellent test coverage without the integration test\n\nThe Fix:\n- Remove the flaky integration test entirely\n- Preserve all existing unit tests which provide reliable coverage\n- Eliminate CI/CD reliability issues caused by environmental dependencies\n- Remove maintenance burden of debugging false test failures\n\nThis removes the flaky test while maintaining comprehensive test coverage\nthrough the existing unit test suite.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8bd05f43558fc5c4k\n"
    },
    {
      "commit": "289525bcecca82247e0908c5ff1f213213d9c9a4",
      "tree": "ffdc00894b39af359cba7f481c05e9a5b7b405f7",
      "parents": [
        "828161b106396bf87a4c481895781f1d1d732e0a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 04:03:02 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 21:13:27 2025 -0700"
      },
      "message": "sketch/termui: handle PortMessageType messages more\n\n- Added case for loop.PortMessageType in termui message handling switch\n- Port messages now display with 🔌 emoji and clean formatting\n- Follows same pattern as other message types (ErrorMessageType, BudgetMessageType, etc.)\n\n- Added loop.PortMessageType to AddMultipleUnion call in go2ts.go\n- Regenerated TypeScript types to include \u0027port\u0027 in CodingAgentMessageType union\n- Webui components now have proper type safety for port messages\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s7e1f4b705a66a9d5k\n"
    },
    {
      "commit": "828161b106396bf87a4c481895781f1d1d732e0a",
      "tree": "9ced21ca57a202fc44456c7cbd53a8a113435c51",
      "parents": [
        "c7a98d8360cf03f977625a65e8dd637d6b2ab18b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 08 03:44:39 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 21:06:38 2025 -0700"
      },
      "message": "sketch/loop: fix flaky TestPortMonitor_IntegrationDemo test\n\nRemove assumptions about system-wide port state that made the test flaky.\n\nRoot Cause:\n- Test assumed it was the only process creating/destroying ports\n- Made brittle assertions about total port counts before/after test servers\n- Failed when other processes (tests, services, containers) modified ports\n\nThe Fix:\n- Focus only on the specific test ports created by the test\n- Use polling with timeout to detect port creation/removal\n- Remove assertions about total port counts\n- Test only verifies its own test ports are detected and removed\n\nChanges:\n- Replace fixed sleeps with polling loops with timeouts\n- Remove port count comparisons that depended on system state\n- Keep track of test ports separately from system port scanning\n- Add proper timeout handling to prevent hanging tests\n\nTest Results:\n- Before: Flaky failures when other processes modified ports\n- After: 5 consecutive runs all passed, focusing only on test-specific behavior\n\nThis preserves the test\u0027s usefulness as an integration test while making it\ndeterministic and isolated from system-wide port changes.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s58312d8275959960k\n"
    },
    {
      "commit": "c7a98d8360cf03f977625a65e8dd637d6b2ab18b",
      "tree": "043d571f69c08cc1211dbd9d85821ca488160a38",
      "parents": [
        "553cc842a3fea3594158c8314a577c2b916bf45d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 19:12:53 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 19:13:43 2025 -0700"
      },
      "message": "sketch/loop: fix concurrency handling in port monitor shutdown\n\nThe graceful shutdown code assumes it can take the pm.mu lock.\nMake the Stop code oblige.\n\nThis fixes the issue at hand, but the remaining code still gives\nme the heebie jeebies--for example, after calling Stop, there could\nstill be notifications that come in.\n\nSketch really shouldn\u0027t write concurrent code.\n\nThis will work well enough, I guess, until it doesn\u0027t,\nat which point we\u0027ll have to carefully fix up the rats nest.\n\n\nBefore:\n\n2m10s: 1157 runs so far, 36 failures (3.11%)\n\nAfter:\n\n16m45s: 12484 runs so far, 0 failures\n\n\nFixes boldsoftware/bold#446 enough for now\n"
    },
    {
      "commit": "553cc842a3fea3594158c8314a577c2b916bf45d",
      "tree": "ddfc127b4dd7db561f184e6a9ab85a5103a27aaf",
      "parents": [
        "9f5a051b23af48263ec8fde4cc9b1c6e11532433"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 19:05:22 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 19:13:06 2025 -0700"
      },
      "message": "sketch/claudetool/browse: fix broken test\n\nApparently this wasn\u0027t actually running anywhere in CI. Sigh.\n"
    },
    {
      "commit": "9f5a051b23af48263ec8fde4cc9b1c6e11532433",
      "tree": "4017efac74b922cc14e8e2aae4cadf879a6b0644",
      "parents": [
        "c52a250e07c2d84173c90dc076d45f14a26bdce3"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 19:59:06 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jul 07 19:59:06 2025 -0700"
      },
      "message": "sketch/loop: remove flaky TestPortMonitor_PortDetection test\n\nThe test was inherently flaky because it assumed no other processes would\nopen/close ports during test execution. This caused false failures in CI\nand development environments.\n\nThe test provided minimal additional value since:\n- Core port monitoring logic is already well-tested by other tests\n- It was testing system integration rather than code logic\n- The portlist.Poller is a third-party dependency\n- Making it robust would require significant refactoring\n\nThe remaining tests provide comprehensive coverage of port monitoring\nfunctionality including filtering, sorting, diffing, and lifecycle management.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sf2d9c51227a4419ek\n"
    },
    {
      "commit": "c52a250e07c2d84173c90dc076d45f14a26bdce3",
      "tree": "236d1d92297fbac41b76921d8694c59e22e37060",
      "parents": [
        "255dc4320aed97625a17d9d398c5d076c35e9700"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Sun Jul 06 20:27:59 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Sun Jul 06 20:27:59 2025 -0700"
      },
      "message": "fix infobox z-index\n"
    },
    {
      "commit": "255dc4320aed97625a17d9d398c5d076c35e9700",
      "tree": "81fb28bdd4b3aad8093349bac6cd3458fadc247c",
      "parents": [
        "e5b2fc0061e542fe2350c1675e7d18172b418882"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jul 06 21:58:00 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jul 06 15:13:51 2025 -0700"
      },
      "message": "webui: fix diff scrolling (broken in 265839b0 / 5450584)\n\nSketchTailwindElement disabled shadow DOM, so the :host CSS selector\nno longer worked since there\u0027s no shadow DOM. Also some heights\nstopped being calculated correctly.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2155f0d365ba51cak\n"
    },
    {
      "commit": "e5b2fc0061e542fe2350c1675e7d18172b418882",
      "tree": "db4f467c9237395cfb8ef2df2648288a05036f80",
      "parents": [
        "e48f2bb05d937c1bcc51bca81a010173d905c0bb"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jul 06 16:33:46 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sun Jul 06 11:20:38 2025 -0700"
      },
      "message": "sketch/webui: skip welcome text in compact mode\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8fafc4bbd5d95705k\n"
    },
    {
      "commit": "e48f2bb05d937c1bcc51bca81a010173d905c0bb",
      "tree": "90d08fc8e4b0775ec25af38580b6b68182087f31",
      "parents": [
        "6dc90c03abff887c09ca0418d4d493d16cf1b0c8"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 04 04:15:26 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Jul 04 04:15:26 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "6dc90c03abff887c09ca0418d4d493d16cf1b0c8",
      "tree": "d6d66f1950c0b3689c9f55972e0c7e1a829d1f7f",
      "parents": [
        "5f26a3445601f6ab0299d9be20ea99b67eae4d51"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 03 20:12:49 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 03 21:14:55 2025 -0700"
      },
      "message": "sketch/webui: add port display with external link functionality to UI header\n\nAdd port monitoring display next to Last Commit area in container status\nheader, showing open ports as clickable links with external link emoji\nand overflow handling for additional ports beyond first two displayed.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s205c16eb68a4b157k\n"
    },
    {
      "commit": "5f26a3445601f6ab0299d9be20ea99b67eae4d51",
      "tree": "740ba6f60a055e4e6ad8ec92e75992ca9d2b0795",
      "parents": [
        "da623b50da804963768d2633cb2686a9d91d49b9"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jul 04 01:30:29 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 03 21:14:55 2025 -0700"
      },
      "message": "sketch/loop: add PortMonitor for TCP port monitoring with Agent integration\n\nAdd PortMonitor struct that uses Tailscale portlist library to monitor\nopen/listening TCP ports and send AgentMessage notifications to Agent\nwhen ports are opened or closed, with cached port list access method.\n\nWhen I asked Sketch to do this with the old implementation, it did\nok parsing /proc, but then it tried to conver it to ss format...\nusing a library seems to work ok!\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8fc57de4b5583d34k\n"
    },
    {
      "commit": "da623b50da804963768d2633cb2686a9d91d49b9",
      "tree": "74b03bb5091e12162088e77ef4e32fba91412821",
      "parents": [
        "2153f8b8eeb9215ed4b79af3aef09de1af83decd"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri Jul 04 01:12:38 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 03 20:57:50 2025 -0700"
      },
      "message": "remove port monitoring and automatic tunneling features\n\nRemove port_monitor, TunnelManager, and /port-events handler to eliminate\nautomatic port tunneling functionality that bridges outtie to innie environments.\n\nSketch got confused when I asked it to change how this works; removing\nand re-adding was easier!\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s78f868b27a44cb2bk\n"
    },
    {
      "commit": "2153f8b8eeb9215ed4b79af3aef09de1af83decd",
      "tree": "b70e3002b8ce62950ab07ec004b8922bb776e59a",
      "parents": [
        "f6e1dfe8ea4069d9180abf71c64b9d5ff4b172e0"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Jul 04 02:41:20 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Jul 03 20:37:51 2025 -0700"
      },
      "message": "termui: add terminal title updates based on sketch slug\n\nInspired by a conversation with anutron.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sdc02f5e60c8356b6k\n"
    },
    {
      "commit": "f6e1dfe8ea4069d9180abf71c64b9d5ff4b172e0",
      "tree": "eb57c7c5e3c9e1fee2fd3c781597c2f50730c25c",
      "parents": [
        "e1c8b7bedc96d182916d5e1b9a07913945ffbafb"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 03 14:59:40 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 03 22:00:37 2025 +0000"
      },
      "message": "webui rm shadowRoot references\n"
    },
    {
      "commit": "e1c8b7bedc96d182916d5e1b9a07913945ffbafb",
      "tree": "f41e7f56daac66b7315c7fba2d52e97e2381449a",
      "parents": [
        "c37e066371997d221af074b0bc1da392c82c6a2b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 03 14:50:26 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Thu Jul 03 14:51:40 2025 -0700"
      },
      "message": "move git config from Dockerfile to agent.go Init() method\n\nMove git configuration (user.email, user.name, http.postBuffer) from\nDockerfile creation to runtime initialization in agent.go Init() method.\n\nI want to make the layering for Docker images as simple as possible.\nThe git configuration here can be harmlessly done once sketch starts,\nsince it\u0027s a vew simple git operations.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s04b2af644e2dbe4fk\n"
    },
    {
      "commit": "c37e066371997d221af074b0bc1da392c82c6a2b",
      "tree": "b352de3edf0227f002aaa0ab674aea4feaed76fa",
      "parents": [
        "df23403824257c1201f64f865eaf169ceef45c3d"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 03 08:46:21 2025 -0700"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 03 16:25:09 2025 +0000"
      },
      "message": "sketch-container-status:latest context window size\n"
    },
    {
      "commit": "df23403824257c1201f64f865eaf169ceef45c3d",
      "tree": "43738cf871ad223fd872ef247b12c90be293f36c",
      "parents": [
        "32969cde983b415a2ef95ccf8a8f798acfa70870"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 02 20:45:29 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 02 20:45:48 2025 -0700"
      },
      "message": "fix https://github.com/boldsoftware/sketch/issues/186\n"
    },
    {
      "commit": "32969cde983b415a2ef95ccf8a8f798acfa70870",
      "tree": "9ac42989bb2defa11f4fc639be64b78bc4af6b83",
      "parents": [
        "4844be2a83915a9041c1c3c2a8882cee8c5f2be4"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 03 03:25:25 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 03 03:25:25 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "4844be2a83915a9041c1c3c2a8882cee8c5f2be4",
      "tree": "3cee7b1035b037f34140856ec69346764b2f3968",
      "parents": [
        "882b1d12f097997164523af4947954781ccfce09"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 03 00:32:55 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 02 20:23:28 2025 -0700"
      },
      "message": "webui: convert sketch-terminal to SketchTailwindElement inheritance\n\nConvert sketch-terminal component from LitElement to SketchTailwindElement inheritance\nto disable shadow DOM and enable consistent Tailwind utility class usage across the\nwebui component library.\n\nInheritance Change:\n- Replace LitElement with SketchTailwindElement as base class\n- Remove CSS-in-JS static styles in favor of Tailwind utility classes\n- Switch from shadow DOM to light DOM rendering for better Tailwind integration\n\nCSS to Tailwind Conversion:\n- Terminal view container: w-full bg-gray-100 rounded-lg overflow-hidden mb-5 shadow-md p-4\n- Terminal container: w-full h-full overflow-hidden\n- Maintain 70vh height using inline style for specific viewport requirement\n- Remove static CSS definitions while preserving visual appearance\n\nDOM Query Updates:\n- Change renderRoot.querySelector to this.querySelector for light DOM compatibility\n- Update CSS loading from shadow DOM injection to global document head injection\n- Rename loadXtermlCSS to loadXtermCSS for consistency\n\nTechnical Implementation:\n- Preserve all terminal functionality: xterm.js integration, SSE connections, resize handling\n- Maintain event listeners for view mode changes and window resize events\n- Keep terminal input queue processing and WebSocket communication intact\n- Update xterm CSS loading to work with light DOM architecture\n\nThe conversion enables the terminal component to benefit from global Tailwind\nstyles while maintaining all existing terminal emulation functionality and\nserver communication features.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s853becde7eccb88ck\n"
    },
    {
      "commit": "882b1d12f097997164523af4947954781ccfce09",
      "tree": "8fa6a114b37860f149e12a2f530433e4e7c68ba5",
      "parents": [
        "983b58aceb758e480fc3fede42d21d06ee1de521"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 02 20:04:08 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 02 20:04:08 2025 -0700"
      },
      "message": "Waxing lyrically in a TODO about avoding the repo layer.\n"
    },
    {
      "commit": "983b58aceb758e480fc3fede42d21d06ee1de521",
      "tree": "4d219db8d5a580f4df91bac61f90617376a8f6df",
      "parents": [
        "2ca1f10615ed3dede0c5f0bfe9a67c7d9e179794"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 02 19:42:08 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Jul 02 19:42:08 2025 -0700"
      },
      "message": "Re-work Sketch\u0027s Docker setup.\n\nWe were being fancy and creating Dockerfiles for folks. This sometimes\nworked, but quite often didn\u0027t.\n\nInstead, we you have -base-image and -force-rebuild-container, and the\n\"cache key\" for images is just the base image and the working dir.\n\nThe layer cake is\n\n  (base image)\n  (customization) [optional]\n  (repo) [/app]\n"
    },
    {
      "commit": "2ca1f10615ed3dede0c5f0bfe9a67c7d9e179794",
      "tree": "7686e7dac2432c64b3ee8b324191536186c8723a",
      "parents": [
        "7b00c2c73c6e01a56134b6c18ae9ff67a0a81984"
      ],
      "author": {
        "name": "philip.zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Jul 02 22:17:00 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Jul 02 19:25:13 2025 -0700"
      },
      "message": "dockerimg: add commonly requested packages to Dockerfile.base and enable :latest tagging\n\nAdd commonly requested packages to the Sketch Docker base image based on user installation\npatterns, and update pushdockerimg.go to also tag images with :latest for easier access.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sd9eedb6795403819k\n"
    },
    {
      "commit": "7b00c2c73c6e01a56134b6c18ae9ff67a0a81984",
      "tree": "5641b07feafa24ebb86219cd216fea276580782e",
      "parents": [
        "9f5cb2e25bb67ca67e5b8f5133452069b2ea709d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 02 12:24:30 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 02 17:42:15 2025 -0700"
      },
      "message": "all: add minimal GoReleaser configuration for nightly builds\n\nThis is step one of many towards automated nightly releases.\n\nThis gets us downloadable binaries, which can be grabbed manually\nfrom GitHub Releases...in theory, since this is untested,\nbecause GitHub Actions.\n\nOnce this is working, future steps include:\n\n- documentation\n- homebrew support (and other package managers?)\n- auto-updates\n- installers\n- blah blah blah\n\n"
    },
    {
      "commit": "9f5cb2e25bb67ca67e5b8f5133452069b2ea709d",
      "tree": "ee1f1b4e553a49303a5176ae6ab1fdec61213d6d",
      "parents": [
        "5450584a3e83904406aef4f1f8cfaa6b7de66268"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 03 00:25:35 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Thu Jul 03 00:25:35 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "5450584a3e83904406aef4f1f8cfaa6b7de66268",
      "tree": "9eb466e6188a6b3279eadd1a924cad9069ee803c",
      "parents": [
        "9556fcf116434d39a351e5bebe4e7f772ea440d8"
      ],
      "author": {
        "name": "banksean",
        "email": "banksean@gmail.com",
        "time": "Thu Jul 03 00:18:44 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Jul 02 17:24:38 2025 -0700"
      },
      "message": "webui: convert sketch diff components to inherit from SketchTailwindElement\n\nConvert SketchDiffEmptyView and SketchDiff2View components from LitElement\nto SketchTailwindElement inheritance pattern to enable proper Tailwind CSS\nintegration across the diff view system.\n\nComponents Converted:\n- sketch-diff-empty-view: Simple empty state component with help text\n- sketch-diff2-view: Complex Monaco editor-based diff viewer with file management\n\nSketchDiffEmptyView Changes:\n- Updated imports: removed css, LitElement; added SketchTailwindElement\n- Changed class inheritance from LitElement to SketchTailwindElement\n- Removed static styles CSS block entirely\n- Converted custom CSS to Tailwind classes:\n  - Container: flex flex-col items-center justify-center h-full w-full box-border\n  - Content box: m-8 mx-auto max-w-4xl w-11/12 p-8 border-2 border-gray-300 rounded-lg shadow-sm bg-white text-center\n  - Typography: text-2xl font-semibold mb-6 text-center text-gray-800\n  - Body text: text-gray-600 leading-relaxed text-base text-left mb-4\n  - Strong emphasis: font-semibold text-gray-800\n\nSketchDiff2View Changes:\n- Updated imports: removed css, LitElement; added SketchTailwindElement\n- Changed class inheritance from LitElement to SketchTailwindElement\n- Removed extensive static styles CSS block (280+ lines)\n- Preserved Monaco editor integration, scrollbar hiding, and dynamic height handling\n- Maintained all complex diff view functionality and state management\n\nCSS-to-Tailwind Mapping for SketchDiff2View:\n- Host container: flex h-full flex-1 flex-col min-h-0 overflow-hidden relative\n- Controls section: px-4 py-2 border-b border-gray-300 bg-gray-100 flex-shrink-0\n- File selector: min-w-[200px] px-3 py-2 border border-gray-400 rounded bg-white\n- Diff container: flex-1 overflow-auto flex flex-col min-h-0 relative h-full\n- File sections: flex flex-col border-b-4 border-gray-300 mb-0 last:border-b-0\n- File headers: bg-gray-100 border-b border-gray-300 px-4 py-2 sticky top-0 z-10\n- Monaco editors: flex flex-col w-full min-h-[200px] flex-1\n\nFile Status Badge System:\n- Added: bg-green-100 text-green-800 (green status badge)\n- Modified: bg-yellow-100 text-yellow-800 (yellow status badge)\n- Deleted: bg-red-100 text-red-800 (red status badge)\n- Renamed: bg-cyan-100 text-cyan-800 (cyan status badge)\n- Copied: bg-indigo-100 text-indigo-800 (indigo status badge)\n- Status badges: inline-block px-1.5 py-0.5 rounded text-xs font-bold mr-2\n\nInteractive Elements:\n- Expand/collapse buttons: bg-transparent border border-gray-300 rounded px-2 py-1\n- Button hover states: hover:bg-gray-200 with transition-colors duration-200\n- File paths: font-mono font-normal text-gray-600 for monospace display\n- Loading states: flex items-center justify-center h-full for centered display\n- Error states: text-red-600 p-4 for consistent error styling\n\nMethods Updated in SketchDiff2View:\n- render(): Main component layout with Tailwind flexbox containers\n- renderFileSelector(): File dropdown with focus states and disabled styling\n- renderDiffContent(): Content routing with loading/error/empty state styling\n- renderFileDiff(): Individual file diff sections with proper Monaco integration\n- renderFileHeader(): File header with status badges and expand/collapse controls\n- renderSingleFileExpandButton(): Header expand button with consistent styling\n- renderSingleFileView(): Full-screen single file view with proper layout\n- getFileStatusTailwindClasses(): New method mapping file status to Tailwind classes\n\nPreserved Complex Functionality:\n- Monaco editor height change handling and dynamic container sizing\n- Comment forwarding from Monaco editor to chat input system\n- File save operations with proper success/error notification\n- File expansion state management for show/hide unchanged regions\n- Range picker integration with commit selection and diff reloading\n- Single/multi file view mode switching with proper layout adaptation\n- Custom Monaco scrollbar hiding through global style injection\n- All git service integration for diff data loading and file content retrieval\n- Sticky file headers with proper z-index stacking for navigation\n- Dynamic Monaco editor height adjustment with container synchronization\n- Responsive file selector and range picker layout with flexible spacing\n\nBoth components now integrate properly with the project\u0027s Tailwind CSS\nstyling system by disabling shadow DOM while maintaining complete visual\nand functional parity with their original LitElement implementations.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s92d5cf7de96afe2ck\n"
    },
    {
      "commit": "9556fcf116434d39a351e5bebe4e7f772ea440d8",
      "tree": "ccd40cd404008c1c62547c1c6dcc6671cbbd380d",
      "parents": [
        "6534c7a6c4a10f8a9660835e2f0d8c27101bcd34"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 02 22:48:51 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Jul 02 22:48:51 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "6534c7a6c4a10f8a9660835e2f0d8c27101bcd34",
      "tree": "606cf93a234df729dcec223737b1e8f2d2ade8de",
      "parents": [
        "238c18f42ca7d7c795b3ba2ffe0049635ef7dbae"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 01 01:48:52 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 02 15:48:16 2025 -0700"
      },
      "message": "sketch: add patch callback hook to warm codereview cache\n\nWhen the agent patches a file, concurrently pre-compile test binaries\nin the background to speed up future codereview runs.\n\nThis helps make codereview runs faster without\npre-flighting everything in the whole repository.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s2a01805b644342f9k\n"
    },
    {
      "commit": "238c18f42ca7d7c795b3ba2ffe0049635ef7dbae",
      "tree": "c51dbe837f297ab2022f83fa454f3c861bdbc079",
      "parents": [
        "26b6f9ba1a9647f7f0b0983f8d640b2d81789f5d"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jun 30 22:26:54 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 02 15:48:16 2025 -0700"
      },
      "message": "claudetool: add callback hook system to patch tool\n\nWe\u0027ll use this to improve non-root guidance file usage\nand to warm up the codereview Go build cache.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s01ff6f94febc4485k\n"
    },
    {
      "commit": "26b6f9ba1a9647f7f0b0983f8d640b2d81789f5d",
      "tree": "0aca1555e9f221a43b5190f144d6b10e487569e3",
      "parents": [
        "cb5572629b5f7ea9182e5c9f32a14dc8c5a563e4"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 01 01:41:11 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 02 15:48:16 2025 -0700"
      },
      "message": "claudetool/codereview: add caching in findRelatedFiles\n\nPrimary goal is latency reduction.\nAlso slightly reduces context usage.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sa1007d82a5165ab4k\n"
    },
    {
      "commit": "cb5572629b5f7ea9182e5c9f32a14dc8c5a563e4",
      "tree": "edeec332686af45a971fa543a7f90772cd3b9162",
      "parents": [
        "b3aff885a06ca0bbdfb2f61c94387789355a14c1"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Jun 30 23:55:20 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 02 15:48:16 2025 -0700"
      },
      "message": "browse: refactor tool responses to match claudetool patterns\n\nThis was vibe-coded, but the vibe was wrong.\nMake it look like the rest of the code,\nwhich will ease upcoming refactoring work.\nSwitch from JSON to XML-ish for textual tool outputs.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se50bf57009dfd97ak\n"
    },
    {
      "commit": "b3aff885a06ca0bbdfb2f61c94387789355a14c1",
      "tree": "cfab200942eb9718f5e2a8269a9b40180bcda81e",
      "parents": [
        "cdb08a546baf90b43f266b77dfa98bb35d978e5a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Jul 01 02:17:27 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 02 15:48:16 2025 -0700"
      },
      "message": "webui: display file copy status (vs modify/rename) in diff view\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: s8e76980f4dd17de3k\n"
    }
  ],
  "next": "cdb08a546baf90b43f266b77dfa98bb35d978e5a"
}
