docs(playtest): pilot 4 — the platform fix works, the wall moved to run-up - #23
Conversation
…un-up Two runs against constellation 604a422, the first co-op play since the landing-triggered platform fix (earendil-works#40) and the diedAt/port/glance fixes (#21). No clear in either; both laptop seats were killed by a token-rate 429. What the runs establish: - The platform fix holds in live co-op: bridges stood unlanded-on for 2m54s (run A) and ~3m52s (run B), observed directly via platformCount. Pre-earendil-works#40 they would have expired at 5.0s. - diedAt closed the misattribution arc. Fifteen deaths, every one reported at a real site; pilot 3's misdirected-cast finding did not reproduce. - The new blocker is run-up, not the stopwatch: the pair parked safely at the pit lip twice (x=640/636 under freeze) and could not convert, because the safe waiting spot is past the launch point the jump needs. - arm-timeout turns out to be a cast/arm ordering race, not "no cast came" — all three timeouts began after the freeze window had closed, and two blocked both seats for ~88s. - An instant arm-fired (armedForMs 61) is a false green light on a 3s freeze; two such moves died within 0.2s of the thaw. Death tables are built exclusively from driver-logged /move events. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bzc67cZUU2qehEV4mQR1sK
F1 (critical): retract the "safe waiting spot has no run-up" finding. The
rails does NOT jump with a running start — verify-rails.sh:107-115 parks at
untilX:620 to a full stop and then jumps jumpAtX:628 in a separate call, so
park-then-leap is exactly how the pit is cleared, and the claim contradicted
this report's own Rails paragraph. Neither stage-two attempt tested a lip-timed
jump (one had no jumpAtX, one aimed at 680, past the ~656 edge), so the run
contains zero valid jumps from the park spot. Rewritten: the pair found the
right plan and could not find the aim, and the two failures are indistinguishable
to the seat — both arrive as diedAt {772,592}. Finding 2 now states plainly that
this pilot cannot say whether a correctly-aimed pair clears the pit, and names
the missing experiment.
F2: recompute the two "Way 2" thaw gaps from logged fields only — armed-at +
armedForMs + the driver's 200ms ARM_REACTION_MS + elapsedMs. Real gaps are
0.50s and 0.13s, not "both within 0.2s". Adds the arm-fire calibration showing
solve-return timestamps run ~0.15s late, so the gaps are ranges.
F3: two 61ms arms fired on a stale freeze, not three — the third was armed on
platform, where instant fire is correct. The prose had contradicted the table.
F4: the arm-ordering result is 7 arms placed before their cast, 7/7 crossing
the band, not "twice in run B"; all 3 arm-timeouts and both stale-freeze deaths
were cast-first. What stops at the lip is untilX:630, not the arm.
F5: run A logged 6 freeze solves, not 5 (the 6th after the 429); run B's 9
solves, its 4859ms platform and 187ms illuminate were missing, and 679ms sits
outside pilot 3's band.
F6-F9: five /state reads not four, eleven moves not nine, one timestamp
convention; ~10 turns/min not 6, with the token totals; correct the phone-quote
provenance (two quotes are intercom-only) and restore a truncated qualifier;
the two phone seats behaved differently after their partners died.
F10: the rails figures are console-only and unrecoverable — stated at the claim
and in the appendix, with the tee-to-log fix recorded as a follow-up.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bzc67cZUU2qehEV4mQR1sK
All five were introduced by the round-1 fix commit, not pre-existing.
F11 (should-fix): "run B's 679 the only value outside pilot 3's band" was false
and contradicted its own preceding clause — run A's 669/669/670/671/671 all sit
below the 672-676 band, so six of fifteen values are outside it, not one.
F12 (should-fix): the replacement thesis over-generalised. Run A's laptop DID
derive jumpAtX:620 — the rails park point, 8px off the rails jump point — from
diedAt {772,592} plus the phone's "Try jumping earlier?", and issued it twice
(19:57:09.330, 19:57:30.577). It died in the patrol band both times before
reaching 620, so the aim was untested, not unfindable. The section, the summary
and finding 2 now say that: one seat found an aim it never got to use, the
other reached the lip with the wrong one. This makes the finding narrower and
also makes it finding 3's mechanism (diedAt feeding a correct diagnosis)
reaching the aim as well as the hazard.
F13: the "130-160ms" calibration contradicted its own table (real deltas 103-162,
mean ~142) and was biased ~10-20ms high by using call stamps against a driver
clock that starts on arrival. Now stated as ~90-150ms true spread, with the
Way-2 upper bounds and the honesty caveat following it.
F14: the blanket reply-timestamp convention was falsified by the arm table, the
Way-2 armed times and the intercom quotes, all call stamps. Replaced with a
convention that names which class each is and why they must not be mixed.
F15: "forty pixels" vs finding 2's "24px" reconciled to 24px throughout; "Both
seats independently asked for that signal" corrected to run B's phone, which is
what finding 6 already said.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bzc67cZUU2qehEV4mQR1sK
F16 (should-fix): "Both attempts died in the patrol band" was wrong about one
of the two. Run A's armed jumpAtX:620 call returned arm-timeout with
elapsedMs:0, armedForMs 15009, position unchanged at x=84 and respawnCount
unchanged at 4 — it never moved and never died, and finding 4 already counts it
as one of the three arm-timeouts. The two attempts failed for two different
reasons (no cast ever came; the un-armed retry died 200px short), which is
more informative than the merged claim and is now what the report says.
F17 (should-fix): the F12 fix over-corrected in the opposite direction. Grading
620 as "a good aim" rested on its being 8px from the rails' jumpAtX:628 — but
the rails call is {jumpAtX:628, untilX:780}, and the untilX is load-bearing: it
cuts horizontal input mid-flight to drop the astronaut onto the platform. Run
A's two calls carry no untilX (verified in both call bodies), so a bare
jumpAtX:620 is a different maneuver, not an 8px variant. The report now says
run A reasoned to a plausible-looking candidate and never tested it, and does
not grade it. This is the report's own "what stops you is untilX, not the other
parameter" rule applied to the aim; the missing-experiment recommendation now
names the untilX pairing explicitly.
F18: finding 8's "~10ms across four pilots" and "tighter than any single
puzzle's variance" both overreached — pilot 1's ~683ms is a seat rounding not a
driver elapsedMs, pilot 2 logged none, and freeze's own within-run variance
(4-6ms) is tighter than the drift, not wider. Scoped to pilots 3-4 with the
real comparison, and the finding's heading brought in line with its body.
F19: the timestamp convention's closed list omitted Way 1's arms and Way 3's
move, the exact cases where call and reply differ by up to 90s. Replaced with
the general rule plus that example.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bzc67cZUU2qehEV4mQR1sK
F20 (should-fix): the aiming section explained run A's failed arm as "no cast ever came" — the exact framing finding 4 exists to retire, about that exact arm. The phone's freeze returned 19:57:05.429 and its window shut ~19:57:08.43; the arm went in at 19:57:09.330, 0.9s late (verified). It is the third of the three timeouts the report already counts as "0.9s late". Now attributed to the ordering race, which also makes run A's missing experiment the same failure mode as the rest of the pilot rather than an unexplained one-off. F21: finding 2's topic sentence was refuted by its own supporting clause after "good" was dropped — run B did combine an aim with a live position at the lip. Reframed to the real distinction: no seat tested a *reasoned* aim from the lip. F22: pilot 2 did record a Freeze Stars figure (~0.7s, PILOT-2026-08-11-run2.md finding 5); the round-3 grep that said otherwise was wrong and I adopted it. Both pilots 1 and 2 are now excluded for the right reason — seat-rounded figures, not driver elapsedMs. Heading no longer calls a 10ms union span a "drift" (the largest excursion past pilot 3's band is 3ms). F23: the timestamp convention's third version over-corrected — "all the armed and move times in Ways 1-3" swept in two reply stamps. Enumeration dropped entirely in favour of the general rule plus the 90s example. F24: "Rails first" still framed the solution as two numbers with 628 as "the yardstick for how close it got" — the framing F17 retracted 190 lines later. Now three numbers including untilX:780, with both rails untilX values restored to the walkthrough, and the yardstick claim gone. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bzc67cZUU2qehEV4mQR1sK
Adversarial review — CLEAR TO MERGE (rounds: 4)Docs-only, but run as a full loop rather than skipped: this report's entire value is that its numbers check out, and its predecessor carries a standing in-document correction for a death table built from partial data.
Waived by Kyle: F20–F24 — "Waive re-verify, merge", after four rounds in which severity decayed from a thesis-level error to sentence-level wording, with the round-4 blocker's arithmetic recomputed by the author against the transcripts. Follow-ups (nice-to-have): F10 harness half — Coverage: complete — every round recorded What the loop actually caughtThree of the four rounds found a defect in the previous round's fix, all in the same passage, each an overcorrection of the last: no-run-up (false) → blind-players-cannot-aim (contradicted by run A) → 620-was-a-good-aim (unsound comparison) → the current text, which grades nothing and says only what the record carries. Round 4 verified the Both death tables were verbatim-correct from round 1 — the failures were all in derived claims, which is the opposite of pilot 3's failure mode and is what the Zero-context reviewer + neutral judge on disputes (2 upheld, 2 upgraded, 0 overruled); anchored at |
Pilot 4 of the Constellation co-op playtest — two runs against constellation
604a422, the first co-op play since the landing-triggered platform fix (#40) and this repo's telemetry fixes (#21) both landed. Docs-only.Rails verified first:
verify-rails.shcleared planet-1 on attempt 1 against the fixed level, so both runs test the pair, not a broken level.Result
No clear in either run, but the wall moved to exactly where the game fix was supposed to put it, and this pilot measures the new one instead of guessing at it.
platformCountobservations) and ~3m52s (run B). Pre-Add environment variable support for TUI renderer preview line limits earendil-works/pi#40 they would have expired at 5.0s. Pilot 3's headline recommendation is implemented and behaves as specified.diedAtclosed the misattribution arc. Fifteen deaths across two runs, every one reported at a real site. Pilot 3's finding fix(handoff): review follow-ups F5-F10 #3 — a cast requested against a hazard 570px from the actual death — did not reproduce.jumpAtX: 680is commanded past the lip, and from x=640 there is no run-up left. The spot that is safe to wait in is the spot that cannot make the jump.arm-timeoutis a cast/arm ordering race, not "no cast came" as the design doc assumed. All three timeouts began after the freeze window had already closed (4.1s, 1.8s, 0.9s late); two blocked both seats simultaneously for ~88s. The inverse also held — when the laptop armed first and waited, it worked both times, including one 43s hold.arm-firedis a false green light. Three run-B arms fired in 61ms on an already-running freeze; two died within 0.2s of the thaw, at x=268 and x=276.Both laptop seats were killed by
GenerateContentInputTokensPerModelPerMinute-FreeTier(~3.5 min and ~5.5 min). That is the known fail-fast-by-design path (BACKLOG Active item 5) and was recorded as a finding, not patched mid-pilot.Method note
Death tables are built exclusively from driver-logged
/moveevents — the correction pilot 3 needed after its first draft reconstructed deaths from partial data. Three derived numbers (freeze-window closures, platform spans, and two thaw-timing coincidences) are flagged as arithmetic in the honesty caveats, with the video named as the way to falsify them.🤖 Generated with Claude Code
https://claude.ai/code/session_01Bzc67cZUU2qehEV4mQR1sK