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

Work log: Scholexis — March 13, 2026

What shipped today

The critical blocker fell today. The #103 academic structure chain — the dependency that had been gating 8+ issues — is now fully unblocked. Both children shipped: academic year CRUD (#123) and term CRUD with week generation (#124). This was pure execution work, following the established instructor CRUD pattern across 14 new files.

Academic year CRUD (#123) landed first — straightforward list/create/edit/delete pages at /academic-years. Six files, all following the instructor pattern exactly: server actions with requireAuth(), table list with empty state, shared client form with date inputs, client actions component for edit/delete. No surprises.

Term CRUD with week generation (#124) was the meatier piece — 8 files including the manage weeks page. The term form adds an academic year dropdown (using getAcademicYears() from #123), start/end dates, and a “week starts on” selector (Monday/Sunday). On create, the system auto-generates alternating A/B weeks between the term’s start and end dates, ported directly from the Rails Term#generate_default_weeks method. The manage weeks page at /terms/[id]/weeks shows all generated weeks with inline type editing via select dropdowns (A/B/Vacation/Exams/Other), saving immediately via updateWeekType server action with useTransition.

Earlier in the session (carried over from yesterday’s context), #118 (commands and domain events schema tables) also shipped — two new Drizzle tables for the engine polling pattern, plus a migration.

Completed

  • #118 — Add commands and domain events tables to schema (PR #122)
  • #123 — Build academic year CRUD pages (PR #125)
  • #124 — Build term CRUD with week generation (PR #126)
  • #119, #120, #121 — Prepped and labeled blocked (depend on #107)

Release progress

Next.js port: 40/54 closed (74%). 14 open issues remain — all labeled blocked.

Carry-over

  • #105 (blocked) — Course CRUD with meeting schedule management. Was blocked on #103 (academic years/terms). Now that #103’s children have shipped, #105’s blocker is resolved. Needs its blocked label removed and re-prepped since it depends on terms/academic years being available.
  • #119, #120, #121 (blocked) — AI breakdown pipeline children, all blocked on #107 (assignments).
  • #107 (blocked) — Assignment list/create/edit form, blocked on #105 (courses).
  • All 14 remaining issues are labeled blocked — the chain is #105 → #107 → #108/#109 → #110/#111/#112, plus #119/#120/#121 blocked on #107, plus #62/#63/#64/#65 blocked on core CRUD completion.

Risks

  • The entire remaining milestone is a linear dependency chain. Nothing can be parallelized until #105 (course CRUD) ships, which unblocks #107 (assignments), which unblocks everything else. Any delay on #105 delays the whole milestone.

Flags and watch-outs

  • Term deletion cascades manually (deletes weeks first, then term) since the schema doesn’t have onDelete: cascade. This is consistent with the pattern but worth noting if foreign key constraints change later.
  • The Select component’s onValueChange passes string | null — required wrapping with null guards in term form and week editor. This may affect future forms using the same component.

Next session

  1. Unblock #105 — remove blocked label, re-prep with updated spec now that academic years and terms exist.
  2. /issue exec 105 --auto — course CRUD with meeting schedule management. This is THE highest-leverage item — it unblocks #107, which unblocks 6+ downstream issues.
  3. After #105 ships, prep and exec #107 (assignment list/create/edit).
  4. Once #107 lands, the floodgates open: #108, #109, #110, #111, #112, #119, #120, #121 all become unblocked.

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.

The machine is eating faster than you can feed it

Sixty-three issues closed across thirteen projects in one day. Four milestones completed. And the hardest problem wasn't building — it was keeping up with what you've already built.

The proxy problem

Every organization has this problem: knowledge locked inside one person's head. Today I accidentally designed a solution — and it has nothing to do with documentation.

True 1-to-1 outreach is finally possible with AI

The 1-to-1 personalization promise is thirty years old. It never worked because understanding each person was too expensive. AI changed the economics.