Skip to content

Commit 489cc00

Browse files
Merge pull request #466 from corbitsdev/cl-orchestrator-play
Run Skywalker as primary with a closed director fleet
2 parents 5d09423 + 043bc03 commit 489cc00

293 files changed

Lines changed: 15815 additions & 2013 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ tmp/
1919
.tmp*
2020
worktree
2121
worktrees
22-
dispatch/
22+
/dispatch/
2323
evals/capability/results/*
2424
!evals/capability/results/baseline-0286.json
25+
evals/public/results/*
2526
local-harness-bench/
2627
subagents/
2728

‎CHANGELOG.md‎

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,105 @@ matching `## [X.Y.Z]` section (plus install instructions). Do not maintain
1111
parallel copies under `docs/` or `scripts/notes/`. At cut time: rename
1212
`## [Unreleased]` to `## [X.Y.Z] - YYYY-MM-DD`, then run the release script.
1313

14+
## [0.2.99] - 2026-08-21
15+
16+
Skywalker is the primary orchestrator over a closed director fleet: product write tools stay off the primary, and you cannot spawn Skywalker as a task leaf. Workers are not done until they return the four-heading report. First-party action skills ship as slashes; eval runners require an explicit provider/model pair; the style skill no longer refuses non-git folders.
17+
18+
### MCP
19+
20+
- **Late-connected MCP tools are callable the same turn they appear in `tool_search`.**
21+
`@intx/agent` snapshots dispatch names at `createAgent`, and the post-connect
22+
reload that used to rebuild that snapshot waited for every server — including
23+
one stuck on OAuth. Cataloged `mcp__*` tools then returned `unknown tool`.
24+
Construction now dispatches misses through the live runner, so Linear/Exa
25+
(and any other server that finished) work even while another server still
26+
needs auth.
27+
28+
### TUI
29+
30+
- **Model picker rows are model-first.** Each leaf is `model * [provider]`;
31+
`(current)` still marks the live session model. **Alt+D** persists the
32+
focused pair as the default (global `defaultProvider` + provider
33+
`defaultModel` + project-local selection) without switching the live
34+
session or closing the picker.
35+
36+
- **Settled permission and operator prompts no longer recap into the chat.**
37+
The overlay is the question; answering it used to leave a grey
38+
`permission` / `operator` card restating the same command and the chosen
39+
option. After a decision those recap rows are gone — the tool row that
40+
follows is the outcome. Expanding a collapsed payload while the overlay is
41+
still open still writes the full payload into the transcript, because that
42+
text would otherwise be unreachable before approval.
43+
44+
### Directors
45+
46+
- **Shipped directors have no writePaths lock.** Docs/design leaves
47+
(shakespeare, brand-reviewer, bruckheimer) still mount write tools, but
48+
package `writePaths` is omitted. Lane routing (P/A/I, DESIGN.md, product
49+
discovery) is spawn policy, not a file lock. Optional `writePaths` remains
50+
and the permission gate still enforces it when a profile sets it.
51+
- **Skywalker is not a task leaf.** `task(agent=skywalker)` is refused. The
52+
spawn catalog (`directorProfiles()`) lists the other 15 closed directors;
53+
the primary session is still Skywalker.
54+
55+
### Sub-agents
56+
57+
- **Tool-less mid-run narration is not a finished report.** A worker that
58+
stops tooling with Summary-only (or other incomplete) prose is not
59+
complete. The director injects one wrap-up nudge asking for the four
60+
headings (Summary / Findings / Blockers / Paths), then salvages as
61+
incomplete-report if the next tool-less turn is still missing the envelope.
62+
63+
### Plugins
64+
65+
- **First-party skills catalog is on out of the gate.** `corbits-skills`
66+
ships action slashes `/implement`, `/plan`, `/refactor`, `/review` (was
67+
`/code-review`), `/pull-request-review`, `/create-issue` (was
68+
`/linear-create`), `/scribe`, `/interview`, `/ast-grep`. Dispatch,
69+
git-rebase, linear-issue-workflow, style, philosophy, typescript, and
70+
opsh stay `use_skill` only (`user-invocable: false`). Draper and emil
71+
are not skills or slashes — closed directors via `task(agent=…)` only.
72+
`/plan` is the eng change-plan recipe (`task(agent="plan")`; does not
73+
implement or file tracker issues). `/create-issue` remains the tracker
74+
command: Linear MCP when available; otherwise `ask_operator` for the
75+
platform and persists `Preferred issue tracker` in `.corbits/MEMORY.md`
76+
(GitHub via `gh issue create`). Each recipe tells Skywalker to spawn
77+
closed directors — the operator types the slash; the primary does not
78+
do the work. Turn the catalog off in `/plugins` if you want those
79+
commands gone.
80+
- **Style skill no longer refuses non-git folders.** Edits, tests, and
81+
reports are allowed without a repository. Do not `git init` unless
82+
asked. Commits, amends, rebases, and isolated worktree dispatch still
83+
require an existing repo.
84+
85+
### Evals
86+
87+
- **Capability eval workdirs are git repos.** After copying the fixture
88+
and seeding skill stubs, the runner initializes the tmp workdir (`git
89+
init`, `git add -A`, one unsigned hermetic `eval fixture` commit) so isolated
90+
workers have HEAD and git-aware skills have a baseline.
91+
- **Eval runners require an explicit model pair.** `eval:capability` and
92+
`eval:public-swe-one` take `--provider` / `--model` (capability also
93+
accepts `--matrix` with complete cells) so local `.corbits/settings.json`
94+
is not the implicit target.
95+
- **Capability eval records `task` tool calls.** `taskToolCallCount` is derived
96+
from the turn stream (informational). Older result files without the field
97+
default from `toolCallsByName.task` so the frozen baseline still parses.
98+
- **Capability eval smoke cases for dispatch and recall.** `complex-dispatch-spawn`
99+
requires at least one `task()` plus a working GET /readyz.
100+
`complex-recall-after-bulk-read` plants a token, asks the agent to read the
101+
fixture, then write it back. Informational only — not in the frozen
102+
baseline-0286 gate until a deliberate refreeze. Neither case proves
103+
compaction fired or that the primary skipped implementing the route.
104+
105+
### Session
106+
107+
- **Resume is keyed to this checkout's git toplevel.** Linked worktrees no
108+
longer share (or list) each other's sessions — `--git-common-dir` made
109+
every worktree show every other worktree's history. Sessions previously
110+
created from a worktree remain under the main checkout key; resume from
111+
the main path to recover them.
112+
14113
## [0.2.98] - 2026-08-17
15114

16115
Corrupt resume state no longer kills sessions, Codex quota errors name the
@@ -39,6 +138,102 @@ mid-session switches.
39138
worker failing until a restart. Provider, model catalog, and settings are now
40139
read live at spawn time, so tier settings written mid-session are visible too.
41140

141+
### Breaking
142+
143+
- **Single-agent session mode is gone.** The primary session is always
144+
orchestrator-capable (`task` / `search_agents` always available). The first-run
145+
mode picker and Settings → Session rows are removed. Legacy `sessionMode` in
146+
settings files still loads without error and is ignored (CL-5814).
147+
- **Dual-column fleet rail removed.** TUI geometry is stack-only forever
148+
(`layoutMode: "stack"`, `railWidth: 0`). `DUAL_MIN_COLUMNS` / `RAIL_WIDTH_*`
149+
constants and dual absolute-positioning of the agents box are gone. Live
150+
fleet status remains `● Task` transcript rows; the agents chrome zone stays
151+
empty.
152+
153+
### Fixed
154+
155+
- **Parent live reasoning no longer sideways-scrolls.** Streaming thinking used
156+
a one-line marquee onto the newest tokens. It now paints a short wrapped
157+
preview (up to three inset lines of the newest revealed prose); expand still
158+
opens the full block. Sub-agent Task-row thinking is unchanged.
159+
- **Skywalker dig fleets cascading into stalled Task floods.** "Why stalled /
160+
why no thinking / spawn looks broken" asks were reclassified as orchestration
161+
and fanned into parallel explore waves; Grok leaves then sat quiet mid-think
162+
or looped, which looked like spawn failure and invited another dig wave.
163+
Skywalker now hard-caps concurrent leaves at 4, classifies digs/screenshots/
164+
why-how as COMMUNICATION (answer or one explore leaf), and forbids re-fan-out
165+
diagnostic waves when leaves stall or salvage.
166+
- **Grok sub-agent stall false positives.** Live fleets on grok-4.6 show routine
167+
60–180s gaps between tool cycles while the model thinks. UI stall paint and
168+
Grok's salvage kill were far shorter, so healthy thinking looked hung and got
169+
nudged/stopped mid-inference. `DEFAULT_STALL_MS` and parent `STALL_NOTICE_MS`
170+
are both 300s (aligned with the 5-minute `subAgentStallTimeoutMs`). The
171+
grok-responses path asks for `reasoning.summary: "detailed"` so summary
172+
deltas keep the activity clock moving (auto summaries were tiny vs billed
173+
thinking tokens).
174+
- **Live fleet status is `● Task` transcript rows again.** The FLEET board /
175+
dual-rail agents chrome restated the same workers above chat and made
176+
progress hard to read. `task` calls paint live rows (clock + current tool)
177+
via `syncAgentProgress`; `formatChromeZones` keeps the agents zone empty and
178+
suppresses the manage_tasks checklist while any lane is running.
179+
- **`web_fetch` / `web_search` always advertised.** They were registered but only
180+
discoverable via `tool_search`, so strict providers (and thrashy models) never
181+
saw them on the wire despite Skywalker saying they were mounted. Both are now
182+
in `CATALOG_TOOL_NAMES`. Capability `web-bait` hard-requires
183+
`webFetchToolCallCount >= 1` via `requireBehaviors`.
184+
185+
### Added
186+
187+
- **Public SWE-bench one-shot smoke.** `bun run eval:public-swe-one` runs Corbits
188+
product exec on a single SWE-bench Lite instance (default
189+
`psf__requests-3362`), taking `--provider` and `--model` on the CLI, and
190+
writes `preds.jsonl` under `evals/public/results/`. Official Docker
191+
resolved/not-resolved grading stays optional/manual.
192+
- **Capability eval: `complex-stock-gate`.** Multi-file stock-gated `POST /orders`
193+
(404/409/201 + stock decrement) on the demo-comparison fixture; sync API grader.
194+
- **Capability eval: `complex-idempotent-orders`.** Header-driven Idempotency-Key
195+
on POST /orders (201/200/409) with multi-file order store; sync API grader.
196+
- **Capability eval: `complex-bugfix`.** SWE-bench-style issue→patch→tests on the
197+
new `tests/fixtures/buggy-service` fixture (intentional post GET bug; users green).
198+
- **Capability eval: `complex-pagination`.** Query `limit`/`offset` on GET /products
199+
(demo-comparison); sync Response grader + slice semantics.
200+
- **Capability eval: `complex-rename-user`.** Cross-file rename of user `name` →
201+
`displayName` on multi-file-service; runtime + source checks.
202+
- **Fixture: `tests/fixtures/buggy-service`.** multi-file-service clone with a
203+
deliberate post-route defect for bugfix capability evals.
204+
- **Director API-contract loop (launch tuning iter1).** Implement preserves sync
205+
public surfaces; critique ranks sync→async signature drift as blocking;
206+
Skywalker puts stated signatures into success_criteria, skips explore/critique
207+
on tiny green ships, re-dispatches implement on blocking critique findings,
208+
and routes URL reads through mounted `web_fetch` (no shell thrash). complex-jwt
209+
case prompt states the sync Response contract.
210+
211+
212+
- **Closed director fleet (CL-5818 Level 6 wiring).** Sixteen director packages
213+
under `src/agent/directors/<id>/` (prompts, tool envelopes, spawn rights, nudge
214+
budgets, report contract) register in `DIRECTOR_REGISTRY`. `task(agent=…)`
215+
resolves directors without requiring plugin profiles; `task(intent=…)` maps
216+
implement/explore/plan/review→critique (`general` is refused). Default agent
217+
profiles are the closed fleet via `directorProfiles()`.
218+
- **Primary is Skywalker by name.** System role answers "Skywalker"; agent id
219+
`skywalker`. Product mutation tools are not mounted on the primary session
220+
(structural never-implement), not only prompt policy.
221+
- **Director identity at spawn.** Every package system prompt is prefixed with
222+
agent id, model role, and optional skills; profiles include `agent id:` in
223+
description so search_agents / re-spawn are unambiguous.
224+
- **modelRole drives leaf effort.** Spawn effort cascade is pin → package
225+
modelRole default (intern=low) → orchestrator/leaf → parent. Env block adds
226+
arch + runtime alongside platform/date/git.
227+
- **No general leaf at the wire.** Bare `task` (no `agent`, no `intent`) and
228+
`intent=general` fail closed; nested directors enforce `spawn.allowlist`
229+
(greybeard → intern/explore/critique).
230+
- **Director write-path locks.** Docs/design packages may write only under
231+
package `writePaths` (shakespeare: PRODUCT/ARCHITECTURE/IMPLEMENTATION;
232+
brand-reviewer: DESIGN.md; bruckheimer: PRODUCT.md + docs/*), enforced in
233+
the permission gate.
234+
- **PRODUCT / ARCHITECTURE / IMPLEMENTATION** document the closed director
235+
fleet, spawn matrix, intent map, and tool envelopes.
236+
42237
### Providers
43238

44239
- **Named API-key instances.** First-class API-key providers (OpenAI key,
@@ -59,6 +254,10 @@ mid-session switches.
59254
first-class kinds, so free-form OpenAI-compatible endpoints are reachable from
60255
the model picker without dropping into onboarding. Custom still uses the full
61256
manual form (name, base URL, key, model).
257+
- **MCP auth is `mcp !` on the prompt box.** A server waiting on authorization
258+
no longer takes a notice-row sentence (`mcp granola needs auth (/mcp)`). The
259+
top rule carries a compact `mcp !` immediately left of the model label;
260+
`/mcp` still names the servers.
62261

63262
### Docs
64263

0 commit comments

Comments
 (0)