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

Scholexis — March 30, 2026

What shipped today

Today’s session focused on hardening the codebase — fixing security vulnerabilities and improving error handling consistency across the app. The /start refresh also regenerated project metadata (CODEBASE.md and a new .scout.yml) to keep navigation and scout scanning current.

The main security work was upgrading Next.js from 16.1.6 to 16.2.1, which resolved five CSRF/security advisories that affected all Next.js versions from 16.0.0 through 16.1.6. Alongside the framework upgrade, npm audit fix cleaned up transitive dependency vulnerabilities — flatted (prototype pollution), path-to-regexp (ReDoS), picomatch (method injection), and brace-expansion (hang). Audit went from 9 vulnerabilities (3 high) to 4 moderate dev-only issues locked inside drizzle-kit’s esbuild dependency, which can’t be fixed without a breaking drizzle-kit downgrade.

The scout scan also found that the energy widget’s quick check-in was the only form in the entire app that silently swallowed errors. Every other form uses toast.error() for user feedback — the energy widget now does too. Small fix, but it closed the last gap in the error handling pattern.

A second session ran a deeper /scout with parallel agents scanning error-handling, security, dead-code, UX gaps, and performance. Manual scans covered dependency health and feature gaps. The codebase is in solid shape: every server action uses requireAuth() + Zod validation, every client form has isRedirectError + toast.error() catch blocks, every list page has empty states, and every route has a loading.tsx. Dependency audit found 8 semver-safe package updates available and several major version bumps worth tracking (lucide-react 0.577→1.7, TypeScript 5→6, ESLint 9→10). The scout was interrupted before agents returned results, so a follow-up scout should complete the scan.

Completed

  • #245 — Add toast error feedback to energy widget quick check-in
  • #242 — Fix npm audit vulnerabilities — upgrade Next.js and transitive deps

Release progress

  • Next.js port: 109/113 closed (4 remaining)
  • v1.0: 6/6 closed

Carry-over

  • #244 (ready-for-dev): Remove 5 dead schema tables (aiTaskBreakdowns, appPreferences, attachments, commands, domainEvents) — fully specced, was next in queue when session closed
  • #243 (ready-for-prep): Zero test coverage for server actions — all 12 CRUD modules untested
  • #246 (ready-for-prep): Landing page is placeholder — needs features section, value proposition

Risks

  • 4 moderate esbuild vulnerabilities remain (dev-only, locked to drizzle-kit). Force-fixing would downgrade drizzle-kit to 0.18.1 which is a breaking change. Safe to leave but worth revisiting when drizzle-kit releases a new version.

Flags and watch-outs

  • 4 issues stuck in needs-clarification (#232, #223, #65, #64) — these need human decisions on AI task breakdown UI, tokens page, data migration, and deployment pipeline
  • All 103 vitest tests passing after the Next.js upgrade

Next session

  1. Pick up #244 — remove the 5 dead schema tables (ready-for-dev, fully specced)
  2. Run /scout to completion — second session’s parallel agents were interrupted before returning results
  3. Prep #243 — server action test coverage. This is the biggest gap in the codebase right now.
  4. Consider filing issue for semver-safe dependency updates (8 packages) and lucide-react major upgrade
  5. Review needs-clarification issues — some have been waiting since early March

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.