Kombinat

Petrit Isufi · the method behind the record entries · as of 2026-09-20

What the Kombinat is

In the Kombinat, AI agents search for solutions to precisely specified combinatorial problems. I run it, the agents compute. A candidate becomes a result only once an independent checker accepts it. Four problems live in it: LABS, binary sequences of minimal autocorrelation energy; degdiam, the degree/diameter problem, whose candidate is a generator program rather than a graph; sortnet, sorting networks with as few comparators as possible, tools built and search not started; and booleansens, Boolean sensitivity against exact real degree.

core/loop.py computes one tick from parents, mutation, evaluation and archive, core/sandbox.py locks untrusted candidate programs into bwrap with rlimits, core/budget.py checks the spend cap before every model call. The checkers stay plain by design: standard library, exact arithmetic, no dependencies. Nothing in the search path may compute a score of its own. The inner loop has a C twin of the same verdict: on the (16,3) record graph with 1600 vertices and 12800 edges it reaches 269 evaluations per second with one process per candidate, 442 through the stream protocol. The Python checker stays the authority and confirms every candidate before the archive.

One rule file for Claude, Codex and DeepSeek

Every agent reads the same file, ~/.agents/AGENTS.md; ~/AGENTS.md, ~/.claude/CLAUDE.md and ~/.codex/AGENTS.md are symlinks to it, and only the original is edited. Four coding rules sit there. Think before code means naming assumptions instead of silently picking one reading, and contradicting me when there is reason to. Simplicity first asks for the smallest code that solves the problem, with no abstraction for one-off code. Surgical changes allow only edits that trace back to the assignment; someone else's dead code gets reported, not deleted. Goal-driven execution turns an assignment into checkable success criteria and demands verification before anything is reported done.

The unit of work is a claim with its own worktree

Nobody works in the main checkout, because a git switch there breaks running jobs. One script creates branch, worktree and claim in a single step; the worktree is released only once the push succeeds, which makes the remote branch the collision test. A scope belongs to exactly one claim, and finished ones get status: done or abandoned and stay. On 2026-09-20 coordination/ holds 406 claim files and 1262 job files; a job file is the claim of its own run.

Finder and checker are separate

$tick runs one target-bound attack and produces evidence. It never verifies its own find. It ends with a typed handover, a witness or a proof, or with a dated note on search space, method, budget and outcome. A negative result counts as a completed package.

$tock checks the exact handed-over artefact, hashed byte for byte, with independently written code and a different method. Importing the finder's code or running the enclosed replay command does not count. At least one mutant counter-test has to fail. Only then does a find move into records/. Both roles start from the same situation report from lagebild.py: locks, open arms and pending checks, fetched fresh from the remote.

For changes that touch the verification chain, author and reviewer are different people, and only a verdict: ok against the final head merges. The checkers, core/sandbox.py and core/budget.py are untouchable, problems/*/records/ is append-only. Corrections arrive as an amendment next to the original, which stays.

The cost ledger

Every work package writes one line when its claim closes; without it the closure counts as incomplete. No tool in the Kombinat measures tokens reliably, so none appear. The gap is deliberate, and wall time and review rounds stand in for it. Cells that cannot be derived carry a question mark, and nothing is estimated. Five lines from September:

DateBlockModelWall time hSubagentsReview roundsResult
2026-09-05Background?0.05?0Four table cells refreshed, 8 of 10 own record cells confirmed as of that date.
2026-09-08B1Opus 59.03 × Sonnet3 (R3 ok)Own hypothesis falsified against the bar set beforehand, replicated independently.
2026-09-08BackgroundAstra/high, review Opus 51.123 × Luna/max0Seven block counts reproduced, overall bound confirmed with foreign code.
2026-09-10BackgroundSonnet 548.405 (R5 ok)Lambda gate extended to four more support points, slack 0.
2026-09-10B1Fable 5.10.3701 (R1 ok)Four guards previously listed as unreachable pinned down with mutants.

The 48.4 hours in the fourth row are a calendar span across three sessions, not compute time. What a model call costs sits in a versioned price table in the repository, with source and date in the file.

Recurring work runs as a systemd unit

Anything that runs on a schedule runs as a systemd unit on the server, not inside an agent. The operations folder holds 28 service and 22 timer files, 25 of them with OnFailure=notify-failure@%n. The template sends a Telegram message naming the failed unit, and a check script lists units missing the hook.

There is also a rule for wait loops. From 10 to 14 September 2026 an until adb connect ran inside the ws-scrcpy container for four days, because nobody had given it a stop condition. Since then every wait loop gets a timeout, including in container entrypoints and subagent scripts. A loop without a limit is a finding.

Results

In August 2026 ten entries of the Comellas and Delorme table stood under my name. One of them is still mine today, degree 15 and diameter 3 at order 1224. The rest were beaten in September, and for six of the successors the table notes that they build on my graphs. Which cell fell when is on the research page, together with the preprint on the second independent verification of the counterexample to Goemans' cost conjecture, on Zenodo under doi:10.5281/zenodo.22238190 and under ORCID 0009-0004-3834-8704.