Skip to content

spike(vanilla): measure the pre-respawn death signal and mid-fall teleport (1.21.11) - #349

Merged
stellarfeline merged 3 commits into
mainfrom
spike/death-and-teleport
Aug 10, 2026
Merged

spike(vanilla): measure the pre-respawn death signal and mid-fall teleport (1.21.11)#349
stellarfeline merged 3 commits into
mainfrom
spike/death-and-teleport

Conversation

@stellarfeline

@stellarfeline stellarfeline commented Aug 10, 2026

Copy link
Copy Markdown
Owner

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 server
from 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 deathCount scoreboard criterion, not an
advancement. 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 too and agrees with LastDeathLocation. The one
advancement trigger that names a death, minecraft:entity_killed_player, fires
only for the mob kill and never for the four environmental causes.

cp_respawn_check is not late by accident: the bare score edge is armed on the
corpse in every trial, and it is the unless data entity @s {Health:0.0f} guard
that 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?
/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
— 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

  • 1.21.11 renamed the whole gamerule registry to snake_case, and a legacy
    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 and
    weather, spawns mobs and does not immediate-respawn) and
    tools/spike-jump-arc/measure.mjs:186 (gamerule fallDamage false, whose
    comment 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.
  • A respawned player is invulnerable for 59 ticks (≈3 s), during which
    /damage is refused with an explicit message and /kill answers "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 skill
or a job). The existing gates still pass, including
tools/check-compose-isolation.py: the rig publishes an ephemeral loopback
port 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 the
per-sample raw data (not just summaries).


🤖 Generated with Claude Code

https://claude.ai/code/session_01AjQ5p1Kv5MrkGPumi7yXWL

stellarfeline and others added 3 commits August 9, 2026 20:18
…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
@stellarfeline
stellarfeline merged commit db63014 into main Aug 10, 2026
12 checks passed
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