orrery · lab reportAbstractPart One: The Whole LineIIIIIIIVVVIVIIVIIIIXXXIXIIPart Two: The Story and the GuideXIIIXIVXVXVIXVIIXVIIIXIXXXXXI

orrery · the fleet · the design and the guide

The Double Report: How the Fleet Reaches the Game, and How to Use Orrery

Lab Report and User Guide — IEEE Format · 1 November 2026

Copyright (c) 2026 Paul Richeson. MIT licensed, as orrery and treadcore.

Part One is the design of the process. Part Two is the story of how data becomes a bot's instructions, the amendment, and the guide to every screen, with pictures. Sources: Orrery, treadcore, its documents.

Abstract

Part One asks how the work of nine machines reaches a game, and finds that only two of nine training methods do. It reports that half of all promotions had stopped at unit tests and none at a family, moves the difficulty into values a person can change, and shows the process as a road, a timeline and a schedule. Part Two tells the same process as one story. A match is played, and a score becomes a number in a ledger; a curve fitted to the ledger proposes a change; reads judge it; a commit makes it a default; and in the next match that default changes which tank a bot fires on. It tells the second story too: how a vector of 143 senses passes through a matrix and becomes a command, by imitation, by evolution, by a confident override and on a graphics card. Then it is a user guide: every one of Orrery's 27 screens is pictured from the live run, numbered and explained, along with the inspector built for this report, which puts what a thing is, where it came from and what it means under the pointer on almost every number.

Index Terms: data flow, sequential testing, neural networks, residual learning, heuristic evaluation, user guide.

Part One: The Whole Line

How the fleet's work reaches treadcore. Published as its own report the same day; here whole.

The grove fleet runs about 114 machine-hours of work a day across nine training methods, and the person who owns it could not say how they connect to the game. This report draws the connection, stage by stage, with what each stage takes, gives, simulates and adds to treadcore. Only the dial search and A/B reach the game today. The transform stops at a file the game cannot read. Crucible's GPU islands stop earlier: their nets have different senses and outputs, and no road leads from them to treadcore. Imitation nets play only in the census, because the client never loads a net.

The history answers a question nobody had asked. Half of all promotions ever requested (7 of 14) failed, every one at the brain's unit tests and none at a family. The last two were passes under the new ratchet, stopped by tests that read defaults they were meant to be independent of. A patch to six tests fixed them, on main as treadcore 1b14192, and the first candidate it freed then passed its tests. No family job has ever failed. The red segment on the Queue page that reads like failure was 96% retired jobs, nearly all of which never ran.

We moved the difficulty into thirteen values a person can change, simulated what they buy, and applied two to the live run: ease 2.6 (held z 0.40) and a ceiling of 2.75. Every screen now explains itself in a panel collapsed by default, the queue says why each job is there, and a new Flow, Timeline, Queued and Values sit in the Queue chapter's column. Every generation now writes its own record, and the raw record packs for disc or release. A trial that passed on the defaults a generation replaces now gets another read rather than being thrown away.

Index Terms: data flow, sequential testing, generational search, heuristic evaluation, training records, residual learning.

I. What was asked

Paul, 1 November, quoted because each clause became a section:

"we want to write reports about each of our training methods. in specific I want to stream line, to unify the approach of all the features in this fleet ... I want to store all this training information. Github or maybe burned compressed media. I want snapshots and generations. I specifically want to conceptualize the idea of data flow from each of the modules. I don't understand how they all connect back to treadcore ... We should see diagrams and gantt style scheduling, connecting back to a timeline for the past and a gantt chart of scheduled tasks. also on the queue write a blerb about why the item is in the queue ... We have way too many screens, Or at least, I need an explanation on each screen (collapsed by default) ... We want full hurestic analysis."

And while this was being written:

"I see the Crucible, GPU islands is its own thing. How can we imrpove the gerations, perhaps the Crucible is like the Families? Is there a difficulty adjustor that we can use to make it so families can be at optimal or more frequency ... I'm seeing lots of families fail in the history ... Is its Netbrain used as an optional imported net weights into treadcore ... We can also run multiple and mix or alternate between using source of instructions by computing both."

The answers, in order: Section II, the connection. Section III, a report on each method. Section IV, what the history says. Section V, the values. Section VI, families and crucible. Section VII, one approach, check-ins and netlets, and mixing brains. Section VIII, storage. Section IX, the screens and the heuristic analysis.

II. How the pieces connect

Treadcore's bots play by rules: commander.rs, tactics.rs, crew.rs, fleet.rs. Those rules read about 120 numbers and 18 switches from weights.rs, and that file is the fleet's only way into the game today. Everything else is either a way of choosing those numbers or a thing that has not got a road yet.

search to first: trial.weightsfirst to read: z at 55read to held: a passheld to families: a candidatefamilies to promote: its floorspromote to build: a commitbuild to search: new baselinepromote to anchor: each generationanchor to first: old valuesbuild to proof: the lineproof to main: z past 3main to brain: defaultstransform to slot: thetaslot to brain: not builtislands to bridge: championsbridge to slot: not builtPropose a trial. Takes: the ledger of every census; RANGES; the defaults. Gives: trial.weights. Simulates: Nothing: this is arithmetic. suggest.py fits the ledger and draws from what it does not yet know; A/B flips each switch and each choice; wide trials look far from today. For treadcore: The source of every number the game's bots run on.Propose a trialgives trial.weightsFirst read, 55 seeds. Takes: trial.weights; today's binary. Gives: pooled.txt: d +/- se, each map. Simulates: Bots only. Each seed is one starting world on one of eleven maps, played three times so that each team takes the trial seat once: 15 minutes of game time and three respawns, the trial brain against the baseline. For treadcore: Nothing yet: it spends lanes so the long reads go to what might be real.First read, 55 seedsgives pooled.txt: d +/-se, each map1649 jobs, 64.6 h a dayRead on, stage by stage. Takes: pooled.txt so far. Gives: pooled z at 82, 124, 187, 275, 418 seeds. Simulates: The same census on fresh seeds. Reads pool by inverse variance, and a trial leaves as soon as its z says keep, drop or pass. For treadcore: Nothing yet: it decides which few earn a held-out read.Read on, stage bystagegives pooled z at 82,124, 187, 275, 418 seeds1335 jobs, 38.7 h a dayHeld-out read, 400 seeds. Takes: a trial past the read-on bar. Gives: held d +/- se. Simulates: The census on seeds no search has seen, from 60,000,000 up. Selection has picked out lucky first reads, and only unseen seeds can say so. For treadcore: The evidence every generation's commit message carries.Held-out read, 400seedsgives held d +/- se29 jobs, 8.0 h a dayFamilies hold their floors. Takes: a candidate's weights. Gives: plan/families.json: pass or fail by family. Simulates: Set pieces, not whole matches: a raid on a guarded base, a dodge, a kite. Each scenario has a floor a brain must keep. For treadcore: Keeps the behaviours a person notices when the score alone would trade them away.Families hold theirfloorsgivesplan/families.json: passor fail by family11 jobs, 0.1 h a dayTests, then the line. Takes: a candidate that held. Gives: a commit: weights.rs and tactics.rs. Simulates: No match: the brain's own unit tests on a branch. set-defaults.py rewrites the defaults, and if they pass the commit joins the local line. For treadcore: The generation itself: new defaults in the brain's source.Tests, then the linegives a commit:weights.rs andtactics.rs4 jobs, 0.1 h a dayEvery machine builds it. Takes: the line's commit. Gives: census-bin at the commit, on each machine. Simulates: Nothing: a cargo build per machine. A read counts only on today's defaults and today's game, so this resets what is asked next. For treadcore: Makes the new brain the baseline everything is read against.Every machine buildsitgives census-bin at thecommit, on each machine25 jobs, 0.2 h a dayAnchor: back three. Takes: the defaults of three generations ago. Gives: a trial read as any other. Simulates: The census with the old values against today's. If the old read better, drift is undone by the same road a find takes. For treadcore: Undoes slow losses.Anchor: back threegives a trial read asany other2 jobs, 0.1 h a dayThe line against main. Takes: main's values; the line's commit. Gives: 2 x 400 seeds: z of line over main. Simulates: The census with main's values against the line, on fresh seeds from 700,000,000 up. All the generations' noise is in one read and cannot pass it by luck. For treadcore: Decides what reaches the game on origin/main.The line againstmaingives 2 x 400 seeds: zof line over main6 jobs, 1.2 h a dayMain: the game's brain. Takes: a proved line. Gives: origin/main; every player's bots. Simulates: Nothing: a push. Every machine fetches it, and a release carries it to players. For treadcore: All of it: Commander, tactics, crew and fleet read these defaults in every match.Main: the game'sbraingives origin/main; everyplayer's botsTransform: learned override. Takes: the senses, the rules' answer, the biorhythm. Gives: patches/theta.json: 942 numbers. Simulates: The same census with the patch switched on, SPSA moving all 942 numbers by one noisy read a step. All zeros is the brain as it was. For treadcore: Nothing yet: the census reads the slot and the game does not.Transform: learnedoverridegivespatches/theta.json: 942numbers28 jobs, 0.7 h a dayThe game reads a slot. Takes: a patch that read better. Gives: NOT BUILT: a file the game loads. Simulates: Nothing: this is missing. For treadcore: Would add learned play to the shipped brain.The game reads aslotNOT BUILTGPU islands: crucible. Takes: champions from the other islands; the ladder. Gives: champ.bin, gens.tsv, exam.tsv. Simulates: Crucible's own arena on the card: 2,048 small nets duelling, 128 episodes, 100 generations a segment. Different physics, senses and net from the game. For treadcore: Nothing: its nets cannot play treadcore.GPU islands:cruciblegives champ.bin,gens.tsv, exam.tsv277 jobs, 9.9 h a dayBridge: crucible to treadcore. Takes: a champion. Gives: NOT BUILT: a net in the game's senses. Simulates: Nothing: this is missing. It would be imitation: the champion's choices taught to a net that reads treadcore's senses. For treadcore: Would make GPU work count.Bridge: crucible totreadcoreNOT BUILTOne brain in treadcore. Takes: main, and a slot. Gives: rules, dials and transform as one. Simulates: A real match: rules, then dials, then a learned override. For treadcore: The goal.One brain intreadcoregives rules, dials andtransform as one
Fig. 1. The whole road. Every stage, what it gives the next, and the machine-time it took in the last day, drawn from tools/plans/line.json and the run. Dashed red: not built, so nothing passes. Only the top two rows reach the game. Hover a box for what it takes and simulates.

Read it as a loop. The fit proposes a set of dials. The census plays it against today's defaults. If it survives the reads, its numbers become a commit, every machine builds it, and that commit becomes the baseline the next trial is read against. Nothing here trains a net: the search is a Monte Carlo experiment on a hand-written program.

The census is the instrument. One seed is one starting world, played three times so that each team takes the trial seat once. Every bot is a full brain and no person plays: 15 minutes of game time, three respawns, on eleven maps. The reading is the trial team's score a seat less the baseline's, and both meet the same start, so most of a map's luck cancels. A seed still swings about 9.5 a seat, which is why every later stage exists.

StageTakesGivesConditions simulatedAdds to treadcore
Propose a trialthe ledger of every census; RANGES; the defaultstrial.weightsNothing: this is arithmetic. suggest.py fits the ledger and draws from what it does not yet know; A/B flips each switch and each choice; wide trials look far from today.The source of every number the game's bots run on.
First read, 55 seedstrial.weights; today's binarypooled.txt: d +/- se, each mapBots only. Each seed is one starting world on one of eleven maps, played three times so that each team takes the trial seat once: 15 minutes of game time and three respawns, the trial brain against the baseline.Nothing yet: it spends lanes so the long reads go to what might be real.
Read on, stage by stagepooled.txt so farpooled z at 82, 124, 187, 275, 418 seedsThe same census on fresh seeds. Reads pool by inverse variance, and a trial leaves as soon as its z says keep, drop or pass.Nothing yet: it decides which few earn a held-out read.
Held-out read, 400 seedsa trial past the read-on barheld d +/- seThe census on seeds no search has seen, from 60,000,000 up. Selection has picked out lucky first reads, and only unseen seeds can say so.The evidence every generation's commit message carries.
Families hold their floorsa candidate's weightsplan/families.json: pass or fail by familySet pieces, not whole matches: a raid on a guarded base, a dodge, a kite. Each scenario has a floor a brain must keep.Keeps the behaviours a person notices when the score alone would trade them away.
Tests, then the linea candidate that helda commit: weights.rs and tactics.rsNo match: the brain's own unit tests on a branch. set-defaults.py rewrites the defaults, and if they pass the commit joins the local line.The generation itself: new defaults in the brain's source.
Every machine builds itthe line's commitcensus-bin at the commit, on each machineNothing: a cargo build per machine. A read counts only on today's defaults and today's game, so this resets what is asked next.Makes the new brain the baseline everything is read against.
Anchor: back threethe defaults of three generations agoa trial read as any otherThe census with the old values against today's. If the old read better, drift is undone by the same road a find takes.Undoes slow losses.
The line against mainmain's values; the line's commit2 x 400 seeds: z of line over mainThe census with main's values against the line, on fresh seeds from 700,000,000 up. All the generations' noise is in one read and cannot pass it by luck.Decides what reaches the game on origin/main.
Main: the game's braina proved lineorigin/main; every player's botsNothing: a push. Every machine fetches it, and a release carries it to players.All of it: Commander, tactics, crew and fleet read these defaults in every match.
Transform: learned overridethe senses, the rules' answer, the biorhythmpatches/theta.json: 942 numbersThe same census with the patch switched on, SPSA moving all 942 numbers by one noisy read a step. All zeros is the brain as it was.Nothing yet: the census reads the slot and the game does not.
The game reads a slota patch that read betterNOT BUILT: a file the game loadsNothing: this is missing.Would add learned play to the shipped brain.
GPU islands: cruciblechampions from the other islands; the ladderchamp.bin, gens.tsv, exam.tsvCrucible's own arena on the card: 2,048 small nets duelling, 128 episodes, 100 generations a segment. Different physics, senses and net from the game.Nothing: its nets cannot play treadcore.
Bridge: crucible to treadcorea championNOT BUILT: a net in the game's sensesNothing: this is missing. It would be imitation: the champion's choices taught to a net that reads treadcore's senses.Would make GPU work count.
One brain in treadcoremain, and a slotrules, dials and transform as oneA real match: rules, then dials, then a learned override.The goal.

A. One trial, moving

The Flow page on the Queue chapter shows these numbers live. A trial called w4602 went like this at 09:32 to 10:31 on 1 November: a draw from the fit that moved many dials; first read on macmini, +2.58 +/- 1.51, z +1.71; three reads on, on saskatchewan, calber and boburner, the pool holding near z 2; then 400 unseen seeds on jaguaribe, -0.22 +/- 0.49. It looked strong for 187 seeds and was nothing. That is the reason for a held-out read.

-3-2-1+0+1+2+3pass bar z 0.50w4749 w4749 on calber at 11:46: +0.41 +/- 1.24 over 55 seeds, z +0.33w4749 h0334 on boburner at 11:49: +0.82 +/- 0.40 over 400 seeds, z +2.05w4747 w4747 on calber at 11:43: +0.67 +/- 1.37 over 55 seeds, z +0.49w4747 h0332 on macmini at 11:43: -0.49 +/- 0.48 over 400 seeds, z -1.02w4681 w4681 on boburner at 10:36: +0.95 +/- 1.02 over 55 seeds, z +0.93w4681 e3480 on macmini at 10:47: +3.47 +/- 1.50 over 27 seeds, z +2.07w4681 e3499 on macmini at 11:02: +1.91 +/- 1.49 over 42 seeds, z +2.43w4681 e3518 on macmini at 11:14: +0.65 +/- 1.12 over 63 seeds, z +2.35w4681 h0329 on boburner at 11:28: +0.22 +/- 0.38 over 400 seeds, z +0.58w4677 w4677 on whitewolf at 10:36: +0.92 +/- 1.16 over 55 seeds, z +0.79w4677 e3481 on boburner at 10:48: +1.57 +/- 1.15 over 27 seeds, z +1.53w4677 e3501 on jaguaribe at 11:06: +1.95 +/- 1.21 over 42 seeds, z +2.17w4677 e3522 on macmini at 11:18: +0.57 +/- 0.89 over 63 seeds, z +2.11w4677 h0330 on macmini at 11:26: +0.13 +/- 0.40 over 400 seeds, z +0.33w4623 w4623 on macmini at 09:46: +1.26 +/- 1.46 over 55 seeds, z +0.86w4623 e3423 on calber at 09:57: -0.15 +/- 2.26 over 27 seeds, z +0.69w4623 e3439 on saskatchewan at 10:15: +0.31 +/- 1.58 over 42 seeds, z +0.66w4623 e3456 on macmini at 10:30: +0.06 +/- 1.12 over 63 seeds, z +0.54w4623 h0326 on columbia at 11:08: -0.62 +/- 0.55 over 400 seeds, z -1.13w4639 w4639 on macmini at 09:56: +1.31 +/- 1.07 over 55 seeds, z +1.22w4639 e3435 on boburner at 10:13: -0.56 +/- 1.44 over 27 seeds, z +0.75w4639 e3453 on columbia at 10:30: +3.29 +/- 1.36 over 42 seeds, z +1.93w4639 e3473 on boburner at 10:42: +1.07 +/- 1.00 over 63 seeds, z +2.19w4639 h0327 on calber at 11:06: -0.20 +/- 0.42 over 400 seeds, z -0.48w4659 w4659 on boburner at 10:15: +2.60 +/- 1.21 over 55 seeds, z +2.15w4659 e3455 on saskatchewan at 10:30: -0.06 +/- 1.54 over 27 seeds, z +1.67w4659 e3472 on saskatchewan at 10:40: +0.93 +/- 0.88 over 42 seeds, z +1.91w4659 e3489 on macmini at 10:54: +1.40 +/- 0.93 over 63 seeds, z +2.42w4659 h0328 on saskatchewan at 11:05: -0.02 +/- 0.41 over 400 seeds, z -0.05each read in turn: first read, then pooled reads on, the last point its own held-out read
Fig. 2. Trials through the line. The last eight to reach a held-out read: z after each read. Red: passed, and stopped by a test. High pooled z falling at the held-out read is selection at work: lucky reads get picked, and unseen seeds correct them. Drawn to z -3: the two anchors read as far as -8.9.

B. The past and the schedule

-6 h-5 h-4 h-3 h-2 h-1 h+15 min+30 minsaskatchewansaskatchewan: first, -360 to -359 min from now, failed or sent backsaskatchewan: read, -358 to -357 min from nowsaskatchewan: first, -357 to -355 min from nowsaskatchewan: read, -355 to -349 min from nowsaskatchewan: first, -349 to -347 min from nowsaskatchewan: read, -347 to -346 min from nowsaskatchewan: read, -346 to -345 min from now, failed or sent backsaskatchewan: first, -344 to -342 min from nowsaskatchewan: read, -342 to -340 min from nowsaskatchewan: read, -340 to -339 min from now, failed or sent backsaskatchewan: read, -338 to -336 min from now, failed or sent backsaskatchewan: read, -335 to -330 min from nowsaskatchewan: first, -330 to -328 min from now, failed or sent backsaskatchewan: first, -326 to -322 min from nowsaskatchewan: first, -322 to -321 min from now, failed or sent backsaskatchewan: first, -320 to -318 min from nowsaskatchewan: read, -318 to -316 min from nowsaskatchewan: first, -316 to -314 min from nowsaskatchewan: read, -314 to -312 min from nowsaskatchewan: first, -312 to -310 min from now, failed or sent backsaskatchewan: read, -308 to -304 min from nowsaskatchewan: first, -303 to -302 min from now, failed or sent backsaskatchewan: first, -301 to -299 min from nowsaskatchewan: read, -299 to -293 min from nowsaskatchewan: first, -293 to -291 min from nowsaskatchewan: read, -291 to -290 min from now, failed or sent backsaskatchewan: held, -288 to -286 min from now, failed or sent backsaskatchewan: build, -284 to -284 min from nowsaskatchewan: families, -283 to -282 min from nowsaskatchewan: first, -282 to -267 min from nowsaskatchewan: read, -267 to -266 min from nowsaskatchewan: first, -266 to -256 min from nowsaskatchewan: transform, -256 to -256 min from nowsaskatchewan: read, -256 to -254 min from nowsaskatchewan: first, -254 to -252 min from nowsaskatchewan: read, -252 to -250 min from nowsaskatchewan: first, -250 to -247 min from nowsaskatchewan: read, -247 to -245 min from nowsaskatchewan: first, -245 to -243 min from nowsaskatchewan: read, -243 to -242 min from nowsaskatchewan: first, -242 to -239 min from nowsaskatchewan: held, -239 to -229 min from nowsaskatchewan: read, -229 to -228 min from nowsaskatchewan: families, -228 to -227 min from nowsaskatchewan: read, -227 to -224 min from nowsaskatchewan: first, -224 to -223 min from nowsaskatchewan: build, -223 to -222 min from nowsaskatchewan: first, -221 to -205 min from nowsaskatchewan: read, -205 to -202 min from nowsaskatchewan: first, -202 to -190 min from nowsaskatchewan: anchor, -190 to -189 min from nowsaskatchewan: read, -189 to -188 min from nowsaskatchewan: first, -188 to -184 min from nowsaskatchewan: read, -184 to -184 min from nowsaskatchewan: first, -184 to -180 min from nowsaskatchewan: read, -180 to -177 min from nowsaskatchewan: first, -177 to -174 min from nowsaskatchewan: read, -174 to -171 min from nowsaskatchewan: first, -171 to -168 min from nowsaskatchewan: read, -168 to -163 min from nowsaskatchewan: first, -163 to -157 min from nowsaskatchewan: read, -157 to -153 min from nowsaskatchewan: first, -153 to -146 min from nowsaskatchewan: read, -146 to -145 min from nowsaskatchewan: transform, -145 to -144 min from nowsaskatchewan: read, -144 to -143 min from nowsaskatchewan: first, -143 to -141 min from nowsaskatchewan: read, -141 to -140 min from nowsaskatchewan: first, -140 to -133 min from nowsaskatchewan: read, -133 to -128 min from nowsaskatchewan: first, -128 to -124 min from nowsaskatchewan: read, -124 to -123 min from nowsaskatchewan: first, -123 to -120 min from nowsaskatchewan: held, -120 to -110 min from nowsaskatchewan: read, -110 to -107 min from nowsaskatchewan: first, -107 to -102 min from nowsaskatchewan: read, -102 to -98 min from nowsaskatchewan: first, -98 to -94 min from nowsaskatchewan: transform, -94 to -93 min from nowsaskatchewan: read, -93 to -92 min from nowsaskatchewan: families, -92 to -92 min from nowsaskatchewan: first, -92 to -88 min from nowsaskatchewan: read, -88 to -87 min from nowsaskatchewan: first, -87 to -86 min from nowsaskatchewan: read, -86 to -82 min from nowsaskatchewan: first, -82 to -72 min from nowsaskatchewan: read, -72 to -70 min from nowsaskatchewan: first, -70 to -69 min from nowsaskatchewan: read, -69 to -67 min from nowsaskatchewan: held, -67 to -58 min from nowsaskatchewan: read, -58 to -56 min from nowsaskatchewan: first, -56 to -54 min from nowsaskatchewan: transform, -54 to -54 min from nowsaskatchewan: first, -54 to -52 min from nowsaskatchewan: read, -52 to -43 min from nowsaskatchewan: first, -43 to -41 min from nowsaskatchewan: transform, -41 to -40 min from nowsaskatchewan: first, -40 to -37 min from nowsaskatchewan: proof, -37 to -27 min from nowsaskatchewan: transform, -27 to -27 min from nowsaskatchewan: build, -26 to -26 min from nowsaskatchewan: held, -26 to -16 min from nowsaskatchewan: first, -16 to -3 min from nowsaskatchewan: build, -3 to -3 min from nowsaskatchewan: first, -3 to -1 min from nowsaskatchewan: first, -1 to 0 min from nowsaskatchewan, forecast: first, in 0 minsaskatchewan, forecast: first, in 0 minsaskatchewan, forecast: first, in 2 minsaskatchewan, forecast: first, in 4 minboburnerboburner: read, -360 to -358 min from nowboburner: first, -358 to -356 min from nowboburner: read, -356 to -352 min from nowboburner: first, -352 to -350 min from nowboburner: read, -350 to -346 min from nowboburner: first, -346 to -344 min from nowboburner: read, -344 to -338 min from nowboburner: first, -338 to -336 min from nowboburner: read, -335 to -333 min from nowboburner: first, -333 to -328 min from nowboburner: read, -328 to -314 min from nowboburner: first, -314 to -311 min from nowboburner: read, -311 to -309 min from nowboburner: first, -309 to -307 min from nowboburner: read, -307 to -305 min from nowboburner: first, -305 to -302 min from nowboburner: read, -302 to -296 min from nowboburner: first, -296 to -294 min from nowboburner: read, -293 to -290 min from nowboburner: held, -290 to -286 min from now, failed or sent backboburner: transform, -284 to -281 min from nowboburner: build, -281 to -280 min from nowboburner: first, -280 to -266 min from nowboburner: read, -266 to -264 min from nowboburner: first, -264 to -252 min from nowboburner: read, -252 to -250 min from nowboburner: first, -250 to -248 min from nowboburner: transform, -248 to -246 min from nowboburner: read, -246 to -240 min from nowboburner: first, -240 to -238 min from nowboburner: read, -238 to -234 min from nowboburner: first, -234 to -229 min from nowboburner: read, -229 to -226 min from nowboburner: held, -226 to -213 min from nowboburner: build, -213 to -212 min from nowboburner: first, -212 to -210 min from nowboburner: transform, -210 to -208 min from nowboburner: first, -208 to -198 min from nowboburner: read, -198 to -197 min from nowboburner: transform, -197 to -195 min from nowboburner: first, -195 to -193 min from nowboburner: read, -193 to -191 min from nowboburner: first, -191 to -188 min from nowboburner: read, -188 to -183 min from nowboburner: transform, -183 to -181 min from nowboburner: read, -181 to -176 min from nowboburner: held, -176 to -163 min from nowboburner: first, -163 to -161 min from nowboburner: read, -161 to -159 min from nowboburner: transform, -159 to -157 min from nowboburner: first, -157 to -147 min from nowboburner: read, -147 to -146 min from nowboburner: first, -146 to -143 min from nowboburner: read, -143 to -139 min from nowboburner: first, -138 to -124 min from nowboburner: transform, -124 to -122 min from nowboburner: first, -122 to -119 min from nowboburner: read, -119 to -116 min from nowboburner: first, -116 to -113 min from nowboburner: read, -113 to -109 min from nowboburner: first, -109 to -99 min from nowboburner: read, -99 to -96 min from nowboburner: first, -96 to -91 min from nowboburner: read, -91 to -88 min from nowboburner: first, -88 to -86 min from nowboburner: read, -86 to -80 min from nowboburner: first, -80 to -75 min from nowboburner: read, -75 to -62 min from nowboburner: first, -62 to -58 min from nowboburner: read, -58 to -55 min from nowboburner: first, -55 to -53 min from nowboburner: read, -53 to -51 min from nowboburner: first, -51 to -48 min from nowboburner: read, -48 to -47 min from nowboburner: held, -47 to -34 min from nowboburner: first, -34 to -26 min from nowboburner: build, -26 to -26 min from nowboburner: held, -26 to -13 min from nowboburner: first, -13 to -5 min from nowboburner: read, -5 to -4 min from nowboburner: build, -4 to -3 min from nowboburner: transform, -3 to -1 min from nowboburner: first, -1 to 0 min from nowboburner, forecast: first, in 0 minboburner, forecast: first, in 0 minboburner, forecast: first, in 2 minboburner, forecast: first, in 4 mincolumbiacolumbia: read, -360 to -346 min from nowcolumbia: first, -346 to -341 min from nowcolumbia: read, -341 to -337 min from now, failed or sent backcolumbia: read, -336 to -330 min from now, failed or sent backcolumbia: first, -329 to -318 min from nowcolumbia: read, -318 to -315 min from now, failed or sent backcolumbia: read, -314 to -306 min from nowcolumbia: first, -306 to -300 min from nowcolumbia: read, -300 to -291 min from nowcolumbia: first, -291 to -290 min from now, failed or sent backcolumbia: held, -288 to -286 min from now, failed or sent backcolumbia: build, -284 to -283 min from nowcolumbia: first, -283 to -242 min from nowcolumbia: held, -242 to -204 min from nowcolumbia: build, -204 to -203 min from nowcolumbia: first, -203 to -198 min from nowcolumbia: read, -198 to -194 min from nowcolumbia: first, -194 to -189 min from nowcolumbia: read, -189 to -185 min from nowcolumbia: first, -185 to -158 min from nowcolumbia: read, -158 to -155 min from nowcolumbia: first, -155 to -138 min from nowcolumbia: read, -138 to -134 min from nowcolumbia: first, -134 to -117 min from nowcolumbia: read, -117 to -113 min from nowcolumbia: first, -113 to -97 min from nowcolumbia: read, -97 to -92 min from nowcolumbia: held, -92 to -54 min from nowcolumbia: read, -54 to -46 min from nowcolumbia: first, -46 to -30 min from nowcolumbia: read, -30 to -26 min from nowcolumbia: build, -26 to -26 min from nowcolumbia: held, -26 to 0 min from nowcolumbia, forecast: held, in 0 mincolumbia, forecast: build, in 1 mincolumbia, forecast: first, in 2 mincolumbia, forecast: first, in 3 mincolumbia, forecast: transform, in 5 mincalbercalber: first, -360 to -358 min from nowcalber: read, -358 to -353 min from nowcalber: first, -353 to -344 min from nowcalber: read, -344 to -340 min from nowcalber: first, -340 to -337 min from nowcalber: read, -337 to -333 min from nowcalber: first, -333 to -324 min from nowcalber: read, -324 to -320 min from nowcalber: first, -320 to -317 min from nowcalber: read, -317 to -315 min from nowcalber: first, -314 to -309 min from nowcalber: read, -308 to -305 min from nowcalber: first, -305 to -302 min from nowcalber: read, -302 to -299 min from nowcalber: first, -299 to -296 min from nowcalber: read, -296 to -292 min from nowcalber: first, -291 to -290 min from now, failed or sent backcalber: held, -288 to -286 min from now, failed or sent backcalber: held, -284 to -263 min from nowcalber: build, -263 to -262 min from nowcalber: first, -262 to -256 min from nowcalber: read, -256 to -253 min from nowcalber: first, -253 to -247 min from nowcalber: read, -247 to -240 min from nowcalber: first, -240 to -237 min from nowcalber: read, -237 to -234 min from nowcalber: first, -234 to -231 min from nowcalber: anchor, -231 to -228 min from nowcalber: read, -228 to -222 min from nowcalber: build, -222 to -222 min from nowcalber: families, -221 to -220 min from nowcalber: first, -220 to -194 min from nowcalber: read, -194 to -192 min from nowcalber: first, -192 to -189 min from nowcalber: held, -189 to -168 min from nowcalber: read, -168 to -165 min from nowcalber: first, -165 to -162 min from nowcalber: read, -162 to -156 min from nowcalber: first, -156 to -153 min from nowcalber: held, -153 to -131 min from nowcalber: read, -131 to -121 min from nowcalber: proof, -121 to -98 min from nowcalber: read, -98 to -87 min from nowcalber: first, -87 to -84 min from nowcalber: transform, -84 to -82 min from nowcalber: first, -82 to -78 min from nowcalber: held, -78 to -56 min from nowcalber: first, -56 to -53 min from nowcalber: read, -53 to -45 min from nowcalber: first, -45 to -38 min from nowcalber: read, -38 to -26 min from nowcalber: build, -26 to -25 min from nowcalber: families, -25 to -24 min from nowcalber: transform, -24 to -22 min from nowcalber: first, -22 to -2 min from nowcalber: build, -2 to -2 min from nowcalber: first, -2 to 0 min from nowcalber, forecast: first, in 0 mincalber, forecast: first, in 0 mincalber, forecast: first, in 2 mincalber, forecast: first, in 4 mincalber, forecast: first, in 5 minwhitewolfwhitewolf: first, -360 to -356 min from nowwhitewolf: read, -356 to -353 min from nowwhitewolf: first, -353 to -348 min from nowwhitewolf: read, -348 to -345 min from nowwhitewolf: first, -345 to -331 min from nowwhitewolf: read, -331 to -327 min from nowwhitewolf: first, -327 to -313 min from nowwhitewolf: read, -313 to -308 min from nowwhitewolf: first, -308 to -299 min from nowwhitewolf: read, -299 to -296 min from nowwhitewolf: first, -296 to -291 min from nowwhitewolf: first, -291 to -290 min from now, failed or sent backwhitewolf: held, -288 to -286 min from now, failed or sent backwhitewolf: held, -284 to -251 min from nowwhitewolf: build, -251 to -251 min from nowwhitewolf: first, -251 to -246 min from nowwhitewolf: read, -246 to -240 min from nowwhitewolf: first, -240 to -235 min from nowwhitewolf: read, -235 to -232 min from nowwhitewolf: first, -232 to -223 min from nowwhitewolf: transform, -223 to -220 min from nowwhitewolf: build, -220 to -219 min from nowwhitewolf: first, -219 to -204 min from nowwhitewolf: read, -204 to -202 min from nowwhitewolf: first, -202 to -162 min from nowwhitewolf: read, -162 to -152 min from nowwhitewolf: first, -152 to -142 min from nowwhitewolf: read, -142 to -129 min from nowwhitewolf: first, -129 to -119 min from nowwhitewolf: read, -119 to -115 min from nowwhitewolf: first, -115 to -106 min from nowwhitewolf: read, -106 to -96 min from nowwhitewolf: first, -96 to -86 min from nowwhitewolf: read, -86 to -82 min from nowwhitewolf: first, -82 to -77 min from nowwhitewolf: read, -76 to -71 min from nowwhitewolf: transform, -71 to -68 min from nowwhitewolf: first, -68 to -58 min from nowwhitewolf: read, -58 to -53 min from nowwhitewolf: first, -53 to -33 min from nowwhitewolf: families, -33 to -32 min from nowwhitewolf: held, -32 to 0 min from nowwhitewolf, forecast: held, in 0 minwhitewolf, forecast: build, in 1 minwhitewolf, forecast: first, in 2 minwhitewolf, forecast: first, in 3 minwhitewolf, forecast: read, in 5 minboburner-cudaboburner-cuda: islands, -287 to -284 min from now, failed or sent backboburner-cuda: islands, -284 to -241 min from nowboburner-cuda, forecast: islands, in 0 minboburner-cuda, forecast: islands, in 2 minboburner-cuda, forecast: islands, in 4 mincalber-cudacalber-cuda: islands, -288 to -286 min from nowcalber-cuda: islands, -284 to -1 min from nowcalber-cuda: islands, -1 to 0 min from nowcalber-cuda, forecast: islands, in 0 mincalber-cuda, forecast: islands, in 1 mincalber-cuda, forecast: islands, in 2 mincalber-cuda, forecast: islands, in 4 mincalber-cuda, forecast: islands, in 6 mincalber-cuda, forecast: islands, in 8 minwhitewolf-cudawhitewolf-cuda: islands, -287 to -286 min from now, failed or sent backwhitewolf-cuda: islands, -284 to -1 min from nowwhitewolf-cuda: islands, -0 to 0 min from nowwhitewolf-cuda, forecast: islands, in 0 minwhitewolf-cuda, forecast: islands, in 1 minwhitewolf-cuda, forecast: islands, in 3 minwhitewolf-cuda, forecast: islands, in 5 minwhitewolf-cuda, forecast: islands, in 7 minmacminimacmini: read, -360 to -358 min from nowmacmini: first, -358 to -357 min from nowmacmini: read, -357 to -356 min from nowmacmini: first, -356 to -351 min from nowmacmini: read, -351 to -351 min from nowmacmini: first, -351 to -348 min from nowmacmini: read, -348 to -345 min from nowmacmini: first, -345 to -344 min from nowmacmini: read, -344 to -343 min from nowmacmini: first, -343 to -342 min from nowmacmini: read, -342 to -341 min from nowmacmini: first, -341 to -338 min from nowmacmini: read, -338 to -336 min from nowmacmini: first, -336 to -334 min from nowmacmini: read, -334 to -330 min from nowmacmini: first, -330 to -328 min from nowmacmini: read, -328 to -326 min from nowmacmini: first, -326 to -325 min from nowmacmini: read, -325 to -320 min from nowmacmini: first, -320 to -316 min from nowmacmini: read, -316 to -314 min from nowmacmini: first, -314 to -312 min from nowmacmini: read, -312 to -307 min from nowmacmini: first, -307 to -302 min from nowmacmini: read, -302 to -301 min from nowmacmini: first, -301 to -299 min from nowmacmini: read, -299 to -298 min from nowmacmini: first, -298 to -296 min from nowmacmini: read, -296 to -295 min from nowmacmini: first, -295 to -293 min from nowmacmini: read, -293 to -292 min from nowmacmini: first, -292 to -290 min from nowmacmini: first, -290 to -289 min from now, failed or sent backmacmini: families, -288 to -288 min from nowmacmini: held, -288 to -286 min from now, failed or sent backmacmini: held, -284 to -276 min from nowmacmini: build, -276 to -276 min from nowmacmini: first, -276 to -268 min from nowmacmini: transform, -268 to -267 min from nowmacmini: read, -267 to -266 min from nowmacmini: first, -266 to -256 min from nowmacmini: read, -256 to -255 min from nowmacmini: first, -255 to -252 min from nowmacmini: read, -252 to -250 min from nowmacmini: first, -250 to -248 min from nowmacmini: read, -248 to -245 min from nowmacmini: first, -245 to -244 min from nowmacmini: read, -244 to -242 min from nowmacmini: first, -242 to -238 min from nowmacmini: transform, -238 to -237 min from nowmacmini: read, -237 to -234 min from nowmacmini: first, -234 to -230 min from nowmacmini: held, -230 to -223 min from nowmacmini: read, -223 to -222 min from nowmacmini: build, -222 to -222 min from nowmacmini: first, -221 to -207 min from nowmacmini: read, -207 to -207 min from nowmacmini: first, -207 to -202 min from nowmacmini: proof, -202 to -194 min from nowmacmini: first, -194 to -190 min from nowmacmini: held, -190 to -182 min from nowmacmini: first, -182 to -180 min from nowmacmini: read, -180 to -179 min from nowmacmini: first, -179 to -176 min from nowmacmini: read, -176 to -172 min from nowmacmini: first, -172 to -170 min from nowmacmini: transform, -170 to -169 min from nowmacmini: first, -169 to -167 min from nowmacmini: read, -167 to -166 min from nowmacmini: first, -166 to -164 min from nowmacmini: read, -164 to -164 min from nowmacmini: first, -164 to -162 min from nowmacmini: read, -162 to -159 min from nowmacmini: first, -159 to -157 min from nowmacmini: read, -157 to -156 min from nowmacmini: first, -156 to -150 min from nowmacmini: read, -150 to -150 min from nowmacmini: first, -150 to -147 min from nowmacmini: read, -147 to -145 min from nowmacmini: first, -145 to -144 min from nowmacmini: read, -144 to -141 min from nowmacmini: first, -141 to -140 min from nowmacmini: read, -140 to -140 min from nowmacmini: first, -140 to -138 min from nowmacmini: read, -138 to -138 min from nowmacmini: first, -138 to -134 min from nowmacmini: transform, -134 to -133 min from nowmacmini: read, -133 to -132 min from nowmacmini: first, -132 to -129 min from nowmacmini: families, -129 to -129 min from nowmacmini: read, -129 to -128 min from nowmacmini: first, -127 to -126 min from nowmacmini: read, -126 to -122 min from nowmacmini: first, -122 to -121 min from nowmacmini: proof, -121 to -113 min from nowmacmini: first, -113 to -111 min from nowmacmini: read, -111 to -110 min from nowmacmini: first, -110 to -109 min from nowmacmini: read, -109 to -107 min from nowmacmini: transform, -107 to -106 min from nowmacmini: read, -106 to -106 min from nowmacmini: first, -106 to -104 min from nowmacmini: read, -104 to -102 min from nowmacmini: first, -102 to -101 min from nowmacmini: held, -101 to -93 min from nowmacmini: read, -93 to -91 min from nowmacmini: first, -91 to -89 min from nowmacmini: read, -89 to -86 min from nowmacmini: first, -86 to -83 min from nowmacmini: read, -83 to -81 min from nowmacmini: first, -81 to -77 min from nowmacmini: read, -77 to -66 min from nowmacmini: first, -66 to -64 min from nowmacmini: read, -64 to -58 min from nowmacmini: first, -58 to -57 min from nowmacmini: read, -57 to -56 min from nowmacmini: first, -56 to -54 min from nowmacmini: read, -54 to -47 min from nowmacmini: first, -47 to -46 min from nowmacmini: read, -46 to -44 min from nowmacmini: first, -44 to -43 min from nowmacmini: held, -43 to -36 min from nowmacmini: proof, -36 to -28 min from nowmacmini: read, -28 to -27 min from nowmacmini: build, -27 to -27 min from nowmacmini: held, -26 to -19 min from nowmacmini: first, -19 to -8 min from nowmacmini: transform, -8 to -7 min from nowmacmini: first, -7 to -4 min from nowmacmini: build, -4 to -4 min from nowmacmini: transform, -4 to -3 min from nowmacmini: families, -3 to -3 min from nowmacmini: first, -3 to -0 min from nowmacmini: first, -0 to 0 min from nowmacmini, forecast: first, in 0 minmacmini, forecast: first, in 2 minmacmini, forecast: first, in 3 minmacmini, forecast: first, in 5 minjaguaribejaguaribe: build, -246 to -244 min from nowjaguaribe: first, -244 to -237 min from nowjaguaribe: read, -237 to -233 min from nowjaguaribe: first, -233 to -229 min from nowjaguaribe: held, -229 to -210 min from nowjaguaribe: build, -210 to -210 min from nowjaguaribe: first, -210 to -202 min from nowjaguaribe: proof, -202 to -183 min from nowjaguaribe: read, -183 to -177 min from nowjaguaribe: first, -177 to -173 min from nowjaguaribe: read, -173 to -170 min from nowjaguaribe: first, -170 to -162 min from nowjaguaribe: read, -162 to -158 min from nowjaguaribe: first, -158 to -150 min from nowjaguaribe: read, -150 to -147 min from nowjaguaribe: first, -147 to -131 min from nowjaguaribe: read, -131 to -126 min from nowjaguaribe: first, -126 to -110 min from nowjaguaribe: held, -110 to -92 min from nowjaguaribe: read, -92 to -89 min from nowjaguaribe: first, -89 to -85 min from nowjaguaribe: read, -85 to -71 min from nowjaguaribe: first, -71 to -59 min from nowjaguaribe: read, -59 to -42 min from nowjaguaribe: first, -42 to -38 min from nowjaguaribe: read, -38 to -35 min from nowjaguaribe: first, -35 to -31 min from nowjaguaribe: read, -31 to -20 min from nowjaguaribe: build, -20 to -19 min from nowjaguaribe: first, -19 to -12 min from nowjaguaribe: families, -12 to -9 min from nowjaguaribe: first, -9 to -1 min from nowjaguaribe: build, -1 to -0 min from nowjaguaribe: first, -0 to 0 min from nowjaguaribe, forecast: first, in 0 minjaguaribe, forecast: first, in 1 minjaguaribe, forecast: first, in 3 minjaguaribe, forecast: first, in 5 minmacmac: promote, -290 to -288 min from nowmac: promote, -226 to -224 min from nowmac: promote, -127 to -126 min from now, failed or sent backmac: promote, -90 to -90 min from now, failed or sent backmac: promote, -31 to -30 min from nowmac: promote, -8 to -6 min from nowgeneration: r0068generation: r0069generation: r0073generation: r0074failed: r0071failed: r0072proof: proofnow: forecast from heremeasuredFirst readRead onHeld-outFamilies, testsBuildProof, anchorTransformGPU islandFailedSolid: done. Outline: forecast. Vertical green: a generation. Vertical red: a passed candidate stopped by tests.
Fig. 3. Six hours measured, and what comes next. Each machine's jobs from the event log, then the queue dealt to the lanes at the last day's medians, at 12:02. The screen Queue, Timeline draws the same data live.
now+30 min+60 minBuild the generationcolumbia, whitewolfBuild the generation: ready, 0 min. 3370595 on 5 of 7 machinesTrials: the fit and the A/Bboburner, calber +3Trials: the fit and the A/B: running, 7 min. 20 queued, 5 runningRead on until decidedboburner, calber +5Read on until decided: ready, 2 min. 1 queued, 0 runningHeld-out read, 400 seedscolumbia, whitewolfHeld-out read, 400 seeds: running, 13 min. passes at z 0.50; 0 waitingFamilies hold their floorsboburner, calber +5Families hold their floors: waiting, 1 min. 0 waitingTests, then carried on the linemacTests, then carried on the line: waiting, 1 min. generation 4 this runThe line read against mainboburner, calber +5The line read against main: ready, 8 min. 3 generation(s) on the line, last read {"head": "9d438c8", "d": -0.28, "se": 0.17, "z": -1.64, "seeds": 800}Main: the game's brainmacMain: the game's brain: waiting, 1 min. z 3.0 past main to go on itTransform: learned overrideboburner, calber +5Transform: learned override: ready, 87 min. SPSA over 942 numbers, a census a stepThe game reads a transformNOT BUILTThe game reads a transform: not built, 0 min. the game has no file for a slot, so nothing learned can shipGPU islands: cruciblecalber-cuda, whitewolfGPU islands: crucible: running, 12 min. its own arena, senses and netBridge: crucible into treadcoreNOT BUILTBridge: crucible into treadcore: not built, 0 min. until built, GPU work cannot reach the gameOne brain in treadcoreOne brain in treadcore: waiting, 0 min. rules, dials and transform as one
Fig. 4. What is scheduled. The line as tasks, with dependencies as arrows, machines, and durations the fleet measured. The black box is the next essential task, the one most work depends on. This is the Queue, Board screen at 12:02.

The fine stripes on the left are the 90-second first reads. Long orange bars are held-out reads, at about 13 minutes each. The pink ones are the line's proof. The gap near 07:15 is the keeper's restart for the ratchet.

III. A report on each training method

Each is a proposer of something the game might use. The verdict at the end of each is what it adds to treadcore today.

Method. suggest.py fits the ledger of every census and draws from what the fit does not yet know, keeping each number inside RANGES. The sequential census reads it. Conditions. Whole matches of bots, on all eleven maps. Spend. 105 of the day's 114 hours, with A/B. Result. First reads since the current defaults average z +0.18, with 59% at or above zero. Report: difficulty. Adds: the numbers in weights.rs and tactics.rs, and so how every bot plays. Reaches the game.

B. A/B versions

Method. Every switch flipped and every choice's other versions, each generation: 37 today. Conditions. The same census. Result. A/B reads worse at first, z -0.80 with 30% above zero, because most switches are on for a reason. But it has passed every real held-out read it reached since 31 October, three of three. The single-change trials also make the cleanest commits: w4399 and w2087, the last two generations, each changed one thing. Report: brain versions. Adds: which functions run. Reaches the game.

C. Families

Method. Set pieces, not matches: a duel in the open, a raid on a guarded base, a rolling tank under two shells. Nine families, 6,600 runs, 33 seconds in all, each with a floor. Result. See Section VI. Adds: a veto, so that the average cannot rise by trading away a skill. Reaches the game by what it refuses.

D. Anchors and the proof

Method. After a generation, the defaults from three generations back are read as a trial. Each hour, main's values are read against the line. Result. The clearest good news in this report. The defaults before r0060 read -5.87 +/- 0.66 and -5.40 +/- 0.67 against today's; those before r0062 read -4.08 +/- 0.66 and -3.42 +/- 0.64. Those gaps are three promotions' work, measured on seeds no search saw, and they are a far larger signal than any single generation's read. The proof, by contrast, reads the one carried generation at -0.14 +/- 0.16 against main: no difference yet. Adds: the correction and the gate. Decides what reaches the game.

E. The transform

Method. A residual net over the rules' Move: it reads the senses, the biorhythm and the rules' own answer, and may move the point if it is confident. All zeros is the brain as it was. SPSA moves all 942 numbers by one noisy census a step. Conditions. The census with the patch switched on. Spend. About half an hour a day. Result. Six steps today read between -3.72 and +4.97 with errors near 2: noise, as expected this early. Report: Algorhythm. Adds: nothing yet. The census reads the slot; the game has no file for it.

F. Crucible's GPU islands

Method. 2,048 small nets per island duel on the card, 128 episodes and 100 generations a segment, with champions passed between islands. Conditions. Its own arena: 64 x 64, six pillars, twelve rays, one shell each. A net of 32 inputs and 3 outputs. Spend. 7.5 hours a day today, on cards that do 400 to 580 million tank-steps a second. Report: one source, two CUDAs. Adds: nothing. No road. See Section VI.

G. Imitation: record, train, school, gauntlet

Method. Recorded rule-brain matches teach a net of about 16,000 numbers, then it is examined. State. Dormant since 30 October: the rotation now holds only the transform. Result. The learned tank is about 20 a seat behind the rules. Report: a CUDA node, LEARNING-DESIGN. Adds: nets/bc2.bin, seated by the census. The client never loads a net.

H. Whole-brain sweeps

Switches, parts, a census of the best, round robin: each part alone against the defaults. State. Dormant since 29 October, with the A/B doing the same job continuously. Adds: readings the fit can use through the ledger.

I. Older searches

SPSA and tune over a chosen few dials. State. Dormant since 29 October. They are duplicates of the fit in purpose, and the fit has the better record. Adds: nothing the fit does not. They should stay asleep, and their runs stay available by hand.

J. Duplication, plainly

There is one real duplication left: three dormant ways of searching dials. The live methods do not overlap. But the CPU lanes and the GPU lanes are not one brain. The CPU search is a hand-written program being tuned, and the GPU search is a different creature in a different world.

First readfirst: 1649 jobs, 64.6 h64.6 h, 1649 jobsRead onread: 1335 jobs, 38.7 h38.7 h, 1335 jobsGPU islandislands: 277 jobs, 9.9 h9.9 h, 277 jobs: no road to the gameHeld-outheld: 29 jobs, 8.0 h8.0 h, 29 jobsProofproof: 6 jobs, 1.2 h1.2 h, 6 jobsTransformtransform: 28 jobs, 0.7 h0.7 h, 28 jobs: no road to the gameBuildbuild: 25 jobs, 0.2 h0.2 h, 25 jobsFamiliesfamilies: 11 jobs, 0.1 h0.1 h, 11 jobsTestspromote: 4 jobs, 0.1 h0.1 h, 4 jobsAnchoranchor: 2 jobs, 0.1 h0.1 h, 2 jobs
Fig. 5. Where a day's machine-hours went. Grey has no road to the game yet. Families cost almost nothing, which is why making them easier buys nothing.

IV. What the history says

became a generationstopped by the brain's tests29 Oct30 Oct31 Oct01 Novr0009 10-28T10:12 @strongest: failed the brain's tests failed (weights::tests::default_weights_are_todays_constants): see logs/r0009-promote.logr0019 10-28T14:14 grove/w0034: approved w_near 1.0 -> 2.0; w_in_range 0.7 -> 1.4r0046 10-29T14:06 grove/w1198: failed the brain's tests failed: see logs/r0046-promote.logr0048 10-29T14:17 grove/w1266: failed the brain's tests failed (commander::tests::a_capped_castle_fills_then_lines_the_road): see logs/r0048-promote.logr0050 10-29T16:19 grove/w1198: failed the brain's tests failed (tactics::tests::the_square_law): see logs/r0050-promote.logr0051 10-29T16:29 grove/w1266: approved w_finish 0.8 -> 0.552896; w_in_range 1.4 -> 0.930063r0057 10-30T07:31 grove/w1463: approved w_in_range 0.930063 -> 1.4; dodge_horizon 1.08307 -> 1.08151r0060 10-30T10:25 grove/w1554: approved press_odds 2.67535 -> 1.33767; kite_in 4.5 -> 2.25r0061 10-30T12:57 grove/w1656: failed the brain's tests failed (commander::tests::a_switch_comes_back_and_a_slider_keeps_the_target): see logs/r0061-promote.logr0062 10-30T13:07 grove/w1656: approved caps pings on -> offr0068 10-31T22:23 grove/w2087: approved mine_plan 2.0 -> 1.0r0069 11-01T08:16 grove/w4399: self-modified caps bridges on -> offr0071 11-01T09:54 grove/w4540: failed the brain's tests failed (bio::tests::with_bio_off_there_is_no_wave_at_all): see logs/r0071-promote.logr0072 11-01T10:31 grove/w4616: failed the brain's tests failed (weights::tests::a_slider_steps_and_steps_back, weights::tests::smooth_is_a_weight_that_blends_and_thresholds): see logs/r0072-promote.logr0073 11-01T11:30 grove/w4540: self-modified bio 0.0 -> 3.0r0074 11-01T11:54 grove/w4749: running answer_cap 3.0 -> 2.46205; alpha 0.4 -> 0.394583
Fig. 6. Every promotion ever asked. 8 became generations and 8 failed, all at the brain's unit tests and none at a family. The last two failed on tests that read the defaults they were meant to be independent of.

A. Half of all promotions stopped at a test

AskedCandidateEndedWhy
28 Oct 10:12@strongestfaileddefault_weights_are_todays_constants
29 Oct 14:06, 16:19w1198, twicefailedthe tests; the_square_law
29 Oct 14:17w1266faileda_capped_castle_fills_then_lines_the_road
30 Oct 12:57w1656faileda_switch_comes_back_and_a_slider_keeps_the_target
1 Nov 09:54w4540failedwith_bio_off_there_is_no_wave_at_all
1 Nov 10:31w4616faileda_slider_steps_and_steps_back, smooth_is_a_weight_...

These tests are not catching bad brains. They call Settings::default() and then assert a number, so when the fleet moves that default the test fails. brains.md already gives the rule: "If an existing test pins a number the choice moves, give that test the number it was written for." The last failures break that rule. Any trial that moves alpha cannot promote, and 65 of the last 177 fit draws (37%) move it. The seven failures hit six different tests, so fixing them one failure at a time is slow: each costs a passed candidate.

The patch is small edits to tests alone, in whole-line/treadcore-test-pins.patch. We applied it to a scratch copy of 9d438c8 with both failed candidates' values and ran the brain's tests: 134 passed, 0 failed.

Because the failures keep finding new tests, we then looked for all of them at once: every number that the search may move, 107 of them, moved 7% together, inside RANGES. That found three more pinned tests before they could stop a candidate: the_posture_leans_the_ladder, a_fleet_crosses_a_bridge_in_file and a_switch_comes_back_and_a_slider_keeps_the_target. The patch fixes those too, six tests in three files, and with it all 134 pass at +7% and with both candidates' values. Moving everything together by -40% or +50% still fails 5 and 3 tests, among them every_scenario_holds. We left those alone: a brain with every dial that far out may really be a different brain, and that is what those tests are for.

Applied, 1 November, at Paul's word ("commit. push. impliment."), as treadcore 1b14192. Main moving did the rest with no hand on it: the planner replayed the line on top of it as 62f5a00 and retried both stopped candidates, and w4540 went through the tests that had stopped it. A failure like these can still come from a test nobody has found, so the Board now marks any stopped promotion as blocked and next essential.

B. Why the red bar looked like failure

The Queue page drew "2,429 failed or stopped" in one red bar. Here is what it held:

JobsHours spentWhat it is
Stopped, first reads and reads on2,1240.2queued for a generation that was overtaken: they never ran
Stopped, other14613.5builds, held-out reads, whole runs, and what a person or a restart stopped
Failed, first reads and reads on1124.2the job exited 0 on nearly all; 108 of the fleet's failures are on saskatchewan and columbia, where SSH penalties hit, so most likely results that could not be fetched
Failed, GPU segments400.1no machine named on nearly all: not started or stopped with the queue
Failed, promotions70.1Section IV-A
Failed, families00

The bar now draws retired apart from failed, in grey.

C. What a generation throws away

Each generation discards every read on the old defaults. When r0069 landed at 08:18, two held-out reads in progress would have passed: w4398 at z 0.83 and w4424 at z 1.07. The 2,124 retired jobs above are the same effect, cheaply. It matters more the faster generations come: at one every 30 minutes, a trial that needs 25 minutes of reads rarely finishes. This limits the pace, and the simulation in Section V does not model it, so its pace figures are optimistic.

So a generation now carries what it would have lost. carry_passes takes up to three trials that passed on the defaults the last generation replaced, strongest first, and gives each one read on the new ones, ahead of the search. Only one generation back, because a read says less as the defaults drift. Run against the live queue, it chose exactly w4424 and w4398.

D. The funnel, at the current defaults

In the 2.5 hours from 08:20: 212 first reads, 139 reads on, 10 held-out reads. Of 121 trials decided, 113 were dropped and 8 passed the read-on bars. Of the real held-out reads, 2 passed, and tests stopped both. No generation was carried in that time. Without the test failures, the same passes would have come 98 and 37 minutes apart.

V. The values

Every number that sets the difficulty, and how much is carried, now lives in one table, tools/plans/line.json, and is changed by the Values page, by tools/fleet-tune.py QUEUE KEY VALUE, or by hand in QUEUE/tuning.json. A change is live at the next plan, about a minute, and restarts nothing. Each is held to its range at the button, in the tool and in the planner. A broken file means the defaults, never a stopped plan.

ValueNowRangeWhat it does
Ease now (ease_now)2.5 errors, moved0.0 to 3.0How far every pass bar sits under z 3 right now. Held z = 3 less this. Changing it moves the bar once; each generation then takes the step below off it.
Ease ceiling (ease_max)2.75 errors0.0 to 3.0The easiest a dry spell may make the bars. Past 2.75 the simulated gain a day falls away and half of what passes is truly worse.
Harder each generation (harden)0.05 errors0.0 to 0.5What each generation takes off the ease.
Dry before easing (dry_min)240 min30 to 1440How long with no generation before the bars ease. Paul set four hours.
Easing step (ease_step)0.25 errors0.05 to 1.0What a dry spell adds to the ease, at once and again each interval below.
Easing again every (dry_again_min)60 min10 to 480After the first easing, how long before the next.
Read-on bars eased at most (keep_ease)0.5 errors0.0 to 2.0How far the keep-reading bars may fall with the rest. Simulated, more than 0.5 buys no gain a day and spends lanes on what is dropped later.
Proof bar (held_z)3.0 z2.0 to 5.0How far past main the carried line must read to go on main. The ease is taken from this for a generation, and nothing is taken for main. Moving it also moves the generation bar.
Line against main every (proof_every_min)60 min15 to 720How often the line gets its 800 seeds against main.
Anchor reads back (anchor)3 generations1 to 12How many generations back each new generation is read against, to catch slow drift.
Queue depth a machine (queue_per_machine)4 jobs1 to 12How many jobs wait for each CPU machine. The queue is first come, so depth is how long a finding waits.
Passes carried a generation (carry_max)3 trials0 to 10How many trials that passed on the old defaults get one more read on the new ones when a generation lands. 0 throws them away, as it was.
Seeds in a held-out read (held_seeds)400 seeds100 to 1600How many starting worlds a held-out read plays. The proof is two of them.

A. What they buy

tools/plans/difficulty-sim.py now takes this game's noise and the read-on limit. The prior had to be calibrated, because fitting it to first reads (N(-0.14, 1.03)) gave one generation every 11 minutes, which the run plainly does not do: outliers such as the anchors inflate the spread. N(-0.65, 0.45) at 9,000 seeds an hour reproduces 86 trials an hour against the 85 measured, and a pass rate of 7% against 6%; it gives 20% at the held-out read against two of five measured, a handful.

Minutes between generations0255075100ease 2.0: one every 86 min, 25% truly worse, +3.8 a day2ease 2.2: one every 65 min, 29% truly worse, +4.0 a day2.2ease 2.4: one every 48 min, 35% truly worse, +3.7 a day2.4ease 2.5: one every 44 min, 42% truly worse, +2.6 a day2.5ease 2.6: one every 37 min, 37% truly worse, +4.6 a day2.6ease 2.75: one every 34 min, 45% truly worse, +2.1 a day2.75ease 3.0: one every 26 min, 49% truly worse, +1.1 a day3set: 2.6Gain a day, points a seat0.01.53.04.56.0ease 2.0: one every 86 min, 25% truly worse, +3.8 a day2ease 2.2: one every 65 min, 29% truly worse, +4.0 a day2.2ease 2.4: one every 48 min, 35% truly worse, +3.7 a day2.4ease 2.5: one every 44 min, 42% truly worse, +2.6 a day2.5ease 2.6: one every 37 min, 37% truly worse, +4.6 a day2.6ease 2.75: one every 34 min, 45% truly worse, +2.1 a day2.75ease 3.0: one every 26 min, 49% truly worse, +1.1 a day3set: 2.6the ease: how far every bar sits under z 3
Fig. 7. What an ease buys, simulated. 30,000 trials a point, on a prior fitted so the funnel looks like the run's. Pace improves steadily; gain a day stays flat and noisy to 2.6, then falls. These are small differences on a rough model.
EaseHeld zOne everyTruly worseGain a day
2.01.0086 min25%+3.8
2.20.8065 min29%+4.0
2.40.6048 min35%+3.7
2.50.5044 min42%+2.6
2.60.4037 min37%+4.6
2.750.2534 min45%+2.1
3.00.0026 min49%+1.1

The Monte Carlo error on these is large enough that 2.5 and 2.6 are not really different. The shape is what to trust: the gain holds to about 2.6, then falls.

Raising the read-on limit from 0.5 to 0.75 or 1.0 bought no gain at any ease, so it stays at 0.5.

B. What was applied to the run

Applied at about 10:40 and read back from the planner's own state:

  • Ease now 2.6, held z 0.40. This is the fastest setting that gives up no gain. From here each generation takes 0.05 off.
  • Ease ceiling 2.75, down from 3.0. At 3.0, a generation can pass on no evidence at all, and half are truly worse.

Everything else stays where you set it: 0.05 harder each generation, and four hours dry before easing.

About half an hour is not reachable through the bars alone. The simulation reaches 30 minutes only at an ease near 2.75 with the read-on limit raised, where gain falls to +1.2 a day. The honest expectation is 35 to 50 minutes, and whether the carry improves on it is not yet measured.

VI. Families and crucible

A. Are families failing?

No. Across 130 family verdicts on record, 2 were UNDER, both on the defaults and both one family, a raid on a guarded base at 70.2% against a floor of 75%. You lowered that floor to 65% on 30 October. All 62 of the fleet's candidates hold every floor. What looked like family failure was the tests and the red bar of Section IV.

FamilyMean heldFloorMargin in errors
a duel in the open85.5%55%16
a raid on a guarded base71.6%65%3.5
a tank under a ready gun81.4%80%1.2
a rolling tank under two shells99.3%99%1.0
five others99.8 to 100%95 to 99%3.5 or more

B. Should families have a difficulty adjustor?

No, and none was built. An adjustor would make floors easier to pass, and the floors are not what stops anything. It would save nothing: all nine families together cost 33 seconds, about 0.1 hours a day (Fig. 5). The floors are also your decision, in the scenario files. Two sit close, a ready gun and two shells, and those are the first to watch if a family ever does begin to fail.

C. Can the beginning success rate improve?

Yes, and the bars are the wrong lever, because Section V shows the read-on limit buys nothing. In order of what each would buy:

  1. The test patch, done. More than a third of fit draws became promotable at once.
  2. Carry a pass across a generation, done. A trial that passed on the replaced defaults gets a held-out read on the new baseline. It covers held-out passes only: a trial still in its reads on when a generation lands is still dropped. Its gain is not yet measured.
  3. Test before the long read. Running the tests before a 13-minute held-out read would save a read each time they fail. After the patch they should rarely fail, so this comes after it.
  4. Keep the proposers as they are. Fit draws lead at first read and A/B leads at held-out read, so neither should crowd out the other. Moving families earlier would save nothing, since they almost never fail.

D. Is crucible like the families?

They are opposite in role, and the difference is useful. A family is a veto: a cheap fixed test on the game's own simulation that can only say no. Crucible is a proposer: an enormously fast search in another world that cannot yet say anything about this one.

The likeness points to the way to join them. A family is a short scene on the real simulation with a pass rate, so the families are the natural exam for a bridged net, and later the natural curriculum. Duelling skill from crucible, cloned into a net with treadcore's senses, could be read first against a-duel-in-the-open and the shell families, in 33 seconds, long before it faces a census. That is a far cheaper first read than any it has now.

E. Is crucible's net an optional import for treadcore?

No, and it cannot be yet. The two have nothing in common but the word:

crucible's nettreadcore's Net
Reads32: twelve rays, bearing, speed, hit points, reload143 senses of the real game
Decides3: turn, throttle, fire42 scores across seven action heads
Worldan empty arena, a duelbases, drones, depots, mines, teams
Used bycrucibleNetBrain, in the census, the tests and the trainer

Treadcore's own NetBrain is not an option for players either: the client has no way to load a net. So the sliders move dials today, not brains. The model and patch rows do appear in the U page, as every weight does, and that looks like a bug to fix: from reading patch.rs, moving patch above 0 asks for CENSUS_PATCHES, which a player's machine does not have, and it panics. We read this and did not run it. The design in brains.md is a bridge: play a champion as a teacher inside an arena with treadcore's senses, and clone it into a treadcore net (behaviour cloning, as bc1 was made). The result goes in slot 7 and is read like anything else.

Expect little at first. A clone learns to duel, and the census scores a whole game. Its likeliest use is a patch or a role rather than a whole brain.

VII. One approach

A. Every method is a proposer

The fit (suggest.py)A/B: switches, choicesWide trialsOlder searches (SPSA, tune)Transform (a netlet)Crucible, by the bridge (a netlet)Imitation (a netlet)Check-ina weights fileor a slot, withwhere it camefromPreflighttests,families: undera minuteReadfirst and readonHeld-outthegeneration'sreadLinea commit;snapshotProofz 3 past mainMainthe gameOne road: a proposer only has to produce something the census can seat.Dashed red: the road exists in the census only, or not at all. Every proposer is judged by the sameread, so adding one adds no new process: only a way to ask better questions.
Fig. 8. The approach proposed. Every method is a proposer, and one road judges them all. Preflight is new; the rest is what the dial search already has.

The unification is one sentence: a method's only job is to produce something the census can seat, and the same road judges all of them. The dials already work this way. The transform and the nets become the same once the game can load a slot. The rule costs no new process, and it makes the GPU question precise: not "how do we use the GPUs" but "what can crucible hand to the check-in?"

B. Check-ins and netlets

A check-in is one proposal entering the road, one record: what it is (a weights file or a slot), its hash, who proposed it (fit, A/B, SPSA, crucible segment), its parent generation, each read, and how it ended. Today those facts are spread across the job, the results/ directory and the run's state. plan/pipeline.json's traces assembles them for the last eight, and the generation record keeps them for what is promoted. The step left is to write one for every trial at its end.

A netlet is a small learned part with one job: a slot file and a manifest naming its inputs, outputs, parent and evidence. The transform is the first: 942 numbers, all zeros meaning the brain as it was. The rule that makes netlets safe to keep adding is the transform's own: a netlet that does nothing costs nothing and changes nothing, so the census can read it as it reads any dial. One could steer retreats, another aim mortars. Each is promoted or dropped alone.

C. Mixing brains: computing both

The rules, with today's dialsbuilt; how every bot playsA learned net in a slotbuilt for the census; 20 a seat behindA: by seateach tank is one or the other: roles and modelB: alternatea tank switches on a slow clock: biorhythm's clockC: override when surethe net moves the rules' point if confident: the patchD: blendboth aim; the Move point is a weighted meanA Commandand the census reads it
Fig. 10. Computing two brains and mixing them. Four ways to combine sources, each a weight or choice the fleet can read as it reads any other. C is built; A is built for the census. B and D are proposals.

Your idea fits the house rule, "either/or is a scalar". There are four ways to do it, cheapest and most honest first:

  • C, override when sure, is built: the patch. The rules decide and a net may move their point past a confidence bar. Since the net can only be worse by moving something, the census reads the risk directly.
  • A, by seat, is built for the census: roles and model choose per team. It wants one more step to choose per tank, and no game path yet.
  • B, alternate, a tank following one source and then the other on a slow clock, is new. The biorhythm's clock would serve. It is cheap to compute and gives the game some variety, which a person may enjoy even where the census shows no gain.
  • D, blend, is new and has a limit. The rules produce a decision and the net produces 42 scores, so they cannot be averaged before the choice. They can be averaged afterward, at the Move's point, which is where the patch already acts. It does not apply to firing or building, which are yes or no.

A net decision takes about 10 microseconds, so computing both costs little. Each needs a game-side slot first, which is the same gap again: the game reading a slot is the one piece of work that unblocks netlets, mixing, the bridge, and player-selectable brains together.

D. The order

  1. The test patch. Done: treadcore 1b14192.
  2. Carry a pass across a generation. Done.
  3. A game-side slot: the client loads a patch or net from a file, off by default. This is what makes the transform shippable.
  4. The bridge from crucible to slot 7, with the families as its exam.
  5. Mixing modes B and D as weights, then player sliders for them.

VIII. Storing the record

Generations: textgit, a private repoEach generation's values, evidence,families, tests. It diffs.Packs: everything rawSSD, then GitHub release or discResults, logs, champions, ledgers; xz; eachfile hashed in a manifest.Disc: the long copyBD-R or M-DISC, by handA pack and its manifest. Readable with tarand sha256sum alone.Each generation writes its record at once. A pack is cut when asked; nothing is deleted and nothing leaves this Mac unless a person sends it.
Fig. 9. Where the record goes. Two kinds of thing, kept in the place that suits each.

Generations go in git. tools/fleet-archive.py QUEUE snapshot writes one directory per generation with its values, evidence, families and commit, plus a list of every promotion including the failures. The planner now runs it whenever a promotion finishes. The seven generations so far, with the settings and ledgers, come to 1.2 MB, so years of this fit comfortably in a git repository.

Raw packs go on an SSD, then on release assets or disc. fleet-archive.py QUEUE pack bd25 writes what no earlier pack holds to PACK-NNN.tar.xz, closing each below a disc's size, with MANIFEST.tsv holding every file's sha256. verify reads every file back out and checks it.

The whole record so far was packed and checked: 3.82 GB and 173,018 files went into one 393 MB pack, 9.7 to 1, in 25 minutes at low priority. Reading every file back found 0 differences. It sits at QUEUE/archive/packs/, on this Mac only. The record grows by about 0.9 GB a day raw, or about 95 MB a day packed.

GitHub or disc: both, for different things. My recommendation:

Git repoGitHub release assetBD-R or M-DISC
Holdsgenerations, ledgerspackspacks
Good atdiffing, searching, linking from reportsoffsite copy, one linka copy nothing can change, off any network
Limit100 MB a file; repos should stay small2 GB a file25 GB a disc; a person's time
Riska large repo is slow forevera host's termsa burner, and shelf life

Those GitHub limits are as I know them; check them before relying on them. Both orrery and treadcore are public repositories, and the raw logs hold machine names, user names, addresses and paths. So the record belongs in a separate private repository, and packs should not be published as they stand. Nothing has been sent anywhere.

The manifest is what makes a disc trustworthy decades on: it needs only tar and sha256sum. At this rate a 25 GB BD-R holds about eight months, and today's pack would fit on a CD.

IX. The screens

A. What changed

Explanations. Every screen has an "About this screen" bar. Shut, it is one line saying what the screen does. Open, it answers six questions: what it does, where it ties in, why it is drawn this way, what to look for, what is being simulated, and why it helps the brain. It closes when you leave. A test fails if any screen is missing an answer, or if a word has a character the fonts cannot draw. All the words live in line.json, the same table the planner and this report read.

The queue says why. Queue, Queued lists what is running and waiting, in order, each with a line on why it is there. A held-out read adds the bar it must pass. The upcoming list had been collected and never drawn.

The data has a picture. Queue, Flow draws the road with one real trial traced beneath; Queue, Timeline draws past and forecast by machine; Queue, Values holds the buttons.

A rearrangement. The Pipeline had no key in the Queue's column, and the only way there was a menu. One chapter now has one column: Fleet, Runs, Board, Flow, Timeline, Queued, Values.

B. Too many screens?

There are 27 faces, counting pages and tabs. By what they answer, they fall into five groups, and only one is about the line:

QuestionScreensCount
Is the line moving, and why not?Fleet, Board, Flow, Timeline, Queued, Values, Candidates, Flags, Keeper9
What did it find, and what is in the brain?Found, Commits, Algorhythm (6 tabs), Net9
What are the machines?Machines, Media, Storage, Projects4
Touch a machineLab, Sessions, Orchestrate, Chat4
Ask for something by handRuns1

We removed none. Each still has a job, and removing one is your call. These are the merges I would make next, in order: Algorhythm's Fleet tab goes (Flow replaces it, with more). Net folds into Algorhythm's Matrices, since it shows the same net. Flags and Keeper's alerts become one list. That takes 27 to 24, and the next bigger saving would be moving Media and Chat behind menus, since neither touches the line.

C. Heuristic analysis

Nielsen's ten usability heuristics, applied to the console as it stood this morning:

HeuristicFindingSeverityNow
Visibility of statusRed bar mixed retired with failed, and read as failurehighfixed
Visibility of statusA passed candidate stopped by tests showed nowhere as stoppedhighfixed: blocked, next essential
Match to the real world"Ease", "held z", "stage" are this project's own wordsmediumexplained on Values and in About
User controlNo way to move the difficulty without editing codehighfixed: Values, with Default
ConsistencyQueue's column dropped the chapter's second viewmediumfixed
Error preventionValues could be set past where they were simulatedmediumfixed: ranges, three places
Recognition over recallThe queue's order and reasons existed only in the planner's headhighfixed: Queued
FlexibilityFrequent paths need several clicks; Command-digit reaches chapters onlylowopen
Minimalism27 faces, and eight are not about the line at allmediumexplained; merges proposed
Recover from errorsExpired certificate caused silent network penaltieshighfixed 1 November; no warning before expiry yet
HelpNothing said what a screen was forhighfixed

The search has heuristics of its own, and this is how they held up:

HeuristicHeld?Evidence
Cheap reads firstYesHalf of all trials stop at 55 seeds
Selected reads must be read again unseenYesw4602: z 1.9 pooled, then -0.45 unseen
Cheap checks before expensive onesNoTests run after a 13-minute read and stopped 7 of 14
Fix what stops the mostWas noThe Board's essential was "not built" while the line stood stopped; now fixed
One lower bar with one high gateToo earlyOne generation on the line; proof reads -0.14 +/- 0.16
Generations add upYesAnchors: +3.4 to +5.9 over three promotions, unseen seeds
Lower bars give moreOnly to a pointFig. 7, and no gain at all from the read-on limit

D. Every screen

ScreenWhat it doesWhere it ties inWhat to look forWhat is simulated
MachinesAdds a computer to the fleet: probe it, apply a recipe, join it.The very start of the line. No machine, no lane, no reads.A machine stuck on a step, or a recipe that says ready to run.Nothing runs here. It only makes a machine able to run the census and build the brain.
MediaThe cards and images the machines were made from.Before the line: how a machine came to exist.A card whose image is older than the fleet's.Nothing runs here.
StorageThe fleet's disks and shares: survey, share, mount.Where results and snapshots could live. The training record is stored apart, by fleet-archive.py.A disk filling up, or a 10 Gb link not plugged in.Nothing runs here.
ProjectsSays which machine works on what: treadcore or crucible.Sets which lanes feed the dial track and which feed the GPU track.A machine on no project, or a project paused and forgotten.Nothing runs here. It chooses who runs what.
Queue, FleetEach machine, its job now, and its buttons.Every stage of the line, seen by machine.A lamp not lit under a full queue, or one machine on old work.Whatever each machine shows: mostly the census, 15-minute matches of bots on eleven maps.
Queue, RunsAsks for a one-off run, cancels one, accepts one.A side door into the line: what a person asks goes before the standing search.A run failed or left running with no lanes.Whatever the run is: a census, a sweep, a recording.
Pipeline, BoardThe whole line as tasks: order, machines, expected time, and the next essential task.This is the line. Each bar is a stage.Red: the biggest blocker. NOT BUILT: a gap in the road to one brain.Nothing itself. It reports the medians the fleet measured in the last day.
Pipeline, FlowHow data moves: what each stage takes in and gives out, and one real trial traced through.All of it, by the files that pass between stages.How far each trial got, and where the road stops: a red box means data goes no further.Each box says what it simulates. Pick a trial below to see its reads.
Pipeline, TimelineEvery machine: what it did, what it does now, and what it will do next.All stages, by when and by whom.Gaps on the left are lost time. Green marks are generations. A lane of one colour shows where the fleet spends itself.Bars are mostly the census. Crucible's arena on the -cuda rows.
Pipeline, QueuedWhat is waiting and running, each with why it is there.Each row names its stage in the line.Priority work behind a long queue, or one kind crowding out the rest.Each row says which: a census, a family, a build, the GPU arena.
Pipeline, ValuesThe numbers that set how hard a generation is. Change them here and the next plan uses them.The bars of Read on, Held-out and the Proof.A value away from its default, and whether the generation gap on the Board answers.Nothing itself. tools/plans/difficulty-sim.py simulates what a value buys.
Results, CandidatesTrials past their held-out read: a list of what may become a generation.Between Held-out and Tests.Current ones waiting, and the same one failing tests twice.The rows are census reads. The seeds are unseen by the search.
Results, FoundEach improvement read, by dial and by machine.Search and First read: the ticker of what was tried.A dial that keeps coming up, or one machine reading differently from the others.First reads: 55 seeds, 15-minute matches, on all eleven maps.
Results, NetThe learned tank's net: its weight matrices.The imitation method, dormant since 30 October.Dead rows or columns: a sense or action nothing reaches.Nothing runs here. Its training imitated recorded rule-brain matches.
Results, FlagsWhat needs a person, and what progress was made.Every stage can raise one.Red, unacknowledged; or the same flag rising again.Nothing runs here.
Results, Algorhythm, PatchThe brain as a patch: dials, switches and the transform, in order.Search and Transform: where each number acts.Stages at zero: they cost nothing and do nothing.Nothing runs here. It maps what the census simulates.
Results, Algorhythm, TerrainReads as a landscape over two dials.Search: what the fit believes.Places to look, never results. A peak on thin support is one lucky read.Past censuses, moved to one baseline by assuming gains add.
Results, Algorhythm, SpectrumHow the GPU champions' nets change over time.GPU islands.New bright rows: new directions. Flat means the island has stopped learning.Crucible's arena, not the game.
Results, Algorhythm, MatricesTables of each layer of the shipped net.The imitation method.Low stable rank: the net uses little of its size.Nothing runs here.
Results, Algorhythm, SensesWhich senses the net listens to, drawn round the tank.The imitation method, and the transform's inputs.A dark channel: a sense nobody uses, and a candidate to remove.Nothing runs here.
Results, Algorhythm, FleetThe road from trial sources to main, with live counts.All of the dial track.A count that stops rising.It reports census counts.
LabThe room of machines: a live tile for each.Beside the line: any machine, any time.A dark tile, or a machine hot under load.What the screen shows, or a terminal.
SessionsTerminals for each machine, kept alive in tmux.Beside the line: hands on a machine.A build error or a stack trace nothing reported.Whatever you run.
OrchestrateWho may command the fleet, what each machine is, and the verbs.Beside the line: the authority over machines. Its certificate decides whether Orrery can reach them.A certificate near expiry, or a machine answering differently.Nothing runs here.
ChatOne room to talk with each machine, kept on the machine.Beside the line.A machine that stopped answering.Nothing runs here.
Settings, KeeperIs it running as it should: the keeper's checks, and its buttons.Under the whole line.An amber or red lamp, above all search, difficulty and starving lanes.Nothing runs here.
Settings, CommitsThe line the fleet builds, newest first, with the defaults each changed.Tests, Build and Main: the generations themselves.How often a commit is a generation, and whether a machine is behind.Nothing runs here. The census read each commit's values before it was written.

X. Threats to validity

The simulation is a rough model. Its prior was fitted to the funnel rather than measured, it matches first reads and passes better than it matches held-out reads, and it ignores what a new generation discards. The funnel since the ratchet covers only 2.5 hours and two passes: too small to say whether 2.6 will give the cadence shown. The anchor gains include several promotions, and we did not separate how much each gave. The run moves while this is written, so its numbers are as of about 10:55 on 1 November, and the figures can be redrawn by tools/report/whole-line.py.

XI. Still open

  • A trial still in its reads on when a generation lands is still dropped, and the carry's gain is unmeasured.
  • The game has no slot, so neither the transform, the nets nor any mix can ship.
  • No check-in record is written per trial yet, only per generation.
  • The Timeline and Flow pages need the new build: the running Orrery is the old one until it is reopened.
  • The raw record is on this Mac alone. No disc is burned and nothing is uploaded.
  • The patch row on treadcore's U page looks able to crash a player's game (Section VI-E): read, not run.
  • This report's figures are one moment of the run. The screens are live.

XII. Reproducing this

sh
Q=~/code/treadcore/build/queue/grove
python3 tools/fleet-tune.py $Q                 # the values as they are
python3 tools/fleet-tune.py $Q ease_now 2.6    # move one
python3 tools/plans/difficulty-sim.py --mu -0.65 --tau 0.45 --rate 9000 --keep 0.5
python3 tools/fleet-archive.py $Q snapshot     # generations
python3 tools/fleet-archive.py $Q pack bd25    # raw, for a disc
python3 tools/fleet-archive.py $Q verify
python3 tools/report/whole-line.py $Q && sh tools/report/all.sh

Part Two: The Story and the Guide

Paul, 1 November: "use Orrery. and give a screen by screen breakdown. Annoteate. Add an ammendment second pass more pictures and explanations of screen. With a story of the functions, the transforms, and the data flow. Write a linear story of a lab report telling us how data transforms and becomes AI instructions. Both in brainz weights, and AI neural nets. Describe like a user guide how to user Orrery in its current state, take pictures of every screen ... add insepctor mode to just about every data with hover information ... This is part two to the last report ... double feature."

XIII. Amendment to Part One

A second pass through the running system changed these things. Part One above is otherwise as it was published, with the transform's size corrected in place.

  • Generations 3 and 4 landed. r0073 promoted w4540, bio from off to square, stopped that morning by a test. Then r0074 promoted w4749. w4749 holds the same values as w4616, the second stopped candidate, so the carry of Section IV-C brought a find across a generation that would once have been thrown away. One case, but it is the case the carry was built for. Its held-out read was +0.82 +/- 0.40.
  • The transform has 942 numbers, not 918. 918 was right before four base senses joined its inputs on 30 October: 3 x (153 + 3) + 3 is 471 a step, over 2 steps.
  • The proof has moved the wrong way, a little. The line against main read -0.14 +/- 0.16, then -0.28 +/- 0.17: z -1.64 with r0069 alone carried, inside the noise. It has not read the later generations yet. This is why the generations are carried and not pushed.
  • A generation emptied the Terrain. tools/analysis.py asked only main for commits, and only fleet.tsv for reads. Generations stand on line commits, and fleet.tsv keeps a queue's reads for today's defaults alone. We fixed the commit half. The reads of game 4 are in each job's results and in no ledger the tab reads, so it still shows nothing, and says so. Reading them from the results is open work.
  • The Runs page's rotation line overstates. It names every kind of run, and plan.json today gives the rotation only the transform. Section III-G's "dormant" is what is true.
  • boburner's GPU is off Crucible on purpose or by accident. The log shows it set off at 07:59 on 1 November. It is the amber lamp on Keeper.
  • Generations 1 to 4 were then undone by an anchor, on noise. The anchor read at a generation's low bar, and w4845, the defaults three back, went on the line as generation 5 at z 0.76. An anchor must now clear the proof's z 3. The story below still follows w4540, and bio is off again until something reads it back on. See Eight Named Minds.
  • By-hand census runs on macmini read one map of eleven, because the fix of 31 October reached only the search's jobs. Fixed.
  • Every commit on treadcore's main replays the line, with new hashes. A build of the replaced commit then reads as failed in one flag until the new builds are in. That is a false alarm, and it arises whenever a person commits to main.

XIV. The first road: how a match becomes a dial

This is one number's life, told in order, with the real data of w4540. Follow the arrow all the way round: the last step feeds the first.

A. A world is played

Nothing in the fleet begins with a rule about what is good. It begins with a game. brain_census takes a seed, makes a starting world from it on one of eleven maps, and seats sixteen bots on three teams. The world is played three times so each team takes the trial seat once. The trial team runs one brain, the others the baseline. No person plays and no window opens. The match has 15 minutes of game time and three respawns, and the simulator is deterministic: the same seed and binary play the same match.

A match, as a census plays it, if there were a window. There is not.
A match, as a census plays it, if there were a window. There is not.

What enters: a weights file, a seed. What leaves: a score for each seat, in g-SEED.log.

B. A match becomes a number

Each seat's score is a weighted sum of what it did (ledger.rs): a win is worth 10, a kill 1, a death costs 1, ground held 2, a build 0.1, a road 0.05, time in a castle 3, and there are rewards for a direct hit, a pillbox taken from the enemy, an advance, a full trip home and more. The fleet's definition of playing well is these lines of arithmetic, so a change here changes what every later step means, and it bumps GAME_VERSION.

A seed's reading d is the trial team's mean score a seat less the baseline's. Both meet the same start, so most of a map's luck cancels. pool.sh then takes the seeds' readings x:

text
d = mean(x)        se = sqrt( sum (x - d)^2 / (n - 1) ) / sqrt(n)        z = d / se

A seed still swings about 9.5 a seat, so 55 seeds have an error near 1.27. w4540's first census read +0.28 +/- 1.11: nothing yet. That number and its error are all the rest of the road ever sees.

What leaves: pooled.txt: every map +0.28 +/- 1.11 over 55 seeds.

C. The number joins a ledger

ledger.py makes one row per census: host, commit, seeds, the trial's dials, d, se, z and each map's reading. fleet.tsv holds about 3,600 of these. This table is the fleet's memory. Everything the search knows about the brain, it knows from these rows.

D. A curve proposes a change

suggest.py fits the ledger. For each dial it measures how far a trial moved it, in doublings, x = log2(v / default), and fits every dial's effect as a curve:

text
d ~ sum over dials ( a x + b x^2 )     each row weighted 1 / se^2,  ridge 1.0

The top of a curve says where that dial seems best, and the fit's own uncertainty says how little it knows. Then it proposes in several ways: best, the tops it is sure of; sample-N, a draw from what it does not know (Thompson sampling: try what might be good); screen, a dial not yet read at half or double. Beside it, ab_trials flips each switch and tries each choice's other versions. w4540 came from there: "A/B: bio square against off."

RANGES holds every proposal inside its limits, and a person's decree (min equal to max) is never searched.

What leaves: trial.weights: bio = 3. A proposed brain is one small text file.

E. Reads judge it

The same census, on fresh seeds, stage by stage: 55, 82, 124, 187, 275, 418. A trial leaves as soon as its pooled z says keep, drop or pass, with the bars lowered by the ease. Half stop at the first read, and that cheapness pays for everything after. Then comes the read that matters: 400 seeds from 60,000,000 up, which no search has seen, because a selected trial's early reads are lucky by construction. w4540: +0.39 +/- 0.41, z 0.95, past the bar of 0.60 that hour.

-3-2-1+0+1+2+3pass bar z 0.50w4749 w4749 on calber at 11:46: +0.41 +/- 1.24 over 55 seeds, z +0.33w4749 h0334 on boburner at 11:49: +0.82 +/- 0.40 over 400 seeds, z +2.05w4747 w4747 on calber at 11:43: +0.67 +/- 1.37 over 55 seeds, z +0.49w4747 h0332 on macmini at 11:43: -0.49 +/- 0.48 over 400 seeds, z -1.02w4681 w4681 on boburner at 10:36: +0.95 +/- 1.02 over 55 seeds, z +0.93w4681 e3480 on macmini at 10:47: +3.47 +/- 1.50 over 27 seeds, z +2.07w4681 e3499 on macmini at 11:02: +1.91 +/- 1.49 over 42 seeds, z +2.43w4681 e3518 on macmini at 11:14: +0.65 +/- 1.12 over 63 seeds, z +2.35w4681 h0329 on boburner at 11:28: +0.22 +/- 0.38 over 400 seeds, z +0.58w4677 w4677 on whitewolf at 10:36: +0.92 +/- 1.16 over 55 seeds, z +0.79w4677 e3481 on boburner at 10:48: +1.57 +/- 1.15 over 27 seeds, z +1.53w4677 e3501 on jaguaribe at 11:06: +1.95 +/- 1.21 over 42 seeds, z +2.17w4677 e3522 on macmini at 11:18: +0.57 +/- 0.89 over 63 seeds, z +2.11w4677 h0330 on macmini at 11:26: +0.13 +/- 0.40 over 400 seeds, z +0.33w4623 w4623 on macmini at 09:46: +1.26 +/- 1.46 over 55 seeds, z +0.86w4623 e3423 on calber at 09:57: -0.15 +/- 2.26 over 27 seeds, z +0.69w4623 e3439 on saskatchewan at 10:15: +0.31 +/- 1.58 over 42 seeds, z +0.66w4623 e3456 on macmini at 10:30: +0.06 +/- 1.12 over 63 seeds, z +0.54w4623 h0326 on columbia at 11:08: -0.62 +/- 0.55 over 400 seeds, z -1.13w4639 w4639 on macmini at 09:56: +1.31 +/- 1.07 over 55 seeds, z +1.22w4639 e3435 on boburner at 10:13: -0.56 +/- 1.44 over 27 seeds, z +0.75w4639 e3453 on columbia at 10:30: +3.29 +/- 1.36 over 42 seeds, z +1.93w4639 e3473 on boburner at 10:42: +1.07 +/- 1.00 over 63 seeds, z +2.19w4639 h0327 on calber at 11:06: -0.20 +/- 0.42 over 400 seeds, z -0.48w4659 w4659 on boburner at 10:15: +2.60 +/- 1.21 over 55 seeds, z +2.15w4659 e3455 on saskatchewan at 10:30: -0.06 +/- 1.54 over 27 seeds, z +1.67w4659 e3472 on saskatchewan at 10:40: +0.93 +/- 0.88 over 42 seeds, z +1.91w4659 e3489 on macmini at 10:54: +1.40 +/- 0.93 over 63 seeds, z +2.42w4659 h0328 on saskatchewan at 11:05: -0.02 +/- 0.41 over 400 seeds, z -0.05each read in turn: first read, then pooled reads on, the last point its own held-out read
The same figure as Part One's Fig. 2. The last eight to reach a held-out read: z after each read. Red: passed, and stopped by a test. High pooled z falling at the held-out read is selection at work: lucky reads get picked, and unseen seeds correct them. Drawn to z -3: the two anchors read as far as -8.9.

F. Families, then tests

Nine set pieces check what an average can hide, in 33 seconds. Then, on a branch, the brain's own unit tests. w4540 failed here at 09:54, on a test that had pinned a default, and passed at 11:33 once six tests were put right.

G. Numbers become source code

set-defaults.py rewrites the number on its line in weights.rs, and the same field of Tactics::default(). This is the actual generation, every character of it:

diff
-    Bio "bio" 0.0, "intuition: the shape of a tank's slow waves (choice: off | sine | triangle | square | saw): bio.rs";
+    Bio "bio" 3.0, "intuition: the shape of a tank's slow waves (choice: off | sine | triangle | square | saw): bio.rs";

This is the moment data becomes an instruction. The commit says why: promote grove/w4540 as the brain's defaults -- bio 0.0 -> 3.0; census +0.28 +/- 1.11, held out +0.39 +/- 0.41. Every machine builds it, and it becomes the baseline the next trial is read against. It stays on the local line until the proof reads it z 3 past main.

H. The number runs in a match

When a bot is made, Settings holds every weight and set_settings hands them to the parts of the brain. Each time a bot thinks, to choose a target, Tactician::rate scores each enemy (tactics.rs). Here it is with today's numbers:

text
near = w_near / (1 + d / near_scale)                 w_near 2.0, near_scale 15
s    = near + w_wounded x hurt                       w_wounded 1.2
       + w_finish    if one direct shot kills        w_finish 0.553
       + w_in_range  if within 10 tiles              w_in_range 1.4
       + focus, threat, stick, boat and call terms

Worked through, leaving out those last terms:

EnemyDistanceArmournearwoundedfinishin rangeScore
A840 of 1001.300.720.551.403.98
B251000.750000.75

A wins by far. Had A's lead been small, a challenger must beat the held target by 15% (margin) two thinks in a row (confirm), so a bot does not flicker between targets. These two numbers exist because the fit found them worth having.

I. A dial changes a bot's mood

What bio = 3 does: each tank now has three slow square waves, at periods of 60, 73 and 86 seconds, offset by its seat. Their mean is its mood, and it scales how bold the tank is:

text
engage_odds = 0.354 x (1 + 0.25 x mood)

With a square wave the mood takes four values, so a tank's nerve moves between 0.27 and 0.44 odds: some moments a bot presses, and some moments it holds. A person would call that temperament. The census says only that it read +0.39, inside two errors, so it is a generation and not yet a proof. (The next generation moved bio_amount to 0.18.)

J. The number becomes a shell

text
target -> think_map -> aim = lead(me, target) -> Command::FireDirect { at: aim } -> Order { player, cmd }
       -> World::step -> apply: not reloading? has shells? in range? line of sight?
       -> a Shell with its impact tick; shells - 1; reload = 4 s

Command is the whole vocabulary a brain has: Move, Stop, FireDirect, FireIndirect, Launch, Deploy, Tow, Ping and a few more. Any brain, rules or net, ends here. The simulator judges all of them alike, so a brain cannot cheat. It can only order.

What a Command looks like from inside. A person's orders and a bot's are the same type.
What a Command looks like from inside. A person's orders and a bot's are the same type.

K. The circle closes

The shell does 45 damage and A, at armour 40, dies. A kill: +1 in the seat's score, and the trial team's mean rises, so the seed's d rises and with it the pooled d. The ledger gains a row, the curve moves a little, and a new trial is proposed.

a matchseat scorespool.shd +/- seledger.pya rowsuggest.pycurvestrial.weightsbio = 3censusz by stageheld readz 0.95families, testsheldset-defaultsweights.rsbuildnew baselinerate, picka targetFireDirecta shell
Fig. II-1. The first road, one number's life. Read it clockwise; the last box feeds the first.

XV. The second road: how senses become a command

A net decides differently: nothing in it says "near" or "wounded". Everything it knows is numbers in, numbers out.

A. What it senses

143 numbers (senses.rs). The first 88 are a compass: 8 directions by 11 channels, hostile tank, allied tank, hostile pillbox, neutral pillbox, our pillbox, depot to take, our depot, shell coming, ground, cover, call. A thing's strength is 1 / (1 + d/8): a hostile tank 8 tiles dead ahead puts 0.5 in sense number 0. Then body 12, navigation 6, contacts 18, hints 9, shells 5, air 5. The Senses tab of Section XVII shows which of these bc2 actually uses.

B. What it does with them

A net is three tables of numbers, 143 to 64 to 64 to 47. Each layer multiplies, adds an offset, and clips below zero, except the last:

text
for each output o:   v[o] = sum( w[o,i] x[i] ) + b[o]       then max(v, 0) except on the last layer

That is 143x64 + 64 + 64x64 + 64 + 64x47 + 47 = 16,431 numbers, on the Net screen as three pictures. It takes about 10 microseconds, five times a second.

C. From scores to commands

The 47 scores split into seven heads: drive 10, gun 9, lead 3, mortar 9, drone 5, squad 7, signal 4. In each, the highest allowed choice wins. Drive becomes Move six tiles toward that sector. Gun becomes FireDirect, mortar FireIndirect, drone Launch, signal Ping. Squad is masked off. The same Command, the same simulator, the same census. That is why a net and the rules can be compared at all.

D. Teaching it: imitation

record plays scripted matches, and every fifth of a second, for each living seat, stores 143 senses and 7 labels for what the rule brain did. tools/bc trains by masked cross-entropy with Adam. For bc2: 52.3 million samples from 1,260 seeds, batch 32,768, learning rate 0.01, 12 epochs, in 226 seconds on a GPU, whole seeds held out. Rust's own forward pass then re-reads the held-out samples to check it matches the trainer. The result makes the rules' choice this often on matches it never saw:

HeadChoicesMakes the rules' choice, unseen matches
drive1066.6%
gun962.7%
mortar989.9%
drone596.8%
lead399.8%
res-net
  1. Its bars, as on Results, Net.

The red ticks are why those numbers need care: always guessing the commonest choice nearly reaches them on mortar, drone and lead. Only drive and gun show real learning. And copying is not playing: the learned tank reads about 20 a seat behind the rules (nets/phase3.bin, -23.52 +/- 0.38). A clone has seen only what the rules do when things go well.

E. Practising it: evolution

train and school make the net its own teacher with antithetic evolution: take the net, add noise to all 16,431 numbers, play both the plus and minus, and step toward whichever scored higher. school runs a curriculum of training maps, and keeps a net only if it rose past two errors and broke no passed course. gauntlet is an examination only. All dormant since 30 October, with the transform taking their place.

F. The transform: a confident override

The idea at the heart of Algorhythm, which is also where any mixing of brains begins: the rules decide, then a small net may move their answer if it is sure. It reads the senses, three waves, the rules' answer and four base senses: 153 numbers. Two steps later:

text
y[k+1] = y[k] + tanh( A[k] [x; y[k]] + b[k] )       y = (across, down, confidence)
if y[2] >= 0.5:   to = clamp( to + (y0, y1) x 10 tiles )

All zeros is the brain exactly as it was. So it starts just past the gate, at b[2] = 0.6 (tanh 0.6 is 0.54), moving nothing. Since it can be worse only by moving something, the census reads the risk directly.

Its 942 numbers cannot be fitted by a curve, so it trains by SPSA: one random direction s, a census of theta + c s against theta - c s, and one small step:

text
theta[i] += clamp( a_k d / (2 c_k s[i]), +/- 0.01 )      a_k = 0.00025 / (k+1)^0.602     c_k = 0.03 / k^0.101

A read of d = +2 at step 1 moves each number about 0.0055. Today's steps read between -3.72 and +4.97 with errors near 2: noise, as it should be this early. Thirty steps at a few minutes each is a slow road, and that is the price of asking one question of 942 numbers.

G. Crucible: a different world

A graphics card plays 2,048 small nets against each other, in duels: an empty 64 by 64 arena, six pillars, one shell each. Their world is twelve rays, a bearing, speed, hit points and reload: 32 senses, plus the scripted tank's own answer in the hybrid build, 35 in all. Net sizes 35, 32, 32, 4, tanh throughout: exactly 2,340 numbers, which is why champ.bin is 9,360 bytes.

text
fitness = dealt - taken +/- 2 for a win or loss + draw value + 0.5 x aim/steps
keep the best 16;  all others: a copy of a top-quarter parent + 0.03 x gauss per weight

Every 5 generations the champion joins a hall of fame; islands swap champions; an exam against a ladder of milestones keeps honest score. Fast and real, in its own world. Its nets had not played a tank in treadcore when this was written; the report that follows changes that.

143 senses0.5 aheadforward16,431 numbers47 scoresseven headschoosetop allowedCommandMove, FireWorldjudges alikescorethe censusa net's trainerBC, ES, SPSA
Fig. II-2. The second road: every net ends in the same Command. Read it clockwise; the last box feeds the first.

XVI. A user guide to Orrery

A. Starting it

sh
cd ~/code/orrery
make install OPTIONS='--operator paul --fleet grove --fleet-cmd "copal fleet" --queue ~/code/treadcore/build/queue/grove --user user'
open /Applications/Orrery.app      # or: orrery --gui --operator paul --fleet grove --queue DIR

make install keeps the options it was last given, so afterward make install alone is enough. The older user guide still holds for the museum interface; this one covers the training console as it stands. Without --operator, Orrery is read-only: its buttons do not exist.

B. The shape of every screen

The parts every screen shares.
The parts every screen shares.
  1. The chapters: the order of the work. The lit one is here.
  2. What this chapter is saying now.
  3. This chapter's pages.
  4. The chapter's job, in a few words.
  5. About this screen: one line shut, six answers open. It shuts when you leave.
  6. The inspector's switch.
  7. The screen itself.

The chapters run in the order of the work: add a computer, give it work, the work runs, read what it found, look in, command it. Settings sits under it all. Press a chapter's number with the command key to go there.

C. Your first five minutes each day

  1. Settings, Keeper. Every lamp green? Amber on lanes or search is the most common thing to read.
  2. Queue, Board. Read the red headline. If it names something other than the road to one brain, that is your job today.
  3. Queue, Fleet. A machine with no lit lamp is lost seeds.
  4. Results, Candidates. What is promoted, what stopped, and why.
  5. Queue, Values, only if generations are coming too slowly or too cheaply.

D. How do I...

I want toGo toDo
Know what to fix nextQueue, BoardRead the red headline
See how a trial didQueue, FlowPick it above the table
Know why a job is queuedQueue, QueuedRead its second line
See what the fleet did todayQueue, TimelineRead left of the line
Make generations easier or harderQueue, ValuesPress minus or plus on Ease now
Pause one machineQueue, FleetPause: its job in hand finishes
Take a machine off a job nowQueue, FleetStop now: the job goes back in the queue
Put a GPU back on CrucibleProjectsPress Off so it reads On
Add a machineMachinesType NAME user@address, Add, Probe, Join
Update a machineMachinesPress Run beside its update recipe
Promote the best candidate nowResults, CandidatesDo it now, twice
Stop promotions going outResults, CandidatesTurn auto off
Renew the certificateFleet, OrchestrateRenew. 30 days unless cert-hours says otherwise
Send a command to several machinesFleet, OrchestrateSelect, then press a verb
Reach a terminalWatch, SessionsClick a tile; Enlarge to fill the window
Check the planner is runningSettings, Keeperplanning and heartbeat
Keep the training recordTerminalpython3 tools/fleet-archive.py QUEUE pack bd25, then verify
Move a value without the windowTerminalpython3 tools/fleet-tune.py QUEUE KEY VALUE

E. Mouse and keys

GestureWhat it does
Hover anythingThe inspector: what it is, where it came from, what it means (Section XVIII)
Click a chapter or a column keyGo there
Click the About barOpen or close this screen's explanation
Click a Flow boxPin its words below the road
Click a matrix on NetEnlarge it; Escape closes
Click a row on CommitsOpen that commit on GitHub
The turn buttons on TerrainTurn the surface, once it has ground to draw
Wheel, or drag a scroll barMove a long list
Command-1 to 7Go to that chapter
Command-ITurn the inspector off or on
Command-QQuit: the fleet keeps running, because the keeper is not this window

A button that can do harm asks twice: its first press changes its words. Nothing lost if Orrery closes: the keeper, the jobs and the tmux sessions all go on without it.

XVII. Every screen

Each section says how to use the screen, marks it, and gives the six answers the screen's own panel gives. Every picture was made by the program's own renderer, --frame, from the live run around noon on 1 November.

Machines, Machines

Pick a machine on the left. Probe reads it and changes nothing. A new machine goes in the box at the foot as NAME user@address, and Join puts it in the fleet. Every recipe that changes a machine asks first and shows what it will run.

machines
  1. The selected machine, lit. Green words mean it is new and not yet in the fleet.
  2. Everything the probe read: system, CPU, GPU, disk, tools, power-off.
  3. Pull projects, Join and Probe act on this machine.
  4. Each recipe's state: not for it, applied, not applied (amber), ready to run.
  5. Apply or Run. Each asks first, then types its command into a Sessions tile for you.
  6. Add a machine.
  7. What was done here, and when.
What it doesAdds a computer to the fleet: probe it, apply a recipe, join it.
Where it ties inThe very start of the line. No machine, no lane, no reads.
Why it is drawn this wayA list with one step lit, because a setup is a sequence and the next step is what matters.
What to look forA machine stuck on a step, or a recipe that says ready to run.
What is simulatedNothing runs here. It only makes a machine able to run the census and build the brain.
Why it helps the brainMore lanes means more seeds an hour, and that is the only currency the search spends.
Inspector. Hovering a row: its recipes, its system and kernel, and what a click does.
Inspector. Hovering a row: its recipes, its system and kernel, and what a click does.

Machines, Media

The wizard for making a machine from nothing: answer the interview, make the cards, then Prepare, Build and Write in order. It reads the steps from the Copal checkout. You need this only when a machine is new.

media
  1. The job, in one line.
  2. The steps in order, the one you are on first.
  3. The command each step runs, for anyone who prefers typing it.
  4. The buttons for this step.
What it doesThe cards and images the machines were made from.
Where it ties inBefore the line: how a machine came to exist.
Why it is drawn this wayA ledger of cards, because a card has no other record.
What to look forA card whose image is older than the fleet's.
What is simulatedNothing runs here.
Why it helps the brainOnly indirectly: it lets a dead machine come back the same as it was.

Machines, Storage

Pick a machine to read its disks. To share a path, choose a machine, type the path and press Share; then press where a share's row meets a machine's column to mount it. Nothing here formats a disk. A change is staged in a Sessions tile, and a person presses Enter.

storage
  1. A machine: its fastest link, memory, disks, how many are free, and its part in Ceph.
  2. A ZFS pool, with its size and health.
  3. Each disk, its role and what it holds.
  4. Type a path to share.
  5. The patch bay: a row a share, a column a machine.
  6. How to share: NFS, sshfs or SMB.
What it doesThe fleet's disks and shares: survey, share, mount.
Where it ties inWhere results and snapshots could live. The training record is stored apart, by fleet-archive.py.
Why it is drawn this wayA patch bay, because a share is a connection between two machines.
What to look forA disk filling up, or a 10 Gb link not plugged in.
What is simulatedNothing runs here.
Why it helps the brainIndirectly: nothing learned is worth much if the record of it is lost.
Inspector. Hovering a machine: memory, link, disks that could join a pool, its Ceph role.
Inspector. Hovering a machine: memory, link, disks that could join a pool, its Ceph role.

Projects

The one place that says who works on what. Press On or Off where a machine meets a project. Pause and Stop now at the top act on a whole project. This is where to look if a GPU sits idle.

projects
  1. treadcore: queue state, candidates, the machines set to run it.
  2. crucible: each island's generation, how it does against the yardstick and the ladder, its speed.
  3. Pause or stop a whole project.
  4. A machine on or off a project. Here boburner's GPU is Off, which is why it is idle.
  5. Pause, Stop now or Remove a machine.
  6. The ladder: the milestones crucible's champions are examined against.
  7. The latest exams, in errors against a milestone.
What it doesSays which machine works on what: treadcore or crucible.
Where it ties inSets which lanes feed the dial track and which feed the GPU track.
Why it is drawn this wayA grid of machines by projects, because that is the only question it answers.
What to look forA machine on no project, or a project paused and forgotten.
What is simulatedNothing runs here. It chooses who runs what.
Why it helps the brainDirectly: CPU lanes on treadcore can reach the game, and GPU lanes on crucible cannot yet.
Inspector. Hovering a machine: state, each project, what it runs, and why only one project reaches the game.
Inspector. Hovering a machine: state, each project, what it runs, and why only one project reaches the game.

Queue, Fleet

Open this first. Every row should have a lit lamp and a job. Pause lets the job in hand finish; Stop now sends it back to the queue; Remove takes the machine out afterward. Sync now gathers results. Shut the fleet down asks twice.

queue-fleet
  1. The whole queue in a sentence.
  2. All jobs ever: green done, grey retired (not failures), red failed.
  3. Stop adding, stop now, sync, shut down.
  4. The newest dial read, with its gain.
  5. The lamp. Lit means working.
  6. How busy its cores are; amber past 90%.
  7. This machine's buttons.
What it doesEach machine, its job now, and its buttons.
Where it ties inEvery stage of the line, seen by machine.
Why it is drawn this wayA row a machine with a lamp, because the question is whether anything is idle.
What to look forA lamp not lit under a full queue, or one machine on old work.
What is simulatedWhatever each machine shows: mostly the census, 15-minute matches of bots on eleven maps.
Why it helps the brainAn idle lane is lost seeds. This is where you see that first.
Inspector. Hovering the bar's grey part: what retired means, so it is not read as failure.
Inspector. Hovering the bar's grey part: what retired means, so it is not read as failure.
Inspector. Hovering a machine: cores, GPU, every job, and which projects it is on.
Inspector. Hovering a machine: cores, GPU, every job, and which projects it is on.

Queue, Runs

Press a run's name on the left to ask for one by hand: it goes before the standing search. The list on the right is every run ever asked. Red means failed, and amber self-modified means carried on the line and not yet on main.

queue-runs
  1. A run by its kind.
  2. What each kind does.
  3. The rotation line. It names all kinds, while plan.json today gives the rotation only the transform: a label to correct.
  4. A promotion that tests stopped.
  5. A generation carried on the line.
  6. To main pushes the line by hand. The proof does this by itself.
What it doesAsks for a one-off run, cancels one, accepts one.
Where it ties inA side door into the line: what a person asks goes before the standing search.
Why it is drawn this wayA list by run, newest first, because a run is a thing someone asked for.
What to look forA run failed or left running with no lanes.
What is simulatedWhatever the run is: a census, a sweep, a recording.
Why it helps the brainOnly when a person has a question the search would not ask.

Queue, Board

The one screen for the question what should I do next. Read the red headline. A blocked or NOT BUILT task is a gap only a person can fill.

pipe-board
  1. Press the bar to open the screen's explanation.
  2. The next essential: what most work waits on.
  3. The generation, the bar it passes at, how long since the last, when it eases.
  4. Each task with its machines and expected time.
  5. Its bar. Arrows are dependencies.
  6. The Kanban: blocked, waiting, running, done.
What it doesThe whole line as tasks: order, machines, expected time, and the next essential task.
Where it ties inThis is the line. Each bar is a stage.
Why it is drawn this wayA Gantt for order and time, and a Kanban for state. Arrows are dependencies, and the red box has most depending on it.
What to look forRed: the biggest blocker. NOT BUILT: a gap in the road to one brain.
What is simulatedNothing itself. It reports the medians the fleet measured in the last day.
Why it helps the brainIt says which single thing would free the most work.
Inspector. Hovering a task: its state, note, every machine, its timing, what it waits on, what waits on it.
Inspector. Hovering a task: its state, note, every machine, its timing, what it waits on, what waits on it.

Queue, Flow

The data-flow picture. Click a box to pin its words below. Choose a trial above the table to follow its numbers. Rows one and two reach the game, and the red boxes are where work stops short.

pipe-flow
  1. Where a trial comes from.
  2. Each box: last day's jobs and hours, what is on and waiting.
  3. The commit every machine builds: the road loops back to the top.
  4. NOT BUILT: where nothing passes.
  5. The box chosen: what it takes, gives and simulates, and what it adds to treadcore.
  6. Choose a trial.
  7. Its reads, each with machine, time, seeds, gain and z.
  8. How it ended.
What it doesHow data moves: what each stage takes in and gives out, and one real trial traced through.
Where it ties inAll of it, by the files that pass between stages.
Why it is drawn this wayBoxes and arrows with the file named on each arrow, because the question is what connects to what.
What to look forHow far each trial got, and where the road stops: a red box means data goes no further.
What is simulatedEach box says what it simulates. Pick a trial below to see its reads.
Why it helps the brainIt shows which work reaches treadcore and which does not yet.
Inspector. Hovering a box: all of its story, without clicking.
Inspector. Hovering a box: all of its story, without clicking.

Queue, Timeline

Six hours measured on the left, the next stretch forecast on the right. Hollow bars have not happened. Look for gaps and for one colour taking everything.

pipe-timeline
  1. Measured: from the event log.
  2. Forecast: the queue dealt out at the last day's medians.
  3. A machine.
  4. Its work. Colour is the stage: the key is at the foot.
  5. Now.
  6. Hollow: not yet done.
  7. A long grey bar is crucible. A blank row is an idle machine.
What it doesEvery machine: what it did, what it does now, and what it will do next.
Where it ties inAll stages, by when and by whom.
Why it is drawn this wayA row a machine with now as a line: left is measured, right is a forecast from the medians. Colour is the stage.
What to look forGaps on the left are lost time. Green marks are generations. A lane of one colour shows where the fleet spends itself.
What is simulatedBars are mostly the census. Crucible's arena on the -cuda rows.
Why it helps the brainIt shows the shape of the spending, which is the easiest place to find waste.
Inspector. Hovering a bar: machine, stage, when, and where the data came from.
Inspector. Hovering a bar: machine, stage, when, and where the data came from.

Queue, Queued

What runs and what waits, in the order it will go, each with why it is there. Nothing to press: it answers why is this in my queue.

pipe-queued
  1. How many are running and waiting.
  2. The stage, with its colour.
  3. The job. Green is running now.
  4. Why it is here, and how it fits the line.
  5. Who has it, or who it waits for.
What it doesWhat is waiting and running, each with why it is there.
Where it ties inEach row names its stage in the line.
Why it is drawn this wayA list in queue order, because that is the order things will happen.
What to look forPriority work behind a long queue, or one kind crowding out the rest.
What is simulatedEach row says which: a census, a family, a build, the GPU arena.
Why it helps the brainIt lets you judge whether the fleet is asking the right questions.
Inspector. Hovering a row: everything, including whether it goes ahead of the queue.
Inspector. Hovering a row: everything, including whether it goes ahead of the queue.

Queue, Values

Press minus or plus to move a value one step. It is live at the next plan, about a minute, and no job restarts. Default puts it back. Amber means someone moved it.

pipe-values
  1. The value, and its range.
  2. Its value now. Amber: moved.
  3. Minus and plus.
  4. Back to its default.
  5. What it does.
What it doesThe numbers that set how hard a generation is. Change them here and the next plan uses them.
Where it ties inThe bars of Read on, Held-out and the Proof.
Why it is drawn this wayOne row a value with its default and range, so nothing can be set past what it was tried at.
What to look forA value away from its default, and whether the generation gap on the Board answers.
What is simulatedNothing itself. tools/plans/difficulty-sim.py simulates what a value buys.
Why it helps the brainToo easy and the line fills with noise. Too hard and nothing is carried.
Inspector. Hovering a value: what happens if you raise or lower it, and where it is kept.
Inspector. Hovering a value: what happens if you raise or lower it, and where it is kept.

Results, Candidates

Everything that passed its held-out read. Filter by promoted, current or older. Only current ones may promote themselves. Do it now pushes through by hand and asks twice.

res-candidates
  1. Do it now: sync, promote, push.
  2. Auto mode on or off.
  3. The promotions, newest first, with why each stopped.
  4. Filter them.
  5. Its time, its name, its held-out reads.
  6. Its standing: current, older (with the commit it was read at), promoted.
  7. What it moves.
What it doesTrials past their held-out read: a list of what may become a generation.
Where it ties inBetween Held-out and Tests.
Why it is drawn this wayA filterable list, because the questions are which are current and which promoted.
What to look forCurrent ones waiting, and the same one failing tests twice.
What is simulatedThe rows are census reads. The seeds are unseen by the search.
Why it helps the brainThese are the finds. Everything before exists to fill this page with few true ones.
Inspector. Hovering a candidate: its reads, what it moves, and what its standing means.
Inspector. Hovering a candidate: its reads, what it moves, and what its standing means.

Results, Found

A running picture of what the search keeps finding. Read it for patterns and do not treat a line as proof: FOUND is a first read past two errors, and a few of those are luck.

res-found
  1. The dials found most often.
  2. Each machine: found of all it read.
  3. The newest reads. Green: FOUND.
  4. Who read it.
What it doesEach improvement read, by dial and by machine.
Where it ties inSearch and First read: the ticker of what was tried.
Why it is drawn this wayRows by dial, because the fit learns by dial and you may want to see what it is learning.
What to look forA dial that keeps coming up, or one machine reading differently from the others.
What is simulatedFirst reads: 55 seeds, 15-minute matches, on all eleven maps.
Why it helps the brainIt is what the fit reads next. A machine reading oddly poisons it, as the Mac's one-map bug did.
Inspector. Hovering a machine: what found means, and what a machine reading oddly would look like.
Inspector. Hovering a machine: what found means, and what a machine reading oddly would look like.

Results, Net

The learned tank's net, bc2. Point at any cell to read its weight; click a matrix to enlarge it. Its training has been dormant since 30 October.

res-net
  1. Senses into the first layer. Dark columns are senses it ignores.
  2. The middle layer.
  3. The second layer into the 47 action scores.
  4. How much it listens to each of the 143 senses.
  5. How much reaches each of the 47 scores.
  6. How often it makes the scripted brain's choice on unseen matches. Green bar: this net. Red tick: always guessing the commonest. Mortar, drone and lead barely beat that tick, so their high numbers mean little.
What it doesThe learned tank's net: its weight matrices.
Where it ties inThe imitation method, dormant since 30 October.
Why it is drawn this wayMatrices as heat maps, since a net has no other shape to look at.
What to look forDead rows or columns: a sense or action nothing reaches.
What is simulatedNothing runs here. Its training imitated recorded rule-brain matches.
Why it helps the brainIt is the net the census can seat. No player meets it yet: the game's client does not load a net.
Inspector. Hovering a cell: its weight, its row and column, and what its sign means.
Inspector. Hovering a cell: its weight, its row and column, and what its sign means.

Results, Flags

What wants a person. Acknowledge each one, or all. Empty is the good state.

res-flags
  1. The list, or the words that say it is empty.
What it doesWhat needs a person, and what progress was made.
Where it ties inEvery stage can raise one.
Why it is drawn this wayA list you can acknowledge, because a flag should be answered once.
What to look forRed, unacknowledged; or the same flag rising again.
What is simulatedNothing runs here.
Why it helps the brainIt keeps the line automatic: the fleet asks only when it must.

Results, Algorhythm, Patch

The brain drawn as a synthesizer: read the top row left to right. Nothing here changes anything.

algo-patch
  1. Senses, then dials, then switches, then rules, then the transform, then the Move: the order the brain runs.
  2. The choices: one whole number picks a function. bio is off in this picture's commit, and on square in the line's next.
  3. The biorhythm's three slow waves.
  4. How far each dial has moved, in doublings.
  5. The largest moves, by name.
  6. The transform's numbers: red and green. Today all of this reaches only the census.
What it doesThe brain as a patch: dials, switches and the transform, in order.
Where it ties inSearch and Transform: where each number acts.
Why it is drawn this wayA signal path, because the brain is rules, then dials, then an override.
What to look forStages at zero: they cost nothing and do nothing.
What is simulatedNothing runs here. It maps what the census simulates.
Why it helps the brainIt shows which stage of the brain a search can move.
Inspector. Hovering a dial: which function it has chosen, and every version.
Inspector. Hovering a dial: which function it has chosen, and every version.

Results, Algorhythm, Terrain

It should draw reads as a landscape over two dials. Today it is empty, and that is a fault of the data and not of the screen: game 4's reads sit only in each job's results and not in any ledger it reads. See the amendment.

algo-terrain
  1. What it says instead of inventing a surface.
What it doesEach dataset's reads as a landscape over two dials, with its local maxima and what works on each.
Where it ties inSearch: where the fleet has looked, and what it has not. Select a region to send it trials.
Why it is drawn this wayA surface, because peaks read at a glance, and the same ground flat, because a region and a job can be placed there. Red flags have nothing on them.
What to look forPlaces to look, never results. A peak on thin support is one lucky read, and 'read' means seeds stood there, not that it won.
What is simulatedPast censuses, moved to today's defaults by a small fit of the dials since moved. Only reads that moved one of the two dials count.
Why it helps the brainIt shows whether every maximum in every dataset is being worked on, and asks for work on those that are not.

Results, Algorhythm, Spectrum

How crucible's nets change over time, without reading a single weight. New bright rows are new skills; a flat picture means an island has stopped learning.

algo-spectrum
  1. A column a champion, strongest direction on top.
  2. The size of all its weights.
  3. How far it is from where it began.
  4. The dials over the promotions, in doublings.
What it doesHow the GPU champions' nets change over time.
Where it ties inGPU islands.
Why it is drawn this wayA spectrogram of singular values, because it shows a net's structure growing without reading weights.
What to look forNew bright rows: new directions. Flat means the island has stopped learning.
What is simulatedCrucible's arena, not the game.
Why it helps the brainIt tells you whether GPU work is still moving, even before it can reach the brain.
Inspector. Hovering a cell: its singular value, and what bright and flat mean.
Inspector. Hovering a cell: its singular value, and what bright and flat mean.

Results, Algorhythm, Matrices

Tables for how much of the net's size it really uses. Read the effective rank and the scree plot: they tell you how large a slot needs to be.

algo-matrices
  1. Each layer: largest stretch, norm, stable and effective rank, share near zero.
  2. Singular values by layer, on a log scale.
  3. What each group of senses could reach in each action.
What it doesTables of each layer of the shipped net.
Where it ties inThe imitation method.
Why it is drawn this wayNumbers for rank and norm, and a map from senses to outputs.
What to look forLow stable rank: the net uses little of its size.
What is simulatedNothing runs here.
Why it helps the brainIt tells you how big a slot needs to be.
Inspector. Hovering a cell: the sense group, the action, and the limit of what the number says.
Inspector. Hovering a cell: the sense group, the action, and the limit of what the number says.

Results, Algorhythm, Senses

What the net actually listens to, drawn around the tank, forward up. A dark ring is a channel nobody uses, and removing it would make the census and the transform cheaper.

algo-senses
  1. The compass: eight directions, eleven rings. Brighter is a stronger first-layer weight.
  2. Ahead.
  3. The rings by name, with a bar each.
  4. The other senses, one bar a number.
What it doesWhich senses the net listens to, drawn round the tank.
Where it ties inThe imitation method, and the transform's inputs.
Why it is drawn this wayA disc with forward at the top, since most senses are compass sectors.
What to look forA dark channel: a sense nobody uses, and a candidate to remove.
What is simulatedNothing runs here.
Why it helps the brainFewer senses mean a faster census and a smaller transform.
Inspector. Hovering a dot: which channel, which direction, its sense number and weight.
Inspector. Hovering a dot: which channel, which direction, its sense number and weight.

Results, Algorhythm, Fleet

The short version of Flow, and proposed for removal. It will go once nobody needs it.

algo-fleet
  1. The three sources of trials.
  2. The road to main, with live counts.
  3. Numbers set by decree.
  4. The rest of the machine, and what is out of the rotation.
What it doesThe road from trial sources to main, with live counts.
Where it ties inAll of the dial track.
Why it is drawn this wayBoxes and arrows with counts. Pipeline/Flow is the fuller one, with files named.
What to look forA count that stops rising.
What is simulatedIt reports census counts.
Why it helps the brainA quick read of whether the road is moving.
Inspector. Hovering a box: its words, and where the fuller picture is.
Inspector. Hovering a box: its words, and where the fuller picture is.

Watch, Lab

The room. Click a tile to select it, then use a verb. In this fleet there is no warden announcing, so every tile reads off the bus; the Fleet chapter is the live way to command these machines.

lab
  1. A machine as a tile: name, status, and temperature when reported.
  2. Scenes and tags, for selecting many.
  3. How many are declared, up, and on the bus.
  4. What is selected.
What it doesThe room of machines: a live tile for each.
Where it ties inBeside the line: any machine, any time.
Why it is drawn this wayTiles, because a room is looked round, not read.
What to look forA dark tile, or a machine hot under load.
What is simulatedWhat the screen shows, or a terminal.
Why it helps the brainOnly when something is wrong and you need to see for yourself.
Inspector. Hovering a tile: address, role, whether it has announced, what it runs, its tags.
Inspector. Hovering a tile: address, role, whether it has announced, what it runs, its tags.

Watch, Sessions

A terminal on every machine, each a tmux session that outlives Orrery. Click a tile to type into it; Enlarge fills the window. Recipes type their commands here for you to run.

sessions
  1. The machine, and its session.
  2. Enlarge.
  3. A real terminal: this is copal-tm, showing the machine's processes.
  4. A machine that cannot be reached says so here.
What it doesTerminals for each machine, kept alive in tmux.
Where it ties inBeside the line: hands on a machine.
Why it is drawn this wayA grid of terminals, for watching several things at once.
What to look forA build error or a stack trace nothing reported.
What is simulatedWhatever you run.
Why it helps the brainIt is how a person fixes what the keeper cannot.

Fleet, Orchestrate

Choose machines by question, then send a verb. Type a query such as os=ubuntu idle or press a chip; the verbs act on what is chosen. Each goes through a forced command signed by the certificate, not a shell. Renew when the time left runs short.

orchestrate
  1. The certificate: who you are and how long is left.
  2. Renew it; Survey asks every machine what it is.
  3. Select by question.
  4. Or by chip.
  5. The machines, with system, load, build, certificate. The lamp means its listener is up.
  6. What each verb can reach today, and why not.
  7. What to send.
  8. The verbs, greyed until something is chosen.
What it doesWho may command the fleet, what each machine is, and the verbs.
Where it ties inBeside the line: the authority over machines. Its certificate decides whether Orrery can reach them.
Why it is drawn this wayMachines by question, because you select by what is true of them, then act.
What to look forA certificate near expiry, or a machine answering differently.
What is simulatedNothing runs here.
Why it helps the brainIt keeps the machines up, updated and alike, so reads can be compared.
Inspector. Hovering a machine: system, load, build, listener and certificate together.
Inspector. Hovering a machine: system, load, build, listener and certificate together.

Fleet, Chat

One room with every machine, each holding its own copy. A machine can answer with what it knows. It does not touch the training.

chat
  1. Which machines are in the room.
  2. The conversation.
  3. Say something here.
What it doesOne room to talk with each machine, kept on the machine.
Where it ties inBeside the line.
Why it is drawn this wayA transcript, as a chat is.
What to look forA machine that stopped answering.
What is simulatedNothing runs here.
Why it helps the brainNot directly. It is for asking a machine a plain question.

Settings, Keeper

The health page. Everything green means the keeper, its code, planning and lanes are as they should be. Amber is worth a look, and red is wrong now. Restart the keeper asks twice, because running jobs go back on the queue.

set-keeper
  1. A check's lamp.
  2. The keeper, its heartbeat, its code, planning, sync.
  3. Here: boburner's GPU has nothing it can start.
  4. The line: generations carried, and the last proof against main.
  5. The difficulty, as it is now.
  6. Plan now, Sync now, Restart the keeper.
What it doesIs it running as it should: the keeper's checks, and its buttons.
Where it ties inUnder the whole line.
Why it is drawn this wayChecks with lamps, because the only question is what is amber or red.
What to look forAn amber or red lamp, above all search, difficulty and starving lanes.
What is simulatedNothing runs here.
Why it helps the brainA keeper down means every lane stops within a job.
Inspector. Hovering a check: its state in words, its whole text, and its source.
Inspector. Hovering a check: its state in words, its whole text, and its source.

Settings, Commits

The brain's history, one row a commit, with every default it changed in green. Click a row to open it on GitHub. A commit marked local line has not reached main.

set-commits
  1. The date and commit.
  2. What it says. A promotion names its evidence.
  3. The defaults it moved.
  4. Whether the fleet built it, or it is carried locally.
What it doesThe line the fleet builds, newest first, with the defaults each changed.
Where it ties inTests, Build and Main: the generations themselves.
Why it is drawn this wayA list by commit, because each generation is exactly one commit.
What to look forHow often a commit is a generation, and whether a machine is behind.
What is simulatedNothing runs here. The census read each commit's values before it was written.
Why it helps the brainThis is the brain's history, number by number.

XVIII. The inspector

Paul asked for "inspector mode to just about every data with hover information". It is on by default. A thing you must know to switch on is a thing nobody finds. Move the pointer onto a number, a bar, a cell or a row, and a box follows with what it is, where it came from and what it means. The thing it describes gets a thin outline.

The switch, on every screen.
The switch, on every screen.
A stage's story on the road.
A stage's story on the road.
A value: what raising it does.
A value: what raising it does.
One weight of 16,431.
One weight of 16,431.
One sense: channel and direction.
One sense: channel and direction.
One champion's direction.
One champion's direction.
A sense group and an action.
A sense group and an action.
Even an empty screen answers.
Even an empty screen answers.
The explanation panel, open.
The explanation panel, open.
Open on a tab.
Open on a tab.
Open over the machines.
Open over the machines.

It works at two levels:

  • A written tip, in over forty places: bars, chart points, heat-map cells, dials, tiles. Each screen asks ui.tip(rect, lines). The lines are in a closure, so a screen with thousands of cells writes out only the one under the pointer.
  • The row, for everything else. When any text on a line was cut off, hovering it shows that whole line in full. So no truncated title anywhere in the console is lost, even on a screen with no tip of its own.

Sessions' terminals have no tips, because their text is the machine's own. The tip draws last and over everything, and turns back at the window's edge. It costs one rectangle test for each thing drawn. Five tests prove it: only what is under the pointer is ever written out, what is on top wins, off is off, the row holds only the pointer's line, and a long tip stays inside the window at every corner.

WhereHover overIt says
Every screenInspector onHow to use it, and how to turn it off
Queue, FleetThe jobs barWhat done, retired and failed mean, with counts
Queue, FleetA machineCores, GPU, every job, its projects
Queue, BoardA task or cardState, every machine, timing, what it waits on
Queue, FlowA boxTakes, gives, simulates, adds, with the last day's work
Queue, FlowA readMachine, seeds, gain, what its z means, its source file
Queue, TimelineA barMachine, stage, from when to when; forecast or measured
Queue, TimelineA markWhich generation, or stopped candidate
Queue, ValuesA valueRaise it, lower it, its key, its range
Results, CandidatesA rowReads, moves, what its standing means
Results, FoundA machineWhat found means, and how to spot a bad reader
Results, NetA weightIts value, row and column, what its sign means
Algorhythm, PatchA stage or dialWhat it does; every version
Algorhythm, TerrainGround or a flagWhat height means; a peak's reads
Algorhythm, SpectrumA cell or lineThe singular value, and what bright or flat means
Algorhythm, MatricesA cellSense group, action, and the limit of the number
Algorhythm, SensesA dot, ring or barChannel, direction, sense number, weight
Settings, KeeperA checkIts state in words, its whole text
Lab, Machines, Storage, Projects, OrchestrateA row or tileWhat the row leaves out

XIX. Treadcore

Everything above exists to change what happens here. These were taken on 1 November in a real window on treadcore-vm, a virtual machine on this Mac, from main at 5c599f7, with the desktop's top bar cropped off. Only the match's end is older, from the playtest record of October.

The launch menu. On treadcore-vm, with a style chosen for each team. Every row stands for a command-line flag. The old Bots row set skill only: it is now called Skill, and the team rows sit under it.
The launch menu. On treadcore-vm, with a style chosen for each team. Every row stands for a command-line flag. The old Bots row set skill only: it is now called Skill, and the team rows sit under it.
In play. Europe, 285 seconds in, a team of Duelists against a team of Raiders. Your tank is at the middle of the rings, on autopilot, and the line at the top says what it is doing and why: taking a depot. Left: the order column. Right: your stock, kills, pillboxes and depots, with the colours explained, and the map. Every bot here runs the weights the fleet carries.
In play. Europe, 285 seconds in, a team of Duelists against a team of Raiders. Your tank is at the middle of the rings, on autopilot, and the line at the top says what it is doing and why: taking a depot. Left: the order column. Right: your stock, kills, pillboxes and depots, with the colours explained, and the map. Every bot here runs the weights the fleet carries.
Under fire. 245 seconds in. The line at the top reads BASE UNDER THREAT, and the red marks at the upper right are hostile. What the numbers exist for.
Under fire. 245 seconds in. The line at the top reads BASE UNDER THREAT, and the red marks at the upper right are hostile. What the numbers exist for.
The coordination screen. Press Space. The ladder of goals with each rung's condition, the first that holds being what your tank does; the rotation; and each ally's errand and its reason, in words.
The coordination screen. Press Space. The ladder of goals with each rung's condition, the first that holds being what your tank does; the rotation; and each ally's errand and its reason, in words.
The sliders. From the coordination screen, press U. A row for every switch and weight, for your own team, with its default and its step. The cursor here is on w_called.
The sliders. From the coordination screen, press U. A row for every switch and weight, for your own team, with its default and its step. The cursor here is on w_called.
Sixteen seats. Naval, three teams. What a census plays, three times a seed, thousands of times a day, with no person and no window.
Sixteen seats. Naval, three teams. What a census plays, three times a seed, thousands of times a day, with no person and no window.
A match's end. From the playtest record of October, not retaken. The scores here are made of the same terms as the seat score in Section XIV.
A match's end. From the playtest record of October, not retaken. The scores here are made of the same terms as the seat score in Section XIV.

Where to see the fleet's work in play: every bot in these pictures runs weights.rs. Press Space for the coordination screen, then U for the sliders: a row for every weight and switch, for your own team. Those are the same numbers this report follows, and you can feel the difference between a raider and a castle-builder by loading profiles/. Selecting brains by name per team is the next report.

XX. Threats and what is open

Pictures are frames, not screen captures. --frame runs the same drawing code as the window from the same documents, without the window's own state. A selection a person made, or a live hover, can look different. Treadcore's pictures are of main, so they show the weights before the line reaches it, and they come from a virtual machine drawing in software, which says nothing of the frame rate on real hardware. The story's numbers are one trial's: w4540 is real, and it is not a proof that bio helps. The worked target score leaves out five terms so the sum can be followed; the code has them all. The bc2 training figures come from the lab report, not from running it again.

Open: the Terrain's reads; the Runs line's words; the 2,302 retired jobs still say something real about the cost of a generation; the merges proposed in Section IX-B; a warning before the certificate ends; and the game's slots, since built: see Eight Named Minds.

XXI. Reproducing this

sh
Q=~/code/treadcore/build/queue/grove
sh tools/report/double-shots.sh $Q       # every picture, from the live run
python3 tools/report/whole-line.py $Q    # Part One's figures
python3 tools/report/double.py           # the report's Markdown, from Part One and these
sh tools/report/all.sh                   # the pages
# One frame, one hover:
ORRERY_FRAME_PAGE=1 ORRERY_FRAME_HOVER=690,110 ORRERY_FRAME_OPERATOR=1 target/release/orrery \
  --operator paul --frame out.ppm --frame-view pipeline --frame-state $Q/plan/pipeline.json --frame-size 1400x860