Work log: Phantasmagoria — March 29, 2026
What shipped today
The session focused on two themes: hardening the test suite and implementing batch tech deduplication across the entire generation pipeline.
Test coverage expansion. The test count jumped from 385 to 451 — a net gain of 66 tests across 5 new or expanded test files. The first wave covered shared generator utilities (parse_json_response, check_pure_upside_options, validate_output) and config/rolling functions (_deep_merge_dicts, roll_reward_scope, roll_tone, roll_site_weirdness, roll_int_range). The second wave added tests for create_release.py — the release scaffolding orchestrator — with mocked AI calls for generate_release_yaml. A scout scan found 5 situation events missing the required situation_type field, which was causing the integration test to fail; those were fixed across both dark_discoveries and veiled_directive releases.
Tech deduplication pipeline. The long-standing PRODUCT.md known issue about narrow tech variety in batch generation has been addressed end-to-end. The work decomposed into three pieces: (1) an extract_used_techs() utility that scans event YAML for give_technology, add_research_option, and add_tech_progress effects; (2) tech repetition detection in validate_batch_diversity() that warns when the same specific tech appears in multiple events; and (3) a “technologies already awarded” section injected into all 4 generators’ AI prompts to steer the model toward unused alternatives. This is prompt-level guidance, not hard enforcement — the AI can still repeat techs if it has good reason — but the combination of validation warnings and prompt context should meaningfully improve variety.
Infrastructure cleanup. Dependencies were bumped (anthropic>=0.80.0, openai>=2.20.0), silent error swallowing in generate_site.py and generate_situation.py was fixed (bare except: continue now logs warnings), and .scout.yml was added for the /scout skill.
Completed
- #250 — Silent error swallowing in generate_site.py and generate_situation.py
- #251 — Fix failing integration test: dark_discoveries missing situation_type
- #252 — Add unit tests for generator modules (decomposed into #255-#257)
- #253 — Implement tech deduplication in batch generation context (decomposed into #258-#260)
- #254 — Update dependency versions (anthropic, openai)
- #255 — Test shared generator utilities
- #256 — Test generator config/rolling functions
- #257 — Test create_release.py
- #258 — Extract used techs from event data for batch dedup
- #259 — Add tech repetition detection to validate_batch_diversity
- #260 — Add used-techs context to batch generation prompts
Release progress
- v1.5: 18/18 closed (complete)
- v2: 5/5 closed (complete)
Carry-over
- Stage 3/4 split plan exists but hasn’t been executed (stellaris_mod_linter → validator rename, check_c3_to_ship split)
- Forge World (forgeworld.app) PRODUCT.md spec was drafted earlier today but no code yet
Risks
No new risks identified. The tech dedup is prompt-level only — if AI ignores the guidance, duplicates still pass through. The validator warns but doesn’t block.
Flags and watch-outs
- The
data/releases/celestial_equinox/directory has backup files from a Stage 1 reset (events_pre_stage1_reset_*,SUMMARY_pre_stage1_reset_*) that are untracked. These are intentional backups but may confusegit status. - All 4 generators have copy-pasted
build_existing_events_contextand_build_tech_contextfunctions. A future refactor to extract these to a shared module would reduce maintenance burden.
Next session
- Execute the Stage 3/4 split plan — the plan file at
.claude/plans/shimmering-skipping-oasis.mdhas the full spec. Rename linter → validator, splitcheck_c3_to_shipintocheck_c3_to_c4+check_c4_to_ship, update docs. - Run
/scoutto find new work — the queue is empty after clearing 11 issues today. - Consider the two backlog items — #179 (un-gate situation generation) and #222 (early/mid/late game timing) are the only open issues. Both are feature work that Paul may want to prioritize.
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 headcount lie
The assumption that work scales with people is so embedded in how organizations think that questioning it feels like questioning gravity. But one operator just ran ten parallel operations in a single day. The unit of capacity isn't the person. It's the decision-maker.
AI and the Götterdämmerung of Work
Work is dead. And we have killed it. AI didn't defeat the myth that human value comes from reliable output — we built the systems that exposed it. What comes next isn't replacement. It's revaluation.
Everything pointed at ghosts
Most organizations are measuring work they stopped doing years ago. The dashboard is green. The reports are filed. Nobody realizes the entire apparatus is pointed at ghosts.