<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Tris Sherliker</title>
  <subtitle>IP, technology &amp;#x26; commercial law</subtitle>
  <link href="https://sherliker.net/feed.xml" rel="self"/>
  <link href="https://sherliker.net"/>
  <updated>2026-05-09T00:00:00Z</updated>
  <id>https://sherliker.net</id>
  <author>
    <name>Tris Sherliker</name>
    <email>tris@sherliker.net</email>
  </author>
  
  <entry>
    <title>undefined</title>
    <link href="https://sherliker.net/blog/red-lines/"/>
    <updated>2025-11-02T00:00:00Z</updated>
    <id>https://sherliker.net/blog/red-lines/</id>
    <content type="html">&lt;section&gt;&lt;div class=&quot;epigraph&quot;&gt;
  &lt;blockquote&gt;
    &lt;p&gt;Ignorance more frequently begets confidence than does knowledge.&lt;/p&gt;
    &lt;footer&gt;Charles Darwin&lt;/footer&gt;
  &lt;/blockquote&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;I had a negotiation&lt;/span&gt; a while ago which very nearly derailed itself. I keep thinking back to what happened and what it tells me as a lawyer and a person. As lawyers, we’re usually advocating other people’s views. Our business is representing other people’s business, but sometimes it can be hard to keep track.&lt;/p&gt;
&lt;p&gt;This was the settlement stage of a long-running dispute. The contract had gone back and forth several times, resulting in layered redline.&lt;label for=&quot;md-however-a-case&quot; class=&quot;margin-toggle &quot;&gt;&amp;#8853;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;md-however-a-case&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;marginnote&quot;&gt;However a case begins, almost all of them end with drafting tweaks on an A4-shaped MSWord document trying to untangle the redline.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;Redline-swapping&lt;/span&gt; is a nightmare if you don’t keep good track of your versioning, because it all blends together unless you take time to check the metadata for each revision. Worse, most law firms automatically strip out the metadata of all sent attachments out of caution, so it becomes verbal soup.&lt;label for=&quot;md-version-control-was&quot; class=&quot;margin-toggle &quot;&gt;&amp;#8853;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;md-version-control-was&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;marginnote&quot;&gt;Version control was solved in software decades ago but it’s harder in law because (a) most lawyers are allergic to plain text and (b) it’s much, much easier to version collaboratively than it is when you’re adversarial.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;In this case,&lt;/span&gt; we thought we were at the end. We’d decided to accept some of the less reasonable requests from the other side just to get the deal done, so we expected to be getting a signature back quickly. Couldn’t work out why it took so long to hear back. After chasing, we got another tangled version of the agreement, with comments this time:&lt;/p&gt;
&lt;p&gt;The guy on the other side had clearly taken against some of the wording and committed &lt;em&gt;several paragraphs&lt;/em&gt; in the margin to explain why it was blocking the deal, how unreasonable it was, and what awful people we were for having it in the draft in the first place.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;A quick phonecall&lt;/span&gt; was enough to remind him that the wording came from his client, and we agreed with him. The deal was done within the day.&lt;/p&gt;
&lt;/section&gt;</content>
  </entry>
  
  <entry>
    <title>undefined</title>
    <link href="https://sherliker.net/blog/putting-scripts-into-dollarpath/"/>
    <updated>2026-03-22T00:00:00Z</updated>
    <id>https://sherliker.net/blog/putting-scripts-into-dollarpath/</id>
    <content type="html">&lt;section&gt;&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;Whenever I find myself doing a task for a third&lt;/span&gt; time, it’s probably going to come up again and probably worth writing a script to get it done faster when it does. This is a pretty common habit far from unique, but mine were beginning to get out of hand so I was interested to see &lt;a href=&quot;https://evanhahn.com/why-alias-is-my-last-resort-for-aliases/&quot;&gt;Evan Hahn’s post&lt;/a&gt; about handling the cutter.&lt;/p&gt;&lt;h3 id=&quot;ditching-aliases&quot;&gt;Ditching aliases&lt;/h3&gt;&lt;p&gt;Instead of using aliases in &lt;code&gt;bashrc&lt;/code&gt; (or in my case usually &lt;code&gt;config.fish&lt;/code&gt;) for execution, Evan recommends adding basic scripts to a directory. You can then put that directory in your PATH &lt;label for=&quot;sd-the-usdpath-is-the&quot; class=&quot;margin-toggle sidenote-number&quot;&gt;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;sd-the-usdpath-is-the&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;sidenote&quot;&gt;The $PATH is the list of places where your system looks to find commands it’s being executed. This is different to the common (lowercase) “file path” showing where a file is found.&lt;/span&gt; and have the script execute right from your shell, while the directory is version controlled. &lt;/p&gt;&lt;p&gt;The effect is like a personal multitool that’s ready whenever you need it. Maybe obvious in hindsight but quite powerful in practice. &lt;a href=&quot;https://jvns.ca/blog/2025/02/13/how-to-add-a-directory-to-your-path/&quot;&gt;Julia Evans also explains&lt;/a&gt; how to do this in a very clear way, covering lots of different cases.&lt;/p&gt;&lt;p&gt;I found the idea compelling and started using it straight away.&lt;/p&gt;&lt;h3 id=&quot;doing-the-thing&quot;&gt;Doing the thing&lt;/h3&gt;&lt;p&gt;I use fish shell (because it &lt;a href=&quot;https://shkspr.mobi/blog/2021/06/what-do-you-call-open-source-software-that-just-works/&quot;&gt;just works&lt;/a&gt;), so I can use the handy “do what you mean” built-in&lt;label for=&quot;sd-although-julia-evans&quot; class=&quot;margin-toggle sidenote-number&quot;&gt;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;sd-although-julia-evans&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;sidenote&quot;&gt;Although Julia Evans &lt;a href=&quot;https://jvns.ca/blog/2025/02/13/how-to-add-a-directory-to-your-path/#a-note-on-fish-add-path&quot;&gt;warns against this&lt;/a&gt; for a couple of reasons, including that it’s hard to undo.&lt;/span&gt; to do this:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;~&gt; fish_add_path (realpath ./script-path)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The (realpath …) function in the snippet above will be replaced by the full directory path. That will then be added to the PATH.&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;symlinks-is-always-the-answer&quot;&gt;“Symlinks” is always the answer&lt;/h2&gt;&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;One tweak&lt;/span&gt; to the setup I use is to have two folders:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/.../scripts&lt;/code&gt; for the scripts themselves, which is version controlled and&lt;/li&gt;
&lt;li&gt;a subdirectory &lt;code&gt;/.../scripts/script-path&lt;/code&gt;, which goes into the PATH.&lt;/li&gt;
&lt;/ul&gt;&lt;figure class=&quot;marginfigure&quot;&gt; &lt;label for=&quot;mf-tree&quot; class=&quot;margin-toggle&quot;&gt;⊕&lt;/label&gt;
&lt;input type=&quot;checkbox&quot; id=&quot;mf-tree&quot; class=&quot;margin-toggle&quot; /&gt;
&lt;span class=&quot;marginnote&quot;&gt;
&lt;code&gt;scripts/&lt;br /&gt;├── myscript.sh&lt;br /&gt;├── .gitignore&lt;br /&gt;└── script-path/&lt;br /&gt;    └── myscript&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;
&lt;code&gt;script-path/&lt;/code&gt; is gitignored and goes on $PATH; the scripts themselves stay under version control in the parent directory.
&lt;/span&gt;&lt;/figure&gt;&lt;p&gt;I can then use git to track the version control in the &lt;code&gt;scripts&lt;/code&gt; directory, without needing to have a git history in my PATH (which feels like it could go wrong). So:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;/.../scripts ~&gt; mkdir script-path
/.../scripts ~&gt; git init
/.../scripts ~&gt; echo &quot;script-path/&quot; &gt;&gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;All that remains is to add the scripts themselves to the subdirectory. Rather than making copies of the various scripts, symlinks do the job cleanly. This way even when I update the main files, the symlinks still point where I want them to, and the files themselves remain under version control. Add scripts one at a time&lt;label for=&quot;sd-the-first-time-i-did&quot; class=&quot;margin-toggle sidenote-number&quot;&gt;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;sd-the-first-time-i-did&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;sidenote&quot;&gt;The first time, I did it in bulk. All my existing scripts were named with a .sh extension so in fish: &lt;code&gt;~&gt; for sh_file in *.sh; set filename_without_extension (string split -r -m1 . $sh_file); ln -s (realpath $sh_file) ./script-path/$filename_without_extension; end&lt;/code&gt;&lt;/span&gt; with:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ln -s (realpath ./scripts/myscript.sh) ./script-path/myscript
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And don’t forget to give all the script files executable permission with &lt;code&gt;chmod +x filename.sh&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;
</content>
  </entry>
  
  <entry>
    <title>undefined</title>
    <link href="https://sherliker.net/blog/when-was-a-webpage-modified/"/>
    <updated>2026-05-02T00:00:00Z</updated>
    <id>https://sherliker.net/blog/when-was-a-webpage-modified/</id>
    <content type="html">&lt;section&gt;&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;Working out the date&lt;/span&gt; of a web page can be useful (especially for prior art in patent cases, and for evidence in litigation), but it can also be difficult. Most of the time a useful page has a date on it of some kind which may be reliable. For others the &lt;a href=&quot;https://archive.org/&quot;&gt;Wayback Machine&lt;/a&gt; helps perhaps about half the time but it hasn’t got perfect coverage. There’s another tool that can sometimes&lt;label for=&quot;sd-this-is-mainly&quot; class=&quot;margin-toggle sidenote-number&quot;&gt;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;sd-this-is-mainly&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;sidenote&quot;&gt;This is mainly directed to static web content, i.e. content stored as files on a server. A lot of web content is generated dynamically and isn’t stored as files in the same way.&lt;/span&gt; help fill the gap.&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;the-last-modified-header&quot;&gt;The Last-Modified header&lt;/h2&gt;&lt;p&gt;When you save or edit a file on your computer, the system logs a “last modified” timestamp recording the change. This is also true for a lot of web content. &lt;/p&gt;&lt;p&gt;When your browser requests a page online, it sends an HTTP &lt;code&gt;request&lt;/code&gt; and the server’s response includes a set of HTTP &lt;code&gt;headers&lt;/code&gt;, with extra information alongside the web content itself. This often includes a &lt;code&gt;Last-Modified&lt;/code&gt; header, a time and date stamp recording when the content was last changed on the server. The &lt;code&gt;Last-Modified&lt;/code&gt; header is used by web systems to detect whether something has changed since it was last fetched (e.g. for caching and archiving), but it is useful evidence of modification or publication date. &lt;/p&gt;&lt;p&gt;A response containing one looks like this:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Last-Modified: Tue, 15 Oct 2024 09:32:00 GMT
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It isn’t always reliable and there are lots of reasons that a webpage’s date might show as more recent than it in fact is. Some servers set it accurately, others might be generating content dynamically at the server and set it to the current date and time; or it might record the last time the server’s cache was refreshed. But it’s a useful point of information, and usually broadly reliable in the same way as other computer timestamp information.&lt;/p&gt;&lt;h3 id=&quot;checking-for-last-modified-timestamps&quot;&gt;Checking for Last-Modified Timestamps&lt;/h3&gt;&lt;p&gt;To view in Chrome: &lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Go the web page you’re interested in.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;F12&lt;/code&gt;, opening the developer tools console. This allows viewing the normally-hidden metadata.&lt;/li&gt;
&lt;li&gt;Choose the “Network” tab in the console. &lt;/li&gt;
&lt;li&gt;Refresh the page (pressing &lt;code&gt;F5&lt;/code&gt;), so the console can record the request and response traffic.&lt;/li&gt;
&lt;li&gt;There will often be several files loaded (the web page itself; images; scripts etc): click on the one you’re interested in.&lt;/li&gt;
&lt;li&gt;Look for the &lt;code&gt;Last-Modified&lt;/code&gt; header. &lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Here’s an example for &lt;a href=&quot;http://landley.net/history/mirror/collate/aa080499b.htm&quot;&gt;http://landley.net/history/mirror/collate/aa080499b.htm&lt;/a&gt;, which shows that the page was &lt;code&gt;last-modified Tue, 28 May 2002 18:51:09 GMT&lt;/code&gt;&lt;/p&gt;&lt;p&gt;![lastmod-0.png]&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;the-wayback-machine&quot;&gt;The Wayback Machine&lt;/h2&gt;&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;When the Internet Archive’s Wayback Machine&lt;/span&gt; snapshots pages it also preserves the HTTP headers that it saw at the time (i.e. those which accompanied the original response to the Archive, at the time when it retrieved the page in question). This is labelled with &lt;code&gt;X-Archive-Orig-&lt;/code&gt; or &lt;code&gt;X-Orig-&lt;/code&gt; prefix for example:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;X-Archive-Orig-Last-Modified: Tue, 15 Oct 2024 09:32:00 GMT
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To find these, load the archived version of the page on &lt;code&gt;web.archive.org&lt;/code&gt;, then open DevTools and inspect the response headers as above. Look for any header beginning &lt;code&gt;X-Archive-Orig-&lt;/code&gt;. This can help to establish a sequence of edits (or that there were no edits) between snapshot date and the present.&lt;/p&gt;&lt;/section&gt;
</content>
  </entry>
  
  <entry>
    <title>undefined</title>
    <link href="https://sherliker.net/blog/vibecoding-a-simple-feature-with-claude/"/>
    <updated>2026-05-09T00:00:00Z</updated>
    <id>https://sherliker.net/blog/vibecoding-a-simple-feature-with-claude/</id>
    <content type="html">&lt;section&gt;&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;My side project&lt;/span&gt; has been entirely handcoded in the backend, until today. I’ve used Claude Code a great deal for frontend work — I am no web designer — but I’ve tended my backend carefully with my own hands.&lt;label for=&quot;sd-in-fact-using-my&quot; class=&quot;margin-toggle sidenote-number&quot;&gt;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;sd-in-fact-using-my&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;sidenote&quot;&gt;In fact using my hands is part of the point, being effective rehab while recovering from an injury.&lt;/span&gt; Today I decided to break that habit and try adding a feature using Claude to generate all the code edits.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://buntool.co.uk/&quot;&gt;BunTool&lt;/a&gt; (&lt;a href=&quot;https://github.com/TrisSherliker/buntool-website-git&quot;&gt;git&lt;/a&gt;) is for making PDF bundles for use in court and legal settings, and one feature requested by a colleague (who absolutely knows what she is talking about and should be listened to) was the ability to add a custom coversheet. That’s a great test case, because the feature is easy to conceptualise and express, it touches multiple points in the bundle-making pipeline from frontend to output, and because I can hold the logic in my head from beginning to end for checking purposes.&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;framework&quot;&gt;Framework&lt;/h2&gt;&lt;p&gt;Also a good chance to test a new (to me) &lt;code&gt;claude.md&lt;/code&gt; variant. I heard from a friend today that &lt;a href=&quot;https://github.com/forrestchang/andrej-karpathy-skills&quot;&gt;Forrest Chang’s Karpathy-Inspired Claude Code Guidelines&lt;/a&gt; was useful&lt;label for=&quot;sd-described-as-less&quot; class=&quot;margin-toggle sidenote-number&quot;&gt;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;sd-described-as-less&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;sidenote&quot;&gt;Described as &lt;em&gt;“A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy’s observations on LLM coding pitfalls.”&lt;/em&gt; I’ve used Claude enough in the past that I think I’ll be able to spot differences, though this is a slightly different exercise.&lt;/span&gt;, so installed it as a plugin before I got started. This was pretty easy using claude’s inline plugin management commands.&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;specifying&quot;&gt;Specifying&lt;/h2&gt;&lt;p&gt;I decided to work from a markdown checklist and iterate through the steps one by one, so started by planning out my spec for the feature: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;# Adding coversheet checklist

## Backend

- [ ] buntoolconfig.js - add bool option
- [ ] validate cover page function: check file = 1 page or extract first page, return first page
- [ ] Add validation call in buntoolMain.js
- [ ] at 3/11 in buntoolMain.js Creation of TOC entries, page numbers +1 if coversheet
- [ ] at 5/11 buntoolMain.js (generating TOC pages) page number needs to respect toc entries setting if coversheet present (just check carries through)
- [ ] After current step 7/11 buntoolMain.js (add new step before current step 8, after toc is merged), the result of the step7 merge should then be merged again with coversheet
- [ ] the abbreviated justtheeindex flow in buntoolMain.js should merge with coversheet


## frontend

- [ ] Button to add optional coversheet
- [ ] call validate function at point of upload (belt and braces)
- [ ] show selected filename
- [ ] clear/remove button
- [ ] error handling for invalid file
- [ ] submit logic to accommodate coversheet as parameter coversheetFile
- [ ] add mention in tutorial
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is spec’d by reference to the logic flow in my &lt;code&gt;buntoolMain.js&lt;/code&gt; main logic flow, but those steps in turn call out to various submodules.&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;step-by-step&quot;&gt;Step by step&lt;/h2&gt;&lt;p&gt;Setting Claude to ask-before-edits gave me peace of mind, and then I prompted it to follow stepwise (&quot;&lt;em&gt;ok let’s do the coversheet adding plan step by step. start with step 1: show me your proposed edits&lt;/em&gt;&quot;). Baby steps from the interface within VSCode:&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://sherliker.net/assets/claude-polite.png&quot; alt=&quot;Claude politely making edits without fluff&quot; /&gt;&lt;figcaption&gt;Claude politely making edits without fluff&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;And so it proceeded.&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;Overall it went very well.&lt;/span&gt; There were a few nits and irritations though:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Claude often used variable names which were fine in isolation but which were confusing in their overall context. For example &lt;code&gt;coversheetFile&lt;/code&gt; and &lt;code&gt;coversheetPDF&lt;/code&gt; were two different but closely connected things, one derived from the other, both the same type. I much preferred names that conveyed the functions - &lt;code&gt;coversheetFile&lt;/code&gt; and &lt;code&gt;validatedCoversheet&lt;/code&gt;. It would have been annoying to come back to maintain the confusing variables in future. &lt;/li&gt;
&lt;li&gt;Without Forrest Chang’s plugin Claude just loved haphazardly deleting my comments. I’m sure that some people would do the same, but I put them there for a reason! I found the plugin helped with this, suppressing unwanted edits.&lt;/li&gt;
&lt;li&gt;Although it had no respect for my comments, it seemed to find the logging prints unassailable. They count up stepwise in the main pipeline (&quot;step 4/11&quot; etc), so a &lt;code&gt;sed&lt;/code&gt; call or two was needed to update them globally as new pipeline steps were added.&lt;label for=&quot;sd-using-less-than-code&quot; class=&quot;margin-toggle sidenote-number&quot;&gt;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;sd-using-less-than-code&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;sidenote&quot;&gt;Using &lt;code&gt;sed&lt;/code&gt; is quite boring. Luckily Claude could also save me all the typing.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;In some cases it got the logical flow of steps out of order. That’s fine, this is why I monitor and could correct it. Somewhat sassily it reacted to that by amending my spec to hyperclarify… even after the edit was finished!&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;So I ended up being quite hands-on and I couldn’t surrender control entirely. Having said that, if I were using Claude for maintaining a lot of this wouldn’t matter a jot.&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;https://sherliker.net/assets/claude-check.png&quot; alt=&quot;I let the LLM have the satisfaction of checking things off its list, and it took the opportunity for some sassy backchat.&quot; /&gt;&lt;figcaption&gt;I let the LLM have the satisfaction of checking things off its list, and it took the opportunity for some sassy backchat.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;span class=&quot;newthought&quot;&gt;At one point while testing&lt;/span&gt; I found quite a subtle bug with hyperlinking, which took a while to solve because it seemed to be only intermittently reproducible&lt;label for=&quot;sd-a-sort-of-less-than&quot; class=&quot;margin-toggle sidenote-number&quot;&gt;&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;sd-a-sort-of-less-than&quot; class=&quot;margin-toggle&quot; /&gt;&lt;span class=&quot;sidenote&quot;&gt;a sort of &lt;a href=&quot;https://en.wikipedia.org/wiki/Heisenbug&quot;&gt;Heisenbug&lt;/a&gt;, since trying to debug it with my preferred PDF viewers (which give richer control than a browser viewer) led to a different experience.&lt;/span&gt;. This was very annoying but I eventually worked out that it was due to relying on undefined behaviour being handled in a certain way. This wasn’t Claude’s fault, but Claude confidently proposed a fix that broke things much more acutely. I fixed it by hand in the end.&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;overall&quot;&gt;Overall?&lt;/h2&gt;&lt;p&gt;But I didn’t get the most out of it because I’m apparently very stuffy about edits to my own handcoded work. It wasn’t quite as smooth as I hoped, but that was partly because I was so opinionated about how things should look that I tended to want to micromanage the result anyway. In the frontend I’m perfectly happy to deploy UI features via Claude.&lt;/p&gt;&lt;/section&gt;
</content>
  </entry>
</feed>
