v1.2.0: Agency & Growth

Published

Growth

It feels like it’s time again to increment the minor version of my ZAMM journey. I feel a hunger for growth and change that makes for a marked qualitative difference in my subjective experience of life. I had previously felt like I was tangled up in confusion within the fabric of reality, my limbs wrapped up by continuously raveling and unraveling folds of chaos. I stopped struggling for long enough to collect some foundational inner calm, sensed a solid object through the fabric, and grabbed onto it just to find myself violently wrenched about this way and that.

It was as if a massive bull had suddenly materialized under the thin sheer of fabric as soon as I had seized its horns. It vigorously roared about to shake me off — but unlike in the past, I find myself holding on out of excitement rather than fear, on a ride that is now exhilarating rather than exhausting. I finally have enough of a handle on things to start steering myself in a roughly consistent direction, and such optimism serves as an excellent spice for the regular gruel of life.

Of course, this bull is myself and my subconscious proclivities. The bull is allergic to anything that gives off even a whiff of constraint and control. But what it doesn’t understand is that in its fanatical adherence to ultimate freedom, it is actually trampling all over its own freedom to chart a long-term course. This refusal to do anything more structured than a random walk is almost as restricting as a physical fence would be. The trick is in getting the bull to intuitively feel that. If freedom is what it wants, then that freedom lies in the ability to develop resilient consistency. As with many things in life, you maximize a quantity by voluntarily putting restrictions on it: if you want to maximize throughput through a congested intersection, you do so by grinding a whole bunch of cars to a stop all at once. If there’s one thing the bull is good at, it is at forcibly getting its way, and this sort of trick reframing can at times give me an invaluable ally to work with.

I say “me” as if all the other drives that I struggle against somehow aren’t me. This was an important perspective that my friend who is a fan of Internal Family Systems introduced me to. Every part of me is in agreement that they want Amos to do well. Recasting the disagreements as mistakes rather than conflicts helps greatly with dealing with myself holistically. Of course, it doesn’t mean that all the parts get to input into decision-making. Just because you love someone doesn’t mean you do what they ask of you. Just because you’re running a democracy doesn’t mean you avoid pissing off voters. You listen to them protest and scream, and you go ahead and do what needs to be done anyways with the privileged information you have at hand. Better adaptability and experimentation than perpetually ineffectual congressional gridlock. (Or as one of my former employers put it: Be decisive. If you’re going to be wrong, be decisively wrong.)

This is something that meditation has been really practical for: giving me the ability to sit with a feeling without suppressing it, giving into it, or fighting it. Does it feel excessively excruciating to get out of bed and start getting around to all the things I want to get around to? The excruciation is not something to be overcome, it’s something to be experienced. Once again, a trick reframing of the choices as “being present” versus “escapism” brings out my great inner curiosity. What, fast forward through this riveting moment of what it means to be alive? Hell no, give me all you got, and more. God, I feel so excruciatingly present. (Interestingly enough, I am unable to enjoy ice baths in the same way. The pain from those is so intense that I enter into a state of temporary insanity where there’s simply no room for any fancy romanticization of it as being “present” or “one with the pain,” there’s only room for pain and more pain, the purest unadulterated pain one can find anywhere in the land.)

I’d gotten my first dose of such an experience from an externalized Buddha-sensation that strictly but caringly showed me the possibility of persevering even in the presence of agonizing emotions. Perhaps the idea first bounced around in my subconscious from the book Bad Therapy: Why the Kids Aren’t Growing Up; if there was one important takeaway I had from reading the first parts of the book before I never picked it up again, it was the idea that I didn’t need to be emotionally ready before I did something. It was a powerful idea, but I still operated under the assumption that all parts of me should be listened to at all times because they’re all contributing valuable information. It was as if I was groping around in the dark, but Dr. K helpfully came over and said, “Here, reach just a little further,” and helped me find the wall. The Resistance within me may indeed be contributing valuable information on what it wouldn’t like me to do, but instead of taking that information at face value, it may instead be in my best interests to partake in exactly those activities that generate the greatest amount of discomfort. I increase my own agency by demonstrating to myself my ability to maneuvre independently of whatever strong feelings I may be under the influence of at the moment. Or, to put it as another trick reframing: it’s “working out and training/practicing resilience” versus “forcing myself to do something I really don’t want to do.”

There are of course all the times when productivity doesn’t happen, and sometimes that also feels really good — so good that I’m reminded that I gotta live a little and have some spontaneous fun, because goddamn what good is retirement otherwise? I am well aware of the dangers of dogmatically pushing myself too far with this line of thinking, running roughshod over the important feedback my subconscious is giving me, and burning myself out once again; I certainly don’t want a repeat of the ZAMM journey that has led me here. I am well aware that I will mess up every now and then by having too much rigid structure in one place, but then as I loosen up again, I will once again discover the great un-joys of living a completely unstructured life of laying in bed scrolling social media until 4 PM.

Truth be told, I’m messing up all the time these days in all sorts of different ways. The calibration process for my personal decision-making requires a steady supply of mistakes on the conveyer belt and gumption in the fuel intake. As the original ZAMM put it:

If you’re going to repair a motorcycle, an adequate supply of gumption is the first and most important tool… If you haven’t got it there’s no way the motorcycle can possibly be fixed. But if you have got it and know how to keep it there’s absolutely no way in this whole world that motorcycle can keep from getting fixed. It’s bound to happen.

… If the Chautauqua gets into the actual details of fixing one individual machine the chances are overwhelming that it won’t be your make and model and the information will be not only useless but dangerous, since information that fixes one model can sometimes wreck another. For detailed information of an objective sort, a separate shop manual for the specific make and model of machine must be used…

But there’s another kind of detail that no shop manual goes into but that is common to all machines and can be given here. This is the detail of the Quality relationship, the gumption relationship, between the machine and the mechanic, which is just as intricate as the machine itself.

I finally have gumption towards my own life, and with this gumption comes a reduction in the anxiety of living an uncertain life. “What are we supposed to do if X happens?” “We’ll figure it out, is what we’re going to do.” To use a friend’s phrasing: The only person who can mess up my life now is me. There’s of course lots of things outside my control that can happen in the world and around me that would have a major impact on my life. But none of those things are capable of removing my sense of agency from me unless I allow them to, and that sense of inner agency in deciding what “messed up” means to me and in deciding how to respond to what’s “messed up” — that agency is golden. I’d much rather have this than have fortunate circumstances to drift about helplessly in, with some vague foreboding that the good times aren’t going to last forever and it’s not going to be up to me when or how the music stops. This 21st century is going to be one hell of a wild ride, and I’ll opt for some sturdy gumption in my hands over any amount of starting luck.

Agency

A female friend once told me me how all the left-wing feminist critiques of men were good valid knowledge to have, but she wished it were put in context so that she had more of a perspective than “Ugh, men.” I feel that way about left-wing critiques of capitalism. After finishing high school under the sole influence of Christian textbooks extolling the pure benefits of laissez-faire capitalism, it was a very good thing that I then went to college to learn about market externalities and all the ways in which a reliance on the profit motive alone is insufficient for tackling a variety of issues. My disillusionment with Young Earth creationism at the time fueled a great teenage rebellion against all other established orthodoxies I had been taught, and the Internet was of course ready to step in for a hard swing in the opposite direction. But as useful as it was to learn about the myriad systemic issues plaguing globalized society in general and the manifestations of that in the US in particular, I wish that knowledge were better contextualized so that it didn’t end up dampening my own internal locus of control.

It may be true that mass collective action is the only way to force a correction on systemic issues within a democracy. Even the POTUS has historically been constrained in his powers, and a POTUS that is to make sweeping changes to the existing order can currently only do so with the support and consent of a great many. But such grand upwellings of national fervor for change are essentially background phenomena beyond your control. You can absolutely be an active part of it, but no matter which way you swing or how you change your mind over time, you’ll only ever be another statistic in how exactly these overlapping memetic waves criss-crossed America and bounced around reflecting and refracting across different demographic boundaries over time.

Large societal forces far beyond your personal control set the bounds on your future chances for a good life, and no amount of fiddling with your own systemic output is going to noticeably budge those large societal forces. You work hard for your entire adulthood and find yourself finally ready to enjoy your well-deserved retirement, just for your country to give up existing altogether, and the new leaders in charge most certainly don’t have the money to fund your retirement the way it was promised to you in your youth. You spend decades patiently crafting a cozy life for your family, but then war comes knocking and all of you are immediately wiped out by one side or the other. What an utter absurdity it is for feast or famine to be determined on the sole basis of a collective coin flip.

But this view on the grand narrative of history is not the only view to be had. I can look at the bigger picture and give up doing anything because anything I do can be trivially swept away by war and calamity stemming from unresolved systemic issues, or I can acknowledge and take back the agency that I do possess by beginning to calibrate my own decision-making at the level that I exist at. Am I too small to control the larger situation around me? Then I can become normal-sized again by zooming into the part of reality where I am once again big enough to effect change that matters to me. (Zoom in even further, and my personal actions become the overwhelming forces of nature that little critters and microscopic organisms simply have to deal with as they live their lives.) It’s in one sense letting go of my smallness, and in another sense accepting my smallness — truly accepting that I’m too small for the scale I want to live life at, and instead living life at the me-sized scale I actually belong in. There’s always something I can decide for myself that will make a difference, even if it’s only an internal mental difference in how I decide to relate to the uncontrollable stimuli in front of me. Giving up on the process of calibration altogether feels to me now like passing on valuable opportunities to hone my decision-making life skills.

Is the state of the job market outside of my control? Do interviewers (myself included) do a shit job at actually discerning talent? Yes and yes, but I reclaim my own sovereignty by taking responsibility for my own life. Has my past led me to be easily triggered by certain actions from certain people? Yes, but I reclaim my own power by taking responsibility for my own triggers. I can understand the effects that society and others have had on me without needing to blame anyone for the way I still am. I can be legitimately hurt, and need to legitimately heal, without having to take myself or anyone else to task for the hurt that sometimes just happens from living with other living beings in this world.

I like the distinction of organizations as “live” versus “dead” players, which I take to mean organizations that still have true agency versus organizations that have ossified into functioning as automatons. A sclerotic “dead” organization can only pick from a pre-ordained set of bureaucratic responses to an event. A live one will reshape its internal processes as needed in order to most effectively respond to a changing environment. A “dead” person shambles along according to internal drives and external stimuli that dictate their actions and reactions at any given moment, without so much as a shred of responsibility to be found for their own behavior. A live person will look for a way to reshape their behavior given all of the internal drives and external stimuli that they must work with.

To take an analogy from heat conductivity and the “emotional contagion” experiment on Facebook, “dead” people are good conductors of vibes, whether good or bad. If they’re having a great day, they’ll be passing on the good vibes straight to random strangers. If they’re having a shit day, they’ll be passing on the bad vibes straight to random strangers as well. They’re not true living agents that serve as windbreaks from the karmic Dust Bowls of the world; they’re instead bits of inert matter forever pushed this way and that by forces beyond their control, never responsible for their own behaviors because it’s always this thing or that person that’s caused them to do what they did in the way that they did it. The refusal to take responsibility is the refusal to update the weights of your own neural network based on the observable loss, the refusal to integrate corrective action based on environmental feedback, and therefore the inability to respond any more effectively than you already are. (Like Samo says in his original definition, these are not fixed categories. I have been both kinds of people, perhaps even on the same day.)

As Dr. K said in his Puer video, transcending Puer (which I interpret as being “live”) is not about doing a specific thing. “Just give up because it’s impossible” can be Puer, especially if the “it’s impossible” point is reached after just one or two tries and there’s no other backup plan to go for afterwards. But the opposite cultural message of “You just have to keep trying and you’ll get there” can also be Puer — simply mashing the “Try Harder” button again and again even though you keep failing, instead of truly taking the time to understand and experiment with your repeated failures, is also being a dead player. Being dead or alive isn’t about executing the right moves, it’s about having the dynamism with which you generate the right moves to execute.

I recognize in my past self the Desire to Pass Tests of life via the bureaucratic execution of procedures in the booklet of decentralized cultural wisdom. I would take the next bureaucratic booklet handed to me, execute the instructions therein, and discard the instruction manual once it showed itself to clearly not work. If something was handed to me that didn’t look like a bureaucratic booklet, I would try to make it into one. “Okay, so what exactly are you telling me is the thing I need to do? Look, just tell me what to do and I’ll do it.” I looked for a clear-cut answer like a bureaucrat who cannot be fired so long as they follow the rules precisely and exactly. I judged myself by the system of accountability where I am responsible for having done things according to the book of “Things That Any Reasonable Person Would Do,” and so long as I did everything right, I cannot be held to blame for the outcomes of my actions. But reclaiming personal sovereignty requires accepting personal responsibility, and that involves being able to admit to myself that I’ve messed up somehow, even if I don’t know how, and even if I followed every step correctly.

I now see why I made the FML for myself as an emotional support manual: It is an attempt to create exactly what I have been looking for all this time, despite realizing that it is entirely useless as a crutch because the magic is not actually in the manual. The magic is not anywhere to be found except within me. (Or as the saying goes, “Change must come from within.” God, these cheesy quotes plastered onto tacky motivational posters only reveal their true elegance after they’re no longer needed.) I have to remind myself of this every time I see a new clickbaity YouTube video titled “This is Why You’re Stuck at This Specific Point in Your Life.” Ah yes, here is The Answer I’ve been waiting for that will finally save me from figuring things out for myself! But no, no matter how useful the YouTube algorithm may be, I am always going to have to be the one who does the hard work of integrating any gleaned knowledge into my own life.

This is not to say that I find the FML to be completely useless for myself. There’s a tradeoff to be found between standardization and efficiency (offloading the mental load of decision-making onto pattern-matchable solutions) versus adaptability and agility (decision-making when dealing with in-the-moment on-the-ground reality that differs drastically from what Centralized Planner-me had cooked up from incomplete information passed into flawed models), and the things I put into the FML tend to be the things I internalize best, although it’s possible the causation runs the other way.

Nor is it to say that accepting personal responsibility for my mess-ups means being harsh on myself. I don’t find self-blame useful. The Algorithm of Me is already learning at the optimum rate it possibly can. Perhaps other biological neural nets in the world were randomly initialized with better weights and better hyperparameters, but this is peak gradient descent on the weights and hyperparameters I got initialized with. Mistakes that involve choosing the “wrong” bandit still result in information gain that increases my expected future payout. These sorts of mess-ups are exactly what I would expect to see if I were on the right path. Accepting personal responsibility doesn’t mean beating myself up over my mistakes. It just means accepting that mistakes were made in the first place. I can’t learn from my mistakes if my ego is blocking me from recognizing them as negative training data.

Integrating my arc

I think it’s all right if I should end up losing the plot again at some point. If I can find it once, I can find it again. But how did I get here in the first place? As I tried to retrace my steps this year, I inevitably brushed up against the need to reconcile “being fine with things as they are” with “wanting things to be different.”

Wanting things to be different is not bad. That feeling is also a legitimate part of the present moment. So too is tending to it. The main question for me is, am I allowing my quality of life to be defined by that feeling? I can feel the intense desire for change without allowing it to frame my entire worldview. It is possible for me to both hike with great motivation through an entire mountain range, and to also understand that there is nowhere to get to — that the very experience of motivated hiking is an intrinsic feature of the peak that I’m already standing on, with breathtaking views in all directions. Every finish line is a starting line in disguise, and if I’m not careful with applying the trick reframing, I’ll instead perpetually find myself short of the Promised Peak, and that is neither a fun nor a sustainable place to be.

Or from a more practical perspective: First I had to learn to rest before I could learn to run. I had to learn to be okay exactly as I was no matter how I was — and not just accepting it as an obvious intellectual fact, but also truly feeling it on a deeper emotional level. I may be hungry for change, but change is an endless marathon with no perceptible difference from one day to the next. If I didn’t know how to live in the day to day, if I didn’t know how to recover while running, I wouldn’t have had the stamina to go very far at all in this marathon.

Incidental artifacts

This month I made another version of the FML, which I am pretty much using as a dumping ground for thoughts that didn’t make it into the main post.

I also tried taking yet another stab at ZAMM. It truly is programming crack for me, I think because it continually entices me with the alluring promise of making all my software projects super legibly organized and impervious to bit rot from now on. I mean, just look at the documentation with which I am able to relatively clearly define in plain English what I actually want out of such a tool. I find that so fucking cool. That’s one major part of exactly what I’ve been looking to do with ZAMM all these years: make the natural language specification the highly-readable source of truth, so that we can cleanly delineate:

  • what you want (the specs)
  • specific details on exactly what that means in practice (examples in the specs)
  • if necessary, how you want that to happen (implementation guidance in the specs)
  • how that actually happens on a specific implementation on a specific stack (the code)

Switch over to a completely different stack or go for a rewrite on the same current stack, and all the code will change but the specs should stay exactly the same. Documentation-driven development, if you will — oh look, the idea was known years ago!

What if I come back to this years later and wonder, what was my vision? How far did I get? It’s all sitting there fully explained in plain English, as fresh as the day I left it. How do I work with this code? How do I run it? No worries, just look at the implementation-specific documentation to quickly get back up to speed on how this project works. It would normally be too annoying to code and keep all the English-language documentation up-to-date, but it’s easy when you have an LLM doing all the maintenance work for you by tirelessly following the tedious checklists you gave them.

Speaking of which, I’ve finally managed to replicate some of the recursive self-improvement Geoffrey Huntley was talking about. Those checklists I defined for the LLM are just text files after all, so each time I encounter difficulties in our interactions, I ask the LLM to update its own instruction files on how it could better collaborate with me in the future. It’s not perfect — for some reason, whenever I give it a code review before it commits, it addresses my complaints but then always forgets to add its new changes to the commit it was going to make — but it definitely helps a non-zero amount, and even seeing this sort of sub-exponential recursive self-improvement happen is mind-blowing. I’m nowhere near Geoffrey’s skill level (and am not rich enough to spend $36k letting the LLM vibe-code an entire programming language entirely on its own), but after first failing at Ghuntley’s technique and then successfully adapting IndyDevDan’s technique for my own style of software development, I’m slowly but surely making my way along the various stages of AI adoption.

Reading Joel Spolsky’s advice to refactor rather than rewrite your software projects had a lasting impact on me as a teenager. It’s now 25 years after he wrote that piece, and I think that advice is clearly outdated in the era of cheap generated code. If there’s one thing that has consistently served me well when smoking this software crack, it’s that I should abandon an implementation of ZAMM as soon as it feels like progress is really slowing down, and just rewrite the whole damn thing. Software traditionally gets exponentially harder to develop over time; perhaps that’s still true, but with LLMs in the picture, the exponential gets flattened out and the cost of throwing away code is low, so if progress is already slowing down on a greenfield prototype where exact requirements are still being learned, it may be time to restart.

This attempt at ZAMM feels like it may actually reach escape velocity in terms of self-hosting itself. It’s certainly got a better shot than any of my previous attempts; empirically speaking, I am finally using ZAMM for another personal project, thus proving its personal worth for once and making it truly feel like the ZAMM I’ve been looking for all these years. But also, the state of the software development landscape has improved enormously in the last couple years. I should’ve kept regularly checking up on it, but I was too wrapped up in my own ego-filled need to make my personally-coded tooling work to see what others were up to. I don’t know when exactly it happened, but the entire first half of the things I fantasized about ZAMM doing 11 months ago is now completely supported by current tooling.

I remember the days back in early 2023 when I was trying to make ZAMM work by giving simple tutorials to GPT3. It had great trouble following instructions (in retrospect, perhaps it would’ve helped a lot if I used a numbered list); I had to explicitly tell it “Don’t take any more steps because the task is now done!” and even then, it would still sometimes insist on continuing past the end of the task. Nowadays, I see that the way I was trying to automate tasks — by recording my own actions, writing up a tutorial explaining each step, and then telling the LLM to apply that tutorial to a new context — was way too constraining on the LLM’s creativity. Nowadays, the complexity of ZAMM is massively reduced because I can outsource all the agentic stuff to everybody else who’s building agents with far better paradigms than I had.

And that continues to be the case: Every time I restart work on ZAMM, I shed off a lot more optional complexity. Instead of a GUI, why not a TUI? Instead of storing data in a SQLite database that has to then be backed up separately, why not just store it as JSON files that I can commit directly inside the repo? (That one seems really obvious in retrospect; I started out thinking that I wanted to record all available data, including LLM interactions, and that didn’t necessarily belong in the repo. But that was no longer necessary after I stopped building my own agent.) Instead of needing to put a janky text editor in the TUI to edit the JSON, why not store it as Markdown with frontmatter and make use of VS Code’s excellent file-editing capabilities? Instead of needing to browse the specs hierarchy via the TUI, why not just put the specs in a regular folder hierarchy and use VS Code’s folder browsing functionality? (I originally wanted specs to have multiple parents because a spec that lay at the intersection of multiple interacting features should be a child of all those features, but after learning about “File over App” and realizing the massive reduction in complexity it would mean, I decided to just take care of that hypothetical edge case another way when I got to it.) In fact, why need a UI at all and just resort to interacting with ZAMM via the shell?

I still have a habit of overengineering things. I put in a whole thing of making API calls to Anthropic to ask for new branch names, generating Git worktrees based on that output, and thoroughly testing the Anthropic API calls and Git worktree creation. I’m thinking next to just intermix LLM calls with Bash commands using aichat, so that I can rip out all the Anthropic and Git worktree code inside ZAMM proper. Maybe ZAMM can really fly off into space if it’s lightweight enough.