#522 (OQ-07 resolution): Insert-off behavior resolved as option (a) — cursor shape still changes (body orients to targets), verb labels and interaction prompts suppressed when insert_active == false. D-056 and D-057 amended with resolution notes.
#507 (WRONG button full captures): Upgrades F12 bug capture from single-tick MVP to 60-tick rolling history. Pre-allocated ring buffers for inputs and snapshots. Outputs inputs.jsonl (replay-compatible), snapshots.jsonl, and seed.txt. Inter-frame input accumulation ensures no inputs lost between server ticks at 60fps/10tps.
33 new tests: 17 for ring buffer (capacity, overwrite, JSONL format, seed fallback), 16 for insert-off behavior (diegetic test, cursor transitions, cross-system consistency).
Server dependency
seed.txt writes "unavailable" — server needs to add rng_seed: u64 field to ObserverSnapshot for deterministic replay. Client-side parsing is wired and ready.
Test plan
16/16 insert-off behavior tests pass
17/17 ring buffer tests pass
536/536 Rust tests pass
Existing cursor state tests pass (no regression)
Architecture review by Tyre (conditional pass → fix applied)
make pre-pr blocked by pre-existing cargo fmt failure on sprint-10 server code (not from this PR)
## Summary
Sprint 11: Combine — client team deliverables.
- **#522 (OQ-07 resolution):** Insert-off behavior resolved as option (a) — cursor shape still changes (body orients to targets), verb labels and interaction prompts suppressed when `insert_active == false`. D-056 and D-057 amended with resolution notes.
- **#507 (WRONG button full captures):** Upgrades F12 bug capture from single-tick MVP to 60-tick rolling history. Pre-allocated ring buffers for inputs and snapshots. Outputs `inputs.jsonl` (replay-compatible), `snapshots.jsonl`, and `seed.txt`. Inter-frame input accumulation ensures no inputs lost between server ticks at 60fps/10tps.
- **33 new tests:** 17 for ring buffer (capacity, overwrite, JSONL format, seed fallback), 16 for insert-off behavior (diegetic test, cursor transitions, cross-system consistency).
## Server dependency
`seed.txt` writes "unavailable" — server needs to add `rng_seed: u64` field to `ObserverSnapshot` for deterministic replay. Client-side parsing is wired and ready.
## Test plan
- [x] 16/16 insert-off behavior tests pass
- [x] 17/17 ring buffer tests pass
- [x] 536/536 Rust tests pass
- [x] Existing cursor state tests pass (no regression)
- [x] Architecture review by Tyre (conditional pass → fix applied)
- [ ] `make pre-pr` blocked by pre-existing `cargo fmt` failure on sprint-10 server code (not from this PR)
Option (a): cursor shape still changes (body orients to targets), but
verb labels and interaction prompts are suppressed when insert_active
is false. Amends D-056 and D-057 with resolution note.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Upgrades bug_report_dialog.gd from single-tick MVP to 60-tick rolling
history. Pre-allocated ring buffers for inputs and snapshots. Outputs
inputs.jsonl (replay-compatible), snapshots.jsonl, and seed.txt on F12.
Inter-frame input accumulation ensures no inputs lost between server ticks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
33 tests: 17 for ring buffer (capacity, overwrite, JSONL format, seed),
16 for insert-off behavior (diegetic test, cursor transitions, cross-system).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Test plan for #507/#522, preliminary review of #522, and final
combine test report. All tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Architecture: D-020 ✓, D-010 ✓, D-030 ✓, D-048/D-056/D-057/D-058 ✓. State management clean, no autoload coupling.
Verdict: APPROVED (with suggestions)
All suggestions are refinement-level. Please address the after_each test isolation items (Hoshe #2, #3) and the variable naming (#1) as quick wins. The rest are at your discretion.
## Review: client -> main (PR #40)
### Hoshe (Code Quality): APPROVE
6 suggestions.
| # | File:line | Severity | Issue |
|---|-----------|----------|-------|
| 1 | `main.gd:118` | suggestion | `_insert` underscore prefix on used variable — rename to `insert_state`. |
| 2 | `test_bug_report_ring_buffer.gd` | suggestion | No `after_each` — GameState mutations leak on assertion failure. Add `after_each()` to reset modified fields. |
| 3 | `test_insert_off_behavior.gd:363` | suggestion | Sprint stance restore skipped on null early-return — move restore into `after_each()`. |
| 4 | `test_bug_report_ring_buffer.gd:271` | suggestion | Assertion message says "unknown" but code returns "unavailable". Fix message. |
| 5 | `bug_report_dialog.gd:_save_report` | suggestion | Document memory ceiling of 60 full JSON snapshots in ring buffer. |
| 6 | `bug_report_dialog.gd:_get_current_seed` | suggestion | `rng_seed` as u64 loses precision via JSON float — consider string encoding when field lands. |
### Tyre (Architecture): APPROVE
7 suggestions, all clean.
| # | File:line | Severity | Issue |
|---|-----------|----------|-------|
| 1 | `bug_report_dialog.gd:150` | suggestion | `SimBridge._action_enum_to_wire()` — private method access across scripts. Consider public alias. |
| 2 | `bug_report_dialog.gd:39-44` | suggestion | Parallel ring buffer state (6 vars) — extract `RingBuffer` class if a third buffer is ever needed. |
| 3 | `main.gd:86-92` | suggestion | Insert-active propagation to 3 nodes inline — consider signal if >3 consumers. |
| 4 | `game_state.gd` | suggestion | `insert_active` defaults to `true` — document assumption for future no-insert characters. |
| 5 | `bug_report_dialog.gd:72-73` | suggestion | Unused `_tick` parameter — add `@warning_ignore` or remove. |
| 6 | `Cargo.lock` | suggestion | Version bump 0.1.9→0.1.10 — verify aligns with sprint convention. |
| 7 | `perception.md` OQ-07 | suggestion | Dense single-line amendment — consider bullet-point structure. |
Architecture: D-020 ✓, D-010 ✓, D-030 ✓, D-048/D-056/D-057/D-058 ✓. State management clean, no autoload coupling.
### Verdict: APPROVED (with suggestions)
All suggestions are refinement-level. Please address the `after_each` test isolation items (Hoshe #2, #3) and the variable naming (#1) as quick wins. The rest are at your discretion.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Sprint 11: Combine — client team deliverables.
insert_active == false. D-056 and D-057 amended with resolution notes.inputs.jsonl(replay-compatible),snapshots.jsonl, andseed.txt. Inter-frame input accumulation ensures no inputs lost between server ticks at 60fps/10tps.Server dependency
seed.txtwrites "unavailable" — server needs to addrng_seed: u64field toObserverSnapshotfor deterministic replay. Client-side parsing is wired and ready.Test plan
make pre-prblocked by pre-existingcargo fmtfailure on sprint-10 server code (not from this PR)Review: client -> main (PR #40)
Hoshe (Code Quality): APPROVE
6 suggestions.
main.gd:118_insertunderscore prefix on used variable — rename toinsert_state.test_bug_report_ring_buffer.gdafter_each— GameState mutations leak on assertion failure. Addafter_each()to reset modified fields.test_insert_off_behavior.gd:363after_each().test_bug_report_ring_buffer.gd:271bug_report_dialog.gd:_save_reportbug_report_dialog.gd:_get_current_seedrng_seedas u64 loses precision via JSON float — consider string encoding when field lands.Tyre (Architecture): APPROVE
7 suggestions, all clean.
bug_report_dialog.gd:150SimBridge._action_enum_to_wire()— private method access across scripts. Consider public alias.bug_report_dialog.gd:39-44RingBufferclass if a third buffer is ever needed.main.gd:86-92game_state.gdinsert_activedefaults totrue— document assumption for future no-insert characters.bug_report_dialog.gd:72-73_tickparameter — add@warning_ignoreor remove.Cargo.lockperception.mdOQ-07Architecture: D-020 ✓, D-010 ✓, D-030 ✓, D-048/D-056/D-057/D-058 ✓. State management clean, no autoload coupling.
Verdict: APPROVED (with suggestions)
All suggestions are refinement-level. Please address the
after_eachtest isolation items (Hoshe #2, #3) and the variable naming (#1) as quick wins. The rest are at your discretion.Re-Review: client -> main (PR #40) — Round 2
Hoshe (Code Quality): APPROVE
All 6 suggestions addressed. 1 new minor suggestion: restore rationale comment on
_tickparam alongside@warning_ignore. Does not block merge.Tyre (Architecture): APPROVE
All 7 suggestions addressed. Clean rename across 9 files, test isolation fixed, decision docs reformatted.
Verdict: APPROVED — ready to merge.
Pull request closed