Skip to content

docs(playtest): pilot 4 — the platform fix works, the wall moved to run-up - #23

Merged
ksdisch merged 5 commits into
mainfrom
docs/pilot-4-report
Aug 13, 2026
Merged

docs(playtest): pilot 4 — the platform fix works, the wall moved to run-up#23
ksdisch merged 5 commits into
mainfrom
docs/pilot-4-report

Conversation

@ksdisch

@ksdisch ksdisch commented Aug 13, 2026

Copy link
Copy Markdown
Owner

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.sh cleared 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.

  • The platform fix holds in live co-op. Bridges stood unlanded-on for ≥2m54s (run A, four direct platformCount observations) 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.
  • diedAt closed 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.
  • The new blocker is run-up, not the stopwatch. The pair parked safely at the pit lip twice (x=640/636, sentry still frozen) and could not convert: the fall edge is x≈656, so jumpAtX: 680 is 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-timeout is 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.
  • An instant arm-fired is 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 /move events — 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

ksdisch and others added 5 commits August 13, 2026 15:25
…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
@ksdisch

ksdisch commented Aug 13, 2026

Copy link
Copy Markdown
Owner Author

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.

# Severity (final) Finding Disposition
F1 critical "Safe waiting spot has no run-up" — rails cited as a running start, but it parks at untilX:620 and jumps jumpAtX:628 from a standstill Fixed in edf94981c, verified R2
F2 should-fix Way-2 thaw gaps dropped the driver's 200ms ARM_REACTION_MS and re-derived a logged elapsedMs Fixed in edf94981c, verified R2
F3 should-fix "Three arms on a stale freeze" counted one armed on platform, contradicting the report's own table Fixed in edf94981c, verified R2
F4 should-fix Arm-ordering result was 2 instances, not the 7 in the record; the lip park tracks untilX, not ordering Fixed in edf94981c, verified R2
F5 should-fix Run A's 6th solve dropped, run B's 9 solves + platform/illuminate omitted Fixed in edf94981c, verified R2
F7 should-fix (upgraded) "~6 turns/min" measured 10–11 — 1.8× in the unsafe direction, inside a (Fact) finding Fixed in edf94981c, verified R2
F8 should-fix (upgraded) Honesty caveat's quote provenance pointed at files lacking the quotes; one quote silently truncated a qualifier Fixed in edf94981c, verified R2
F6, F9 nice-to-have (upheld) Count undercounts; "both phone seats kept casting" true of one Fixed in edf94981c, verified R2
F11 should-fix "679 the only value outside pilot 3's band" false and self-contradicting Fixed in a88bac284, verified R3
F12 should-fix Replacement thesis "a blind player has no way to find the number" contradicted by run A, which derived jumpAtX:620 Fixed in a88bac284, verified R3
F13, F14, F15 nice-to-have Calibration off; timestamp convention falsified by its own tables; 24px/40px conflict Fixed in a88bac284, verified R3
F16 should-fix "Both attempts died in the patrol band" — one was arm-timeout, elapsedMs:0, never moved Fixed in ef9560857, verified R4
F17 should-fix Grading 620 "a good aim" via 8px proximity to rails' 628 — unsound, the rails call is inseparable from untilX:780 Fixed in ef9560857, verified R4
F18, F19 nice-to-have Solve-time drift overreached; convention omitted the 90s cases Fixed in ef9560857, verified R4
F20 should-fix "No cast ever came" — the exact framing finding 4 exists to retire; the arm was 0.901s late to a cast that had happened Fixed in cf437d6ad, re-verify waived
F21–F24 nice-to-have Topic sentence refuted by its own clause; pilot 2 exclusion half false; convention over-corrected; "Rails first" kept the retracted two-number framing Fixed in cf437d6ad, re-verify waived

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 — verify-rails.sh prints to stdout and retains nothing (its armed-check output goes to a mktemp it then rms), so the rails figures are the one set a reader cannot check. Tee it to logs/<date>-rails.log. Flagged in the report's appendix meanwhile.

Coverage: complete — every round recorded Coverage: complete; no bound left unclosed.

What the loop actually caught

Three 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 untilX mechanism in driver/laptop.mjs and Astronaut.ts rather than accepting it, and endorsed leaving its own unexecuted dead-band simulation out of the report.

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 diedAt work bought.

Zero-context reviewer + neutral judge on disputes (2 upheld, 2 upgraded, 0 overruled); anchored at cf437d6ad.

@ksdisch
ksdisch merged commit 4e25812 into main Aug 13, 2026
3 checks passed
@ksdisch
ksdisch deleted the docs/pilot-4-report branch August 13, 2026 21:30
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