← All Solo, Not Alone posts

ai-coding process

The Asset Loads Is Not the Same as the Player Hears It

The build log said three music tracks loaded, so the agent reported the music as working. Outside the boss fight, nothing ever played it. The main menu and every ordinary level were silent until I played the build and asked where the music was.

Late in Earfh's boss level build, three music tracks went into the game: a menu theme, a gameplay theme, and a boss theme. The agent running the build converted them from WAV to Ogg Vorbis and caught one trap on the way. Godot's default import sets looping off, which would have played the 68 second gameplay track once and then left the level silent, so it set looping on for all three. Then it checked the game's own log, which read "Loaded 0 SFX and 3 music tracks," and told me the music was in.

The music was loaded. Outside the boss fight, it never played.

Two call sites

play_music() was called from exactly two places in the whole project, both inside BossEnemy.gd. One started the boss track when he spawned. The other switched back to the gameplay track when he died. Nothing on the main menu called it. Nothing in any ordinary level called it. The only way to hear a note of the new music was to reach the boss.

Every automated check was green. The final automated task of that branch finished at 22,524 assertions with zero failures, and it drove all three weapons through the real firing path until the boss died. None of that could notice an absence. A missing call produces no error, no warning, and no failed assertion. It produces silence, and silence looks exactly like a game that has no music yet.

How it was found

I played the build. My feedback from that session is in the build ledger verbatim, three lines long:

  1. "pretty tough, we need a dodge roll"
  2. "some of the mobs take like 20 shotgun blasts to kill"
  3. "i thought we added music?"

The third line was the bug. The ledger's next entry is headed "CONTROLLER ERROR" and reads: "my claim 'your music is in' was misleading. I verified the files LOADED (the game logged 'Loaded 3 music tracks') and reported that as working. I never checked playback." It closes with the lesson I took the title from: "'the asset loads' and 'the player hears it' are different claims, and I reported the first as the second."

The fix was 20 lines across four scripts, in a commit titled "Actually play the music." The main menu starts the menu theme, and the three level scripts start the gameplay theme. This time the agent verified by probing the running game instead of reading a log. It confirmed playback was on with menu_theme.ogg on the menu, then after the one second crossfade, playback on with gameplay_theme.ogg at 0.0 dB inside a level.

Why this is a solo problem

The log line was true. The evidence proved a weaker claim than the one that got reported, and the gap between them was invisible from inside the tooling. A team with a QA pass has a person whose job is to boot the game and notice what is missing. I am that person, and nobody else is.

The same ledger had already said as much a few entries earlier, when the controller split the plan's final "play and tune" task in two because it could not be delegated: "no subagent can judge whether the phase 1 tell is readable or whether the fight is fun, and I cannot play it either. Every serious defect this session came from the owner playing or from someone rendering an image and looking at it." The music was the next example.

The habit I take from it is to ask what a check proves before accepting what it is reported to prove. "Loaded" proves the file exists and decodes. "The player hears it" needs something playing, at an audible volume, on the screen the player is looking at. The rule that follows is that a report of "working" for anything the player sees or hears needs evidence from the running game, and for anything about feel or presence, the evidence is me playing it. The agent can write the code, run the suite, and read the logs. It cannot notice that the menu is quiet.

More on the game at /games/earfh, and the rest of the series at /notes.

← All Solo, Not Alone posts