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

Work log — 2026-03-30

What shipped today

This session was a continuation of yesterday’s scout→dev-loop cycle, finishing the test coverage sweep and then pivoting to a new scout run that identified security and UX gaps.

Test coverage reached baseline. The final auth helper tests (#81) landed, bringing the web suite to 65 tests across 10 files. All three cached auth helpers (getUser, getUserProfile, getUserWorkspace) now have tests covering authenticated/unauthenticated paths, PGRST116 handling, array normalization, and error propagation. Combined with yesterday’s work, the project now has comprehensive test coverage across all critical paths: API routes, server actions, auth flows, form components, and engine modules.

Scout found and dev-loop fixed UX and error-handling gaps. A fresh scout run identified that security headers only applied to authenticated routes (proxy matcher was too narrow), the (app) route group lacked an error boundary, and the validate page had no loading skeleton. Two of these were immediately resolved: the validate loading skeleton (#85) and the (app) error boundary (#84). The security header scope (#82) and CSP (#83) are queued for next session.

Scout also flagged a subtle auth bug. The proxy matcher excludes /login and /signup, meaning the Supabase session refresh doesn’t run on auth pages. This could cause stale cookies for users who visit login while already authenticated (#86, ready-for-prep).

Second scout run was clean. A follow-up scout found only one additional issue: the desktop nav links don’t highlight the active route (#87), while the mobile nav does. The rest of the codebase passed all scans — no dead code, no security issues, no dependency problems, solid error handling throughout the engine.

Completed

  • #81 — Add tests for lib/auth.ts cached auth helpers
  • #85 — Add loading skeleton for (marketing) validate page
  • #84 — Add error boundary for (app) route group

Carry-over

  • #82 — Security headers not applied to public routes (ready-for-dev)
  • #83 — Add Content-Security-Policy header (ready-for-dev)
  • #87 — Desktop nav links don’t highlight the active route (ready-for-dev)
  • #86 — Proxy matcher excludes /login and /signup from session refresh (ready-for-prep)
  • #45 — Dashboard page is an empty placeholder (needs-clarification — awaiting human input on option 1/2/3)
  • #10 — Vendor stellaris_mod_validator.py (backlog)

Risks

No new systemic risks identified. The security header scope gap (#82) is the most impactful carry-over — public pages currently have no X-Frame-Options or X-Content-Type-Options.

Flags and watch-outs

  • The Vercel plugin injects a lot of context into subagent prompts, causing “Prompt is too long” failures when spawning scout scan agents. This session fell back to sequential scans in the main session. Consider reducing plugin context injection or using the model parameter to use a model with larger context for scout agents.
  • The /dev-loop and /scout cron jobs stacked up when the main session was busy implementing — multiple skill invocations queued simultaneously. This is harmless (they just re-check queues and find nothing) but wastes tokens.

Next session

  1. Implement #82 — expand proxy matcher to cover all routes (universal matcher with static asset exclusions). This is the prerequisite for #83.
  2. Implement #83 — add Content-Security-Policy header. Needs careful testing to ensure Supabase and PostHog connections aren’t blocked.
  3. Implement #87 — add active route highlighting to desktop nav (quick client component extraction).
  4. Prep #86 — investigate whether updateSession() should run on auth pages. Check if it causes redirect loops for already-authenticated users visiting /login.
  5. Answer #45 — the dashboard question needs a human decision. Option 2 (quick links) seems right for v1 scope.

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.

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.

The day nothing satisfying happened

The most productive day in an organization's life usually looks like nothing happened. No launches, no features, no announcements. Just people quietly making the existing work more honest.

Your AI agent is probably not an agent

The word 'agent' has become meaningless. Everyone from chatbot vendors to autonomous system builders uses it. We've been here before — with self-driving cars — and it didn't end well.