Skip to main content
Paul Welty, PhD AI, WORK, AND STAYING HUMAN

Work log — 2026-04-01

What shipped today

Today’s session was focused on reliability and survivability — fixing two silent failure modes that could leave users stranded without any indication of what went wrong.

The auth callback fix (#199) addressed a particularly sneaky bug: ensureWorkspace was silently swallowing errors during the sign-up flow. If the workspace insert failed, membership creation was silently skipped. If membership insert failed, it was just ignored. Both cases left the user with a session but no workspace — a broken state with no recovery path. The fix makes both throw, and the caller now catches and redirects to login with a workspace_setup_failed error. This is the kind of invisible failure that causes confused support tickets and is very hard to diagnose after the fact.

The simulation chat fix (#200) rounded out the error surface in the core learning experience. ChatMessages now shows an error banner with a retry button when the initial message fetch fails, rather than leaving the learner staring at a blank screen. MessageInput similarly surfaces errors inline with a retry affordance. ModuleDeleteButton in admin got the same treatment — previously, delete failures threw unhandled rejections that crashed the component tree. These UI-layer fixes mean errors are visible and recoverable rather than invisible and terminal.

Alongside the bug fixes, three new root-level agent context documents were created: CODEBASE.md (file map for navigation), DECISIONS.md (architectural decisions), and RISKS.md (known fragilities). PRODUCT.md was condensed from a 319-line narrative into a focused 64-line format matching the others. This infrastructure makes future sessions faster to bootstrap — instead of having to explore the repo to understand the architecture, the agent gets a current snapshot of the key facts.

Completed

  • #199 — Fix throw on workspace/membership insert failures in auth callback
  • #200 — Add error handling and loading states to simulation chat
  • docs: Add CODEBASE.md, DECISIONS.md, RISKS.md agent context docs
  • docs: Condense PRODUCT.md to focused format

Release progress

Simulation practice milestone (due 2026-05-29): 3/4 closed — #172 (pass lesson context through to simulation practice) remains open and in-progress.

Alpha launch (v2) milestone has no issues filed yet.

Carry-over

  • #172 — Pass lesson context through to simulation practice (in-progress, blocks simulation practice milestone)
  • #214 — Scope user-facing queries by workspace_id (dashboard, simulations list) — security gap, ready-for-dev
  • #215 — Validate workspace ownership in writeCommand (commands table RLS) — security gap, ready-for-prep
  • #216 — Add error.tsx boundaries for main app routes — ready-for-dev
  • #210 — Add loading.tsx for simulations, modules, and admin routes — ready-for-dev
  • #206 — Remove or implement stub admin pages (lessons, library) — ready-for-dev
  • #204 — Add workspace context to requireAdmin authorization check — ready-for-dev

Risks

No new risks. The two silent failure fixes actually reduce one of the existing risks (users stuck in broken state post-signup with no indication). The workspace scoping issues (#214, #215) remain the highest-priority open security concern.

Flags and watch-outs

  • .playwright-mcp/ and signup.png are sitting in the working tree untracked — check whether these should be gitignored or deleted before next session.
  • The simulation practice milestone is 3/4 closed but #172 is the meaty one — lesson context threading through to the simulation engine. Worth verifying the scope before diving in.

Next session

  1. #172 — This is the open milestone issue. Start by reading web/app/(app)/simulations/new/page.tsx and engine/commands/simulation_message.py to understand the current lesson→simulation handoff and where context needs to be threaded.
  2. #214 + #215 — Workspace scoping in queries and command writes. These are security gaps, not cosmetic — do them before any production traffic. #215 is ready-for-prep (needs spec), #214 is ready-for-dev.
  3. #216 — Error boundaries. Fast win after the UI error work done today.
  4. Clean up .playwright-mcp/ and signup.png from working tree.

Why customer tools are organized wrong

This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.

Infrastructure shapes thought

The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.

Server-side dashboard architecture: Why moving data fetching off the browser changes everything

How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.

The work of being available now

A book on AI, judgment, and staying human at work.

The practice of work in progress

Practical essays on how work actually gets done.

Delegation without comprehension is just prayer

The organizations that survive won't be the ones that automated the most. They'll be the ones that figured out what to stop delegating.

The case for corporate amnesia

Most organizations worship institutional memory. But what if the thing they're preserving is mostly decay?

Your design philosophy is already written

Builders who work across multiple projects leave fingerprints everywhere. The same mind solves the same problem differently in every domain — and usually doesn't notice. You need someone to read it back to you.