One Metre Past the Hook
A college day
It was Tuesday, a college day, and the clock that mattered was not the one on the wall. James's allowance of agent time reset at ten on Wednesday morning, and whatever was left of it by then was simply gone. So he spent the day handing the agent jobs from his breaks, on his phone, and it carried on at the machine at home while he was in a classroom.
He got to the gym at lunch for a thirty-minute run. Then he checked his phone and there were four screenshots of a fish waiting for him.
X was full of GTA 6 that day. The newest batch of screenshots had landed and everyone had an opinion on them. James read the posts on the way in and came away wanting more of the things his own game has that a Los Angeles game would never think to put in: the weather, the wildlife, and the small, specific bits of British life. Top of that list was the riverbank. In Second Chance you can take a rod down to the river, bait up with maggots, catch a perch, and keep it. His line on it, written into the plan the week before, was that the player would not have to catch and release like in GTA 6. They would cook it and eat it.
At the start of the day, a fish could be hooked but not landed.
The fight nobody could win
Claude Code Opus 5.5, the agent, set up the test that morning. The fishing loop had been built in stages over a month - the cast, the float on the water, real fish swimming up to the bait under their own steam, the bite, the strike - and the next thing on the list was the last few seconds: the fish coming out of the water and into your hand, flapping. James had asked for exactly that, and for the hooked fish to be visible on the line while you played it.
The agent built the landing, started the game in the editor, cast, and waited. A perch took the bait within seconds. The agent struck, and the line snapped. It tried again. Snapped. On the third go it did not touch the reel at all, and the line still went, about seven seconds in.
It stopped there and reported it rather than fiddling. The fault was in the fight, not in the landing. A hooked fish starts with a certain amount of strain on the line, and each time it makes a run it adds more, for up to two and a half seconds. The agent did the sum: the starting strain plus one long run came to 1.36, and the line breaks at 1.0. One bad run on the very first pull and the fish was gone before the player could do anything about it.
James's answer came back from college in seven words: ease the fight so it's winnable.
What the agent did next was the better half of the day. It did not tune the numbers in the game, where every test is a minute of waiting for a bite. It wrote a small program outside the engine that copied the fight's five Blueprint functions line for line, played two thousand fights at thirty and at sixty frames a second, and gave the pretend player a third of a second's reaction time. Then it checked that the model broke the same way the game did. It did. Leaving the reel alone snapped the line 98 times in a hundred. A player who only reeled in during the lulls landed the fish one time in six, and only by dragging it in before its first run.
Only then did it search for new numbers. It settled on five: reel a bit slower, let the strain build at half the rate during a run and drain off twice as fast afterwards, and cut the longest run from 2.4 seconds to two. With those, a player who reels steadily in the lulls lands the fish 99.7 times in a hundred, in about fifteen seconds. Somebody who winds furiously straight through a run still snaps it four times in ten. Do nothing and the fish never comes in, but the line almost never breaks either. It just sits there, pulling.
The new numbers were written into the pawn's defaults at a quarter past two. No graph was touched.
Through the rod
The next run went better and looked worse.
The line held. The perch came up out of the water, and then it slid up the rod. It went up the rod like a bead on a wire and stopped with the cork handle running straight through its middle.

James was watching. He said the fish looked good but it should not slide up the rod, and then, a few seconds later, that it was now pierced by the rod. The agent had put the fish in the hand that holds the rod.
He did not want the fish moved a few centimetres. He wanted it done properly. When you reel in, he said, the rod is pulled back, and the line brings the fish towards you with gravity doing the work, and the rod bends under the weight of the fish as you bring it upright. He had the agent pull up reference photographs in Chrome of anglers landing small fish. They all showed the same thing: the rod near vertical, the fish hanging head-up on a short line straight under the tip, then taken in the other hand, well clear of the rod.
So the agent modelled that too, offline first. The rod comes up to near upright over about a second. The line winds in to a couple of metres. The fish's mouth is treated as a weight on the end of a rope - gravity, a bit of drag, a line that can pull but never push - and the rod tip bends by an amount set by the size of the fish and the strain on the line. When the fish swings within reach, the left hand takes it. The whole thing lasts about a second and a half.

Along the way James added one more line, almost in passing: a fish is normally hooked by its mouth. Until then the float had stayed on the line all through the fight. Now, at the strike, the float gets dragged under and hidden, the bare hook sits in the fish's mouth for the whole fight and the landing, and it only comes out when you put the fish in your bag.
The first salmon through the new landing was 58 centimetres long. It hung head-up, swung in, and ended up in the left hand, the right way up, with its tail touching the reel. The agent wrote the fix the same afternoon: the bigger the fish, the further out the hand. A perch fits either way.
A metre past the hook
The last fault of the afternoon was a small one, and it took the agent two goes to find.
In the shots of the fish in the hand, the yellow line did not run to the fish's mouth. It came down from the rod tip, dropped past the fish, and bent into a V somewhere near the tail.

The agent read a zoomed crop of the frame and offered a leading explanation. The line is a cable component, a ready-made rope in Unreal that is simulated as a chain of points, and this one had only eight segments, four passes of the solver a frame, and no damping at all. The test had also snapped the camera, and the fish and hook attached to it, into place in a single frame just before the shot. So the rope was probably still swinging. A settle problem, not a geometry problem. It said so with some confidence, and marked it as not confirmed.
It was wrong, and it built the test that proved it wrong before changing anything. The probe printed every point on the rope in camera space, several seconds apart. The points were not moving. The rope had settled. It had settled a metre in the wrong place.
The cable component has a setting for where the rope ends, measured from the thing it is attached to. Its default is a metre along that thing's forward axis. The script that fixed the line to the hook, back on 11 September, attached it correctly and never set that value. So the line had always ended a metre past the hook. While the hook dangled ten centimetres off the rod tip, it did not show. With a fish in the hand, it did.
Set to zero, the last point of the line sat on the fish's mouth: nought centimetres off, with about twenty centimetres of natural sag. The agent sent James the before and after frames at about six in the evening.

His reply was that it looked really good. The landing was signed off. The same message had the next job in it: the disposable BBQ, and cooking the fish before you eat it.
Ready to cook
That work ran into the evening while he was on his way home, and past midnight.
The BBQ is the foil-tray kind that petrol stations sell, the kind nobody thinks about until the one sunny weekend in May. James wants them on sale at the petrol station, Boss Man's shop and the car boot sale. He also wanted a fold-out chair to go with it. You drop the chair from your bag on the riverbank and it opens facing the way you were looking. Sit in it and press Z, and your eyes close, the screen goes black, there are a couple of seconds of nothing and a snore, and when you come round five minutes of game time have gone.
That snooze is there for the cooking. A disposable BBQ takes a while to come to temperature, and nobody wants to stand and watch it in real time. So the BBQ does not run a clock of its own. It notes the game time when it was lit, and every time you look at it, it works out where it has got to from the game clock. Sleep in the chair and the coals catch up.
It was built and tested just after midnight. With a lighter in your bag, you press U on the tray and it lights; the lighter goes down by one strike, from twenty to nineteen. Checked straight away, the flames were still high. At seven minutes they were dying down, at thirteen it was ready to cook, at just over an hour it was fading, and at an hour and eighteen it was burnt out, and it stays that way. A disposable does not get lit twice.
Rockstar have departments for this kind of thing. James had a college day and a gym bag. It is also why a foil tray from the petrol station made it in: nobody had to be talked into it.
The fish itself is not on the grill yet. Laying a landed fish on the tray is the next step, then taking it off and eating it, and a refusal for anything too big for a disposable. C, for consume, went in the same morning, for the chippy's fried fish.
The allowance ran out at ten on Wednesday. Most of it had gone on a fish.
The fault
Every hooked fish snaps the line within 15 seconds, whatever the player does
Three fights in a row snapped in 7 to 15 seconds, one with no reeling at all. The hook adds a strain of 0.35 at the strike, and each run adds 0.42 per second for 0.9 to 2.4 seconds. 0.35 + 2.4 x 0.42 = 1.36, and the line breaks at 1.0, so the worst first run lost the fish before any input. First suspected as a fault in the new landing code. It was the fight balance from a month earlier.
The fix
Model the fight offline, reproduce the bug, then tune five numbers
A Python copy of the five fight functions, 2,000 fights at 30 and 60 fps with a 0.35 s reaction lag. It reproduced the game first (hands off: 98% snap; reeling only in lulls: 17% landed). A grid search then picked five pawn defaults: reel step 0.06 to 0.04, reel strain 0.085 to 0.04, run strain 0.42 to 0.20 per second, strain recovery 0.34 to 0.70, longest run 2.4 to 2.0 s. Result: 99.7% landed in lulls, median 15 s; reeling through runs 42% snap. Seeded onto the pawn's CDO with no graph edit.
The guard: the model must reproduce the old failure before any number from it is trusted, and it stays the source of truth for the tuning.
The fault
CableComponent line ends a metre past its end component in Unreal Engine 5.8
A cable whose end was attached to a hook component finished about 100 cm beyond the hook, along the hook's X axis, and hung in a V below the held fish. It went unnoticed for weeks while the hook sat close to the rod tip. The first diagnosis was an unsettled verlet rope (8 segments, 4 solver iterations, no damping, a camera snap one frame earlier). A probe printing every particle in camera space showed they did not move.
The fix
Set CableComponent EndLocation to zero, and refuse to save if it is not
EndLocation defaults to (100,0,0), relative to the end component. Set it to (0,0,0) on the component template, compile, save. The last particle then sits on the hook: 0.0 cm, with about 20 cm of sag.
The guard: the script that configures the line now sets EndLocation itself and refuses to save the Blueprint if it is anything but zero.
The kit
| Tool | Why this one |
|---|---|
| Claude Code Opus 5.5 | drove the editor all day from James's phone messages, and wrote both offline models |
| Two small Python models | the fight and the landing swing, tuned in seconds rather than in play |
| Monolith MCP | Blueprint edits and running the in-editor test driver |
| Chrome | reference photographs of anglers landing small fish |
| Play in the editor at 0.05x speed | the landing lasts 1.5 s, and each capture takes several seconds to request |
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. |
| Blueprint | Unreal's visual scripting. Logic built by wiring boxes together with lines instead of typing code. This whole game is built in it. |
| CDO | The template a Blueprint stamps out copies from. Editing the template does not always reach the copies already placed in the level, which is a classic silent failure. |
| cable component | Unreal's ready-made rope or line: a chain of points that sag and swing between two ends. Here it is the fishing line, from the rod tip to the hook. |
| verlet | A cheap way of simulating a rope by moving each point along a little and then pulling neighbours back to the right distance, a few times a frame. It wobbles before it settles, which makes it a tempting suspect for any line that looks wrong. |
| offline model | A small program run outside the game that copies the game's own sums line for line, so thousands of test cases take seconds instead of an evening of playing. It is only worth anything once it reproduces what the game already did. |
| relative location | A position measured from some other object rather than from the centre of the world. A setting of one metre "relative to the hook" means one metre from wherever the hook happens to be. |
Things we still need to fix tomorrow:
- E with a landed fish at a lit BBQ lays it on the grill; it cooks, then chars, off the game clock.
- Take it off and eat it with C, and refuse a fish too big for a disposable tray.
- The coals glow and the flames burn while it is lit; a spent tray when it is out.
- The fight fish sits about a metre under murky water and needs its back to break the surface.
- A salmon fights exactly like a perch. A fight per species is an idea, not yet agreed.
- Put the BBQ and chair on sale at the petrol station, Boss Man's shop and the car boot.
- The close-up of a fish cooking on the tray, once it really cooks.
- An old angler on the bank who explains fishing to a first-timer: James wants him later.