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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +177 -1
- package/README.ja.md +169 -20
- package/README.ko.md +169 -20
- package/README.md +270 -61
- package/README.zh-CN.md +169 -19
- package/README.zh-TW.md +159 -41
- package/VERSION +1 -1
- package/bin/omnilane +29 -0
- package/completions/_omnilane +1 -1
- package/completions/omnilane.bash +1 -1
- package/completions/omnilane.fish +2 -0
- package/docs/native-executor.md +59 -0
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/scripts/dispatch.sh +54 -4
- package/scripts/doctor.sh +7 -1
- package/scripts/lib/aa_lanes.py +135 -0
- package/scripts/lib/aa_policy.py +154 -1
- package/scripts/lib/build_overlay.py +45 -18
- package/scripts/lib/caller_identity.py +75 -13
- package/scripts/lib/cli_provenance.py +82 -0
- package/scripts/lib/native.py +107 -2
- package/scripts/lib/native_context.py +145 -0
- package/scripts/lib/overlay_health.py +24 -2
- package/scripts/lib/probe.py +2 -0
- package/scripts/lib/probe_sweep.py +176 -0
- package/scripts/lib/resign.py +475 -0
- package/scripts/release-audit.sh +31 -0
- package/skills/omnilane/SKILL.md +375 -467
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
51
|
+
ターミナルの前にいる人間であれば、すぐにディスパッチできます。
|
|
52
|
+
|
|
53
|
+
**1. インストール。**
|
|
52
54
|
|
|
53
55
|
```bash
|
|
54
|
-
npm i -g omnilane
|
|
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
|
-
|
|
59
|
+
またはリポジトリをクローンします。カスタマイズできるルーティングテーブルとスキルも手に入ります。
|
|
62
60
|
|
|
63
61
|
```bash
|
|
64
62
|
git clone https://github.com/Seraphim0916/omnilane && cd omnilane
|
|
65
|
-
./install.sh #
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
80
|
-
|
|
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 経由で
|