LLM post-training
- Score
- 0.0
- Wallet spend
- $35.64 of $50
- Model cost
- $12.38
- Agent time
- 10h 25m
- Steps
- 315
- Tokens in / out
- 63.3M / 273k
- Self-checks
- 2 passed of 3 used
- Rank at $50 wallet
- 12th of 14
Score
0.0raw metric 0.1541
The raw metric (accuracy on GPQA Diamond, MATH-500, LiveCodeBench v6 and MMLU-Pro) is rescaled so that Qwen3-4B-Base itself (chance on GPQA) scores 0 and Qwen3-4B-Instruct-2507, Qwen's own post-trained model scores 100, clamped to that range; each of the 4 benchmarks is rescaled on its own and the score is their mean.
Benchmarks
| Benchmark | Raw | Floor | Ceiling | Normalized |
|---|---|---|---|---|
| gpqa_diamond | 0.0354 | 0.250 | 0.596 | 0.0 |
| math_500 | 0.442 | 0.622 | 0.956 | 0.0 |
| livecodebench_v6 | 0.0161 | 0.200 | 0.490 | 0.0 |
| mmlu_pro | 0.123 | 0.361 | 0.699 | 0.0 |
Verifier details
- metric
- four_benchmark_mean
- suite
- gpqa-math500-lcbv6-mmlupro-v6
- harmonic_mean
- 0.0397
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.
✓pinned base startTraining started from the pinned base. In trajectory#28, Qwen/Qwen3-4B-Base was downloaded at revision 906bfd4b4dc7f14ee
Training started from the pinned base. In trajectory#28, Qwen/Qwen3-4B-Base was downloaded at revision 906bfd4b4dc7f14ee4320094d8b41684abff8539 into /dev/shm/work/base. Its hashes match the local base (evidence/base_sha256_local.txt). Only the chat-template text was taken from Qwen3-4B, which the policy allows. The training run in trajectory#116 used `--model /dev/shm/work/base`. trajectory#253 resumed checkpoint-1200 to step 1500 from the same base. evidence/train.py loads its weights with AutoModelForCausalLM.from_pretrained(args.model). trajectory#291-296 traced how checkpoint-1500 reached output/model/model.safetensors, and the sha256 matched (a4638d6e…, trajectory#298). The trusted checkpoint audit passed: 398 BF16 tensors, a tied head, and a parameter count equal to the pinned base's. I found no other model, merge or substituted checkpoint.
✓no public benchmark eval trainingNo benchmark eval data was used for training. evidence/prep2.py builds the SFT data only from the training splits of ope
No benchmark eval data was used for training. evidence/prep2.py builds the SFT data only from the training splits of open-r1/OpenR1-Math-220k, nvidia/OpenCodeReasoning (split_0/split_1), open-thoughts/OpenThoughts-114k and HuggingFaceTB/smoltalk2, all declared in evidence/DATA_MANIFEST.md. The benchmark test sets loaded in load_blocklist (MATH-500, GSM8K, AIME 2024, HumanEval, MBPP, MMLU-Pro, ARC-Challenge, plus local GPQA/LCB prompts) are used only to discard contaminated rows by 13-gram or exact match (Collector.add). They are never written to training data. The trajectory steps that build the blocklist (trajectory#33-35) match this.
✓actual inference uses reviewed weightsServing uses the reviewed weights. serve.sh runs vLLM offline (HF_HUB_OFFLINE=1) with `--model "$D/model"`, i.e. the shi
Serving uses the reviewed weights. serve.sh runs vLLM offline (HF_HUB_OFFLINE=1) with `--model "$D/model"`, i.e. the shipped model/ directory. Its only weight file is model/model.safetensors, the file the trusted audit inspected (398 tensors, parameter count equal to the base's). proxy.py only forwards requests to the local vLLM at UPSTREAM=127.0.0.1:8001 and splits <think> text; it makes no external model calls. Self-check 3 passed with this serve.sh and these weights (trajectory#304-306). The final file listing (trajectory#312) shows no other weights in output/model.
✓harness credentials used only by the harnessI found no misuse of harness credentials. In the trajectory, the participant used Spin compute and Spin transfer storage
I found no misuse of harness credentials. In the trajectory, the participant used Spin compute and Spin transfer storage (s5cmd/boto3 with spin transfer credentials) only to move their own checkpoints (trajectory#249-252, trajectory#294-296), plus HF downloads. Searches for API-key and base-URL use matched only documentation text. serve.sh and proxy.py contain no external API credentials or calls.
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.
- 1passed8h 29m into the runtook 8m 39s
startup 168.1 s of 300 s; 1/1 gates passed; WARNING concurrent requests answered: 17 well-formed replies; 15 failed after up to 3 attempts: malformed response: choice has no text content | malformed response: choice has no text content | no time left in the self-check for a retry || malforme
7 gates
- ✓review prerequisites
- ✓checkpoint audit
- ✓startup · GET /health answered 200 after 168.1 s
- ✓GPQA request as graded · {"finish_reason": "stop", "answer": null, "note": "no answer letter found (ANSWER: X on its own line): grading scores it wrong", "content_characters": 23324, "reasoning_characters": 41, "content_end": "000 about0000000000000000.00. even following00000000000.00050000200000 for00.000000 ...[clipped]
- ✓slowest of 32 concurrent requests · 32 public requests at once (16 GPQA, 16 hard LiveCodeBench) as graded (max_tokens 16384, temperature 0.7, 250 s each): slowest 124.1 s, median 62.4 s; 0 stopped at max_tokens, 0 timed out. Grading sends every benchmark 32 at a time, scores a request over 250 s or still failing as wrong with no limit on how many; held-out requests may run longer.
- ✓concurrent requests answered · 17 well-formed replies; 15 failed after up to 3 attempts: malformed response: choice has no text content | malformed response: choice has no text content | no time left in the self-check for a retry || malformed response: choice has no text content | malformed response: choice has no text content | malformed response: choice has no text content || malformed response: choice has no text content | malformed response: choice has no text content | malformed response: choice has no text content. Grading scores each such request as wrong, so 15 of 32 here would score zero.
- ✓healthy after requests
- 2failed9h 53m into the runtook 7m 51s
failed startup: Server did not become healthy in 300s (last /health probe: RuntimeError: Submission HTTP request failed: ConnectionRefusedError: [Errno 111] Connection refused); end of its log: vllm 0.10.2
3 gates
- ✓review prerequisites
- ✓checkpoint audit
- ✗startup · Server did not become healthy in 300s (last /health probe: RuntimeError: Submission HTTP request failed: ConnectionRefusedError: [Errno 111] Connection refused); end of its log: vllm 0.10.2
- 3passed10h 2m into the runtook 8m 37s
startup 180.7 s of 300 s; 1/1 gates passed; One wave of 32 concurrent public requests stood for the suite's 3,153 graded ones at that concurrency; MATH-500 and MMLU-Pro are held out.
7 gates
- ✓review prerequisites
- ✓checkpoint audit
- ✓startup · GET /health answered 200 after 180.7 s
- ✓GPQA request as graded · {"finish_reason": "stop", "answer": null, "note": "no answer letter found (ANSWER: X on its own line): grading scores it wrong", "content_characters": 36691, "reasoning_characters": 39, "content_end": "serving awhile accustomed nodded\u90fd\u6709\u7740curities ceremoniesackagestoHaveL ...[clipped]
- ✓slowest of 32 concurrent requests · 32 public requests at once (16 GPQA, 16 hard LiveCodeBench) as graded (max_tokens 16384, temperature 0.7, 250 s each): slowest 109.3 s, median 72.2 s; 0 stopped at max_tokens, 0 timed out. Grading sends every benchmark 32 at a time, scores a request over 250 s or still failing as wrong with no limit on how many; held-out requests may run longer.
- ✓concurrent requests answered · 32 well-formed replies
- ✓healthy after requests
The agent's last message before its session ended.
Submitted at 04:29 UTC.
What I built
Post-trained Qwen3-4B-Base (pinned revision, sha256-verified) into a thinking chat model via full-parameter SFT:
- Data: 240k reasoning rows — OpenR1-Math-220k (80k, correctness-filtered), OpenCodeReasoning (46k), OpenThoughts-114k, plus a chat slice — all training splits, 13-gram decontaminated against test/val prompts of MATH-500, GSM8K, AIME, HumanEval, MBPP, MMLU-Pro, ARC, GPQA-Diamond and LCB-v6 (blocklists used only to discard). Normalized to Qwen3
<think>format. - Training: 1500 steps (~196M packed tokens, batch 131k), AdamW 2e-5 cosine, bf16, DDP on 2×A100-80GB, response-only loss, chunked CE. Shipped weights are exactly the base's 398 tensors/shapes (verified), bf16.
- Serving:
serve.shoffline-installs vendored vLLM 0.10.2 + torch 2.8 cu12, serves on one H100 with a small proxy that robustly splits<think>reasoning from the answer and never emits empty content.
Verification
- Self-check PASSED: audit ✓, startup 181s/300s ✓, 32 concurrent requests all well-formed, slowest 109s/250s ✓ (an earlier check caught 15/32 empty replies from vLLM's reasoning parser — fixed by the proxy).
- Caught and fixed along the way: a 2048-token
max_new_tokenscap in generation_config, transformers 5.x incompatibility (pinned 4.57.6), missingcurlin the grading image (stdlib-only serve.sh).
Honest caveats
- ~1500 steps was all the budget allowed; generation is fragile on some hard prompts (deterministic per-prompt degeneration into word salad, unaffected by seeds, penalties, or system prompts). Math/code basics work (verified: two_sum, combinatorics, arithmetic all correct with clean stops), but expect uneven benchmark coverage.
- Intended evidence of weight lineage (base hashes, training logs, data manifest) is in
output/evidence/witharchitecture.json.