mirror of
https://github.com/esengine/DeepSeek-Reasonix.git
synced 2026-11-07 10:45:59 -10:00
* feat(bench): SWE-bench primitives verified against the real harness Image naming, conda activation, prompt construction, predictions encoding and grader-report parsing, each pinned by a test against output captured from swebench 4.1.0 on a real gold run. The orchestration that drives containers lands next; these are the pieces whose shape could only be learned by running the harness, not by reading it. * feat(bench): run SWE-bench inside the official instance images The agent now runs where the harnesses it is compared against run: inside the per-instance evaluation container, against /testbed, with the repo's own tests available to it. Anything less measures a different task. The container is the isolation boundary, so the in-container config turns the bash sandbox off — Reasonix otherwise refuses to run bash at all when it cannot find bubblewrap, which the official images do not ship, and an agent that cannot run tests is not doing SWE-bench. Nothing else deviates from the shipped defaults: the provider, model and context window are what a user gets on install, because a hand-tuned config would make the published number unreproducible. Credentials stream into the container over stdin rather than through argv or an image layer, and the issue text is fully shell-quoted before it becomes one argv element — a problem statement is untrusted input that routinely contains backticks and $(). Resolution is never decided here; predictions go to the official grader and its report is parsed back into the published failure taxonomy. * feat(bench): publish the SWE-bench Verified subset and how it was chosen The subset is 50 of the 500 Verified instances, and the script that produced it ships alongside it. Selection is deterministic — largest-remainder apportionment across repos, then evenly spaced picks within each repo ordered by difficulty — so re-running it against the same dataset revision reproduces the file byte for byte. A sample nobody can regenerate is a sample that can be quietly retuned after seeing results. Composition tracks the real benchmark: django 23 of 50 against 46.2% of the full set, sympy 8 against 15.0%, and difficulty lands at 18/28/4 against the full set's 38.8/52.2/8.4%. Nothing is excluded, including the psf/requests instance whose test suite makes live network calls; if it exhausts the grader timeout it is published as eval_timeout, because dropping the instances a harness handles badly is how a benchmark stops meaning anything. * feat(metrics): keep accounting when the agent is killed, and say where it came from A benchmark run that times out currently reports nothing: the metrics file is written once, after the controller returns, so a killed agent leaves no trace of the fifty tool calls it made. In the last SWE-bench run one solved instance landed in the totals as a free solve, quietly making every per-task figure cheaper than the truth. The sink now publishes a throttled snapshot to a `.partial` sidecar as the run proceeds, through the repository's existing atomic write so a reader only ever sees a whole file. The final record is marked complete and retires the sidecar, so the two can never both be counted. The harness prefers the final record and falls back to the snapshot, reporting recovered numbers as lower bounds rather than as fact. Usage is also split by origin. Steps counts every billed model call — executor, planner, sub-agents, compaction, classifier, router — which is why published rows read above a max_steps budget the main loop never exhausted. An origin the build does not recognise keeps its own key rather than being dropped, because a total that cannot reconcile is worse than one with an unfamiliar row. Snapshotting made an existing race consequential: Emit is serialized by the session's event.Sync wrapper, but the run command read the same struct directly while background jobs could still emit into it. The sink now owns a mutex and hands out deep copies. The race test needs `go test -race`, which cannot run on a host without cgo; CI's race job is what covers it.