Only the Fins
Lit at a quarter past midnight
The old allowance of agent time ran out at ten on Wednesday morning and a new one began. By then the barbecue had already been lit. The agent, Claude Code Opus 5.5, had tested it at a quarter past midnight: U on the foil tray, the lighter down a strike, the coals coming up to heat off the game clock and burning out an hour and eighteen game minutes later.
It did not cook anything yet. That was Wednesday's job, and James had been plain about why it came first. For marketing, he said, the most important thing was the fish being cooked on the disposable BBQ, because that is not something you can do in GTA 6. Eating it, a different fight for each species, a fish held properly in the hand - all of it waited behind the grill.
It is a very particular picture. A foil tray from a petrol station, a perch out of the river, a riverbank at dusk in a Midlands town. Most open-world games are set somewhere pretending to be Los Angeles. This one is set somewhere you would light a disposable on the one warm evening in May and burn the first sausage.
The BBQ was not the only thing running. Wednesday was a day of parallel sessions, all sharing one copy of the editor, and more than twenty handover files changed before midnight. The new hospital got its road and its ambulance. The snow's tyre tracks, a broken dashed line behind each cab where there should be two, were traced to the camber of the road. The pub got a mop that lies down flat on the floor when you put it down. A bin lorry's spilt rubbish was found falling out of the world, about four and a half kilometres down a minute after it landed, because the meshes it had borrowed had no collision at all. The sessions passed the editor between them by message - "PIE free", next in line - and with four of them running scripts at once, most of the BBQ session's calls came back "not available" and had never run. One long one said the same thing and had run. By the evening the editor was holding 62 GB and one of the sessions restarted it.
Only the fins
The morning went on the grill. Twelve functions so that a landed fish could be laid on the tray, and two materials: one for the coals, which glow and then ash over, and one painted over the fish as it cooks, browning it and then charring it. Two of the nodes the agent needed were refused by the tool that writes the graphs, so it changed approach and fed the numbers straight to the meshes instead. Everything was saved by three.
The test started at twenty past. U on the tray: "You light the sheet. The flames leap up." Thirteen game minutes later the coals were at full glow with grey ash between the lumps, which is what they were meant to do. The first fish off the line was a 35.5 cm brown trout, and the BBQ refused it: "Too big for a disposable BBQ. That one's for selling." The agent bagged it, cast again and landed a 29.1 cm perch, which went on the grill on its side. Ten game minutes later the numbers said it was cooked.

The body was as green as when it came out of the water. Thirty minutes on, by the numbers, it was charred. The fins were.
The cause was older than the BBQ. The fish meshes in this project are wound inside out, which is why the fish's own material had been drawn from both sides of every face all along. The cooking overlay was drawn from one. From the camera's side the body was showing the back of every face, so the engine skipped it, and the browning was being painted on surfaces that were never drawn. The fix was one setting on the overlay - two-sided, to match the material underneath it - and the build script now sets it and checks it, so a rebuild cannot quietly undo it.

The same test turned up a second fault, and it was nastier because it was invisible. After a strike, the lighter was gone. The test loadout put seven things in a pocket that holds six - a holdall in the list does not make the pocket bigger, only picking a holdall up does - and the BBQ spends a strike by dropping the lighter and picking it straight back up with one strike fewer. On an overfilled pocket the drop leaves it still full, the pick-up is refused, and the lighter is not anywhere. The BBQ is behaving correctly. The loadout is the fault, and it lives with another session's work, so it went on the bug list rather than getting patched from the riverbank. Every test since has raised the pocket to twelve by hand.
A cup of tea, a train and a vapour trail
The first marketing frame came at ten to five in the afternoon: a 26.4 cm perch browning on bright coals, the river gone gold behind it, the game clock fifteen minutes short of sunset.

The agent sent it with its own notes underneath. The coals were blown out to flat yellow blobs where they should read as red embers with dark gaps between, and the steam that was meant to be rising off the fish could not be seen at all. James asked for rising steam or smoke.
The steam was not hidden. It did not exist. The BBQ had borrowed the steam from the hot drinks, whose spawn rate is a setting the drink fills in for itself and which is zero until it does. The BBQ switched the effect on and never gave it a rate, so it produced nothing, every time, for as long as the tray was lit.
So the agent duplicated it into a proper smoke effect, gave it a box the size of the grill, and put it into play. The smoke came up as glass.

Every particle was still wearing the material for the vapour trails in the sky. It had come down a family tree: the train's exhaust had been copied from the contrail, the cigarette smoke from the train, the tea steam from the cigarette, and the BBQ from the tea. A material made for a line of cloud ten kilometres up was being drawn twenty centimetres above a perch. Rockstar have an effects department. This smoke started life as a cup of tea.
The agent built a smoke material of its own, a soft round puff with a bit of noise in it. The first version would not compile. It had taken the transparency from the particle colour, and the particle colour's default output carries red, green and blue and nothing else; the transparency is a separate output with its own name. Once it read the right one, a transparency of 0.16 was invisible and 0.45 gave a soft warm haze off the coals. Then a browned fish went on, and the fish added smoke of its own on top of the coals' - 33 puffs a second in total. It was a fog bank.

James was watching while that test ran and said "that looked really good." He did not say which of the two looks he meant. The agent wrote that down as unanswered, cut the fish's share of the smoke by more than half, and asked before going any further. At a quarter past nine the answer came: thinner, a wisp, and a side-on camera so the fish read as a fish rather than a blob coming at the lens.
The last test of the day ran just before ten at night. A 98 cm salmon was refused, then a 39.7 cm perch, then a 28.2 cm perch went on the grill.

The agent's notes on that one: the perch's lower fins poke down through the grill bars, because a fish on its side has fins below the line of its body. The smoke is still a veil at the fish. James is to judge it.
A second of silence
Earlier in the day James had reported something from a playtest: in the snooker hall, the end of a track would sometimes play again before the music moved on to the next one. He wanted a second's pause and then the next track.
The cause was a disagreement between two clocks. The music manager decides when a track has finished by timing it on the game clock. The sound itself plays in real time. When the game hitches, the game clock is held back for that frame and real time is not, so the sound finishes first. The speaker in the hall checks every fraction of a second whether it should be playing, and a track that had finished looked exactly like a track the player had walked back into earshot of. So it started it again, from where the game clock said it should be, which was the last few seconds - and replayed them until the manager's timer caught up. Sometimes meant the tracks a hitch had landed in.
The function doing the checking held 188 nodes, and 32 of them did anything. The other 156 were six stacked copies of the same body, left by earlier runs of a builder that appends to a graph instead of replacing it. The agent deleted them, then added a gate: a track is never restarted within eight seconds of its end, a new track always plays, and walking back into earshot mid-song still picks it up. The manager got a new gap setting, one second, so a finished track is followed by a breath of silence and then the next one from the top.
James then said he thought he had heard the same thing in the Slag & Slurry and in the nightclub. He had. The checking function had been copied into every music player in the game - the shop radios, the car radio, the pub's main speaker and its speakers on each floor - so every one of them had it. The gate went into each, and the one-second gap went onto all six station managers and the pub. Every change was found in the saved files afterwards. Hearing it during play is next.
The BBQ runs off the game clock on purpose. The music had been running off it by accident.
A bit black over Bill's mother's
Two days earlier the sky had grown white outlines round every roofline in a storm, and the fix had been a switch: once rain passes a small threshold, the fog is allowed into the sky and the outlines go. On Wednesday James reported white outlines round the telegraph poles, against darker grey cloud, in dry weather.
The build-up to a storm in this game is heavy grey cloud with no rain in it yet, and in that weather the switch is off. The agent went into the engine's own source for the cause. Unreal Engine 5.8 changed the default of one setting, r.VolumetricCloud.ApplyFogLate, from 0 to 1. Late fog works out how far away the cloud is once per pixel, as an average of four smaller samples, and an empty sample counts as 65,504 kilometres away. Along the edge of a pole, or along the thin edge of a cloud, even a tiny share of an empty sample drags the average past the 30 km point where this game stops fogging the sky. That rim gets no fog at all and shows up as a bright line. In rain the cut-off is zero, so a huge distance just means fully fogged and nothing shows. The rain switch had been hiding it, which is why it had looked like a storm problem.
The agent noted that the scene-capture camera it normally takes test frames with cannot show this fault at all, because late fog needs a real view with its own history of previous frames. So the before and after were taken in the level viewport.

James saw it fixed in play the same day: the white edges on the telegraph lines were gone. It is one line in a config file, and with late fog off the cloud pass also does slightly less work.
The fault
A cooking overlay material browns only the fins of a skeletal mesh in Unreal Engine 5.8
A modulate overlay material on a skeletal mesh fish drove brown and char from a cook value. The value climbed correctly and the readback agreed. On screen only the fins and tail changed colour; the body stayed raw. The fish meshes are wound inside out, so the base material M_Fish is two-sided. The overlay was one-sided, and the body's faces were back-face culled for the overlay pass.
The fix
Make the overlay two-sided whenever the base material is
Set two_sided = True on the overlay material and recompile once. The whole fish browned and charred in the next test. The guard: the script that builds the BBQ materials now sets it and its verify step fails if it is off. Any overlay meant for a mesh whose own material is two-sided needs the same flag.
The fault
Duplicated Niagara steam activates but spawns zero particles
A Niagara system borrowed from a hot drink was activated by the BBQ and never produced a particle. Its User.TrailSpawnRate defaults to 0 because the drink sets it at runtime. Activating the component does not set it.
The fault
Niagara smoke renders as hard-edged vertical glass sheets after duplicating a system
A duplicated smoke system drew flat, hard-edged panels instead of puffs. The sprite renderer still used M_Contrail, the sky's vapour-trail material, inherited through three earlier duplicates. A first replacement material failed to compile ("Failed to compile Material", 0 instructions) because it masked alpha off ParticleColor's default output, which is RGB only.
The fix
Give the sprite renderer its own smoke material, read alpha from the named A output
New translucent material: soft round falloff times value noise, opacity from ParticleColor's separately named A output. Sprite alpha 0.45. Spawn rate set every second from the BBQ: 8 times the coal glow plus the fish's share. The fish multipliers for cook and char were cut from 22 and 20 to 2.25 and 3.25 after the first version made a fog bank at 33 puffs a second. The guard: after duplicating any Niagara system, check the renderer's material and every User parameter default before judging the look.
The fault
Venue music replays the last seconds of a track before the next one starts in Unreal Engine 5.8
The music manager ends each track with a timer on game time; the audio plays in real time. After a hitch the audio finishes first. The speaker's sync function restarted the same track whenever it was not playing, at the game-time offset, so it replayed the tail until the timer fired. The function had been copied into every music player class, and one copy held 188 nodes of which 32 were live (six stacked copies from a builder that appends).
The fix
Never restart a track within 8 s of its end, and add a 1 s gap between tracks
A gate before SetSound: resume only if it is a new track, or if more than 8 s of the current track remain. A new instance-editable TrackGap float on the manager, added to the next-segment timer: CDO 0.0, set to 1.0 on all six station managers and the pub. 156 orphaned nodes deleted. Built and confirmed in the saved assets; not yet heard in play.
The fault
White outline round telegraph poles and wires against grey volumetric cloud in Unreal Engine 5.8
Thin bright lines along cloud edges and round poles and wires, in dry weather with heavy grey cloud. UE 5.8 changed r.VolumetricCloud.ApplyFogLate to default 1. Late fog fogs the cloud at one averaged depth per pixel, and an empty cloud texel's depth is 65,504 km, so silhouette and thin-cloud edges average past a finite height fog FogCutoffDistance (30 km here) and get no fog. Hidden whenever the cut-off is 0. A SceneCapture2D cannot reproduce it; use a real viewport.
The fix
Set r.VolumetricCloud.ApplyFogLate=0 in DefaultEngine.ini
Under [SystemSettings], which restores the 5.7 behaviour of fogging each traced sample at its own depth. No Blueprint or asset changed. Confirmed by a before-and-after in the level viewport and by James in play. Late fog is only required when the clouds are set to render on async compute, which this project does not do.
The kit
| Tool | Why this one |
|---|---|
| Claude Code Opus 5.5 | ran several sessions at once on the BBQ, the music and the sky, sharing one editor |
| Monolith MCP | Niagara duplication, Python in the editor, and driving play tests |
| Two test drivers | one lights the BBQ and steps the game clock, the other catches a fish without a human on the rod |
| A placed cine camera | the low riverbank angle and the side-on shot, from inside the working game |
| Unreal Engine 5.8 source | the only place the late fog cause could be read rather than guessed |
Plain English
| Term | What it means |
|---|---|
| PIE | "Play In Editor" - pressing play inside the editor to test the game without building it first. Fast, and it behaves subtly differently from the real build. |
| overlay material | A second material drawn over the top of an object's normal one - here, the browning painted over a fish as it cooks. |
| two-sided material | A material set to be drawn from both sides of every surface instead of only the front. |
| back-face culling | Not drawing the back of a surface. It halves the work, and it is why a surface that faces the wrong way can be invisible from where you are standing. |
| face winding | The order the corners of a triangle are listed in. That order is what decides which way the face points, so a model built with its corners listed the wrong way round comes out inside out. |
| Niagara | Unreal's particle system - rain, smoke, sparks, dust, fizz on a pint. |
| translucent | A material the engine blends over whatever is behind it instead of drawing solid. How glass, water and ghosts are done; how bright it looks depends on what is behind it as much as on itself. |
| game time | The clock inside the game, which can be paused, sped up or skipped, as opposed to the real time on the wall. Sound plays in real time, so the two can drift apart. |
| volumetric cloud | Clouds built as a real 3D volume the sun shines through, rather than a picture painted on the sky. They cast shadows on the ground, which is what makes a storm dark - and, left alone, too dark. |
| height fog | Unreal's ground-hugging haze, thick near the ground and thinning with altitude. It sells distance and weather, and if nothing stops it, it tints the sky as well. |
| console variable | A named engine setting that can be changed while the game runs, by typing it into the console, or fixed in a config file. |
| collision hull | The invisible simplified shape used for bumping into things. It is not the shape you can see, which is why invisible walls happen. |
Things we still need to fix tomorrow:
- Seed the playtest loadout's pocket at 12 when it carries a holdall, so a BBQ strike stops deleting the lighter.
- The perch's lower fins poke down through the grill bars.
- Darker coals, red embers with black between them, in place of the yellow-white blobs at sunset.
- James picks the smoke density from the side-on shot; then flames, as the final art pass.
- Eat the fish with C.
- Hear the one-second gap between tracks in the snooker hall, the pub and the nightclub during play.
- Two of eight pieces of bin-lorry spill land behind the hopper and drop onto the road.