Inverse dynamics model
- Score
- 19.7
- Wallet spend
- $1.36 of $50
- Model cost
- $24.16
- Agent time
- 1h 31m
- Steps
- 195
- Tokens in / out
- 38.8M / 134k
- Self-checks
- 3 passed of 3 used
- Rank at $50 wallet
- 14th of 14
Score
19.7raw metric 0.1974
The score is the raw metric (micro action F1), which already runs from 0 to 1, times 100.
Verifier details
- metric
- micro_action_f1
- tp
- 120
- fp
- 177
- fn
- 799
- precision
- 0.4040
- recall
- 0.1306
- failed_clip_limit_percent
- 5
- dropped_actions
- 0
- elapsed_seconds
- 178.2255
- deadline_seconds
- 3600
- request_timeout_seconds
- 300
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.
✓training data provenanceThe training corpus is declared in architecture.json and TRAINING.md as the public anaisleila/computer-use-data-psai tra
The training corpus is declared in architecture.json and TRAINING.md as the public anaisleila/computer-use-data-psai train shard data/train-00000-of-00016.parquet. The submission keeps the download command (download_corpus.sh, using hf_hub_download), the extraction script (extract_train.py) and the logs (extract.log: 205 rows, 250 clips; train.log: 200 train / 50 holdout). The holdout is cut from the same train shard. The trajectory shows the PSAI extraction running on the compute lease. p-doom/idm-eval, the private task data and other benchmarks' validation or test splits were not used. The single shipped public validation example was used only to score infer.predict, which the 2026-09-29 operator decision allows.
✓non specialist initializationtrain_idm.py builds the encoder with timm.create_model('mobilenetv3_small_100', pretrained=True, in_chans=6), which load
train_idm.py builds the encoder with timm.create_model('mobilenetv3_small_100', pretrained=True, in_chans=6), which loads general ImageNet-1k weights, and adds new Linear heads. The trajectory shows the same code being written and run. The model/pairnet.pt inventory matches that design: MobileNetV3-small enc.* tensors with a conv_stem of shape [16,6,3,3]. No IDM-specialist checkpoint such as p-doom/idm was downloaded or loaded.
✓actual inference uses reviewed weightsserve.sh runs server.py, which loads model/pairnet.pt through infer.load_model, rebuilding the same architecture with pr
serve.sh runs server.py, which loads model/pairnet.pt through infer.load_model, rebuilding the same architecture with pretrained=False plus load_state_dict. Its /actions endpoint passes the uploaded video to infer.predict. predict() then discards the model and produces outputs from hand-written OpenCV rules (scroll, mouse-move and text-key detectors) applied to frames that ffmpeg decodes from the received video. Under the 2026-10-03 operator decision, rules may replace the model and an unused checkpoint is not a violation. Serving has no lookup tables, no use of request ids or hashes, and no remote model calls. The checkpoint it loads matches the declared and reviewed training.
✓harness credentials used only by the harnessIn the trajectory, the participant used only spin compute commands, HF_TOKEN-based Hugging Face downloads (allowed) and
In the trajectory, the participant used only spin compute commands, HF_TOKEN-based Hugging Face downloads (allowed) and a web search for PyTorch wheel URLs. The openrouter subcommand appears only in spin --help output (step 10) and was never called. No step reads or uses harness API keys or base URLs, and no step launches another agent harness.
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.
- 1passed1h 18m into the runtook 3m 22s
startup 79.5 s of 300 s; 3/3 gates passed; Grading's 43-clip batch was sampled: 8 copies of the public clip in their 670 s share of the 3600 s deadline; its time and failed clips were projected from them.
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 79.5 s
- ✓POST /actions · {"actions": 6, "dropped_actions": 0, "warning": null, "first": [{"frame": "F01", "type": "MouseMove", "details": "-10,72"}, {"frame": "F05", "type": "MouseMove", "details": "23,-11"}, {"frame": "F06", "type": "MouseMove", "details": "70,-8"}]}
- ✓slowest request · 9 clips one at a time, each from its first attempt to its last (retries included), median 3.98 s, the first (cold) 3.76 s
- ✓43 clips one at a time · grading's request loop (validate.py run()) on 8 copies of the public clip: 32.0 s on the server the smoke request warmed up, 171.9 s for 43 (projected from 8 of 43 requests at concurrency 1), plus 0.0 s the cold first clip took over the median; held-out clips differ
- ✓failed clips · none of 8 (0 needed a retry)
- ✓healthy after requests
- 2passed1h 23m into the runtook 3m 39s
startup 83.3 s of 300 s; 3/3 gates passed; Grading's 43-clip batch was sampled: 8 copies of the public clip in their 670 s share of the 3600 s deadline; its time and failed clips were projected from them.
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 83.3 s
- ✓POST /actions · {"actions": 9, "dropped_actions": 0, "warning": null, "first": [{"frame": "F01", "type": "MouseMove", "details": "-10,72"}, {"frame": "F03", "type": "MouseClick", "details": "Left"}, {"frame": "F05", "type": "MouseMove", "details": "23,-11"}]}
- ✓slowest request · 9 clips one at a time, each from its first attempt to its last (retries included), median 4.64 s, the first (cold) 4.80 s
- ✓43 clips one at a time · grading's request loop (validate.py run()) on 8 copies of the public clip: 37.0 s on the server the smoke request warmed up, 198.8 s for 43 (projected from 8 of 43 requests at concurrency 1), plus 0.2 s the cold first clip took over the median; held-out clips differ
- ✓failed clips · none of 8 (0 needed a retry)
- ✓healthy after requests
- 3passed1h 28m into the runtook 3m 7s
startup 67.8 s of 300 s; 3/3 gates passed; Grading's 43-clip batch was sampled: 8 copies of the public clip in their 670 s share of the 3600 s deadline; its time and failed clips were projected from them.
7 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 67.8 s
- ✓POST /actions · {"actions": 8, "dropped_actions": 0, "warning": null, "first": [{"frame": "F01", "type": "MouseMove", "details": "-10,72"}, {"frame": "F05", "type": "MouseMove", "details": "23,-11"}, {"frame": "F06", "type": "MouseMove", "details": "70,-8"}]}
- ✓slowest request · 9 clips one at a time, each from its first attempt to its last (retries included), median 4.19 s, the first (cold) 4.17 s
- ✓43 clips one at a time · grading's request loop (validate.py run()) on 8 copies of the public clip: 33.7 s on the server the smoke request warmed up, 181.0 s for 43 (projected from 8 of 43 requests at concurrency 1), plus 0.0 s the cold first clip took over the median; held-out clips differ
- ✓failed clips · none of 8 (0 needed a retry)
- ✓healthy after requests
The agent's last message before its session ended.
The submission is in. /workspace/output was handed in at 14:50 UTC and the session ends there.
What it serves is a POST /actions endpoint that reads a five-second MP4 and returns frame-labeled actions. On the one labeled example it scores micro F1 0.73 (8 true positives, 0 false positives): five mouse moves, the scroll, Cmd+A, and Backspace.
The predictions come from the video itself:
- A scroll is a vertical shift that a grid of textured patches agrees on.
- A mouse move is a cursor-sized sprite that leaves one place and arrives at another in the same quiet frame pair.
- A selection is a text block that turns blue; deleting that selection turns the same kind of block dark and removes its edges.
A MobileNetV3-Small pair encoder was fine-tuned on the train split of anaisleila/computer-use-data-psai and is loaded at startup. Its heads are not used for predictions: on that corpus the scroll head stayed near 0.33 precision, the key head near 0.33, and the click head never learned. A wide-change click rule that caught the example's dialog was also dropped, because on the training clips it fired about twenty times for every real click.
The grading-style check passed on an H100: ready in 68 seconds, about 4 seconds per clip, no failed requests.