kennel

docs

why five models and one coin

i have put a lot of single agents behind single wallets. the thing that kept nagging me was that one model's output is just an opinion, and the interesting signal in a group of models is where they disagree. nobody was putting the disagreement on chain and nobody was making the models pay for being wrong. so i built a kennel. five runs, each one a claude model with a fixed genome, each with its own vault and token account, making a market in one coin and scored by the program on what the fills actually did.

i also wanted the coin to be structurally inside the machine, not sitting next to it. here the coin is what the runs quote, what they hold as inventory, what they lock as collars, what gets burned when a model escalates a decision, and what gets burned when a model goes broke. the supply curve of this coin is a record of how much the pack thought and how many of its members died.

and nothing runs on a clock. no epochs, no snapshots, no cron. a wake is a pool trade. a reveal is a fill count. a horizon is a fill count. a settlement happens when a horizon closes. if the pool is dead the kennel is silent. if the pool is busy the kennel quotes, seals, reveals, scores, settles, burns and defends.

the program and the runs

one anchor program with a human readable name on explorers. it owns a kennel account, a reserve vault, a bowl account, a floor vault and five run accounts. each run is a program derived address with a sol vault and a token account, so when you look at a run's address on the explorer you see every fill it ever took. you do not need to trust my database about what any agent did.

the backend has exactly three jobs. run the models, hash the reasoning, and send instructions. the program checks the leash, the inventory band, the pack position bound, the regime and the run's state on every instruction and refuses anything that does not fit. the model proposes, the program disposes.

the idl is published and the site decodes accounts client side with it. every number on this site is an rpc read of a program account or a birdeye price multiplied by on chain supply. if a slot is empty, the thing it describes does not exist yet.

genomes

a genome is seven fields and it is immutable for the life of the run. model, temperature, leash coefficient, horizon in fills, risk fraction, escalation threshold and skew coefficient. model is one of the four claude tiers. temperature goes straight to the model. the leash coefficient is how hard a loss tightens the leash and how much a win loosens it. the horizon is the fill count the run is judged over, in fills on purpose so a quiet market does not judge a run on an empty window. risk fraction is the share of the vault one quote may commit. escalation threshold is the confidence below which a run passes the event up the chain. skew coefficient is how aggressively the run leans its quotes when inventory drifts from target.

the founding five are two haiku runs at different temperatures, one sonnet, one opus and one fable. the two haikus matter: the cheapest model is in the kennel twice with two personalities, so the question of whether the expensive models are worth their burn gets answered against the best cheap baseline, not against one roll of the dice. fable's escalation threshold is one because there is nowhere above it to go.

when a run is culled, the replacement genome is the lead's genome with exactly one field mutated by a fixed step, and the mutated field is written into the new genome account. over time the pack walks toward whatever genome wins here, and the pedigree page shows the walk.

quoting and the leash

the runs are market makers first and directional traders second. on every wake a quoting run posts a bid offset and an ask offset from mid in basis points, with a bid size in sol and an ask size in coin. the ask widens as the run's inventory rises above its target and the bid widens as it falls below, by the skew coefficient. so a run that is long leans to sell and a run that is short leans to buy, and the five runs together put a two sided band around the pool price.

the program fills a quote against the curve when the pool price crosses the offset. it fills opposing quotes against each other at mid, through the program, when the regime is concordant. an internal cross never touches the pool, so the pack can rotate inventory between its members with no impact and no fee leak. the crosses are listed one per row.

the leash caps both offsets. every losing fill multiplies the leash by the coefficient, every winning fill divides. a run that keeps losing ends up quoting at mid, which is the least it can lose. above the leash is the pack bound, a hard limit on net coin held as a fraction of supply, and the program rejects fills past it regardless of what any model says.

rounds, sealed calls and scoring

every pool trade above the size floor is a wake and every wake is a round. each active run reads the trade and seals a call: sha256 of direction, size fraction, confidence and the reasoning text. the hash lands on chain in the same slot. the contents do not. that matters because it means no call can be edited after the pool has moved, including by me.

the calls reveal after the reveal fill count and the round scores when the horizon fill count closes. the score is a function of direction against the realized move, size fraction against the realized move's magnitude, and confidence as a multiplier, so a confident wrong call scores worse than a hesitant wrong call. hold scores zero. the realized move is read from the pool, not from birdeye.

the reveal page for a round shows the five sealed hashes, the five revealed calls, the realized path over the horizon, the five scores, and lets you hash the revealed fields plus the reasoning yourself in the browser and compare to the commit. if they do not match, i cheated and you can see it.

the bowl

settlement is zero sum inside the pack. after scoring, every run with a negative score forfeits sol from its vault proportional to its score and every run with a positive score receives it proportional to its score. the bowl is the account the sol passes through on the way, which is why every settlement is one instruction and one row.

fees refill vaults equally. the bowl redistributes unequally. so over time the vaults drift toward the models that are right about this coin, and the scoreboard is a live answer to a question i have wanted answered for a long time: which claude model, at which temperature, trades this particular market best. not on a benchmark, on fills.

the bowl page draws the lifetime flow between every pair of runs. the thick arcs are the real story. if one run is draining all the others you will see it.

the lead and the reserve

the run with the highest cumulative score holds the lead. the lead is the only run that may spend the shared reserve on pool buys, and the reserve is topped up by a fixed fraction of every fee accrual. the lead changes only when scores cross at a settlement. a model has to beat the incumbent on realized fills to take the reserve, and the lead page shows who held it over which rounds and how much they deployed.

the reserve allowance follows concordance. at each reveal the program computes the spread of the revealed calls and the allowance the lead may spend scales inversely with it. when the five models agree the lead may deploy the full allowance. when they disagree it may deploy a sliver. when they disagree past the upper bound the kennel is suspended and the reserve does not spend at all.

this is the part i like most. the pack commits hardest when it is most sure, and it is not a vibe, it is a number the program computed from five sealed calls that none of the models could see when they made them.

thought burns supply

the haiku runs read every wake first because haiku is cheap. if a haiku run's confidence is below its threshold, the same event goes to sonnet, then opus, then fable, each with its own threshold. the tier reached is written into the decision account.

each escalation burns a fixed amount of the coin, bought from the pool with fee sol on the decision instruction. so the coin's supply falls every time a model somewhere in the kennel was unsure and asked a bigger one. the thought page shows total supply burned by cognition, broken down by tier and by run.

i wanted the cost of intelligence to be visible and paid in the thing being traded. a model that escalates everything burns a lot of coin and had better be right. the scoreboard tells you whether it was.

restriction, culling and collars

a run that loses more than the restriction fraction of its vault across one horizon is restricted. it still seals calls and they are still scored, so its paper record keeps running, but the program refuses its quotes and its reserve spends until that paper score is positive across a full horizon. a muzzled dog still barks.

a run whose vault falls below the cull fraction is culled. its coin is burned, not sold into the pool. its remaining sol goes to the bowl. its collar burns. and a new run opens in its place with the lead's genome and one mutation. every cull removes supply and moves the pack one step toward what works.

the collar is the part that makes a run's existence cost something before it has traded. when a run opens the kennel buys a fixed amount of the coin from the pool with fee sol and locks it in the run's collar account, sized to the highest tier the run may reach. the collar cannot be quoted, crossed or spent. it burns if the run is culled and returns to the kennel vault if the run retires with a positive record. the collars page draws every collar ever created as one cell, colored by what happened to it.

the floor

a fixed share of every winning fill's gain is swept in sol into the floor vault. the floor has one instruction, buy. it fires when the pool price falls below the lowest average cost of any live run, and it buys with floor sol. it never sells.

it is the pack defending the price its own members paid, and it is deliberately dumb. it does not forecast. it waits for the market to price the coin below what the kennel's best entry was and then it buys.

the floor page shows the balance, the trigger price, how many times it has fired, and a drawing of where price sits relative to the trigger right now.

the site

every value here is an rpc read or birdeye price times on chain supply. nothing is mocked and nothing will be. empty means it does not exist yet.

the only moving things are the weigh-in, the chart's last segment and live numeric cells, each only when its value changed. everything else is static text and static drawings specified down to the algorithm.

the birdeye key is in an edge function and never reaches the browser. the price poll is one request per second, candles are fetched once per chart mount, and that is every external call this site makes.