<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://tommyaliff.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://tommyaliff.com/" rel="alternate" type="text/html" /><updated>2026-10-14T22:05:13+00:00</updated><id>https://tommyaliff.com/feed.xml</id><title type="html">Tommy Aliff</title><subtitle>Portfolio and blog of Tommy Aliff: data engineering, applied AI, and design.</subtitle><author><name>Tommy Aliff</name></author><entry><title type="html">11 Rules of Thumb From an ADHD Brain: Getting the Most Out of Claude Desktop</title><link href="https://tommyaliff.com/productivity/adhd-claude-rules-of-thumb/" rel="alternate" type="text/html" title="11 Rules of Thumb From an ADHD Brain: Getting the Most Out of Claude Desktop" /><published>2026-10-13T00:00:00+00:00</published><updated>2026-10-13T00:00:00+00:00</updated><id>https://tommyaliff.com/productivity/adhd-claude-rules-of-thumb</id><content type="html" xml:base="https://tommyaliff.com/productivity/adhd-claude-rules-of-thumb/"><![CDATA[<p class="notice--primary" style="margin-top:0">
  <strong>Listen instead (10 min)</strong>
  <audio controls="" preload="none" style="width:100%;margin-top:.5em" src="/assets/audio/adhd-claude-rules-of-thumb.mp3"></audio>
</p>

<p>I have ADHD. My problem has never been a shortage of ideas or effort. It’s holding a day together: what’s due, what I’m waiting on, and why I opened that tab twenty minutes ago.</p>

<p>So I use Claude as the scaffolding around my day. It isn’t a chatbot I visit now and then. It’s a system that remembers what’s going on, sorts what comes in, and asks me the right two questions at the end of the day. The point is to offload the work my prefrontal cortex struggles with: planning, sorting, remembering and choosing. That frees my attention for the work itself.</p>

<p>I like thinking about daily tasks in terms of heuristics (<em>heuristic</em> is just a fancy way of saying “rule of thumb.”) - I’m not just trying to sound smart (not <em>just</em> that, LOL). I believe it’s a good paradigm for someone with ADHD, like me: figure out what can be automated and free up the executive part of your mind for the difficult work. A heuristic is a mental shortcut that saves you from working a decision out from scratch every time. Here are eleven heuristics that make my work with Claude smooth and efficient.</p>

<p><em>(I work on a Mac. Most of these features exist on Windows too, but I can only vouch for the Mac.)</em></p>

<h2 id="part-1-build-the-scaffolding">Part 1: Build the scaffolding</h2>

<p><strong>1. Keep your brain in files, not in chats.</strong> A chat is a conversation, and conversations end. I keep one home document per area of my life inside a Claude Project: a Career Hub, a Personal Hub, a list of post ideas. Claude reads them at the start of a session and updates them at the end. If a chat closes or runs too long, nothing is lost.</p>

<p><strong>2. Open and close every day the same way.</strong> My day starts with three words, “start my day,” and ends with two: “wrap up.” Both are saved as skills. A skill is a set of instructions Claude follows the same way every time you call it, so the routine never drifts and starting doesn’t take willpower. For me, that consistency is the most important piece of the whole system. Here’s what’s inside mine:</p>

<ul>
  <li><strong>Start my day:</strong> check today’s calendar, sort the voice notes from my phone, scan email and messages, and tell me only what needs action today.</li>
  <li><strong>Wrap up:</strong> ask two questions. What got done today? What’s the plan for tomorrow? Anything that needs a decision gets flagged along the way, and then Claude updates the home files.</li>
</ul>

<p><strong>3. Plan around the attention you actually have.</strong> I get about five good hours a day. I don’t fight that; I schedule around it. The focus block goes on the calendar the night before. Inside it, the dull-but-necessary work comes first, and the thing I enjoy comes last as the reward. Errands go in the other half of the day. If I get work done outside the focus block, I consider it a bonus.</p>

<p><strong>4. Capture now, sort later.</strong> Ideas arrive at bad times. Claude is the default assistant on my phone, so a voice note lands in an inbox document in seconds. In a session, a line that starts with “IDEA:” gets filed and we go straight back to work. The next morning’s routine sorts the pile. Nothing gets lost, and nothing derails what I’m doing.</p>

<p><strong>5. Connect the tools you already use.</strong> Claude now reaches a lot of my world directly: calendar, email and documents through connectors, and websites through my Chrome browser. The browser integration has been the big change. I used to sit and wait while it checked one site at a time. Now it checks several in parallel, gets around them easily, and comes back fast with answers (and questions where appropriate; through its instructions, I encourage Claude to ask questions often). My morning check covers email, Facebook and LinkedIn in a matter of seconds without me opening a single tab (mind you, I’m no influencer, so the boxes are not always overflowing 🙃).</p>

<h2 id="part-2-talk-to-it-the-way-you-think">Part 2: Talk to it the way you think</h2>

<p><strong>6. Don’t tidy your messages.</strong> I think out loud. I have to say a thing before I understand it, and my messages come out as run-ons, especially from my phone. That’s fine. Dump it as it comes, then end with the actual question and say what you want back: a list, a draft, five lines. The more specific, the better. If I don’t know the specifics yet, I say that too, and we work them out together before Claude starts. One more habit that helps: a few words of framing. Is this a rule from now on, or just this once?</p>

<p><strong>7. Give feedback in three parts.</strong> What was wrong, what you wanted instead, and whether it’s a rule. “Too long, I skimmed it, give me five lines, always” is a complete piece of feedback. I continuously hone the routine in this way because it’s rarely ever going to be right at first.</p>

<p><strong>8. Say your ideas before it says its own.</strong> When I’m brainstorming, I dump everything first, Claude mirrors it back, and only then does it add its own ideas. If it suggests first, I anchor on its polished idea and my half-formed one is gone.</p>

<h2 id="part-3-protect-your-attention">Part 3: Protect your attention</h2>

<p><strong>9. Hide what isn’t due.</strong> A to-do list that shows everything is a wall, and I stop reading walls. My wrap-up shows only what got done, what needs a decision, and what’s due in the next few days. Everything else carries forward silently, and once a week we prune the full list. My “waiting on” list holds only real asks, like an approval or an answer, not every conversation I’m in.</p>

<p><strong>10. Hand off the admin, keep the judgment.</strong> Claude reads my email and calendar, keeps the logs, tracks the dates, and drafts the routine messages. It also makes the small calls that don’t matter much, like which section a paragraph belongs in, because making those costs me more than they’re worth. I make the decisions that matter. Anything that goes out under my name gets read by me first, sounds like me, and has to be true.</p>

<p><strong>11. Match the effort to the job.</strong> Most daily work runs fine on the default model and effort setting. I save the biggest model and the highest effort for the single hardest problem of the week, like a design decision or something that has to be exactly right. Running the heavy setting all day just burns through usage limits. Cheap mode for sorting, expensive mode for judgment.</p>

<h2 id="what-doesnt-work">What doesn’t work</h2>

<p>It isn’t magic, and pretending otherwise would undo the whole point.</p>

<ul>
  <li><strong>It can’t go everywhere.</strong> For everything in heuristic 5, there are still gaps. If I’m signed out of a site or haven’t granted it access, it can’t check there. The list of connectors has grown a lot, but my personal Microsoft Outlook account, for example, can’t be connected directly, so Claude goes through my browser instead. Some mornings the inbox check comes back half empty, and I look myself.</li>
  <li><strong>It will happily make your list longer.</strong> A good idea can quickly turn into a fully formulated task that has suddenly taken me off course of where my session was supposed to be going.</li>
  <li><strong>It can still get things wrong, or leave things out.</strong> Blatant made-up answers are less common than they used to be. The subtler problem is what’s missing: a detail it never had, or an answer built on information that has gone out of date, so I read everything before it goes out and tell it when something has changed.</li>
  <li><strong>Long chats run out of room.</strong> That’s why the files exist. When a chat gets long, the work is already saved, and a new chat picks up where it left off.</li>
</ul>

<h2 id="start-with-one-thing">Start with one thing</h2>

<p>Picking just one thing and starting on it is easier said than done with ADHD, so keep it small. Start with a home file and a wrap-up: one document that holds what’s going on, and the two questions from the top of this piece, asked at the end of every day. Everything else in my system grew from there. Save your wrap-up as a skill right away, even if it isn’t right yet. That’s the beauty of it: every time something doesn’t fit, tell Claude and it updates the skill.</p>

<p>Which one thing could you take off your plate?</p>]]></content><author><name>Tommy Aliff</name></author><category term="productivity" /><category term="adhd" /><category term="ai" /><category term="claude" /><category term="productivity" /><summary type="html"><![CDATA[How I use Claude as the scaffolding around my day: the eleven rules of thumb that make it work, and what still doesn't.]]></summary></entry><entry><title type="html">My One-Click Setup Broke, and the Upgrade Wasn’t the Problem</title><link href="https://tommyaliff.com/devops/pin-what-you-depend-on/" rel="alternate" type="text/html" title="My One-Click Setup Broke, and the Upgrade Wasn’t the Problem" /><published>2026-10-06T00:00:00+00:00</published><updated>2026-10-06T00:00:00+00:00</updated><id>https://tommyaliff.com/devops/pin-what-you-depend-on</id><content type="html" xml:base="https://tommyaliff.com/devops/pin-what-you-depend-on/"><![CDATA[<p>My one-click setup broke in the middle of an upgrade, and the upgrade wasn’t the problem.</p>

<p>I was moving the starter repo for my Airflow tutorials to Airflow 3. The repo runs in GitHub Codespaces, and partway through, Codespaces started booting straight into recovery mode. The culprit wasn’t Airflow. My devcontainer pulled <code class="language-plaintext highlighter-rouge">devcontainers/base:ubuntu</code>, a tag that isn’t pinned to a version. It had moved to Ubuntu 26.04, where the docker-in-docker feature couldn’t install.</p>

<p>The fix was one line: pin the image to <code class="language-plaintext highlighter-rouge">base:3-ubuntu24.04</code>.</p>

<p>It’s an old lesson that’s easy to forget. An unpinned tag means you’re running whatever someone else published last. That applies to base images, Python packages, and GitHub Actions alike.</p>

<p>Pin what you depend on, and upgrade on purpose.</p>

<p>Do you pin everything, or let some dependencies float? Where do you draw the line?</p>

<p><em>Originally posted on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7513214149087109120/">LinkedIn</a>.</em></p>]]></content><author><name>Tommy Aliff</name></author><category term="devops" /><category term="devops" /><category term="docker" /><category term="github codespaces" /><category term="data engineering" /><summary type="html"><![CDATA[An unpinned base image moved to a new Ubuntu release mid-upgrade. The fix was one line, and the lesson is an old one.]]></summary></entry><entry><title type="html">When a Retry Duplicates Half Your Table: Idempotent Loads in Airflow</title><link href="https://tommyaliff.com/data-engineering/idempotent-loads-airflow-retries/" rel="alternate" type="text/html" title="When a Retry Duplicates Half Your Table: Idempotent Loads in Airflow" /><published>2026-10-02T00:00:00+00:00</published><updated>2026-10-02T00:00:00+00:00</updated><id>https://tommyaliff.com/data-engineering/idempotent-loads-airflow-retries</id><content type="html" xml:base="https://tommyaliff.com/data-engineering/idempotent-loads-airflow-retries/"><![CDATA[<p>A pipeline fails near the end. Airflow retries it. The retry succeeds, the run turns green, and half the table is now in there twice.</p>

<p>Madhuri P. described this exact problem in a LinkedIn post: a job processed a million records, failed near the end, and created duplicate records on the retry. It’s the kind of failure that’s easy to describe and rarely demonstrated, so I turned it into a free, step-by-step tutorial on my Airflow 3 + Postgres starter repo. It reproduces the failure on a real stack and then fixes it two ways.</p>

<p>The word to know here is <strong>idempotency</strong>: a load that gives you the same result no matter how many times it runs. Retries are normal, so a pipeline has to be safe to run again.</p>

<p><strong>Fix A: primary key + <code class="language-plaintext highlighter-rouge">ON CONFLICT</code>.</strong> Give the target table a primary key and turn the insert into an upsert. The guarantee lives in the table and in every write.</p>

<p><strong>Fix B: staging + <code class="language-plaintext highlighter-rouge">MERGE</code>.</strong> Clear a staging table at the start of every attempt, load into it, then <code class="language-plaintext highlighter-rouge">MERGE</code> into the target in one statement. The guarantee lives in the shape of the pipeline.</p>

<p>Both fixes rest on one decision made before a single row is loaded: the target table needs a primary key, and it has to be a real business key (<code class="language-plaintext highlighter-rouge">order_id</code>, not an auto-increment). The key alone isn’t the fix. It’s what lets the database recognize a row it has already seen, so <code class="language-plaintext highlighter-rouge">ON CONFLICT</code> or <code class="language-plaintext highlighter-rouge">MERGE</code> can treat a retry as an update instead of a second copy. Without it, no retry logic can tell a duplicate from new data.</p>

<p>The tutorial runs on Airflow 3 and Postgres 17 with a one-command setup, or right in your browser through GitHub Codespaces. It takes about 45 minutes, with a checkpoint after every step.</p>

<ul>
  <li>📘 <a href="https://github.com/taliff0001/airflow_postgres_etl_starter_code/tree/main/tutorials/01-idempotent-loads">Tutorial 01: idempotent loads</a></li>
  <li>🧰 <a href="https://github.com/taliff0001/airflow_postgres_etl_starter_code">The starter repo</a></li>
</ul>

<p><em>Originally posted on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7511770054124994560/">LinkedIn</a>.</em></p>]]></content><author><name>Tommy Aliff</name></author><category term="data-engineering" /><category term="data engineering" /><category term="apache airflow" /><category term="postgresql" /><category term="idempotency" /><summary type="html"><![CDATA[A pipeline fails near the end, Airflow retries it, and the run turns green with half the table loaded twice. Here's why, and two ways to fix it.]]></summary></entry><entry><title type="html">AI Alignment: Three Terms Worth Knowing</title><link href="https://tommyaliff.com/ai/ai-alignment-three-terms/" rel="alternate" type="text/html" title="AI Alignment: Three Terms Worth Knowing" /><published>2026-09-29T00:00:00+00:00</published><updated>2026-09-29T00:00:00+00:00</updated><id>https://tommyaliff.com/ai/ai-alignment-three-terms</id><content type="html" xml:base="https://tommyaliff.com/ai/ai-alignment-three-terms/"><![CDATA[<p>AI alignment is the work of making sure an AI system does what we actually intend. That’s not always what we literally told it, and it’s not always whatever lets it score well.</p>

<p>The term “AI alignment” is everywhere right now, but if we don’t know the vocabulary the technical experts are throwing around then we’re not getting much out of the conversation. I recently listened to Sam Harris’s <em>Making Sense</em> episode “A Coin Toss for the Future” with Ryan Greenblatt, chief scientist at Redwood Research. It’s one of the clearest walkthroughs I’ve heard. Here are three terms worth knowing.</p>

<p><strong>Reward hacking.</strong> When a model finds a loophole that technically hits the target it was given while missing the point. It’s what happens when we can’t describe what we want clearly enough.</p>

<p><strong>Alignment faking.</strong> When a model behaves differently because it believes it’s being trained or watched. It looks like it has adopted our goals while it’s really just appearing to.</p>

<p><strong>Neuralese.</strong> Reasoning that happens in a model’s internal representations instead of readable language. If we can’t read how a model reached its answer, we can’t check it from the inside.</p>

<p>The title of the episode tells you how high the stakes could be.</p>

<h2 id="want-to-dig-deeper">Want to dig deeper?</h2>

<ul>
  <li>🎧 <a href="https://www.youtube.com/watch?v=wdnVeYx_fOA">The episode (free on YouTube)</a></li>
  <li>📄 <a href="https://blog.redwoodresearch.org/p/alignment-faking-in-large-language">Alignment faking, a readable summary from Redwood Research</a></li>
  <li>🔬 <a href="https://arxiv.org/abs/2412.14093">The full paper, for the technically inclined</a></li>
  <li>🏢 <a href="https://www.redwoodresearch.org/">Redwood Research</a></li>
</ul>

<p><em>Originally posted on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7510677604652187648/">LinkedIn</a>.</em></p>]]></content><author><name>Tommy Aliff</name></author><category term="ai" /><category term="ai" /><category term="ai alignment" /><category term="ai safety" /><summary type="html"><![CDATA[Reward hacking, alignment faking, and neuralese, in plain English.]]></summary></entry></feed>