omnilane 0.42.9 → 0.44.0

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.
@@ -6,14 +6,14 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "One routing table, native-first or CLI delegation, supervised completion workflows.",
9
- "version": "0.42.9"
9
+ "version": "0.44.0"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "omnilane",
14
14
  "source": "./",
15
15
  "description": "Route each subtask to the model that fits, then delegate through a compatible caller-owned native agent or vendor CLI.",
16
- "version": "0.42.9",
16
+ "version": "0.44.0",
17
17
  "category": "development",
18
18
  "keywords": [
19
19
  "routing",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnilane",
3
- "version": "0.42.9",
3
+ "version": "0.44.0",
4
4
  "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.",
5
5
  "author": {
6
6
  "name": "Seraphim0916"
package/CHANGELOG.md CHANGED
@@ -6,6 +6,179 @@ semantic version tags.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.44.0] - 2026-09-21
10
+
11
+ The daily `omnilane resign` now also covers a CLI you patch and re-sign
12
+ yourself, and an expired login is reported as what it is.
13
+
14
+ ### Added
15
+
16
+ - `omnilane resign --trust-adhoc VENDOR`. An operator who re-signs a vendor's
17
+ executable adhoc on purpose (a local post-update patch step) records that
18
+ once; from then on an adhoc update of that vendor in the same install
19
+ directory is re-probed unattended, like a same-signer update. An unsigned
20
+ executable, an adhoc one in another directory, and every other vendor still
21
+ stop at exit 20. The trust lives on the vendor's overlay entry
22
+ (`operator_trust`), is carried over by later re-signs, and is a per-vendor
23
+ operator action a model never runs. Works for all four vendors.
24
+
25
+ ### Fixed
26
+
27
+ - An expired login is reported as "not logged in", not as a transient failure.
28
+ After a `claude` update every probe answered `Failed to authenticate: OAuth
29
+ session expired and could not be refreshed`; the sweep counted those as
30
+ selector failures and `omnilane resign` said "Retry later", which cannot help.
31
+ `Failed to authenticate`, `OAuth session expired`, `could not be refreshed`,
32
+ `Invalid API key`, `Unauthorized` and `401` now make the vendor `unprobeable`,
33
+ and the held-vendor message says to log in first.
34
+
35
+
36
+ ## [0.43.1] - 2026-09-21
37
+
38
+ Install this instead of 0.43.0. 0.43.0's first-install scripts do not start on
39
+ Python 3.9, which is the version the README promises.
40
+
41
+ ### Fixed
42
+
43
+ - `scripts/lib/build_overlay.py` and `scripts/lib/probe.py` used `X | None`
44
+ annotations without `from __future__ import annotations`, so on Python 3.9 they
45
+ raised `TypeError` on import. That broke the overlay build in the README's
46
+ first-install steps and `omnilane resign`, which imports both. Every module is
47
+ now import-checked under a real Python 3.9.
48
+ - Two `test_probe_identity` tests still assumed an overlay could be built with no
49
+ vendor executable to pin; since 0.43.0 that correctly yields no mappings. The
50
+ fixture host now has a `claude`. The TOML model-override tests are skipped
51
+ before Python 3.11, where the reader refuses by design (no `tomllib`).
52
+ - CI: the strict doctor acceptance step runs as a human-operator host, because
53
+ 0.43.0 made a host with no transport overlay a warning for model callers. CI had
54
+ been red since 0.42.9 on the Python 3.9 unit tests; it runs `unittest discover`,
55
+ which the local `tests/run.sh` does not cover. Both are now run before a release.
56
+ - Doctor's no-overlay message pointed at a README heading that 0.43.0 renamed.
57
+
58
+ ## [0.43.0] - 2026-09-21
59
+
60
+ **Why this release exists.** In ten days 0.42.x refused every model caller four
61
+ times, each time because of a fact omnilane does not control: a launcher was
62
+ renamed, a runner script changed without the overlay being re-signed, all four
63
+ vendor CLIs updated themselves within a week, and a Codex automation recorded no
64
+ effort. Each one turned into "nothing can be dispatched". 0.43.0 makes each of
65
+ those a narrower, explained outcome, and repairs the common one by itself.
66
+
67
+ **Upgrading.** `npm i -g omnilane@0.43.0`. If a model drives omnilane on this
68
+ machine, run once: `omnilane resign --record-signers`, then schedule
69
+ `omnilane resign` daily inside your desktop login session (README, "Let your AI
70
+ assistant drive omnilane", Step 3). Hosts where only a human dispatches need
71
+ nothing. The skill file was rewritten; re-run `./install.sh`, or reinstall the
72
+ plugin, wherever you installed a copy rather than a link.
73
+
74
+ ### What you will notice
75
+
76
+ - **A caller with no recorded effort is narrowed, not refused.** A Codex
77
+ heartbeat automation wakes a thread without writing an effort, and a `codex`
78
+ launched without `model_reasoning_effort` is the same case. 0.42.9 refused it on
79
+ every lane with `missing-caller-context`. It is now held to its model's
80
+ lowest-scored row (`effort_unverified: true` in the context file,
81
+ `caller_degraded: true` in the decision). Whatever effort really ran scores at
82
+ least that much, so this can only narrow what it may dispatch. A malformed
83
+ effort or a missing model still refuses.
84
+ - **A refusal says which check failed and what to do.** Refused decisions carry
85
+ `failed_gate` (`caller-identity`, `target-transport`, `downward-ceiling`,
86
+ `native-capability`), `reason`, `next_command`, `required_caller_effort`,
87
+ `caller_degraded`, and from dispatch `eligible_lanes` (every lane this caller
88
+ can reach now, with `transport_verified`) and `lane_requirement`.
89
+ - **`omnilane resign` re-signs the overlay after a CLI update.**
90
+ `omnilane resign [--check] [--vendor V] [--approve V] [--record-signers] [--allow-shrink] [--no-smoke] [--json]`
91
+ finds what changed (including a CLI installed *beside* its old file, which the
92
+ hash check never saw), re-probes only that vendor into a staging root, loads
93
+ the staged overlay the way dispatch does, replaces the live file atomically
94
+ with a backup, sends one real dispatch per re-probed vendor, and restores the
95
+ backup if that fails. It is not a rubber stamp: a changed executable is
96
+ re-probed **unattended** only when it carries the code-signing team the overlay
97
+ recorded and sits in the same install location. An adhoc or unsigned binary, a
98
+ new signer, a new directory, or an overlay that recorded no signer stop at exit
99
+ 20 with the exact `--approve` line for the operator. A selector that was
100
+ verified and fails this time keeps its old pin unless `--allow-shrink`.
101
+ `--record-signers` is the operator adopting the signers of what the overlay
102
+ already pins. Exit codes: 0 done or nothing to do, 10 drift (`--check`), 20
103
+ operator needed or a vendor held, 30 rolled back, 2 no overlay configured.
104
+ - **The assistant's own sub-agents, without an external CLI.**
105
+ `omnilane native-context` writes the capability file for the harness it runs
106
+ under from the identity `whoami` reads, so the native path no longer needs a
107
+ hand-written file. `omnilane route --inherit` plans a worker that the host
108
+ spawns with no model and no effort argument: it runs the caller's own runtime,
109
+ so it cannot be an upward dispatch, needs no vendor CLI and no overlay, works
110
+ for an effort-unverified caller, has no CLI fallback, refuses every CLI-only
111
+ lifecycle, and is marked `satisfies_lane_target: false` — never reported as the
112
+ lane's target model. When no identity reaches the gate at all, the capability
113
+ file's `vendor` and `current_model` stand as the host's statement
114
+ (`native-inherited-unverified-caller`, `caller_identity_verified: false`, no
115
+ ceiling, no child context; `omnilane native-context --vendor V --model M`);
116
+ completion is still checked against them. Lane dispatch is unchanged: without
117
+ an identity it is refused. Dispatch now says when a same-vendor target went out
118
+ through the CLI only because no capability file was given.
119
+ - **Codex: run each omnilane command alone.** Codex starts `zsh -lc '<command>'`;
120
+ the shell sets `CODEX_THREAD_ID` and, for one simple command, becomes it. With
121
+ `; echo $?`, `&&`, a pipe or `$(…)` the shell stays between codex and the
122
+ command and the caller cannot be read. The gate is unchanged; the refusal now
123
+ names the process it read and says to run the command by itself. Reproduced
124
+ with `codex exec` 0.155.0 and observed in Codex desktop.
125
+ - **Doctor sees more.** It reports a vendor CLI updated beside its pinned
126
+ executable, names `omnilane resign` as the fix, and with no overlay at all
127
+ warns with the first-install steps instead of passing (it still passes where
128
+ the operator set `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1`).
129
+ - **The skill was rewritten** as a five-step procedure a model follows (who am
130
+ I, pick a lane, dispatch, if refused, collect and verify), with every refusal
131
+ mapped to an action. Overlay maintenance moved to `docs/transport-overlay.md`.
132
+ The README gained a full "let your AI assistant drive omnilane" walkthrough.
133
+
134
+ ### Added
135
+
136
+ - `omnilane resign`, `omnilane native-context`, `omnilane route --inherit`.
137
+ - `scripts/lib/resign.py`, `scripts/lib/cli_provenance.py` (the signer check),
138
+ `scripts/lib/aa_lanes.py` (`eligible_lanes`), `scripts/lib/native_context.py`.
139
+ - `scripts/lib/probe_sweep.py` derives all 55 probe commands from
140
+ `build_overlay.py` and the frozen registry, reports an unauthenticated CLI as
141
+ `unprobeable` instead of recording "not logged in" as a finding, refuses
142
+ keychain-backed CLIs outside a desktop session, and retries one transient
143
+ provider error once.
144
+ - Decision codes `native-inherited-allowed`, `native-inherited-unverified-caller`,
145
+ `native-inherit-unavailable`, `inherit-requires-model-caller`,
146
+ `invalid-degraded-caller`.
147
+ - Overlay evidence for CLI executables records `codesign` facts.
148
+ - `release-audit` checks `runner-pins-current` / `runner-pins-stale`: a release
149
+ whose `scripts/runners/*.sh` no longer match the releasing host's overlay fails,
150
+ which is the mistake 0.42.8 shipped with.
151
+ - `docs/transport-overlay.md`.
152
+
153
+ ### Changed
154
+
155
+ - Caller-context files accept the optional key `effort_unverified: true`; the
156
+ gate refuses it on any row above the model's floor.
157
+ - Native capability files accept the optional keys `inherits_caller_runtime` and
158
+ `caller_identity_verified`. `omnilane jobs status` shows `inherit`,
159
+ `caller_identity_verified` and `satisfies_lane_target` for inherited jobs.
160
+ - `build_overlay.py` resolves the repository from its own location, takes
161
+ `--source`, and lists a vendor with no evidence as unproven instead of aborting.
162
+ - A `codex-code-mode-host` between codex and a command is skipped when looking
163
+ for the process that carries `CODEX_THREAD_ID`.
164
+
165
+ ### Verified, and not
166
+
167
+ - 127 test groups pass; `release-audit --target 0.43.0` passes.
168
+ - Real runs on macOS: re-signing with an automatic rollback; a provider refusing
169
+ probes (old pins kept); **an unattended re-sign of a genuine Codex self-update
170
+ 0.155.0 → 0.155.1** (same signer, no `--approve`, 23 of 23 mappings kept, real
171
+ dispatch answered, exit 0); full `--inherit` cycles in Claude Code and in Codex
172
+ desktop, with a verified and with an unverified caller.
173
+ - Not verified: `--inherit` inside Grok Build; effort inheritance in Grok Build;
174
+ any sub-agent tool in Antigravity (`agy` 1.2.7 shows none); the example macOS
175
+ LaunchAgent in the README. In Claude Code, effort inheritance rests on Anthropic's
176
+ documentation, because a sub-agent cannot see its own effort.
177
+ - Limits: the signer check uses macOS code signatures, so on Linux every changed
178
+ CLI stops for `--approve`. A binary with no real signature, such as a locally
179
+ patched CLI, always stops for `--approve`. Degrading a caller lets it dispatch
180
+ what it may; it does not make an expensive lane reachable.
181
+
9
182
  ## [0.42.9] - 2026-09-13
10
183
 
11
184
  ### Fixed
@@ -1069,7 +1242,10 @@ work to the wrong model, and records the evidence behind the shipped defaults.
1069
1242
  - Initial shared routing table, cross-vendor dispatcher, runners, installer,
1070
1243
  and baseline lint fixes.
1071
1244
 
1072
- [Unreleased]: https://github.com/Seraphim0916/omnilane/compare/v0.42.9...HEAD
1245
+ [Unreleased]: https://github.com/Seraphim0916/omnilane/compare/v0.44.0...HEAD
1246
+ [0.44.0]: https://github.com/Seraphim0916/omnilane/compare/v0.43.1...v0.44.0
1247
+ [0.43.1]: https://github.com/Seraphim0916/omnilane/compare/v0.43.0...v0.43.1
1248
+ [0.43.0]: https://github.com/Seraphim0916/omnilane/compare/v0.42.9...v0.43.0
1073
1249
  [0.42.9]: https://github.com/Seraphim0916/omnilane/compare/v0.42.8...v0.42.9
1074
1250
  [0.42.8]: https://github.com/Seraphim0916/omnilane/compare/v0.42.7...v0.42.8
1075
1251
  [0.42.7]: https://github.com/Seraphim0916/omnilane/compare/v0.42.6...v0.42.7
package/README.ja.md CHANGED
@@ -48,36 +48,133 @@ Cursor、Gemini CLI** など——を使っていますよね。どれも一つ
48
48
 
49
49
  ## ⚡ 60 秒クイックスタート
50
50
 
51
- **一番早い方法——npm でインストール:**
51
+ ターミナルの前にいる人間であれば、すぐにディスパッチできます。
52
+
53
+ **1. インストール。**
52
54
 
53
55
  ```bash
54
- npm i -g omnilane # CLI をインストール
55
- export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 呼び出しているのは人間の操作者
56
- omnilane route hardest-coding "auth トークン更新テストの不安定さを修正"
57
- omnilane doctor # 使える AI CLI / キーを確認
58
- omnilane ui start # 任意:ブラウザでジョブをライブ表示
56
+ npm i -g omnilane
59
57
  ```
60
58
 
61
- **またはリポジトリを clone**(ルーティングテーブルとカスタマイズ用スキルが手に入る):
59
+ またはリポジトリをクローンします。カスタマイズできるルーティングテーブルとスキルも手に入ります。
62
60
 
63
61
  ```bash
64
62
  git clone https://github.com/Seraphim0916/omnilane && cd omnilane
65
- ./install.sh # CLI を検出、スキルを接続、あなたの言語で対話
66
- export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 呼び出しているのは人間の操作者
67
- omnilane route hardest-coding "auth トークン更新テストの不安定さを修正"
63
+ ./install.sh # finds your CLIs, links the skill, speaks your language
64
+ ```
65
+
66
+ **2. 手元にあるものを確認する。** `doctor` は omnilane が到達できるモデル CLI と API キーを一覧し、実際に何が動くのかを教えてくれます。何も変更しません。
67
+
68
+ ```bash
69
+ omnilane doctor
70
+ omnilane list # the routing table this machine resolves
71
+ ```
72
+
73
+ **3. 自分がオペレーターだと宣言してからディスパッチする。**
74
+
75
+ ```bash
76
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1
77
+ omnilane route hardest-coding "fix the flaky auth token refresh"
78
+ omnilane ui start # optional: watch jobs live in your browser
79
+ ```
80
+
81
+ > **なぜ export が必要なのか。** omnilane はディスパッチのたびに「依頼している側の能力スコア」と照合するため、誰が依頼しているのかを示す必要があります。人間は `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1`(または呼び出しごとに `--operator-asserted-human`)で一度宣言すれば済みます。モデルは自分でこれを宣言できません。モデルの身元は、それを起動した CLI から読み取られます。どちらも無い場合、ジョブが作られる前に `missing-caller-context` で拒否されます。
82
+
83
+ 人間が使うだけならここまでで十分です。次の節では、より実用的な構成、つまり AI アシスタント自身にディスパッチさせる方法を説明します。
84
+
85
+ ## 🤖 AI アシスタントに omnilane を運転させる
86
+
87
+ アシスタント(Claude Code、Codex、Grok Build、Antigravity)はスキルファイルを読み、レーンの選び方とディスパッチの方法を学びます。マシンごとに一度、4 ステップです。
88
+
89
+ ### ステップ 1:アシスタントにスキルを渡す
90
+
91
+ `./install.sh` は見つけた CLI すべてにリンクを張ります。手動の場合:
92
+
93
+ | アシスタント | 方法 |
94
+ |---|---|
95
+ | Claude Code | `claude plugin marketplace add <このリポジトリ>` の後に `claude plugin install omnilane@omnilane`(`/route`、`/route-jobs`、完了インボックスも付属)。または `skills/omnilane` を `~/.claude/skills/` にリンク |
96
+ | Codex | `skills/omnilane` を `~/.codex/skills/` にリンク |
97
+ | Grok Build | `grok plugin install <このリポジトリ> --trust` |
98
+ | Antigravity | `agy plugin install <このリポジトリ>`(先に `agy plugin validate <このリポジトリ>` で確認) |
99
+
100
+ ### ステップ 2:「各 CLI が指定したモデルを本当に選ぶ」ことを一度だけ証明する
101
+
102
+ モデルが呼び出し元の場合、ディスパッチできるのはこのマシンが**証明済み**のターゲットだけです。たとえば `codex -m gpt-5.6-sol` が本当に Sol を動かしている、ということです。この証明はローカルファイルで、**トランスポートオーバーレイ(transport overlay)** と呼びます。パッケージには同梱されません。これが無いと、すべてのレーンがモデルの呼び出し元を `runtime-mapping-unverified` で拒否し、`omnilane doctor` は `no overlay configured` と警告します。
103
+
104
+ 通常のデスクトップターミナルで作成してください。(ssh ログインのセッションは、CLI がログインに使うキーチェーンを読めないため、すべてを未ログインと報告します。)
105
+
106
+ ```bash
107
+ cd "$(npm root -g)/omnilane" # or your clone
108
+ ROOT=~/.omnilane/transport-evidence/first-sweep
109
+ python3 scripts/lib/probe_sweep.py --root "$ROOT" # one tiny prompt per selector, about 55 calls
110
+ python3 scripts/lib/build_overlay.py --root "$ROOT"
111
+ cp "$ROOT/transport-contracts.local.json" ~/.omnilane/transport-contracts.local.json
112
+ echo 'export OMNILANE_AA_TRANSPORT_OVERLAY="$HOME/.omnilane/transport-contracts.local.json"' >> ~/.omnilane/local.sh
113
+ omnilane doctor | grep transport-overlay # PASS, with a count per vendor
114
+ ```
115
+
116
+ ログインしていないベンダーは `unprobeable` と報告され、未検証のままになるだけです。他のベンダーは動作します。
117
+
118
+ ### ステップ 3:証明を手作業なしで最新に保つ
119
+
120
+ オーバーレイは各 CLI の実行ファイルをハッシュで固定します。そして **CLI は自分で更新されます**。週に一度ということも珍しくありません。更新後、そのベンダーのレーンはオーバーレイが再署名されるまで拒否されます。`omnilane resign` はこの作業をすべて行います。変わった箇所を見つけ、そのベンダーだけを再プローブし、結果を確認し、差し替え、実際のディスパッチを 1 件送って確かめ、失敗すれば古いファイルに戻します。
121
+
122
+ 何でも再署名するわけではありません。変更された CLI が**無人で**再署名されるのは、記録されているものと同じコード署名チームを持ち、同じ種類のインストール場所にある場合だけです。そこで、受け入れる署名者を一度だけ伝えます。
123
+
124
+ ```bash
125
+ omnilane resign --record-signers # once, right after Step 2
126
+ ```
127
+
128
+ 更新のたびにベンダー CLI を自分でパッチして adhoc で再署名しているなら、それもベンダーごとに一度だけ伝えます。以後は同じインストールディレクトリ内の adhoc な更新も無人で再署名されます。
129
+
130
+ ```bash
131
+ omnilane resign --trust-adhoc claude # 自分で claude を adhoc 署名している場合のみ
132
+ ```
133
+
134
+ あとは毎日実行させます。スケジューラーは何でも構いませんが、必ず**デスクトップのログインセッション内**で動かしてください(CLI にはキーチェーンが必要です)。macOS なら LaunchAgent が使えます。
135
+
136
+ ```bash
137
+ cat > ~/Library/LaunchAgents/dev.omnilane.resign.plist <<'EOF'
138
+ <?xml version="1.0" encoding="UTF-8"?>
139
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
140
+ <plist version="1.0"><dict>
141
+ <key>Label</key><string>dev.omnilane.resign</string>
142
+ <key>ProgramArguments</key><array><string>/bin/zsh</string><string>-lc</string><string>omnilane resign</string></array>
143
+ <key>StartCalendarInterval</key><dict><key>Hour</key><integer>9</integer><key>Minute</key><integer>0</integer></dict>
144
+ <key>StandardOutPath</key><string>/tmp/omnilane-resign.log</string>
145
+ <key>StandardErrorPath</key><string>/tmp/omnilane-resign.log</string>
146
+ </dict></plist>
147
+ EOF
148
+ launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/dev.omnilane.resign.plist
68
149
  ```
69
150
 
70
- > **あの export は何のため?** omnilane は呼び出し元自身の能力スコアで各ディスパッチを
71
- > ゲートするため、「誰が依頼しているか」を必ず示す必要があります。端末の前にいる人間は
72
- > `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` を一度設定するか、呼び出しごとに
73
- > `--operator-asserted-human` を付けます。omnilane を動かすモデルは**自分でこれを主張
74
- > できません**。モデルの識別情報は、それを起動した CLI のモデル・effort フラグから自動で
75
- > 読み取られるため、通常のセッションは何も渡す必要がありません。`omnilane whoami` はその
76
- > 識別情報を `--caller-context FILE` として出力します。主張も読み取れる識別情報も無い場合、
77
- > ジョブ生成前に `missing-caller-context` で拒否されます。
151
+ このリリースでは、デスクトップターミナルからの `omnilane resign` を実機で検証しました。Codex の実際の自己更新に対する無人再署名も含みます。上の LaunchAgent は例であり、それ自体は検証していません。`launchctl kickstart gui/$(id -u)/dev.omnilane.resign` で手元のマシンで確認してください。
152
+
153
+ `omnilane resign` の終了コード:
78
154
 
79
- > はじめての方は、まず `omnilane doctor` を実行してください。omnilane が今どのモデル CLI と
80
- > API キーに接続できるかがわかり、実際に何が動くか把握できます。
155
+ | 終了コード | 意味 | あなたがすること |
156
+ |---|---|---|
157
+ | 0 | 変更なし、または変更されたものはすべて再署名済み | 何もしない |
158
+ | 10 | `--check` のみ: 何かが変わった | `omnilane resign` を実行 |
159
+ | 20 | あるベンダーで人の判断が必要: 署名者が新しいか記録が無い、実行ファイルが未署名またはローカルで改変されている、インストール先が変わった、または前回通ったプローブをプロバイダーが今回拒否した | メッセージを読む。「後で再試行」か、確認後に実行すべき `omnilane resign --vendor V --approve V` がそのまま表示される |
160
+ | 30 | 再署名したオーバーレイが実ディスパッチに失敗し、前のものに戻した | 何も壊れていない。ログを読む |
161
+ | 2 | オーバーレイが未設定 | ステップ 2 を行う |
162
+
163
+ 知っておくべき制限が二つあります。署名者の確認は macOS のコード署名を使うため、Linux では CLI が変わるたびに終了コード 20 で止まり `--approve` を求めます。また、正規の署名を持たないバイナリ(ローカルでパッチを当てた CLI など)は必ず承認待ちで止まります。ベンダーとの結び付きを示すものが何も無いからで、それこそがこの確認の目的です。
164
+
165
+ ### ステップ 4:アシスタントの中から試す
166
+
167
+ アシスタントに `omnilane whoami` を実行させてください。自分がどのモデル・どの effort で動いているかと、スコアが返るはずです。続けて小さな仕事を委任させます。「omnilane で triage レーンに、このリポジトリの TODO コメントの数を数えさせて」。
168
+
169
+ 拒否された場合、どの確認で失敗したのか、何をすべきかが拒否メッセージに書かれています。
170
+
171
+ | `failed_gate` | 平たく言うと | 直し方 |
172
+ |---|---|---|
173
+ | `caller-identity` | どのモデルが依頼しているのか omnilane に分からない | `omnilane whoami` をそのツール呼び出しの**唯一のコマンド**として実行させる。特に Codex は `; echo $?`、`&&`、パイプの後ろでは読み取れない |
174
+ | `target-transport` | このマシンがそのターゲットを証明していない、またはその後 CLI が更新された | `omnilane resign`(ステップ 3) |
175
+ | `downward-ceiling` | ターゲットのモデルのスコアが依頼側より高い。モデルは横か下にしか委任できない | 拒否メッセージの `eligible_lanes` から選ぶか、より高い effort でアシスタントを起動する |
176
+
177
+ 既存のスレッドを起こす Codex のオートメーションは effort を記録しません。omnilane はその呼び出し元を拒否する代わりに、そのモデルの最低スコアに制限します。安いレーンはそのまま動き、高いレーンはどの effort なら届くかを教えます。
81
178
 
82
179
  ## 🧭 仕組み
83
180
 
@@ -175,6 +272,34 @@ flowchart LR
175
272
 
176
273
  </details>
177
274
 
275
+ ## アシスタント自身のサブエージェントを使う
276
+
277
+ omnilane は既定でベンダーのコマンドラインツールに仕事を渡します。仕事をすべきモデルがアシスタント**自身のベンダー**のものである場合、別の CLI を経由するのは回り道です。ログインがもう一つ、プロセスがもう一つ、その CLI が更新されれば壊れる箇所がもう一つ増えます。多くのアシスタントは自分でサブエージェントを起動でき、omnilane はそのための計画を立てられます。方法は二つです。
278
+
279
+ **アシスタントとまったく同じものを動かすワーカー(`--inherit`)。** アシスタントは*モデルも effort も指定せずに*サブエージェントを起動するので、ワーカーは呼び出し元の複製です。複製が本体より強くなることはなく、omnilane のスコア確認が防ごうとしているのはそれだけです。したがってこの経路にはベンダー CLI もトランスポートオーバーレイも不要で、呼び出し元の effort が不明でも、オーバーレイが古くなっていても動きます。
280
+
281
+ ```sh
282
+ omnilane native-context --workdir /absolute/repo --inherits-caller-runtime # prints a capability file
283
+ omnilane route --inherit --native-context /path/printed/above --workdir /absolute/repo triage "Count the TODO comments"
284
+ # -> a PENDING handoff (JSON). The assistant now starts its own sub-agent with no
285
+ # model argument, checks the result, and records it:
286
+ omnilane jobs --json complete-native JOB_ID /absolute/completion.json
287
+ omnilane jobs --json status JOB_ID
288
+ ```
289
+
290
+ 正直な部分: ハンドオフには `satisfies_lane_target: false` と記されます。ここでのレーンは仕事の種類を示すラベルにすぎません。この方法で得た結果は「アシスタント自身のサブエージェント」によるものであり、「hardest-coding のモデル」によるものでは決してありません。呼び出し元より強いモデルを必要とするレーンは、引き続き拒否されます。`--inherits-caller-runtime` は「自分のサブエージェントツールはそう動く」というアシスタント自身の申告であり、omnilane からは観測できません。アシスタントごとに分かっていること:
291
+
292
+ | アシスタント | モデル引数なしのサブエージェント |
293
+ |---|---|
294
+ | Claude Code | メイン会話のモデルを使い、effort はセッションのものを引き継ぐと公式ドキュメントに明記(エージェント定義が指定する場合を除く)。組み込みの general-purpose エージェントで `CLAUDE_CODE_SUBAGENT_MODEL` が未設定のとき成立。本リリースで端から端まで実行済み |
295
+ | Codex | モデルも effort も付けない `collaboration.spawn_agent`。本リリースで端から端まで実行済み |
296
+ | Grok Build | 親のモデルを引き継ぐとドキュメントに明記(同梱の `general-purpose` は `model: inherit`)。effort については記載なし。本リリースでは未実行 |
297
+ | Antigravity | `agy` 1.2.7 にサブエージェントツールが見当たらない。利用不可 |
298
+
299
+ **アシスタントのツールが選択できる特定のモデル。** ツールが実際に受け付けるものを capability ファイルに記述し(`omnilane native-context` の出力から始め、正確なモデルと effort の組ごとに行を追加)、通常の `omnilane route` に `--native-context FILE` を渡します。omnilane がサブエージェントを使うのは、ある行が完全に一致したときだけです。モデル、effort、モード、workdir、ツール、分離方式、ライフサイクルのすべてです。同じベンダーは同じモデルではなく、インストール済みの CLI から推測することもありません。`--executor native` はフォールバックせず失敗し、`--executor cli` は外部 CLI を強制します。ファイルが無いというだけで同一ベンダーのターゲットが CLI を経由した場合、ディスパッチはそれを明示するようになりました。
300
+
301
+ どちらの場合も、サブエージェントはアシスタントのツールとファイルシステムを共有します。OS レベルのサンドボックスは無く、`advise`/`work` は意図であって強制ではありません。バックグラウンド、常駐、名前付きスレッド、複数ラウンド、投票、`sysops` は CLI 経路のままです。プロトコル処理には Python 3.9 以上が必要です。スキーマ、完了ファイル、エージェントの再利用とキャンセル: [docs/native-executor.md](docs/native-executor.md)。
302
+
178
303
  ## 🖥️ Live Board
179
304
 
180
305
  すべてのディスパッチは——フォアグラウンドでも `--background` でも——ディスク上の
@@ -577,6 +702,30 @@ work の別名ではありません。サービス管理など、work の境界
577
702
 
578
703
  ## 📜 リリース履歴
579
704
 
705
+ ## v0.44.0 の新機能
706
+
707
+ - **自分でパッチした CLI も無人で再署名されます。** 更新のたびにベンダー CLI をパッチして adhoc で再署名するローカルの手順がある場合、これまでは署名者チェックがそのような更新をすべて `--approve` 待ちで止めていました。ベンダーごとに一度 `omnilane resign --trust-adhoc VENDOR` を実行すれば、同じインストールディレクトリ内の adhoc な更新は同一署名者の更新と同じく毎日の `omnilane resign` で自動的に再署名されます。未署名の実行ファイル、別ディレクトリの adhoc、ほかのベンダーは引き続き停止して確認を求めます。信頼はオーバーレイに記録され、以後どのベンダーの再署名でも保持され、モデルが実行しない運用者の操作です。4 ベンダーすべてに対応。
708
+ - **ログイン期限切れは「再試行」ではなく「ログインしてください」と表示。** `Failed to authenticate`、`OAuth session expired`、`Invalid API key`、`Unauthorized`、`401` はそのベンダーをプローブ不能として扱い、保留メッセージは先にログインするよう案内します。
709
+ - アップグレード: `npm i -g omnilane@0.44.0`。0.42.x からの場合は `omnilane resign --record-signers` も一度実行してください(0.43.0 の説明を参照)。
710
+
711
+ ## v0.43.1 の新機能
712
+
713
+ 0.43.0 ではなくこちらをインストールしてください。0.43.0 では `build_overlay.py` と `probe.py` が Python 3.9 でインポートに失敗し、そのバージョンでは初回インストールのオーバーレイ作成と `omnilane resign` が動きませんでした。ほかに変更はなく、下の 0.43.0 の説明はすべてそのまま当てはまります。アップグレード: `npm i -g omnilane@0.43.1` の後、一度だけ `omnilane resign --record-signers`。
714
+
715
+ ## v0.43.0 の新機能
716
+
717
+ 10 日間で 0.42.x はすべてのモデル呼び出し元を 4 回拒否しました。いずれも omnilane が制御できない事実が原因です。ランチャーの名前変更、再署名なしで変更された runner スクリプト、同じ週に 4 つのベンダー CLI が自己更新、effort を記録しない Codex オートメーション。どれも「何もディスパッチできない」になりました。このリリースは、それぞれをより狭く、説明のつく結果に変え、もっともよくあるものは自動で修復します。
718
+
719
+ - **ベンダー CLI が更新された? `omnilane resign`。** 変わった箇所を見つけ、そのベンダーだけを再プローブし、結果を確認し、差し替え、実ディスパッチ 1 件で確かめ、失敗すれば古いオーバーレイに戻します。新しい実行ファイルが同じコード署名チームを持ち同じ場所にある場合だけ**無人で**再署名し、それ以外は実行すべき `--approve` コマンドを表示して止まります。`omnilane resign --record-signers` を一度実行し、`omnilane resign` を毎日スケジュールすれば、CLI の更新はあなたの問題ではなくなります。Codex の実際の自己更新(0.155.0 → 0.155.1)で検証済み: 承認なし、マッピングはすべて維持、終了コード 0。
720
+ - **拒否がモデルに次の行動を伝える。** 拒否されたディスパッチはすべて `failed_gate`、`reason`、`next_command`、`required_caller_effort`、そして `eligible_lanes`(その呼び出し元がいま*届く*レーン)を持ちます。
721
+ - **effort の記録が無い場合は拒否ではなく範囲を絞る。** Codex のハートビートオートメーションは、すべてのレーンで拒否される代わりに、そのモデルの最低スコアに制限されます。安いレーンは動き続け、高いレーンは必要な effort を示します。
722
+ - **アシスタント自身のサブエージェント。** `omnilane native-context` が、これまで手書きだった capability ファイルを生成します。`omnilane route --inherit` は呼び出し元の複製であるワーカーを計画します。外部 CLI なし、オーバーレイなし、呼び出し元を識別できないときでも動作し、そのレーンのターゲットモデルでは*ない*と正直に記されます。Claude Code と Codex デスクトップで端から端まで実行済み。
723
+ - **Codex: ツール呼び出し 1 回につき omnilane コマンドは 1 つ。** `omnilane whoami; echo $?` は識別できず、`omnilane whoami` 単独なら識別できます。拒否メッセージがそう案内するようになりました。
724
+ - **doctor は場所が変わった CLI を検出**(新しい版が古いファイルの隣に入る場合)し、オーバーレイがまったく無い場合は手順付きで警告します。
725
+ - **スキルとチュートリアルを書き直し。** スキルはモデルが順にたどる 5 ステップの手順になり、この README はアシスタントに omnilane を運転させるまでを順に案内します。
726
+ - **制限。** 無人再署名は macOS のコード署名に依存します。Linux、および未署名またはローカルで改変された CLI では、更新のたびに `--approve` を求めます。`--inherit` は Grok Build 内では未実行で、Antigravity はサブエージェントツールを提供していません。詳細は [CHANGELOG](CHANGELOG.md)。
727
+ - **アップグレード。** `npm i -g omnilane@0.43.0` の後、一度だけ: `omnilane resign --record-signers`。
728
+
580
729
  ## v0.42.9 の新機能
581
730
 
582
731
  - **ランチャー経由の Codex デスクトップ。** ChatGPT.app が codex-profile-switch 経由で