<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Eric's Data Science Newsletter]]></title><description><![CDATA[Subscribe to learn how effectively to use AI, Bayes, Computation, and Data Science in Biotech.]]></description><link>https://dspn.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!rGJj!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fdspn.substack.com%2Fimg%2Fsubstack.png</url><title>Eric&apos;s Data Science Newsletter</title><link>https://dspn.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 12 Apr 2026 02:31:02 GMT</lastBuildDate><atom:link href="https://dspn.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Eric J. Ma]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[dspn@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[dspn@substack.com]]></itunes:email><itunes:name><![CDATA[Eric J. Ma]]></itunes:name></itunes:owner><itunes:author><![CDATA[Eric J. Ma]]></itunes:author><googleplay:owner><![CDATA[dspn@substack.com]]></googleplay:owner><googleplay:email><![CDATA[dspn@substack.com]]></googleplay:email><googleplay:author><![CDATA[Eric J. Ma]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Creative Mentorship: Growing as a Leader When Budgets Are Tight]]></title><description><![CDATA[Alternatively titled: How to keep growing as a mentor and leader&#8212;even when the budget is frozen.]]></description><link>https://dspn.substack.com/p/creative-mentorship-growing-as-a</link><guid isPermaLink="false">https://dspn.substack.com/p/creative-mentorship-growing-as-a</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 09 Apr 2026 11:02:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ISjf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ISjf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ISjf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ISjf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ISjf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ISjf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef4649bf-8b52-4f67-8403-664a3011ce5a_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Have you ever noticed that when the economy tightens, the first thing to go is often the budget for professional development? Co-ops get paused, training dries up, and suddenly, opportunities to grow as a mentor or leader seem out of reach. But what if the best opportunities are already within your grasp?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/25/creative-mentorship-strategies-for-career-growth-in-challenging-times/">This post</a> is about finding creative, practical ways to develop mentorship and leadership skills&#8212;even when formal programs and budgets disappear. I want to share what&#8217;s worked for me, and hopefully spark some ideas for you to keep growing and helping others, no matter the circumstances.</p><p>When budgets freeze, it&#8217;s easy to feel stuck. But I&#8217;ve learned that you don&#8217;t need a formal program or extra funding to make a real impact as a mentor or leader. In fact, some of the most meaningful growth happens when we get creative with what we already have.</p><p>Here&#8217;s what I&#8217;ve found: you always have three things to offer&#8212;your judgment, your skills, and your network. Judgment is the wisdom you&#8217;ve built up over time, knowing which tradeoffs matter and when to push or hold back. Your skills are the technical foundation you can share with others, helping them onboard or level up. And your network is a powerful tool for connecting people to opportunities, even if it&#8217;s just inviting someone to a meeting or making an introduction.</p><p>I&#8217;ve tried a handful of strategies at Novartis and Moderna that don&#8217;t require a budget, just a bit of initiative:</p><ul><li><p><strong>One-on-one coaching:</strong> Teaching others not only helps them, but also builds your reputation and value within the organization.</p></li><li><p><strong>Presenting at internal guilds or events:</strong> Sharing your knowledge in a group setting creates mentorship moments and helps you reach a wider audience.</p></li><li><p><strong>Organizing communities of practice:</strong> Even a simple group chat can become a hub for learning and leadership.</p></li><li><p><strong>Hosting informal coffee hours:</strong> These relaxed gatherings are great for authentic connection and sharing.</p></li><li><p><strong>Supporting external meetups:</strong> Sometimes, just offering a space or making an introduction can open doors for others.</p></li></ul><p>If you&#8217;re a manager, it&#8217;s worth recognizing and supporting these grassroots efforts. Growth isn&#8217;t just about climbing the ladder or chasing titles&#8212;it&#8217;s about helping others, sharing what you know, and building a culture of learning wherever you are.</p><p>You don&#8217;t need an internal university to foster growth. Sometimes, the best learning happens right in your own environment, with the people around you.</p><p>You don&#8217;t need a big budget or formal program to grow as a mentor or leader&#8212;your judgment, skills, and network are powerful tools for helping others and developing yourself, even in lean times.</p><p>What creative ways have you found to mentor or lead when resources are tight? I&#8217;d love to hear your stories or strategies.</p><p><em>If you found this helpful, check out the full blog post for more details and examples: <a href="https://ericmjl.github.io/blog/2026/3/25/creative-mentorship-strategies-for-career-growth-in-challenging-times/">Creative Mentorship Strategies for Career Growth in Challenging Times</a>. Feel free to share your own experiences or forward this to someone who might need a little inspiration.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Closing Air Gaps]]></title><description><![CDATA[Alternatively titled: Give unto robots what belongs to robots.]]></description><link>https://dspn.substack.com/p/closing-air-gaps</link><guid isPermaLink="false">https://dspn.substack.com/p/closing-air-gaps</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 02 Apr 2026 11:03:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ACLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ACLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ACLm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ACLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ACLm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ACLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0dfa2a5c-32f7-421e-91d3-4a235ba1755f_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Ever find yourself copying files, pasting data, or doing the same manual task over and over? I used to think these were just part of the job&#8212;until I learned to spot the &#8216;air gaps&#8217; that slow everything down.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/15/closing-air-gaps/">This post</a> is about recognizing and closing the manual bottlenecks&#8212;air gaps&#8212;in our workflows. By mapping out where humans are doing rote work that computers could handle, we can reclaim time, reduce errors, and free up our minds for more creative problems.</p><p>I first heard the term &#8216;air gap&#8217; from my colleague <a href="https://www.linkedin.com/in/wenhao-liu-1b85177/">Wenhao Liu</a>, and it immediately clicked. An air gap is any point in a process where a human has to step in and do something a computer could (and probably should) do. Think of it as a bubble in your workflow pipe&#8212;slowing things down, introducing errors, and taxing your attention.</p><p>Air gaps are everywhere: copying files from a lab machine to cloud storage, manually tracking your GitHub activity, or physically moving plates in a lab. Each one is a tiny tax on your time and focus. The real cost isn&#8217;t just the minutes lost, but the mental overhead of remembering and repeating these tasks.</p><p>The first step to closing air gaps is mapping your process. Walk through each step and ask: where am I copying, pasting, or following a fixed rule? Where am I waiting for someone else? Each answer points to a potential air gap. Once you see them, you can prioritize which ones to automate away.</p><p>I&#8217;ve closed air gaps in my own work&#8212;like automating GitHub activity tracking and file transfers in the lab. Sometimes the fix is a simple script; sometimes it&#8217;s a coding agent that can handle more complex tasks. The key is imagination (can you picture a better way?) and just enough technical skill to get started. And if your tools don&#8217;t have APIs, browser agents can often fill the gap.</p><p>The goal isn&#8217;t to eliminate humans from the loop, but to let us focus on creative, judgment-heavy work. Let robots handle the dull, dirty, and repetitive. The compounding effect of closing even small air gaps is huge&#8212;what feels like a minor efficiency today can transform your workflow tomorrow.</p><p>Map your processes, spot the air gaps, and close them one by one. The small wins add up to big changes over time.</p><p>What&#8217;s the most annoying manual task you still do at work? Have you tried mapping your process to find air gaps?</p><p><em>If you&#8217;re curious about how to spot and close air gaps in your own workflows, check out the full post for practical examples and steps: <a href="https://ericmjl.github.io/blog/2026/3/15/closing-air-gaps/">Read the full blog post</a>.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Agent Skills Are Also Human Skills]]></title><description><![CDATA[Alternatively titled: Why your agent skills are really documentation for humans, too.]]></description><link>https://dspn.substack.com/p/agent-skills-are-also-human-skills</link><guid isPermaLink="false">https://dspn.substack.com/p/agent-skills-are-also-human-skills</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 26 Mar 2026 11:01:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rMmD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rMmD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rMmD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rMmD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rMmD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!rMmD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff0eb914-d12c-474f-923b-88486f2b6327_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Have you ever built an agent skill and realized it&#8217;s not just about the code? I&#8217;ve been thinking a lot about this as I tinker with agent skills at home and at work. There&#8217;s a subtle but important distinction between skills that just use tools, and skills that actually capture how we work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/14/agent-skills-are-also-human-skills/">This post</a> is about why workflow-specific agent skills are more than just automation&#8212;they&#8217;re a form of documentation for humans, too. I want to share how our personal systems and assumptions get baked into these skills, and why making those explicit matters for anyone who wants to use or share them.</p><p>Let me give you a concrete example. I have a daily sign-off skill that helps me wrap up my workday. It pulls my GitHub activity and formats it into my daily bullet journal in Obsidian. But here&#8217;s the thing: this skill assumes you have the GitHub CLI installed, that you do PRs as part of your work, and that you organize your notes in a monthly file&#8212;not a daily one. That last bit is pretty opinionated, but it&#8217;s how I work. </p><p>If you wanted to use my sign-off skill, you&#8217;d be adopting more than just the code. You&#8217;d be stepping into my way of working&#8212;my file structure, my tool preferences, my mental model for organizing information. The skill comes with all these implicit assumptions, and unless they&#8217;re documented, someone else might find it half-useful at best.</p><p>I call this the procedural context. Workflow-specific agent skills encode not just what to do, but how and why. They&#8217;re not just for the agent&#8212;they&#8217;re for the next human who wants to understand or reuse your workflow. Without documenting the dependencies, environment, and what success looks like, it&#8217;s hard for anyone (or any agent) to verify if the skill is working as intended.</p><p>At the end of the day, agent skills are automation and documentation rolled into one. But if you want your skills to be truly useful for others, you have to teach the next person how to use them, not just what buttons to press.</p><p>Agent skills are also human skills&#8212;they document not just what to automate, but how we work. If you want your skills to be useful for others, make the assumptions and context explicit.</p><p>Have you ever tried to use someone else&#8217;s workflow or automation and run into hidden assumptions? How do you document your own workflows for others (or your future self)?</p><p><em>If this resonates, check out the full post for more details and examples: <a href="https://ericmjl.github.io/blog/2026/3/14/agent-skills-are-also-human-skills/">Agent Skills Are Also Human Skills</a>. If you found it helpful, feel free to share or subscribe for more thoughts like this.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Two quick off-cycle announcements...]]></title><description><![CDATA[Data Driven Pharma East, and a very, very exciting job posting at Moderna]]></description><link>https://dspn.substack.com/p/two-quick-off-cycle-announcements</link><guid isPermaLink="false">https://dspn.substack.com/p/two-quick-off-cycle-announcements</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 19 Mar 2026 12:18:33 GMT</pubDate><content:encoded><![CDATA[<p>Hello fellow datanistas!</p><p>I&#8217;d usually send these as P.S.-es at the end of my newsletter entries, but missed this morning&#8217;s by a hair. Sending it slightly off-cycle!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>#1: I&#8217;ll be at <a href="https://luma.com/ddpeast_2026?tk=PRmB2y">Data Driven Pharma East</a> giving an Inside the Stack talk in the morning where I&#8217;ll talk about &#8220;how to do agentic data science.&#8221; And later I&#8217;m moderating a discussion titled: Same Models, Different Stakes: GenAI in Discovery vs Development, along with <a href="https://www.linkedin.com/in/elizabethchoe/">Elizabeth Choe</a>. If you&#8217;re working hands-on in AI, data, or computational science in this space, this is a thoughtful, practitioner-heavy room. Hope to see some of you there!</p><p>#2: Exciting developments at Moderna in the AI space, we&#8217;re looking for someone at the Senior Principal level (same level as my current role, but non-managerial) to do AI Solutions Engineering. Role is <a href="https://modernatx.wd1.myworkdayjobs.com/en-US/M_tx/job/Senior-Principal-Enterprise-AI-Solution-Engineer_R18885-1">here</a>. This is an individual contributor role, expectation is to be hands-on, savvy with AI, great with people, processes, and technology, and to be a product-minded builder. If you&#8217;re selected, we&#8217;ll probably work very closely together!</p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[My Weekend Experiment: Bringing PyMC to the Browser (and Hitting the NUTS Wall)]]></title><description><![CDATA[Alternatively titled: How I tried (and almost succeeded) to run PyMC in the browser, and what I learned along the way.]]></description><link>https://dspn.substack.com/p/my-weekend-experiment-bringing-pymc</link><guid isPermaLink="false">https://dspn.substack.com/p/my-weekend-experiment-bringing-pymc</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 19 Mar 2026 11:00:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8-5R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8-5R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8-5R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8-5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8-5R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!8-5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff43cefd1-ca56-4417-8131-a67de168da13_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Have you ever tried to revive a magical demo from a few years ago, only to find that the tech landscape has quietly shifted beneath your feet? That was me this weekend, chasing the dream of running full Bayesian inference with PyMC&#8212;right in the browser, no servers, no installs.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/8/my-weekend-experiment-pymc-wasm/">This post</a> is about my hands-on journey to get PyMC running in the browser using Pyodide and WebAssembly. I&#8217;ll walk you through the technical hurdles, the code changes I made, and the lessons I learned about open-source contribution and the current limits of browser-based Bayesian inference.</p><p>It all started with a sense of nostalgia: I revisited PyMC Labs&#8217; 2022 blog post showing PyMC running entirely in the browser. The promise was huge&#8212;define models, run NUTS sampling, and visualize posteriors, all client-side. But when I tried the examples, nothing worked. The Python ecosystem had moved on, dependencies had shifted, and the Pyodide environment had changed.</p><p>So, I rolled up my sleeves and dove in. The main challenge? PyTensor, PyMC&#8217;s computational backend, needed to build for WebAssembly. That meant wrangling C and Cython extensions, Emscripten, and Pyodide&#8217;s build system. My key breakthrough was making Numba (PyTensor&#8217;s JIT compiler) an optional dependency for WASM builds&#8212;since Numba simply doesn&#8217;t exist for WebAssembly. This let PyTensor install, but at the cost of losing JIT compilation (and, heartbreakingly, the NUTS sampler).</p><p>I also experimented with a new Pixi-based dev environment for reproducible WASM builds, but ultimately, I realized that open-source contribution is about meeting maintainers where they are. My actual PR respected PyTensor&#8217;s existing mamba-based workflow, keeping changes minimal and maintainable.</p><p>The big letdown: NUTS (the gold-standard sampler) doesn&#8217;t work in WASM, and none of the modern MCMC backends (JAX, nutpie) have WASM support yet. It&#8217;s like getting a Ferrari with no keys&#8212;you can admire it, but you&#8217;re not going anywhere fast. Still, PyTensor now installs in WASM, PyMC can be imported, and simpler samplers might work for small models. The roadmap for full browser-based Bayesian inference is clearer, even if we&#8217;re not there yet.</p><p>If you want the nitty-gritty details, including code snippets and the full story, check out the original blog post: <a href="https://ericmjl.github.io/blog/2026/3/8/my-weekend-experiment-pymc-wasm/">My Weekend Experiment: PyMC, WASM, and the Browser</a>.</p><p>Sometimes, the most valuable outcome of a technical experiment isn&#8217;t a working demo, but a deeper understanding of the ecosystem&#8212;and a clearer path for the next person to follow.</p><p>Have you ever tried to port a Python package to WebAssembly or run complex scientific code in the browser? What roadblocks did you hit, and how did you work around them?</p><p><em>If you&#8217;re curious about the technical details or want to see the code changes, read the full blog post <a href="https://ericmjl.github.io/blog/2026/3/8/my-weekend-experiment-pymc-wasm/">here</a>. If you&#8217;ve tackled similar challenges, I&#8217;d love to hear your stories&#8212;reply or leave a comment!</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How I Built a Personal Knowledge System with Obsidian, AI, and Plain Text]]></title><description><![CDATA[Alternatively titled: How plain text, coding agents, and a little imagination transformed my work life.]]></description><link>https://dspn.substack.com/p/how-i-built-a-personal-knowledge</link><guid isPermaLink="false">https://dspn.substack.com/p/how-i-built-a-personal-knowledge</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 12 Mar 2026 11:02:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!0s30!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0s30!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0s30!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!0s30!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!0s30!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!0s30!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0s30!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0s30!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!0s30!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!0s30!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!0s30!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa1c7b63a-9598-4527-9682-2a455fcce27e_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Ever feel like you&#8217;re drowning in meetings, projects, and random documents&#8212;and your brain just can&#8217;t keep up? I&#8217;ve been there. Managing twelve people across two teams, each juggling multiple projects, forced me to rethink how I handle information. What started as a simple experiment with Obsidian and plain text turned into a system that changed how I work (and think).</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/3/6/mastering-personal-knowledge-management-with-obsidian-and-ai/">This post</a> is my honest, behind-the-scenes look at how I built a personal knowledge management (PKM) system using Obsidian, plain text, and AI coding agents. My hope is that sharing my process&#8212;warts and all&#8212;will inspire you to experiment with your own workflow, no matter your technical background.</p><p>When I first set out to improve my PKM at work, I faced a familiar dilemma: stick with the usual suspects (Confluence, OneNote), or try something new. I chose Obsidian and, more importantly, I chose plain text. At the time, it felt like a nerdy preference for graphs and open formats. In hindsight, it was a lucky break&#8212;plain text turned out to be the perfect foundation for integrating AI agents down the line.</p><p>My system revolves around a few core note types: monthly bullet journals, structured meeting notes, dossiers for people I work with, and project control towers. Everything is linked, everything is searchable, and&#8212;crucially&#8212;everything is in a format that both humans and AI can process.</p><p>Ingesting information used to be a slog. Now, AI skills handle the heavy lifting: parsing meeting transcripts, summarizing documents, and even extracting structure from messy Excel files. I&#8217;ve written Python scripts for everything from converting Word docs to plain text, to generating PowerPoint decks from Markdown. Each script declares its dependencies inline, so I never have to worry about environment issues or &#8216;works on my machine&#8217; headaches.</p><p>The real magic is in maintenance. When I hit a context block&#8212;forgetting a detail about a person or project&#8212;I trigger a sweep. My coding agent updates notes based on source material, always quoting the original. I stay in the loop for verification, but the system does most of the grunt work. Retrieval practice and periodic reviews keep the vault trustworthy.</p><p>Sharing is intentional. I curate what gets published, whether it&#8217;s to Confluence, GitHub, or Google Docs. The agent creates publishable versions, and I review before sharing. The workflow isn&#8217;t perfect (I still wish I could ingest cloud docs by URL), but it&#8217;s reduced my knowledge management overhead from 30-40% of my time to less than 10%.</p><p>If you&#8217;re curious about the technical details or want to try some of my agent skills, I&#8217;ve published a few (like html-presentations and gh-activity-summary). The bigger picture: this system lets me offload repetitive work to AI, freeing up time for deeper thinking and more meaningful interactions. It&#8217;s not a prescription&#8212;just an invitation to experiment and find what works for you.</p><p>For the full technical breakdown and scripts, check out the original blog post: <a href="https://ericmjl.github.io/blog/2026/3/6/mastering-personal-knowledge-management-with-obsidian-and-ai/">Mastering Personal Knowledge Management with Obsidian and AI</a>.</p><p>Plain text plus coding agents is a powerful, future-proof combo for managing knowledge at work. The best system is the one you actually use&#8212;and document.</p><p>How do you keep track of everything at work? Have you tried building your own PKM system, or are you still searching for something that fits? I&#8217;d love to hear what&#8217;s worked (or not) for you.</p><p><em>If you found this helpful, check out the full blog post for scripts, technical details, and more stories. And if you&#8217;re experimenting with your own PKM setup, hit reply&#8212;I&#8217;d love to swap notes!</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Speed With Control: How to Stay the Scientist with Coding Agents]]></title><description><![CDATA[Alternatively titled: How slowing down with coding agents actually speeds up your science.]]></description><link>https://dspn.substack.com/p/speed-with-control-how-to-stay-the</link><guid isPermaLink="false">https://dspn.substack.com/p/speed-with-control-how-to-stay-the</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 05 Mar 2026 12:02:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1bV_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1bV_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1bV_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1bV_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1bV_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!1bV_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05653701-1576-4247-9aab-b715eaa98745_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Speed without control is just chaos. I&#8217;ve watched teammates compress weeks of analysis into hours with coding agents&#8212;only to end up with a pile of plots and no clear answers. The real unlock isn&#8217;t speed. It&#8217;s staying in the driver&#8217;s seat.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2026/2/13/agentic-eda/">This post</a> is about how I use structure and intentional slow-downs to keep coding agents from running wild, so I can actually do better science&#8212;not just generate artifacts faster. I&#8217;ll share the design patterns and session structures that keep me (and my team) in control, and why that matters more than ever.</p><p>Let&#8217;s be honest: coding agents are eager. Hand them a CSV and they&#8217;ll spit out a dozen plots before you&#8217;ve finished your coffee. It feels productive, but it&#8217;s easy to lose the thread. I&#8217;ve been there&#8212;reacting to whatever the agent produced, rather than steering toward an answer.</p><p>So I started doing things differently. I built two skills for my agents: one for exploratory data analysis (scientific-eda), one for machine learning experiments (ml-experimentation). The pattern is the same: slow down first, gate on plots, and structure the session so both human and agent can follow what happened.</p><p><strong>Slow down first: the Socratic opening</strong></p><p>Instead of jumping into code, the agent asks questions. What&#8217;s the problem context? What are you hoping to learn? Any constraints? There&#8217;s even a guardrail: &#8220;ask &#8216;why&#8217; before executing.&#8221; It feels slower, but it prevents wasted effort and rabbit holes.</p><p><strong>Gate everything on plots</strong></p><p>One plot at a time. If I can&#8217;t describe the x-axis, y-axis, and what I&#8217;m looking for, we don&#8217;t run the code. This forces clarity. The tradeoff? A bit of upfront thinking for a huge execution speedup&#8212;and far less wasted work.</p><p><strong>Session structure: traceable by design</strong></p><p>Each session lives in a timestamped folder: a journal.md for actions and findings, a plots/ directory for figures, and scripts/ for disposable code. The journal is the memory&#8212;timestamped, tagged, and scannable. Anyone (including future me) can follow the analysis without reading the code.</p><p><strong>What changed for my teammates and I</strong></p><p>The conversations shifted. We stopped defending code and started critiquing the analysis. The agent writes the code; we focus on the questions. It&#8217;s more collaborative, less ego-driven, and way more productive.</p><p>The key insight: design for the human, and the agent follows. Structure keeps you in control, and the agent becomes a force multiplier&#8212;not a loose cannon.</p><p>If you want to see the skills or the full breakdown, I&#8217;ve linked everything in the full post.</p><p>Speed is only valuable if you stay in control. Structure your agentic analysis to keep yourself in the driver&#8217;s seat&#8212;slow down, gate on plots, and leave a clear trace.</p><p>How do you keep your analysis focused when using coding agents? Have you found ways to stay in control, or do you sometimes feel like you&#8217;re just reacting to what the agent produces?</p><p><em>Curious about the full approach, including the skills and session templates? Read the full post here: <a href="https://ericmjl.github.io/blog/2026/2/13/agentic-eda/">Speed Without Control: How to Stay the Scientist with Coding Agents</a>. If you find it useful, feel free to share or subscribe for more practical data science insights.</em></p><p>Happy coding!<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><em>Two P.S.-es :)</em></p><p><em>#1: quick plug for an open position with my wonderful colleague Mihir Metkar in the mRNA Design Team at Moderna, and that position will be in tight collaboration with my teammates in the DSAI Research team:</em></p><p><em>We&#8217;re hiring a Scientist, Platform &amp; Therapeutic Area Bioinformatics at Moderna (Cambridge, MA).</em></p><p><em>This role sits at the intersection of RNA biology, algorithm development, and machine learning. You&#8217;ll develop new optimization algorithms and ML approaches for therapeutic mRNA design, working closely with RNA biologists, NGS, and high-throughput screening teams.</em></p><p><em><strong><a href="https://lnkd.in/ev9P5SeE">https://lnkd.in/ev9P5SeE</a></strong></em></p><p><em>#2: my friend Hugo Bowne-Anderson is doing another cohort of his course, <a href="https://maven.com/hugo-stefan/building-ai-apps-ds-and-swe-from-first-principles?promoCode=friendsoferic">Building AI Applications for Data Scientists and Software Engineers</a>, on Maven. It&#8217;s a useful course if you&#8217;re interested in learning how to build the new wave of AI-native software for the future. 25% off with the code </em><code>friendsoferic</code><em>. While he&#8217;s offered a referral fee, I&#8217;ve asked for it to be donated to the SciPy Financial Aid fund instead.</em> </p>]]></content:encoded></item><item><title><![CDATA[Ten Lessons Learned from Agentic Data Science Experiments]]></title><description><![CDATA[Alternatively titled: How I learned to stop worrying and let the agent run my experiments.]]></description><link>https://dspn.substack.com/p/ten-lessons-learned-from-agentic</link><guid isPermaLink="false">https://dspn.substack.com/p/ten-lessons-learned-from-agentic</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 26 Feb 2026 12:01:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!F4F2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F4F2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F4F2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F4F2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F4F2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!F4F2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f17a230-f16f-4be3-bf77-64b413d5b129_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Ever wondered what happens when you let a coding agent loose on your data science workflow? I did too. After seeing the promise of agentic coding in software, I couldn&#8217;t help but ask: what if we applied the same principles to training machine learning models and answering scientific questions?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In this post, I share ten lessons I&#8217;ve learned from hands-on experiments with coding agents in data science&#8212;both at work and at home. My goal is to help you avoid my mistakes, leverage agents more effectively, and maybe even have a little more fun along the way.</p><p>Agentic coding isn&#8217;t just for software development. When I started experimenting with coding agents for data science, I quickly realized the parallels&#8212;and the pitfalls. Here are a few of the most important lessons I picked up:</p><ol><li><p><strong>Be prescriptive in your prompting.</strong> You need to know what you want and how you&#8217;ll evaluate it. In data science, that means framing hypotheses and iterating your way to answers, not just building features.</p></li><li><p><strong>Strong patterns in the file system.</strong> Agents (like humans) need predictable places for experiments. A clear folder structure helps the agent know where to put things and where to look.</p></li><li><p><strong>Put logging instructions in AGENTS.md.</strong> Logging is your agent&#8217;s window into what&#8217;s happening. Make sure your agent can introspect logs and learn from them.</p></li><li><p><strong>Give it report-writing skills.</strong> Ask your agent to summarize what it observed, flag anything weird, and help you triage without reading every log line.</p></li><li><p><strong>Keep an append-only journal.</strong> Both you and the agent should jot down observations. This running log becomes invaluable for understanding what happened and why.</p></li><li><p><strong>Have the agent generate diagnostic plots.</strong> Plots are for you, logs are for the agent. Both are needed to build intuition and catch issues.</p></li><li><p><strong>Instruct the agent to write the minimalist version first.</strong> Start small, debug fast, then scale up. The agent doesn&#8217;t get impatient&#8212;use that to your advantage.</p></li><li><p><strong>Ask the agent to guide you step by step.</strong> Let it walk you through what it&#8217;s done, especially when you&#8217;re context-switching or running low on energy.</p></li><li><p><strong>Learn the agent&#8217;s vocabulary.</strong> Pay attention to the terms it uses&#8212;you can reuse them for more precise prompts in the future.</p></li><li><p><strong>Treat the agent as an executor of your curiosity.</strong> You lead, it follows. Don&#8217;t let it run ahead; use it as a jazz partner for your exploration.</p></li></ol><p>These practices have helped me turn coding agents into true research partners, not just code generators. The full post dives into each lesson with stories and practical tips.</p><p>Treat coding agents as partners in your data science journey&#8212;set clear goals, structure your work, and use their strengths to amplify your own curiosity and expertise.</p><p>Have you tried using coding agents in your data science work? What lessons or surprises have you encountered along the way?</p><p><em>If you&#8217;re curious about the details (and want to see some real-world examples), check out the full post here: <a href="https://ericmjl.github.io/blog/2026/2/1/how-to-do-agentic-data-science/">How to do agentic data science</a>. If you found this helpful, please share it with a fellow datanista or subscribe for more hands-on insights.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Model Feel, Fast Tests, and Staying in Flow with AI Coding Agents]]></title><description><![CDATA[Alternatively titled: Why &#8216;feel&#8217; and feedback loops matter more than benchmarks when coding with AI.]]></description><link>https://dspn.substack.com/p/model-feel-fast-tests-and-staying</link><guid isPermaLink="false">https://dspn.substack.com/p/model-feel-fast-tests-and-staying</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 19 Feb 2026 12:00:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J4ba!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J4ba!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J4ba!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J4ba!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J4ba!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!J4ba!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96d1cde-131b-4e3d-87b2-e4b4d2a9b653_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Most conversations about AI coding models obsess over benchmarks and pass rates. But if you spend real hours in the loop, you know: what actually shapes your day is the feel of working with the model, not just its numbers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In <a href="https://ericmjl.github.io/blog/2026/1/25/model-feel-fast-tests-and-ai-coding-that-stays-in-flow/">this post</a>, I dig into the qualitative side of using LLMs as coding agents&#8212;how their personality, feedback style, and the tools around them shape your flow, trust, and productivity. I&#8217;ll share what I&#8217;ve learned from bouncing between models, why the agentic harness matters as much as the model, and how I now pick my tools based on the phase of work, not just the leaderboard.</p><p>When you start using LLMs as coding agents, the experience quickly becomes about more than just accuracy or latency. It&#8217;s about how often you have to intervene, how much you trust the process, and whether you stay in flow or get derailed by weird breakage. </p><p>Two axes keep showing up for me: time horizon (long-horizon autonomy vs. short-horizon iteration) and personality/verbosity (how the model behaves when it&#8217;s wrong, how much it narrates, and whether it stays constructive or spirals into apology loops).</p><p>But there&#8217;s a third ingredient: the agentic harness. The tools and checks that let the agent verify its own work, and the feedback you get while it&#8217;s running. A good harness&#8212;one that gives you live traces and fast tests&#8212;often matters more than swapping models.</p><p>For example, when refactoring a big codebase, long-horizon models like Opus-4.5 or GPT-5.2 can generate plausible scaffolds, but they struggle with careful, incremental work. Short-horizon models (Sonnet, Minimax M 2.1, Composer-1) shine when you need to walk through changes step by step, watching traces and intervening early. </p><p>The real breakthrough for me wasn&#8217;t just picking the right model, but adding simple, fast tests (like Cypress reloads) to the harness. Suddenly, the agent could catch basic breakages immediately, and I could trust the loop again. </p><p>Personality matters too. Some models apologize endlessly when they mess up (looking at you, Gemini 2.5), while others stay upbeat and constructive. That <em>emotional texture</em> shapes the whole coding experience. Enthusiasm, it turns out, is a feature.</p><p>And don&#8217;t underestimate the illusion of speed: streaming feedback and live traces make the wait feel shorter and keep you in the loop. A spinner with no feedback? That&#8217;s a recipe for frustration, no matter how fast the model is on paper.</p><p>After enough hours, you start to build muscle memory for a model&#8217;s quirks. That comfort is sticky&#8212;and a subtle form of vendor lock-in. I try to stay fluent across models, so I don&#8217;t end up optimizing my workflow around one set of quirks and calling it productivity.</p><p>Now, I pick my tools based on the phase of work: long-horizon autonomy for scaffolding, short-horizon iteration for refactoring or debugging, and always, always improving the harness before blaming the model. Fast, agent-runnable tests have saved my sanity more than any leaderboard-topping model ever could.</p><p>If you want the full story, including concrete examples and code, check out the full post: <a href="https://ericmjl.github.io/blog/2026/1/25/model-feel-fast-tests-and-ai-coding-that-stays-in-flow/">Model Feel, Fast Tests, and AI Coding That Stays in Flow</a>.</p><p>The feel of your AI coding agent&#8212;and the feedback harness around it&#8212;matters as much as raw model performance. Fast, agent-runnable tests and constructive feedback loops keep you in flow and make the whole system more trustworthy.</p><p>How do you choose between long-horizon autonomy and short-horizon iteration in your own coding workflows? Have you found a harness or feedback loop that changed the way you work with AI agents?</p><p><em>If this resonated, read <a href="https://ericmjl.github.io/blog/2026/1/25/model-feel-fast-tests-and-ai-coding-that-stays-in-flow/">the full post</a> for more stories and code examples, and consider sharing your own experiences or subscribing for future deep dives.</em></p><p>Happy Coding,<br>Eric</p><p>P.S. My friend Zhaojie Zhang is hiring a Principal Scientist for Safety and Regulatory Data Insights! He&#8217;s an awesome guy to work with. Applications are <a href="https://beigene.wd5.myworkdayjobs.com/BeiGene/job/Remote-US/Principal-Scientist--Safety-and-Regulatory-Data-Insights_R33273">here</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Agent-Assisted Data Science Workshop]]></title><description><![CDATA[I am teaching a course to raise funds for the SciPy Financial Aid program. If you'd like to learn something and while giving something back, please join in!]]></description><link>https://dspn.substack.com/p/agent-assisted-data-science-workshop</link><guid isPermaLink="false">https://dspn.substack.com/p/agent-assisted-data-science-workshop</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Wed, 18 Feb 2026 13:02:02 GMT</pubDate><content:encoded><![CDATA[<p>Hello fellow datanistas!</p><p>I&#8217;m teaching a workshop on agentic data science, and all proceeds go to SciPy 2026.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The workshop is about how to use coding agents like Cursor, Claude Code, and OpenCode to compress what used to take weeks of work into a single day.</p><p>I&#8217;ve been using these techniques in my projects and with my teammates for the past year to compress experimental timelines from days to minutes.</p><p><strong>What you&#8217;ll learn:</strong></p><ul><li><p>Prescriptive prompting for experiments</p></li><li><p>Project structure for agents</p></li><li><p>Logging and verification strategies</p></li><li><p>Report writing with AI</p></li><li><p>Staying in control during EDA</p></li><li><p>The minimalist version first</p></li></ul><p>The techniques work across platforms. Whether you use Cursor, Claude Code, OpenCode, or something else, the patterns transfer.</p><p><strong>The details:</strong></p><ul><li><p>Date: March 27 and April 3, 2026</p></li><li><p>Time: 2:00-4:00 PM EST</p></li><li><p>Venue: Google Meet (calendar invite will be provided)</p></li><li><p>$1,000 minimum donation, paid directly to NumFOCUS (tax-deductible)</p></li><li><p>Spots: 40 available</p></li></ul><p>If you can&#8217;t attend live, video recordings will be available to all confirmed participants.</p><p>Basic Python and data science experience is assumed. No prior AI or LLM experience is required.</p><p><strong>How to sign up:</strong></p><ol><li><p>Reserve your spot at the workshop website</p></li><li><p>Donate at least $1,000</p></li><li><p>Submit your receipt to confirm</p></li></ol><p>Sign up: <a href="https://agent-assisted-data-science.vercel.app/">https://agent-assisted-data-science.vercel.app/</a> </p><p>(In case you were curious, I built that sign-up app with agent-assistance!)</p><p>SciPy has been a big part of my professional life. I&#8217;ve taught tutorials there, contributed to open-source packages in the ecosystem, and learned an enormous amount from the community. This workshop is my way of giving back.</p><p>If you&#8217;ve been curious about agentic data science but didn&#8217;t know where to start, this will give you techniques you can use the very next day.</p><p>Happy coding!<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How to Build Self-Improving Coding Agents, Part 3: Turning Memory and Skills into Practice]]></title><description><![CDATA[Alternatively titled: How Markdown, skills, and repo memory combine to make agents feel like teammates.]]></description><link>https://dspn.substack.com/p/how-to-build-self-improving-coding-c10</link><guid isPermaLink="false">https://dspn.substack.com/p/how-to-build-self-improving-coding-c10</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 12 Feb 2026 12:00:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fZLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fZLm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fZLm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fZLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fZLm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!fZLm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F64bc4e28-e0ed-4c5b-8e57-f63ef6630597_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Ever find yourself explaining the same thing to your coding agent over and over? I&#8217;ve been there. It&#8217;s a sign that something in your workflow wants to be systematized&#8212;and that&#8217;s where the real compounding value starts.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In this post, I&#8217;m sharing how to move beyond ad hoc prompting and start building self-improving coding agents&#8212;by combining repository memory and reusable skills into a practice that actually evolves with you.</p><p>Let&#8217;s be honest: most of us start with agents by just typing prompts in chat, hoping for magic. But if you want your agent to become more than a chat box&#8212;if you want it to feel like a teammate&#8212;you need a system for memory and skills that grows over time.</p><p>Here&#8217;s the maturity model I&#8217;ve been using:</p><ul><li><p><strong>Stage 0: Ad hoc prompting</strong> &#8212; You keep re-explaining things. It works, but it doesn&#8217;t compound.</p></li><li><p><strong>Stage 1: Repo-local memory</strong> &#8212; Add AGENTS.md to capture repo-specific rules, navigation, and guardrails. Now your agent knows the lay of the land.</p></li><li><p><strong>Stage 2: Global personal skills</strong> &#8212; When a workflow repeats, promote it to a global skill. Tools like `skill-creator`, `openskills`, and `agents-md-improver` help you bootstrap this.</p></li><li><p><strong>Stage 3: Shared skills</strong> &#8212; If your team keeps repeating a workflow, promote it to a shared skill. But don&#8217;t start here&#8212;let pain guide your promotions.</p></li></ul><p>The trick is to watch what your agent does in practice. When it takes a weird path or misses something obvious, ask: is this a repo rule (AGENTS.md) or a repeatable procedure (skill)?</p><p>What&#8217;s wild is that Markdown is becoming executable. When your agent can run tool calls, a SKILL.md isn&#8217;t just documentation&#8212;it&#8217;s a playbook the agent can run: searches, edits, tests, you name it. The agent loads skills on demand, so you can write instructions at the level you actually think about them, and let the agent handle the clerical work.</p><p>The real meta skill here is metacognition: noticing what you do repeatedly, and deciding what should be systematized. That&#8217;s how you build a compounding loop&#8212;your agent handles more of the grunt work, and you get to focus on judgment and design.</p><p>This isn&#8217;t just about coding. Once your agent can run commands and manipulate files, the surface area expands to almost anything intellectual&#8212;writing, release notes, even structuring messy notes. The label &#8220;coding tool&#8221; is starting to feel more like marketing than reality.</p><p>The combination of repository memory and reusable skills turns your agent from a chat box into a true teammate&#8212;one that learns from your workflow and grows with you.</p><p>How are you currently using agents in your workflow? What&#8217;s the biggest pain point you wish you could automate or systematize?</p><p><em>If you want the full breakdown (including concrete tools and decision criteria), check out the full post: <a href="https://ericmjl.github.io/blog/2026/1/19/how-to-build-self-improving-coding-agents-part-3/">How to Build Self-Improving Coding Agents: Part 3</a>. If you found this useful, feel free to share or subscribe for more.</em></p><p>Happy Coding,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How to Build Self-Improving Coding Agents, Part 2: Skills as Playbooks]]></title><description><![CDATA[Alternatively titled: How I stopped re-explaining workflows and started building reusable playbooks for my coding agents]]></description><link>https://dspn.substack.com/p/how-to-build-self-improving-coding-53b</link><guid isPermaLink="false">https://dspn.substack.com/p/how-to-build-self-improving-coding-53b</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 05 Feb 2026 12:01:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hDMS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hDMS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hDMS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hDMS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hDMS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!hDMS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff0457c25-ef57-4fbc-b019-89b7ed7bac2f_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Ever find yourself explaining the same workflow to your coding agent over and over? I did, and it was draining my energy. So I started building skills&#8212;reusable playbooks that let my agents handle repetitive tasks without me having to spell things out every time.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In this post, I dig into the concept of &#8216;skills&#8217; for coding agents: what they are, how I use them, and why they&#8217;ve become essential in my workflow. If you&#8217;re tired of repeating yourself and want your agents to actually learn, this is for you.</p><p>Skills are the other half of the self-improving agent system&#8212;prompt compression in action. Instead of re-explaining a workflow, I want a playbook I can invoke. For me, a skill is just a folder with a SKILL.md file (the prompt) and any scripts or assets needed. A good skill makes three things explicit: when to use it, what steps to take, and what good output looks like.</p><p>Some examples from my own work:</p><ul><li><p>A GitHub debugging skill for CI failures, so the agent follows a repeatable process.</p></li><li><p>A release announcement skill, so I don&#8217;t spend half an hour composing messages for Teams every time.</p></li><li><p>A report-writing skill for ML model training sessions, using real logs and artifacts.</p></li><li><p>A domain expertise skill, where a teammate encoded her chromatography debugging process&#8212;making tacit knowledge explicit and reusable.</p></li></ul><p>What I like about skills is how easy they are to iterate on. I can feed my agent examples of what &#8220;good&#8221; looks like, and as my taste evolves, I update the skill. It&#8217;s a feedback loop: edit, improve, repeat. Skills are also reviewable and shareable&#8212;open a PR, get feedback, and everyone benefits.</p><p>Distribution is still a work in progress. Tools like OpenSkills are making it easier to install and update skills across machines and repos, but discovery isn&#8217;t standardized yet. Still, the direction is promising, and I expect things to converge soon.</p><p>With both memory (AGENTS.md) and skills (playbooks), the next question is: what do you invest in next? That&#8217;s what I&#8217;ll cover in Part 3.</p><p>Skills turn repetitive workflows into reusable playbooks for your coding agents, making them smarter and saving you time.</p><p>What&#8217;s one workflow you wish your coding agent could handle without you having to explain it every time? Have you tried building a skill for it?</p><p><em>If you want to see concrete examples and my full process, check out the full post: <a href="https://ericmjl.github.io/blog/2026/1/18/how-to-build-self-improving-coding-agents-part-2/">How to build self-improving coding agents - Part 2</a>. If you find it useful, feel free to share or subscribe for updates.</em></p><p>Happy Coding,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Building Tools for Thinking with AI]]></title><description><![CDATA[In which I go on a podcast!]]></description><link>https://dspn.substack.com/p/building-tools-for-thinking-with</link><guid isPermaLink="false">https://dspn.substack.com/p/building-tools-for-thinking-with</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Fri, 30 Jan 2026 03:09:07 GMT</pubDate><content:encoded><![CDATA[<p>Hello fellow datanistas!</p><p>I&#8217;ll be live streaming agentic coding with my friend Hugo Bowne-Anderson! Tuesday, 10 February, 8:00 pm-9:30 pm EST.</p><p>Link is <a href="https://luma.com/8m9yi31f?tk=K1eFBM">here</a>, would love to have everyone join in!</p><p>Cheers,<br>Eric</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How to Build Self-Improving Coding Agents: Part 1 of 3]]></title><description><![CDATA[Alternatively titled: Stop Babysitting Your Agents&#8212;Let Them Learn From You]]></description><link>https://dspn.substack.com/p/how-to-build-self-improving-coding</link><guid isPermaLink="false">https://dspn.substack.com/p/how-to-build-self-improving-coding</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 29 Jan 2026 12:01:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ydia!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ydia!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ydia!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Ydia!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Ydia!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ydia!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ydia!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ydia!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!Ydia!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!Ydia!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!Ydia!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f6c5260-f3d8-4005-b3ca-d3537105ba91_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Ever feel like your coding agent is just a really fast intern you have to keep correcting? I&#8217;ve been there. I wanted my agents to actually learn from my feedback&#8212;not just repeat the same mistakes every session.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This post is about making coding agents genuinely self-improving, even when the underlying model isn&#8217;t changing. I&#8217;ll share the two levers I use&#8212;AGENTS.md as repository memory and skills as reusable playbooks&#8212;to help agents remember corrections and get better with every run.</p><p>The user experience I&#8217;m after is simple: I want to stop repeating myself. No more end-of-day cleanups, no more re-explaining where files live, no more restating the same preferences. If the model weights aren&#8217;t changing, improvement has to come from the environment around the agent.</p><p>For me, that environment has two key pieces:</p><ul><li><p><strong>Durable repository memory (AGENTS.md)</strong></p></li><li><p><strong>Reusable playbooks (skills)</strong></p></li></ul><p>Once you have these, you can treat agent improvement like a runbook plus postmortem loop: write down repeatable steps, document surprises, and update for next time. The difference is, with agents, natural language can turn into tool calls&#8212;so writing things down precisely means the agent can actually execute them.</p><h3>AGENTS.md as Repository Memory</h3><p>If you haven&#8217;t used AGENTS.md before, it&#8217;s a convention for giving agents a persistent memory of your repo. It does two things:</p><ol><li><p><strong>Fast navigation:</strong> A code map helps the agent find files quickly, cutting down on wasted exploration.</p></li><li><p><strong>Local norms:</strong> Corrections and repo-specific rules live here, so the agent stops making the same mistakes.</p></li></ol><p>Here&#8217;s the loop I want:</p><ul><li><p>I spot a mismatch.</p></li><li><p>I tell the agent what should be true.</p></li><li><p>The agent writes the correction into AGENTS.md (or a local skill).</p></li><li><p>The agent reads it next time.</p></li></ul><p>A practical example: In my canvas-chat codebase, a simple code map let the agent one-shot a tricky spot for node rendering events. Without it, the agent needed 5-6 searches just to get close. The time saved is small, but the collaboration feels smoother&#8212;I steer less, the agent wanders less.</p><h4>Keeping the Map Alive</h4><p>The map isn&#8217;t static. When the agent finds it&#8217;s out of date, it should update AGENTS.md. This closes the loop and keeps the environment alive. You can even encode this as an explicit instruction in AGENTS.md.</p><h4>Corrections That Stick</h4><p>AGENTS.md also holds the rules you find yourself repeating. For example:</p><ul><li><p>Run Python in the pixi context.</p></li><li><p>Don&#8217;t cheat by modifying tests to make them pass.</p></li></ul><p>Once these are written down, the agent stops making you restate them. It&#8217;s the simplest way I know to reduce repeated friction.</p><h4>Bootstrapping AGENTS.md</h4><p>I use a one-time deep dive prompt to generate AGENTS.md, focusing on codebase maps, local norms, and self-correction rules. The goal is compounding value, not bureaucracy&#8212;keep it lightweight, but make sure it grows with your feedback.</p><p>Once AGENTS.md exists, skills are the next lever. (Stay tuned for Part 2!)</p><p>If you want your coding agents to actually improve, don&#8217;t just wait for better models&#8212;give them a persistent memory (AGENTS.md) and clear, reusable playbooks. That&#8217;s how feedback sticks and agents get smarter every week.</p><p>How do you help your coding agents learn from your feedback? Have you tried AGENTS.md or something similar? I&#8217;d love to hear your approaches and what&#8217;s worked (or not) for you.</p><p><em>Curious for the full details, including my starter prompt for AGENTS.md? Read the full post here: <a href="https://ericmjl.github.io/blog/2026/1/17/how-to-build-self-improving-coding-agents-part-1/">How to Build Self-Improving Coding Agents - Part 1</a>. If you found this helpful, please share or subscribe for Part 2!</em></p><p>Happy Coding,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Canvas Chat: Building a Visual Interface for Nonlinear LLM Thinking]]></title><description><![CDATA[Alternatively titled: &#8216;What if you could see your LLM conversations as a map of your thinking?&#8217;]]></description><link>https://dspn.substack.com/p/canvas-chat-building-a-visual-interface</link><guid isPermaLink="false">https://dspn.substack.com/p/canvas-chat-building-a-visual-interface</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Sun, 25 Jan 2026 12:03:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3lY4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3lY4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3lY4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!3lY4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!3lY4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!3lY4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3lY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3lY4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!3lY4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!3lY4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!3lY4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73368ed9-5a2b-4af2-9d12-e7fc707d5271_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Ever found yourself deep in an LLM chat, wanting to branch off in a new direction&#8212;only to lose your train of thought or context? That was me, again and again, until I finally decided to build the tool I wished existed.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2025/12/31/canvas-chat-a-visual-interface-for-thinking-with-llms/">This post</a> is about Canvas Chat: an open-source, visual, nonlinear interface for thinking with LLMs. I&#8217;ll share why I built it, how it works, and what I learned along the way&#8212;especially for those who&#8217;ve ever felt boxed in by linear chat interfaces.</p><p>The idea for Canvas Chat had been simmering since last January: what if LLM conversations could branch, merge, and form a visible map of your thinking? For a long time, it felt out of reach&#8212;my browser and UI skills weren&#8217;t up to the task, and the implementation cost seemed too high for a side project.</p><p>But a Christmas break ultralearning sprint (and some pressure-testing of Claude Opus 4.5) changed my mind. Suddenly, it felt possible to prototype this in a day. I went from idea to working prototype in about 24 hours, then spent another day refining and deploying it. The result: Canvas Chat.</p><p>Here&#8217;s the core problem: linear chat forces nonlinear thinking into a straight line. You lose context, copy-paste between windows, and struggle to synthesize ideas across sessions. Canvas Chat solves this by letting you branch from any message, highlight and drill into specific ideas, and even merge multiple threads for synthesis&#8212;all on an infinite canvas.</p><p>Some features I&#8217;m excited about:</p><ul><li><p><strong>Branching</strong>: Reply to any node, not just the latest, and see your thinking split visually.</p></li><li><p><strong>Highlight &amp; Branch</strong>: Select text, ask a follow-up, and keep the original intact while exploring new directions.</p></li><li><p><strong>Multi-select &amp; Merge</strong>: Combine threads, ask synthesis questions, and let the LLM see the full context.</p></li><li><p><strong>Matrix Evaluation</strong>: Evaluate options against criteria in a matrix, fill cells with LLM help, and pin insights for further exploration.</p></li><li><p><strong>Web Search &amp; Deep Research</strong>: Integrate neural search and multi-step research directly into your canvas.</p></li><li><p><strong>Local-first, Multi-provider</strong>: No server-side storage, open source, and supports multiple LLM providers.</p></li></ul><p>Building this reinforced a lesson: you don&#8217;t need to be a UI expert to ship something useful. I stayed in product builder mode, described what I wanted, and let the LLM handle the mechanics. The creative work&#8212;deciding what nonlinear chat should feel like&#8212;remained human.</p><p>If you want to try Canvas Chat, it&#8217;s open source and easy to run locally. All the details (and the why behind each feature) are in the full blog post.</p><p>You don&#8217;t have to settle for linear thinking with LLMs&#8212;Canvas Chat lets you map, branch, and synthesize your ideas visually, making complex exploration possible.</p><p>Have you ever wished you could branch or merge your LLM conversations? What would your ideal interface for thinking with AI look like?</p><p><em>Curious to see Canvas Chat in action or want to try it yourself? Read the full post for details, screenshots, and setup instructions: <a href="https://ericmjl.github.io/blog/2025/12/31/canvas-chat-a-visual-interface-for-thinking-with-llms/">Canvas Chat: A Visual Interface for Thinking with LLMs</a>. I&#8217;d love your feedback&#8212;let me know what works, what doesn&#8217;t, or what you&#8217;d build next.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>P.S. Friends who are hiring have been sharing job postings. For those interested in the life sciences, here is one roles that I know of that has opened up: <a href="https://jobs.sanofi.com/en/job/toronto/product-line-manager-digital-m-and-s-ai-solutions/2649/30848733504">Product Line Manager, Digital M&amp;S AI Solutions, Sanofi</a>, referred by my friend <a href="https://www.linkedin.com/in/yunke-xiang-95376328/">Yunke Xiang</a>. </p>]]></content:encoded></item><item><title><![CDATA[How I Fixed a Browser Selection Bug with Sequence Alignment Algorithms]]></title><description><![CDATA[Alternatively titled: When your web bug needs a DNA algorithm (and a little help from AI)]]></description><link>https://dspn.substack.com/p/how-i-fixed-a-browser-selection-bug</link><guid isPermaLink="false">https://dspn.substack.com/p/how-i-fixed-a-browser-selection-bug</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 22 Jan 2026 12:00:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3XDd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3XDd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3XDd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!3XDd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!3XDd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!3XDd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3XDd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3XDd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!3XDd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!3XDd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!3XDd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2a0367-8767-4991-9b40-7102da68e80b_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Have you ever spent hours chasing a simple bug, only to realize the solution came from a field you never expected? That was me this week, wrestling with a browser text selection issue in my <a href="https://github.com/ericmjl/canvas-chat">canvas-based chat app</a>&#8212;until a dusty bioinformatics algorithm came to the rescue.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>In this post, I want to share how a frustrating UI bug led me down a rabbit hole of failed fixes, and how recognizing the problem as a sequence alignment challenge (yes, like DNA!) finally cracked it. If you&#8217;ve ever wondered when those old algorithms you learned might actually come in handy, this story&#8217;s for you.</p><p>The bug started innocently enough: users selecting text from a markdown table in my canvas-chat app would get weird, broken highlights&#8212;sometimes stopping mid-selection, sometimes highlighting the wrong characters. The culprit? KaTeX-rendered math and the way browsers mix up text from both the visual HTML and the hidden MathML for accessibility. The result was a selection string full of duplicated numbers, random newlines, and spacing that didn&#8217;t match the source HTML at all.</p><p>My first instinct was to normalize everything&#8212;collapse whitespace, remove duplicates, and try to map positions back and forth. But the deeper I went, the more tangled the code became. Every fix for one edge case broke another. I was trying to force two messy things to be identical before comparing them, and it just wasn&#8217;t working.</p><p>That&#8217;s when I remembered Smith-Waterman, the local sequence alignment algorithm I learned in undergrad bioinformatics. Instead of making things identical, it&#8217;s designed to find the best match between two sequences, tolerating insertions, deletions, and mismatches. Perfect for this mess!</p><p>I used the algorithm to align the start and end of the user&#8217;s selection to the HTML text, letting it handle all the browser artifacts naturally. Suddenly, all my test cases passed&#8212;even the gnarly ones with KaTeX duplication and cross-block selections. The best part? I didn&#8217;t even write the implementation myself; I described the approach and let Claude Opus 4.5 handle the code. My job was recognizing the pattern and guiding the solution.</p><p>If you&#8217;re curious about the nitty-gritty details (including code), I&#8217;ve shared the full story and implementation in the blog post.</p><p>Sometimes the best fix for a modern web bug is an old algorithm from a totally different field. Don&#8217;t be afraid to reach across domains&#8212;and let AI help with the heavy lifting.</p><p>Have you ever solved a problem by borrowing an idea or algorithm from a completely different discipline? I&#8217;d love to hear your stories&#8212;what unexpected connections have you made in your work?</p><p><em>If you want to see the full breakdown (with code and examples), check out the full post here: <a href="https://ericmjl.github.io/blog/2026/1/6/how-i-fixed-a-browser-selection-bug-with-sequence-alignment-algorithms/">How I Fixed a Browser Selection Bug with Sequence Alignment Algorithms</a>. If you found this helpful, feel free to share or subscribe for more stories like this.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[How I Rebuilt My tmux Status Bar with OpenCode and Claude (and Why It Matters)]]></title><description><![CDATA[Alternatively titled: How I stopped procrastinating and let AI help me make my terminal beautiful.]]></description><link>https://dspn.substack.com/p/how-i-rebuilt-my-tmux-status-bar</link><guid isPermaLink="false">https://dspn.substack.com/p/how-i-rebuilt-my-tmux-status-bar</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 08 Jan 2026 12:01:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!w88k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w88k!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w88k!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!w88k!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!w88k!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!w88k!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w88k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!w88k!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!w88k!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!w88k!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!w88k!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F14b4712a-6a21-4b15-8664-8e5c9c38f9c1_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Ever put off a five-minute task for eight months, only to spend an hour reinventing it from scratch&#8212;just because you wanted to try a new tool? That was me, rebuilding my tmux status bar with a little help from OpenCode and Claude.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2025/12/27/how-i-themed-my-tmux-with-opencode-and-claude/">This post</a> is about how I used AI pair programming to bridge the gap between my creative vision and the technical reality of theming my tmux status bar. It&#8217;s a story of iteration, failed attempts, and the surprising ways AI can amplify (not replace) our judgment and taste.</p><p>When I got a new laptop, I could have just copied my old tmux config. Instead, I procrastinated for months&#8212;until curiosity about OpenCode (a CLI tool for chatting with Claude right in the terminal) finally nudged me into action. What followed was a surprisingly creative session: I described what I wanted, Claude translated my aesthetic intent into working config, and we iterated in a tight feedback loop&#8212;no browser context-switching required.</p><p>We tried plugins like powerline-go (which failed hilariously), then tmux-powerline (which overloaded my status bar with info). When Claude Sonnet started looping on the same fixes, I switched to Claude Opus, which immediately suggested ditching plugins and going native. That was the breakthrough: using Unicode arrows and Nord color gradients, we built a clean, minimal, powerline-style status bar&#8212;no plugins needed.</p><p>The real lesson? AI let me work like a designer. I could say, &#8220;the arrows should overlap&#8221; or &#8220;make the battery segment green,&#8221; and Claude handled the syntax. Each iteration surfaced preferences I didn&#8217;t know I had. The process was less about technical know-how and more about expressing taste, with AI removing the friction.</p><p>If you&#8217;re curious about the nitty-gritty (including the final config), I&#8217;ve shared the full story and code snippets in the blog post.</p><p>AI can&#8217;t replace your creative judgment, but it can remove the technical friction&#8212;letting you iterate faster and get closer to what you actually want.</p><p>Have you ever used AI tools to help with a creative or technical project? What surprised you about the process?</p><p><em>If you want to see the full config, the step-by-step journey, and some lessons learned, check out the full post here: <a href="https://ericmjl.github.io/blog/2025/12/27/how-i-themed-my-tmux-with-opencode-and-claude/">How I themed my tmux with OpenCode and Claude</a>.</em></p><p>Happy Coding!<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From Coding to Building: How OpenCode and Claude Opus 4.5 Changed My Workflow]]></title><description><![CDATA[Alternatively titled: &#8216;Let there be features, and there were features.&#8217;]]></description><link>https://dspn.substack.com/p/from-coding-to-building-how-opencode</link><guid isPermaLink="false">https://dspn.substack.com/p/from-coding-to-building-how-opencode</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 01 Jan 2026 12:02:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!BR7b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BR7b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BR7b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!BR7b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!BR7b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!BR7b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BR7b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BR7b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!BR7b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!BR7b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!BR7b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8001c986-bbd6-4156-8e29-5e343d7b79e5_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>I used to obsess over code&#8212;syntax, edge cases, the nitty-gritty details. But something shifted. Now, I just describe what I want, and it materializes. It feels a little like magic, but it&#8217;s really just OpenCode and Claude Opus 4.5 doing their thing.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2025/12/28/you-can-just-make-stuff-with-opencode-and-claude-opus-4-5/">This post</a> is about my journey from being a hands-on coder to becoming a builder who directs AI to create. I&#8217;ll share what changed, how I adapted, and what I learned after ten days of deliberate practice with OpenCode and Claude Opus 4.5.</p><p>The transition didn&#8217;t happen overnight. At first, I was skeptical&#8212;could an AI really handle the architectural decisions, the documentation, the refactoring, and the edge cases? But as I spent more time with Claude Opus 4.5 (accessed through OpenCode + Github Copilot Pro), I found myself letting go of the urge to micro-manage. I&#8217;d ask for a feature, and it would appear. I&#8217;d request a refactor, and it would just happen. The gap between what I imagined and what got built shrank to almost nothing.</p><p>Over ten days, I put this new workflow to the test. I shipped over 150 commits across six repositories: a ski trip coordination website, a teaching clock app for my kids, infrastructure work for pyjanitor, a new conda-forge package, a custom tmux status bar, and a visual chat interface. The variety was key&#8212;this wasn&#8217;t just luck on one type of project. The AI handled infrastructure, greenfield apps, documentation, and even languages I&#8217;d avoided for years (hello, JavaScript!).</p><p>What surprised me most was how my review process changed. Instead of scrutinizing every line of code, I started by reading the model&#8217;s reasoning traces. If the logic made sense, the code usually did too. When I needed a fresh perspective, I&#8217;d start a new session&#8212;like getting a second pair of eyes, but instantly.</p><p>I also had to unlearn old habits. My decade-old &#8220;no JavaScript&#8221; rule? Out the window. The model writes JavaScript just fine. The real challenge became keeping my assumptions up to date with what the tools can actually do. I still need enough technical vocabulary to direct the AI and spot when something&#8217;s off, but I spend far less time on the mechanics and more on the creative direction.</p><p>The upshot: I&#8217;m spending less time worrying about how things are built and more time focusing on what gets built and why. The creative work is still mine&#8212;the heavy lifting is handled by the AI.</p><p>The shift from &#8216;I code&#8217; to &#8216;I build&#8217; is real&#8212;and it&#8217;s powered by tools like OpenCode and Claude Opus 4.5. The more I trust the process, the more I can focus on creativity and impact.</p><p>Have you tried letting AI take the lead in your coding projects? What surprised you&#8212;or held you back&#8212;from making the leap?</p><p><em>If you&#8217;re curious about the details, check out the full story (with examples and lessons learned) on my blog: <a href="https://ericmjl.github.io/blog/2025/12/28/you-can-just-make-stuff-with-opencode-and-claude-opus-4-5/">You can just make stuff with OpenCode and Claude Opus 4.5</a>. If you found this helpful, feel free to share or subscribe for more reflections.</em></p><p>Happy coding!<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Two Years, 104 Posts]]></title><description><![CDATA[Alternatively titled: What 104 posts (and a lot of AI agents) taught me about work, learning, and rest.]]></description><link>https://dspn.substack.com/p/two-years-104-posts</link><guid isPermaLink="false">https://dspn.substack.com/p/two-years-104-posts</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 25 Dec 2025 12:02:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gtBd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gtBd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gtBd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!gtBd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!gtBd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!gtBd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gtBd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gtBd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!gtBd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!gtBd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!gtBd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7461236-82d8-4249-ae8c-02cbf8cfa5f6_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas,</p><p>First off, Merry Christmas to all! I wanted to thank everyone here for your readership and support.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I started 2024 with a simple challenge: write one blog post every week. Two years and 104 posts later, I&#8217;m surprised by how much my thinking&#8212;and my work&#8212;has changed. This is a look back at what I learned, what I built, and where I&#8217;m heading next.</p><p><a href="https://ericmjl.github.io/blog/2025/12/25/two-years-of-weekly-blogging-and-what-2025-taught-me/">This post</a> is a personal reflection on two years of near-weekly blogging, with a focus on the evolution of my work with coding agents, Bayesian statistics, and the realities of data science in biotech. I want to share the patterns, tools, and lessons that shaped my year, and offer a candid look at what&#8217;s next.</p><p>Looking back at 2025, one theme stands out: coding agents. I went from experimenting with AI as a tool to treating it as a true collaborator&#8212;teaching agents with AGENTS.md files, letting them work autonomously, and developing patterns for agent-assisted programming. This shift changed how I approach both code and research.</p><p>But it wasn&#8217;t just about AI. I dove deep into Bayesian methods, especially the R2D2 prior, and found real satisfaction in applying new theory to messy lab data. Writing about these topics helped me clarify my own thinking and (hopefully) made the math more approachable for others.</p><p>I also got excited about new tools&#8212;Marimo for reactive notebooks and Modal for Pythonic cloud computing&#8212;because they actually made my workflow smoother, not harder. And I kept writing about the human side of data science: standardizing ways of working, communicating with lab scientists, and navigating the unpredictable biotech industry.</p><p>After 104 posts, I&#8217;m shifting my goals for 2026. I want to learn quantum computing fundamentals, write more about data science leadership, and build at least 10 experimental AI projects. I&#8217;m also giving myself permission to slow down: four posts a month instead of one a week, with more space for rest and strategic planning.</p><p>If you&#8217;re curious about the full journey, including a categorized list of all my posts, you can find it here: <a href="https://ericmjl.github.io/blog/2025/12/25/two-years-of-weekly-blogging-and-what-2025-taught-me/">Two Years of Weekly Blogging and What 2025 Taught Me</a>.</p><p>Sustained, reflective writing not only documents your journey&#8212;it transforms how you think, work, and grow. Letting yourself evolve (and rest) is just as important as showing up every week.</p><p>How has your own approach to learning or working changed over the past year? Have you found any tools, habits, or mindsets that made a real difference?</p><p><em>If you want the full story&#8212;including all the posts by theme&#8212;check out <a href="https://ericmjl.github.io/blog/2025/12/25/two-years-of-weekly-blogging-and-what-2025-taught-me/">the full blog post</a>. And if you found this helpful, feel free to share or subscribe for more honest reflections and practical tips.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Resilience, Reputation, and the Real Wealth of Your Career]]></title><description><![CDATA[Alternatively titled: Why your best effort is the most selfless gift you can give yourself.]]></description><link>https://dspn.substack.com/p/the-selfish-reason-to-do-your-best</link><guid isPermaLink="false">https://dspn.substack.com/p/the-selfish-reason-to-do-your-best</guid><dc:creator><![CDATA[Eric J. Ma]]></dc:creator><pubDate>Thu, 18 Dec 2025 11:31:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!J7HA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J7HA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J7HA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!J7HA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!J7HA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!J7HA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J7HA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J7HA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!J7HA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!J7HA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!J7HA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b5fb83-d3a0-4cd9-b1dc-185fde4f9b77_1792x1024.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello fellow datanistas!</p><p>Have you ever wondered why you should keep giving your best at work, especially when the company&#8212;or the industry&#8212;feels shaky? I&#8217;ve been there, and I want to share a perspective that&#8217;s helped me through the lean times.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://ericmjl.github.io/blog/2025/12/17/the-selfish-reason-to-do-your-best-work/">This post</a> is about reframing why we work hard, especially when motivation is low or the environment feels uncertain. I want to offer encouragement and a philosophy that&#8217;s helped me invest in my own growth, regardless of where I am or who&#8217;s watching.</p><p>This year in biotech has been a rollercoaster&#8212;ups, downs, and plenty of uncertainty. It&#8217;s easy to fall into the trap of doing just enough, especially when the world is talking about &#8220;acting your wage.&#8221; But I&#8217;ve learned that the real reason to do your best work isn&#8217;t for your company&#8212;it&#8217;s for yourself.</p><p>When you treat your effort as an investment in your own instincts and habits, you&#8217;re building the person you&#8217;ll become in five or ten years. Your reputation, your skills, your ability to make judgment calls&#8212;these are the things that stick with you, no matter where you work next. I&#8217;ve seen this firsthand with colleagues who went on to lead teams and startups, not because they waited for the perfect assignment, but because they consistently showed up and owned their work.</p><p>But this goes beyond technical execution. How do you handle mistakes and setbacks? I&#8217;ve made my share of blunders&#8212;like the time I wrote a scathing internal blog post early in my career. It was a tough lesson in humility, but it taught me that owning up, proposing solutions, and moving forward is the best way to build character and trust. Most mistakes aren&#8217;t career-ending; they&#8217;re opportunities to grow, if you let them be.</p><p>Ultimately, the wealth you build through your work will be more than mere titles or promotions. You will have the satisfaction of mastery, the strength of your reputation, and the resilience you develop along the way. Even when things are tough, don&#8217;t give up on investing in yourself. Fortune really does favor the prepared!</p><p>If you want to read the full story and dive deeper into these ideas, check out the original post: <a href="https://ericmjl.github.io/blog/2025/12/17/the-selfish-reason-to-do-your-best-work/">The selfish reason to do your best work</a>.</p><p>Do your best work for yourself, not for your company&#8212;but because the habits, reputation, and resilience you build are the real, lasting wealth of your career.</p><p>Have you ever had a moment where doing your best&#8212;despite tough circumstances&#8212;paid off later in your career? I&#8217;d love to hear your story.</p><p><em>If this resonated with you, please read the full post, share it with a friend, or subscribe for more honest reflections on work and growth.</em></p><p>Cheers,<br>Eric</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dspn.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Eric's Data Science Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>