spike(vanilla): measure the pre-respawn death signal and mid-fall teleport (1.21.11) - #349
Merged
Merged
Conversation
…eport (1.21.11) Two facts a design in flight was about to assume, answered on a live pinned 1.21.11 server instead of from recall, with the rig and the raw per-sample data committed so a future session checks the reasoning rather than repeats it. Shape follows tools/spike-jump-arc/. No engine, DSL, campaign or CI behaviour changes; the spike is deliberately not wired into CI. Q1. A pre-respawn death signal exists for every cause measured (void, fall, drowning, lava, mob kill), and the exact death position is readable at that moment — but not through an advancement. The premise that the engine's edge is advancement-based is wrong: it is a vanilla deathCount SCOREBOARD criterion. deathCount and LastDeathLocation are both written on the death tick and stay readable for as long as the player leaves the death screen up; the corpse's Pos is stable there and agrees with LastDeathLocation. minecraft:entity_killed_player fires only for the mob kill, never for the four environmental causes. cp_respawn_check is not late by accident — the bare score edge is armed on the corpse in all 15 trials, and the Health:0.0f guard is what defers the fire. Q2. /teleport does not touch accumulated fall distance: after - before was exactly 0.0000 in 46 of 46 teleport trials, including teleports 143 and 157 blocks straight up, and the carried value is charged in full at the destination landing (floor(fall_distance) - 3, fitting every trial). An arriving lift car does not catch a falling player; it is the surface they die on. Measured bracket: survived at 20.279 blocks of accumulated fall, died at 23.435. Incidental, both live in this repo and neither able to notice: 1.21.11 renamed the whole gamerule registry to snake_case and rejects a legacy camelCase name, which crates/admit/src/gallery.rs (four rules) and tools/spike-jump-arc still emit. And a respawned player is invulnerable for 59 ticks, during which /damage is refused with a message and /kill answers "Killed <player>" and does nothing — found as an intermittency in this rig's own scrub step and root-caused rather than re-run away. Findings, per-cause tables and an explicit list of what was NOT measured: docs/notes/death-and-teleport-spike.md. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
…pipefail `docker port … | head -1 | sed` is the exact shape CI's tools/check-shell-pipe-shortcircuit.py exists to catch: head stops reading, the producer dies of SIGPIPE (141), and `set -o pipefail` promotes that to a failure *because* the port was found. It never fired in ~20 local runs, which is what this class always looks like until it costs a staging. Capture, then split in the shell. Verified against a live container: `docker port … 25565` -> `127.0.0.1:32786` parses to `32786`. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL
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.
What this is
A measurement PR, not a feature. Two facts about pinned vanilla 1.21.11 were
about to be assumed by a design in flight; this answers both on a live server and
commits the rig plus the raw data so the answers can be re-checked rather than
re-remembered. No engine, DSL, campaign or CI behaviour changes.
Shape follows the existing precedent,
tools/spike-jump-arc/: a throwaway serverfrom the pinned image digest, a mineflayer bot as the instrument, findings in
docs/notes/.The two answers
Q1 — is there a pre-respawn death signal, and is the death position readable?
Yes, for every cause measured (void, fall, drowning, lava, mob kill) — but not
through an advancement, and the premise in the task was wrong on that point:
the engine's edge is a vanilla
deathCountscoreboard criterion, not anadvancement.
deathCountandLastDeathLocationare both written on the deathtick and stay readable for as long as the player leaves the death screen up; the
corpse's
Posis stable there too and agrees withLastDeathLocation. The oneadvancement trigger that names a death,
minecraft:entity_killed_player, firesonly for the mob kill and never for the four environmental causes.
cp_respawn_checkis not late by accident: the bare score edge is armed on thecorpse in every trial, and it is the
unless data entity @s {Health:0.0f}guardthat defers the fire to the first tick after respawn. Anything that wants to run
effects at the moment of death keys off the same edge without that guard.
Q2 — how does fall damage settle for a player teleported mid-fall?
/teleportdoes not touch accumulated fall distance.after − beforewas exactly0.0000in 46 of 46 teleport trials, including teleports 143 and 157 blocksstraight up, and the carried value is charged in full at the destination
landing (
floor(fall_distance) − 3, fitting every trial). An arriving lift cardoes not catch a falling player; it is the surface they die on — the sweep puts
the boundary between a measured survival at 20.279 blocks of accumulated fall and
a measured death at 23.435.
Incidental findings that are live defects in this repo
camelCase name is rejected — the command changes nothing and says so to a
response nobody reads. Two places still emit the old names:
crates/admit/src/gallery.rs(four rules, so the gallery world cycles day andweather, spawns mobs and does not immediate-respawn) and
tools/spike-jump-arc/measure.mjs:186(gamerule fallDamage false, whosecomment claims the jump bot takes no fall damage — it does). Not fixed here;
fixing them is not this PR's job and both want their own change.
/damageis refused with an explicit message and/killanswers "Killed" and does nothing. This started as an intermittency in the rig's own
scrub step and was root-caused rather than re-run away.
Full detail, per-cause tables, and an explicit list of what was not measured:
docs/notes/death-and-teleport-spike.md.What CI proves
Nothing new — the spike is deliberately not wired into CI (same as
spike-jump-arc;docs/reference/tools.md§10 says spikes never enter a skillor a job). The existing gates still pass, including
tools/check-compose-isolation.py: the rig publishes an ephemeral loopbackport and never takes 25565 or the mutex, so it runs alongside any worker ladder.
Reviewing this
The claims are checkable without running anything: every number in the note comes
from
tools/spike-death-teleport/observations.json, which is committed with theper-sample raw data (not just summaries).
🤖 Generated with Claude Code
https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL