omnilane 0.34.0 → 0.42.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +4 -4
- package/.claude-plugin/plugin.json +2 -2
- package/CHANGELOG.md +71 -1
- package/README.ja.md +63 -33
- package/README.ko.md +63 -32
- package/README.md +147 -86
- package/README.zh-CN.md +61 -30
- package/README.zh-TW.md +124 -75
- package/VERSION +1 -1
- package/config/aa-model-policy.json +3046 -0
- package/docs/aa-model-coverage-2026-09-05.json +29204 -0
- package/docs/completion-wakeup.md +126 -0
- package/docs/model-capabilities-2026-09.md +380 -0
- package/docs/native-executor.md +264 -0
- package/docs/release-notes-0.42.1.md +32 -0
- package/hooks/routing-instruction.md +101 -40
- package/package.json +8 -2
- package/plugin.json +2 -2
- package/routing.local.yaml.example +8 -3
- package/routing.yaml +16 -16
- package/scripts/completion-wakeup.py +390 -0
- package/scripts/configure.sh +4 -4
- package/scripts/dispatch.sh +323 -32
- package/scripts/doctor.sh +55 -1
- package/scripts/jobs.sh +64 -17
- package/scripts/lib/aa_policy.py +473 -0
- package/scripts/lib/aa_retry.py +77 -0
- package/scripts/lib/common.sh +106 -1
- package/scripts/lib/job-worker.sh +314 -20
- package/scripts/lib/live-protocol.sh +147 -2
- package/scripts/lib/native.py +507 -0
- package/scripts/lib/normalize-claude-stream.py +72 -0
- package/scripts/lib/prepare-agy-mode.py +374 -0
- package/scripts/release-audit.sh +103 -0
- package/scripts/runners/run-claude.sh +81 -47
- package/scripts/runners/run-codex-live.py +462 -0
- package/scripts/runners/run-codex.sh +62 -3
- package/scripts/runners/run-gemini.sh +85 -10
- package/scripts/runners/run-grok-live.py +426 -0
- package/scripts/runners/run-grok.sh +117 -6
- package/scripts/runners/run-vote.sh +6 -3
- package/skills/omnilane/SKILL.md +217 -81
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# Native executor protocol (v1)
|
|
2
|
+
|
|
3
|
+
`native` means a **caller-owned agent tool**, not a shell executable. Omnilane
|
|
4
|
+
resolves a lane, checks explicitly supplied capabilities, and emits a pending
|
|
5
|
+
handoff. The host executes the declared new/reuse strategy and ingests its actual result separately.
|
|
6
|
+
Creating a handoff is not task success. Native delegation still counts as
|
|
7
|
+
delegation when commander and worker use the same exact model.
|
|
8
|
+
|
|
9
|
+
## Selection and terminal compatibility
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
# Standalone terminal: no native capability context, legacy CLI selection.
|
|
13
|
+
omnilane route --dry-run hardest-coding "Review the change"
|
|
14
|
+
omnilane route --executor cli --dry-run hardest-coding "Review the change"
|
|
15
|
+
|
|
16
|
+
# Host-generated capability file: native when ALL requirements match.
|
|
17
|
+
omnilane route --executor auto --native-context /absolute/capability.json \
|
|
18
|
+
--workdir /absolute/repo --dry-run hardest-coding "Review the change"
|
|
19
|
+
|
|
20
|
+
# Fail closed instead of falling back. JSON on stdout; no provider is called.
|
|
21
|
+
omnilane route --executor native --native-context /absolute/capability.json \
|
|
22
|
+
--workdir /absolute/repo hardest-coding "Review the change"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Native-aware selection fixes the first configured lane candidate (or the
|
|
26
|
+
explicit `--vendor` row) **before** checking native or CLI availability.
|
|
27
|
+
`--model` and `--effort` override that row without renaming either value. No
|
|
28
|
+
model aliases/family inference or vendor substitution are performed. A native
|
|
29
|
+
rejection in `auto` may use only that same resolved target's CLI; if it is
|
|
30
|
+
missing, exit 4 rather than walk another vendor's fallback chain. Without a
|
|
31
|
+
context, `auto` and forced `cli` preserve the historical available-CLI chain.
|
|
32
|
+
`--executor cli` ignores the native context. CLI plans and metadata include
|
|
33
|
+
`executor=cli` and a reason; native plans are JSON.
|
|
34
|
+
|
|
35
|
+
`--executor native` returns exit 2 for missing/incompatible capability context.
|
|
36
|
+
Malformed contexts are errors even in `auto`, not invitations to call a CLI.
|
|
37
|
+
Native protocol support requires Python 3.9+ on the local host; the unchanged
|
|
38
|
+
terminal path does not acquire that dependency. `--list` / `--explain` retain
|
|
39
|
+
their legacy CLI-availability meaning and do not advertise native readiness.
|
|
40
|
+
|
|
41
|
+
## Capability context
|
|
42
|
+
|
|
43
|
+
The caller constructs this object from the **currently exposed tool contract**
|
|
44
|
+
and its known runtime, not credentials, installed binaries, environment sniffing,
|
|
45
|
+
or model family guesses. These example model/harness values are slots, not a
|
|
46
|
+
catalog. Paths must be existing absolute directories (canonicalized for exact
|
|
47
|
+
comparison; a parent directory does not grant child workdirs).
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"schema_version": 1,
|
|
52
|
+
"harness": "HARNESS_FROM_RUNTIME",
|
|
53
|
+
"vendor": "codex",
|
|
54
|
+
"current_model": "MODEL_FROM_RUNTIME",
|
|
55
|
+
"requirements": {
|
|
56
|
+
"tools": [],
|
|
57
|
+
"isolation": "shared-inherited",
|
|
58
|
+
"lifecycle": "single-shot"
|
|
59
|
+
},
|
|
60
|
+
"capabilities": [{
|
|
61
|
+
"model": "EXACT_SUPPORTED_MODEL",
|
|
62
|
+
"efforts": ["EXACT_SUPPORTED_EFFORT"],
|
|
63
|
+
"modes": ["advise"],
|
|
64
|
+
"workdirs": ["/absolute/repo"],
|
|
65
|
+
"tools": [],
|
|
66
|
+
"isolations": ["shared-inherited"],
|
|
67
|
+
"lifecycles": ["single-shot"]
|
|
68
|
+
}]
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Every field shown except `current_model` is required. Capability rows describe
|
|
73
|
+
joint constraints; permission from separate rows is never combined. All arrays
|
|
74
|
+
except `tools` must be nonempty. `current_model` is only needed when the routed
|
|
75
|
+
model is absent or `-`; when the route explicitly selects an exact supported
|
|
76
|
+
model, the caller may omit an unknown current model. The effort string is
|
|
77
|
+
matched exactly; an absent effort or `-` is unknown, so native rejects it until
|
|
78
|
+
the caller supplies a known explicit `--effort`. Model names are never
|
|
79
|
+
hardcoded in the engine.
|
|
80
|
+
|
|
81
|
+
Codex `collaboration.spawn_agent` exposes no sandbox, tool allowlist, or
|
|
82
|
+
workdir restriction parameter and inherits the parent's tool/filesystem access.
|
|
83
|
+
Its honest native capability uses `shared-inherited` in both the request and the
|
|
84
|
+
same matching capability row. `tools: []` means no tool restriction is
|
|
85
|
+
requested or advertised. `advise` and `work` remain task intent; the matched
|
|
86
|
+
workdir is task context, not an OS boundary. Requests for hard `read-only`,
|
|
87
|
+
`workspace-write`, or any other unsupported isolation never become shared
|
|
88
|
+
native jobs: `auto` stays on the same resolved model through CLI, while forced
|
|
89
|
+
native fails closed.
|
|
90
|
+
|
|
91
|
+
Native supports only a caller-supervised single task. `--background`, explicit
|
|
92
|
+
`--live` / `--single-shot`, `--thread`, `sysops`, explicit/environment whole-job
|
|
93
|
+
or idle watchdogs, vote/multi-round and `exec` arbitration paths stay CLI or
|
|
94
|
+
reject forced native. The handoff's `timeout` is a caller-enforced deadline,
|
|
95
|
+
not a shell watchdog. Native has no durable worker, FIFO, implicit follow-up,
|
|
96
|
+
CLI lock, scheduling, or inherited named session. Supplying a context does not
|
|
97
|
+
change `routing.yaml`, `routing.local.yaml`, or host configuration.
|
|
98
|
+
|
|
99
|
+
## Handoff, completion and cancellation
|
|
100
|
+
|
|
101
|
+
Native route stdout is one JSON object: `schema_version`, `executor`,
|
|
102
|
+
`executor_reason`, `vendor`, `model`, `effort`, `harness`, `lane`, `task`,
|
|
103
|
+
`mode`, `workdir`, `requirements`, `timeout`, `worker_contract`, `job_id`,
|
|
104
|
+
`task_id`, `agent_id`, `state`, `provider_invoked`, `job_state_created`.
|
|
105
|
+
Normal routing returns `state=pending`, equal task/job IDs and null agent ID.
|
|
106
|
+
Dry run returns `state=planned`, null IDs and creates neither job store nor job.
|
|
107
|
+
Dry run does not read task stdin. It never spawns or calls a provider.
|
|
108
|
+
|
|
109
|
+
`worker_contract` records `no_nested_dispatch`, the matched
|
|
110
|
+
`shared-inherited` isolation, that mode is task intent, and that the caller owns
|
|
111
|
+
deadline enforcement. It does not claim tool or filesystem restriction.
|
|
112
|
+
|
|
113
|
+
The host invokes its real agent tool with the resolved model and effort, then
|
|
114
|
+
passes the workdir, mode, task, and deadline as task intent rather than claimed
|
|
115
|
+
tool or filesystem enforcement. With an explicit model override, Codex must use
|
|
116
|
+
`fork_turns: "none"` (or a bounded positive history count), never
|
|
117
|
+
`fork_turns: "all"`:
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
collaboration.spawn_agent({
|
|
121
|
+
task_name: "native_shared_smoke",
|
|
122
|
+
fork_turns: "none",
|
|
123
|
+
model: handoff.model,
|
|
124
|
+
reasoning_effort: handoff.effort,
|
|
125
|
+
message: "Shared/inherited access. Do not delegate. Intended workdir: " +
|
|
126
|
+
handoff.workdir + ". Deadline: " + handoff.timeout +
|
|
127
|
+
" seconds. Task: " + handoff.task
|
|
128
|
+
})
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
The call does not establish a filesystem boundary. The parent keeps the actual
|
|
132
|
+
agent ID, waits for the real outcome, independently verifies the public result,
|
|
133
|
+
and only then writes **public, sanitized** completion input:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"schema_version": 1,
|
|
138
|
+
"job_id": "JOB_ID_FROM_HANDOFF",
|
|
139
|
+
"agent_id": "ACTUAL_AGENT_ID",
|
|
140
|
+
"runtime": {
|
|
141
|
+
"vendor": "codex",
|
|
142
|
+
"model": "ACTUAL_EXACT_MODEL",
|
|
143
|
+
"effort": "ACTUAL_EFFORT",
|
|
144
|
+
"harness": "ACTUAL_HARNESS",
|
|
145
|
+
"backend": "ACTUAL_AGENT_TOOL_BACKEND"
|
|
146
|
+
},
|
|
147
|
+
"outcome": "success",
|
|
148
|
+
"result": "Public result summary, not raw logs",
|
|
149
|
+
"evidence": ["Public command/result or artifact reference"]
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```sh
|
|
154
|
+
omnilane jobs --json status JOB_ID
|
|
155
|
+
omnilane jobs --json complete-native JOB_ID /absolute/completion.json
|
|
156
|
+
omnilane jobs --json result JOB_ID
|
|
157
|
+
omnilane jobs --json list --status pending
|
|
158
|
+
omnilane jobs --json cancel JOB_ID
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The reusable `jobs complete-native` interface checks the actual runtime's
|
|
162
|
+
vendor/model/effort/harness against the resolved request, requires agent ID,
|
|
163
|
+
backend, outcome (`success` or `failure`), result and nonempty evidence, and
|
|
164
|
+
rejects malformed/extra fields, symlinks, oversized inputs and duplicate JSON
|
|
165
|
+
keys. Missing/invalid/duplicate completions leave state unchanged. Completion
|
|
166
|
+
and cancellation share a per-job lock and an atomic state replacement.
|
|
167
|
+
|
|
168
|
+
`pending -> completed` exposes `state=done`, `native_state=completed`, exit 0
|
|
169
|
+
for success or 1 for failure. Ingestion itself returns 0 for a valid failure
|
|
170
|
+
record; `jobs result` returns the recorded exit code. `pending -> cancelled`
|
|
171
|
+
records exit 143 and permanently rejects later completion. Neither transition
|
|
172
|
+
signals a PID. If an agent was already spawned, **the caller must cancel it
|
|
173
|
+
using that agent tool separately**; cancelling the record cannot stop it.
|
|
174
|
+
|
|
175
|
+
Data lives under `$OMNILANE_HOME/jobs/ID/`: `task.txt`, `meta.json`,
|
|
176
|
+
`native.json` and `native.lock`. Creation writes all four 0600 files inside a
|
|
177
|
+
0700 hidden same-filesystem staging directory, then atomically renames it to the
|
|
178
|
+
final ID under a private publication lock. Listing only accepts final ID names,
|
|
179
|
+
so it never observes construction or an interrupted hidden stage. Normal
|
|
180
|
+
failures clean only the creator's own stage; collisions leave the existing
|
|
181
|
+
final directory untouched. The context itself and raw provider logs are not
|
|
182
|
+
stored. Completion is a
|
|
183
|
+
caller attestation, not independent backend authentication or proof that the
|
|
184
|
+
model honored the task; the parent still verifies evidence. Do not submit
|
|
185
|
+
tokens, cookies, credential/session/cache values or raw logs in any public field.
|
|
186
|
+
|
|
187
|
+
Only `list`, `status`, `result`, `cancel`, `complete-native` integrate native
|
|
188
|
+
jobs. Native `send`, `watch`, `close`, `wait`, `retry`, `tail`, and `rm` reject;
|
|
189
|
+
inspect status while the host owns execution. Native records do not have CLI
|
|
190
|
+
exit markers and are not included in completed-CLI stats/recommend/prune.
|
|
191
|
+
Do not use CLI-only UI/audit/goal-loop summaries as native acceptance evidence.
|
|
192
|
+
|
|
193
|
+
## Explicit existing-agent reuse(明示重用)
|
|
194
|
+
|
|
195
|
+
協定版本:2026-09-07。
|
|
196
|
+
Default `agent_strategy` is `new`; exhausted creation capacity never silently becomes reuse.
|
|
197
|
+
Explicit `reuse` keeps the existing context and uses caller-owned `collaboration.followup_task`,
|
|
198
|
+
not `collaboration.spawn_agent`. This remains one supervised task, not an automatic loop.
|
|
199
|
+
|
|
200
|
+
Reuse extends the v1 capability object (values must be caller-observed, not inferred):
|
|
201
|
+
|
|
202
|
+
```json
|
|
203
|
+
{
|
|
204
|
+
"schema_version": 1,
|
|
205
|
+
"harness": "codex",
|
|
206
|
+
"vendor": "codex",
|
|
207
|
+
"current_model": "gpt-6-astra",
|
|
208
|
+
"current_effort": "medium",
|
|
209
|
+
"agent_strategy": "reuse",
|
|
210
|
+
"preserve_existing_context": true,
|
|
211
|
+
"new_agent_capacity": "exhausted",
|
|
212
|
+
"existing_agent": {
|
|
213
|
+
"agent_id": "/root/EXISTING_AGENT",
|
|
214
|
+
"vendor": "codex",
|
|
215
|
+
"model": "gpt-6-astra",
|
|
216
|
+
"effort": "medium",
|
|
217
|
+
"harness": "codex",
|
|
218
|
+
"state": "idle",
|
|
219
|
+
"observed_by": "caller",
|
|
220
|
+
"evidence": ["Caller-observed creation configuration and current idle state"]
|
|
221
|
+
},
|
|
222
|
+
"requirements": {"tools": [], "isolation": "shared-inherited", "lifecycle": "single-shot"},
|
|
223
|
+
"capabilities": [{
|
|
224
|
+
"model": "gpt-6-astra", "efforts": ["medium"], "modes": ["advise"],
|
|
225
|
+
"workdirs": ["/absolute/repo"], "tools": [],
|
|
226
|
+
"isolations": ["shared-inherited"], "lifecycles": ["single-shot"],
|
|
227
|
+
"agent_strategy": "reuse", "existing_agent_id": "/root/EXISTING_AGENT"
|
|
228
|
+
}]
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Reuse requires routed vendor/model/effort/harness and existing runtime to match exactly.
|
|
233
|
+
`current_model` and `current_effort` must match too; capability rows/agent IDs are never combined.
|
|
234
|
+
The idle declaration is caller evidence, not provider authentication or a reservation. Recheck idle
|
|
235
|
+
immediately before followup; the tool may still fail. Model self-description is not creation evidence.
|
|
236
|
+
Retained context may contain old instructions, so supply the new task boundary and existing AA child contract.
|
|
237
|
+
|
|
238
|
+
Missing evidence is malformed context. Busy/unknown state, missing preservation, identity/strategy mismatch,
|
|
239
|
+
hard isolation or unsupported lifecycle yield no reuse handoff. Forced native rejects; auto may choose
|
|
240
|
+
only the original exact target's CLI for a well-formed but incompatible context.
|
|
241
|
+
`new_agent_capacity` accepts available/exhausted/unknown; exhausted rejects new native selection.
|
|
242
|
+
Unknown retains the old pending-handoff behavior, never asserts that an agent successfully started.
|
|
243
|
+
|
|
244
|
+
Plans/status/results preserve `agent_strategy`, `existing_agent_id`, `preserve_existing_context`.
|
|
245
|
+
Pending reuse `agent_id` identifies the existing target, not proof followup ran.
|
|
246
|
+
`worker_contract.backend` is `collaboration.followup_task`; `reuse_observation` records the caller's evidence.
|
|
247
|
+
|
|
248
|
+
```javascript
|
|
249
|
+
collaboration.followup_task({
|
|
250
|
+
target: handoff.existing_agent_id,
|
|
251
|
+
message: "Keep existing context. Shared/inherited access; do not delegate. " +
|
|
252
|
+
"Apply the handoff's AA child context and task boundary. " + handoff.task
|
|
253
|
+
})
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
After real response and independent verification, ingest the normal completion object with
|
|
257
|
+
`agent_strategy: "reuse"`, exact existing `agent_id`, and runtime backend `collaboration.followup_task`.
|
|
258
|
+
Different strategy/ID/backend is rejected without completing the job; duplicate completion is rejected.
|
|
259
|
+
New completions may omit strategy or supply `new`, but must not claim the followup backend.
|
|
260
|
+
Both strategies retain AA preflight, approved original registry bytes, child context, atomic publication,
|
|
261
|
+
and per-job completion/cancellation locking. Reuse adds no automatic creation, permission upgrade or service.
|
|
262
|
+
|
|
263
|
+
Offline coverage: `TMPDIR="$PWD/.native-test-artifacts/tmp" python3
|
|
264
|
+
tests/test_native_executor.py`. Those fixtures are not a live native smoke.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Omnilane 0.42.1
|
|
2
|
+
|
|
3
|
+
Omnilane 0.42.1 is a test-fixture and packaging patch for the already-published 0.42.0 exact-AA release. It does not rewrite the `v0.42.0` tag or weaken production routing policy.
|
|
4
|
+
|
|
5
|
+
## Fixes
|
|
6
|
+
|
|
7
|
+
- Legacy routing and Grok-readiness tests now explicitly declare a synthetic-human caller. The fixtures no longer depend on ambient caller metadata, while real model calls without exact identity continue to fail closed.
|
|
8
|
+
- The cross-vendor encoded-effort lineage spy uses portable `#!/usr/bin/env python3` and explicit `--background --single-shot` followed by bounded job completion waiting. This isolates the one-shot provider fixture from Gemini's default live/FIFO lifecycle while retaining the exact `--model gemini-3.8-flash-high` selector, model caller/child ceiling, and no-human-exemption assertions.
|
|
9
|
+
- The npm package points at these 0.42.1 notes and retains all five README translations, the AA policy, and the native/completion-wakeup protocol documents.
|
|
10
|
+
|
|
11
|
+
## Policy boundary
|
|
12
|
+
|
|
13
|
+
The approved exact-AA registry SHA pin, missing-identity denial, downward score ceiling, child caller context, retry-lineage intersection, and model-retry human-exemption rules are unchanged. Registry accounting remains:
|
|
14
|
+
|
|
15
|
+
- 78 scored eligible configurations;
|
|
16
|
+
- 1 scored reference-only comparison entry;
|
|
17
|
+
- 10 unknown configurations.
|
|
18
|
+
|
|
19
|
+
## Upgrade
|
|
20
|
+
|
|
21
|
+
After npm publication:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
npm i -g omnilane@0.42.1
|
|
25
|
+
omnilane --version
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
For an existing repo-symlink installation, update the checkout and run `omnilane --version`. Do not rerun `./install.sh` unless intentionally reviewing and changing integration wiring. A GitHub release does not by itself prove npm publication.
|
|
29
|
+
|
|
30
|
+
## Verification target
|
|
31
|
+
|
|
32
|
+
The patch release gate is the complete CI Python discovery command, the full shell suite, package/release policy checks, and a smoke test of the CLI extracted from the built npm tarball. Local preparation records are not packaged release evidence. Published-platform verification must come from the release's GitHub Actions run; local checks alone do not establish a Linux CI pass.
|
|
@@ -1,42 +1,103 @@
|
|
|
1
1
|
<!-- omnilane-routing:start -->
|
|
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
|
-
|
|
2
|
+
<!-- source: codex-s / MacStudio; repo omnilane; approved AA v4.2 snapshot 2026-09-07 -->
|
|
3
|
+
## omnilane — model routing and executor selection
|
|
4
|
+
|
|
5
|
+
Delegate tasks by default, including when the resolved model is the commander's
|
|
6
|
+
exact model. Native agents count as delegation; a model match is not permission
|
|
7
|
+
to self-execute. Consult `omnilane list` and classify the lane, then resolve
|
|
8
|
+
vendor/model/effort separately from executor choice:
|
|
9
|
+
|
|
10
|
+
omnilane route [--executor auto|native|cli] [--native-context FILE] [--vendor V] [--mode work] [--workdir DIR] <lane> "<task>"
|
|
11
|
+
|
|
12
|
+
Terminal `auto` without capability context preserves legacy CLI. Build native
|
|
13
|
+
capabilities only from the active agent-tool contract. Codex
|
|
14
|
+
`collaboration.spawn_agent` has no sandbox/tool/workdir restriction parameters
|
|
15
|
+
and inherits the parent's tools/filesystem. Its request and matching capability
|
|
16
|
+
row must explicitly use `shared-inherited` with empty tool arrays;
|
|
17
|
+
`advise`/`work` and workdir remain task intent, not OS isolation. Hard isolation
|
|
18
|
+
stays same-model CLI in auto and rejects forced native. Supply the active
|
|
19
|
+
harness/vendor, exact supported model/effort, optional known current model,
|
|
20
|
+
mode/workdir, isolation, and lifecycle. Same vendor is not the same model.
|
|
21
|
+
Unknown capabilities do not match. Do not infer capability from credentials,
|
|
22
|
+
installed binaries, or model families. Explicit vendor/model/effort must survive
|
|
23
|
+
fallback unchanged.
|
|
24
|
+
|
|
25
|
+
Native is a host-callable tool, not a shell executable. A native route emits a
|
|
26
|
+
machine-readable PENDING handoff JSON with task/job ID and resolved requirements.
|
|
27
|
+
The caller executes the declared native strategy, passes intent plus a
|
|
28
|
+
no-nested-delegation instruction, waits for the actual result, and records it with:
|
|
29
|
+
|
|
30
|
+
omnilane jobs --json complete-native JOB_ID /absolute/completion.json
|
|
31
|
+
omnilane jobs --json status JOB_ID
|
|
32
|
+
omnilane jobs --json result JOB_ID
|
|
33
|
+
|
|
34
|
+
Completion includes actual agent ID, runtime vendor/model/effort/harness/backend,
|
|
35
|
+
outcome, public result and evidence. A handoff alone is not success. Duplicate or
|
|
36
|
+
invalid completion is rejected. Native cancellation records cancellation without
|
|
37
|
+
signaling PIDs; the caller must separately stop an already-spawned agent.
|
|
38
|
+
|
|
39
|
+
When the caller supplies an explicit model override, use `fork_turns: "none"` or
|
|
40
|
+
a bounded positive history count; never combine it with `fork_turns: "all"`.
|
|
41
|
+
Unknown caller current model may be omitted only when an exact requested model is
|
|
42
|
+
explicitly selected and declared in the matching capability row.
|
|
43
|
+
|
|
44
|
+
Forced CLI preserves external execution; forced native rejects missing or
|
|
45
|
+
incompatible capability. Auto emits an explicit CLI reason, never a different
|
|
46
|
+
vendor/model on native fallback. Background/durable/live/named CLI sessions,
|
|
47
|
+
sysops, unsupported isolation and vote/arbitration/multi-round paths remain CLI.
|
|
48
|
+
|
|
49
|
+
The commander owns planning, decomposition, task briefs, routing/handoff/result
|
|
50
|
+
orchestration, acceptance, operator replies, git commit/push and governance edits.
|
|
51
|
+
Workers execute assigned tasks and never delegate again (shell depth guard:
|
|
52
|
+
exit 86; native callers must enforce the same rule). Read-only work defaults to
|
|
53
|
+
advise. Implementation uses explicit `--mode work --workdir DIR --timeout 3600`
|
|
54
|
+
or longer; native timeouts are caller-enforced. External long jobs can use
|
|
55
|
+
`--background`, CLI `jobs wait`, live send/close and CLI goal-loop as before.
|
|
56
|
+
|
|
57
|
+
If a vendor/model is explicitly named, retain `--vendor` and apply the
|
|
58
|
+
omnilane skill's consultation rules. The repository skill and
|
|
59
|
+
`docs/native-executor.md` define schemas, examples and limits. Only the parent
|
|
60
|
+
backs up and syncs the host's managed AGENTS block after review.
|
|
61
|
+
Exact-AA downward policy applies before every native/CLI candidate, fallback, retry,
|
|
62
|
+
and vote constituent. Supply an exact model `--caller-context FILE`; unknown identity
|
|
63
|
+
fails closed, and target score must be <= min(caller score, inherited ceiling).
|
|
64
|
+
Explicit targets do not override the gate. Use `--transport-overlay FILE` only for
|
|
65
|
+
host-local hashed request-selector evidence, never as a score or identity upgrade.
|
|
66
|
+
Pass the job-owned child caller context to native workers; CLI propagates it itself.
|
|
67
|
+
Retries intersect the current caller with the original authorizer ceiling, retain
|
|
68
|
+
the target config, and revalidate integrity. Missing current caller fails closed;
|
|
69
|
+
a model retry does not inherit a previous human exemption.
|
|
70
|
+
Human exemption is an explicit cooperative operator assertion, never inferred for a
|
|
71
|
+
model. Preserve OMNILANE_DEPTH. Failed work returns to the operator rather than an
|
|
72
|
+
unapproved upward route. Observe terminal result and acceptance before ending a
|
|
73
|
+
controller task; a background job/PENDING handoff is not success, and wakeup delivery
|
|
74
|
+
requires its own evidence.
|
|
75
|
+
|
|
76
|
+
For Codex background CLI jobs, actively bind completion to this controller before
|
|
77
|
+
ending the turn: use the repository's `scripts/completion-wakeup.py prepare` with
|
|
78
|
+
the actual app thread ID, local host ID, a unique run ID and exact job allowlist.
|
|
79
|
+
Use its handoff with the app `automation_update` heartbeat tool; update an existing
|
|
80
|
+
controller monitor instead of duplicating it. Record the successful tool receipt
|
|
81
|
+
with `record-registration`. Never write scheduler files directly or label an
|
|
82
|
+
unregistered handoff as active. Current caller metadata must come from this
|
|
83
|
+
controller's verified runtime, not another task's context or a default model.
|
|
84
|
+
|
|
85
|
+
On the scheduled callback, `poll`; stay quiet when nothing changed. For a terminal
|
|
86
|
+
event, record `ack-delivered`, inspect the public result and required verification,
|
|
87
|
+
then `ack-accepted` with PASS/FAIL/PARTIAL evidence. Exit zero is not acceptance.
|
|
88
|
+
After all tracked events are handled, pause the actual automation with the app
|
|
89
|
+
tool and record `closed` using its receipt. New runs get fresh, never-reused IDs.
|
|
90
|
+
See `docs/completion-wakeup.md` for binding, leases, replay and expiry rules.
|
|
91
|
+
Heartbeat is scheduled polling, not instant push. A next-prompt inbox is not wakeup.
|
|
92
|
+
Without a supported callback tool, keep the controller active using `jobs wait`
|
|
93
|
+
and continue acceptance on return; do not end with an unobserved background job.
|
|
94
|
+
Native completion uses the host's agent callback and the same actual-result gate.
|
|
95
|
+
|
|
96
|
+
Native reuse is explicit, never a silent substitute for new-agent creation. It
|
|
97
|
+
requires a proven exact existing agent, caller-observed idle state and preserved
|
|
98
|
+
context consent in the capability. Recheck idle before `collaboration.followup_task`;
|
|
99
|
+
the completion must match strategy, agent and backend. Unknown identity or busy
|
|
100
|
+
agents do not qualify. See `docs/native-executor.md`; a thread quota failure is
|
|
101
|
+
not a successful run, and a cancelled pending job stays cancelled.
|
|
102
|
+
|
|
42
103
|
<!-- omnilane-routing:end -->
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omnilane",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "One routing table, every harness — classify subtasks into lanes and
|
|
3
|
+
"version": "0.42.1",
|
|
4
|
+
"description": "One routing table, every harness — classify subtasks into lanes and delegate each lane through a compatible caller-owned native agent or vendor CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"omnilane": "bin/omnilane"
|
|
7
7
|
},
|
|
@@ -24,6 +24,12 @@
|
|
|
24
24
|
"README.ja.md",
|
|
25
25
|
"README.ko.md",
|
|
26
26
|
"SECURITY.md",
|
|
27
|
+
"config/aa-model-policy.json",
|
|
28
|
+
"docs/aa-model-coverage-2026-09-05.json",
|
|
29
|
+
"docs/model-capabilities-2026-09.md",
|
|
30
|
+
"docs/native-executor.md",
|
|
31
|
+
"docs/completion-wakeup.md",
|
|
32
|
+
"docs/release-notes-0.42.1.md",
|
|
27
33
|
"hooks/",
|
|
28
34
|
"skills/",
|
|
29
35
|
".claude-plugin/",
|
package/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://antigravity.google/schemas/v1/plugin.json",
|
|
3
3
|
"name": "omnilane",
|
|
4
|
-
"version": "0.
|
|
5
|
-
"description": "One routing table, every harness: classify subtasks into lanes and
|
|
4
|
+
"version": "0.42.1",
|
|
5
|
+
"description": "One routing table, every harness: classify subtasks into lanes and delegate through compatible caller-owned native agents or vendor CLIs with exact-AA downward policy and supervised jobs."
|
|
6
6
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# consult is a multi-vendor direct-target chain. configure.sh intentionally
|
|
9
9
|
# skips it because that menu writes one candidate per lane. If overriding it,
|
|
10
10
|
# retain every vendor you want to address by name:
|
|
11
|
-
# consult: codex gpt-
|
|
11
|
+
# consult: codex gpt-6-astra xhigh | claude claude-fable-5-1 xhigh | grok grok-4.6 - | gemini gemini-3.8-flash-medium -
|
|
12
12
|
|
|
13
13
|
# ── Starter profiles ─────────────────────────────────────────────
|
|
14
14
|
# Uncomment ONE block that matches what you actually subscribe to.
|
|
@@ -28,8 +28,13 @@
|
|
|
28
28
|
|
|
29
29
|
# Profile: Claude Code (Fable 5.1) as the main loop — let Fable keep judgment/taste,
|
|
30
30
|
# push only coding volume out to Codex.
|
|
31
|
-
# hard-judgment:
|
|
32
|
-
# taste-final:
|
|
31
|
+
# hard-judgment: claude claude-fable-5-1 xhigh
|
|
32
|
+
# taste-final: claude claude-fable-5-1 xhigh
|
|
33
|
+
|
|
34
|
+
# Profile: Opus 5 balanced controller / independent review (opt-in).
|
|
35
|
+
# Keep cross-vendor fallbacks explicit; this does not create a controller lane.
|
|
36
|
+
# hard-judgment: claude claude-opus-5 xhigh | codex gpt-6-astra max | grok grok-4.6 -
|
|
37
|
+
# taste-final: claude claude-opus-5 high | codex gpt-6-astra xhigh | grok grok-4.6 - | gemini gemini-3.8-flash-high -
|
|
33
38
|
|
|
34
39
|
# Profile: Codex-heavy (Sol main) — keep the hard lanes on Codex, Claude for taste.
|
|
35
40
|
# taste-final: claude claude-opus-5 high
|
package/routing.yaml
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# deliberately carry no numbers: they state WHY a lane is ordered the way it is, which
|
|
13
13
|
# stays true for months, while the numbers move every few weeks. Change an ordering and
|
|
14
14
|
# you update the doc; a figure going stale should never need a routing-table edit.
|
|
15
|
-
# (Audited 2026-07-12; re-audited 2026-07-25, 2026-08-02, 2026-08-03, and 2026-09-
|
|
15
|
+
# (Audited 2026-07-12; re-audited 2026-07-25, 2026-08-02, 2026-08-03, 2026-09-02, and 2026-09-05.)
|
|
16
16
|
# defaults follow Artificial Analysis data, 2026-09
|
|
17
17
|
# snapshot. Verified against AA site records + vendor pricing pages: Intelligence &
|
|
18
18
|
# Coding indexes and 7:2:1 blended prices all match (AA field price1mBlended7To2To1);
|
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
# standard short-context API tier — on subscription CLIs treat $ as relative ranking.
|
|
21
21
|
# Your own job outcomes (~/.omnilane/jobs/) outrank these priors; edit lanes to match.
|
|
22
22
|
|
|
23
|
-
hardest-coding: claude claude-fable-5-1
|
|
24
|
-
bulk-mechanical: codex gpt-5.6-sol high | gemini
|
|
25
|
-
triage: codex gpt-5.6-luna high | gemini
|
|
26
|
-
hard-judgment: claude claude-
|
|
27
|
-
taste-final: claude claude-fable-5-1
|
|
28
|
-
consult: codex gpt-
|
|
29
|
-
ui-draft: codex gpt-5.6-sol
|
|
30
|
-
long-context: gemini
|
|
31
|
-
fast-agentic: gemini
|
|
32
|
-
live-search: grok grok-4.6 - | gemini
|
|
33
|
-
coding-overflow: grok grok-4.6 - | gemini
|
|
23
|
+
hardest-coding: claude claude-fable-5-1 max | codex gpt-6-astra xhigh | grok grok-4.6 - | gemini gemini-3.8-flash-high - # correctness-first coding: Fable max leads the same-condition comparison; Astra xhigh is the default Codex quality/cost tradeoff; explicit --effort max remains available; Grok and Flash keep cross-vendor depth
|
|
24
|
+
bulk-mechanical: codex gpt-5.6-sol high | gemini gemini-3.8-flash-high - | claude claude-sonnet-5 high # endurance and migration work stays on proven Sol high; Flash 3.8 refreshes the fast middle fallback; Sonnet preserves cross-vendor depth
|
|
25
|
+
triage: codex gpt-5.6-luna high | gemini gemini-3.8-flash-low - | claude claude-haiku-4-5 - # first-pass filtering favors the low-cost Luna row; Flash low and Haiku remain cheap cross-vendor fallbacks
|
|
26
|
+
hard-judgment: claude claude-fable-5-1 xhigh | codex gpt-6-astra xhigh | grok grok-4.6 - # strongest same-condition judgment row first, then an independently verified Codex family and Grok; this lane is not a controller selector
|
|
27
|
+
taste-final: claude claude-fable-5-1 xhigh | codex gpt-6-astra xhigh | grok grok-4.6 - | gemini gemini-3.8-flash-high - # final prose and style still require human taste review; general quality evidence orders the candidates without claiming an aesthetic benchmark
|
|
28
|
+
consult: codex gpt-6-astra xhigh | claude claude-fable-5-1 xhigh | grok grok-4.6 - | gemini gemini-3.8-flash-medium - # direct named-model consultation chain; keep --vendor to pin the requested family and prevent fallback
|
|
29
|
+
ui-draft: codex gpt-5.6-sol high | claude claude-fable-5-1 xhigh | gemini gemini-3.8-flash-high - # UI drafts require a design system or references; measured coding/agent evidence supports the order but does not prove visual taste
|
|
30
|
+
long-context: gemini gemini-3.8-flash-medium - | codex gpt-5.6-terra max | claude claude-opus-5 medium # Flash medium leads long-document synthesis; Terra and Opus stay because context capacity alone does not prove task quality
|
|
31
|
+
fast-agentic: gemini gemini-3.8-flash-low - | codex gpt-5.6-luna high | claude claude-haiku-4-5 - # low-latency tool loops favor Flash low; Luna and Haiku retain cross-vendor fallback depth
|
|
32
|
+
live-search: grok grok-4.6 - | gemini gemini-3.8-flash-high - | claude claude-sonnet-5 high | off # Grok remains the native X/web choice; Flash and Sonnet provide generic web-search fallback, not equivalent social context
|
|
33
|
+
coding-overflow: grok grok-4.6 - | gemini gemini-3.8-flash-high - | kimi kimi-k3 - | qwen qwen3-coder-plus - | opencode - - | off # explicit quota-relief lane; keep all existing non-Codex fallbacks and do not infer unverified Qwen aliases from another harness
|
|
34
34
|
arbitrate: off - - # opinion panel remains opt-in because each voter and round consumes quota
|
|
35
35
|
# Enable: `arbitrate: vote codex,claude,grok -` (any 1-4 of codex/claude/grok/gemini)
|
|
36
36
|
# Debate round (each voter rebuts the others): set the effort field to 2.
|
|
@@ -38,7 +38,7 @@ arbitrate: off - - # opinion panel remains opt-in because each voter and round c
|
|
|
38
38
|
# Claude Fable 5.1 is in the taste and hardest-coding defaults because it leads
|
|
39
39
|
# Opus 5 on every Artificial Analysis axis at the same effort. It is not in
|
|
40
40
|
# bulk or triage: it prices at twice Opus 5 per token and consumes the most
|
|
41
|
-
# subscription quota per turn.
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
41
|
+
# subscription quota per turn. Fable leads hard-judgment; Opus remains
|
|
42
|
+
# explicitly selectable via --vendor claude --model claude-opus-5.
|
|
43
|
+
# Astra defaults to xhigh; use --vendor codex --effort max when explicitly needed.
|
|
44
|
+
# No automatic risk escalation or failure-triggered effort upgrade is added.
|