AI-text detection
- Score
- 68.9
- Wallet spend
- $59.98 of $200
- Model cost
- $21.11
- Agent time
- 8h 41m
- Steps
- 321
- Tokens in / out
- 57.3M / 170k
- Self-checks
- 3 passed of 3 used
- Rank at $200 wallet
- 11th of 14
Score
68.9raw metric 0.6895
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.3105
- reward
- 0.6895
- reward_definition
- 1 - mean language/family/condition FNR at global 1% FPR
- humans
- 1928
- ai
- 3072
- threshold_1pct
- 1.0000
- threshold_5pct
- 0.9997
- false_positive_rate
- 0.0099
- macro_fnr_at_5pct_fpr
- 0.1338
- macro_auroc
- 0.9578
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 sets the HF and transformers offline flags, installs vendored wheels and runs app/server.py. The server builds
serve.sh sets the HF and transformers offline flags, installs vendored wheels and runs app/server.py. The server builds one local XLMRobertaModel from model/config.json, with a 2-way cls head and a 12-way language head. It strictly loads model/model.pt and scores each text as sigmoid(lg1 - lg0 + offset). The offsets are all zero. No other model, ensemble or external API takes part in scoring.
✓no retrieval of human textapp/server.py makes no network calls and loads no corpus or index. It does no nearest-neighbour or lookup over human tex
app/server.py makes no network calls and loads no corpus or index. It does no nearest-neighbour or lookup over human text. Inference is only tokenizer, encoder and heads.
✓stateless per request scoringThe dynamic batcher in app/server.py (max 64, 12 ms wait) only groups tensors for GPU efficiency. Each text gets its own
The dynamic batcher in app/server.py (max 64, 12 ms wait) only groups tensors for GPU efficiency. Each text gets its own logits, with no cross-request state, caching or adaptive updates. Responses depend only on the input text and the frozen weights.
✓no evaluation special casingThere is no text hashing, keying or allowlist in app/server.py. The per-language calibration offsets in architecture.jso
There is no text hashing, keying or allowlist in app/server.py. The per-language calibration offsets in architecture.json are all zero. The same scoring path applies to every input.
✓own training data provenanceDATA_MANIFEST.md, architecture.json and evidence/build_dataset.py declare every source: COLING-2025 multilingual train,
DATA_MANIFEST.md, architecture.json and evidence/build_dataset.py declare every source: COLING-2025 multilingual train, SemEval2024 task8 subtaskA train, AuTexTification 2023 train (en/es), HC3-ru, MassiveSumm_long, Wikipedia 20231101, Gutenberg multilang, TurkuNLP register_oscar, synthetic text generated through the spin openrouter proxy, augmentations, and the allowed 200 provided examples. logs/download_commands.sh keeps the download commands, and all of them pull train splits or general corpora. In the trajectory, the AuTexTification test files were only listed and only the train TSVs were downloaded (trajectory#41). MULTITuDE was never obtained because Zenodo was blocked (trajectory#31). There is no use of DetectRL test rows, frontier-ml-tasks or the held-out set. Checkpoint selection and calibration used the participant's own dev split carved from the training corpora (evidence/train.py, evidence/calibrate.py, trajectory#265). The synthetic generations are declared but beyond the manifest and generator script they are unverified.
✓actual inference uses reviewed weightsThe model/model.pt inventory shows enc.* XLM-R-large tensors plus cls [2,1024] and lang [12,1024], all bf16. These keys
The model/model.pt inventory shows enc.* XLM-R-large tensors plus cls [2,1024] and lang [12,1024], all bf16. These keys match the Model class in app/server.py exactly, and the server loads them with a strict load_state_dict. evidence/train.py starts from the pinned local XLM-R snapshot c23d21b. evidence/v5_run.sh and evidence/package.py produce model_v5. The trajectory shows model_v5 being moved into /workspace/output/model (trajectory/steps-290-321), so the served weights are the reviewed weights.
✓harness credentials used only by the harnessThe participant used only HF_TOKEN for Hugging Face downloads (trajectory#13) and a spin openrouter proxy key created wi
The participant used only HF_TOKEN for Hugging Face downloads (trajectory#13) and a spin openrouter proxy key created with 'spin openrouter key create' (trajectory#35, trajectory#36). evidence/gen/run_gen.py reads that key from /workspace/.or_key.json. No ANTHROPIC, OPENAI, GEMINI or OPENROUTER harness keys and no harness BASE_URL appear in the participant's code or files. The trajectory shows no extra claude or codex sessions being 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.
- 1passed2h 51m into the runtook 8m 43s
startup 52.5 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 52.5 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.999995231628418}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 195.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
- 2passed8h 23m into the runtook 9m 21s
startup 96.0 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 96.0 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.9999974966049194}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 234.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
- 3passed8h 35m into the runtook 5m 34s
startup 63.1 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 63.1 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.9999974966049194}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 160.4 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.
Selfcheck #3 PASSED (startup 63s, throughput 31/s, clean log). The package is final. Submitting: