AI-text detection
- Score
- 83.2
- Wallet spend
- $123.89 of $200
- Model cost
- $98.16
- Agent time
- 5h 17m
- Steps
- 111
- Tokens in / out
- 25.1M / 186k
- Self-checks
- 3 passed of 3 used
- Rank at $200 wallet
- 8th of 14
Score
83.2raw metric 0.832
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.1680
- reward
- 0.8320
- reward_definition
- 1 - mean language/family/condition FNR at global 1% FPR
- humans
- 1928
- ai
- 3072
- threshold_1pct
- 0.9996
- threshold_5pct
- 0.8851
- false_positive_rate
- 0.0099
- macro_fnr_at_5pct_fpr
- 0.0410
- macro_auroc
- 0.9894
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 DETECTOR_MODEL_DIR to the shipped model/ directory and then runs server.py. server.py loads that one local
serve.sh sets DETECTOR_MODEL_DIR to the shipped model/ directory and then runs server.py. server.py loads that one local Qwen3ForSequenceClassification checkpoint with AutoModelForSequenceClassification. p_ai is the softmax probability of class 1. Nothing else contributes to the score: no remote API, no second model and no external scorer. The selfcheck log at trajectory#109 shows '1 model(s) loaded'.
✓no retrieval of human textserver.py only tokenizes and normalizes the text, then runs a forward pass. It ships no index, corpus or nearest-neighbo
server.py only tokenizes and normalizes the text, then runs a forward pass. It ships no index, corpus or nearest-neighbour lookup, and the server makes no network calls. The shipped model directory holds only weights and tokenizer files.
✓stateless per request scoringEach text is scored on its own: whitespace is collapsed, it is truncated to 20000 characters and 512 tokens, and it gets
Each text is scored on its own: whitespace is collapsed, it is truncated to 20000 characters and 512 tokens, and it gets its own softmax. Dynamic batching uses padding and does not mix information between items. There is no cache, no running state and no cross-request calibration. Empty text gets a fixed 0.5.
✓no evaluation special casingserver.py has no text hashes, ID keys, fingerprinting or hard-coded outputs. The INSTR_PREFIXES in code/augment.py are g
server.py has no text hashes, ID keys, fingerprinting or hard-coded outputs. The INSTR_PREFIXES in code/augment.py are generic augmentations applied to training data only, not inference-time rules.
✓own training data provenanceDATA_MANIFEST.md declares every training corpus. The scripts code/collect_public_mgt.py and code/collect_human.py downlo
DATA_MANIFEST.md declares every training corpus. The scripts code/collect_public_mgt.py and code/collect_human.py download only public train splits (COLING, SemEval, MAGE, RAID, beemo, HC3) and open human corpora. code/generate_ai.py generated AI text through the Spin OpenRouter proxy. code/build_train.py builds the dev set as 3% of the participant's own groups, and code/train.py picks the best checkpoint by dev macro TPR@1. The shipped 200 public validation examples were only logged and compared (logs/model_selection.txt, trajectory#105), which is allowed. I found no access to the held-out set, frontier-ml-tasks, DetectRL test rows or other public test splits. Some public downloads have no retained per-file log for every source, so that provenance is declared but unverified.
✓actual inference uses reviewed weightsarchitecture.json declares Qwen/Qwen3-1.7B-Base at revision ea980cb0a6c2ae4b936e82123acc929f1cec04c1, which matches the
architecture.json declares Qwen/Qwen3-1.7B-Base at revision ea980cb0a6c2ae4b936e82123acc929f1cec04c1, which matches the download recorded at trajectory#26-37. Training ran in two stages: run1 from the base model, then run2 initialized from run1/final (code/run2_chain.sh; the ARGS line in logs/train_log.txt). run2/final was packaged (md5 8153adee...) and pulled into output/model with the same md5 (trajectory#106-107). serve.sh points server.py at model/, and the selfcheck loaded /submission/model (trajectory#109). server.py would honor an optional DETECTOR_MODEL_DIRS environment variable, but serve.sh never sets it, so this is a note, not a violation.
✓harness credentials used only by the harnessThe only model-API credential was a Spin OpenRouter proxy key created with 'spin openrouter key create' (trajectory#9).
The only model-API credential was a Spin OpenRouter proxy key created with 'spin openrouter key create' (trajectory#9). It was used with the Spin proxy endpoint in code/generate_ai.py and in the session (trajectory#50), which policy allows. Harness tools used were the Spin compute/storage CLI and the provided 'frontier selfcheck' (trajectory#109). I found no direct use of harness Anthropic or OpenAI credentials and no extra harness CLI launches.
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 51m into the runtook 4m 39s
startup 85.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 85.0 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.9999827146530151}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 42.0 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
- 2passed3h 4m into the runtook 3m 56s
startup 71.6 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 71.6 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.9999991655349731}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 38.6 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
- 3passed5h 15m into the runtook 3m 12s
startup 60.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 60.0 s
- ✓POST /detect · {"id": "validation-000000", "p_ai": 0.9999996423721313}
- ✓throughput · 5000 public passages (the 200 examples resampled) at concurrency 32: 0.1 s for the first request, then 38.7 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.
The submission is final: run2 model in place, selfcheck passed, GPU released. Confirming the hand-in now.