Leg Day
Saturday
Saturday, so the gym, and then the whole day on the game. The day's job turned out to be getting the town's residents to do the same.
The gym is upstairs in Radworth Leisure Centre. It has treadmills, rowers, squat racks, a leg press and a chest press, and forty-odd members drawn from the town's hundred residents: teens and adults, nobody over sixty, busiest before work and after it. Each member has the gym written into their week. A woman who trains on Tuesdays at ten to five is meant to walk out of her front door at the right time, cross town, go up the stairs, pick a free machine and use it.
On Thursday morning James had looked at the clips of them training and said what was wrong in one line: her hands were not gripping the bar. The agent, Claude Code Opus 5.5, had the fingers curled into a proper grip and both wrists locked onto one handle the same day, and the new clips were sitting on disk waiting for an editor slot. At four minutes past four on Saturday afternoon they went in, for the rower, the squat and the chest press, for both the men's and the women's bodies. In a test session the squat grip held.
Then it went to take the pictures. A gym full of people, at dusk, through the big windows. It waited. Nobody came.
The arcade
It had a resident to follow. Carly is a member, and her week had her at the gym that afternoon. The town's own log said where she actually went: Penny Drop Amusements, the arcade, playing the machines.
The agent's first account of this, written into the gym's handover at four o'clock, was confident and specific. The gym block in the residents' schedule pointed at the wrong building: the address it used resolved to place 17, the arcade side of the leisure centre, when the gym is place 37. Somebody else's code would have to fix it, the note said, and then the stills could be taken.
Twenty minutes later, working through the town's C++ itself, the agent took that back. The address was fine. The log line it had skipped over said in plain words that Carly's slot was "Leisure at Radworth Leisure Centre": place 37, the right building. The problem was what happened after the address was found.
In the town's code, "Gym" in a resident's week is not its own kind of activity. It is filed under Leisure, alongside swimming, netball and the arcade, and a Leisure slot is generic. When it starts, the code rolls a dice across every leisure activity the resident might fancy, weighted by their interests. A gym workout carries a weight of 0.08 before interest is counted. Then it keeps the building from the schedule only if the activity it rolled happens there. Carly rolled the arcade. The nearest arcade was place 17. Off she went.
So all two hundred and twenty-three gym slots in the town were a raffle, and the gym was a poor prize in it. The fix keeps the word "Gym" attached to the slot when the week is read in, and makes a Leisure slot whose word is Gym go straight to a workout at its own building, provided the building is a gym, it is open, and it is not the boxing club. Seven slots at the boxing club, which are bag work and pads, were left on the old roll on purpose.
Two points long
That would have got people into the building. A second fault was waiting on the stairs.
In the week's tests the members who did set off had a habit of giving up halfway. The log called it "stalled": the gym's code samples each walker every five seconds and releases anyone who has stopped making progress towards their machine. Every one of the four give-ups had happened indoors, on the ground floor, thirty-odd to forty-odd metres from a machine one floor up. Nobody had walked into a wall. Nobody was stuck in a door.
The progress check measured how much of the walker's path was left. The town moves its people with DetourCrowd, the part of Unreal that steers a crowd round itself, and DetourCrowd does not keep the route as a list of corners. It keeps two points: where you are and where you are going. So "path left" was the straight line through the ceiling to the machine upstairs. A woman walking the length of the ground floor to the far staircase was, by that measure, barely getting any closer, and after enough samples the code let her go.
The fix asks the navigation system for a fresh route every five seconds and measures that instead. A studio would have a team for crowds. This had a Saturday, and a ceiling the code thought you could walk through.
Masks off
At quarter to three James sent a ruling that had nothing to do with the gym. The roadmen - the eight lads in black tracksuits who come out after eleven at night and hang about the corner shop - wear their masks and gloves on the street. He wanted them off indoors. Nobody sits in a kebab shop in a balaclava.
The agent wrote it into the code that dresses them. Once a second, for each lad, it fires one line straight up from his chest, six metres, looking for a roof, and four outwards, ten metres, looking for walls. A roof and at least three walls means indoors, and the kit comes off and the hair goes back on, the same as when they go home. A bus shelter, a porch or a tree does not count, so a lad under one stays masked.
Its own review found two holes in that before it went anywhere. The lines it had chosen hit anything, including the other lads standing round him, so a group of four on the pavement could count each other as walls. They now only see the buildings and the ground. And one stray reading could flick a mask on and off, so a change now has to read the same three times running before it happens.
Two in the morning
The mushrooms had gone in overnight, before any of this. They are on the crime path: liberty caps in the fields, which the player can pick, eat, or sell on the street and to Simon, and fly agarics - the red ones with white spots - under the birches.
Both kinds were made offline and exported as OBJ files, and the first import put every mushroom in the game lying on its side. OBJ files usually treat Y as up; Unreal uses Z. The importer has a setting for exactly that rotation, and in this case it ignored it. The agent stopped asking it to and had the import scripts write an upright copy of each file first, then bring that in. All six meshes stood up.

Then it ate some, in a test session. The liberty caps worked: by sixty-seven minutes of game time the trip had reached 0.61 on its scale of nought to one, and the colours on screen were saturating and starting to glow. The fly agarics did not. A hundred and forty-six minutes after eating them the level in the player's blood was 1.1 and the effect was exactly 0.00.
The agent found the line. Every frame, the agaric code worked out the effect and then, while the level was still rising, set it back to zero. It would only ever have shown once the blood level began to fall, which in that test it had not. The fix is one line, written and waiting for the next build.
The stills came out of a separate run of the game on its own: a troop of agarics round a silver birch, a pair on a verge with the terrace behind them and the bin lorry in the street.


Parked in the road
At ten past seven in the evening James had another one. "We need to make sure cars are not parked blocking roads," he wrote. They should be outside the owner's house, he said, but not in a way that blocks anything.
The agent's model of the town, run without the editor, showed why they did. Each household's car was placed a fixed distance in from a line through the middle of the street, then treated as if it were on a driveway, so it was only ever set down on its wheels and never moved to the kerb. Where the line did not match the real road, the car ended up in the lane: one on Thornyholt Boulevard sat 1.3 metres from the centre line. Nothing stopped a corner house parking on its corner either - one on Tannery Court was two and a half metres from the junction - and a second car in a household was just stepped five and a half metres along the kerb, wherever that landed.
The fix is one finder for a legal spot, used by every car in town, and it reads like the Highway Code because it was written from it. At the kerb, never out in the lane. Never on a roundabout, the ring road or the one-way loop. Ten metres from any junction, fifteen from a bus stop or a puffin crossing, a car length and a metre from the next car. And never directly opposite another parked car, so the bus and the bin lorry still have a gap to squeeze through. A garden gate is only a cost, because a terrace has a door every five metres; the nearest legal spot to the owner's front door wins. When the town loads, a warden pass tidies whatever is already parked.
The still GIF
At twenty-three minutes past twelve the account posted its first animated GIF, a short loop of Sebastian behind the bar. James saw it on X and it was a still picture.
The GIF itself was fine: sixty-three frames, looping, and X had even filed it as a GIF and drawn a thumbnail. But the video X makes from a GIF so it can play did not exist. The poster had used the simple one-request upload, which returns as soon as the file is received, and then published the post at once. Nothing waited for X to finish converting it.
By quarter past six the poster used the long way round for every GIF: upload it in chunks, say it is finished, then ask X every few seconds whether the conversion has finished, for up to two minutes, and never post if it has not. It went live properly at three minutes past eleven that night with a fresh copy of the post, and the video behind it answered. James confirmed it played.
Ten past two
In the early hours of Sunday the builds went in, unattended, under the standing approvals James wrote into the project's rules on Tuesday. Seven of them in sixteen minutes, from six minutes to two to ten past: the gym fixes and the roadmen's masks; lorry avoidance for cyclists and walkers; residents' chat lines in their own recorded voices; phone calls; the parking; a voice for the hotel bar when it refuses to serve you; and residents' own written lines. Each built first time.
The agent opened the editor at eleven past two and loaded the town once, which took until nearly half past. It set the clock to Tuesday, twenty to five in the afternoon, and let it run.
At seventeen minutes to three the log had three gym slots firing. One member on a rower, another on a rower, a third on a squat rack. The agent moved the player to the leisure centre and looked through the window.

The voiced chat found eighty-six lines with a recording. The phone calls connected. The parking tidy checked sixty-one cars and moved twenty-nine of them, in an eighth of a second.
One member gave up. Carly again, ninety-two metres short of the gym, released as stalled. This time the agent checked whether she had actually been walking. She had not. She had been standing completely still on the same spot for minutes, and earlier in the run the log had recorded four hundred and sixty-nine failed attempts to find a path to her own home. A different fault, and a long one. Later in the session she was respawned at the gym anyway.
The argument for Second Chance set against GTA VI is not the size of the map. It is that the woman on the squat rack is there because her week says Tuesday, ten to five, gym, and that she will be at work in the morning. That only works if the town can get her there. The editor was closed at eleven minutes to three, with nothing left unsaved.
The fault
Residents scheduled for the gym go to the amusement arcade instead (Unreal Engine 5.8, NPC schedules)
A resident's week said "Gym" at Radworth Leisure Centre; the log showed her at the arcade. First guess: the schedule's address resolved to the wrong building. Wrong - the address resolved correctly. "Gym" mapped to a generic Leisure activity, and a Leisure slot rolls a weighted dice over every leisure activity, keeping the scheduled building only if the rolled activity happens there. The workout's weight was 0.08 before interests. She rolled the arcade, and the nearest arcade won.
The fix
Keep the word, and honour it before the dice
The schedule loader keeps "Gym" attached to the slot. On start, a Leisure slot whose word is Gym goes straight to a workout at the slot's own building, if it is a gym, open, and not the boxing club; anything else falls through to the old roll. Behind a console variable (0 = old behaviour) and one log line per resident. Built; three members headed for machines in the next test, and one was photographed on the squat rack.
The fault
NPC gives up walking to an upstairs machine: "gave up .. stalled" with DetourCrowd (Unreal Engine 5.8)
A progress timeout sampled each walker every 5 s using the path's remaining length from the current path index. Bodies moved by DetourCrowd keep only start and end points (crowd following skips string pulling), and the index never advances, so "remaining" was the straight-line distance to a machine one floor up. Walkers heading along the ground floor to the far stair appeared not to be closing in. All four give-ups were on the ground floor, 34-47 m out.
The fix
Measure a fresh path, not the crowd's path
Each 5 s sample now runs a synchronous navigation query from the walker to the machine's approach spot and uses that length. Behind a console variable. Guard: never measure progress from a crowd-following path's points.
The fault
Fly agaric high never starts: the effect stays at 0.00 while the blood level rises (Unreal Engine 5.8, C++ tick)
After eating, blood level 1.1 and effect 0.00 at 146 game minutes. The tick computed the effect, then zeroed it on every frame where the level was still rising.
The fix
One line, staged
What we found is a one-line change that stops the reset; it is staged for the next build and not yet seen working. The other species (liberty caps) reached 0.61 in the same test.
The fault
Animated GIF posted through the X API shows as a still image
The post went out with the GIF filed as a GIF and a thumbnail, but the MP4 X generates from it returned 404. The single-request media upload returns before X has transcoded the file, and the post was published straight away.
The fix
Chunked upload, and wait for "succeeded"
Every GIF now uses the chunked upload (initialise, append, finalise), then polls the upload status until it succeeds, for up to 120 s. Any other outcome marks the post failed rather than posting it. Proven with an upload-only test route first, then live.
The kit
| Tool | Why this one |
|---|---|
| Claude Code, unattended | seven numbered builds and one test session between 01:54 and 02:49, under James's standing approvals |
| Offline staging with checksums | every change was prepared and checked against the live files with the editor shut, so the build window was sixteen minutes |
| The town's own log lines | "Leisure at Radworth Leisure Centre" was the line that disproved the first diagnosis |
Plain English
| Term | What it means |
|---|---|
| DetourCrowd | Unreal's system for moving a crowd of characters so they steer round each other; its route is kept as just a start and an end point, so code that measures "distance left along the path" from it gets the straight-line distance instead. |
| navmesh | An invisible map of walkable ground that characters use to work out routes. No navmesh, no walking. |
| roster block | One slot in a resident's written-out week - where he should be from 23:25 to 23:45, say - which the town's code keeps steering him back to. |
| tick | Code that runs every single frame. Cheap once, ruinous sixty times a second across a thousand actors. |
| 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. |
| debounce | Waiting for a reading to stay the same for a moment before acting on it, so one freak reading - a lightning flash - does not flick a lamp off and on. |
| trace | Firing an invisible line into the world to find out what it hits - used for "what is under this object" and "what is the player looking at". |
| up axis | Which direction a 3D file treats as "up". Unreal uses Z; many other tools write Y, and a Y-up model brought in unconverted lies on its side. |
| transcode | Converting a video or animation into another format after upload; a site that transcodes needs a moment before the converted file exists. |
| chunked upload | Sending a big file to a web service in pieces and then asking it whether it has finished processing, instead of one request that returns before the file is ready. |
| gap build | One numbered, self-contained batch of C++ changes to the town's code, prepared and checked offline, then compiled into the game in a single build that backs itself up and undoes itself if it fails. |
| 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. |
| standalone | Running the game on its own with the editor closed, the way a player would. The only honest place to measure frame rate, because the editor eats memory and processor time of its own. |
Things we still need to fix tomorrow:
- Find out why Carly cannot find a path to her own home, and stands still when she cannot.
- Take the gym stills: a half-hour run of the game at High, with members on the machines.
- Build the fly agaric fix and see the high start.
- See the roadmen's masks come off inside the kebab shop at night.
- Residents' written stories: the settings row and the import, then hear them.
- The hotel bar's refusal voice waits for the bar itself to use it.