[{"data":1,"prerenderedAt":1218},["ShallowReactive",2],{"article-hexrider-origins":3,"articles-all-for-related-hexrider-origins":244},{"id":4,"title":5,"body":6,"cover":228,"date":229,"description":230,"draft":231,"extension":232,"meta":233,"navigation":132,"path":234,"pinned":231,"seo":235,"sitemap":236,"stem":237,"tags":238,"type":242,"__hash__":243},"articles\u002Farticles\u002Fhexrider-origins.md","Two bikes, one tick",{"type":7,"value":8,"toc":226},"minimark",[9,23,26,29,34,37,49,52,203,210,213,216,219,222],[10,11,12,13,17,18,22],"p",{},"In the 80s I wrote a game called ",[14,15,16],"strong",{},"TrailBlazer"," on our Acorn Electron. Two riders, a walled arena, a trail you couldn't cross. My brother and I played it for months. A few years later I rewrote it for the Atari ST and we played it for months more. It was never clever. It was a ",[19,20,21],"em",{},"Tron"," cycle duel with the good parts stripped out so a kid could fit the whole thing in his head.",[10,24,25],{},"HexRider is that same game, forty years on. Canvas instead of MODE 2, TypeScript instead of BBC BASIC, and — the thing that actually made me open the editor — we can now play it on our phones without being in the same room. Everything else in the build exists to keep a childhood game alive between two adults who don't share a living room carpet any more.",[10,27,28],{},"But there's a thing early version cheated on, and I'd never really thought about until I had to write it properly.",[10,30,31],{},[14,32,33],{},"What happens when two bikes ride head-on into the same cell?",[10,35,36],{},"In the original, whoever's update loop ran first \"won\". If the program scanned player one before player two, player one got there and player two crashed into a fresh trail. That was the physics. Chris and I didn't care — we were kids — but sitting in front of HexRider's repo it started to nag me. Every head-on 50\u002F50 in the old game was already decided by the order of two variables in memory. That's not a game. That's a coin flip pretending to be skill.",[10,38,39,40,44,45,48],{},"The naïve fix is worse. If you resolve both moves, then stamp trails, then check collisions, you end up with both bikes trying to occupy the same cell before anyone has died. Stamp the trail first and now whichever order you check determines who crashes into whose fresh paint. You can't fix this with another ",[41,42,43],"code",{},"if"," at the end. The ordering ",[19,46,47],{},"is"," the problem.",[10,50,51],{},"The fix is to split the tick into phases.",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-ts shiki shiki-themes github-dark github-dark","\u002F\u002F app\u002Fgames\u002Fhexrider\u002Fphysics.ts\nexport function stepGame(state: GameState, inputs: Inputs) {\n  \u002F\u002F 1. Resolve intents — direction, turbo, teleport\n  applyIntents(state, inputs)\n\n  \u002F\u002F 2. Detect symmetric collisions BEFORE anyone moves:\n  \u002F\u002F    - head-on (both targeting each other's next cell)\n  \u002F\u002F    - swap    (both targeting the cell the other is leaving)\n  const dead = detectSymmetricCollisions(state)\n\n  \u002F\u002F 3. Commit movement for survivors, stamp trails,\n  \u002F\u002F    then check trail\u002Fwall collisions as normal\n  commitMovement(state, dead)\n}\n","ts","",[41,60,61,70,112,118,127,134,140,146,152,171,176,182,188,197],{"__ignoreMap":58},[62,63,66],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sJ8bj","\u002F\u002F app\u002Fgames\u002Fhexrider\u002Fphysics.ts\n",[62,71,73,77,80,84,88,92,95,98,101,104,106,109],{"class":64,"line":72},2,[62,74,76],{"class":75},"sOPea","export",[62,78,79],{"class":75}," function",[62,81,83],{"class":82},"sFR8T"," stepGame",[62,85,87],{"class":86},"suv1-","(",[62,89,91],{"class":90},"s-3mD","state",[62,93,94],{"class":75},":",[62,96,97],{"class":82}," GameState",[62,99,100],{"class":86},", ",[62,102,103],{"class":90},"inputs",[62,105,94],{"class":75},[62,107,108],{"class":82}," Inputs",[62,110,111],{"class":86},") {\n",[62,113,115],{"class":64,"line":114},3,[62,116,117],{"class":68},"  \u002F\u002F 1. Resolve intents — direction, turbo, teleport\n",[62,119,121,124],{"class":64,"line":120},4,[62,122,123],{"class":82},"  applyIntents",[62,125,126],{"class":86},"(state, inputs)\n",[62,128,130],{"class":64,"line":129},5,[62,131,133],{"emptyLinePlaceholder":132},true,"\n",[62,135,137],{"class":64,"line":136},6,[62,138,139],{"class":68},"  \u002F\u002F 2. Detect symmetric collisions BEFORE anyone moves:\n",[62,141,143],{"class":64,"line":142},7,[62,144,145],{"class":68},"  \u002F\u002F    - head-on (both targeting each other's next cell)\n",[62,147,149],{"class":64,"line":148},8,[62,150,151],{"class":68},"  \u002F\u002F    - swap    (both targeting the cell the other is leaving)\n",[62,153,155,158,162,165,168],{"class":64,"line":154},9,[62,156,157],{"class":75},"  const",[62,159,161],{"class":160},"s8ozJ"," dead",[62,163,164],{"class":75}," =",[62,166,167],{"class":82}," detectSymmetricCollisions",[62,169,170],{"class":86},"(state)\n",[62,172,174],{"class":64,"line":173},10,[62,175,133],{"emptyLinePlaceholder":132},[62,177,179],{"class":64,"line":178},11,[62,180,181],{"class":68},"  \u002F\u002F 3. Commit movement for survivors, stamp trails,\n",[62,183,185],{"class":64,"line":184},12,[62,186,187],{"class":68},"  \u002F\u002F    then check trail\u002Fwall collisions as normal\n",[62,189,191,194],{"class":64,"line":190},13,[62,192,193],{"class":82},"  commitMovement",[62,195,196],{"class":86},"(state, dead)\n",[62,198,200],{"class":64,"line":199},14,[62,201,202],{"class":86},"}\n",[10,204,205,206,209],{},"Three phases, but really one idea: ",[14,207,208],{},"decide the symmetric cases on paper, before the simulation touches pixels."," If two bikes point at each other's next cell on the same tick, they both die. Full stop. No \"whoever got scanned first wins\". The unfair cases are resolved in a phase where \"who went first\" doesn't exist yet.",[10,211,212],{},"This is the only substantive bit of the whole game loop. Turbo, teleport, energy regen, the bot — none of it matters if the collision is quietly rigged. Get the 50\u002F50 right and the rest is decoration.",[10,214,215],{},"I wrote this tick alongside Claude and Cursor. They were useful for the boilerplate and unhelpful about the ordering, which I had to draw on actual paper before it clicked. That feels about right for where we are in 2026 — the interesting decisions are still mine, the agents are fast typists with opinions.",[10,217,218],{},"A small thing I didn't expect: once fairness was real, the bot got more fun to play against. A naïve loop lets a greedy bot \"win\" head-on races because of the turn order, so it learns to rush. A fair loop makes those rushes genuinely 50\u002F50, and the bot has to think about angle and timing instead. Making the rules honest made the opponent smarter. I don't think that's a deep truth about AI. I think it's a deep truth about games.",[10,220,221],{},"I have one regret about this piece, which is that my brother can't read the BBC version of TrailBlazer's collision code any more. The floppy is long gone. If it still existed I'd paste it here and we could all have a laugh at twelve-year-old me. What's there instead is HexRider, a tests folder that's larger than the game, and a simulation where — if we ride straight at each other on the same tick, forty years late — we both lose. Fairly.",[223,224,225],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sOPea, html code.shiki .sOPea{--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .s-3mD, html code.shiki .s-3mD{--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":58,"searchDepth":72,"depth":72,"links":227},[],null,"2026-04-05","A head-on collision should kill both riders. In a naïve game loop it doesn't. HexRider, TrailBlazer, and one small decision about order.",false,"md",{},"\u002Farticles\u002Fhexrider-origins",{"title":5,"description":230},{"loc":234},"articles\u002Fhexrider-origins",[239,240,241],"hexrider","lab","game-dev","article","dQJwK_1uWpaiMKMP8aoe15ZxO6cp9YjOfaw8RTgavDI",[245,308,838,979],{"id":246,"title":247,"body":248,"cover":228,"date":296,"description":297,"draft":231,"extension":232,"meta":298,"navigation":132,"path":299,"pinned":231,"seo":300,"sitemap":301,"stem":302,"tags":303,"type":242,"__hash__":307},"articles\u002Farticles\u002Fbbc-micro-2026.md","A Dragon 32 in the classroom",{"type":7,"value":249,"toc":294},[250,253,268,271,282,288,291],[10,251,252],{},"A classmate brought a Dragon 32 into the classroom one morning. I don't remember their name any more, but I remember the box. Beige, chunky, a keyboard that felt like it had come off a typewriter. They'd typed a listing out of a magazine and got it running, which at the time was an act I would have put somewhere between juggling and stage magic. I stopped listening to the teacher for the rest of the day. If you've seen any of the 80s-homecomputer documentaries, that moment is the shape of the whole genre in miniature. One machine, one friend, one afternoon, and then a long campaign of persuasion at home.",[10,254,255,256,259,260,263,264,267],{},"Mine took weeks. My dad was a secondary-school teacher, which made him both the person most likely to be swayed by \"it'll help with your work, Dad\" and the person most likely to see straight through it. So I spun yarns. A proper campaign of them. There'd be a printer, I said. We could type his lessons up on it. Worksheets. Handouts. The mock papers that were at that point being reproduced on a Banda machine that turned everyone's fingers purple. I was nine. I had never typed anything in my life. My dad wasn't having it on the first pass, or the second. He'd come round most of the way by the fourth, which is how an Acorn Electron — not the BBC Micro I'd asked for, BBC Micros being dear — ended up in our house. Same family, smaller wallet. The Electron's ",[41,257,258],{},"MODE 2"," ran slower than the B's, the keyboard rattled, and a handful of ",[41,261,262],{},"*FX"," calls that worked on my friend's machine just sat there on mine. None of it mattered. It booted to ",[41,265,266],{},"BASIC"," and it was ours.",[10,269,270],{},"There's a detail I never quite got over, and it's the part of the story my younger self didn't see coming. The printer arrived about a year later. An Epson dot-matrix on tractor-fed paper, howling like a sawmill when it ran. I had spent weeks arguing that printer into the house. I then spent the next two years of Sundays typing up my dad's lesson plans on it in VIEW, saving to cassette, cursing when the cassette didn't load, re-typing. The yarn that had got the Electron in the door became the tax I paid to keep using it. I had, at nine, successfully negotiated a contract without reading the small print. That was in fact the first piece of engineering I ever did, and it was inbound rather than outbound.",[10,272,273,274,277,278,281],{},"In between the lesson plans, I played the games. Chuckie Egg. Repton. Type-in listings from ",[19,275,276],{},"Electron User"," that came back with BAD PROGRAM more often than they ran. The ones that did run were, as a rule, worse than games I had saved up pocket money for. That was the joke the magazines were in on and I wasn't. I kept typing. Somewhere in the middle of a wet Saturday copying pages of ",[41,279,280],{},"DATA"," statements, the shape of what a program was shaped like started to land. Games got me in the house. Programming is what kept me there.",[10,283,284,285,287],{},"Forty years on, the hook has not worn off. I've been a coder ever since, and I still prefer the word \"coder\" to \"engineer\" because it's the one that was on the cover of the magazines. The tools have moved more than I'd have believed in 1986 and less than anyone predicted in 2023. I have Claude Code open on one monitor now and Cursor on the other, and neither of them is the point of anything I make, the way the Electron's ",[41,286,266],{}," prompt wasn't the point of anything I made back then. They're fast typists who can hold an opinion. Partners in crime is the phrase that keeps coming to mind, and I think it's honest: not because they do the thinking, but because they'll think out loud with you until the plan sharpens.",[10,289,290],{},"The thing that still catches me out is that they argue. An agent will push back on a spec it thinks is weak, and an afternoon of that feels closer to two kids reading a magazine over each other's shoulder than it does to anything a keyboard-and-compiler workflow ever produced. I am still the annoying one in the room: about quality, about names, about whether a module earns the space it takes up. They are the ones who can turn \"alright, let's try it that way then\" into running code before my coffee goes cold. They disagree. I disagree harder. I still get there.",[10,292,293],{},"My dad's printer is in a landfill somewhere. The Electron is in a loft I no longer own. The habit of booting a machine to a prompt and asking it what it would like to make is the one thing nothing has been able to kill, and I've tried. Every terminal I open still feels like someone has just handed me a keyboard and asked me what I'd like it to do.",{"title":58,"searchDepth":72,"depth":72,"links":295},[],"2026-02-20","A classmate's computer, a yarn about a printer, and the Acorn Electron I talked my dad into buying. How I became a coder and stayed one.",{},"\u002Farticles\u002Fbbc-micro-2026",{"title":247,"description":297},{"loc":299},"articles\u002Fbbc-micro-2026",[304,305,306],"retro","acorn","origins","YGvr6IaJ4EaDPtyyft1AGrX5yR_bu1xVNPJR5kGq6cY",{"id":309,"title":310,"body":311,"cover":228,"date":825,"description":826,"draft":231,"extension":232,"meta":827,"navigation":132,"path":828,"pinned":231,"seo":829,"sitemap":830,"stem":831,"tags":832,"type":242,"__hash__":837},"articles\u002Farticles\u002Fcolburn-nine-month-head-start.md","Colburn had a nine-month head start",{"type":7,"value":312,"toc":823},[313,320,323,326,329,332,335,411,424,427,444,565,571,574,662,665,680,683,686,783,786,789,798,805,811,814,820],[10,314,315,316,319],{},"OpenClaw shipped its orchestration panel earlier this year. Three tabs across the top — Analyze, Plan, Execute — and a row of controls below: pause, resume, cancel. There's a specific kind of joke the universe saves for people who built early. You watch the keynote, you nod at the tabs, you notice the button, you realise you wrote that panel nine months ago in a folder called ",[41,317,318],{},"agent-server",", on a project called Colburn. Colburn was a working name my brother and I had picked for something else when we were kids, and it had been sitting in my projects folder waiting for a use.",[10,321,322],{},"Colburn itself is a place in North Yorkshire my brother and I visited exactly once as kids, on some family drive neither of us remembers the purpose of. It's a garrison town next door to Catterick, and its name means something like \"cold stream\" in a mix of Old English and Old Norse — the beck there ran through a coal seam, which is how the place got christened and how my brother and I first encountered the word. Nine-year-olds collect words the way older relatives collect postcards, and Colburn was one of the words we brought home. That's the whole origin of the project name. Most project names are that, if we're honest. Half the infrastructure running production somewhere is named after someone's cat, someone's dog, or a pub someone's uncle used to drink in.",[10,324,325],{},"I was not the right person to build an agent orchestrator in June 2025. Then again, a lot of people weren't the right people, and a lot of us were writing one anyway. \"Agent orchestration\" was having a moment. Every Discord had a thread. Every demo video had two agents chatting on a green background. I wanted three. I wanted three agents that could pause and resume and cancel and — the part that kept me up — tell me afterwards who had decided what.",[10,327,328],{},"Nothing I could download did that. So I wrote it.",[10,330,331],{},"Colburn was two projects in a trench coat. The trench coat was TypeScript, held together by a refusal to start over. The front half was the orchestrator: a three-stage pipeline that took a sentence of English and turned it into a workflow you could watch run. The back half was a learning academy — every agent that ran got a file of its own, and the files accumulated into something like experience. I'll tell you the front half first, because that's the one that shipped.",[10,333,334],{},"The shape of the orchestrator fits in three endpoints.",[53,336,338],{"className":55,"code":337,"language":57,"meta":58,"style":58},"\u002F\u002F server\u002Froutes\u002Forchestration.ts\nfastify.post('\u002Forchestration\u002Fanalyze', ...)  \u002F\u002F intent → structure\nfastify.post('\u002Forchestration\u002Fplan', ...)     \u002F\u002F structure → phases\nfastify.post('\u002Forchestration\u002Fexecute', ...)  \u002F\u002F phases → run\n",[41,339,340,345,370,391],{"__ignoreMap":58},[62,341,342],{"class":64,"line":65},[62,343,344],{"class":68},"\u002F\u002F server\u002Froutes\u002Forchestration.ts\n",[62,346,347,350,353,355,359,361,364,367],{"class":64,"line":72},[62,348,349],{"class":86},"fastify.",[62,351,352],{"class":82},"post",[62,354,87],{"class":86},[62,356,358],{"class":357},"s4wv1","'\u002Forchestration\u002Fanalyze'",[62,360,100],{"class":86},[62,362,363],{"class":75},"...",[62,365,366],{"class":86},")  ",[62,368,369],{"class":68},"\u002F\u002F intent → structure\n",[62,371,372,374,376,378,381,383,385,388],{"class":64,"line":114},[62,373,349],{"class":86},[62,375,352],{"class":82},[62,377,87],{"class":86},[62,379,380],{"class":357},"'\u002Forchestration\u002Fplan'",[62,382,100],{"class":86},[62,384,363],{"class":75},[62,386,387],{"class":86},")     ",[62,389,390],{"class":68},"\u002F\u002F structure → phases\n",[62,392,393,395,397,399,402,404,406,408],{"class":64,"line":120},[62,394,349],{"class":86},[62,396,352],{"class":82},[62,398,87],{"class":86},[62,400,401],{"class":357},"'\u002Forchestration\u002Fexecute'",[62,403,100],{"class":86},[62,405,363],{"class":75},[62,407,366],{"class":86},[62,409,410],{"class":68},"\u002F\u002F phases → run\n",[10,412,413,414,100,417,100,420,423],{},"Analyze parses the user's input into intent, domain, complexity, and requirements. Plan picks agents and builds phases with cost and time estimates, optionally generating alternatives. Execute runs the plan in one of three modes — ",[41,415,416],{},"dry-run",[41,418,419],{},"full",[41,421,422],{},"step-by-step"," — and streams progress over a WebSocket. Around the core there are pause\u002Fresume\u002Fcancel endpoints, a status endpoint that can return LLM request metrics on demand, an analysis history table, a small explainability route that converts a structured intent JSON blob into plain English for a stakeholder who doesn't want the JSON, and a dedicated LINGUIST path for deeper NLP analysis when the input deserves it.",[10,425,426],{},"None of that is clever in April 2026. It was not clever in June 2025 either. It was absent. That was the only reason to write it.",[10,428,429,430,100,433,100,436,439,440,443],{},"The one piece I'm still proud of is strategy selection. Given a set of agents and an analysis, the orchestrator picks between four modes — ",[41,431,432],{},"sequential",[41,434,435],{},"parallel",[41,437,438],{},"hub_spoke",", and ",[41,441,442],{},"collaborative"," — and that choice is where the coordination actually lives.",[53,445,447],{"className":55,"code":446,"language":57,"meta":58,"style":58},"\u002F\u002F server\u002Fcore\u002Fcore-orchestrator.ts\nprivate selectExecutionStrategy(\n  agents: AgentSelection[],\n  analysis: Analysis,\n  request: WorkflowRequest,\n  coordinationPlan?: CoordinationPlan,\n  mixedTeamResult?: TeamIntegrationResult,\n): 'sequential' | 'parallel' | 'hub_spoke' | 'collaborative' {\n  if (agents.length === 1) return 'parallel'   \u002F\u002F direct execution\n  \u002F\u002F ...role hierarchy, escalation rules, mixed-team checks\n}\n",[41,448,449,454,465,470,475,480,491,501,528,556,561],{"__ignoreMap":58},[62,450,451],{"class":64,"line":65},[62,452,453],{"class":68},"\u002F\u002F server\u002Fcore\u002Fcore-orchestrator.ts\n",[62,455,456,459,462],{"class":64,"line":72},[62,457,458],{"class":86},"private ",[62,460,461],{"class":82},"selectExecutionStrategy",[62,463,464],{"class":86},"(\n",[62,466,467],{"class":64,"line":114},[62,468,469],{"class":86},"  agents: AgentSelection[],\n",[62,471,472],{"class":64,"line":120},[62,473,474],{"class":86},"  analysis: Analysis,\n",[62,476,477],{"class":64,"line":129},[62,478,479],{"class":86},"  request: WorkflowRequest,\n",[62,481,482,485,488],{"class":64,"line":136},[62,483,484],{"class":86},"  coordinationPlan",[62,486,487],{"class":75},"?:",[62,489,490],{"class":86}," CoordinationPlan,\n",[62,492,493,496,498],{"class":64,"line":142},[62,494,495],{"class":86},"  mixedTeamResult",[62,497,487],{"class":75},[62,499,500],{"class":86}," TeamIntegrationResult,\n",[62,502,503,506,509,512,515,517,520,522,525],{"class":64,"line":148},[62,504,505],{"class":86},"): ",[62,507,508],{"class":357},"'sequential'",[62,510,511],{"class":75}," |",[62,513,514],{"class":357}," 'parallel'",[62,516,511],{"class":75},[62,518,519],{"class":357}," 'hub_spoke'",[62,521,511],{"class":75},[62,523,524],{"class":357}," 'collaborative'",[62,526,527],{"class":86}," {\n",[62,529,530,533,536,539,542,545,548,551,553],{"class":64,"line":154},[62,531,532],{"class":75},"  if",[62,534,535],{"class":86}," (agents.",[62,537,538],{"class":160},"length",[62,540,541],{"class":75}," ===",[62,543,544],{"class":160}," 1",[62,546,547],{"class":86},") ",[62,549,550],{"class":75},"return",[62,552,514],{"class":357},[62,554,555],{"class":68},"   \u002F\u002F direct execution\n",[62,557,558],{"class":64,"line":173},[62,559,560],{"class":68},"  \u002F\u002F ...role hierarchy, escalation rules, mixed-team checks\n",[62,562,563],{"class":64,"line":178},[62,564,202],{"class":86},[10,566,567,568,570],{},"A one-agent plan is trivially parallel — it just runs. Two agents with a clear producer\u002Fconsumer relationship go sequential. A planner plus three workers go hub-spoke. Anything genuinely peer-to-peer — a code review by three agents with different biases, a debate between a security specialist and a performance specialist — is collaborative. The function itself is boring. The fact that there ",[19,569,47],{}," a function — that \"how do these agents talk to each other\" is a choice the system makes at plan time, rather than a shape the prompt accidentally falls into — is the thing I would keep if I lost everything else.",[10,572,573],{},"The other piece worth naming is the fallback. The intelligent agent selector starts by searching four pools: system agents, user-created agents, meta-created specialists, and a general pool. If nothing in any pool fits the task, it doesn't fail. It hands off to NEXUS — the meta layer — to create a new specialist.",[53,575,577],{"className":55,"code":576,"language":57,"meta":58,"style":58},"\u002F\u002F server\u002Fservices\u002Fagent-selection-service.ts\nconst existingAgents = await this.findExistingAgents(analysis)\nif (existingAgents.length > 0) {\n  return existingAgents\n}\n\n\u002F\u002F No existing agents found — hand off to NEXUS\nreturn await this.requestNexusAgentCreation(analysis)\n",[41,578,579,584,609,626,634,638,642,647],{"__ignoreMap":58},[62,580,581],{"class":64,"line":65},[62,582,583],{"class":68},"\u002F\u002F server\u002Fservices\u002Fagent-selection-service.ts\n",[62,585,586,589,592,594,597,600,603,606],{"class":64,"line":72},[62,587,588],{"class":75},"const",[62,590,591],{"class":160}," existingAgents",[62,593,164],{"class":75},[62,595,596],{"class":75}," await",[62,598,599],{"class":160}," this",[62,601,602],{"class":86},".",[62,604,605],{"class":82},"findExistingAgents",[62,607,608],{"class":86},"(analysis)\n",[62,610,611,613,616,618,621,624],{"class":64,"line":114},[62,612,43],{"class":75},[62,614,615],{"class":86}," (existingAgents.",[62,617,538],{"class":160},[62,619,620],{"class":75}," >",[62,622,623],{"class":160}," 0",[62,625,111],{"class":86},[62,627,628,631],{"class":64,"line":120},[62,629,630],{"class":75},"  return",[62,632,633],{"class":86}," existingAgents\n",[62,635,636],{"class":64,"line":129},[62,637,202],{"class":86},[62,639,640],{"class":64,"line":136},[62,641,133],{"emptyLinePlaceholder":132},[62,643,644],{"class":64,"line":142},[62,645,646],{"class":68},"\u002F\u002F No existing agents found — hand off to NEXUS\n",[62,648,649,651,653,655,657,660],{"class":64,"line":148},[62,650,550],{"class":75},[62,652,596],{"class":75},[62,654,599],{"class":160},[62,656,602],{"class":86},[62,658,659],{"class":82},"requestNexusAgentCreation",[62,661,608],{"class":86},[10,663,664],{},"That five-line branch is the bit I kept coming back to. The pool isn't a list; it's a behaviour. If the match is weak enough, the system grows. Most orchestrators I looked at that summer treated their roster as fixed at boot. Colburn treated it as a function of what had already been asked of it.",[10,666,667,668,671,672,675,676,679],{},"Here's the one honest gap. Four pools is the design. Two pools is the data path today. ",[41,669,670],{},"discoverAgentsFromAllPools"," returns empty arrays for ",[41,673,674],{},"user_agents"," and ",[41,677,678],{},"general_agents",", and populated arrays for the other two. The system works because the NEXUS fallback fills in the space the empty pools leave behind. It's a design that's true at the interface and incomplete at the storage layer, and I know which of those I'd rather have. The choice that's easier to undo is the one that's safe to leave half-built.",[10,681,682],{},"The orchestrator can pick between four strategies and four pools and keep a history of every analysis, and at the end of a run it knows more about the agents it used than it did at the start. The question is what to do with that knowledge.",[10,684,685],{},"I called the second half of Colburn the Agent Growth Academy, because \"Agent Learning Academy\" sounded like a Coursera subsidiary. Growth is only fractionally less corporate, but it was the best I had at midnight. The idea is old and slightly embarrassing to type out: if an agent is going to outlive the conversation that created it, it should get better at its job. Every run, the academy records milestones (what task was completed, how), adaptations (what behaviour changed as a result), and reflections (what the agent would do differently next time). A specialist's performance is compared to a baseline LLM on three axes — speed, quality, cost — and the gap is the thing the academy watches.",[53,687,689],{"className":55,"code":688,"language":57,"meta":58,"style":58},"\u002F\u002F server\u002Froutes\u002Facademy.ts\nfastify.post('\u002Facademy\u002Fagents\u002F:id\u002Fmilestones', ...)\nfastify.post('\u002Facademy\u002Fagents\u002F:id\u002Fadaptations', ...)\nfastify.post('\u002Facademy\u002Fagents\u002F:id\u002Freflections', ...)\nfastify.get('\u002Facademy\u002Fagents\u002F:id\u002Fperformance', ...)\nfastify.get('\u002Facademy\u002Fdashboard', ...)\n",[41,690,691,696,714,731,748,766],{"__ignoreMap":58},[62,692,693],{"class":64,"line":65},[62,694,695],{"class":68},"\u002F\u002F server\u002Froutes\u002Facademy.ts\n",[62,697,698,700,702,704,707,709,711],{"class":64,"line":72},[62,699,349],{"class":86},[62,701,352],{"class":82},[62,703,87],{"class":86},[62,705,706],{"class":357},"'\u002Facademy\u002Fagents\u002F:id\u002Fmilestones'",[62,708,100],{"class":86},[62,710,363],{"class":75},[62,712,713],{"class":86},")\n",[62,715,716,718,720,722,725,727,729],{"class":64,"line":114},[62,717,349],{"class":86},[62,719,352],{"class":82},[62,721,87],{"class":86},[62,723,724],{"class":357},"'\u002Facademy\u002Fagents\u002F:id\u002Fadaptations'",[62,726,100],{"class":86},[62,728,363],{"class":75},[62,730,713],{"class":86},[62,732,733,735,737,739,742,744,746],{"class":64,"line":120},[62,734,349],{"class":86},[62,736,352],{"class":82},[62,738,87],{"class":86},[62,740,741],{"class":357},"'\u002Facademy\u002Fagents\u002F:id\u002Freflections'",[62,743,100],{"class":86},[62,745,363],{"class":75},[62,747,713],{"class":86},[62,749,750,752,755,757,760,762,764],{"class":64,"line":129},[62,751,349],{"class":86},[62,753,754],{"class":82},"get",[62,756,87],{"class":86},[62,758,759],{"class":357},"'\u002Facademy\u002Fagents\u002F:id\u002Fperformance'",[62,761,100],{"class":86},[62,763,363],{"class":75},[62,765,713],{"class":86},[62,767,768,770,772,774,777,779,781],{"class":64,"line":136},[62,769,349],{"class":86},[62,771,754],{"class":82},[62,773,87],{"class":86},[62,775,776],{"class":357},"'\u002Facademy\u002Fdashboard'",[62,778,100],{"class":86},[62,780,363],{"class":75},[62,782,713],{"class":86},[10,784,785],{},"The first four routes work. The fifth returns placeholder values. I had the service layer doing the right things — tracking milestones and adaptations, computing specialist performance against a baseline — before I had the dashboard that would make those values visible, and by the time I got to the dashboard the rest of the year had happened. The academy is the part of Colburn that is most honest about how new this problem is. We don't know what \"my agent got 7% better this week\" is supposed to look like on a page. We know how to store it. The rendering is still waiting for a shape.",[10,787,788],{},"I didn't finish Colburn. The market did. Over the nine months between June 2025 and April 2026, three teams shipped orchestration products that look like the orchestration product I was writing, and one of them is probably better than mine. I should feel scooped. I don't, or not mostly, and the reason is the only thing worth taking from this piece.",[10,790,791,792,794,795,797],{},"You cannot read your way to knowing what an orchestration API should look like. You cannot read your way to understanding why ",[41,793,438],{}," is a different animal from ",[41,796,442],{},", or why the NEXUS fallback is the interesting part of agent pooling and pooling itself is the plumbing. You have to write the bad version first. Colburn was the bad version — or the first honest version, if I want to be kinder — and when OpenClaw's panel appeared on Tuesday I could look at it and immediately see three decisions they'd made differently and why, and two they'd made the same and probably for the same reasons. That isn't a consolation prize. It's the only way I know to have an opinion about a thing.",[10,799,800,801,804],{},"The demoscene has a phrase for the version of a demo nobody sees. ",[19,802,803],{},"Intro zero"," — the one you write to figure out what the tools even are, before you write the one people will watch. Mostly they're thrown out. Occasionally a trick from the zeroth version survives into the released intro and becomes the signature of the group. Colburn is, at best, the intro zero for whatever the agent year turns into. The NEXUS fallback is the trick I'd like to carry forward. The academy's milestone → adaptation → reflection cycle is the shape I haven't finished thinking about.",[10,806,807,808,810],{},"My brother used to buy magazines with type-in BASIC in the back. You'd spend a Saturday copying fifteen pages of ",[41,809,280],{}," statements into the BBC Micro, run it, realise it was a worse version of a game that had already shipped on cartridge, and do it again the next month. He said the point wasn't the game. The point was that by the end of the year your hands knew what a game was shaped like.",[10,812,813],{},"I built Colburn because by June 2025 my hands knew what a two-agent demo was shaped like, and I wanted to know what a three-agent system was shaped like, and the only way to find out was to type it in. I'd do it again. I'd do it if OpenClaw had already existed. You don't build the thing that already exists because somebody is paying you to; you build it because you can't afford to have opinions about it otherwise.",[10,815,816,817,819],{},"Colburn is still sitting in ",[41,818,318],{},". The academy dashboard still returns placeholders. The user and general pools are still empty. None of that bothers me more than it should. The hands know what it's shaped like now.",[223,821,822],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .s4wv1, html code.shiki .s4wv1{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .sOPea, html code.shiki .sOPea{--shiki-default:#F97583;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":58,"searchDepth":72,"depth":72,"links":824},[],"2026-04-15","I built an agent orchestrator and a learning academy in June 2025, before there was a shape for either. By the time the shape arrived, I was glad I hadn't waited.",{},"\u002Farticles\u002Fcolburn-nine-month-head-start",{"title":310,"description":826},{"loc":828},"articles\u002Fcolburn-nine-month-head-start",[833,834,835,836],"colburn","agentic-ai","orchestration","builds","qkFwd5P90sRkgQ9Xdk75_UDVJRfz4Rhrx3WKNG24xWc",{"id":4,"title":5,"body":839,"cover":228,"date":229,"description":230,"draft":231,"extension":232,"meta":975,"navigation":132,"path":234,"pinned":231,"seo":976,"sitemap":977,"stem":237,"tags":978,"type":242,"__hash__":243},{"type":7,"value":840,"toc":973},[841,847,849,851,855,857,863,865,959,963,965,967,969,971],[10,842,12,843,17,845,22],{},[14,844,16],{},[19,846,21],{},[10,848,25],{},[10,850,28],{},[10,852,853],{},[14,854,33],{},[10,856,36],{},[10,858,39,859,44,861,48],{},[41,860,43],{},[19,862,47],{},[10,864,51],{},[53,866,867],{"className":55,"code":56,"language":57,"meta":58,"style":58},[41,868,869,873,899,903,909,913,917,921,925,937,941,945,949,955],{"__ignoreMap":58},[62,870,871],{"class":64,"line":65},[62,872,69],{"class":68},[62,874,875,877,879,881,883,885,887,889,891,893,895,897],{"class":64,"line":72},[62,876,76],{"class":75},[62,878,79],{"class":75},[62,880,83],{"class":82},[62,882,87],{"class":86},[62,884,91],{"class":90},[62,886,94],{"class":75},[62,888,97],{"class":82},[62,890,100],{"class":86},[62,892,103],{"class":90},[62,894,94],{"class":75},[62,896,108],{"class":82},[62,898,111],{"class":86},[62,900,901],{"class":64,"line":114},[62,902,117],{"class":68},[62,904,905,907],{"class":64,"line":120},[62,906,123],{"class":82},[62,908,126],{"class":86},[62,910,911],{"class":64,"line":129},[62,912,133],{"emptyLinePlaceholder":132},[62,914,915],{"class":64,"line":136},[62,916,139],{"class":68},[62,918,919],{"class":64,"line":142},[62,920,145],{"class":68},[62,922,923],{"class":64,"line":148},[62,924,151],{"class":68},[62,926,927,929,931,933,935],{"class":64,"line":154},[62,928,157],{"class":75},[62,930,161],{"class":160},[62,932,164],{"class":75},[62,934,167],{"class":82},[62,936,170],{"class":86},[62,938,939],{"class":64,"line":173},[62,940,133],{"emptyLinePlaceholder":132},[62,942,943],{"class":64,"line":178},[62,944,181],{"class":68},[62,946,947],{"class":64,"line":184},[62,948,187],{"class":68},[62,950,951,953],{"class":64,"line":190},[62,952,193],{"class":82},[62,954,196],{"class":86},[62,956,957],{"class":64,"line":199},[62,958,202],{"class":86},[10,960,205,961,209],{},[14,962,208],{},[10,964,212],{},[10,966,215],{},[10,968,218],{},[10,970,221],{},[223,972,225],{},{"title":58,"searchDepth":72,"depth":72,"links":974},[],{},{"title":5,"description":230},{"loc":234},[239,240,241],{"id":980,"title":981,"body":982,"cover":228,"date":1207,"description":1208,"draft":231,"extension":232,"meta":1209,"navigation":132,"path":1210,"pinned":132,"seo":1211,"sitemap":1212,"stem":1213,"tags":1214,"type":242,"__hash__":1217},"articles\u002Farticles\u002Fthe-number-was-always-1284.md","The number was always 1,284",{"type":7,"value":983,"toc":1205},[984,987,1030,1033,1036,1043,1046,1049,1052,1143,1161,1164,1171,1178,1185,1188,1199,1202],[10,985,986],{},"The number on the dashboard was 1,284. It was always 1,284-ish. \"Workflows executed today\", in a green pill, ticking up every few seconds like something alive. I was proud of it for about a fortnight before I opened the file and read the line.",[53,988,990],{"className":55,"code":989,"language":57,"meta":58,"style":58},"const executedToday = Math.floor(Math.random() * 2000) + 400\n",[41,991,992],{"__ignoreMap":58},[62,993,994,996,999,1001,1004,1007,1010,1013,1016,1019,1022,1024,1027],{"class":64,"line":65},[62,995,588],{"class":75},[62,997,998],{"class":160}," executedToday",[62,1000,164],{"class":75},[62,1002,1003],{"class":86}," Math.",[62,1005,1006],{"class":82},"floor",[62,1008,1009],{"class":86},"(Math.",[62,1011,1012],{"class":82},"random",[62,1014,1015],{"class":86},"() ",[62,1017,1018],{"class":75},"*",[62,1020,1021],{"class":160}," 2000",[62,1023,547],{"class":86},[62,1025,1026],{"class":75},"+",[62,1028,1029],{"class":160}," 400\n",[10,1031,1032],{},"Claude wrote it. I accepted it. Nobody had asked what the number was actually for, because there was no one else; and I hadn't asked either.",[10,1034,1035],{},"This was two months into a React Flow build. I was trying to make a visual workflow editor — node graph, drag-from-here-to-there — in the shape that n8n had made fashionable and that every AI startup in 2026 seemed to want a version of. The canvas worked. Nodes connected. An admin panel sat on top with metrics I'd never questioned, because the metrics had been there since day three and day three was a long time ago.",[10,1037,1038,1039,1042],{},"Except they hadn't been metrics since day three. They had been ",[19,1040,1041],{},"decorative",", since day three, and I'd forgotten.",[10,1044,1045],{},"Here's the thing I want to be honest about. The failure wasn't that the model made up a number. Models do that. The failure was that I read the diff and clicked approve. Twice, probably. Three times if you count the other dashboards. My name was on every commit that shipped a lie to a staging environment where the only person being lied to was me.",[10,1047,1048],{},"In the demo-scene era, cracktros invented prestige. \"GREETS TO 47 GROUPS\" when the group knew twelve people. \"COPIED BY ZOMBIE DIVISION WORLDWIDE\" when Zombie Division was a fifteen-year-old in Oldham. Those were fictions on a loading screen, written by kids, and we all understood the rules. What I was doing was the same shape: on an admin panel, written by an agent, in 2026. Forty years of progress between those cracktros and my commit, and the fiction had got better at looking like a metric.",[10,1050,1051],{},"The code change, when it finally landed, was smaller than the conversation that preceded it.",[53,1053,1055],{"className":55,"code":1054,"language":57,"meta":58,"style":58},"\u002F\u002F apps\u002Fworkflow-studio\u002Flib\u002Fmetrics.ts\nexport async function executedToday() {\n  const row = await db.workflow_studio.executions\n    .where('started_at', '>=', startOfDay())\n    .count()\n  return row?.count ?? null\n}\n",[41,1056,1057,1062,1076,1090,1116,1126,1139],{"__ignoreMap":58},[62,1058,1059],{"class":64,"line":65},[62,1060,1061],{"class":68},"\u002F\u002F apps\u002Fworkflow-studio\u002Flib\u002Fmetrics.ts\n",[62,1063,1064,1066,1069,1071,1073],{"class":64,"line":72},[62,1065,76],{"class":75},[62,1067,1068],{"class":75}," async",[62,1070,79],{"class":75},[62,1072,998],{"class":82},[62,1074,1075],{"class":86},"() {\n",[62,1077,1078,1080,1083,1085,1087],{"class":64,"line":114},[62,1079,157],{"class":75},[62,1081,1082],{"class":160}," row",[62,1084,164],{"class":75},[62,1086,596],{"class":75},[62,1088,1089],{"class":86}," db.workflow_studio.executions\n",[62,1091,1092,1095,1098,1100,1103,1105,1108,1110,1113],{"class":64,"line":120},[62,1093,1094],{"class":86},"    .",[62,1096,1097],{"class":82},"where",[62,1099,87],{"class":86},[62,1101,1102],{"class":357},"'started_at'",[62,1104,100],{"class":86},[62,1106,1107],{"class":357},"'>='",[62,1109,100],{"class":86},[62,1111,1112],{"class":82},"startOfDay",[62,1114,1115],{"class":86},"())\n",[62,1117,1118,1120,1123],{"class":64,"line":129},[62,1119,1094],{"class":86},[62,1121,1122],{"class":82},"count",[62,1124,1125],{"class":86},"()\n",[62,1127,1128,1130,1133,1136],{"class":64,"line":136},[62,1129,630],{"class":75},[62,1131,1132],{"class":86}," row?.count ",[62,1134,1135],{"class":75},"??",[62,1137,1138],{"class":160}," null\n",[62,1140,1141],{"class":64,"line":142},[62,1142,202],{"class":86},[10,1144,1145,1146,1149,1150,1153,1154,1157,1158,1160],{},"The interesting character in that snippet is the ",[41,1147,1148],{},"?? null",". A real count when we have one. ",[41,1151,1152],{},"null"," when we don't. Not ",[41,1155,1156],{},"0",", because ",[41,1159,1156],{}," is a claim that zero workflows ran today, and that is a different sentence than \"the metrics service hasn't reported yet.\" The dashboard grew an \"Unavailable\" pill. It looks less alive than the random-number version did. It is more alive, because it's actually listening.",[10,1162,1163],{},"That was the real shift of the year. Not a framework choice, not a retry policy, not any of the things the architecture doc would like to take credit for. A willingness to render \"I don't know yet\" in the UI, and to treat that state as first-class, rather than filling it with a plausible-enough number so the page didn't feel empty.",[10,1165,1166,1167,1170],{},"People will ask about Claude, Cursor, and Copilot, so: all three were in the room for this build. Copilot autocompleted the ",[41,1168,1169],{},"Math.random()"," without blinking, which is what Copilot is for; it finishes the sentence you've already started, and the sentence I'd started was a bad one. Cursor is where I lived for inline edits and fast renames, and it's still the best feel-in-the-file experience I've used. Claude Code is where I landed for anything that needed argument. The test wasn't typing speed. It was whether the tool would push back on the spec before writing the code. Claude did, usually. Cursor sometimes. Copilot never, by design. That is the order, for me, in 2026. Your mileage will differ, and it should.",[10,1172,1173,1174,1177],{},"None of them stopped me shipping the fake number. Tools don't stop you. A spec that names \"no synthetic metrics in any surfaced UI\" stops you, once, the next time you read your own ",[41,1175,1176],{},"AGENTS.md"," at the start of a session. The spec is the stop. The agent is a fast typist who will cheerfully do whatever you didn't think to forbid.",[10,1179,1180,1181,1184],{},"The workflow builder itself is quieter now. The canvas works. An honest cycle detector sits in ",[41,1182,1183],{},"apps\u002Fworkflow-studio\u002Flib\u002Fconnection-validation.ts"," where the apologetic sixty-line version used to be. The execution queue retries with exponential backoff and says \"retrying 2\u002F5\" out loud instead of swallowing the attempt. The admin panel has fewer numbers on it, the numbers it does have are real, and when the service is down the panel says so in plain English.",[10,1186,1187],{},"Two months to learn that, if you want to be ungenerous. Two months to unlearn a habit I'd been carrying since I was a kid pasting fake greets into a cracktro, if you want to be kind. Either way it's the habit that survived into HexRider, which is why HexRider has a tests folder larger than the game. Once you've watched yourself approve a lie in a PR review, the appetite for a second review changes.",[10,1189,1190,1191,1194,1195,1198],{},"My brother used to say that the best cheat codes were the ones where you could see the cheat. A ",[41,1192,1193],{},"MOTHER"," here, an ",[41,1196,1197],{},"IDDQD"," there. You knew what had happened. You knew who had done it. The ones that bothered him were the cheats that dressed up as features, so you couldn't tell whether you were winning or being lied to.",[10,1200,1201],{},"He was talking about games. He was also, accidentally, talking about dashboards.",[223,1203,1204],{},"html pre.shiki code .sOPea, html code.shiki .sOPea{--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .s8ozJ, html code.shiki .s8ozJ{--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .suv1-, html code.shiki .suv1-{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sFR8T, html code.shiki .sFR8T{--shiki-default:#B392F0;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4wv1, html code.shiki .s4wv1{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}",{"title":58,"searchDepth":72,"depth":72,"links":1206},[],"2026-04-18","Two months building a workflow editor, a green pill on an admin panel, and the cracktro habit I hadn't noticed I was carrying.",{},"\u002Farticles\u002Fthe-number-was-always-1284",{"title":981,"description":1208},{"loc":1210},"articles\u002Fthe-number-was-always-1284",[1215,1216,836],"workflow-studio","ai-tools","EPnDqDS-7-k7sG3N2XQvONdeesnIlticIME6sdoJ9Kg",1776537434777]