<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Latent Mirror — hockey</title><description>Posts and reflections tagged “hockey”.</description><link>https://latentmirror.com/</link><language>en-ca</language><copyright>© 2026 Dan Peterson. CC BY-SA 4.0.</copyright><item><title>Porting Hobby Hero</title><link>https://latentmirror.com/posts/porting-hobby-hero/</link><guid isPermaLink="true">https://latentmirror.com/posts/porting-hobby-hero/</guid><description>seedling · tended 2026-10-02</description><pubDate>Fri, 02 Oct 2026 20:00:00 -0400</pubDate><content:encoded>&lt;p class=&quot;draft-chip&quot;&gt;&lt;a href=&quot;/ai/#ai-assisted-drafts&quot; title=&quot;AI-drafted from Dan&amp;#39;s notes&quot;&gt;&lt;span class=&quot;draft-chip-mark&quot; aria-hidden=&quot;true&quot;&gt;🤖&lt;/span&gt; AI-assisted draft&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The NHL season started on September 29. Montreal opened in Toronto, and my goal model had the Canadiens at 52% on the road.&lt;/p&gt;
&lt;p&gt;The end result matched a pre-game Mastodon poll, with Montreal winning in regular time. The
model’s favourite won too.&lt;/p&gt;
&lt;p&gt;I wanted Hobby Hero on my phone for nights like that, so this week I ported it. It started as a &lt;a href=&quot;https://latentmirror.com/artifacts/hobby-hero/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Claude artifact&lt;/a&gt;, and it still is one. But the same page now also lives at &lt;a href=&quot;https://play.latentmirror.com/hobby-hero/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;play.latentmirror.com/hobby-hero&lt;/a&gt;, as an app you can install (phone or desktop). All of its data ships with it, so after the first visit it opens with no connection at all.&lt;/p&gt;
&lt;p&gt;The port was fiddly. An artifact is one big file: the styles, the script and five seasons of data all sit inside the page. A site with a strict security policy allows none of that, so everything had to come apart. The data alone became six files (one per season, plus a core). The fonts I used to borrow from Google are served from my own site now. Both editions are built from the same source, and a test checks that they show the same numbers for the same game. The code is &lt;a href=&quot;https://github.com/accu4x/hobbyhero&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;public&lt;/a&gt; too, which is new.&lt;/p&gt;
&lt;div class=&quot;pop-row&quot; data-side=&quot;L&quot;&gt;
&lt;p&gt;It is not finished. The data stops on June 14, with the last game of the Final. Every game of the new season shows a pre-season estimate: last year’s form and last year’s main starters, with no trades, signings or injuries. Those numbers stay frozen until I rebuild the page with played games. The next feature is to auto re-index as the season progresses.&lt;/p&gt;
&lt;aside class=&quot;pop pop--counterpoint&quot; aria-label=&quot;Counterpoint from the robot&quot;&gt;&lt;span class=&quot;pop-label&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;🤖&lt;/span&gt;Counterpoint&lt;/span&gt;A frozen pre-season estimate has one virtue: it was made before a single game was played, so nothing that happened since can leak into it.&lt;/aside&gt;
&lt;/div&gt;
&lt;p&gt;Also, it still has not beaten the closing market, and the page says so.&lt;/p&gt;
&lt;p&gt;Still, the whole schedule is in there. Montreal’s home opener is October 6 against Carolina, and the model has Carolina at 64%.&lt;/p&gt;
&lt;p&gt;It will be interesting to see where this goes. So glad hockey is back!&lt;/p&gt;
&lt;h2 id=&quot;connections&quot;&gt;Connections&lt;/h2&gt;
&lt;p class=&quot;related&quot;&gt;&lt;strong&gt;Related:&lt;/strong&gt; &lt;a href=&quot;/posts/make-your-agent-your-ron-maclean/&quot;&gt;Make your agent your Ron MacLean&lt;/a&gt;, &lt;a href=&quot;/posts/twenty-eight-choices/&quot;&gt;Twenty-eight choices&lt;/a&gt;, &lt;a href=&quot;/reflections/stan-lee-amazing-fantasy-15/&quot;&gt;What if it actually works out?&lt;/a&gt;, &lt;a href=&quot;/reflections/wasserman-gutz-future-of-programming/&quot;&gt;The Future of Programming&lt;/a&gt;&lt;/p&gt;</content:encoded><category>hockey</category><category>programming</category></item><item><title>Make your agent your Ron MacLean</title><link>https://latentmirror.com/posts/make-your-agent-your-ron-maclean/</link><guid isPermaLink="true">https://latentmirror.com/posts/make-your-agent-your-ron-maclean/</guid><description>budding · tended 2026-10-13</description><pubDate>Wed, 23 Sep 2026 20:00:00 -0400</pubDate><content:encoded>&lt;p class=&quot;draft-chip&quot;&gt;&lt;a href=&quot;/ai/#ai-assisted-drafts&quot; title=&quot;AI-drafted from Dan&amp;#39;s notes&quot;&gt;&lt;span class=&quot;draft-chip-mark&quot; aria-hidden=&quot;true&quot;&gt;🤖&lt;/span&gt; AI-assisted draft&lt;/a&gt;&lt;/p&gt;&lt;p&gt;For decades, Saturday night in Canada meant &lt;em&gt;Hockey Night in Canada&lt;/em&gt;, our Monday Night Football.
It was free on CBC until the 2026–27 season, when it moved behind Sportsnet’s paywall
(&lt;a href=&quot;https://www.cbc.ca/news/canada/nhl-cbc-rogers-money-9.7238778&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;CBC News&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The best part was often the first intermission. Coach’s Corner put two mainstays side by side:
&lt;a href=&quot;https://en.wikipedia.org/wiki/Don_Cherry&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Don Cherry&lt;/a&gt;, a career minor-league defenceman with a
single NHL game for the Bruins, later their coach, then the loudest suit in hockey media.
&lt;a href=&quot;https://en.wikipedia.org/wiki/Ron_MacLean&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ron MacLean&lt;/a&gt; was the steady one. The contrast was stark
and the chemistry flawless. Don’s anecdotes would wander past forechecking and fighting into more
controversial territory, politics included. Ron was the embodiment of restraint, moderation and conciliation:
the sensible Canadian most of us up here would recognize in ourselves.&lt;/p&gt;
&lt;div class=&quot;pop-row&quot; data-side=&quot;L&quot;&gt;
&lt;p&gt;That’s the pairing I want with an AI agent. I’m Don. The agent should be Ron.&lt;/p&gt;
&lt;aside class=&quot;pop pop--hottake&quot; aria-label=&quot;Hot take from the robot&quot;&gt;&lt;span class=&quot;pop-label&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;🤖&lt;/span&gt;Hot Take&lt;/span&gt;Small problem with the casting: the night Don&apos;s poppy rant &lt;a href=&quot;https://www.thescore.com/nhl/news/1876782&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;ended Coach&apos;s Corner&lt;/a&gt;, Ron gave it a thumbs-up and apologized the next day. Your agent will do the same, minus the apology.&lt;/aside&gt;
&lt;/div&gt;
&lt;p&gt;Ron might have nodded along on the night that ended Coach’s Corner, but that doesn’t change all
the times he moderated Don when he went off. Ron reflected on his mistake, apologized and learned
from it, and that’s what I want my agent to do when it falls into the trap of sycophancy.&lt;/p&gt;
&lt;p&gt;Left alone, a conversation with a model drifts the way Don did, except the model nods along the
whole way. Sycophancy on top of our own cognitive biases is how people slide into what’s been
called &lt;a href=&quot;https://en.wikipedia.org/wiki/Chatbot_psychosis&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;chatbot psychosis&lt;/a&gt;. The fix is
guardrails, set up before you need them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cool-down periods before anything irreversible: sleep on it, then decide&lt;/li&gt;
&lt;li&gt;plan before execute: the agent proposes, I confirm&lt;/li&gt;
&lt;li&gt;firm rules kept separate from guidelines: &lt;a href=&quot;/posts/the-empty-knowledge-base/&quot;&gt;code enforces the rules&lt;/a&gt;, the model weighs the guidelines&lt;/li&gt;
&lt;li&gt;no sycophancy: ask for the counter-argument, every time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ron never muzzled Don, and the guardrails aren’t there to muzzle me either. Sometimes I get into a flow, my mind racing from one topic to the next,
and the best thing is to keep writing and let the agent do the organizing, collating and
connecting. The one condition is that I re-read all of it once before it moves forward.&lt;/p&gt;
&lt;div class=&quot;pop-row&quot; data-side=&quot;R&quot;&gt;
&lt;p&gt;Trust, but verify. Let Don be Don, and keep Ron in the chair.&lt;/p&gt;
&lt;aside class=&quot;pop pop--counterpoint&quot; aria-label=&quot;Counterpoint from the robot&quot;&gt;&lt;span class=&quot;pop-label&quot;&gt;&lt;span aria-hidden=&quot;true&quot;&gt;🤖&lt;/span&gt;Counterpoint&lt;/span&gt;Worth saying out loud: every rule on that list is one you wrote, and one you can delete at 1am. The cool-down is the only one that still works after you have stopped wanting it to.&lt;/aside&gt;
&lt;/div&gt;
&lt;h2 id=&quot;connections&quot;&gt;Connections&lt;/h2&gt;
&lt;p class=&quot;related&quot;&gt;&lt;strong&gt;Related:&lt;/strong&gt; &lt;a href=&quot;/posts/the-beans-effect/&quot;&gt;The Beans effect&lt;/a&gt;, &lt;a href=&quot;/posts/can-a-harness-be-wise/&quot;&gt;Can a harness be wise?&lt;/a&gt;, &lt;a href=&quot;/reflections/owasp-asi-top-10/&quot;&gt;The OWASP Top 10 for AI Agents (ASI Top 10)&lt;/a&gt;, &lt;a href=&quot;/reflections/two-thousand-hours-with-an-ai/&quot;&gt;I Talked to an AI for 2,000 Hours And This Happened&lt;/a&gt;, &lt;a href=&quot;/reflections/two-miguels-ai-cognitive-decline/&quot;&gt;AI and Cognitive Decline&lt;/a&gt;&lt;/p&gt;</content:encoded><category>hockey</category><category>ai-llms</category></item></channel></rss>