Skip to content

Commit 362b897

Browse files
author
pavelhov
authored
Merge pull request #43 from pavelhov/development
Promote adaptive delegation guidance and 0.1.7 to main
2 parents c36d2a4 + 891f6e3 commit 362b897

10 files changed

Lines changed: 78 additions & 36 deletions

File tree

‎docs-site/src/content/docs/getting-started/installation.md‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ app can start. A user-managed external Codex provider is also preserved. For rel
6161
use the universal Intel + Apple silicon archive from [GitHub Releases](https://github.com/pavelhov/CodexCommander/releases),
6262
not a thin development `.app` from a source checkout.
6363

64-
v0.1.6 predates in-app updates. When the first updater-enabled release is published, existing users
65-
will need to install it manually once. Its archive name will include both version and build:
66-
`CodexCommander-<version>-<build>-macos-universal.zip`, with a matching `.zip.sha256` file. The existing
67-
v0.1.6 archive remains `CodexCommander-0.1.6-macos-universal.zip`.
64+
The original v0.1.6 archive, `CodexCommander-0.1.6-macos-universal.zip`, has no in-app
65+
updater. Install the newer numbered v0.1.6 build or a later release manually once to enable updates.
66+
Updater-enabled archives include both version and build:
67+
`CodexCommander-<version>-<build>-macos-universal.zip`, with a matching `.zip.sha256` file.
6868

6969
After that bootstrap, the app checks quietly in the background and shows **Update Available…**
7070
when a compatible stable release is found. **Check for Updates…** remains available for manual checks.
7171
Choosing to install displays the pause/interruption warning with **Update Anyway** or **Later**;
72-
installation pauses the proxy before downloading through installation. See [App updates](/guides/macos-menu-bar/#app-updates-upcoming) for active-request
72+
installation pauses the proxy before downloading through installation. See [App updates](/guides/macos-menu-bar/#app-updates) for active-request
7373
choices and recovery. These previews are unnotarized; follow the
7474
[manual installation steps](/guides/macos-menu-bar/#install) for macOS first-launch prompts.
7575

‎docs-site/src/content/docs/guides/macos-menu-bar.md‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ the CodexCommander instance running on the same Mac.
1010
## Install
1111

1212
Open [GitHub Releases](https://github.com/pavelhov/CodexCommander/releases) and download the current
13-
universal macOS preview for Intel and Apple silicon. Choose the
14-
`CodexCommander-0.1.6-macos-universal.zip` file and its matching `.sha256` checksum file
15-
for v0.1.6. Updater-enabled releases will use
16-
`CodexCommander-<version>-<build>-macos-universal.zip` and the matching `.zip.sha256` file.
13+
universal macOS preview for Intel and Apple silicon. Choose
14+
`CodexCommander-<version>-<build>-macos-universal.zip` and its matching `.zip.sha256` file.
15+
The original `CodexCommander-0.1.6-macos-universal.zip` archive predates the updater; use the
16+
newer numbered build instead.
1717

1818
This preview is ad-hoc signed and not notarized. Unzip it, move `CodexCommander.app` to Applications,
1919
then follow macOS's first-launch prompts. Depending on your macOS version, you may need
@@ -23,13 +23,13 @@ Do not disable Gatekeeper.
2323

2424
To build from source instead, follow [Build from source](#build-from-source) below.
2525

26-
## App updates (upcoming)
26+
## App updates
2727

28-
v0.1.6 shipped before the in-app updater. Once the first updater-enabled release is published,
29-
install that release manually once using the steps above. The behavior below describes that upcoming
30-
release; it is not available in v0.1.6.
28+
In-app updates are available starting with the numbered v0.1.6 build. If you installed the original
29+
v0.1.6 archive without a build number in its name, install the newer build or a later release manually
30+
once using the steps above.
3131

32-
![Upcoming macOS menu with an update action](/macos-updates.png)
32+
![macOS menu with an update action](/macos-updates.png)
3333

3434
The app checks for compatible stable releases quietly in the background. When it finds one,
3535
the menu shows **Update Available…**. Select it to review the version and release notes.

‎docs-site/src/content/docs/guides/sub-agent-surface.md‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,14 @@ $CODEX_HOME/AGENTS.md
7272

7373
The skill is advisory and deliberately contains no roster or model ids. Before a spawn it reads the
7474
current collaboration tool contract and live injected guidance. Featured models are suggestions, not
75-
an exhaustive allowlist; a known exact compatible catalog ID may be passed to native `spawn_agent`.
75+
an exhaustive allowlist; a known exact compatible catalog ID may be passed to native `spawn_agent` as
76+
`model` when the live contract permits. Omitting `model` inherits the configured default or parent
77+
choice. Add `reasoning_effort` only when the target advertises supported values and the brief
78+
benefits from it. Match each spawn to task complexity, uncertainty, risk, and how tightly you can
79+
check the result. Prefer the configured preferred worker when it fits; escalate capability only when
80+
the brief needs it. Do not default to the cheapest model or spawn solely to delegate. Reassess model
81+
choice on failed evidence, scope expansion, uncertainty, or capability mismatch—not on `wait_agent`
82+
timeout alone.
7683
A roster can change independently without making the installed skill stale.
7784

7885
For V2 coordination, a `wait_agent` timeout means only that no qualifying mailbox or final event

‎docs-site/src/content/docs/reference/configuration/agents.md‎

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,16 @@ this setup.
9292

9393
The skill and global block are advisory and contain no roster or model ids. They consult the current
9494
collaboration tool contract and live CodexCommander guidance. Featured models are suggestions, not an
95-
exhaustive allowlist; a known exact compatible catalog ID may be passed to native `spawn_agent`.
96-
The global block records the
97-
selected `balanced` or `orchestrator` mode and is loaded once per Codex run. Start a new task after
98-
install, update, mode change, repair, or removal; current tasks are not reloaded. User and repository
99-
instructions can prohibit delegation. A nonempty `$CODEX_HOME/AGENTS.override.md` shadows the managed
100-
global block, while an empty override does not.
95+
exhaustive allowlist; a known exact compatible catalog ID may be passed to native `spawn_agent` as
96+
`model` when the live contract permits. Omitting `model` inherits the configured default or parent
97+
choice. Add `reasoning_effort` only when the target advertises supported values and the brief
98+
benefits from it. Match each spawn to task complexity, uncertainty, risk, and how tightly you can
99+
check the result. Prefer the configured preferred worker when it fits; escalate capability only when
100+
the brief needs it. Do not default to the cheapest model or spawn solely to delegate.
101+
The global block records the selected `balanced` or `orchestrator` mode and is loaded once per Codex
102+
run. Start a new task after install, update, mode change, repair, or removal; current tasks are not
103+
reloaded. User and repository instructions can prohibit delegation. A nonempty
104+
`$CODEX_HOME/AGENTS.override.md` shadows the managed global block, while an empty override does not.
101105

102106
The managed wait lifecycle treats `wait_agent` timeout as a neutral subscription result, not child
103107
failure evidence. After one `list_agents` reconciliation, a coordinator should do useful local work or
@@ -106,7 +110,9 @@ checkpoint or conclude request—never authorizes `interrupt_agent`. Interruptio
106110
user cancellation, a confirmed error or blocked state, a hard deadline communicated to the child in
107111
advance, or deliberate replacement after available work is preserved. A bounded high-stakes gate can
108112
prospectively request one checkpoint or durable partial artifact; conclude delivery remains advisory
109-
and occurs at a model or tool boundary.
113+
and occurs at a model or tool boundary. The root reassesses model choice, scope, and delegation on
114+
failed evidence, scope expansion, uncertainty, or capability mismatch—not on `wait_agent` timeout
115+
alone.
110116

111117
Uninstall removes only the owned `SKILL.md`, removes its directory only when empty, and removes only
112118
the bounded global block while preserving every other `AGENTS.md` byte. This setup never mutates

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "codexcommander",
3-
"version": "0.1.6",
3+
"version": "0.1.7",
44
"private": true,
55
"description": "CodexCommander — universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code",
66
"type": "module",

‎src/codex/delegation-templates.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ function agentsBlock(mode: CodexDelegationMode): string {
4040
"## CodexCommander delegation",
4141
`Mode: ${mode}`,
4242
"Before spawning subagents, use $codexcommander-delegation and reread its SKILL.md if its details were compacted.",
43-
"Consult the active collaboration roster and spawn-tool contract. Never hardcode model IDs. Give workers self-contained tasks.",
43+
"Consult the active collaboration roster and spawn-tool contract. Never hardcode model IDs. Match each spawn to task complexity, uncertainty, risk, and how tightly you can check the result; reassess on failed evidence, scope expansion, uncertainty, or capability mismatch—not on timeout alone. Give workers self-contained tasks.",
4444
"A wait_agent timeout is neutral; never interrupt solely because one or more waits timed out. Use the managed skill for reconciliation and interruption gates.",
4545
delegationSentence,
4646
"This guidance is advisory and does not create collaboration tools. User and repository instructions outrank it for whether to spawn.",

‎src/skills/codexcommander-delegation/SKILL.md‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@ Give every child a self-contained brief with its goal, paths or inputs, owned fi
2626

2727
## Model and effort
2828

29-
Live featured models are featured suggestions, not an exhaustive allowlist. Prefer the current preferred worker when it fits. If you already know an exact compatible catalog ID, pass that known exact ID to native spawn_agent with a supported effort and, on V2, fork_turns "none" or a positive partial count. Omit overrides when the catalog is stale, unknown, or uncertain. Native validation remains authoritative. Do not invent IDs, substitute another family, or remember IDs.
29+
Match each spawn to task fit: complexity, uncertainty, risk, and how tightly you can check the result. Live featured models are suggestions, not an exhaustive allowlist. Prefer the configured preferred worker when it fits. Escalate capability only when the brief needs it; do not default to the cheapest or smallest model, and do not spawn solely to delegate.
30+
31+
Omitting `model` inherits the configured default or parent choice. When the live contract permits a deliberate override and you know an exact compatible catalog ID that is fresh, routable, and compatible with this surface and task delivery, pass that known exact ID as `model`. Add `reasoning_effort` only when the target advertises supported values and the brief benefits from it. On V2, set `fork_turns` to `"none"` or a positive partial count when passing `model` or `reasoning_effort`; full-history forks reject overrides. Omit overrides when the catalog is stale, unknown, or uncertain. Native validation remains authoritative. Do not invent IDs, substitute another family, or remember IDs.
32+
33+
## Root review and reassessment
34+
35+
The root owns integration: verify concrete diffs, tests, and other task-relevant evidence before closing. Reassess model choice, scope, and delegation on failed evidence, scope expansion, uncertainty, or capability mismatch—not on `wait_agent` timeout alone.
3036

3137
## Coordination
3238

‎structure/02_config-and-codex-home.md‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ updating, changing mode, or removing the setup does not reload a current task, s
7474
start a new Codex task to consume the new policy.
7575

7676
This setup is advisory only. The skill tells Codex to inspect the live collaboration roster and tool
77-
contract and contains no roster or model ids. Live tool guidance plus user and repository
77+
contract, match each spawn to task complexity, uncertainty, risk, and how tightly the result can be
78+
checked, and contains no
79+
roster or model ids. Live tool guidance plus user and repository
7880
instructions remain authoritative, including instructions that prohibit delegation. The setup does
7981
not mutate `config.toml`, `subagentDeveloperInstructions`, native `[agents]` defaults, roster
8082
injection, or catalog state, and it does not restart a worker or replace the proxy. Those existing
@@ -93,7 +95,9 @@ available work is preserved. Release pressure cannot create a deadline retroacti
9395
When a bounded high-stakes gate needs evidence, the coordinator may prospectively request one
9496
explicit checkpoint or durable partial artifact with `send_message`; private child commentary does
9597
not wake the parent mailbox. A conclude message is advisory, delivered at a model or tool boundary,
96-
and is not proof that the child stopped.
98+
and is not proof that the child stopped. The root reassesses model choice, scope, and delegation only
99+
on failed evidence, scope expansion, uncertainty, or capability mismatch—not on `wait_agent` timeout
100+
alone.
97101

98102
The source of truth is `src/skills/codexcommander-delegation/SKILL.md`. The delegation renderer reads
99103
those exact bytes, adds the concise marker-owned `AGENTS.md` block, and supplies both artifacts to the

‎structure/06_docs-and-release.md‎

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,8 @@ installed-app tests and explicit distribution/key-handling security review in
202202
the PR remain release gates; local asset generation is not a claim of those
203203
qualifications.
204204

205-
The first updater-enabled release remains pending. v0.1.6 has no updater, so users
206-
must manually install that first release once; its existing download keeps the
207-
old `CodexCommander-0.1.6-macos-universal.zip` name. At release cutover, update any
208-
pinned bootstrap links to the actual published version/build, and remove the
209-
upcoming qualifier from the public app-update guide only after qualification and
210-
publication. Do not advertise the fixed feed as available before the complete
211-
first release is published.
205+
The original unnumbered v0.1.6 archive has no updater. A newer numbered v0.1.6 build
206+
provides the one-time manual bootstrap; later releases can update in app. Preserve the original
207+
`CodexCommander-0.1.6-macos-universal.zip` asset and use immutable version/build archive names for
208+
updater-enabled builds. The public app-update guide describes the numbered builds; do not publish
209+
that documentation ahead of the complete, qualified bootstrap release.

‎tests/codex-delegation-templates.test.ts‎

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,15 +186,36 @@ describe("Codex delegation templates", () => {
186186

187187
test("managed skill treats featured models as suggestions, not an exhaustive spawn allowlist", () => {
188188
const skill = renderCodexDelegationBundle("balanced").skillText;
189-
expect(skill).toContain("featured suggestions, not an exhaustive allowlist");
189+
expect(skill).toContain("suggestions, not an exhaustive allowlist");
190190
expect(skill).toContain("known exact");
191-
expect(skill).toContain("native");
191+
expect(skill).toContain("Native validation remains authoritative");
192192
expect(skill).not.toContain("Use only model IDs and effort levels advertised live");
193193
expect(skill).not.toMatch(
194194
/\b(?:gpt|claude|gemini|grok|deepseek|llama|mistral|qwen|kimi|xai|anthropic|openai)[-_/.:][a-z0-9]/i,
195195
);
196196
});
197197

198+
test("managed skill carries adaptive spawn-fit guidance without hardcoded roster ids", () => {
199+
const bundle = renderCodexDelegationBundle("balanced");
200+
const artifacts = `${bundle.skillText}\n${bundle.agentsBlockText}`;
201+
202+
expect(bundle.skillText).toContain("complexity, uncertainty, risk");
203+
expect(bundle.skillText).toContain("how tightly you can check");
204+
expect(bundle.skillText).toContain("do not default to the cheapest");
205+
expect(bundle.skillText).toContain("capability mismatch");
206+
expect(bundle.skillText).toContain("not on `wait_agent` timeout alone");
207+
expect(bundle.skillText).toContain("as `model`");
208+
expect(bundle.skillText).toContain("Omitting `model`");
209+
expect(bundle.skillText).toContain("only when the target advertises supported values");
210+
expect(bundle.skillText).toContain('fork_turns` to `"none"`');
211+
expect(bundle.agentsBlockText).toContain("how tightly you can check the result");
212+
expect(bundle.agentsBlockText).toContain("reassess on failed evidence, scope expansion, uncertainty, or capability mismatch");
213+
expect(bundle.agentsBlockText).toContain("not on timeout alone");
214+
expect(artifacts).not.toMatch(
215+
/\b(?:gpt|claude|gemini|grok|deepseek|llama|mistral|qwen|kimi|xai|anthropic|openai)[-_/.:][a-z0-9]/i,
216+
);
217+
});
218+
198219
test("managed skill ownership is carried by SKILL.md itself", () => {
199220
const skill = renderCodexDelegationBundle("balanced").skillText;
200221
expect(isCodexCommanderManagedSkill(skill)).toBe(true);

0 commit comments

Comments
 (0)