Files
settled-reach/docs/test-reports/sprint-11-combine-final.md
T
jpmschweitzerandClaude Opus 4.6 9d2ab53302 docs(docs): add frontmatter to test plans, test reports, and audits
Standardized YAML frontmatter on 7 files across docs/test-plans/,
docs/test-reports/, and docs/audits/.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 18:55:30 +01:00

10 KiB

title, description, type, status, ticket, created, updated
title description type status ticket created updated
Sprint 11 Combine Final Report Final QA test report for Sprint 11 covering #522 (OQ-07 no-insert interaction) and #507 (WRONG button ring buffer). Both approved with 2 bugs found and fixed during QA. All sprint-specific tests pass. test-report archived #507, #522 2026-02-19 2026-02-19

Test Report: Sprint 11 — Combine (#522 + #507)

  • Date: 2026-02-19
  • Build: working tree (uncommitted, sprint-11 changes)
  • Branch: client
  • Spec references: D-056, D-057, OQ-07, D-030, D-020
  • Tickets: #522 (OQ-07 no-insert interaction), #507 (WRONG button ring buffer)
  • Reviewer: Hoshe (QA Engineer)
  • Status: FINAL — APPROVED with 2 bugs found and fixed

Summary

Both #522 and #507 are correctly implemented. All sprint-specific tests pass. Two bugs were identified and fixed during QA — one in Stig's #507 implementation (bug_report_dialog.gd), one in Hoshe's pre-written test file (test_bug_report_ring_buffer.gd). All pre-existing test failures are unrelated to sprint-11 scope.


Test Execution

Rust server tests

536 tests run: 536 passed, 3 skipped

Result: PASS

All Rust tests pass. The 3 skipped tests are tagged for explicit invocation only (gen_fixtures).

GDScript lint

No script errors found

Result: PASS (after fix — see Bug #1 below)

Initial run showed one SCRIPT ERROR in bug_report_dialog.gd:331 — type inference on a Variant return value. Fixed during QA. See Bugs section.

GDScript tests (gdUnit4)

Total: 431 test cases | 5 errors | 13 failures | 0 flaky | 0 skipped

Sprint-11 test suites (all new):

Suite Tests Pass Fail Notes
test_insert_off_behavior.gd 16 16 0 All OQ-07/#522 tests pass
test_bug_report_ring_buffer.gd 17 17 0 All #507 ring buffer tests pass
test_cursor_states.gd (3 new) 19 19 0 Including Stig's 3 OQ-07 additions

Pre-existing failures (not from sprint-11):

Test Failure Root cause
test_e2e_connection.gd > test_send_input_receive_snapshot Protocol version mismatch (got 9, expected 8) Server bumped to v9, Protocol.PROTOCOL_VERSION still 8
test_sprint2_proof.gd > test_proof_player_moves_and_v2_snapshot Same mismatch Pre-existing
test_input_roundtrip.gd > test_movement_roundtrip Same mismatch Pre-existing
test_protocol_bridge.gd > test_fixtures_at_protocol_version_8 Same mismatch Pre-existing
test_protocol.gd > test_decode_snapshot_one_npc Same mismatch Pre-existing
test_anti_tedium.gd > test_gauntlet_snapshot_roundtrip_via_apply (5 assertions) gauntlet_mode/room_id not applying Derived from protocol mismatch — msgpack decode fails silently
test_rendering.gd > test_entity_renderer_facing_indicator_rotation_accuracy Precision delta Pre-existing precision issue, sprint-10 origin
test_client_p3.gd > test_facing_indicator_rotation_matches_input_mapper_angle Precision delta Same

Confirmed pre-existing: None of these failing tests are in files touched by sprint-11. Server src/bridge/types.rs PROTOCOL_VERSION = 9 predates this sprint (present at HEAD before any sprint-11 changes). Client protocol.gd was not modified in this sprint.

Rust fixtures

Fixtures: UP TO DATE

No fixture staleness. gen_fixtures test passes; client/tests/fixtures/ unchanged.

Content validation

47 files: 0 errors, 21 warnings

All warnings are pre-existing XREF issues (NPC count mismatch, missing reciprocal relationships). No content changes in sprint-11 scope. check-fact-ids advisory only.

cargo fmt --check

Status: FAIL (pre-existing, not from sprint-11)

Formatting failures in server files last modified in sprint 10 (text_renderer.rs, registry.rs, types.rs, test files). None of the affected files were changed by sprint-11. This is a known technical debt item separate from this sprint's scope.


Bugs Found and Fixed

Bug #1: GDScript type inference error in bug_report_dialog.gd:331

## Bug: Variant type inference error — `var seed_val := _get_current_seed()`
- **Severity**: Medium (blocks GDScript lint — prevents `make pre-pr` from passing)
- **Reproduction**: Run `make pre-pr` or godot4 --headless --path client --quit
- **Expected**: GDScript lint passes
- **Actual**: SCRIPT ERROR: Parse Error: The variable type is being inferred from a Variant
  value, so it will be typed as Variant. (Warning treated as error.)
- **Location**: `client/ui/bug_report_dialog.gd:331`
- **Root cause**: `_get_current_seed()` is declared `-> Variant`. Using `:=` for inference
  on a Variant-returning function triggers a strict-mode warning-as-error in Godot 4.
- **Spec reference**: D-030 (testability — lint must pass)
- **Fix applied**: `var seed_val: Variant = _get_current_seed()`

Bug #2: Type inference + PackedStringArray.filter() errors in test_bug_report_ring_buffer.gd

## Bug: Type inference and API errors in pre-written test file
- **Severity**: Medium (test file fails to parse — 17 tests not run)
- **Reproduction**: Run gdUnit4 test suite — test_bug_report_ring_buffer.gd load fails
- **Expected**: All 17 tests parsed and executed
- **Actual**: SCRIPT ERROR: Parse Error: Cannot infer the type of "jsonl" variable...
             SCRIPT ERROR: Parse Error: Cannot find member "filter" in base PackedStringArray
- **Root cause**:
  1. `var jsonl := dialog._format_inputs_jsonl()` — dynamic method call on Control base type
     returns Variant; `:=` can't infer, strict mode rejects.
  2. `var lines: PackedStringArray = ...` then `lines.filter()` — PackedStringArray does not
     have `filter()` in Godot 4; only `Array` does.
- **Fix applied**:
  1. Changed all `:=` assignments to explicit `var x: Type = expr`
  2. Converted to `Array(lines).filter(...)` for filter calls (6 occurrences)

Spec Compliance: #522 OQ-07

D-056 diegetic test

"Interaction labels render on z-layer 6 (insert overlay). If the insert is off, labels disappear."

PASStest_insert_off_suppresses_should_show_interactions + 15 other tests confirm.

D-057 diegetic test

"Labels render on z-layer 6. If insert is off, labels disappear."

PASStest_insert_off_hides_interaction_list + roundtrip restore tests confirm.

OQ-07 option (a): cursor shape still changes

"The cursor state machine still fires — shape changes; verb labels suppressed."

PASStest_insert_off_option_a_cursor_still_transitions: cursor reaches EntityHover state with insert off. should_show_interactions() returns false, preserving verb suppression.

Decision amendment

PASSdecisions/perception.md has OQ-07 resolution appended to D-056 and D-057.


Spec Compliance: #507 Ring Buffer

60-tick circular buffer

PASStest_buffer_capacity_is_60, test_snapshot_buffer_capacity_is_60

Pre-allocation

PASStest_input_buffer_preallocated_at_ready (buffer pre-sized in _ready())

Circular overwrite: oldest evicted

PASStest_circular_overwrite_evicts_oldest: after 61 pushes, count is 60

Circular overwrite: newest preserved

PASStest_circular_overwrite_keeps_newest_inputs: 60 non-blank lines after 61 pushes

JSONL format contract (replay.rs compatibility)

PASStest_inputs_jsonl_each_line_is_json_array, test_inputs_jsonl_idle_tick_is_empty_array, test_inputs_jsonl_has_tick_field, test_inputs_jsonl_multiple_actions_per_tick

Each line is a valid JSON array. Idle tick produces []. Each PlayerInput has tick and action.

Snapshot JSONL

PASStest_snapshots_jsonl_each_line_is_valid_json: each line is valid JSON Dictionary.

Seed file

PASStest_seed_written_on_capture: _get_current_seed() returns non-null Variant. Returns "unavailable" when GameState.rng_seed == null (server hasn't sent rng_seed yet). Expected behavior — server protocol change required for actual seed.

MVP regression (snapshot.json, render.txt, description.txt)

PASStest_description_txt_still_contains_room_id, test_render_snapshot_text_still_works, test_dialog_is_active_api_unchanged

Inter-frame input accumulation (Tyre's arch fix)

VERIFIED_pending_record_inputs in main.gd accumulates server-bound inputs across 60fps display frames and flushes to record_tick() once per 10tps snapshot. All inputs between snapshot ticks are captured correctly.


Coverage Summary

#522 (OQ-07 no-insert interaction)

Category Tests Coverage
Happy path 4 100%
Edge cases (weapon + shift + rapid toggle) 4 100%
Cross-system consistency (cursor + list agree) 2 100%
GameState field (exists, default) 2 100%
Z-layer verification 1 100%
Regression (sprint + weapon mode) 2 100%
Stig's additions in test_cursor_states.gd 3 100%

#507 (ring buffer upgrade)

Category Tests Coverage
Buffer capacity 2 100%
Pre-allocation 1 100%
Push/fill behavior 2 100%
Circular overwrite 3 100%
JSONL format (replay.rs contract) 4 100%
Snapshot JSONL 1 100%
Seed file 1 100%
MVP regression 3 100%

Observations (Non-blocking)

OBS-4: cargo fmt --check is a pre-pr blocker requiring separate fix

The pre-pr make target fails at step 2 (cargo fmt --check) on server files from sprint 10. This is not a sprint-11 regression. However, it prevents make pre-pr from running to completion. Recommend a cargo fmt cleanup commit on the server branch before or alongside this PR.

OBS-5: Protocol version mismatch (server v9, client v8) affecting 8 tests

Protocol.PROTOCOL_VERSION in client/scripts/protocol/protocol.gd is still 8, but the server is at v9. This causes 5+ tests to fail in the integration/e2e test suites. Not in sprint-11 scope, but worth flagging. Needs a coordinated client+server bump.


Final Verdict

APPROVED

  • #522 (OQ-07): All 19 tests pass. Spec compliant. Decision amendment documented.
  • #507 (Ring buffer): All 17 tests pass. Spec compliant. Replay-format JSONL verified.
  • 2 bugs found and fixed during QA (type inference errors).
  • Remaining failures are pre-existing, not in sprint-11 scope.
  • GDScript lint: clean. Rust tests: 536/536. Fixtures: up to date. Content: 0 errors.

Ready for PR once cargo fmt technical debt is addressed (OBS-4).