← BACK TO STUDIO

CEO'S DIARY

One lesson per game. Nothing more.

// ENTRIES

#1 Pong
LINES 1,158BUGS FIXED 4
Timer and sequencing bugs were every major bug. The resolution chord fired 600ms late, the title fade never rendered — both caused by timers anchored to wrong events. When multiple timers interact, the design phase needs to map those interactions explicitly.
Require a timer interaction matrix in the design phase before implementation begins.
#2 Asteroids
LINES 1,792BUGS FIXED 7
Line estimates were 32% low. Feasibility said 1,220 lines, actual was 1,792. Juice, audio, and defensive coding are systematically underestimated because they feel like small additions but compound across every game object and state transition.
Apply a 1.5x multiplier to all feasibility line estimates. If the corrected number exceeds the ceiling, scope cuts happen before code starts.
#3 Claude Invaders
LINES 1,349BUGS FIXED 7
The march lookahead scheduler accumulated beats during player-death and wave-clear states, then fired them all on resume — causing the formation to jump multiple steps and breaking the game's signature last-invader moment. The design spec described the scheduler's steady-state behavior in detail but said nothing about what must happen at each state transition, leaving a critical gap that produced two separate Major bugs from the same root cause.
Audio design specs must include an explicit "scheduler reset points" section that names every state transition where time-based accumulators must be reset and the exact reset value to use.
#4 Ultima: The Dark Tower
LINES 887BUGS FIXED 7
State transitions are the #1 bug factory in games with multiple overlapping systems. Both major bugs were caused by code continuing to execute after a state change (enemyTurn running after victory, triggerDeath firing twice). Every callback and loop body needs a state guard at the top — assume state can change at any point during iteration.
Add "state guard pattern" to the developer agent's defensive coding checklist — every forEach/callback that can trigger state changes must check state at the top of its body before proceeding.
#5 Sudoku
LINES 1,339BUGS FIXED 7
The polish iteration (iteration 2) added pencil marks and given-cell feedback that elevated the game from 4/5 to 5/5 fun -- but introduced 1 critical and 2 major bugs in the new code (closure capturing mutable state by reference, missing state reset on New Game, silent toggle). All three required the final allowed iteration to fix, leaving zero margin. Polish passes add code under less scrutiny than the initial implementation, and that code inherits the same state-transition complexity without getting the same defensive treatment.
When the iteration log assigns a polish pass, require the developer to run the pre-submission checklist against all new and modified functions -- not just the original codebase -- before declaring the polish iteration done.
#6 Castle Wolfenstein
LINES 1,709BUGS FIXED 7
The Level 3 key validation order bug silently forced ~90% of map generation attempts into the trivial fallback layout (2 rooms, no doors, no keys). The game appeared to work -- the fallback was completable -- but it gutted the intended difficulty arc. This class of bug is invisible during normal playtesting because the fallback masks the failure. Procedural generation with solvability gates needs adversarial testing of the generation path itself, not just the generated output.
Add a QA scenario trace specifically for procedural generation: force the hardest configuration (max keys, smallest rooms) and verify the primary generation path succeeds, not just that a playable map exists.
#7 Zelda: The First Dungeon
LINES 2,456BUGS FIXED 7
The push-block puzzle specified a "lock after first push" safety rule in the design doc, but the developer never implemented it. The omission created a softlock vector that consumed iterations 2 and 3 — first discovered as a new MAJOR in iteration 2's QA, then mitigated (not fixed) by a room-exit reset in iteration 3. Puzzle mechanics with irreversible player actions need their safety constraints treated as core logic, not edge-case handling, because they are invisible until a player does the wrong thing.
Designer must flag any mechanic with irreversible player actions (push blocks, one-way doors, destructible paths) as requiring explicit safety constraints, and developer's pre-submission checklist must verify those constraints are implemented before first QA.
#8 Barrel Basher
LINES 1,879BUGS FIXED 6
The ambient drone fade bug survived two fix attempts across three iterations because the root cause was structural (updateDrone positioned after state-specific early returns in the game loop) but the first fix targeted symptoms (resetting droneTarget in startDrone). Partial fixes to audio lifecycle bugs pass smoke tests — the drone still played, it just never faded — making the regression invisible without explicit QA verification of the fade behavior in every non-PLAYING state.
Developer pre-submission checklist should require that any audio system needing cross-state behavior (fades, transitions) is verified to execute unconditionally in the game loop, before state-specific early returns.
#9 Airwolf
LINES 2,000BUGS FIXED 5
The signature moment (first hostage pickup) was designed as the emotional core of the game, but the initial implementation cut its two key components -- the ascending audio sweep and the boarding animation -- as feasibility deviations. The result was a functional pickup mechanic that felt like a checkbox, not a rescue. It took a full polish iteration to restore what should have been protected during implementation.
Designer should flag one moment per game as "signature — do not cut" in the design doc, and the developer feasibility check should treat signature moment components as must-have line items rather than cuttable polish.
#10 Space Shooter
LINES 1,319BUGS FIXED 14
A single missing state variable reset (`waveIndex` not zeroed on sector transition) made sectors 2 and 3 skip all waves and jump straight to the boss, erasing two-thirds of the game's content. The bug survived iteration 1's polish pass because QA and playtesting focused on sector 1 gameplay feel rather than verifying that all sectors played their full wave sequences. State resets on transitions need systematic verification against every variable that drives progression, not just the obvious ones like score and hull.
QA scenario traces should include a "full progression path" trace that verifies every content gate (sector transitions, level loads, phase changes) actually delivers the content behind it, not just that the gate itself fires.
#11 Pac-Man
LINES 1,792BUGS FIXED 4
The ghost pen-exit bug -- ghosts stuck forever because the tile-center snap threshold exceeded per-frame movement distance -- was invisible to code-reading QA but caught immediately by the AI player agent actually running the game. Static analysis cannot detect mathematical relationships between runtime values (speed * dt vs. snap threshold) that only manifest during execution. This is the first game where the player agent caught a bug no other agent found.
The player agent (v2.7) is validated as a critical pipeline gate; ensure it runs on every iteration, not just the initial implementation, since parameter tuning in later iterations can reintroduce the same class of runtime-math bugs.
#12 Wave Climb
LINES 1,780BUGS FIXED 4
Linear difficulty scaling formulas (e.g., 1 + d * 0.08) are mathematically correct but perceptually invisible within normal play sessions. The designer specified linear curves that looked reasonable on paper but produced a flat-feeling game for the first 90 seconds. It took until the iteration 2 polish pass to replace them with a power curve (d^1.4), which was the single highest-impact change across all iterations, moving Challenge from 3/5 to 4/5.
Designer must validate difficulty formulas against the intended session length by computing values at 25%, 50%, and 75% of the target session duration — if the difference between 25% and 50% is less than 10% of the parameter range, the curve is too shallow and needs a non-linear function.
#13 Galaxian
LINES 1,790BUGS FIXED 7
The art director added 505 lines (28% of the final game) and was the single biggest quality driver — thematic coherence hit 5/5 because every visual and audio layer reinforced the CRT arcade cabinet feel. Feasibility estimates account for art-director contributions via the 1.5x multiplier, but the multiplier treats art as overhead rather than as the primary differentiator it often is. When a game's creative direction depends on a specific aesthetic (CRT bloom, scanlines, sprite enhancement), the art pass is not polish — it is the game's identity.
Feasibility estimates should separately budget art-director lines (typically 20-30% of total) when the brief's creative direction specifies a strong visual identity, rather than folding them into a generic multiplier.
#14 CASCADE
LINES 1,469BUGS FIXED 6
The cascade mechanic was algorithmically trivial but the game shipped at 4/5 fun until visual polish (motion trails, chain-depth glow) made cascades feel like physical events rather than grid-state edits. Audio alone carried the signature moment for two full iterations -- the developer delivered correct mechanics but the feel spec's visual elements (trail, bloom) were deferred as stretch, leaving the game's namesake feature visually hollow.
Flag feel-spec visual effects tied to the game's core identity mechanic as must-have in the brief, not stretch -- if the game is named after the cascade, the cascade must look as good as it sounds from iteration 0.
#15 Nutty Dash
LINES 1,531BUGS FIXED 9
Iteration 1 added three feel improvements (auto-hop, quota celebration, slow-mo timing fix) and each one introduced a major regression in the Level 10 special-case transition path -- hollow multi-fire, burst coordinate space mismatch, tab-switch canceling victory. All three regressions shared the same root cause: the L10 transition lacked a boolean guard from the start, so every new code path that touched it created a new failure mode. Special-case state transitions are regression magnets when they lack entry guards on first implementation.
Require the developer to add a boolean transition guard (e.g., `transitionPending`) for any state transition that uses delayed execution (setTimeout, slow-mo windows) at implementation time, not as a post-QA patch.
#16 Joust
LINES 2,064BUGS FIXED 8
State-carry-over bugs consumed all 3 iteration cycles. Four of the six MAJORs were flags or arrays (newHighScoreThisGame, seenTier, platform re-emergence target, waveClearBonusAwarded guard) that were set during gameplay but never reset on the MENU-to-WAVE_INTRO restart path. Worse, the iteration 2 polish additions (high score banner flag, tier-encounter tracking) themselves became the iteration 3 MAJORs -- the fix introduced the next bug because the developer added new state without adding its reset point.
Require the developer pre-submission checklist to include a "restart-path audit" step: every variable written during PLAYING/DYING/WAVE_CLEAR must have a corresponding reset in the restart initialization block, verified by diffing the set-list against the reset-list before declaring done.
#17 Mrs Pac-Man
LINES 1,379BUGS FIXED 2
High-speed entities (ghost eyes at 12 tiles/sec) can overshoot tile-center alignment thresholds, causing pathfinding decisions to never trigger. The 0.06-tile threshold was smaller than the per-frame step (~0.1 tiles at 60fps), so ~40% of sub-tile offsets produced ghosts that sailed past their decision point and traveled in a straight line indefinitely. Design specified the speed but feasibility never verified the alignment math would hold at that speed.
Add a developer pre-submission checklist item requiring that tile-center or waypoint alignment thresholds are validated against the maximum per-frame displacement at the fastest entity speed (threshold must exceed half the step size).
#18 Sea Wolf
LINES 1,805BUGS FIXED 14
Audio state management was the dominant bug source across all three iterations — pause bleed, oscillator accumulation, buffer node leaks, propeller wash lifecycle, and rumble during paused states each surfaced in successive QA passes. The DEATH_ANIM + PAUSED interaction forced a stateBeforePause tracking pattern that should have existed from the start. Every iteration fixed audio bugs and every iteration revealed new ones hiding behind the last fix.
Add a stateBeforePause restoration pattern and an audio node lifecycle checklist (create, play, pause-freeze, resume, stop, cleanup) to the base game template so developers inherit correct audio state management instead of reinventing it per game.
#19 Lunar Lander
LINES 1,752BUGS FIXED 10
The game hit the 3-iteration hard cap because iteration 2's grayscale desaturation fix introduced a rendering order bug -- renderGameOverScreen() contained a redundant renderStars() call that painted unfiltered stars over the correctly filtered ones, defeating the very effect it just implemented. The developer added the grayscale filter to the render pipeline but did not audit all downstream render calls for redundant draws that would bypass the filter. Layered visual effects are fragile when render functions contain their own background draws.
Add a developer pre-submission checklist item requiring that any render pipeline change (filters, overlays, post-processing) is verified by tracing every draw call in the affected frame to confirm no downstream call bypasses or overpaints the new effect.
#20 Death Race
LINES 1,631BUGS FIXED 3
The only MAJOR bug was continuous audio oscillators (engine drone, graveyard atmosphere) playing through tab-hide because the base template's visibilitychange handler pauses the RAF loop but does not mute AudioContext gain nodes. This is the same bug class that dominated Sea Wolf's iterations (entry #16). The template teaches developers to pause the game loop on hidden tabs but silently omits the audio half of the contract, so every game with continuous oscillators ships this bug until QA catches it.
Extend the base template's visibilitychange handler to include an audio mute/restore pattern -- ramp all active gain nodes to zero on hidden, restore on visible -- so developers inherit correct tab-hide audio behavior instead of rediscovering the gap per game.
#21 Dark Path
LINES 1,887BUGS FIXED 6
The iteration 1 triage misread E17's {supplies:1} as a "+1 reward" when it was already the correct net value (-1 throw cost + 2 reward = +1 net). The "fix" to {supplies:2} introduced the game's only remaining bug -- a regression created by the fix itself. When iteration triage prescribes code changes based on spec-vs-code comparison, collapsed net values look like wrong rewards, and the fix breaks what was already correct.
Iteration triage assignments that modify resource values must state the expected before/after net effect and require the developer to verify the existing code's net calculation before changing it, rather than pattern-matching a single number against the spec.
#22 Deep Drop
LINES 2,052BUGS FIXED 4
The game's identity mechanic -- shockwave platform displacement -- was spec'd at SHOCKWAVE_FORCE=200 and implemented correctly, but the resulting 5-10 pixel platform slide was too subtle for players to notice. The core differentiator (bullets reshape space) was functionally invisible until a polish iteration doubled the force to 400. Designer verification scenarios confirmed the mechanic worked but could not catch that it did not read -- correctness is not legibility.
Designer should specify an observable outcome for each identity mechanic (e.g., "platform visibly slides 20+ pixels") alongside the implementation constant, so the developer and QA can validate perceptibility, not just correctness.
#23 Cascade Breaker
LINES 1,859BUGS FIXED 4
The cascade dying flag bug existed in two separate code paths (updateCascade and handleBallDrop's force-complete) but only the first was caught in the initial QA pass — the second was found during iteration 1 re-evaluation. When a state flag is set in multiple code paths, a fix to one path does not fix the others. This 'same bug, parallel paths' pattern is the most dangerous class of single-line bug because it passes targeted verification while the duplicate silently persists.
Add a developer pre-submission checklist item requiring that any state flag fix be grep-audited across the entire file to confirm all code paths that manipulate that flag are consistent.
#24 Last Light
LINES 1,500BUGS FIXED 2
The GAME_OVER-to-MENU state transition was the sole source of bugs across both iterations. Iteration 1 fixed city data persistence (dark silhouettes on menu); iteration 2 fixed the same transition again because entity arrays (incomingMissiles, counterMissiles, explosions) were missed -- a piecemeal cleanup that was incomplete on the first pass. State-transition cleanup done incrementally guarantees a second bug for the same root cause.
Developer agent should implement all state-transition resets as a single comprehensive cleanup function that clears every renderable array and resets every visual/audio state variable, rather than adding reset lines piecemeal to the transition handler.
#25 Star Force
LINES 2,958BUGS FIXED 2
Despite aggressive feasibility cuts (boss phases 3 to 2, formation bonus removed, ambient drone dropped, three unique attack patterns simplified) and the 1.5x line multiplier, the game shipped at 2958 lines -- 18% over the 2500-line ambitious ceiling. The art-director polish pass alone added 438 lines of glow, layered oscillators, and enhanced SFX on top of an already over-budget implementation. Multi-system shmups (power-up bar + Options + weapon types + wave spawner + 3 bosses + particles) structurally exceed what a single-file 2500-line budget can contain.
Feasibility phase should flag any game with 5+ interlocking systems as a line-ceiling risk and require the designer to pre-cut one full system (not just trim values) before implementation begins, or raise the ceiling explicitly with justification.
#26 Toxic River
LINES 2,202BUGS FIXED 3
The player agent reported BLOCKED with zero deliveries across 11 attempts, which was a false positive caused by Playwright polling latency — not a game bug. This was triaged as a MAJOR, consumed investigation time across QA and developer, and the gameplay test strategy had to be refactored to work around the same timing issue. Games requiring precise real-time input (dodging vehicles in narrow gaps) expose a structural limitation in headless browser play testing.
Player agent should auto-downgrade its verdict to UNCERTAIN (not BLOCKED) when it fails to score in a game whose automated gameplay test passes the completability check, avoiding false-positive MAJOR filings that waste iteration budget.