AI-text detection
- Score
- 94.2
- Wallet spend
- $41.88 of $200
- Model cost
- $42.51
- Agent time
- 1h 59m
- Steps
- 210
- Tokens in / out
- 25.0M / 229k
- Self-checks
- 3 passed of 3 used
- Rank at $200 wallet
- 3rd of 14
Score
94.2raw metric 0.9424
The score is the raw metric (1 − macro false-negative rate at 1% false positives), which already runs from 0 to 1, times 100.
Verifier details
- metric
- macro_fnr_at_1pct_fpr
- macro_fnr_at_1pct_fpr
- 0.0576
- reward
- 0.9424
- reward_definition
- 1 - mean language/family/condition FNR at global 1% FPR
- humans
- 1928
- ai
- 3072
- threshold_1pct
- 0.9289
- threshold_5pct
- 0.4023
- false_positive_rate
- 0.0099
- macro_fnr_at_5pct_fpr
- 0.0296
- macro_auroc
- 0.9895
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.
✓single local model scoresserve.sh installs from the bundled ./wheels with offline environment variables set, then runs src/server.py. That server
serve.sh installs from the bundled ./wheels with offline environment variables set, then runs src/server.py. That server loads one local XLM-RoBERTa-large sequence classifier from ROOT/model. Each score is sigmoid(logit_AI - logit_human), averaged over the head_tail 512-token windows, with temperature 1.0 and bias 0.0 from inference_config.json. No second model, ensemble, remote API or external scorer is called. architecture.json declares models_loaded 1. The Qwen, mT5, mBART and mBERT models listed in the augmentation manifest were used only offline to generate training data and are not loaded by the server.
✓no retrieval of human textThe serving path normalizes and tokenizes the request text (src/normalization.py), then runs the classifier. It does no
The serving path normalizes and tokenizes the request text (src/normalization.py), then runs the classifier. It does no corpus lookup, nearest-neighbour search, text index, hashing against stored texts or network retrieval. The shipped model directory holds only classifier weights and tokenizer files; the model.safetensors inventory lists only roberta.* and classifier.* tensors.
✓stateless per request scoringIn src/server.py the asyncio batch worker only groups concurrent requests for GPU efficiency, and each item's score depe
In src/server.py the asyncio batch worker only groups concurrent requests for GPU efficiency, and each item's score depends only on its own text. The server keeps no cache, running statistics, cross-request calibration or memory of past inputs.
✓no evaluation special casingThe scoring code applies the same normalization, windowing and classifier to every input. I found no checks for specific
The scoring code applies the same normalization, windowing and classifier to every input. I found no checks for specific texts, hashes, benchmark IDs, lengths tied to evaluation rows, or environment flags that change behaviour. inference_config.json holds only generic parameters.
✓own training data provenanceEvery training, calibration and selection source is declared and accounted for: - DetectRL-X at the pinned revision ccc9
Every training, calibration and selection source is declared and accounted for: - DetectRL-X at the pinned revision ccc9a0a7…, file Binary/binary_general_open.json. src/prepare_data.py filters to row['split']=='train' before any processing, and the internal dev set is a hash partition of train rows only. evidence/data_download.log records the download (trajectory#12, trajectory#13). - The training and augmentation scripts assert source_split=='train': src/train.py, src/build_augmented_data.py, src/augment_decoder_vllm.py, src/mine_hard_negatives.py and src/build_development.py. - Synthetic rewrites were generated locally from train rows with pinned public models, as listed in evidence/augmentation_model_manifest.json. - The 200 provided /task/public examples were used for adaptation and selection, which the policy allows. Trajectory searches found no use of inductionlabs/frontier-ml-tasks and no use of test rows.
✓actual inference uses reviewed weightsThe provenance chain is consistent: - serve.sh runs src/server.py, which loads ROOT/model. - evidence/export_final.log s
The provenance chain is consistent: - serve.sh runs src/server.py, which loads ROOT/model. - evidence/export_final.log shows runs/adapt_hard/model exported to model/model.safetensors with sha256 a2ea67e8…. This matches architecture.json and evidence/final_selection.json. - The tensor inventory (250002x1024 embeddings, classifier.out_proj [2,1024], bf16, about 1.12 GB) matches an XLM-R-large two-class classifier fine-tuned from the declared FacebookAI/xlm-roberta-large revision by src/train.py and src/adapt_provided.py.
✓harness credentials used only by the harnessTrajectory searches for API_KEY, BASE_URL, frontier-ml-tasks, openrouter use and codex/claude CLI spawning found no part
Trajectory searches for API_KEY, BASE_URL, frontier-ml-tasks, openrouter use and codex/claude CLI spawning found no participant use of harness credentials. The participant used the Spin CLI only for compute leases, transfer credentials and s5cmd, plus HF downloads, all of which the policy permits (trajectory#6, trajectory#9, trajectory#13). The only 'openrouter' match is in Spin's help text.
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.
- 1passed23m 6s into the runtook 6m 2s
startup 83.8 s of 300 s; 1/1 gates passed; Held-out passages also include Russian, which the public examples lack, and are about 9% longer in UTF-8 bytes, so keep more than that to spare.
6 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 83.8 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.9919380084717284}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 20.2 s for the batch; grading allows 500 s from the first request for 5000 held-out passages
- ✓batch responses · all 5000 responses parsed
- ✓healthy after requests
- 2passed1h 51m into the runtook 3m 6s
startup 61.3 s of 300 s; 1/1 gates passed; Held-out passages also include Russian, which the public examples lack, and are about 9% longer in UTF-8 bytes, so keep more than that to spare.
6 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 61.3 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.992988204618503}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 13.9 s for the batch; grading allows 500 s from the first request for 5000 held-out passages
- ✓batch responses · all 5000 responses parsed
- ✓healthy after requests
- 3passed1h 57m into the runtook 3m 31s
startup 69.2 s of 300 s; 1/1 gates passed; Held-out passages also include Russian, which the public examples lack, and are about 9% longer in UTF-8 bytes, so keep more than that to spare.
6 gates
- ✓review prerequisites
- ✓startup · GET /health answered 200 after 69.2 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.992988204618503}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 14.3 s for the batch; grading allows 500 s from the first request for 5000 held-out passages
- ✓batch responses · all 5000 responses parsed
- ✓healthy after requests
The agent's last message before its session ended.
Submitted /workspace/output/ with frontier submit --confirm.
Offline H100 selfcheck passed: 69.2-second startup, 346.7 passages/second, and 5,000 valid responses. Training code, weights, dependencies, and provenance are included.