The night-12 field logs eliminated record starvation (zero [ghost] during three observed skating windows), so the bug lives in gait APPLICATION on peers. This adds the [skate] detector to the death-handler tick: a replicant moving >0.08 u/frame for 90+ frames with BOTH animation channels idle (legCycleSpeed + bodyCycleSpeed ~ 0) logs one line per episode + a SKATE matchlog record carrying the discriminating inputs (legCyc/bodyCyc/cmdSpd/destroyed/mode). Honest history: the first build keyed on legCycleSpeed alone and false-fired on every healthy movement phase -- the current peer architecture poses joints from the BODY channel (s_peerLegCh=0, AdvanceBodyAnimation mj=1), so legCycleSpeed==0 is NORMAL there. Caught same-session by the [gimpfeed] silence (AdvanceLegAnimation never runs on peers); corrected to channel-agnostic before anything shipped. Bench (skatebench2.sh, 2-node, autodrive walker + kill every ~40s): 7 death/respawn cycles, ZERO skate hits either side -- no false fires, and light local conditions do NOT reproduce the field skating. Next provocations: leg-GIMPED walker (the #82 family transition) and 6-player load; otherwise the detector rides the next cut and the field names the failing case for us. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
37 lines
1.5 KiB
Bash
37 lines
1.5 KiB
Bash
#!/usr/bin/env bash
|
|
# #52/#130 SKATE PROVOCATION -- transition-heavy 2-node run under the new
|
|
# ungated [skate] detector. A walks CONTINUOUSLY (autodrive) and gets killed
|
|
# every ~40s by B (force-dmg) -> respawn-while-moving cycles, the field's
|
|
# suspected trigger (skating clustered in the deaths-heavy final drop).
|
|
# B is the OBSERVER: its log carries [skate] lines for A's replicant.
|
|
# Negative control: sustained clean walking between kills must NOT trip it.
|
|
set -x
|
|
. /c/git/bt411/scratchpad/night6/bench_common.sh
|
|
cd /c/git/bt411/content || exit 1
|
|
taskkill //F //IM btl4.exe > /dev/null 2>&1
|
|
sleep 2
|
|
rm -f sk_a.log sk_b.log
|
|
bt_expert_egg MP.EGG SK.EGG
|
|
sed -i "s/^map=.*/map=grass/; s/^time=.*/time=day/; s/^vehicle=.*/vehicle=madcat/" SK.EGG
|
|
|
|
# B = observer + killer (back window)
|
|
BT_MP_FORCE_DMG=1 BT_DEATH_LOG=1 BT_MP_LOG=1 BT_MATCHLOG=1 \
|
|
bt_launch sk_b.log SK.EGG 0x0C -net 1601
|
|
sleep 2
|
|
# A = walking victim: autodrive persists across respawns
|
|
BT_AUTODRIVE=0.8 BT_DEATH_LOG=1 BT_MP_LOG=1 BT_MATCHLOG=1 \
|
|
bt_launch sk_a.log SK.EGG 0x03 -net 1501
|
|
sleep 5
|
|
python ../tools/btconsole.py SK.EGG 127.0.0.1:1501 127.0.0.1:1601 > sk_relay.log 2>&1 &
|
|
RELAY=$!
|
|
sleep 260
|
|
kill $RELAY 2>/dev/null
|
|
taskkill //F //IM btl4.exe > /dev/null 2>&1
|
|
sleep 3
|
|
echo "=== deaths/respawns on A:"
|
|
grep -cE "death cycle START" sk_a.log
|
|
echo "=== SKATE hits on B (A's replicant):"
|
|
grep -a "\[skate\]" sk_b.log | head -12
|
|
echo "=== SKATE hits on A (B's replicant -- should be none, B stands still):"
|
|
grep -ac "\[skate\]" sk_a.log
|