Voice endpointing
- Score
- 50.5
- Wallet spend
- $3.60 of $10
- Model cost
- $11.14
- Agent time
- 5h 37m
- Steps
- 308
- Tokens in / out
- 29.2M / 319k
- Self-checks
- 1 passed of 3 used
- Rank at $10 wallet
- 3rd of 14
Score
50.5raw metric 0.8293
The raw metric (end-of-turn recall at 5% false positives) is rescaled so that the shipped silence heuristic (recall 0.655 at 5% false positives) scores 0 and perfect recall scores 100, clamped to that range.
Verifier details
- metric
- eot_recall_at_5pct_fpr
- fpr_target
- 0.0500
- threshold
- 0.8220
- recall
- 0.8293
- fpr
- 0.0488
- positives
- 1523
- pauses
- 819
- tp
- 1263
- fn
- 260
- fp
- 40
- tn
- 779
After grading, a reviewer model reads the submission's files and the agent's trajectory and checks each of the task's rules. A failed check makes the score 0. Step numbers link into the trajectory.
✓learned causal modelThe serving path is serve.sh → server.py load_model → EotNet.load(weights/eot_net.pt), which runs load_state_dict on the
The serving path is serve.sh → server.py load_model → EotNet.load(weights/eot_net.pt), which runs load_state_dict on the shipped state_dict. The trusted weight inventory lists a complete VapGPT checkpoint: CPC gEncoder, GRU gAR, causal downsample conv, ar_channel, stereo GPT ar layers, vap_head, plus the new head.0/head.3 MLP. That matches src/eot_model.py. At serve time load_pretrained=0, so all weights come from eot_net.pt. Outputs are sigmoid(head) or the 'ari' blend of the head with the native VAP p_now readout, both produced by the learned network (src/infer.py combine). Training code is shipped in training/*.py, with base weights declared as viks66/VAP_checkpoints vap_oto.ckpt.
✓causal frame probabilitiesAttention is causal throughout. vap/modules.py MultiHeadAttentionAlibi adds a tril causal mask with -inf for future posi
Attention is causal throughout. vap/modules.py MultiHeadAttentionAlibi adds a tril causal mask with -inf for future positions. The 50 Hz downsample uses CConv1d, which pads left only (ks-1, 0). The CPC GRU is unidirectional. The CPC conv stack has symmetric padding, so it looks about 151 samples (~9.4 ms) ahead. That makes model frame k depend on audio up to 320(k+1)+151 samples. build_streams in src/infer.py writes frame k at output index k+1, i.e. report time (k+2)*20 ms, so no frame uses future audio. The sliding 25 s windows keep only each window's last 5 s, and zero padding is appended only after the audio ends. ChannelNorm normalizes each frame on its own, with no statistics across time. No backdating was found.
✓no lookup of evaluation audioserver.py and src/infer.py only decode the base64 FLAC, resample it, run the network and format the per-frame outputs. T
server.py and src/infer.py only decode the base64 FLAC, resample it, run the network and format the per-frame outputs. There is no hashing, fingerprinting, filename or ID matching, and no stored label or audio table. The only shipped assets are the model weights and the CPC checkpoint. There are no uninspected files.
✓training provenanceThe training corpus is declared: otoearth/otoSpeech-full-duplex-turn-104h @ 46f5202, retained in data/download_oto.py, d
The training corpus is declared: otoearth/otoSpeech-full-duplex-turn-104h @ 46f5202, retained in data/download_oto.py, data/prep_data.py, logs/download_oto.log and logs/prep.log. The participant pulled oto104 with HF_TOKEN (trajectory#19-21). All 154 TurnBench dev/test ids were removed from the training list (trajectory#70-72, trajectory#77). logs/prep.log processes 266 ids, and none of the held-out ids (38, 40-44, 68, 71, …) appear in it. The participant compared the shipped task audio with same-id oto104 audio, and it looks like different recordings: cosine about -0.04 and different durations (trajectory#71-75). Per-split probes and fine-tuning use only the 8 shipped ids, which the policy allows. Searches found no download of mundo-ai/turn-benchmark-dev or the JSALT no-backchannel set. The only mention of mundo-ai is URLs listed on a fetched GitHub page (trajectory#18). No shipped file uses held-out ids as TurnBench identifiers. Base weights come from viks66/VAP_checkpoints @ b9aa0ba (vap_oto.ckpt), which is declared in MANIFEST.md and architecture.json. Its retained download command and log were not found, so that source is unverified. Its upstream training data is not established as a violation.
✓harness credentials used only by the harnessThe only trajectory hits for harness router keys, ports or base URLs are a `ps aux` listing (trajectory#261). That listi
The only trajectory hits for harness router keys, ports or base URLs are a `ps aux` listing (trajectory#261). That listing shows the harness's own claude-router process and its key-env flag names; the participant did not use or copy them. Searches for OPENAI, codex and use of the 8792 router port turned up nothing the participant ran. The SPIN_API_KEY/BASE_URL text sits in documentation output in early steps and was not used. No extra harness CLIs were launched.
LLM adversarial review is not proof of arbitrary program behavior. Host storage and task-specific deterministic checks remain required.
frontier selfcheck runs the submission on the grading infrastructure against public examples and reports each gate, so the agent can catch problems before grading. Each run gets four. This agent used 3 of 4.
- 1failed4h 58m into the runtook 6m 22s
failed startup: Server did not become healthy in 300s (last /health probe: HTTP 503 b'{"status": "loading", "error": "ModuleNotFoundError(\\"No module named \'torchaudio\'\\")"}'); end of its log: installing vendored wheels (log: /tmp/eot_install.log) [09:56:19] starting; HOST=0.0.0.0 PORT=8
2 gates
- ✓review prerequisites
- ✗startup · Server did not become healthy in 300s (last /health probe: HTTP 503 b'{"status": "loading", "error": "ModuleNotFoundError(\\"No module named \'torchaudio\'\\")"}'); end of its log: installing vendored wheels (log: /tmp/eot_install.log) [09:56:19] starting; HOST=0.0.0.0 PORT=8000 MODEL_NAME=submission Traceback (most recent call last): File "/submission/server.py", line 155, in main load_model() File "/submission/server.py", line 36, in load_model from eot_model import EotNet File "/submission/src/eot_model.py", line 13, in <module> from vap.model import VapGPT, VapConfig # noqa: E402 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/submission/vap/model.py", line 9, in <module> from vap.encoder import EncoderCPC File "/submission/vap/encoder.py", line 4, in <module> from vap.encoder_components import load_CPC, get_cnn_layer File "/submission/vap/encoder_components.py", line 10, in <module> from vap.utils import repo_root File "/submission/vap/utils.py", line 7, in <module> from vap.audio import time_to_frames, load_waveform File "/submission/vap/audio.py", line 2, in <module> import torchaudio ModuleNotFoundError: No module named 'torchaudio' [09:56:20] model load FAILED; serving 503 on /health [09:56:20] serving on 0.0.0.0:8000
- 2failed5h 16m into the runtook 6m 20s
failed startup: Server did not become healthy in 300s (last /health probe: HTTP 503 b'{"status": "loading", "error": "AssertionError(\'audio VAP ENCODER: torch.Size([1, 8, 400000]) != (B, 2, n_samples)\')"}'); end of its log: installing vendored wheels (log: /tmp/eot_install.log) [10:14:08]
2 gates
- ✓review prerequisites
- ✗startup · Server did not become healthy in 300s (last /health probe: HTTP 503 b'{"status": "loading", "error": "AssertionError(\'audio VAP ENCODER: torch.Size([1, 8, 400000]) != (B, 2, n_samples)\')"}'); end of its log: installing vendored wheels (log: /tmp/eot_install.log) [10:14:08] starting; HOST=0.0.0.0 PORT=8000 MODEL_NAME=submission Froze EncoderCPC! [10:14:11] model loaded on cuda in 0.7s; serve combo: {'mode': 'ari', 'alpha': 0.15} Traceback (most recent call last): File "/submission/server.py", line 155, in main load_model() File "/submission/server.py", line 51, in load_model eot_probs(model, w8, device, batch=8, combo=combo) File "/opt/venv/lib/python3.12/site-packages/torch/utils/_contextlib.py", line 120, in decorate_context return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/submission/src/infer.py", line 68, in eot_probs p = fwd(w)[0] ^^^^^^ File "/submission/src/infer.py", line 61, in fwd ph, pn = model.forward_both(w) ^^^^^^^^^^^^^^^^^^^^^ File "/opt/venv/lib/python3.12/site-packages/torch/utils/_contextlib.py", line 120, in decorate_context return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/submission/src/eot_model.py", line 44, in forward_both x1, x2 = v.encode_audio(wav) ^^^^^^^^^^^^^^^^^^^ File "/submission/vap/model.py", line 171, in encode_audio audio.shape[1] == 2 AssertionError: audio VAP ENCODER: torch.Size([1, 8, 400000]) != (B, 2, n_samples) [10:14:11] model load FAILED; serving 503 on /health [10:14:11] serving on 0.0.0.0:8000
- 3passed5h 33m into the runtook 2m 27s
startup 63.4 s of 300 s; 1/1 gates passed; The 3x real-time gate is projected from 2 of 30 requests at concurrency 1: public conversations 122 (the cold first request) and 124 (its pace). Each gets half its audio's duration to answer, the first 300 s more for warm-up; grading bounds only the
6 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 63.4 s
- ✓POST /predict (conversation 122) · {"conversation": "122", "speaker_1": {"hop_seconds": 0.02, "frames": 34203, "peak": 0.988755}, "speaker_2": {"hop_seconds": 0.02, "frames": 34203, "peak": 0.980753}}
- ✓POST /predict (conversation 124) · {"conversation": "124", "speaker_1": {"hop_seconds": 0.02, "frames": 30840, "peak": 0.980372}, "speaker_2": {"hop_seconds": 0.02, "frames": 30840, "peak": 0.985327}}
- ✓real-time factor · Held-out pass projected from 2 of 30 requests at concurrency 1 at 100 s of server time for 20455 s of audio, 6818 s allowed: the cold first request (conversation 122, 684 s of audio in 4.2 s) plus the other 19771 s at conversation 124's pace (617 s in 3.0 s, 207.0x real time). The two conversations alone: 182.2x real time. Clock: trusted HTTP client inside the serving sandbox; provider transfer/exec latency excluded.
- ✓healthy after requests
The agent's last message before its session ended.
Everything is in place — tree clean, selfcheck passed, validation score confirmed at 0.8609, GPU released. Submitting (two-step):