re: target preference works; the blocker is now combat effectiveness, not RE

pilot.py gained SYLPH_PREFER, a unit-name substring whose matches get their
target score multiplied by 0.05 while everything else is multiplied by 4.0. With
SYLPH_PREFER=e010 a clean 320 s run, zero stalls by the witness, killed eight
turrets and two Attacker_S.

The preference is real -- e010 kills went from roughly one across all previous
runs to two in a single run -- but it is weak. Turrets still outnumber attackers
four to one in the kill log, because target commitment and simple proximity keep
pulling the nose back to them, and phase 1 fields 108 turret craft against 16
attackers. Deployed stayed at 41 throughout, so no phase advance.

That quantifies the blocker. Clearing the marked attackers means destroying 16
craft, and at two per 320 s that is about 2560 seconds, roughly 43 minutes of
continuous verified-live flight across many chained attaches, against a freeze
rate of about two runs in five.

This is no longer a reverse-engineering problem. Everything needed to observe
the phase advance is built and validated -- the roster-to-craft link, the
liveness read, the stall witness, chained attaches and the discard rule. What is
missing is a pilot good enough to complete the mission objective, which is
game-playing work with an uncertain payoff.

The choice is recorded rather than made, because it is about how much effort one
confirmation is worth rather than a technical unknown: invest in the pilot,
accept the static answer where only the trigger is inferred rather than
observed, or attempt one very long chained run betting against the freeze rate.
This commit is contained in:
Sylpheed RE agent
2026-08-24 21:18:15 +00:00
parent 56e24ce9b1
commit be6207822d
4 changed files with 85 additions and 1 deletions

View File

@@ -114,6 +114,7 @@ KILL_TURRETS = os.environ.get("SYLPH_KILL_TURRETS") == "1"
HUNT = os.environ.get("SYLPH_HUNT") == "1"
PREFER = os.environ.get("SYLPH_PREFER", "")
class Pilot:
@@ -389,6 +390,15 @@ class Pilot:
lead = self.lead_point(p, v, d)
theta = ang(lead - me_p, fwd)
score = d * (1.0 + 3.0 * (theta / math.pi) ** 2)
# SYLPH_PREFER biases target choice toward a unit-name substring.
# Stage 02's phase-1 objective is stated outright in the guide
# script -- "the attackers with the orange markers" -- i.e. e010,
# but every kill in every run so far was an e007 turret, because
# HUNT made turrets targets and KEEPOUT was tuned for them
# (mission-objectives-text.md). Without this the pilot cannot be
# pointed at the thing the mission actually asks for.
if PREFER:
score *= 0.05 if PREFER in nm else 4.0
if score < bestscore:
best, bestscore = (off, nm, lead, lead - me_p, d, r), score
return best

View File

@@ -22,7 +22,7 @@ for try in 1 2 3; do
echo "--- bind attempt $try failed, retrying"; sleep 5
done
if [ "$BOUND" = 1 ]; then
SYLPH_HUNT="$HUNT" SYLPH_KILL_TURRETS=1 SYLPH_KEEPOUT="${SYLPH_KEEPOUT:-1400}" SYLPH_HZ="${SYLPH_HZ:-8.0}" nohup python3 "$SD/pilot.py" "$CFG" "$SECS" \
SYLPH_HUNT="$HUNT" SYLPH_KILL_TURRETS=1 SYLPH_KEEPOUT="${SYLPH_KEEPOUT:-1400}" SYLPH_HZ="${SYLPH_HZ:-8.0}" SYLPH_PREFER="${SYLPH_PREFER:-}" nohup python3 "$SD/pilot.py" "$CFG" "$SECS" \
</dev/null >/tmp/live-pilot.log 2>&1 &
PILOT=$!; echo "--- pilot (SYLPH_HUNT=$HUNT)"
else echo "BIND FAILED after 3 attempts -- aborting, an unattended run tests nothing"; exit 4; fi