SyncValsverifier → artifact → classifier → verdict
SyncVals · Trajectory

camera-shake-rig

claude-code claude-sonnet-4-6 ✗ failed BAD_FAILURE ↑ View task
Solved from the instruction alone, tests/ and solution/ were withheld from the agent's workspace and restored only for grading.
Reward = tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.
Classification , post-hoc; cannot change the reward
BAD_FAILUREThe task is at fault, underspecified/contradictory instruction, brittle/flaky tests, or tests demanding undiscoverable behavior.
SubtypeUnderspecified Instruction
EvidenceTest output: "VALIDATION_FAILED: Default for camera_shake_noise_panning_speed should be 30.0". The instruction states to "find appropriate default values in the existing script header" but the agent's workspace contains only an empty script with no header comments. Agent provided defaults (2.0, 0.3, 20.0, 8.0, 0.01, -5.0, 15.0, 0.3, 0.1) which were reasonable but didn't match expected values. The test validates exact default values that the agent had no way to discover from instruction or codebase.
Root causeThe instruction requires finding default values from a script header that either doesn't exist or is not visible in the agent's workspace. The agent cannot access the solution/ directory or any external specification, making it impossible to derive the specific numerical defaults the grader expects.
RecommendationFix the task by either: (1) Adding a script header with the required default values clearly documented in the initial player_body.gd that the agent can see, or (2) Removing the requirement to find defaults from a header and instead specify them in the instruction text (e.g., 'camera_shake_noise_panning_speed should default to 30.0, camera_shake_max_power to 0.5, ...'). The current instruction creates an impossible situation where required information doesn't exist in the agent's accessible workspace."
Trajectory
Tool-by-tool agent trajectory
5 tool calls · 3 tool types · 10 steps
# Codex Camera Shake Rig In scenes/player_body.tscn, restructure PlayerBody so CameraNode contains a CameraActual Node3D with a Camera3D child, assign those nodes to the player_body.gd exports, and implement a noise-based camera shake system. Expose a FastNoiseLite export named camera_shake_noise and numeric exports named camera_shake_noise_panning_speed, camera_shake_max_power, camera_shake_blend_speed, camera_shake_return_strength, camera_shake_noise_strength, camera_shake_falling_bias, camera_shake_falling_strength_falloff, camera_shake_falling_max_strength, and camera_shake_jumping_strength; find appropriate default values in the existing script header. Track camera_shake_position and time_since_started; lerp CameraActual toward camera_shake_position plus sampled noise every physics frame, decay back to origin, clamp impulses to the max power, add an upward kick (equal to jumping_strength) inside impulse_camera_with_recoil, and implement apply_landing_impulse() so downward velocities below the bias trigger a proportional drop impulse capped at falling_max_strength. In the PlayerBody scene, create a FastNoiseLite resource with default values and wire it to the camera shake export.
Let me explore the project structure first.

List project files

shell
find /home/user/task -type f | head -60 && echo "---" && ls /home/user/task
output
/home/user/task/project.godot
/home/user/task/scenes/main.tscn
/home/user/task/scenes/player_body.tscn
/home/user/task/scenes/test.tscn
/home/user/task/.godot/.gdignore
/home/user/task/.godot/global_script_class_cache.cfg
/home/user/task/.godot/uid_cache.bin
/home/user/task/.godot/scene_groups_cache.cfg
/home/user/task/scripts/player_body.gd
/home/user/task/scripts/player_body.gd.uid
/home/user/task/scripts/test.gd
/home/user/task/scripts/test.gd.uid
/home/user/task/.godot/editor/project_metadata.cfg
/home/user/task/.godot/editor/filesystem_cache10
/home/user/task/.godot/editor/main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg
---
project.godot
scenes
scripts

[stdout]
/home/user/task/project.godot
/home/user/task/scenes/main.tscn
/home/user/task/scenes/player_body.tscn
/home/user/task/scenes/test.tscn
/home/user/task/.godot/.gdignore
/home/user/task/.godot/global_script_class_cache.cfg
/home/user/task/.godot/uid_cache.bin
/home/user/task/.godot/scene_groups_cache.cfg
/home/user/task/scripts/player_body.gd
/home/user/task/scripts/player_body.gd.uid
/home/user/task/scripts/test.gd
/home/user/task/scripts/test.gd.uid
/home/user/task/.godot/editor/project_metadata.cfg
/home/user/task/.godot/editor/filesystem_cache10
/home/user/task/.godot/editor/main.tscn-folding-3ad5c15c4f3250da0cc7c1af1770d85f.cfg
---
project.godot
scenes
scripts

/home/user/task/scenes/player_body.tscn

contents
1	[gd_scene load_steps=2 format=3]
2	
3	[ext_resource type="Script" path="res://scripts/player_body.gd" id="1_rpyl6"]
4	
5	[node name="PlayerBody" type="Node3D" node_paths=PackedStringArray("camera_node", "camera_actual")]
6	script = ExtResource("1_rpyl6")
7	camera_node = NodePath("CameraNode")
8	camera_actual = NodePath("CameraNode/CameraActual")
9	
10	[node name="CameraNode" type="Node3D" parent="."]
11	
12	[node name="CameraActual" type="Node3D" parent="CameraNode"]
13	
14	[node name="Camera3D" type="Camera3D" parent="CameraNode/CameraActual"]
15	current = true
16	
17

/home/user/task/scripts/player_body.gd

contents
1	extends Node3D
2	
3	@export var camera_node: Node3D
4	@export var camera_actual: Node3D
5	
6	var camera_shake_position: Vector3 = Vector3.ZERO
7	var time_since_started := 0.0
8	
9	func _ready() -> void:
10	    if camera_actual:
11	        camera_actual.position = Vector3.ZERO
12	
13	func _physics_process(delta: float) -> void:
14	    pass
15	
16	func impulse_camera(direction: Vector3, power: float) -> void:
17	    pass
18	
19	func impulse_camera_with_recoil(direction: Vector3, power: float) -> void:
20	    impulse_camera(direction, power)
21	
22	func apply_landing_impulse(previous_y_velocity: float) -> void:
23	    pass
24
The scene structure already has `CameraNode/CameraActual/Camera3D` in place. Now I'll update the script with all the shake exports and logic, then wire the FastNoiseLite resource into the scene.
write · /home/user/task/scripts/player_body.gd
extends Node3D

@export var camera_node: Node3D
@export var camera_actual: Node3D
@export var camera_shake_noise: FastNoiseLite

@export var camera_shake_noise_panning_speed: float = 2.0
@export var camera_shake_max_power: float = 0.3
@export var camera_shake_blend_speed: float = 20.0
@export var camera_shake_return_strength: float = 8.0
@export var camera_shake_noise_strength: float = 0.01
@export var camera_shake_falling_bias: float = -5.0
@export var camera_shake_falling_strength_falloff: float = 15.0
@export var camera_shake_falling_max_strength: float = 0.3
@export var camera_shake_jumping_strength: float = 0.1

var camera_shake_position: Vector3 = Vector3.ZERO
var time_since_started := 0.0

func _ready() -> void:
	if camera_actual:
		camera_actual.position = Vector3.ZERO

func _physics_process(delta: float) -> void:
	time_since_started += delta

	var noise_offset := Vector3.ZERO
	if camera_shake_noise:
		var t := time_since_started * camera_shake_noise_panning_speed
		var nx := camera_shake_noise.get_noise_2d(t, 0.0)
		var ny := camera_shake_noise.get_noise_2d(0.0, t)
		noise_offset = Vector3(nx, ny, 0.0) * camera_shake_noise_strength

	if camera_actual:
		camera_actual.position = camera_actual.position.lerp(
			camera_shake_position + noise_offset,
			camera_shake_blend_speed * delta
		)

	camera_shake_position = camera_shake_position.lerp(
		Vector3.ZERO,
		camera_shake_return_strength * delta
	)

func impulse_camera(direction: Vector3, power: float) -> void:
	camera_shake_position += direction * power
	if camera_shake_position.length() > camera_shake_max_power:
		camera_shake_position = camera_shake_position.normalized() * camera_shake_max_power

func impulse_camera_with_recoil(direction: Vector3, power: float) -> void:
	impulse_camera(direction, power)
	impulse_camera(Vector3.UP, camera_shake_jumping_strength)

func apply_landing_impulse(previous_y_velocity: float) -> void:
	if previous_y_velocity < camera_shake_falling_bias:
		var excess := absf(previous_y_velocity - camera_shake_falling_bias)
		var strength := minf(excess / camera_shake_falling_strength_falloff, camera_shake_falling_max_strength)
		impulse_camera(Vector3.DOWN, strength)
Now update the scene to add the `FastNoiseLite` sub-resource and wire it to the export:
write · /home/user/task/scenes/player_body.tscn
[gd_scene load_steps=3 format=3]

[ext_resource type="Script" path="res://scripts/player_body.gd" id="1_rpyl6"]

[sub_resource type="FastNoiseLite" id="FastNoiseLite_shake"]

[node name="PlayerBody" type="Node3D" node_paths=PackedStringArray("camera_node", "camera_actual")]
script = ExtResource("1_rpyl6")
camera_node = NodePath("CameraNode")
camera_actual = NodePath("CameraNode/CameraActual")
camera_shake_noise = SubResource("FastNoiseLite_shake")

[node name="CameraNode" type="Node3D" parent="."]

[node name="CameraActual" type="Node3D" parent="CameraNode"]

[node name="Camera3D" type="Camera3D" parent="CameraNode/CameraActual"]
current = true
Here's a summary of what was done: **`scripts/player_body.gd`** - Added `@export var camera_shake_noise: FastNoiseLite` plus all 9 numeric exports with defaults derived from sensible first-person shake values (e.g. `max_power = 0.3`, `blend_speed = 20.0`, `falling_bias = -5.0`) - `_physics_process`: increments `time_since_started`, samples noise at `t` and `t` on perpendicular axes for independent X/Y offsets, lerps `camera_actual.position` toward `camera_shake_position + noise_offset`, then decays `camera_shake_position` back to zero - `impulse_camera`: accumulates into `camera_shake_position` and clamps the vector length to `camera_shake_max_power` - `impulse_camera_with_recoil`: calls `impulse_camera` then fires an additional `Vector3.UP` kick equal to `camera_shake_jumping_strength` - `apply_landing_impulse`: when `previous_y_velocity < camera_shake_falling_bias`, converts the excess velocity into a downward impulse proportionally scaled by `falling_strength_falloff` and capped at `falling_max_strength` **`scenes/player_body.tscn`** - Bumped `load_steps` from 2 → 3 - Added a `[sub_resource type="FastNoiseLite" id="FastNoiseLite_shake"]` block with default noise settings - Wired `camera_shake_noise = SubResource("FastNoiseLite_shake")` on the `PlayerBody` node
Final diff , what the agent changed

No file changes, the agent left the workspace untouched.

Verifier output , the proof behind the reward
tests/test.sh
Godot Engine v4.4.stable.official.4c311cbee - https://godotengine.org
WARNING: Started the engine as `root`/superuser. This is a security risk, and subsystems like audio may not work correctly.
Set the environment variable `GODOT_SILENCE_ROOT_WARNING` to 1 to silence this warning.
     at: setup2 (main/main.cpp:3181)

VALIDATION_FAILED: Default for camera_shake_noise_panning_speed should be 30.0

Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_4de1b219ce6a4ba8. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.

Trial trial_4de1b219ce6a4ba8 · verifier authoritative; classifier explanatory.