Files
BT411/scratchpad/night12/skatebench.sh
T
Joe DiPrimaandClaude Fable 5 9604f4c492 #52 SKATE detector (ungated field forensic) -- negative-verified; local repro eludes
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>
2026-08-05 12:41:55 -05:00

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