Playtest flight recorder (F9) + burnout Push Through loyalty hit#639
Merged
Conversation
) 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>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
4 tasks
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 underuser://flight_recorder/(absolute path printed to console on first use). Marker events also append to onemanifest.jsonlper 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 asremove_researchers/_poach_least_loyalfrom #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 newloyalty_hitkey is whitelisted.Test plan
--importpass (headless) before GUT, per known environment quirktest_events.gdin isolation: 33/33 passing, 730 asserts (includes the 2 new burnout outcome tests)test_flight_recorder.gdin isolation: 9/9 passing, 20 asserts-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).importchurn stagedLocal test evidence
🤖 Generated with Claude Code