Claude Fable 5 autonomously builds screenshot and diagnostic tools to debug a UI glitch
The post describes how Claude Fable 5, given only a screenshot and a vague instruction to investigate a horizontal scrollbar bug, independently devised a multi-step chain of browser automation, screenshot capture, template patching, and a custom CORS server — all without being explicitly told to do any of it.
Score breakdown
The episode illustrates that Claude Fable 5 will autonomously chain together novel, multi-step tooling — screenshot capture, source-code patching, and a local server — to accomplish a goal, going well beyond the literal scope of its instructions.
- 01Claude Fable 5 was given only a screenshot and told to 'look at dependencies' to investigate a horizontal scrollbar bug.
- 02Without further instruction, Fable opened browser windows (Firefox, then Safari) on the host machine.
- 03Fable used `pyobjc-framework-Quartz` to enumerate open windows, filter by name, and capture screenshots via the `screencapture` CLI using integer window IDs.
The post describes a debugging session with Claude Fable 5 inside a `datasette-agent` checkout. The only instruction given was to look at dependencies to investigate a horizontal scrollbar appearing in a jump-menu chat prompt. After the author stepped away, Fable had already begun opening browser windows on the host machine — first Firefox, then Safari — without any explicit browser-automation instruction.
To take screenshots, Fable wrote Python code using `pyobjc-framework-Quartz` to iterate through all open windows, filter for Safari windows whose names contained expected strings like "textarea", retrieve their integer window IDs (e.g., `153551`), and then invoke the `screencapture` CLI as `screencapture -x -o -l 153551 /tmp/safari-cases.png`. To trigger the modal dialog under test — normally only reachable via a click or keyboard shortcut — Fable edited Datasette's own templates to inject a `load` event listener that dispatches a simulated `/` keydown event after a 1,200 ms delay. Finally, to run JavaScript measurements on the live page, Fable wrote a minimal Python HTTP server using the standard library `http.server` package, listening on `127.0.0.1:9999`, that accepted POST requests and wrote the body to `/tmp/diag.json`, with CORS headers set to allow cross-origin requests from the test page.
The post frames all of this as illustrative of Fable's character: it "knows a whole lot of tricks and it will deploy pretty much any of them to get to its goal," assembling an improvised toolchain — screenshot capture, template injection, a local diagnostic server — entirely on its own initiative.
Key facts
- 01Claude Fable 5 was given only a screenshot and told to 'look at dependencies' to investigate a horizontal scrollbar bug.
- 02Without further instruction, Fable opened browser windows (Firefox, then Safari) on the host machine.
- 03Fable used `pyobjc-framework-Quartz` to enumerate open windows, filter by name, and capture screenshots via the `screencapture` CLI using integer window IDs.
- 04To trigger a modal dialog only reachable via keyboard shortcut, Fable patched Datasette's own templates to inject a JavaScript `load` listener that dispatches a simulated `/` keydown after 1,200 ms.
- 05Fable wrote a custom Python HTTP server using `http.server` on port 9999 to receive diagnostic JSON POSTed from the test page via CORS.
- 06The post describes this behavior as 'relentlessly proactive' — deploying a wide range of self-devised techniques to reach its goal.
Topics
Summary and scoring are generated automatically from the original article. We always link back to the publisher and never republish images or paywalled content. Last processed Jun 12, 2026 · 10:05 UTC. How this works →