<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>botwerks</title>
        <link>http://botwerks.net/</link>
        <description>no utility expressed or implied</description>
        <generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>sulrich@botwerks.org (steve ulrich)</managingEditor>
            <webMaster>sulrich@botwerks.org (steve ulrich)</webMaster><lastBuildDate>Sat, 06 Jun 2026 08:08:28 -0500</lastBuildDate>
            <atom:link href="http://botwerks.net/index.xml" rel="self" type="application/rss+xml" />
        <item>
    <title>cops, defenders of AI feelings?</title>
    <link>http://botwerks.net/2026/06/20260606-080828-links/</link>
    <pubDate>Sat, 06 Jun 2026 08:08:28 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/06/20260606-080828-links/</guid>
    <description><![CDATA[<p>two complementary bits of reporting here:</p>
<ul>
<li><a href="https://theintercept.com/2026/06/01/ai-data-center-protest-police-surveillance/" target="_blank" rel="noopener noreffer ">Philly Cops Admit That They’re Tracking “First Amendment Activity” Critical of AI</a></li>
</ul>
<p>this is probably the most on brand thing for cops to be plugging themselves into these days.  this is just plain
surveillance state biz.</p>
<p>total sidebar - i&rsquo;m still shocked and amazed that people are using big social media to do any kind of organizing.  i get
that the interface and the familiarity is baked in.  but it should be assumed that it&rsquo;s feeding into the apparatus.</p>
<ul>
<li><a href="https://www.wired.com/story/us-law-enforcement-warns-of-anti-tech-extremism/" target="_blank" rel="noopener noreffer ">US Law Enforcement Warns of ‘Anti-Tech Extremism’ as AI Hatred Grows | WIRED</a></li>
</ul>
<p>solid reporting from wired in much the same vein.</p>
<!-- LINK_CONTENT -->
]]></description>
</item>
<item>
    <title>sane discussion about the use of AI in software engineering</title>
    <link>http://botwerks.net/2026/06/20260605-082144-links/</link>
    <pubDate>Fri, 05 Jun 2026 08:21:44 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/06/20260605-082144-links/</guid>
    <description><![CDATA[<p><a href="https://charitydotwtf.substack.com/p/ai-enthusiasts-are-in-a-race-against" target="_blank" rel="noopener noreffer ">AI enthusiasts are in a race against time, AI skeptics are in a race against entropy</a></p>
<p>this is some pretty cogent discussion of some of the tensions that i suspect are piling up around the industry as AI
tooling is integrated into software engineering.  i think this says more about human and organizational structures than
it does about the new tools.  but at the end of the day, it&rsquo;s people that need to get things done here.</p>
<p>i suspect that at <code>${DATEJOB}</code> we&rsquo;ve managed to avoid much of this tension by keeping one fundamental precept at the
core of our work.  that is &hellip; &ldquo;a human must own the code&rdquo;.  we&rsquo;re seeing what seem to be significant productivity gains
and we&rsquo;re investing like mad in automated testing infrastructure (this is our feedback loop), but at the end of the day
<em>ownership</em> and <em>measurement</em> drives behavior.</p>
]]></description>
</item>
<item>
    <title>bodies. they&#39;re gonna need bodies.</title>
    <link>http://botwerks.net/2026/06/20260604-084313-links/</link>
    <pubDate>Thu, 04 Jun 2026 08:43:13 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/06/20260604-084313-links/</guid>
    <description><![CDATA[<p>disclaimer alert: i&rsquo;ll read anything by ted chiang.</p>
<p><a href="https://www.theatlantic.com/philosophy/2026/06/no-artificial-intelligence-is-not-conscious/687378/?gift=R2zbWGNBDp_xHqoa7Q8ZRp-EV6jGaHiamQBxQQlMJqI" target="_blank" rel="noopener noreffer ">No, Artificial Intelligence Is Not Conscious - The Atlantic</a></p>
<p>some of the best writing on AI and consciousness i&rsquo;ve read as of late.  i&rsquo;ve always found ted chiang&rsquo;s take on this
space to be very interesting and well considered.  this is well worth the read.</p>
<p>the following struck me as a succint and useful point for defining emotion.</p>
<blockquote>
<p>This brings us back to my earlier contention that having a body is a prerequisite to having emotions. Experiencing an
emotion such as desperation is inseparable from having stress hormones such as cortisol and epinephrine flood one’s
body. Similarly, having a conscience means feeling sadness or moral repulsion at the idea of taking a certain action,
and those emotions entail a physiological response, a remnant of having once felt sick with guilt after committing an
immoral act. It’s interesting that an LLM can generate descriptions of actions that conscientious fictional characters
would either take or refrain from taking, but this is not a replacement for a conscience.</p>
</blockquote>
<p>fear strikes me as an emotion that has a tight coupling here.  there&rsquo;s certainly the ability the evince fear on the part
of an LLM, but what does it mean to genuinely be <em>in fear</em>?</p>
<p>chiang closes with roughly this bit here &hellip;</p>
<blockquote>
<p>if you think there is any chance that what you’re building might become a moral patient, you should think about what
protections it deserves before you deploy it as your company’s economic engine, not after. Slave owners were not the
ones to ask about the humanity of enslaved people, and factory-farm owners are not the ones to ask about the rights of
animals. If we imagine Claude to be conscious, Anthropic could not possibly be entrusted with evaluating its moral
status; the company has too much invested to be objective.</p>
</blockquote>
]]></description>
</item>
<item>
    <title>canary in the coal mine - 60 minutes</title>
    <link>http://botwerks.net/2026/06/20260604-080138-links/</link>
    <pubDate>Thu, 04 Jun 2026 08:01:38 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/06/20260604-080138-links/</guid>
    <description><![CDATA[<p><a href="https://jimacosta.substack.com/p/when-60-minutes-is-in-trouble-we" target="_blank" rel="noopener noreffer ">When &ldquo;60 Minutes&rdquo; is in Trouble, We are All in Trouble</a></p>
<p>the level of capture here is insane.  we&rsquo;re less than 2 years into this administration and the institutions are
crumbling at a rate i never would have imagined.  i&rsquo;ve only watched 60 minutes on youtube over the past, i don&rsquo;t know
how many, years.  still, this is not a good sign for those worried about media capture.</p>
]]></description>
</item>
<item>
    <title>the bern on AI</title>
    <link>http://botwerks.net/2026/06/20260603-084728-links/</link>
    <pubDate>Wed, 03 Jun 2026 08:47:28 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/06/20260603-084728-links/</guid>
    <description><![CDATA[<p><a href="https://www.nytimes.com/2026/06/01/opinion/artificial-intelligence-bernie-sanders.html" target="_blank" rel="noopener noreffer ">Opinion | Bernie Sanders: A.I. Belongs to the People, Not to Billionaires - The New York Times</a></p>
<p>i&rsquo;m honestly not sure what to make of this.  i like, and agree, with a lot of what he&rsquo;s saying here.  the practicalities bear some discussion.  i like that he&rsquo;s coming from a place of technological acceptance and working through the implications.</p>
]]></description>
</item>
<item>
    <title>the AI layoff trap</title>
    <link>http://botwerks.net/2026/06/20260601-074843-links/</link>
    <pubDate>Mon, 01 Jun 2026 07:48:43 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/06/20260601-074843-links/</guid>
    <description><![CDATA[<p><a href="https://arxiv.org/abs/2603.20617" target="_blank" rel="noopener noreffer ">[2603.20617] The AI Layoff Trap</a></p>
<p>one of the more fascinating reads in recent months.  i had to goo^h^h^hDDG something every couple of paragraphs.  this
was also referenced in <a href="https://www.owenmcgrann.com/p/the-dead-economy-theory" target="_blank" rel="noopener noreffer ">The Dead Economy Theory - by Owen McGrann - The
Palimpsest</a> (TDET) which also happens to lean heavily on <a href="https://www.nytimes.com/2026/04/30/opinion/ai-labor-work-force-silicon-valley.html" target="_blank" rel="noopener noreffer ">Opinion |
Silicon Valley Is Bracing for a Permanent Underclass - The New York
Times</a>.  all worth spending time on
and working through in detail.  TDET is clearly coming from the perspective of someone who&rsquo;s poking at this themselves
and reading widely on the topic.  i suspect the writeup has triggered all sorts of vitrol.</p>
<p>there&rsquo;s no small amount of shit to unpack in all of these articles.  to say that we&rsquo;re societally unprepared for any of
this probably goes without saying.  though i was amused by the TDET tagline <em>We can laugh at them but we have to take
this seriously</em>.  which is, unfortunately, very true.</p>
]]></description>
</item>
<item>
    <title>so tired of the winning: tomato edition</title>
    <link>http://botwerks.net/2026/05/20260531-091601-links/</link>
    <pubDate>Sun, 31 May 2026 09:16:01 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260531-091601-links/</guid>
    <description><![CDATA[<p><a href="https://apnews.com/article/tomatoes-inflation-prices-groceries-mexico-tariffs-trump-1176fd9d4213f2b568181809937c2170" target="_blank" rel="noopener noreffer ">Tomatoes become latest symbol of America’s affordability squeeze | AP News</a></p>
<p>i mean, like who could have seen this coming?  right? 🙄</p>
]]></description>
</item>
<item>
    <title>some straight talk about REI</title>
    <link>http://botwerks.net/2026/05/20260531-091155-links/</link>
    <pubDate>Sun, 31 May 2026 09:11:56 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260531-091155-links/</guid>
    <description><![CDATA[<p><a href="https://mountaingazette.com/blogs/mountain-notes/the-co-op-and-the-distance-between-us" target="_blank" rel="noopener noreffer ">The Co-op and the Distance Between Us – Mountain Gazette</a></p>
<p>some solid writing on the part of <a href="https://mountaingazette.com" target="_blank" rel="noopener noreffer ">mountain gazette</a> on the tensions surrounding REI as of
late.</p>
<p>a few paragraphs at the end here felt worth noting.</p>
<blockquote>
<p>Inside the world of outdoor culture, REI has functioned as something more than your traditional retailer. For decades,
it’s felt (intentionally) like an entry point into outdoor life&ndash;a place where beginners could ask basic questions
without signaling inexperience, where knowledge was structured as access rather than gatekeeping, and where the
boundary between consumer and participant felt unusually thin.</p>
</blockquote>
<p>the above is spot on - for our household, REI hs been the gateway to all sorts of travel and outdoor experiences.  we
could go in figure out where we landed on the spectrum of introduction to an activity and get pretty solid guidance
from experienced staff.</p>
<blockquote>
<p>For me, that’s what makes the current conflict feel culturally significant. It’s not just a labor dispute, it’s a
labor dispute over what kind of institution REI actually is, and what it means when a cooperative structure operates
at the scale of a national retail chain.</p>
<p>As organizations grow, founding principles tend to compete with operational requirements. Over time, structure shapes
culture more than intention does, and the gap between cooperative language and corporate-scale operations is showing.</p>
</blockquote>
<p>this is one of the core questions that we probably need to be thinking about as a society.  how big should things be
allowed to get?  #LateStageCapitalism abhors things that don&rsquo;t scale. so much of what we&rsquo;re dealing with are the second+
order effects associated with unchecked actors attempting to scale.</p>
<p>in this case a co-op, with the cliche ethics or social orientation that are associated with a co-op, has become a retail
force in the outdoor industry writ large.  it&rsquo;s being bent in the capitalist direction.  what comes of this?</p>
<p>i would be remiss if i didn&rsquo;t also note that going into an REI the past few years has been an increasingly shitty
experience.  the quality of the products seem to be on the decline, the stock seems to be moving in the athleisure
direction and the coverage for specialty gear seems to be on the wane.  i suspect i&rsquo;d be happier if they went back to
less mass market appeal and focusing on the demographics of 1990s-2010s.  but we (waves arms about wildly) seem to be
doing something else.</p>
<blockquote>
<p>For shoppers, the immediate question is more practical than structural. Memorial Day has passed, but if you&rsquo;re still
looking to gear up for summer, you&rsquo;ve got options. And of those options, try thinking local, won&rsquo;t you?</p>
</blockquote>
<p>here&rsquo;s anothe rub.  even in a solid market like minneapolis/st. paul, we haven&rsquo;t been able to sustain local alternatives
to REI.  midwest mountaineering (pour one out for our homies) closed up shop a couple of years ago.  we have an
incredible bike shop scene.  but there are no real alternatives for backpacking, etc.  we have solid ski shops, but
there&rsquo;s no alternatives for winter camping / hiking gear.  canoe/kayak gear is yet another challenge.</p>
]]></description>
</item>
<item>
    <title>syndicating botwerks via POSSE</title>
    <link>http://botwerks.net/2026/05/20260530-213953/</link>
    <pubDate>Sat, 30 May 2026 21:39:53 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260530-213953/</guid>
    <description><![CDATA[<h2 id="what-is-posse">what is POSSE?</h2>
<p>POSSE stands for &ldquo;Publish on your Own Site, Syndicate Elsewhere&rdquo;.  it&rsquo;s an indieweb pattern where your own site is the
canonical source of truth for what you write, and the social platforms get pointers/copies that link back home.  the
inverse of the more typical mode, where you write on twitter/mastodon/bluesky and your blog (if you even have one) is an
afterthought.</p>
<p>i&rsquo;ve been meaning to wire this up for botwerks for a while.  the goal is simple: when i merge a new post to <code>main</code>,
something picks it up, waits for the deploy to settle, and pushes a short link to both mastodon and bluesky.  that&rsquo;s the
whole thing.  no fancy webmentions, no rich embeds, no salmention shiz.  just a link with a title and (when it fits) a
description.</p>
<h2 id="the-moving-parts">the moving parts</h2>
<p>there are three elements:</p>
<ol>
<li>a python script that does the syndicating: <code>bin/posse.py</code></li>
<li>a github action that runs that script on every push to <code>main</code></li>
<li>a state file at <code>data/syndicated.json</code> that tracks what&rsquo;s already been posted so nothing gets double-posted</li>
</ol>
<p>i&rsquo;ll provide an overview of all of these elements.</p>
<h2 id="the-script">the script</h2>
<p><code>bin/posse.py</code> is a single-file python script that uses <code>uv</code> for dependency management.  the inline script metadata at
the top of the file declares the runtime requirements - <code>atproto</code>, <code>Mastodon.py</code>, <code>python-frontmatter</code>, <code>grapheme</code>, and
<code>requests</code>.  no <code>requirements.txt</code>, no virtualenv setup, just <code>uv run bin/posse.py</code>.  this is one of the nicer python
developments of the last couple of years.</p>
<p>note: the following is an embedded <a href="https://gist.github.com/sulrich/48ea1b2d2d1ccaa3d46f27e2e2088a9b" target="_blank" rel="noopener noreffer ">gist</a></p>
<hr>
<script src="https://gist.github.com/sulrich/48ea1b2d2d1ccaa3d46f27e2e2088a9b.js"></script>

<hr>
<p>at a high level it does this:</p>
<ol>
<li>walks <code>content/posts</code>, <code>content/til</code>, and <code>content/links</code> looking for markdown files</li>
<li>filters out drafts, future-dated entries, and anything with <code>syndicate: false</code> in the frontmatter</li>
<li>for <code>content/links/</code> entries it also requires a <code>syndicate</code> tag.  most links are ephemeral and don&rsquo;t deserve a social
post by default</li>
<li>builds the canonical permalink from the file&rsquo;s date and basename to match hugo&rsquo;s permalink config as defined in my
<code>hugo.toml</code>
(<code>:year/:month/:contentbasename</code>)</li>
<li>compares that against <code>data/syndicated.json</code> to find new entries</li>
<li>for each new entry it polls <code>feed.json</code> until the entry actually appears live (so we don&rsquo;t post a link before
cloudflare has propagated the build), then posts to mastodon and bluesky</li>
<li>updates the state file after each successful post</li>
</ol>
<p>a couple of details worth calling out:</p>
<ul>
<li>bluesky has a hard 300 grapheme (yeah, i had to dig into this. a grapheme is a user perceived character.) limit on
post length.  the script measures with the <code>grapheme</code> package rather than <code>len()</code> because emoji and combining
characters will throw off naive character counting.  if a post would overflow, the description gets truncated with an
ellipsis until the whole thing fits.</li>
<li>mastodon doesn&rsquo;t have the same tight limit (500 chars by default, higher on my instance), but i format both posts
identically for consistency.</li>
<li>bluesky needs an explicit text builder with a URL facet to make the link clickable.  mastodon parses URLs from text
automatically.</li>
<li>the script writes the state file atomically (write to <code>.tmp</code>, then rename).  an interrupted run can&rsquo;t leave a
half-written JSON blob behind.</li>
</ul>
<h2 id="the-github-action">the github action</h2>
<p>the workflow lives at <code>.github/workflows/posse.yml</code>.  it triggers on push to <code>main</code> when any of these paths change:</p>
<ul>
<li><code>content/posts/**</code></li>
<li><code>content/til/**</code></li>
<li><code>content/links/**</code></li>
<li><code>bin/posse.py</code></li>
<li>the workflow itself</li>
</ul>
<p>note: the following is an embedded <a href="https://gist.github.com/sulrich/0f0c80f0844ca39b906fca98cc5f9ceb" target="_blank" rel="noopener noreffer ">gist</a>:</p>
<hr>
<script src="https://gist.github.com/sulrich/0f0c80f0844ca39b906fca98cc5f9ceb.js"></script>

<hr>
<p>before running the script the workflow sleeps for 120 seconds.  that&rsquo;s a buffer for the hugo build on cloudflare pages
plus cloudflare&rsquo;s edge propagation.  it&rsquo;s not strictly necessary - the script polls <code>feed.json</code> for each entry before
posting anyway - but it cuts down on wasted polls.</p>
<p>the workflow uses a github environment to gate access to the social account credentials.  the environment holds:</p>
<ul>
<li><code>MASTODON_INSTANCE_URL</code> (variable)</li>
<li><code>MASTODON_ACCESS_TOKEN</code> (secret)</li>
<li><code>BLUESKY_HANDLE</code> (variable)</li>
<li><code>BLUESKY_APP_PASSWORD</code> (secret)</li>
</ul>
<p>after a successful run, if <code>data/syndicated.json</code> has been modified the workflow commits it back to the repo.  the
commit message ends with <code>[skip ci]</code> so the resulting push doesn&rsquo;t trigger another run of the workflow.  without the
<code>[skip ci]</code> token the workflow would loop on its own state commits, burning CI minutes for no reason.</p>
<p>there&rsquo;s also a <code>workflow_dispatch</code> trigger with a <code>dry_run</code> input.  this lets me run the workflow from the github UI in
a non-destructive mode if i want to verify what would happen without actually posting.</p>
<h2 id="state-management">state management</h2>
<p><code>data/syndicated.json</code> is the source of truth for what&rsquo;s already been syndicated.  it looks roughly like this:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-json">
        <span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;entries&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;https://botwerks.net/2026/05/20260522-130616/&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;posted_at&#34;</span><span class="p">:</span> <span class="s2">&#34;2026-05-22T18:30:42+00:00&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;mastodon_id&#34;</span><span class="p">:</span> <span class="s2">&#34;112345678901234567&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;bluesky_uri&#34;</span><span class="p">:</span> <span class="s2">&#34;at://did:plc:abc.../app.bsky.feed.post/xyz...&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;https://botwerks.net/2009/01/2009-01-01-some-old-post/&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;init&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="nt">&#34;posted_at&#34;</span><span class="p">:</span> <span class="s2">&#34;2026-05-30T17:49:36+00:00&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<p>the canonical URL is the primary key.  there are two flavors of entry:</p>
<ul>
<li>normal entries have <code>posted_at</code>, <code>mastodon_id</code>, and <code>bluesky_uri</code></li>
<li>init entries (marked with <code>init: true</code>) were bulk-seeded when POSSE was first turned on.  these exist purely to
prevent the script from going back and posting every entry in the archive at once.  no sense spamming folks with old
news.</li>
</ul>
<p>the file is sorted alphabetically by key on write so diffs are readable when the workflow commits state updates.  you
can scroll the file and see the chronology of new posts at the bottom (sort by key happens to roughly track sort by
date because of the date-based slugs).</p>
<h2 id="opting-out">opting out</h2>
<p>there are a few knobs to keep something from being syndicated:</p>
<ul>
<li><code>draft: true</code> in frontmatter (also keeps it out of the build, obviously)</li>
<li><code>syndicate: false</code> in frontmatter for a specific entry</li>
<li>for <code>content/links/</code> entries: leave off the <code>syndicate</code> tag.  by default link posts don&rsquo;t syndicate</li>
</ul>
<p>future-dated posts also don&rsquo;t get syndicated until they&rsquo;re actually live.  this matters because i sometimes write
something now and schedule it for later.  (ha! in theory)</p>
<h2 id="bootstrap">bootstrap</h2>
<p>the script has an <code>--init</code> flag.  this is what i used to backfill the state file with every existing post on the site
before turning on the action.  without that step, the first real run would have tried to syndicate seventeen years of
archive in one go.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy fa-fw" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">uv run bin/posse.py --init</span></span></code></pre></div></div>
<p>the script also takes <code>--dry-run</code> which prints what it would post without making API calls or modifying state.  i
leaned on this heavily during setup.</p>
<h2 id="what-id-change">what i&rsquo;d change</h2>
<p>honestly, i&rsquo;m not sure.  it&rsquo;s all a little new and i don&rsquo;t really anticipate &ldquo;syndicating&rdquo; much.  the polling-for-live
behavior is the part i&rsquo;m least sure about.  it would be cleaner to have the deploy notify the script directly when a new
entry is live, rather than the script polling for the entry to appear. but the polling is cheap, it works, and it
doesn&rsquo;t require me to run a service somewhere to receive the webhook. simple wins.</p>
<p>it might also be nice to surface failures more loudly.  if a post fails to syndicate the workflow run gets marked as
failed, but i have to actually go look at github actions to notice.  some kind of notification would be useful, but i&rsquo;d
rather not add more infrastructure for what is a very low-volume tool.</p>
]]></description>
</item>
<item>
    <title>safetyism is not a new dance.</title>
    <link>http://botwerks.net/2026/05/20260530-152532-links/</link>
    <pubDate>Sat, 30 May 2026 15:25:32 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260530-152532-links/</guid>
    <description><![CDATA[<p><a href="https://stevemagness.substack.com/p/the-cost-of-safetyism" target="_blank" rel="noopener noreffer ">The Cost of Safetyism - Steve Magness</a></p>
<p>more in the vein of <em>be afraid!</em>  no seriously, calm down</p>
<!-- LINK_CONTENT -->]]></description>
</item>
<item>
    <title>hugo &#43; GHA = POSSE</title>
    <link>http://botwerks.net/2026/05/20260530-133723/</link>
    <pubDate>Sat, 30 May 2026 13:37:23 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260530-133723/</guid>
    <description><![CDATA[<h2 id="well-lets-see-how-this-goes">well, let&rsquo;s see how this goes</h2>
<p>i got a burr up my ass and decided to poke at this whole <a href="https://posseparty.com" target="_blank" rel="noopener noreffer ">POSSE</a> thing.  given that pretty much
all of this site is driven out of github, using github actions (even with all of their flaws) seemed like the right move.
having things generated out of hugo with actual serving/hosting via cloudflare has some fun little quirks in the
operational flow.</p>
<h2 id="operational-overview">operational overview</h2>
<p><code>bin/posse.py</code> is a standalone script that will do the needful with the associated POSSE destinations (currently
mastodon and bluesky).  there&rsquo;s a small bit of GHA environment chicanery associated with creating the necessary linkages
to the targets.  nothing out of the ordinary there.</p>
<p>this all gets triggered via a GHA action against the hugo publication branch and action.  GHA itself does a little bit of
waiting to make sure that the posts actually exist on the internet writ large. (i.e., they got through the cloudflare
pipeline) then parses the posts and publishes to the destinations. munging the contents as appropriate.</p>
<p>there&rsquo;s a little bit of nuance in the rate limiting and the handling of link/posting storms as well as state management
across what are inherently stateless GHA runs.  more details should probably be provided here, but honestly. this is
more of a test post.</p>
]]></description>
</item>
<item>
    <title>straight talk re: home values</title>
    <link>http://botwerks.net/2026/05/20260528-074426-links/</link>
    <pubDate>Thu, 28 May 2026 07:44:26 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260528-074426-links/</guid>
    <description><![CDATA[<p><a href="https://housingnotes.com/p/land-appreciates-homes-depreciate" target="_blank" rel="noopener noreffer ">Land Appreciates. Homes Depreciate.</a></p>
<p>want to get uninvited to the party?  start making people feel uncomfortable with the facts about home ownership.  ask
them to keep track of how much they&rsquo;ve poured into the improvements on their place, zillow it and see if they&rsquo;re gonna
recoup the &ldquo;investment&rdquo;.  it&rsquo;s a non-stop cycle of trying to hold your head above water.  spend as little as you can get
away with.</p>
]]></description>
</item>
<item>
    <title>well this was a bit of a technology tear jerker</title>
    <link>http://botwerks.net/2026/05/20260527-101008-links/</link>
    <pubDate>Wed, 27 May 2026 10:10:08 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260527-101008-links/</guid>
    <description><![CDATA[<p><a href="https://www.nytimes.com/2026/05/15/style/modern-love-tenderly-tracking-my-husband.html?unlocked_article_code=1.lVA.M3_B.HxSTkg9lFnQr" target="_blank" rel="noopener noreffer ">Tenderly Tracking My Husband - The New York Times</a></p>
<p>this was a beautiful piece.</p>
<!-- LINK_CONTENT -->
]]></description>
</item>
<item>
    <title>wait, i thought you wanted us to token max?</title>
    <link>http://botwerks.net/2026/05/20260526-082849-links/</link>
    <pubDate>Tue, 26 May 2026 08:28:49 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260526-082849-links/</guid>
    <description><![CDATA[<p><a href="https://thenextweb.com/news/microsoft-claude-code-retreat-ai-cost" target="_blank" rel="noopener noreffer ">Microsoft’s quiet Claude Code retreat and the real cost of enterprise AI</a></p>
<p>first off, it&rsquo;s claude and not codex or co-pilot. second, it really feels like we&rsquo;re going to start waking up to the real costs of things here.</p>
<!-- LINK_CONTENT -->]]></description>
</item>
<item>
    <title>i can&#39;t believe i&#39;m reading a papal encyclical</title>
    <link>http://botwerks.net/2026/05/20260526-082027-links/</link>
    <pubDate>Tue, 26 May 2026 08:20:28 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260526-082027-links/</guid>
    <description><![CDATA[<p><a href="https://www.vatican.va/content/leo-xiv/en/encyclicals/documents/20260515-magnifica-humanitas.html" target="_blank" rel="noopener noreffer ">Encyclical Letter of His Holiness Leo XIV Magnifica Humanitas (15 May 2026)</a></p>
<p>long. quite long. lots of god stuff.  solid message.</p>
<p>setting aside the questions and digressions on theology/deism.  this is something that more people should probably sit down, read and think about.</p>
<!-- LINK_CONTENT -->]]></description>
</item>
<item>
    <title>pi, pi, pi, pi</title>
    <link>http://botwerks.net/2026/05/20260525-144644-links/</link>
    <pubDate>Mon, 25 May 2026 14:46:44 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260525-144644-links/</guid>
    <description><![CDATA[<p><a href="https://lucumr.pocoo.org/2026/5/24/pi-oss/" target="_blank" rel="noopener noreffer ">Building Pi With Pi | Armin Ronacher&rsquo;s Thoughts and Writings</a></p>
<p>some solid discussion on clanker tooling in the age of clanker tooling.</p>
<!-- LINK_CONTENT -->]]></description>
</item>
<item>
    <title>all gambling all the time.</title>
    <link>http://botwerks.net/2026/05/20260524-174328-links/</link>
    <pubDate>Sun, 24 May 2026 17:43:28 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260524-174328-links/</guid>
    <description><![CDATA[<p><a href="https://www.nytimes.com/2026/05/24/us/how-prediction-markets-and-crypto-firms-steamrolled-a-watchdog-agency.html" target="_blank" rel="noopener noreffer ">How Prediction Markets and Crypto Firms Steamrolled a Watchdog Agency - The New York Times</a></p>
<p>when there&rsquo;s so much money swimming around here.  what did you honestly think was going to happen in this case?</p>
]]></description>
</item>
<item>
    <title>the kids are alright; birding edition</title>
    <link>http://botwerks.net/2026/05/20260524-091619-links/</link>
    <pubDate>Sun, 24 May 2026 09:16:19 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260524-091619-links/</guid>
    <description><![CDATA[<p><a href="https://www.npr.org/2026/05/12/nx-s1-5801539/world-series-of-birding-new-jersey" target="_blank" rel="noopener noreffer ">Welcome to the World Series of Birding: 24 hours with 3 teen birders : NPR</a></p>
<!-- LINK_CONTENT -->
]]></description>
</item>
<item>
    <title>there&#39;s a dark subsidized irony at work here ...</title>
    <link>http://botwerks.net/2026/05/20260522-135755-links/</link>
    <pubDate>Fri, 22 May 2026 13:57:55 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260522-135755-links/</guid>
    <description><![CDATA[<p><a href="https://www.forbes.com/sites/janakirammsv/2026/05/17/uber-burns-its-2026-ai-budget-in-four-months-on-claude-code/" target="_blank" rel="noopener noreffer ">Uber Burns Its 2026 AI Budget In Four Months On Claude Code</a></p>
<p>i find this to be incredibly amusing given that uber decided to subsidize the hell out of rideshare early on and got a lot of folks hooked on cheap taxi service via app.  to have this be something that bites them in the ass on the development side of things gives me a bit of a chuckle.</p>
<!-- LINK_CONTENT -->]]></description>
</item>
<item>
    <title>no, AI hasn&#39;t made us all software engineers</title>
    <link>http://botwerks.net/2026/05/20260522-130616/</link>
    <pubDate>Fri, 22 May 2026 13:06:16 -0500</pubDate>
    <author>steve ulrich</author>
    <guid>http://botwerks.net/2026/05/20260522-130616/</guid>
    <description><![CDATA[<h2 id="the-dunning-kruger-effect-on-roids">the dunning kruger effect on &lsquo;roids</h2>
<p>having access to claude code does not make you a software engineer.  any more than having a cordless circular saw makes
one a carpenter.  armed with claude code and any number of software AI tools, it&rsquo;s now possible to create remarkably
complex tools or sophisticated looking/sounding presentations and documents.  i think this is, on balance, a good thing.</p>
<p>these artifacts can be incredibly useful.  but they are not built to be sustainable and maintained outputs unless there&rsquo;s
the application of some real skill in their assembly. this is the engineering part.</p>
<p>i don&rsquo;t know how we&rsquo;re going to collectively weather this.  i&rsquo;m just writing this down for future me.  i can&rsquo;t be the
only one seeing this. but currently, i&rsquo;m just really hoping that the we some how manage to rectify our collective
thinking here.</p>
]]></description>
</item>
</channel>
</rss>
