Choose the child model in the delegate call Asked "are you able to delegate to ox alpha", a session answered no — correctly, and while holding exactly that lane. Its `delegate` tool took `prompt`, `count` and `description` and nothing else, so the model the children ran on was fixed when the session opened. The `superdelegate` skill meanwhile documented `--child-model ox-alpha` as if it were reachable, so the skill and the tool disagreed and the tool was right. `delegate` now takes a `model`, enumerated from the lanes the session can actually reach. A fan-out of straightforward fixes and a fan-out of design questions are different work and want different models, and a session that had to be restarted to change lanes is a session that will not change them. Where a session can only run children one way the parameter is not offered at all: a knob that goes nowhere is worse than no knob, which is the failure this started from. Lanes are named by the names people use. Ox Alpha's slug is `opencode/x-preview-f-free` — it says neither `ox` nor `alpha` — so `ox-alpha` and `gemini` resolve to their slugs, slugs still resolve to themselves, and the same words work on `--child-model`, which is what the skill had always claimed. They also report by those names. The first working version routed correctly and labelled the fleet with the slug, and the session under test would not claim its request had been honoured: it had asked for `ox-alpha` and been answered `x-preview-f-free`, and could not tell routing from a silent fallback. It was right not to. A lane now reports the name a reader would recognise however it was reached, and the same session quotes back `opencode (ox-alpha)`. One registry serves every lane, so children of two models render as one fleet and stop together, and a lane is built once and reused rather than starting a second fleet that competes with the first for the same concurrency cap. 433 tests pass, nine of them on naming and choosing a lane.
Choose the child model in the delegate call
Deploy story
What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.
Not deployed through the forge lane
No push, promotion, build, or deploy receipt references this commit (receipts are scanned over a bounded recent window). Changes shipped by full node replacement carry their proof in the release gate receipt instead.
Changed files
-
modified
docs/assure-repo/false-green-candidates.v1.json -
modified
docs/assure-repo/surface-inventory.v1.json -
modified
packages/openagents-cli/skills/superdelegate/SKILL.md -
modified
packages/openagents-cli/src/cli.ts -
modified
packages/openagents-cli/src/coder-delegate.ts -
modified
packages/openagents-cli/src/coder-session.ts -
modified
packages/openagents-cli/src/coder-tools.ts -
added
packages/openagents-cli/test/coder-delegate-lanes.test.ts
Diff
8 files changed, +294 -45
docs/assure-repo/false-green-candidates.v1.json modified +1 -1
@@ -4,7 +4,7 @@
| 4 | 4 |
|
| 5 | 5 |
|
| 6 | 6 |
|
| 7 |
|
|
| 7 |
|
|
| 8 | 8 |
|
| 9 | 9 |
|
| 10 | 10 |
|
docs/assure-repo/surface-inventory.v1.json modified +2 -2
@@ -1,7 +1,7 @@
| 1 | 1 |
|
| 2 | 2 |
|
| 3 | 3 |
|
| 4 |
|
|
| 4 |
|
|
| 5 | 5 |
|
| 6 | 6 |
|
| 7 | 7 |
|
packages/openagents-cli/skills/superdelegate/SKILL.md modified +15 -9
@@ -23,12 +23,19 @@ conversation and cannot ask questions, so the prompt carries everything. Every
| 23 | 23 |
|
| 24 | 24 |
|
| 25 | 25 |
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 32 |
|
|
| 33 |
|
|
| 34 |
|
|
| 35 |
|
|
| 36 |
|
|
| 37 |
|
|
| 38 |
|
|
| 32 | 39 |
|
| 33 | 40 |
|
| 34 | 41 |
|
@@ -66,9 +73,8 @@ child its own git worktree so their edits cannot meet.
| 66 | 73 |
|
| 67 | 74 |
|
| 68 | 75 |
|
| 69 |
|
|
| 70 |
|
|
| 71 |
|
|
| 76 |
|
|
| 77 |
|
|
| 72 | 78 |
|
| 73 | 79 |
|
| 74 | 80 |
|
packages/openagents-cli/src/cli.ts modified +67 -24
@@ -20,11 +20,14 @@ import { startChildGateway } from "./coder-child-gateway.js";
| 20 | 20 |
|
| 21 | 21 |
|
| 22 | 22 |
|
| 23 |
|
|
| 24 |
|
|
| 23 | 25 |
|
| 24 | 26 |
|
| 25 | 27 |
|
| 26 | 28 |
|
| 27 | 29 |
|
| 30 |
|
|
| 28 | 31 |
|
| 29 | 32 |
|
| 30 | 33 |
|
@@ -1590,20 +1593,61 @@ async function buildDelegation(options: {
| 1590 | 1593 |
|
| 1591 | 1594 |
|
| 1592 | 1595 |
|
| 1596 |
|
|
| 1597 |
|
|
| 1598 |
|
|
| 1599 |
|
|
| 1600 |
|
|
| 1601 |
|
|
| 1602 |
|
|
| 1603 |
|
|
| 1604 |
|
|
| 1605 |
|
|
| 1606 |
|
|
| 1607 |
|
|
| 1608 |
|
|
| 1609 |
|
|
| 1610 |
|
|
| 1611 |
|
|
| 1612 |
|
|
| 1613 |
|
|
| 1614 |
|
|
| 1615 |
|
|
| 1616 |
|
|
| 1617 |
|
|
| 1618 |
|
|
| 1619 |
|
|
| 1620 |
|
|
| 1621 |
|
|
| 1622 |
|
|
| 1623 |
|
|
| 1624 |
|
|
| 1625 |
|
|
| 1626 |
|
|
| 1627 |
|
|
| 1628 |
|
|
| 1629 |
|
|
| 1630 |
|
|
| 1631 |
|
|
| 1632 |
|
|
| 1633 |
|
|
| 1634 |
|
|
| 1635 |
|
|
| 1636 |
|
|
| 1637 |
|
|
| 1593 | 1638 |
|
| 1594 | 1639 |
|
| 1595 | 1640 |
|
| 1596 | 1641 |
|
| 1597 |
|
|
| 1598 |
|
|
| 1599 |
|
|
| 1600 |
|
|
| 1601 |
|
|
| 1602 |
|
|
| 1603 |
|
|
| 1604 |
|
|
| 1642 |
|
|
| 1643 |
|
|
| 1644 |
|
|
| 1645 |
|
|
| 1646 |
|
|
| 1647 |
|
|
| 1648 |
|
|
| 1605 | 1649 |
|
| 1606 |
|
|
| 1650 |
|
|
| 1607 | 1651 |
|
| 1608 | 1652 |
|
| 1609 | 1653 |
|
@@ -1622,25 +1666,19 @@ async function buildDelegation(options: {
| 1622 | 1666 |
|
| 1623 | 1667 |
|
| 1624 | 1668 |
|
| 1625 |
|
|
| 1626 |
|
|
| 1627 |
|
|
| 1628 |
|
|
| 1629 |
|
|
| 1630 |
|
|
| 1631 |
|
|
| 1632 |
|
|
| 1633 |
|
|
| 1634 |
|
|
| 1635 |
|
|
| 1669 |
|
|
| 1636 | 1670 |
|
| 1637 |
|
|
| 1671 |
|
|
| 1638 | 1672 |
|
| 1639 | 1673 |
|
| 1640 | 1674 |
|
| 1641 | 1675 |
|
| 1642 | 1676 |
|
| 1643 |
|
|
| 1677 |
|
|
| 1678 |
|
|
| 1679 |
|
|
| 1680 |
|
|
| 1681 |
|
|
| 1644 | 1682 |
|
| 1645 | 1683 |
|
| 1646 | 1684 |
|
@@ -1665,13 +1703,18 @@ async function buildDelegation(options: {
| 1665 | 1703 |
|
| 1666 | 1704 |
|
| 1667 | 1705 |
|
| 1668 |
|
|
| 1669 | 1706 |
|
| 1670 | 1707 |
|
| 1671 | 1708 |
|
| 1672 | 1709 |
|
| 1673 | 1710 |
|
| 1674 |
|
|
| 1711 |
|
|
| 1712 |
|
|
| 1713 |
|
|
| 1714 |
|
|
| 1715 |
|
|
| 1716 |
|
|
| 1717 |
|
|
| 1675 | 1718 |
|
| 1676 | 1719 |
|
| 1677 | 1720 |
|
packages/openagents-cli/src/coder-delegate.ts modified +49
@@ -516,6 +516,55 @@ export const FREE_CHILD_MODELS: ReadonlyArray<string> = [
| 516 | 516 |
|
| 517 | 517 |
|
| 518 | 518 |
|
| 519 |
|
|
| 520 |
|
|
| 521 |
|
|
| 522 |
|
|
| 523 |
|
|
| 524 |
|
|
| 525 |
|
|
| 526 |
|
|
| 527 |
|
|
| 528 |
|
|
| 529 |
|
|
| 530 |
|
|
| 531 |
|
|
| 532 |
|
|
| 533 |
|
|
| 534 |
|
|
| 535 |
|
|
| 536 |
|
|
| 537 |
|
|
| 538 |
|
|
| 539 |
|
|
| 540 |
|
|
| 541 |
|
|
| 542 |
|
|
| 543 |
|
|
| 544 |
|
|
| 545 |
|
|
| 546 |
|
|
| 547 |
|
|
| 548 |
|
|
| 549 |
|
|
| 550 |
|
|
| 551 |
|
|
| 552 |
|
|
| 553 |
|
|
| 554 |
|
|
| 555 |
|
|
| 556 |
|
|
| 557 |
|
|
| 558 |
|
|
| 559 |
|
|
| 560 |
|
|
| 561 |
|
|
| 562 |
|
|
| 563 |
|
|
| 564 |
|
|
| 565 |
|
|
| 566 |
|
|
| 567 |
|
|
| 519 | 568 |
|
| 520 | 569 |
|
| 521 | 570 |
|
packages/openagents-cli/src/coder-session.ts modified +24 -2
@@ -161,14 +161,36 @@ export interface CoderSnapshot {
| 161 | 161 |
|
| 162 | 162 |
|
| 163 | 163 |
|
| 164 |
|
|
| 165 |
|
|
| 164 |
|
|
| 166 | 165 |
|
| 167 | 166 |
|
| 168 | 167 |
|
| 169 | 168 |
|
| 170 | 169 |
|
| 171 | 170 |
|
| 171 |
|
|
| 172 |
|
|
| 173 |
|
|
| 174 |
|
|
| 175 |
|
|
| 176 |
|
|
| 177 |
|
|
| 178 |
|
|
| 179 |
|
|
| 180 |
|
|
| 181 |
|
|
| 182 |
|
|
| 183 |
|
|
| 184 |
|
|
| 185 |
|
|
| 186 |
|
|
| 187 |
|
|
| 188 |
|
|
| 189 |
|
|
| 190 |
|
|
| 191 |
|
|
| 192 |
|
|
| 193 |
|
|
| 172 | 194 |
|
| 173 | 195 |
|
| 174 | 196 |
|
packages/openagents-cli/src/coder-tools.ts modified +45 -7
@@ -19,6 +19,7 @@ import { existsSync } from "node:fs";
| 19 | 19 |
|
| 20 | 20 |
|
| 21 | 21 |
|
| 22 |
|
|
| 22 | 23 |
|
| 23 | 24 |
|
| 24 | 25 |
|
@@ -60,6 +61,7 @@ const CHILD_RESULT_LIMIT = 2_000;
| 60 | 61 |
|
| 61 | 62 |
|
| 62 | 63 |
|
| 64 |
|
|
| 63 | 65 |
|
| 64 | 66 |
|
| 65 | 67 |
|
@@ -73,7 +75,10 @@ export function delegateTool(delegation: CoderDelegation): CoderTool {
| 73 | 75 |
|
| 74 | 76 |
|
| 75 | 77 |
|
| 76 |
|
|
| 78 |
|
|
| 79 |
|
|
| 80 |
|
|
| 81 |
|
|
| 77 | 82 |
|
| 78 | 83 |
|
| 79 | 84 |
|
@@ -93,6 +98,18 @@ export function delegateTool(delegation: CoderDelegation): CoderTool {
| 93 | 98 |
|
| 94 | 99 |
|
| 95 | 100 |
|
| 101 |
|
|
| 102 |
|
|
| 103 |
|
|
| 104 |
|
|
| 105 |
|
|
| 106 |
|
|
| 107 |
|
|
| 108 |
|
|
| 109 |
|
|
| 110 |
|
|
| 111 |
|
|
| 112 |
|
|
| 96 | 113 |
|
| 97 | 114 |
|
| 98 | 115 |
|
@@ -103,6 +120,20 @@ export function delegateTool(delegation: CoderDelegation): CoderTool {
| 103 | 120 |
|
| 104 | 121 |
|
| 105 | 122 |
|
| 123 |
|
|
| 124 |
|
|
| 125 |
|
|
| 126 |
|
|
| 127 |
|
|
| 128 |
|
|
| 129 |
|
|
| 130 |
|
|
| 131 |
|
|
| 132 |
|
|
| 133 |
|
|
| 134 |
|
|
| 135 |
|
|
| 136 |
|
|
| 106 | 137 |
|
| 107 | 138 |
|
| 108 | 139 |
|
@@ -116,14 +147,14 @@ export function delegateTool(delegation: CoderDelegation): CoderTool {
| 116 | 147 |
|
| 117 | 148 |
|
| 118 | 149 |
|
| 119 |
|
|
| 150 |
|
|
| 120 | 151 |
|
| 121 | 152 |
|
| 122 | 153 |
|
| 123 | 154 |
|
| 124 | 155 |
|
| 125 | 156 |
|
| 126 |
|
|
| 157 |
|
|
| 127 | 158 |
|
| 128 | 159 |
|
| 129 | 160 |
|
@@ -145,7 +176,14 @@ function identify(prompt: string, index: number, count: number): string {
| 145 | 176 |
|
| 146 | 177 |
|
| 147 | 178 |
|
| 148 |
|
|
| 179 |
|
|
| 180 |
|
|
| 181 |
|
|
| 182 |
|
|
| 183 |
|
|
| 184 |
|
|
| 185 |
|
|
| 186 |
|
|
| 149 | 187 |
|
| 150 | 188 |
|
| 151 | 189 |
|
@@ -155,7 +193,7 @@ function report(outcomes: ReadonlyArray<DelegationOutcome>, delegation: CoderDel
| 155 | 193 |
|
| 156 | 194 |
|
| 157 | 195 |
|
| 158 |
|
|
| 196 |
|
|
| 159 | 197 |
|
| 160 | 198 |
|
| 161 | 199 |
|
@@ -168,12 +206,12 @@ function report(outcomes: ReadonlyArray<DelegationOutcome>, delegation: CoderDel
| 168 | 206 |
|
| 169 | 207 |
|
| 170 | 208 |
|
| 171 |
|
|
| 209 |
|
|
| 172 | 210 |
|
| 173 | 211 |
|
| 174 | 212 |
|
| 175 | 213 |
|
| 176 |
|
|
| 214 |
|
|
| 177 | 215 |
|
| 178 | 216 |
|
| 179 | 217 |
|
packages/openagents-cli/test/coder-delegate-lanes.test.ts added +91
@@ -0,0 +1,91 @@
| 1 |
|
|
| 2 |
|
|
| 3 |
|
|
| 4 |
|
|
| 5 |
|
|
| 6 |
|
|
| 7 |
|
|
| 8 |
|
|
| 9 |
|
|
| 10 |
|
|
| 11 |
|
|
| 12 |
|
|
| 13 |
|
|
| 14 |
|
|
| 15 |
|
|
| 16 |
|
|
| 17 |
|
|
| 18 |
|
|
| 19 |
|
|
| 20 |
|
|
| 21 |
|
|
| 22 |
|
|
| 23 |
|
|
| 24 |
|
|
| 25 |
|
|
| 26 |
|
|
| 27 |
|
|
| 28 |
|
|
| 29 |
|
|
| 30 |
|
|
| 31 |
|
|
| 32 |
|
|
| 33 |
|
|
| 34 |
|
|
| 35 |
|
|
| 36 |
|
|
| 37 |
|
|
| 38 |
|
|
| 39 |
|
|
| 40 |
|
|
| 41 |
|
|
| 42 |
|
|
| 43 |
|
|
| 44 |
|
|
| 45 |
|
|
| 46 |
|
|
| 47 |
|
|
| 48 |
|
|
| 49 |
|
|
| 50 |
|
|
| 51 |
|
|
| 52 |
|
|
| 53 |
|
|
| 54 |
|
|
| 55 |
|
|
| 56 |
|
|
| 57 |
|
|
| 58 |
|
|
| 59 |
|
|
| 60 |
|
|
| 61 |
|
|
| 62 |
|
|
| 63 |
|
|
| 64 |
|
|
| 65 |
|
|
| 66 |
|
|
| 67 |
|
|
| 68 |
|
|
| 69 |
|
|
| 70 |
|
|
| 71 |
|
|
| 72 |
|
|
| 73 |
|
|
| 74 |
|
|
| 75 |
|
|
| 76 |
|
|
| 77 |
|
|
| 78 |
|
|
| 79 |
|
|
| 80 |
|
|
| 81 |
|
|
| 82 |
|
|
| 83 |
|
|
| 84 |
|
|
| 85 |
|
|
| 86 |
|
|
| 87 |
|
|
| 88 |
|
|
| 89 |
|
|
| 90 |
|
|
| 91 |
|