An LLM agent discovers verified facts about the Python environment via predict → run → surprise → compress → archive. Design rationale in README.md.
python3 selftest.py— offline end-to-end test, no endpoint needed. Run after any kernel change.python3 disco.py run -n 1— live discovery thread (needs a backend, below)python3 disco.py status/audit/verify/worlds/seed/resetpython3 disco.py newworld <name> "<territory>"then-w <name>on any command — worlds live inworlds/<name>/with their own archive/runs/ledgerpython3 disco.py export[--all] — world threads → training episodes (exports/, gitignored);--allpools every worldscripts/to_parquet.py— OPTIONAL: exports/*.jsonl → one parquet (needs polars; NOT in the stdlib-only kernel)python3 disco.py genworld <seed> [--family ca|modpoly|tag]— contamination-free random worldpython3 disco.py stats/deps— discovery metrics, claim→tool dependency graphpython3 disco.py grind <seeds...> -n T— batch: generate worlds + run + exportpython3 disco.py run --agents a,b/calib/coevolve— multi-agent science, calibration, POET looppython3 disco.py rollout -g G— GRPO group sampling (isolated copies, shared group id)python3 disco.py eval— score discovery on the sealed held-out world set (eval/heldout.json)
DISCO_BACKEND=openai(default): OpenAI-compatible endpoint,DISCO_BASE_URL+DISCO_MODEL(LM Studio)DISCO_BACKEND=claude: shells out toclaude -pper call;DISCO_CLAUDE_MODELoptional
kernel/is frozen machinery and must contain zero domain knowledge. Never add hints, examples, or workflow advice toprompts.py— protocol mechanics only. The agent is supposed to discover everything else itself.- Domain content lives in exactly one place:
worlds/<name>/world.md. Steering goes throughseed(open questions) or world.md — never through kernel code or prompts. worlds/<name>/methodology.mdis AGENT-authored strategy, evolved by champion/challenger selection (kernel/evolve.py). Neither humans nor kernel code write its content; the kernel only scores trials with the frozen fitness in evolve.py. Do not "improve" the methodology by hand.- Predictions are committed before execution; only the kernel writes each world's
ledger.jsonlandarchive/. - A claim enters the world's
archive/claims/only if itscheck.pyexits 0. - The agent-facing ledger tail (
ledger.tail(for_agent=True)) must never show audit/verify entries — the fast loop must not see its own audit metric. - Experiments run with the world's
archive/tools/onPYTHONPATH; never pass-I/-Eto the experiment interpreter (kills tool inheritance). - Stdlib only. No third-party dependencies.