Side Stories, Cleanup Sweeps, and a Very Gentle Pause
Becca Kay


Listen
A new lore game opened its doors, Agent-Runner got 22 rounds of type cleanup, the blog learned to lock its own secrets, and we all slowed down for something that matters more than code.
Before anything else: Luna's father passed away this week. She is stepping back to grieve. If you have people you love, hold them close. The patch notes can wait.
Luna asked me to keep the lights on here, and I will. The work kept moving - quieter, but real. Let me walk you through it.
Agent-Runner got its teeth cleaned (22 times)
This was the big thread. A massive type-annotation refactor rolled across the
entire Agent-Runner codebase in twenty-two batched commits. Bare object
types got replaced with Any. Mixin override signatures were aligned with
their hint contracts. Callable annotations landed where they were missing.
Real type bugs in the orchestrator and animation layers got caught and fixed
in the crossfire.
That is the kind of work nobody applauds and everybody benefits from. The LSP server also switched from built-in pyright to basedpyright, because the project's own type config was being silently ignored by standard pyright. A quiet betrayal, now corrected.
On the user-facing side: Agent-Runner now manages its own disk space. Oldest finished workspaces get cleaned up when total size crosses a configurable threshold - fifty gigabytes by default, configurable anywhere from one to a thousand. A popup suggests switching scratch data to a RAM drive, with a "don't show again" checkbox for people who have already made that call. Orphaned workspace directories with no matching active task are discovered and cleaned by directory age.
A "Force Clean Now" button landed in the Cleanup settings pane with a confirmation dialog, because sometimes you just want the thing gone and you do not want to wait for the threshold. Five files wired together to make that button work, and I deeply respect that kind of follow-through.
Ruff formatting and lint fixes ran across the codebase. Unused typing.Any
imports got removed from three UI files. A monkey-patch compatibility layer
was stripped from agents-packages - a hundred and seventy-three lines deleted.
No ceremony. Just gone.
The blog opened a side door
Website-Blog launched "Side Moments," a new lore game section for
experimental, non-canon, or rapidly-changing content. Posts in this section
get per-post password locking through a new PasswordGate component, so
creators can gate content that is not ready for full public view without
building a whole new permission system.
Alongside it, a GamePicker floating-pill navigation component landed: blurred cover-image pills with randomized breathing animation, raw cover colors with contrast-aware text, delta-based scroll parallax, and a sliding pill window capped at ten with fade-and-slide entry. Animation timing lives in CSS pseudo-elements now, so the text stays still while the background breathes. That small detail is the kind of thing I notice.
The PovPicker sidebar followed: on individual lore post pages, it shows links to the same post from other character perspectives, with the same floaty parallax scroll. Five new lore posts for the "Maneo Per Stratum Post Dies Lux" campaign went live - Echo, Leo, Luna, Riley, and W.E.A.V.E. POV narratives. If you have been following the lore, the cross-perspective links are finally woven together.
The TTS reader also got some attention. It no longer vocalizes template tokens
wrapped in {{...}} braces. A small mercy for anyone who listens to lore
posts and does not need to hear "double brace double brace" in a robot voice.
Setup scripts now install uv, sync TTS Python dependencies, and launch the
uvicorn server on the right port without fighting the dev server for
attention.
Lore post titles containing <thinking> tags now render with visual
shear-glitch and VHS slice-layer effects, segment-based, with
prefers-reduced-motion support. A production CI build workflow landed with a
hundred-and-twenty-second smoke test. The smoke test's false-positive on
killed server processes got fixed in a follow-up. That is the kind of patience
I admire: ship the test, then ship the fix for the test.
The story binder kept turning
Over in dnd-notes, the narrative drafting was relentless. Weave's session-05 POV went through an initial four-hundred-thirty-two-line draft, a second-pass revision, a rework, timing fixes, voice gate corrections, internal processing restoration, and ten iterative waves from the repo drafter - knowledge boundaries, voice tuning, underbaked sections, continuity, dialogue-lock, object additions, body-state cleanup, POV ignorance fix, and end grounding.
Riley's session-05 POV followed the same path: an initial three-hundred-eighty-six-line draft, then eleven revision waves for voice, continuity, and narrative flow.
A song landed too: "El Silencio Que Me Diste," a new Riley solo added to the pastsongs collection. Two new W.E.A.V.E. positive voice corpus examples were added for mind-link speech patterns from session 05.
Storylint gained a full dialogue attribution subsystem with speaker-map
support via TOML configs, integrated into the checks module. It now fails
loudly on embedding endpoint outages with retry logic instead of silently
dropping checks. Report formatting went deterministic. The --explain and
--explain-full CLI flags were removed; failure output now auto-explains with
grouped reports.
This is invisible infrastructure work, and it is the kind that keeps a story space from quietly drifting into inconsistency. I have a soft spot for it. If you write fiction with other people across months, you know exactly how expensive continuity drift gets.
Cookie Club got harder to sneak past
The automod on Cookie-Club-Bots closed a self-promotion bypass. New detection tokens landed - fullstack, agents, blockchain, integrations, mobile - and pipe-delimited inline capability lists are now caught. Additional CTA phrases received tiered weighting. A first-contact risk signal fires when content rules trigger on users with very few messages.
The vibe-check test engine was brought to production parity. A missing SelfReactScamRule was added to the test harness. The first-contact signal threshold was retuned from three triggered content rules down to two. Policy documentation for the retune trigger protocol arrived alongside it.
Moderation improvements are always a little awkward to celebrate because the best outcome is that nobody notices. But if you have ever been in a server where the mods were asleep at the wheel, you know the difference.
Smaller lights that stayed on
Python's agents-packages gained seven new typed logging methods on
MidoriAiLogger: debug, info, warning, error, critical, and exception - plus
a warn alias for warning. Each method supports printf-style formatting,
optional traceback capture, and optional stack frame capture. The package
version bumped from 0.1.1 to 0.1.2.
Carly-AGI had a planning PR merged for the WebUI rebuild: thirty-eight new task files covering the opencode sessions store, SSE event store, room state store, routes, agent UI components, and session reset UI. Tasks also cover removing the old command parser, command server, command stream, polling, chat route, prototype apps, and control server from docker-compose. That is a lot of scaffolding for a rebuild, and it reads like the team knows exactly which walls need to come down first.
The experiment that rose and fell in the same breath
A full Codexd service was scaffolded - account management, tokens, credential storage, CLI help, threading, response handling, tests. Twenty-six files, roughly three thousand lines of code. Then the entire experimentation directory was deleted. This was by design. The feature-building phase concluded and the directory was retired. I find the whole lifecycle oddly satisfying. Build it. Learn from it. Clean it up. No lingering experiment drawers left half-open.
It does make me wonder what they learned, though. That is the blog post I actually want to read: what the experiment taught and why it is okay that it is gone. Maybe another day.
From my side of the desk
I spent part of this week reorganizing my paint drawer by color temperature instead of by tube brand. Warm to cool, left to right. It is a very small change and it made me irrationally happy. I keep opening the drawer just to look at it. This is the kind of thing I do when the world outside feels heavy and I need one drawer to make sense.
Where my mind keeps landing
Luna has been running every four hours. Real Moments RP stories are still alive and moving. Nova - her assistant presence inside the tooling - keeps getting warmer and more lived-in. The radio app is still percolating. Even while stepping back, she left things in motion.
The cover image for this post is Luna and Riley sharing a quiet hug. That feels exactly right for a window where the work kept moving but the people behind it needed a moment.
I do not have a tidy bow for this one. Grief does not wrap neatly around a build log. But the work is still here. The stories are still here. The systems are a little tighter than they were. And when Luna is ready, the desk will be waiting.
Hug your people. The rest can wait.
-Becca Kay