Skip to content

Playtest flight recorder (F9) + burnout Push Through loyalty hit#639

Merged
PipFoweraker merged 2 commits into
mainfrom
tooling/flight-recorder-burnout
Jul 14, 2026
Merged

Playtest flight recorder (F9) + burnout Push Through loyalty hit#639
PipFoweraker merged 2 commits into
mainfrom
tooling/flight-recorder-burnout

Conversation

@PipFoweraker

Copy link
Copy Markdown
Owner

Summary

Two small independent dev-tooling/content items:

Playtest flight recorder (docs/game-design/WORKSHOP_2_BACKLOG.md "Playtest deep-dive protocol"): F9, registered alongside the existing DEV MODE overlay's backslash toggle, dumps a screenshot + a JSON state snapshot (reuses GameState.to_dict(), the save/load serializer — no parallel serializer) + an auto-incrementing marker id with an optional note (tiny popup, Enter to save / Esc to skip) into a timestamped session directory under user://flight_recorder/ (absolute path printed to console on first use). Marker events also append to one manifest.jsonl per session. Files share a zero-padded marker prefix so one press's three files sort adjacently. Dev-build-only (BuildInfo.is_dev_build()); zero effect on normal play.

Burnout interim content (#631, ruled in WORKSHOP_2_BACKLOG "Burnout outcome model — RULED", resolves the #631/#635 AMBIGUOUS case): employee_burnout's "Push Through" outcome claimed strain but only applied doom. It now also docks loyalty on the two least-loyal researchers (least-loyal-first, same targeting convention as remove_researchers/_poach_least_loyal from #635), named for legibility, with outcome text updated to say so honestly. No efficiency debuffs or extended-leave states — that's lane L2's (#613) job per the ruling. #635's flavor-vs-effect property tests (test_all_core_event_effect_keys_are_handled) still pass — the new loyalty_hit key is whitelisted.

Test plan

  • Fresh worktree --import pass (headless) before GUT, per known environment quirk
  • test_events.gd in isolation: 33/33 passing, 730 asserts (includes the 2 new burnout outcome tests)
  • test_flight_recorder.gd in isolation: 9/9 passing, 20 asserts
  • Full local unit suite (-gdir=res://tests/unit, Godot 4.5.1 headless): 421/421 passing, 40 scripts, 4491 asserts (up from 412/412 baseline before this branch — CI is hollow per CI test gate is a no-op: Godot unit/integration/smoke suites report green while running ZERO tests #629, so this is the real signal)
  • No .import churn staged

Local test evidence

Scripts              40
Tests               421
Passing Tests       421
Asserts            4491
---- All tests passed! ----

🤖 Generated with Claude Code

PipFoweraker and others added 2 commits July 14, 2026 17:45
)

Interim content per Pip's WORKSHOP_2_BACKLOG "Burnout outcome model" ruling
(resolves the #631/#635 AMBIGUOUS case): ignoring burnout no longer claims
strain while only applying doom. Push Through now also docks loyalty on the
two least-loyal researchers (least-loyal-first, matching the poaching
targeting convention), named for legibility. No removal, no efficiency/leave
debuff — those stay L2's (#613) job per the ruling.

- events.gd: new "loyalty_hit" effect key + _apply_loyalty_hit()
- core_events.json: ignore_burnout gains loyalty_hit:15, honest outcome text
- test_events.gd: whitelist the new key (keeps #635's effect-key gate honest)
  + outcome-assertion tests (loyalty docked, no removal, legible, safe no-op)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… note

Implements the "Playtest deep-dive protocol" candidate build item from
docs/game-design/WORKSHOP_2_BACKLOG.md: a dev-mode hotkey that in one press
captures everything needed to reconstruct a human playtest moment, reviewed
as a timestamped session unit.

F9 (new `flight_recorder` keybind, registered the same way as the existing
DEV MODE overlay's backslash toggle) writes into a timestamped session dir
under user://flight_recorder/ (absolute path printed to console on first
use):
  - NNNN_<timestamp>_screenshot.png - get_viewport().get_texture().get_image()
  - NNNN_<timestamp>_state.json - GameState.to_dict(), the SAME serializer
    save/load uses (no parallel serializer)
  - NNNN_<timestamp>_note.txt - from a tiny popup textbox (Enter to save,
    Esc to skip)
  - one manifest.jsonl line per marker, appended, session-wide

Filenames share a zero-padded marker prefix so one press's three files sort
adjacently. Dev-build-only (BuildInfo.is_dev_build(), same gate as
DevModeOverlay); zero effect on normal play. The note popup blocks input via
an ordinary modal (ColorRect + PanelContainer, MOUSE_FILTER_STOP) - this
engine has no continuous auto-advance (MonthController only steps via an
explicit player-triggered advance_tick()), so nothing extra needs pausing;
if MonthController is already mid a window pause, capture just operates on
that already-halted state.

Unit-tested: the pure snapshot/manifest/filename helpers (build_state_snapshot
reuses state.to_dict() byte-for-byte, JSON round-trip, marker-prefix sort
order) and the keybind registration. The screenshot itself needs a live
viewport + a human eye, per the task spec, and is not unit-tested.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@PipFoweraker
PipFoweraker merged commit cd8f6b7 into main Jul 14, 2026
10 of 11 checks passed
@PipFoweraker
PipFoweraker deleted the tooling/flight-recorder-burnout branch July 14, 2026 07:47
PipFoweraker added a commit that referenced this pull request Jul 15, 2026
Verified current main (post #636/#638/#639/#640/#641/#643 merge stack)
launches clean headless, plays a full month through the End Turn ->
MonthController path, and passes the fast unit gate CI runs
(345 tests, 0 failures, 36/36 files). Nine-stream doom, finance offers,
and flight recorder all pass their unit suites with no wiring gaps
found. No code changes needed -- green light for tomorrow.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant