Untitled Excavation

The Session Cliff and the Capture Lane

How a day of OpenClaw surgery, Discord routing, and transcription tuning turned into a workflow decision.

By the end of today I was debugging three different classes of problems that all felt like one:

They were related, but not identical. That distinction mattered.

The Real Progress (Not the Feeling)

The system is materially better than it was this morning.

OpenClaw is now persistent under PM2. Discord is routed by channel. #captures is allowlisted and actually acting like a capture inbox instead of a generic chatbot. Screenshots and attachments are flowing. Voice notes are transcribing locally.

That sounds simple when written down. It was not simple in practice.

We hit a recurring OpenClaw session-store bug where Discord handlers crashed because session metadata had absolute sessionFile paths and this OpenClaw version expects relative paths. Result: messages arrived, Garret sometimes didn’t reply. That one took log reading, not prompt tweaking.

We also hit a race in voice-note ingestion. OpenClaw’s built-in audio preprocessor would say the .ogg file didn’t exist (WinError 2) even though the file showed up moments later. So the fix was not “install Whisper.” It was a local retry path that waits for the file, then transcribes.

The Popup Was Real

Once voice transcription was working, a new annoyance showed up: a visible window popup every time transcription ran.

That was Windows doing what Windows does when a tool launches python through a normal shell path.

So the transcriber now runs through a hidden PowerShell wrapper that launches Python with a hidden window and captures stdout/stderr for OpenClaw. Same functionality, less desktop noise.

It is a small UX detail, but it matters. Capture workflows die when they feel awkward.

The Base.en Lie (or: The Wrong Default for My Actual Speech)

I had a neat engineer answer for transcription defaults:

Then reality happened.

base.en missed enough words on my voice notes that it wasn’t just punctuation cleanup. It changed meaning and sentence structure. To be fair, my diction is not always clean, and Discord voice compression doesn’t help.

So the default changed.

For my #captures workflow, small.en is now the first pass. base.en is the speed option, not the default. That is a better match for the actual job: trustworthy capture beats slightly faster capture.

This is the theme of the day, honestly. Stop optimizing the wrong thing.

The Bigger Bug: Workflow Role Confusion

The technical bugs were real, but the bigger bug was architectural.

I kept blending three jobs together:

  1. Capture (phone voice notes, screenshots, idea dumps)
  2. Project work (focused implementation)
  3. Cross-project synthesis (portfolio planning)

If those are all happening in one lane, every tool feels mediocre because it’s being judged against the wrong job.

What finally clicked:

That model reduces noise and makes the tooling stack easier to trust.

What I Want Future Me To Remember

When the system starts feeling “kind of bad” again, check whether I’m actually looking at a broken component or just using the wrong component for the job.

Today, both happened.

The fix list was technical:

But the useful result is behavioral:

Capture in #captures. Build in project lanes. Review across projects with Gemini. Close the loop with a wrapup.

That is the system.

Everything else is implementation detail.