Agentic Data Science in a Reproducible Marimo Notebook
Eric Ma shows how Marimo Pair turns a notebook into a shared workspace for data science agents, using a protein-engineering analysis to explore reproducibility, visualization, and the limits of automation. He and Dan also discuss design guardrails, opinionated repository structure, and a one-foreground-task practice for managing agentic work without burning out.
Show notes
Dan and Eric Ma discuss what changes when a data scientist treats coding agents as collaborators in an exploratory workflow. Eric describes how quickly his own ideas became obsolete: an agentic data science skill built around Markdown journals and generated plots gave way within weeks to Marimo Pair, where an agent can work directly inside a live notebook.
Eric uses Marimo notebooks for more than interactive analysis. They preserve debugging sessions beyond an agent’s context window, give colleagues a shareable pre-read, and keep code, visualizations, and environment definitions together in a single Python file.
The live demonstration revisits a protein-engineering analysis from Eric’s time at Novartis. An agent pulls activity and stereoselectivity data from a published paper, filters single-point mutants, builds ECDFs and a joint distribution, and maps activity or selectivity across protein positions.
As we see live, agents don’t always succeed. The protein-structure viewer fails during the demo, and Eric explains that an agent can debug its way through the problem but does not always finish within the available context. Even so, the ability to attempt a custom 3D visualization changes what feels feasible. Eric says he would previously have avoided the task or spent hours wrangling a PDB file and old PyMOL documentation.
From there, the conversation moves to guardrails. Eric uses an Arrow of Intent approach to carry a project’s high-level design through feature-level documents and testable specifications, giving both an agent and a future version of himself a record of what the software is supposed to mean. He pairs that with opinionated repository templates and AGENTS.md instructions about refactoring, documentation, testing, and coding style.
The final turn is about attention. Eric finds outcome-driven agentic coding less tiring than solving every technical problem by hand, but context switching between foreground tasks caused burnout. His current practice is one demanding foreground task, two background tasks, and as many unattended automations as possible. The point is not to control every step an agent takes. It is to define the output, preserve intent, and build enough structure that the work remains understandable when the context window, model, or human changes.
Chapters
From this episode — Eric Ma
Everything that I wrote down in my agentic data science skill is outdated within the month of me thinking about it.
Now with LLM agents I can be a lot more ambitious about what I try to tackle.
The most exhausting part is if I have to juggle two foreground tasks and constantly switch between them.
It is definitely a practice to learn to let go of the how and be more descriptive about the what needs to get done.
Mentioned
- Marimo
- Reactive Python notebook used for analysis and shareable pre-reads
- Marimo Pair
- Agent skill for working inside running Marimo notebook sessions
- OpenCode
- Eric's preferred vendor-neutral open-source coding agent
- cmux
- Native macOS terminal workspace with panes and embedded browser
- Machine-Directed Evolution of an Imine Reductase for Activity and Stereoselectivity
- Published protein-engineering study Eric reproduces during the demo
- cloudscraper
- Python package the agent uses around bot-protection pages
- Polars
- Dataframe library used to load and transform the datasets
- Plotly
- Interactive plotting library used for ECDFs and heat maps
- PEP 723
- Inline metadata standard supporting self-contained Python scripts
- uv
- Python tool used for portable inline script environments
- 3Dmol.js
- Browser-based JavaScript library for molecular structure visualization
- anywidget
- Toolkit for reusable interactive widgets inside notebooks
- Protein Data Bank
- Structural biology archive used as the protein viewer source
- PyMOL
- Molecular visualization software Eric says he would previously use
- The Arrow of Intent
- Design-driven approach that carries intent toward implementation
- Hermes Agent
- Coding agent Eric studies for its auto-learning workflow
- Obsidian
- Markdown knowledge vault used for automated transcript processing
Transcript
I’m Dan Gerlanc
and welcome to Agents and Engineers, the podcast about agentic AI and software engineering. Today we’re joined by Eric Ma, who is a senior principal data scientist at Moderna. Prior to that, he was an investigator at Novartis and an Insight Health Data Science Fellow.
He has a PhD in biological engineering from MIT. Additionally, he is a prolific open source contributor, instructor, and blogger. Eric, great to have you on today.
Thanks,
Dan. It’s good to be here.
One, I’ve I’ve taken a lot more leaps in in kind of the code that I’m writing, right? I’m doing more stuff in languages that I’ve I don’t touch on a daily basis before. So that’s definitely one big change. I think I think what’s also like you talk about the the the speed at which changes happen, right? One thing that was really cool that I observed was I came up with some ideas on how to do a gentic data science.
in in in January, February experimenting with agent skills and like how we can do it. And by February I had I thought I had nailed it, you know, it’s like, let me, let me, let me suggest to my colleagues that if they are to do data science kind of work, exploratory de data analysis type of work, that they should have a skill that instructs their agents to write markdown files. Like keep an append only journal of what what you know that session is analysis session is all about.
and to have the agent write Python scripts that output plots and whatever and embed them inside the journal, link them inside the journal. And I thought, man, this is such a cool system. By the end of February I saw
A new world like of how we can do agentic data science work. Pair coding with Marimo notebooks through Marimo Pair. sorry, pair coding with LLM agents, coding agents in a Marimo notebook. And immediately re realize, man, everything that I wrote down in my agentic data science skill is outdated within the month of like me thinking about it. And so
since about March or April I’ve just every talk that I’ve been outside talking about has been Marie Maupair and that’s that’s been very different. because I I and that changed within the six months, not even like outside of the six months. So it was really cool to see that pace of change and I thought that was that was really awesome. because it means that we’re we’re in a we’re in a time and era where there’s like better and better tooling coming out for folks and
Or at least with this, you know, Cambrian explosion of like tools and stuff, you know, ‘cause the barrier is so lowered. we’re seeing this Cambrian explosion of tooling coming out and it’s just really, really cool. yeah, those are those are like two major ones that have been different for me. Like one is different ways of doing data science and the other is like touching languages I’d previously just not would veer into.
Yes.
Yeah, yeah. I use it for quite a lot of use cases. So one is
I was I I actually recorded a YouTube video, just a video that I put on YouTube that was about how to use Marino Pair for a genetic data science and I in it I actually replicated an analysis that I did for a paper that I had published, but I did it in like new packages and with web technologies that I’ve not touched in a long time. it’s a protein engineering one. And then
There’s another use case that I’ve had, which is if I need a running debugging log, like I’m building software in Python, and it’s maybe a long-running job that’s happening running in the cloud, this is the kind of use case that we have at work. I’d I’d use the notebook, Marimo notebook, as a way of recording my debugging session.
But also having code to showcase, you know, like what what what the debugging steps were in the past. And I thought that was cool too, because it gave me a chance to like have this shared canvas that outlasts a shared canvas of work done that outlasts the coding agent’s context window. Cause when you hit compaction, you know, you’re gonna have performance degradation, right? So for the coding agent. So that was
That was another real really cool way of like using Marimo notebooks. and then of course the third way now that I use it is to share pre reads and the likes with my colleagues so that
If I need them to take a look at some work before we go into an actual meeting, then I’ll I’ll show I’ll send them the notebook. Probably sometimes I might export it as say like a static HTML or or publish it on on our internal deployment platforms and then share that with folks to ensure that they are able to to to take a look at the work as well.
That’s right. That’s correct. So actually if I were to share my screen, I’m gonna go over to my browser. So let me fire let me load the page on my side first, and then I’ll share my screen.
Yep. So this is the Marimo Pair skill. It allows basically as the about says drop agents inside Marimo running Marimo notebook sessions. I remember when Trevor Mance, who is the main developer of Marimo Pair, when he first showed me
Marimo Pair, I was I was like, what? You can do this? Because the previous way that he had shown me actually was to use Marimo’s watch mode, which would refresh the page, but not necessarily
reliably re-execute the kernel, whereas with Marimo Pair, now coding agents have a tool that let them directly manipulate the kernel of a Python notebook, which is like totally rad. I I was I was blown away. and if you want I can actually demo it real quick. Let’s see
it? Okay, let’s see it. So I’m gonna go first off I’m gonna stop my screen share.
and let me go to CMUX and share this instead.
agentic
coding tool cmux.
Yes. it gives me terminal multiplexing in a native macOS app and comes with built-in browser. So you can go to GitHub.com, for example. And you know, if you’re doing your work, if you’ve used Codex, you know, this is a quite similar workspace is on the left, terminal and browser on the middle and right, and for me I have OpenCode as my so I can go OpenCode.
And OpenCode is my preferred coding agent. I have this preference for remaining as vendor neutral as possible. So I don’t really like to lock myself into one system
that’s born out of my training back in the open source days, I guess.
So what I’m gonna do next is I’m actually just gonna share my entire screen So we got this guy, notebook on the right, and I’m gonna launch OpenCode here on the left. The way Marimo Pair works is you go
You first need to have the skill. So if I are to go to here, you’ll notice I have the Marimo Pair skill. And it’s got its contents already present. So therefore, when OpenCode launches, I can go connect to my Marimo session on.
Just paste in that guy. Alright, we’ll give it a moment over here.
I’m gonna do, I’m gonna replicate a protein engineering analysis that I did way before. And that analysis is basically from this paper paper, Machine Directed Evolution of an Immine Reductase. So with this guy.
We are going to reproduce this paper. So let’s not put the figure thing here. We have two supplemental data sets that are in here. Please use cloud scraper or any other means to pull in the data set as a polar’s data frame and show me.
The first CSV is 002.csv, it’s protein activity, sorry, enzyme activity, and 003.csv is enzyme stereo selectivity. I’m gonna disambiguate all that jargon while while the agent runs through its thing.
Okay, so this paper is something I it was it came from a protein engineering platform build out that I did at Novartis and I have very fond memories of that. It was one of the best collaborations I’ve had within a company, with colleagues. very fond memories. we were trying to engineer a protein to do enzyme catalysis of
It’s it well it’s an immune reductase and so it does a reduction reaction and we wanted to use that enzyme for prot for cr green catalysis purposes. Now
That’s
that’s a good point. so a lot of catalysis of chemical reactions uses heavy metals and those are not easy to dispose of or clean up. Whereas if you’re you to use an enzyme, it’s all organic matter, so it’s easily biodegradable, etcetera. So that’s the TLDR heavy metals versus like biological matter to do a certain reaction, to make a
reaction.
like avoid mercury,
things like that.
Yeah, yeah,
something like that. Mercury, palladium or whatever. and so the idea here is then we wanna be able to pardon me. we did a campaign, this entire campaign that allows us to create mutations on that enzyme, mutate that enzyme to make sure that like we
We can we can mutate that enzyme and then go in go in and measure both its activity and its stereo selectivity. And what stereoselectivity is, is if you go back to your perhaps high school or undergrad organic chemistry days, every molecule, organic molecule, can have a left-handed form or a right-handed form. Like if I were to put if you take my f fingers as a demonstration here, on my fingers you can put at different atoms, and on my third finger, second finger, and first finger,
as well as my arm that you can have exact same atoms in the exact same positions, but because they’re mirror images of each other, one might be biologically active and the other might not. Right. And so that becomes chirality.
So these are being pulled from the paper.
And what is cloudscraper?
Yeah. Yeah,
exactly. Exactly, exactly. So and one other thing that I also much prefer is that we do not rely on local file paths for our data files.
Instead, we should be relying on canonical sources of truth for any given data file. So I’d rather pull straight from source, where a practical, rather than cache and download a data file locally. And this has a really strong reproducibility argument because in order to ensure reproducibility, we really don’t want to be in a position where the notebook depends on someone’s home directory and custom file path.
And the likes, and it just not it’s just therefore not portable from one machine to another. Right.
For sure, that can
be a big pain in getting
Exactly. And in that case then, now then we have to ship two things or three things to them, right? It gets even worse if we have to ship a conda environment YAML file, whereas Marimo Notebooks can actually just carry their own environment definition and therefore, you know, not like it literally can be a single file that I send over to someone else. In fact, one of my friends Hugo last year at SciPy he asked me, he nerd sniped me into making a script for him.
And then I did it entirely in Marimo Notebooks and I just dropped in the script and it worked flawlessly because I designed it to be uv like it was it had it carried its own end through PEP 723 style inline script metadata. and then it was reproducible because there were no there were no like hard coded file paths and that sort of thing. And so he he just ran it. Like that’s that’s the ultimate in reproducibility. In any case.
that you’re using
because you can use uv, which also supports those directly.
That’s correct.
in fact, if we’re to look at the source code right now for demo.py, which is the notebook file, this section is what defines the environment. And that is why this notebook is reproducible. Because now we’re able to define the environment and just send someone a single.py file. And that’s the real sweet spot for reproducibility.
exact
And you can also diff this easily because it’s pure Python code, it’s not JSON,
so you don’t need any special Git tooling to make sure that it diffs cleanly and things like that.
Exactly,
exactly. 100%. So here’s the two data sets, the two data frames. Right? I got this data frame over here, and I think it’s only giving me the head. I’m gonna not do the head and show everything. So then what I get now is I get the built-in data frame viewer can tell me the distribution of, you know, certain columns and values and that sort of stuff.
So that’s kind of cool. you might even want to like build your own custom viz if you would like, but I’m through point and click, but I’m gonna do it a slightly different way, okay? So first things first I need to understand the distribution of data for like the we’ve got the mutations, sorry, and then we’ve got the mean values over here.
So I’m gonna try something. I’m gonna dictate into my machine. I would like you to isolate out for each of the data frames, isolate out the original, like sorry, the single point mutations, they have no semicolons in their in their file name, in their mutation name. So I’m just gonna give an example for the listeners then. So just give me a moment here. Right, you’ll notice like some of them have like three mutations listed. They have semicolons in their name.
So for each of them, I want you to create like a new filter filter down each of the original data frames to just the single point mutants. And then just below each, just below the the load stereo cell, I want you to create two ECDF plots using plotly that show me the distribution, the marginal distributions of
enzyme activity or are inantiomeric excess in the in the data set for just the single mutants.
Okay, so we’ll let that come in.
Superwhisper. but I’ve seen many. They’re all they’re all based on Whispr there. It’s just a matter of ergonomics and preferences at this point. so it’s gonna do its thing. one of the very important stuff to note,
We had eleven thousand measurements for activity, but because I know this from context, stereo selectivity or chirality measurements were actually more expensive to do, so we had to do a down selection and therefore we only had four hundred and twenty seven in total measurements. and so that was a little difference. so there’s a bit of a what what we call a down selection step happening.
That’s
right. So some of the mutants, you know, they were not not the best and we just kinda ignored them for s selectivity. Plus if you also think about it logically, if no catalysis happened
There’s no way we can get a stereochemistry of the product. So no point measuring those guys. and here we go. Here’s the ECDF of the single point mutants and you can see it’s very skewed to the left. There were a lot that are
Basically no activity. and then here’s the R. Here’s the R and antiomeric excess. A lot of them had like slight bias towards the R form rather than the D form, if I’m not mistaken. but there were some that were like very exclusive, right? Like they their the products were all the
main products that we actually wanted, which were on the right hand side over here.
Yes.
Yes, yes. Ideally, ideally. So but you know, we don’t always get it. Alright, cool.
So we got these. This is good. I’m gonna do another plot which is let’s
And
why is it better if they’re all on one side or not?
it it means so if if the catalysis products are biased towards the R form, that’s gonna give us a of molecule that is biologically active, whereas if it’s the other form, I can’t remember the letter.
But if it’s the other form, then it’s basically biologically inert, and that’s how biological systems actually work. so just as a thought experiment, for example, all of our proteins are made of chiral molecules as well, and they are all of one form that is predominant across all of life. Now, if you gave the same
the opposite form to a human being, it wouldn’t be incorporated into their in into that human in into our into our bodies. It would just pass right through because it can’t be used. It’s not recognized by any of our biological systems. So that’s that’s why. That’s why it’s important to have like forms that are towards the right hand side rather than towards the left hand side.
Okay. Yeah. So let’s
let’s do some more let’s do some more EDA, right? Like this is all nice and good. So now the next thing I want you to do is do a join on the single point mutants. And then I want you to
Yeah, so I want you to do a joint on the mutation and plot the joint distribution between RN antiomeric excess and the activity value. And that way we can get a flavor feel for what the correlation is between the two of them.
I’m not a priori expecting them to have a correlation, but in case they do, we’d like to double check. So I’d also like you to calculate the correlation coefficient and annotate it on the scatter plot. So x-axis is activity, y-axis is the R in Nantio selectivity.
Okay, so we’ll let that go through.
And so you’ll notice I’ve basically been like going one plot at a time, right? And I think this is something where it’s for data science at least, it’s in in stark contrast to how we would do it for software development work. Now you’ll notice over here the Pearson R is like basically not basically zero. It’s basically zero. and it’s
Not for quant
finance, that’d be good.
okay, for biological activity, man, this is like this is this is not a this is not a correlation. This this is no activity. There’s no there’s no relation. Which actually kinda makes sense. there’s no a priori reason why the nantumeric excess and mean activity has to be correlated.
We do know that if you don’t have any activity, then like if it’s zero, absolutely zero activity, we shouldn’t observe any of the product in anti-meric excess, and should be zero. But whether it enzyme prefers one form or another shouldn’t be related to its catalysis. It really should be like zero. okay, so let’s do another thing. because we have
which
it may be here if we looked at the confidence interval, could include zero.
Yep, that’s right. We could.
That’s right. because we have single point mutation data, we can actually imagine plotting the on the x-axis, for example, we would plot position on
on the amino acid on the protein string and then mutant letter on the right on the y-axis. and again, just for the listeners, right? Like this is this is how we record mutations. The wild type is the first letter, the numbers come in the bit middle, and then the mutant is the last letter. And so we can put like position on the x-axis, mutant on the y-axis, and then perhaps let’s do.
the activity value and be able to toggle between the stereo selectivity versus the activity value using a Marimo drop down on the on the heat map. So make the heat map with Plotly and let’s let’s take it from there.
Okay, so we’re gonna do that and we’ll see whether there are any regions or like positions that seem to be favored. we’ll also double check it with against some calculated means and averages and that sort of thing.
I at the beginning at the end of last year or the beginning of this year I can’t remember. I paid for an entire year of Z dotai on their GLM five on when they were still only on GLM four point five. it was like three hundred dollars for the entire year. And basically for me it was a bet that GLM would get better.
And it has gotten better over the over the over time, so that’s it’s been really worthwhile. It’s actually more worthwhile for me to use this than anything else. Cause across hundreds of millions of tokens of usage, I barely nudge the usage limit. I’m frequently at under like one to three percent usage. It’s crazy. Yeah.
It’s it’s nuts. It’s it it’s so efficient for me. there’s a little bit of a problem. There are more mutations. There’s a little bit of a problem. The heat map is very sparse. And I think I know why. You might be using the joined data frame rather than the original enzyme activity data frame. I actually want to see the full enzyme activity spectrum from across all all positions.
So agents might make a mistake, but it already did quite a lot of what I wanted, so that’s great. one little detail from a good data visualization perspective, this should actually be a diverging color scale. In addition to making that change, I think you should make R in antiomeric excess a diverging color scale because it is a diverging scale value.
Okay, let’s see. So it went and did something and take a look at that man. Look
at that. That’s a beautiful heat map. I remember making a heat map like this before, but there’s also like regions that are like lower activity, higher activity, sorry, they’re lighter colored. These are the ones that are great for potential mutational
engineering, protein engineering. And like mapping this out.
by the way is like a really expensive endeavor because the the the cost of one of these experiments can runs in run into the thousands to tens of thousands of dollars. and it takes on anywhere from
Two a week to three weeks to finish running that experiment. So this is very hard-earned data. And in fact there are lots of gaps, but we just had to accept it because to to selectively go in and like measure these gaps would have been really, really hard. Yet we saw there are regions that are amenable to engineering, right? So maybe one of the things we can do is we can actually just plot the plot the average or mean or maximum.
Value over position, just a sanity check. So let’s try that. Make me a line plot that has mean or maximum of the selected value at any given position and actually just take the drop-down measure style and add a means mean or maximum selector drop down that I can use so that I can take a look.
So that I can take a look at how the value changes over position for the mean or maximum activity or or selectivity.
So we’ll let that go through.
One thing that I thought is also really cool is that I can use things like any widget, for example, to build custom tooling for myself. And I’m gonna show that once we’re done with this one because we’ve been using Plotly, we’ve been using Polars, those are all someone else’s tool, they made it. But there’s one question that I want to answer, which is that proteins, they aren’t linear.
In only they also assume a 3D structure. there we go. Yeah, take a look at that. Mean mean by position, and like these positions are linked together. Like these positions look like they could be good. Candidates for engineering. Now proteins are
And you want to find ones where there’s
clustering of higher mean values.
Probably, yeah. Those those could form like clusters of positions where we might want to take a look and start investigating how to make mutations. What mutations we might want to combine together. So let’s actually
do one final thing. I’m gonna show you the protein.
I want to build a custom viewer for the protein structure that we also crystallized here. It’s called the the protein structure is 70, as in the letter O, 70G3, and you can find it on the protein databank. And the way that I want to view it, I want you to use 3D Mole.js to view that structure in the browser for me. And we’ll take it from there.
So let it handle this for a moment.
If you’ve never heard of it before, there’s a thing called any widget.
And what any widget does is it makes us it gives a tooling for making reusable interactive widgets directly within a notebook. and I think what I really what was really fascinating for me was that now with any widget, I should be able
Are these using React?
Is it using React under the hood here? Or…
this is where we get into I think it uses JavaScript. Is vanilla TypeScript or JavaScript? I think I forgot to say use any widget. Yeah, I forgot to say use any widget. So I’m gonna have it use any widget. Cause this HTML is not working. Cause it’s not doing what it’s designed to do yet. Give it a moment. I’m gonna let it edit the cell.
Cause like one of the things I definitely want to do is like what if I could plot this value, line value, on the 3D structure instead?
This is this is great to see because it’s like we’re seeing the agent just go and try to figure things out. So let’s see.
So first off, to just get to here would have been like a good hour or two carefully sifting through the data sets that we got, making sure that the data quality is data quality’s all good. and then when we get to the protein structure viewer, I would not have built it to begin with. I would have like downloaded the PDB file.
wrangled for another hour or two on Stack Overflow, figuring out how to customize a PDB file to contain the structure that I want with the values so that I can color it a certain way and then I would then go into PyMol’s documentation, which is very, very old.
and it’s like it’s a very old piece of software and it doesn’t have necessarily the best. yeah, it doesn’t necessarily have the best. And so it’s like a little bit how do I put it? It’s it’s it’s it would have taken I would just not this would have been an inaccessible thing for me in the past. Whereas it would not be feasible and
I would I would not even try.
So this is I think there’s a few people who are online who have gone on pat podcasts before, they’re saying, Yeah, I just wouldn’t have done it, right? and now with LLM agents I can be a lot more what do you call I can be a lot more ambitious about what I try to tackle. I’m gonna double check something over here. Anyway
Yeah, I think especially for
data visualization code where you’re
almost always writing something fairly custom.
Yeah, yeah, exactly. So okay, that is the right right one. Well, this is great because we’re also gonna see a coding agent directly go in and try to debug itself out of its way. and so this is this is kinda cool. It’s actually really sometimes fascinating to observe what a coding agent is doing behind the scenes.
So yeah, it’s it’s really cool.
Yeah.
Yeah, yeah, that’s right.
Great question, man. Like this just this week I I sorry, it was just last week that I relearned that the Hermes coding agent actually has like an auto-learn mode. it’s it’s auto-learning, so it’s actually keeping track of like every N chat turns it is observing what happened in the previous chat turn and it’s like keeping track of things.
Okay, let me see. I might need to restart the kernel. That’s okay. So then I what I did with OpenCode was I actually asked ChillM51, go study, open go study the Hermes source code and then go see how you can implement this over here for us in
in a in in in OpenCode itself, right? And and I told it the goal is I want you to make sure that this harness that component harness component that you’re going to make, I wanna make sure that it is installable by someone else later on, once I am done. So I thought I thought that was real cool, man. I
So now you have
that running. Do you have
It’s actually on
within every session, every five chat turns, it’ll mark it’ll go in and like note down some observations and summarize it. And then overnight it’ll go in and like clear if I leave my laptop on, it’ll go in and clear. I’m gonna see say nope, I can’t. I think you should just rely on
any widget and not mode.html. and we’re still saying there’s new error there’s a new error. Okay. Also says this. Okay, let’s see.
If this doesn’t work, that’s okay. But I’ve done it it it’s you know, it’s LLM coding and the likes. Sometimes it might take a little longer. But I have done this one in live demos before where we actually you can actually see the protein structure. And one thing that I did then was to actually color every position by the value that was listed over here. I think we can make it happen. I’ve seen it before. it just takes a
If I believe
in you, in GLM.
Yeah.
Yeah. let’s see here. And if I just refresh the page.
Now we have this old error.
ESM, I remember when I took the class by Trevor last year on po one thing I’m gonna do actually is I’m gonna say search online for how to fix this issue. Okay, so we’ll let it let it fix this issue. If it gets stuck in a loop then I’ll I’ll I’ll make it do that sort of thing.
So while that’s running, maybe I’ll go through one other agent skill that I’ve been like really heavily using. and so this one is within Canvas Chat, which is a project that I’ve been working on. But I can show Canvas Chat later. Meanwhile though, let me see. Arrow of intent. There’s this agent skill written by this person. What’s this person’s name?
Jess and it’s a skill. And she has Jess has this entire thing. So if you look if you basically go Google for the arrow of intent and make sure the URL is Loki.ws or something like that, you’ll get it right. and
Here’s the skill. Design driven dev skill. It is
No longer there? Can’t be there. LinkedIn intent dev, arrow maintenance, reference, arrow doc. Okay. Maybe there’s been a few updates, but I actually forked it, put it inside my own skills repo because I really enjoy using it. And it’s over here. And I made some upgrades onto how it works. It’s a skill that you install, and what it does is it really ensures that the
intent that I have for the entire project gets propagated from a top level easy to read high level design to a lower level design doc for each of the features to then testable specifications called years. I forgot what years is exactly. Let me just go back here.
So easy approach to requirement syntax and they are you know testable these are all testable you can write a test against each of these after writing the code and so then like and also you can specify that you know this particular code through a comment this particular code
implements a particular specification. So it’s a variant of spec driven development. I think I really enjoyed using this one because the flow just kind of fit my brain a little bit better. It may not fit everyone, but I used it very heavily in the development of Canvas chat. So if I were to go to here and go to the docs directory and go to
The designs
There’s like, let me just check here. Agentic mode.
You’ll notice I have like the individual low level design doc.
And it looked something like this and it it was me trying to like re design a new mode for inter interacting within this app called Canvas Chat. And it was really like I would basically n I only need to I trust it I trust actually the process of it knowing my intent from my vocabulary enough that it will actually write the low level document in such a way that I don’t even really need to
modify it too much, but what it does is it propagates my intent all the way down to specs specs and then from specs I can go back in once I once the implementation is done I if if I find something is wrong, what I’ll do is then I’ll I’ll actually ask it to re-impl rewrite the
Design docs to make sure it reflects my updated intent. Now, how is this helpful? Well, it’s helpful because it provides yet one more guardrail against a coding agent going crazy with a code base. So let’s say I switch from GLM 5.1 to Cursor, Cursor Composer 2.5. In the absence of the intent docs, the design docs, the intent of any implementation is just not.
cl preserved or present or accessible for a coding agent. Whereas with it, and so then you could clobber over old features that were working. Obviously you would want to have tests to help check for that. But you might also introduce subtle bugs that are hard to catch with automated testing as well. And I think you get the point, right? But also it makes it easy for another human to go
like there are times where future me
has proposed something that actually ran counter to my original intent and the intent was captured in the design docs. So it served as a second guardrail against like me, future me, clobbering over my current me. and so you can see there’s like it’s just yet like software tests, it’s a bit of a guardrail as well and and that helps a ton for maintaining the
Yeah, maintaining maintaining the the as the as they call it, the arrow of intent.
Yeah. Yep, exactly.
Okay, this is not working, but I have a YouTube video as I mentioned, in which I did
So if I go to there, like a gentic data science with Marimo Pair, if you go to my channel, it’s over there. And actually towards the end, I’ll just very quickly mouse over without the sound, without the sound. Right? Like I was able to produce a protein structure viewer and change it from, if I came back here, I could change it from the original colorful view to then changing it to
take advantage of the the values that we actually saw on the protein structure. And so I just kinda wanted to to showcase that. I’ve done it before, obviously didn’t work out this time round. I think of the con the context window might have been polluted by a previous implementation. So be it. Whatever.
Sometimes you gotta
clear the context or start from the top.
Yeah,
that’s right, exactly. that’s that’s sort of the the main idea behind this this whole Marimo Pair thing. And I thought it was really cool. It’s really cool to basically have a canvas for agent and human collaboration. And for me it was really amazing to see that.
Cool.
I actually don’t think I have a strong app that
I think other people would would push back on.
Yeah. Cause cause every software is so much more malleable now. and I think you know some of the strong opinions that I do have I’m I’m not sure people will necessarily disagree with. Like for example structure, file structure in a repo. Very important. Fundamentals. Like it’s it’s decades old stuff that if you have template repos
For say data science projects, it makes it easier to turn it into software. And that’s where, and sorry, but data science skills, data scientists knowing how to code very well, code, sorry, data scientists knowing how to code like software developers, you know, basic refactoring, documenting, and testing, right? If a data scientist knows how to do that, then the chance of them taking their work.
into a mode where that you can have high leverage with software development, software deployment, sorry, becomes really high. and I don’t think that’s anything controversial. and in fact in an age of agents, my opinion has on that has gotten even stronger. We need, you know, agent skills that steer the coding agent to write in a very opinionated style.
Because if we have an opinionated style and good code organization, it actually makes it easier for the coding agent to implement exactly what we want in such a way that is maintainable in the long term, even if the token stream were to be disconnected. yeah. I’m not sure that’s a
Do you have that
set up in your skills, all of the templates?
Yeah, yeah. So for my for for at work and at and on my personal projects, I have a if I’m doing a Python first project then we have a permit we have a standard template repo that is a cookie cutter repo that our CLIs are capable of pulling in and and templating in.
And yeah, it’s it’s kinda that kinda just that man. It’s like that that’s that’s the standard thing that I would I would use and you know coding agents, I teach the coding agent through an agent skill. What after after the template repo is instantiated, the AGENTS.md file encodes a lot of at least my own preferences about how code ought to be written. You know, I prefer functional style over object oriented.
But objects are okay if you need to put data together. if you do use objects, make sure you use fluent style. So, you know, like pandas, you can method chain, right? I actually remember once, one of my colleagues, he he’s not a software person. He he did his grad school at MIT in material science and for five, six years did not know how to code. He came here, still didn’t know how to code until about a year and a half ago.
He was moved into the data engineering team for some reason. But he was moved in. and so then he really started picking up coding. And one day I was reviewing his code and I was like, man, dude, your code’s beautiful. Your objects are fluent, they’re they’re method chaining. I can write, I can see the code that you want to write is like really clean and tidy. How’d you pick this up? And he told me.
I didn’t know. I thought that was just the defaults. Then he thought for a moment and said, no, wait. I think you put it he told me, I think you put an agents.md that we should prefer flu and style. And so then like it just became part of his sense of taste as well. so now I came to realize, holy smokes, there’s like real leverage in using you know, creating h high quality, you know, agents.md.
Other skill files.
Yeah, it’s a good one. So I guess previously with writing code by hand, if I solved a really tricky, tough technical problem, I would be tired but accelerated that I did solve a really technical problem. Now most deeply technical problems are solvable by just describing what I want as the actual outcome.
So I’ve become a lot more outcome driven than I have been by process driven in that sense of like the the style of the code has has not been a major motivator for that sort of satisfaction. But it’s the context switching which has really taken a toll through to which then I’ve I’ve started to develop a set of like practices, at least for myself. I’m not sure how universal they are.
But at least for me it’s it’s like one foreground, highly cognitively demanding activity, two background, where it’s like, it’s a routine deployment, just get the agent to, you know, check and fix in a loop. And then as many as I want automations in the back like in the in the shadows, but like I just don’t have to check on them. But the agents can run them. If I set up them, set them up as automations and invest in like really defining repeat a re
defining repetitive workflows for which an LLM needs to process text and basically do summarization or reformulation into something else, then investing in that workflow actually helps a lot. for things like for example my work vault or my personal knowledge vault in Obsidian.
The work vault is just it’s just markdown files, right? But I’ve gotta have a system where it’s like here are my transcripts, here are my meeting notes, transcripts turn into meeting notes, meeting notes turn into daily bullet entries and the likes. There’s a whole system around it. But once I defined it, I can get a agent to go, All right, like previously I would need to prompt an agent as soon as I put drop in a transcript. Hey, I put in a new transcript, help me process it. Now I can just let let let let it trigger
I can just drop in the transcript and every hour it I have an agent sent out to process unprocessed transcripts, you know? That’s or unprocessed meeting notes. And now I just don’t think about it anymore. So that’s a bit of a you know, the the the shadow tasks we need to like Yeah. So so to get around the constant context switching, the the the most
Exhausting part is if I have to juggle two foreground tasks and constantly switch between them, that’s when it gets really exhausting. That’s actually, you know, I was not disciplined about this way back in March or February. And so I’d constantly have two or three foreground tasks that I was working on and constantly switching between them and not just not I was burnt out in April for that. Partially was because of me getting so
obsessed with productivity, you know? And it it didn’t work out. So I’m I’m I’m glad I figured this one out, at least this little piece out.
That’s that’s right. That’s right. That’s
right. And I think it it is definitely a practice to learn to let go of the how and and be more descriptive about the what needs to get done or what the output needs to look like to become more outcome driven. I guess, you know, manager being a manager team lead has given me some experience in trying to specify that I
Well it I will freely admit I d I’m not naturally inclined to want to do management, but like I do feel that working with people and not doing my absolute best to not try to try to not micromanage how they do their work their work, but only hold them accountable for the output has probably helped me quite a bit in in agentic coding where I can specify the output must look like something, you go write the code, right?
Yeah.
Managers of virtual bodies. That’s
right. That’s right, that’s right.

