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

Work log: Phantasmagoria — March 30, 2026

What shipped today

A full-spectrum scout run identified 30+ findings across error-handling, security, dead code, test coverage, feature gaps, dependency health, and risk management. The session was primarily diagnostic — understanding the codebase’s health after the intensive v2 push — with one concrete fix shipped.

Deep codebase audit. Seven parallel scout agents scanned every dimension listed in .scout.yml. The most significant finding was that resource_gain_scaled — the new default effect type per the March 28 decision — is completely invisible to all three validation layers. The feature-gaps scan also found that balance checks are advisory-only (warnings, never errors), contradicting the “reject weak YAML” decision. The dead-code scan identified an entire orphaned file (validation.py, untouched since December), 4 dead accessor functions in option_roller.py, dead prompt-building functions in context.py, and two dead config blocks in config_mod.yaml. The test-coverage scan revealed that stage2_runner.py (the core generation pipeline), renderability_contract.py (the Stage 2B/3 gate), and followup_generator.py all have zero test coverage. Python 3.9 EOL was flagged as the only high-severity dependency issue.

Error handling fix. phmg/config.py was using sys.exit(1) in library functions, making errors uncatchable by callers like check_stage_contracts.py. Replaced with a proper ConfigError exception class. Tests updated from SystemExit to ConfigError assertions. All 451 tests pass.

Issue pipeline stocked. Five issues filed from scout findings: #261 (resource_gain_scaled validation — needs prep), #262 (sys.exit fix — shipped), #263 (dead code cleanup — ready), #264 (RISKS.md creation — ready), #265 (Python 3.9 upgrade — needs prep).

Completed

  • #262 — Replace sys.exit(1) with exceptions in phmg/config.py

Carry-over

  • Stage 3/4 split plan still unexecuted (from March 29 carry-over)
  • #263 — Dead code cleanup (ready-for-dev, next in queue)
  • #264 — Create RISKS.md risk register (ready-for-dev)
  • #261 — resource_gain_scaled validation (needs prep, high impact)
  • #265 — Python 3.9 EOL upgrade (needs prep)

Risks

  • resource_gain_scaled validation hole — the most commonly generated effect type bypasses all three validation layers. Filed as #261.
  • Stage 2 pipeline has zero test coveragestage2_runner.py, renderability_contract.py, and followup_generator.py are all untested. A bug in any of these ships broken events silently.
  • Python 3.9 is EOL — no security patches since October 2025. Dependencies could drop support at any time.

Flags and watch-outs

  • The test-coverage scan found 10+ modules with zero test files, including critical pipeline components. The 451-test count looks healthy but coverage is concentrated in the renderer/validator layers; the generation pipeline is largely untested.
  • parse_json_response() is duplicated in 3 places with potentially different edge-case behavior.
  • The celestial_equinox backup files are still untracked in git status.

Next session

  1. #263 — Dead code cleanup — quick win, clears 7 dead items, already spec’d and ready-for-dev.
  2. #264 — Create RISKS.md — consolidate the 6+ scattered risks into a formal register.
  3. #261 — resource_gain_scaled validation — prep and implement. This is the highest-impact finding: the new default effect type has zero validation.
  4. Stage 3/4 split — still carrying over from March 29. The plan exists at .claude/plans/shimmering-skipping-oasis.md.
  5. Consider test coveragestage2_runner.py and renderability_contract.py are the two most critical untested modules.

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.