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.
Files changed (42) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/CHANGELOG.md +71 -1
  4. package/README.ja.md +63 -33
  5. package/README.ko.md +63 -32
  6. package/README.md +147 -86
  7. package/README.zh-CN.md +61 -30
  8. package/README.zh-TW.md +124 -75
  9. package/VERSION +1 -1
  10. package/config/aa-model-policy.json +3046 -0
  11. package/docs/aa-model-coverage-2026-09-05.json +29204 -0
  12. package/docs/completion-wakeup.md +126 -0
  13. package/docs/model-capabilities-2026-09.md +380 -0
  14. package/docs/native-executor.md +264 -0
  15. package/docs/release-notes-0.42.1.md +32 -0
  16. package/hooks/routing-instruction.md +101 -40
  17. package/package.json +8 -2
  18. package/plugin.json +2 -2
  19. package/routing.local.yaml.example +8 -3
  20. package/routing.yaml +16 -16
  21. package/scripts/completion-wakeup.py +390 -0
  22. package/scripts/configure.sh +4 -4
  23. package/scripts/dispatch.sh +323 -32
  24. package/scripts/doctor.sh +55 -1
  25. package/scripts/jobs.sh +64 -17
  26. package/scripts/lib/aa_policy.py +473 -0
  27. package/scripts/lib/aa_retry.py +77 -0
  28. package/scripts/lib/common.sh +106 -1
  29. package/scripts/lib/job-worker.sh +314 -20
  30. package/scripts/lib/live-protocol.sh +147 -2
  31. package/scripts/lib/native.py +507 -0
  32. package/scripts/lib/normalize-claude-stream.py +72 -0
  33. package/scripts/lib/prepare-agy-mode.py +374 -0
  34. package/scripts/release-audit.sh +103 -0
  35. package/scripts/runners/run-claude.sh +81 -47
  36. package/scripts/runners/run-codex-live.py +462 -0
  37. package/scripts/runners/run-codex.sh +62 -3
  38. package/scripts/runners/run-gemini.sh +85 -10
  39. package/scripts/runners/run-grok-live.py +426 -0
  40. package/scripts/runners/run-grok.sh +117 -6
  41. package/scripts/runners/run-vote.sh +6 -3
  42. 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
- ## omnilane — model routing (persistent reminder)
3
-
4
- Every task — not only implementation — is dispatched by default, even when
5
- the lane's first available model is the one you are running as: code edits,
6
- search, investigation, file reads, verification, tests, builds, deploys.
7
- Consult the routing table with `omnilane list` (or `scripts/dispatch.sh --list`
8
- inside the omnilane repo), classify the subtask into a lane, then dispatch it
9
- headlessly:
10
-
11
- omnilane route [--vendor V] [--mode work] [--workdir DIR] <lane> "<task>"
12
-
13
- Advise mode is the default; pass `--mode work` only with an explicit
14
- `--workdir`. The commander self-executes only the reserved list: planning and
15
- decomposition, writing task briefs, reading worker output (`out.txt`,
16
- `events.jsonl`, inbox records), acceptance judgment, replies to the operator,
17
- git commit/push, and governance-file edits. The commander never runs commands
18
- itself: re-verify a worker's claim by reading its attached evidence or by
19
- dispatching a second worker with a different `--vendor`. Read-only work goes
20
- out in advise mode through named lanes — `triage` for high-volume scans,
21
- `long-context` for large documents, `live-search` for web or X,
22
- `hard-judgment` for second opinions. Invalid reasons to skip dispatch: "this
23
- lane is mine", "I am not dispatching so the rule does not apply", "it is only
24
- a file read", "dispatch is slower", "it is one line".
25
-
26
- Implementation dispatches carry `--mode work --workdir DIR --timeout 3600` or
27
- more; the advise default is read-only under a 600 s watchdog and yields no
28
- output there. Add `--background` for long tasks: on Claude Code the completion
29
- inbox delivers the result into your next prompt, elsewhere use `jobs.sh wait
30
- <id>`. Follow up a live Claude or Gemini worker with `jobs.sh send <id> "<text>"`
31
- / `jobs.sh close <id>`. Wrap multi-dispatch exploratory objectives in
32
- `omnilane goal open`; dispatch a single obvious task directly.
33
-
34
- If the user explicitly names Claude, Codex, Grok, Gemini, or a canonical model
35
- alias, use the omnilane skill's consult rules and keep `--vendor` in the
36
- dispatch; an explicit target must not silently fall back.
37
-
38
- Lane definitions, modes, per-model rows, and safety rules live in the
39
- `omnilane` skill — load it and apply the row for the model you are running
40
- as; legacy model-routing skill variants are retired. Workers must never
41
- dispatch again (nested dispatch is refused, exit 86).
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.34.0",
4
- "description": "One routing table, every harness — classify subtasks into lanes and dispatch each lane to the best vendor's agentic CLI (Codex, Claude, Gemini, Grok) using your existing subscription logins.",
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.34.0",
5
- "description": "One routing table, every harness: classify subtasks into lanes and auto-dispatch each lane to the best vendor CLI (Codex, Claude Code, Grok Build, Antigravity) with background jobs, depth guard, and serialized codex dispatch."
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-5.6-sol max | claude claude-fable-5-1 high | grok grok-4.6 - | gemini "Gemini 3.7 Flash (High)" -
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: claude claude-fable-5-1 high
32
- # taste-final: claude claude-fable-5-1 high
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-02.)
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 xhigh | codex gpt-5.6-sol xhigh | grok grok-4.6 - | gemini "Gemini 3.7 Flash (High)" - # ordered on coding capability: the leading Claude tier wins both coding components; Sol remains the established Codex-harness value fallback; Grok and Flash High keep the lane alive when neither subscription is reachable
24
- bulk-mechanical: codex gpt-5.6-sol high | gemini "Gemini 3.7 Flash (High)" - | claude claude-sonnet-5 high # ordered on endurance per dollar: Sol dominates Terra within Codex; current Flash is the faster, cheaper middle fallback; Sonnet preserves subscription quota
25
- triage: codex gpt-5.6-luna high | gemini "Gemini 3.7 Flash (Low)" - | claude claude-haiku-4-5 - # ordered on cost per task at usable intelligence: Luna high buys a meaningful quality lift cheaply; Flash and Haiku are low-cost cross-vendor fallbacks
26
- hard-judgment: claude claude-opus-5 xhigh | codex gpt-5.6-sol max | grok grok-4.6 - # ordered on agentic knowledge work per cost: Opus nearly matches Fable's agentic score at meaningfully lower cost and a lower hallucination rate; Sol stays ahead of Grok because Grok effort is ignored and its reproduced row is unknown
27
- taste-final: claude claude-fable-5-1 high | codex gpt-5.6-sol max | grok grok-4.6 - | gemini "Gemini 3.7 Flash (High)" - # ordered on prose and polish: Fable leads Opus on intelligence and factual breadth; Sol is the cross-vendor fallback; Grok matches Sol on intelligence with a far better factual score and lower hallucination rate; Flash High closes out the lane
28
- consult: codex gpt-5.6-sol max | claude claude-fable-5-1 high | grok grok-4.6 - | gemini "Gemini 3.7 Flash (High)" - # direct named-model chain uses the strongest current Claude and Flash slots; keep --vendor to prevent fallback
29
- ui-draft: codex gpt-5.6-sol xhigh | claude claude-fable-5-1 high | gemini "Gemini 3.7 Flash (High)" - # ordered for drafts with a design system or reference images: Sol leads measured multimodal and coding evidence; Fable follows for polish; Flash High holds the highest measured multimodal score among the cheapest three and keeps the lane alive
30
- long-context: gemini "Gemini 3.7 Flash (Medium)" - | codex gpt-5.6-terra max | claude claude-opus-5 medium # ordered on long-context reasoning, then cost and throughput: Flash leads; Terra matches its long-context result; Opus is the cheaper Claude fallback
31
- fast-agentic: gemini "Gemini 3.7 Flash (Medium)" - | codex gpt-5.6-luna high | claude claude-haiku-4-5 - # ordered on interactive tool-loop latency: Flash gives up little agentic quality for far faster first output; Luna high is the low-latency Codex fallback; Haiku adds a low-latency Claude fallback
32
- live-search: grok grok-4.6 - | gemini "Gemini 3.7 Flash (High)" - | claude claude-sonnet-5 high | off # native X and web search lane; Grok is the only candidate with real live search — Flash and Sonnet fall back to their own web-search tools so a missing Grok CLI does not strand the lane entirely
33
- coding-overflow: grok grok-4.6 - | gemini "Gemini 3.7 Flash (High)" - | kimi kimi-k3 - | qwen qwen3-coder-plus - | opencode - - | off # coding relief ordered by capability and value: Grok has the lowest frontier hallucination rate; Flash is the cheapest strong coder here; revisit the best-value Qwen tier when its CLI alias can be verified
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. Opus 5 now leads hard-judgment on a per-cost,
42
- # lower-hallucination basis and remains selectable everywhere via
43
- # ~/.omnilane/routing.local.yaml, for example, to bring Fable back:
44
- # hard-judgment: claude claude-fable-5-1 xhigh
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.