Add task: flightgear-atc-clearance-compliance-ledger - #105
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b6976877-9999-4f0e-9824-1892d960b6af
|
Hi @JordanPeng, thanks for the PR, ATC clearance compliance from sim footage is an interesting one! Generated FlightGear media on HF is fine with me; treat that as the #95 sign-off. The calibration hygiene here is genuinely good (paired events, coherent timestamps, all five ablations measured, network-isolated runs) — the remaining work is the scorer and one harness-parity problem, in priority order: 1. Observability first (feasibility gate)
2. Then the scorer
3. Harness parity
Mechanical
|
Observability. The audit now covers all 65 events / 235 snapshots rather than 19, and adds two arguments that need no video: heading and airspeed holds land exactly on the commanded value while altitude carries a systematic -27.14 ft +/- 7.95 offset nothing in the video reveals, and the state and timing tolerances contradicted each other on 47 of 65 clearances at 25/2/2. Rather than widen bands, each snapshot is now compared against the trajectory interpolated to the timestamp the answer itself reports, so an honest but slightly-off timestamp is paid for once, out of the timing group, instead of twice. Scorer. 0.9 * exact_leg_accuracy + 0.1 * clearance_chain_f1 is replaced by graded per-clearance credit out of 20 units across six field groups, each clearance discounted by what a transcript alone could have earned on it. The audio-only ablation, which used to beat every video-inclusive run at 0.0031, now scores 0.0000. Matching is global on command_type and a 2 s issue window; the issued_time_s // 720 leg bucketing that stranded a prediction landing a fraction of a second across a hard cut is gone. check_event now bounds both clearance_index and superseded_by_index by MAX_PREDICTIONS, so an oversized index costs one clearance instead of raising OverflowError outside the ValueError contract and zeroing the whole submission. Harness parity. The Opus 4.8 row is re-run natively with claude -p on the shipped instruction.md byte for byte, with no wrapper prompt and no agent-host path. It scores 0.0000. The agent-host round it replaces is retained as a release asset, and the residual Codex/Antigravity instruction gap is documented per row rather than smoothed over. Trajectories. Ablation and replaced-round trajectories are hash-pinned release assets. The native Claude trajectory is committed in condensed form -- streaming deltas and image bytes dropped, all 147 tool calls and results intact -- with the raw 15 MB file pinned as an asset and condense_trajectory.py regenerating the committed copy from it byte for byte. Validation: 49 unit tests green, oracle 1.0000, null 0.0000, all five ablations 0.0000, 29,100 video-free shortcut probes all 0.0000, and check_task.py passes all five gates at agent reward 0.0938 over 88 turns. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Maintainer feedback, item by item1. Observability audit — all 65 events
Rather than widen bands to paper over that, each snapshot is now compared against the trajectory interpolated to the timestamp the answer itself reports. An exact timestamp still gets the strict band; a late-but-honest answer is read where it claims to be and pays for the shift out of the timing group instead of twice. Verified in the script: +1 s coherent shift → 260/260 state units, reward 1.0000; +2 s → 244/260, 0.5987; +4 s → 216/260, 0.5203. Under the old scorer all three scored 0. Two caveats are stated in the audit README rather than glossed: 2. Scorer — graded per-clearance credit
Each clearance is discounted by what a transcript-only ledger could have earned on that same clearance (953 of 1300 units, leaving 60 of 65 gradable), the signed gain is clipped to [−1, 1] so a below-transcript reading subtracts rather than clipping to zero, and unmatched submissions are charged as padding. The inversion the comment flagged is resolved. Audio-only went 0.0031 → 0.0000, and it no longer beats anything. It still earns 252/260 target units from the spoken numbers, but only 86/260 instrument-snapshot units — and those are exactly the values the transcript predicts, so they clear no headroom. Leg-boundary fix. Matching is global on Null / guessing / gate, re-verified:
Adversarial probing beyond the required ablations is now a committed, reproducible script —
3. Harness parity — Claude re-run nativelyThe Opus 4.8 row is now a native Result: Fixing this surfaced a second parity gap I had not reported before: the Codex and Antigravity rows still run an earlier 4. Mechanical — trajectories retainedAll five ablation trajectories and both replaced rounds are hash-pinned release assets: https://github.com/JordanPeng/agentic-vbench/releases/tag/flightgear-calibration-20260827 — public, sha256s listed in The native Claude trajectory is the one exception, and it uses the same mechanism. Raw, python3 calibration/rollouts/condense_trajectory.py FULL.jsonl out.jsonl
cmp out.jsonl calibration/rollouts/claude-opus-4.8-native.jsonlIt drops 12,735
Independent review passAn independent reviewer checked the branch against your comment and the repo's authoring rules before this update. Its one substantive finding is fixed: The reviewer also independently re-verified the leg-boundary fix at every 720 s cut in both directions, confirmed all release assets download hash-identical, found no leaked host paths in the native trajectory, and confirmed Things I did not resolve, flagged rather than buried
Verification |
|
Closes #95.
Summary
Adds
flightgear-atc-clearance-compliance-ledgertoagentic_vbench_understanding. The task reconstructs 65 ATC clearances and their visible aircraft-response chains across five independent 12-minute FlightGear C172P legs.Data and scoring
0.9 * exact_leg_accuracy + 0.1 * clearance_chain_f1.1.0; null0.0.Calibration
All required rows are below
0.10. All five degraded-input runs remain near the null baseline.Validation
scripts/understanding/check_task.pypasses structure, media, score, and rollout-length checks.1.000, 0 exceptions.1.0, null0.0.