omnilane 0.42.2 → 0.42.5

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.2"
9
+ "version": "0.42.5"
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.2",
16
+ "version": "0.42.5",
17
17
  "category": "development",
18
18
  "keywords": [
19
19
  "routing",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omnilane",
3
- "version": "0.42.2",
3
+ "version": "0.42.5",
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,78 @@ semantic version tags.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.42.5] - 2026-09-09
10
+
11
+ ### Fixed
12
+
13
+ - One vendor's CLI upgrade refused every vendor's dispatch. Overlay evidence
14
+ compared in a single loop raised on the first mismatch, so an `agy`
15
+ 1.1.27 -> 1.1.28 upgrade failed `load_registry` and returned
16
+ `invalid-policy-input` for codex, claude, and grok as well, although only the
17
+ seven gemini mappings depended on that binary. Evidence entries now take a
18
+ `vendor` tag; a tagged entry that drifts or disappears degrades only its own
19
+ vendor to `unknown-target-runtime`. Untagged evidence stays globally
20
+ fail-closed, and structural overlay checks stay hard failures.
21
+ - `omnilane doctor` reported 19 passed, 0 failed while every dispatch was
22
+ refused. A new `transport-overlay` check loads the configured overlay, names
23
+ the offending file and vendor on failure, reports per-vendor verified counts,
24
+ and warns when a vendor has degraded.
25
+ - `build_overlay.py` signed probes it never read. Six `claude-fable-5-1`
26
+ configurations had been unusable since 2026-09-07 because their probes hit a
27
+ quota refusal and were silently omitted. Probes now carry a per-vendor
28
+ `verdict`, non-passing probes are refused and recorded in the overlay's
29
+ `unproven[]`, and evidence predating the field is signed with a warning. The
30
+ six Fable configurations are listed in the probe table so their failures are
31
+ reported; a 2026-09-09 re-probe returned the same quota refusal, so they stay
32
+ unusable and `omnilane doctor` now says so.
33
+ - A Claude CLI probe that requested an unknown `--effort` returned exit 0, no
34
+ error, the right `modelUsage`, and the expected token while silently using the
35
+ default effort. The verdict now fails that case, so a mapping cannot be
36
+ certified at the wrong effort tier.
37
+
38
+ ### Changed
39
+
40
+ - `build_overlay.py` and `probe.py` moved from an untracked `.rollback` sweep
41
+ directory into `scripts/lib/` and take `--root`, so overlay rebuilds survive a
42
+ cleanup of that directory.
43
+
44
+ ## [0.42.4] - 2026-09-07
45
+
46
+ ### Fixed
47
+
48
+ - The 60-second start in all five READMEs ran `omnilane route` with no caller
49
+ identity, so a new user following it was refused with `missing-caller-context`
50
+ and the READMEs said nothing about the fix. The quickstart now asserts the
51
+ human operator once with `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1`, and a note
52
+ explains why a dispatch must say who is asking, what a model caller passes
53
+ instead, and what happens when neither is present.
54
+ - The `dispatch.sh` synopsis in the command reference gains
55
+ `[--caller-context FILE | --operator-asserted-human]`.
56
+
57
+ 0.42.3 documented this inside the dispatch skill but left the user-facing
58
+ quickstart unchanged, which is the path a new install actually takes.
59
+
60
+ ## [0.42.3] - 2026-09-07
61
+
62
+ ### Documentation
63
+
64
+ - The dispatch quick reference now shows `--caller-context FILE` in the command
65
+ signature and states that a model caller without it is refused with
66
+ `missing-caller-context` before a job exists.
67
+ - The frozen exact-AA downward gate section gains a complete caller-context
68
+ example and says to build the file before the first dispatch rather than after
69
+ a refusal.
70
+ - New guidance for a harness that names a model but no effort: read the exact
71
+ flags from the launching process by walking your own ancestor chain, matching
72
+ the chain rather than the first same-named process on the host. Declaring the
73
+ lowest-scoring row is documented as the fallback when that yields nothing, not
74
+ as the first move, because an unnecessarily low ceiling silently closes lanes.
75
+ - `missing-caller-context` and `runtime-mapping-unverified` are now distinguished
76
+ with the fix for each, including the warning that the second is never resolved
77
+ by editing the frozen registry whose SHA-256 is pinned in `aa_policy.py`.
78
+
79
+ No routing, scoring, gate, or runner behaviour changes in this release.
80
+
9
81
  ## [0.42.2] - 2026-09-07
10
82
 
11
83
  ### Fixed
@@ -849,7 +921,10 @@ work to the wrong model, and records the evidence behind the shipped defaults.
849
921
  - Initial shared routing table, cross-vendor dispatcher, runners, installer,
850
922
  and baseline lint fixes.
851
923
 
852
- [Unreleased]: https://github.com/Seraphim0916/omnilane/compare/v0.42.2...HEAD
924
+ [Unreleased]: https://github.com/Seraphim0916/omnilane/compare/v0.42.5...HEAD
925
+ [0.42.5]: https://github.com/Seraphim0916/omnilane/compare/v0.42.4...v0.42.5
926
+ [0.42.4]: https://github.com/Seraphim0916/omnilane/compare/v0.42.3...v0.42.4
927
+ [0.42.3]: https://github.com/Seraphim0916/omnilane/compare/v0.42.2...v0.42.3
853
928
  [0.42.2]: https://github.com/Seraphim0916/omnilane/compare/v0.42.1...v0.42.2
854
929
  [0.42.1]: https://github.com/Seraphim0916/omnilane/compare/v0.42.0...v0.42.1
855
930
  [0.42.0]: https://github.com/Seraphim0916/omnilane/compare/v0.41.1...v0.42.0
package/README.ja.md CHANGED
@@ -52,6 +52,7 @@ Cursor、Gemini CLI** など——を使っていますよね。どれも一つ
52
52
 
53
53
  ```bash
54
54
  npm i -g omnilane # CLI をインストール
55
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 呼び出しているのは人間の操作者
55
56
  omnilane route hardest-coding "auth トークン更新テストの不安定さを修正"
56
57
  omnilane doctor # 使える AI CLI / キーを確認
57
58
  omnilane ui start # 任意:ブラウザでジョブをライブ表示
@@ -62,9 +63,17 @@ omnilane ui start # 任意:ブラウザでジ
62
63
  ```bash
63
64
  git clone https://github.com/Seraphim0916/omnilane && cd omnilane
64
65
  ./install.sh # CLI を検出、スキルを接続、あなたの言語で対話
66
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 呼び出しているのは人間の操作者
65
67
  omnilane route hardest-coding "auth トークン更新テストの不安定さを修正"
66
68
  ```
67
69
 
70
+ > **あの export は何のため?** omnilane は呼び出し元自身の能力スコアで各ディスパッチを
71
+ > ゲートするため、「誰が依頼しているか」を必ず示す必要があります。端末の前にいる人間は
72
+ > `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` を一度設定するか、呼び出しごとに
73
+ > `--operator-asserted-human` を付けます。omnilane を動かすモデルは**自分でこれを主張
74
+ > できません**。代わりに正確なベンダー・モデル・effort を持つ `--caller-context FILE` を
75
+ > 渡します。どちらも無い場合、ジョブ生成前に `missing-caller-context` で拒否されます。
76
+
68
77
  > はじめての方は、まず `omnilane doctor` を実行してください。omnilane が今どのモデル CLI と
69
78
  > API キーに接続できるかがわかり、実際に何が動くか把握できます。
70
79
 
@@ -292,6 +301,7 @@ omnilane ui stop # Live UI を停止
292
301
  omnilane doctor [--json] # ルーティングとローカル実行環境を読み取り専用で診断
293
302
  dispatch.sh [--background] [--dry-run] [--thread NAME] [--mode advise|work|sysops] [--workdir DIR]
294
303
  [--vendor V] [--model M] [--effort E] [--timeout SEC] [--job-timeout SEC]
304
+ [--caller-context FILE | --operator-asserted-human] # who is asking
295
305
  LANE "TASK" # "-" で stdin から読む
296
306
  dispatch.sh [--json] --list [--json]
297
307
  dispatch.sh [--json] --explain LANE [--json] # 候補ごとの決定理由をオフライン表示
@@ -511,6 +521,36 @@ work の別名ではありません。サービス管理など、work の境界
511
521
 
512
522
  </details>
513
523
 
524
+ <details>
525
+ <summary><b>ディスパッチが拒否されました。どの拒否ですか?</b></summary>
526
+
527
+ <br/>
528
+
529
+ 3 つのコードには 3 つの異なる対処があります。まず `omnilane doctor` を実行して
530
+ ください。その `transport-overlay` チェックが、問題はこのマシンの設定なのか
531
+ リクエストなのかをすぐに示します。
532
+
533
+ `missing-caller-context` — 呼び出し元の識別情報がありません。人間は
534
+ `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` または `--operator-asserted-human` を
535
+ 使います。omnilane を動かすモデルは、正確なベンダー・モデル・effort を含む
536
+ `--caller-context FILE` を渡し、人間向けの免除を自称してはいけません。
537
+
538
+ `runtime-mapping-unverified` — 識別情報は正しく、**ターゲット**にホストローカルの
539
+ リクエストセレクタの証明がありません。未プローブか、プローブが失敗しています。
540
+ `omnilane doctor` がその件数を報告し、overlay の `unproven[]` に各失敗の理由が
541
+ 残ります。プロバイダーの利用上限による拒否は、その上限が解消するまで続きます。
542
+
543
+ `invalid-policy-input` と "transport contract evidence changed" — 上記のいずれ
544
+ でもありません。overlay 自体が読み込めないため、**すべてのベンダー**が拒否され
545
+ ます。よくある原因はベンダー CLI の更新です。overlay は各ベンダーの実行ファイルと
546
+ ランナースクリプトのハッシュを固定しており、Codex と Claude の証拠パスは
547
+ バージョンディレクトリを含むため、更新ではダイジェストが変わるのではなく
548
+ ファイルが消えます。タグ付きの証拠は自分のベンダーだけを降格させ、プローブ
549
+ マニフェストのようなタグなしの証拠はゲート全体を閉じます。doctor がファイルと
550
+ ベンダーを示し、再署名の手順はディスパッチスキルにあります。
551
+
552
+ </details>
553
+
514
554
  ## 📊 デフォルト値と出典
515
555
 
516
556
  デフォルトのレーン割当は Artificial Analysis の 2026-07 スナップショット
@@ -533,6 +573,28 @@ work の別名ではありません。サービス管理など、work の境界
533
573
 
534
574
  ## 📜 リリース履歴
535
575
 
576
+ ## v0.42.5 の新機能
577
+
578
+ - **1 つの CLI 更新が全ベンダーを止めることはなくなりました。** overlay の evidence に `vendor` タグを付与でき、タグ付きエントリのハッシュ差異やファイル消失は当該ベンダーのみを `unknown-target-runtime` に降格させます。タグなしの evidence は従来どおり全体を fail-closed にします。
579
+ - **`omnilane doctor` が overlay を読み込みます。** 新しい `transport-overlay` チェックは失敗時に該当ファイルとベンダーを示し、成功時はベンダーごとの検証済みマッピング数を報告します。
580
+ - **プローブが判定を記録します。** `probe.py` は課金された `modelUsage` で Claude の応答を判定し、CLI が不明な `--effort` を既定値へ黙って置き換えた場合を失敗とします。`build_overlay.py` は不合格のプローブに署名せず、overlay の `unproven[]` に記録します。
581
+ - **再構築ツールをバージョン管理下へ。** `build_overlay.py` と `probe.py` は `scripts/lib/` に移り、`--root` を受け取ります。
582
+ - **アップグレード。** npm 公開後は `npm i -g omnilane@0.42.5` を実行してください。
583
+
584
+ ## v0.42.4 の新機能
585
+
586
+ - **クイックスタートが実際に動くようになりました。** `omnilane route` は「誰が依頼しているか」を必要としますが、60 秒クイックスタートにその記載が無く、新規インストールでは案内無しに `missing-caller-context` で拒否されていました。今は `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` で人間の操作者を一度宣言し、モデル呼び出し元が代わりに渡すものも説明します。
587
+ - **コマンドリファレンス。** `dispatch.sh` の書式に `[--caller-context FILE | --operator-asserted-human]` を追加しました。
588
+
589
+ ## v0.42.3 の新機能
590
+
591
+ - **ドキュメントのみの更新。** ルーティング、スコア、ゲート、ランナーの動作は変更していません。
592
+ - **`--caller-context` をクイックリファレンスに明記。** ディスパッチのコマンド書式に追加し、モデル呼び出し元がこれを渡さない場合はジョブ生成前に `missing-caller-context` で拒否されることを明示しました。
593
+ - **caller-context の完全な例。** 凍結 exact-AA 下方ゲートの節に、そのまま使える JSON 例を追加し、拒否されてからではなく最初のディスパッチ前に作成するよう記載しました。
594
+ - **effort は推測せず調べる。** ハーネスがモデル名のみで effort を示さない場合、自分の祖先プロセス連鎖をたどって正確なフラグを読み取ります。同名プロセスの先頭ではなく連鎖を照合してください。最低スコア行の宣言は取得できなかった場合の代替であり最初の手段ではありません。不必要に低い上限はレーンを黙って閉じます。
595
+ - **二つの拒否コード、二つの対処。** `missing-caller-context` はファイル未指定、`runtime-mapping-unverified` は対象にホストローカルの検証済みセレクタが無いことを意味し、実証拠に基づく `--transport-overlay` 項目で解決します。凍結レジストリの編集では決して解決しません。
596
+ - **アップグレード。** npm 公開後に `npm i -g omnilane@0.42.3` を実行します。既存のリポジトリシンボリックリンク導入はチェックアウトを更新し `omnilane --version` を確認すれば、再インストールは不要です。
597
+
536
598
  ## v0.42.2 の新機能
537
599
 
538
600
  - **Grok の推論強度を CLI に渡します。** 明示的な `low`、`medium`、`high`、`xhigh` は `--reasoning-effort` で渡され、Grok 4.6 の既定ルートは `high` を選択します。
package/README.ko.md CHANGED
@@ -51,6 +51,7 @@ Gemini CLI** 같은——를 쓰고 계시죠. 각각은 하나의 모델 계열
51
51
 
52
52
  ```bash
53
53
  npm i -g omnilane # CLI 설치
54
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 호출자는 모델이 아닌 사람 운영자
54
55
  omnilane route hardest-coding "간헐적으로 실패하는 auth 토큰 갱신 테스트 수정"
55
56
  omnilane doctor # 사용 가능한 AI CLI / 키 확인
56
57
  omnilane ui start # 선택: 브라우저에서 잡을 실시간 확인
@@ -61,9 +62,17 @@ omnilane ui start # 선택: 브라우저에
61
62
  ```bash
62
63
  git clone https://github.com/Seraphim0916/omnilane && cd omnilane
63
64
  ./install.sh # CLI 감지, 스킬 연결, 당신의 언어로 대화
65
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 호출자는 모델이 아닌 사람 운영자
64
66
  omnilane route hardest-coding "간헐적으로 실패하는 auth 토큰 갱신 테스트 수정"
65
67
  ```
66
68
 
69
+ > **그 export 는 왜 필요한가요?** omnilane 은 호출자 자신의 능력 점수로 모든 디스패치를
70
+ > 게이트하므로, 디스패치는 «누가 요청하는지»를 반드시 밝혀야 합니다. 터미널 앞의 사람은
71
+ > `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 을 한 번 설정하거나 호출마다
72
+ > `--operator-asserted-human` 을 붙입니다. omnilane 을 구동하는 모델은 **스스로 이를 주장할
73
+ > 수 없으며**, 대신 정확한 벤더·모델·effort 를 담은 `--caller-context FILE` 을 전달합니다.
74
+ > 둘 다 없으면 잡 생성 전에 `missing-caller-context` 로 거부됩니다.
75
+
67
76
  > 처음이신가요? 먼저 `omnilane doctor` 를 실행하세요. omnilane 이 지금 어떤 모델 CLI 와
68
77
  > API 키에 접근할 수 있는지 알려 주어, 실제로 무엇이 실행될지 파악할 수 있습니다.
69
78
 
@@ -284,6 +293,7 @@ omnilane ui stop # Live UI 중지
284
293
  omnilane doctor [--json] # 라우팅과 로컬 실행 환경을 읽기 전용으로 진단
285
294
  dispatch.sh [--background] [--dry-run] [--thread NAME] [--mode advise|work|sysops] [--workdir DIR]
286
295
  [--vendor V] [--model M] [--effort E] [--timeout SEC] [--job-timeout SEC]
296
+ [--caller-context FILE | --operator-asserted-human] # who is asking
287
297
  LANE "TASK" # "-" 는 stdin 에서 읽기
288
298
  dispatch.sh [--json] --list [--json]
289
299
  dispatch.sh [--json] --explain LANE [--json] # 후보별 라우팅 결정을 오프라인 설명
@@ -497,6 +507,36 @@ work 는 지정한 디렉터리 안의 변경만 허용하며 모델 연결은
497
507
 
498
508
  </details>
499
509
 
510
+ <details>
511
+ <summary><b>디스패치가 거부되었습니다. 어떤 거부인가요?</b></summary>
512
+
513
+ <br/>
514
+
515
+ 세 가지 코드에는 각각 다른 해결책이 있습니다. 먼저 `omnilane doctor`를 실행하세요.
516
+ `transport-overlay` 검사가 문제의 원인이 이 머신의 설정인지 요청인지 바로
517
+ 알려줍니다.
518
+
519
+ `missing-caller-context` — 호출자 신원을 전달하지 않았습니다. 사람은
520
+ `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 또는 `--operator-asserted-human`을
521
+ 사용합니다. omnilane을 구동하는 모델은 정확한 벤더·모델·effort가 담긴
522
+ `--caller-context FILE`을 전달해야 하며, 사람용 면제를 스스로 주장해서는 안 됩니다.
523
+
524
+ `runtime-mapping-unverified` — 신원은 정상이지만 **대상**에 검증된 호스트 로컬
525
+ 요청 셀렉터가 없습니다. 프로브를 한 적이 없거나 프로브가 실패한 경우입니다.
526
+ `omnilane doctor`가 해당 구성의 개수를 보고하고, overlay의 `unproven[]`에 각
527
+ 실패 사유가 기록됩니다. 공급자 할당량 제한으로 인한 거부는 그 할당량이 회복될
528
+ 때까지 해소되지 않습니다.
529
+
530
+ `invalid-policy-input`과 "transport contract evidence changed" — 위 둘 다
531
+ 아닙니다. overlay 자체가 로드되지 않아 **모든 벤더**가 거부됩니다. 흔한 원인은
532
+ 벤더 CLI 업그레이드입니다. overlay는 각 벤더의 실행 파일과 러너 스크립트 해시를
533
+ 고정하며, Codex와 Claude의 증거 경로에는 버전 디렉터리가 포함되어 업그레이드 시
534
+ 다이제스트가 바뀌는 대신 파일이 사라집니다. 태그가 있는 증거는 해당 벤더만
535
+ 강등시키고, 프로브 매니페스트처럼 태그가 없는 증거는 게이트 전체를 닫습니다.
536
+ doctor가 파일과 벤더를 지목하며, 재서명 절차는 디스패치 스킬에 있습니다.
537
+
538
+ </details>
539
+
500
540
  ## 📊 기본값과 출처
501
541
 
502
542
  기본 레인 배치는 Artificial Analysis 2026-07 스냅샷(AA 사이트 원본 레코드와
@@ -518,6 +558,28 @@ work 는 지정한 디렉터리 안의 변경만 허용하며 모델 연결은
518
558
 
519
559
  ## 📜 릴리스 기록
520
560
 
561
+ ## v0.42.5 새 기능
562
+
563
+ - **CLI 하나를 업그레이드해도 모든 벤더가 막히지 않습니다.** overlay evidence 항목에 `vendor` 태그를 붙일 수 있으며, 태그가 있는 항목의 해시가 바뀌거나 파일이 사라지면 해당 벤더만 `unknown-target-runtime`으로 강등됩니다. 태그가 없는 evidence는 기존처럼 전체 fail-closed입니다.
564
+ - **`omnilane doctor`가 overlay를 로드합니다.** 새 `transport-overlay` 검사는 실패 시 문제가 된 파일과 벤더를 지목하고, 성공 시 벤더별 검증된 매핑 수를 보고합니다.
565
+ - **프로브가 판정을 기록합니다.** `probe.py`는 청구된 `modelUsage`로 Claude 응답을 판정하며, CLI가 알 수 없는 `--effort`를 기본값으로 조용히 대체한 경우를 실패로 처리합니다. `build_overlay.py`는 통과하지 못한 프로브에 서명하지 않고 overlay의 `unproven[]`에 기록합니다.
566
+ - **재빌드 도구를 버전 관리로.** `build_overlay.py`와 `probe.py`는 `scripts/lib/`로 옮겼고 `--root`를 받습니다.
567
+ - **업그레이드.** npm 게시 후 `npm i -g omnilane@0.42.5`를 실행하세요.
568
+
569
+ ## v0.42.4 새 기능
570
+
571
+ - **퀵스타트가 실제로 동작합니다.** `omnilane route` 는 «누가 요청하는지»를 알아야 하지만 60초 시작에 그 내용이 없어, 새 설치에서는 안내 없이 `missing-caller-context` 로 거부되었습니다. 이제 `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 로 사람 운영자를 한 번 선언하며, 모델 호출자가 대신 전달할 것도 설명합니다.
572
+ - **명령 참조.** `dispatch.sh` 서식에 `[--caller-context FILE | --operator-asserted-human]` 을 추가했습니다.
573
+
574
+ ## v0.42.3 새 기능
575
+
576
+ - **문서 전용 업데이트.** 라우팅, 점수, 게이트, 러너 동작은 변경되지 않았습니다.
577
+ - **`--caller-context` 를 빠른 참조에 명시.** 디스패치 명령 서식에 추가했고, 모델 호출자가 이를 전달하지 않으면 작업 생성 전에 `missing-caller-context` 로 거부된다는 점을 명시했습니다.
578
+ - **완전한 caller-context 예시.** 동결된 exact-AA 하향 게이트 절에 그대로 사용할 수 있는 JSON 예시를 추가하고, 거부된 뒤가 아니라 첫 디스패치 전에 파일을 만들도록 기술했습니다.
579
+ - **effort 는 추측하지 말고 확인.** 하네스가 모델명만 제공하고 effort 를 주지 않으면, 자신의 조상 프로세스 체인을 따라 정확한 플래그를 읽습니다. 호스트의 동일 이름 첫 프로세스가 아니라 체인을 대조해야 합니다. 최저 점수 행 선언은 확인이 불가능할 때의 대안이지 첫 수단이 아닙니다. 불필요하게 낮은 상한은 레인을 조용히 닫습니다.
580
+ - **두 거부 코드, 두 가지 해결.** `missing-caller-context` 는 파일 미전달이고, `runtime-mapping-unverified` 는 대상에 검증된 호스트 로컬 셀렉터가 없다는 뜻으로, 실제 증거에 기반한 `--transport-overlay` 항목으로 해결합니다. 동결 레지스트리 편집으로는 결코 해결되지 않습니다.
581
+ - **업그레이드.** npm 게시 후 `npm i -g omnilane@0.42.3` 을 실행합니다. 기존 리포지토리 심볼릭 링크 설치는 체크아웃을 갱신하고 `omnilane --version` 을 확인하면 되며 재설치는 필요 없습니다.
582
+
521
583
  ## v0.42.2 새 기능
522
584
 
523
585
  - **Grok 추론 강도를 CLI에 전달합니다.** 명시적 `low`, `medium`, `high`, `xhigh` 선택을 `--reasoning-effort`로 전달하며 Grok 4.6 기본 경로는 `high`를 선택합니다.
package/README.md CHANGED
@@ -52,6 +52,7 @@ subscription.
52
52
 
53
53
  ```bash
54
54
  npm i -g omnilane # install the CLI
55
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # you are the operator, not a model
55
56
  omnilane route hardest-coding "fix the flaky auth token refresh"
56
57
  omnilane doctor # see which AI CLIs / keys you have
57
58
  omnilane ui start # optional: watch jobs live in your browser
@@ -62,9 +63,18 @@ omnilane ui start # optional: watch jobs live
62
63
  ```bash
63
64
  git clone https://github.com/Seraphim0916/omnilane && cd omnilane
64
65
  ./install.sh # finds your CLIs, links the skill, speaks your language
66
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # you are the operator, not a model
65
67
  omnilane route hardest-coding "fix the flaky auth token refresh"
66
68
  ```
67
69
 
70
+ > **Why that export?** Omnilane gates every delegation against the caller's own
71
+ > capability score, so a dispatch has to say who is asking. A human at a terminal
72
+ > asserts that once with `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1`, or per call with
73
+ > `--operator-asserted-human`. A model driving omnilane cannot assert it for
74
+ > itself — it passes `--caller-context FILE` carrying its exact vendor, model and
75
+ > effort instead. With neither, the dispatch is refused with
76
+ > `missing-caller-context` before any job is created.
77
+
68
78
  > New to this? Run `omnilane doctor` first — it tells you which model CLIs and
69
79
  > API keys omnilane can already reach, so you know what will actually run.
70
80
 
@@ -369,9 +379,11 @@ omnilane ui status # report whether the Live UI is r
369
379
  omnilane ui url # print the current authenticated local URL
370
380
  omnilane ui stop # stop the Live UI
371
381
  omnilane doctor [--json] [--strict] [--probe V] [--probe-timeout SEC] # live probe is opt-in
382
+ # transport-overlay check names a stale vendor
372
383
  omnilane benchmark [--json] [--run] [--vendor V] [--cost-per-call V=USD] # dry-run by default
373
384
  dispatch.sh [--background] [--dry-run] [--thread NAME] [--mode advise|work|sysops] [--workdir DIR]
374
385
  [--vendor V] [--model M] [--effort E] [--timeout SEC] [--job-timeout SEC]
386
+ [--caller-context FILE | --operator-asserted-human] # who is asking
375
387
  LANE "TASK" # "-" reads task from stdin
376
388
  dispatch.sh [--json] --list [--json]
377
389
  dispatch.sh [--json] --explain LANE [--json] # offline candidate-by-candidate decision trace
@@ -604,6 +616,37 @@ so one command can never spiral into a chain of agents spending your quota.
604
616
 
605
617
  </details>
606
618
 
619
+ <details>
620
+ <summary><b>My dispatch was refused. Which refusal is it?</b></summary>
621
+
622
+ <br/>
623
+
624
+ Three codes, three different fixes. Run `omnilane doctor` first — its
625
+ `transport-overlay` check tells you immediately whether the problem is your
626
+ machine's configuration or your request.
627
+
628
+ `missing-caller-context` — you passed no identity. A human adds
629
+ `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` or `--operator-asserted-human`; a model
630
+ driving omnilane writes a `--caller-context FILE` with its exact vendor, model,
631
+ and effort, and must not assert the human exemption for itself.
632
+
633
+ `runtime-mapping-unverified` — your identity is fine, but the *target* has no
634
+ proven host-local request selector. Either it was never probed, or its probe
635
+ failed; `omnilane doctor` reports the count of such configurations and the
636
+ overlay's `unproven[]` records why each one failed. A refusal caused by a
637
+ provider quota limit will not clear until that quota does.
638
+
639
+ `invalid-policy-input` with "transport contract evidence changed" — neither of
640
+ the above. The overlay itself will not load, so *every* vendor is refused. The
641
+ usual cause is a vendor CLI upgrade: the overlay pins each vendor's executable
642
+ and runner-script hash, and Codex and Claude evidence paths embed version
643
+ directories, so an upgrade removes the file rather than changing its digest.
644
+ Tagged evidence degrades only its own vendor; untagged evidence, such as the
645
+ probe manifest, still closes the whole gate. Doctor names the file and the
646
+ vendor; the dispatch skill carries the re-signing runbook.
647
+
648
+ </details>
649
+
607
650
  ## 📊 Defaults and provenance
608
651
 
609
652
  Default lane assignments follow Artificial Analysis coding/intelligence data
@@ -627,6 +670,28 @@ working notes, including per-benchmark caveats, live in
627
670
 
628
671
  ## 📜 Release history
629
672
 
673
+ ## What's new in v0.42.5
674
+
675
+ - **One CLI upgrade no longer refuses every vendor.** Overlay evidence entries take a `vendor` tag; a tagged entry whose hash drifts or whose file has disappeared degrades only that vendor to `unknown-target-runtime`. Untagged evidence stays globally fail-closed.
676
+ - **`omnilane doctor` loads the overlay.** A new `transport-overlay` check names the offending file and vendor on failure and reports per-vendor verified counts on success — an all-green doctor could previously coexist with a gate refusing every dispatch.
677
+ - **Probes record a verdict.** `probe.py` judges Claude responses on the billed `modelUsage` and fails a run where the CLI silently substituted the default effort for an unknown `--effort`. `build_overlay.py` refuses to sign a non-passing probe and records it in the overlay's `unproven[]` instead of dropping it silently.
678
+ - **Rebuild tooling is versioned.** `build_overlay.py` and `probe.py` live in `scripts/lib/` and take `--root`.
679
+ - **Upgrade.** After npm publication, run `npm i -g omnilane@0.42.5`. Existing repo-symlink installations can update their checkout and verify `omnilane --version` without rerunning installation.
680
+
681
+ ## What's new in v0.42.4
682
+
683
+ - **The quickstart actually runs now.** `omnilane route` needs to know who is asking; the 60-second start omitted that, so a fresh install hit `missing-caller-context` with no guidance. It now asserts the human operator once with `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1`, and explains what a model caller passes instead.
684
+ - **Command reference.** The `dispatch.sh` synopsis shows `[--caller-context FILE | --operator-asserted-human]`.
685
+
686
+ ## What's new in v0.42.3
687
+
688
+ - **Documentation only.** No routing, scoring, gate, or runner behaviour changes.
689
+ - **`--caller-context` is in the quick reference.** The dispatch command signature now shows it, and states that a model caller without it is refused with `missing-caller-context` before a job exists.
690
+ - **A worked caller-context example.** The frozen exact-AA downward gate section gains a complete JSON example, and says to build the file before the first dispatch rather than after a refusal.
691
+ - **Find your own effort instead of guessing.** When a harness names a model but no effort, read the exact flags from the launching process by walking your own ancestor chain; match the chain rather than the first same-named process on the host. Declaring the lowest-scoring row is the fallback, not the first move, because an unnecessarily low ceiling silently closes lanes.
692
+ - **Two refusal codes, two fixes.** `missing-caller-context` means no file was passed; `runtime-mapping-unverified` means the target lacks a proven host-local selector, which is fixed by a `--transport-overlay` entry backed by real evidence and never by editing the frozen registry.
693
+ - **Upgrade.** After npm publication, run `npm i -g omnilane@0.42.3`. Existing repo-symlink installations can update their checkout and verify `omnilane --version` without rerunning installation.
694
+
630
695
  ## What's new in v0.42.2
631
696
 
632
697
  - **Grok effort reaches the CLI.** Explicit `low`, `medium`, `high`, and `xhigh` selections are passed with `--reasoning-effort`; Grok 4.6 default routes now select `high`.
package/README.zh-CN.md CHANGED
@@ -47,6 +47,7 @@ Gemini CLI** 之类。每一个都只接一个模型家族,所以你交代的每
47
47
 
48
48
  ```bash
49
49
  npm i -g omnilane # 装 CLI
50
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 你是操作者本人,不是模型
50
51
  omnilane route hardest-coding "修掉会间歇失败的 auth token 更新测试"
51
52
  omnilane doctor # 看你手上有哪些 AI CLI / 金钥
52
53
  omnilane ui start # 选配:在浏览器即时看派工
@@ -57,9 +58,17 @@ omnilane ui start # 选配:在浏览器即时
57
58
  ```bash
58
59
  git clone https://github.com/Seraphim0916/omnilane && cd omnilane
59
60
  ./install.sh # 侦测你的 CLI、接好技能、说你的语言
61
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 你是操作者本人,不是模型
60
62
  omnilane route hardest-coding "修掉会间歇失败的 auth token 更新测试"
61
63
  ```
62
64
 
65
+ > **那个 export 是做什么的?** omnilane 会用调用者自己的能力分数来把关每一次派工,
66
+ > 所以派工必须表明「是谁在问」。人类在终端前只要设一次
67
+ > `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1`,或每次带 `--operator-asserted-human`。
68
+ > 模型驱动 omnilane 时**不能替自己主张**这个标志,它要改用 `--caller-context FILE`
69
+ > 提供确切的厂商、模型与强度。两者都没有的话,派工会在创建作业前就被
70
+ > `missing-caller-context` 拒绝。
71
+
63
72
  > 第一次用?先跑 `omnilane doctor`——它会告诉你 omnilane 现在能接到哪些模型 CLI 与
64
73
  > API 金钥,你就知道实际会跑什么。
65
74
 
@@ -267,6 +276,7 @@ omnilane ui stop # 停止 Live UI
267
276
  omnilane doctor [--json] # 只读检查路由与本地运行环境
268
277
  dispatch.sh [--background] [--dry-run] [--thread NAME] [--mode advise|work|sysops] [--workdir 目录]
269
278
  [--vendor V] [--model M] [--effort E] [--timeout SEC] [--job-timeout SEC]
279
+ [--caller-context FILE | --operator-asserted-human] # who is asking
270
280
  通道 "任务" # "-" 表示从 stdin 读任务
271
281
  dispatch.sh [--json] --list [--json]
272
282
  dispatch.sh [--json] --explain 通道 [--json] # 离线逐候选解释路由决策
@@ -471,6 +481,33 @@ scripts/dispatch.sh --dry-run hardest-coding "…" # 完整解析后的计划,
471
481
 
472
482
  </details>
473
483
 
484
+ <details>
485
+ <summary><b>派工被拒了,是哪一种拒绝?</b></summary>
486
+
487
+ <br/>
488
+
489
+ 三个代码,三种不同的修法。先运行 `omnilane doctor`——它的 `transport-overlay`
490
+ 检查会直接告诉你问题出在本机配置还是你的请求。
491
+
492
+ `missing-caller-context`——你没带身份。真人加上
493
+ `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 或 `--operator-asserted-human`;
494
+ 模型驱动 omnilane 时要写一份 `--caller-context FILE`,包含它精确的厂商、模型与
495
+ 强度,且不得替自己主张真人豁免。
496
+
497
+ `runtime-mapping-unverified`——你的身份没问题,但**目标**没有已验证的本机请求
498
+ 选择器。可能从未探测过,也可能探测失败;`omnilane doctor` 会报告这类配置的数量,
499
+ overlay 的 `unproven[]` 记录每一条失败的原因。因供应商额度上限造成的拒绝,
500
+ 在额度恢复前不会自行解除。
501
+
502
+ `invalid-policy-input` 搭配 "transport contract evidence changed"——以上皆非。
503
+ 是 overlay 本身加载失败,因此**所有厂商**都会被拒。常见成因是厂商 CLI 升级:
504
+ overlay 钉住每家的可执行文件与 runner 脚本哈希,而 Codex 与 Claude 的证据路径
505
+ 内嵌版本目录,升级后是文件消失而非哈希改变。带标签的证据只降级自己那一家;
506
+ 未标签的证据(例如探测清单)仍会关闭整个闸门。doctor 会指出文件与厂商,
507
+ 重签流程写在派工技能里。
508
+
509
+ </details>
510
+
474
511
  ## 📊 默认值与数据来源
475
512
 
476
513
  默认通道配置依据 Artificial Analysis 2026-07 快照(已对 AA 站上原始记录与
@@ -493,6 +530,28 @@ scripts/dispatch.sh --dry-run hardest-coding "…" # 完整解析后的计划,
493
530
 
494
531
  ## 📜 版本历程
495
532
 
533
+ ## v0.42.5 新功能
534
+
535
+ - **升级一支 CLI 不再阻断所有厂商。** overlay 的证据项目可带 `vendor` 标签;带标签的项目哈希漂移或文件消失时,只让该厂商降级为 `unknown-target-runtime`。未标签的证据维持全局 fail-closed。
536
+ - **`omnilane doctor` 会加载 overlay。** 新增 `transport-overlay` 检查,失败时指出是哪个文件、哪一家厂商,成功时报告各厂商的已验证映射数。
537
+ - **探测会记录判定。** `probe.py` 以计费的 `modelUsage` 判断 Claude 响应,并在 CLI 静默改用默认强度时判为失败。`build_overlay.py` 拒签未通过的探测,改记入 overlay 的 `unproven[]`。
538
+ - **重建工具纳入版本控制。** `build_overlay.py` 与 `probe.py` 移入 `scripts/lib/`,并接受 `--root`。
539
+ - **升级。** npm 发布后运行 `npm i -g omnilane@0.42.5`。既有的 repo symlink 安装更新检出后确认 `omnilane --version` 即可。
540
+
541
+ ## v0.42.4 新功能
542
+
543
+ - **快速上手现在真的跑得起来。** `omnilane route` 必须知道「是谁在问」,但 60 秒上手漏了这件事,新安装照抄会直接吃到 `missing-caller-context` 且没有任何指引。现在会先用 `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 表明操作者身分,并说明模型主控该改用什么。
544
+ - **命令参考。** `dispatch.sh` 的用法摘要补上 `[--caller-context FILE | --operator-asserted-human]`。
545
+
546
+ ## v0.42.3 新功能
547
+
548
+ - **纯文档更新。** 路由、评分、闸门与执行器行为均未变更。
549
+ - **`--caller-context` 进入快速参考。** 派工命令签名现已列出该参数,并说明模型主控未携带时会在创建作业前被 `missing-caller-context` 拒绝。
550
+ - **完整的 caller-context 示例。** 冻结 exact-AA 下行闸章节补充了可直接复制的 JSON 示例,并要求在首次派工前建好,而非被拒后才补。
551
+ - **自行查询强度,不要猜测。** 当运行环境只给出模型名称而无强度时,沿自身祖先进程链读取确切标志;应比对整条链,而非主机上第一个同名进程。声明最低分配置是查不到时的退路,而非首选,因为过低的上限会静默关闭车道。
552
+ - **两个拒绝码,两种修法。** `missing-caller-context` 表示未提供文件;`runtime-mapping-unverified` 表示目标缺少已验证的本机选择器,须以真实证据支撑的 `--transport-overlay` 条目修正,绝不可通过修改冻结注册表解决。
553
+ - **升级。** npm 发布后执行 `npm i -g omnilane@0.42.3`。既有的 repo 符号链接安装可更新检出并确认 `omnilane --version`,无需重跑安装。
554
+
496
555
  ## v0.42.2 新功能
497
556
 
498
557
  - **Grok 强度确实传入 CLI。** 显式的 `low`、`medium`、`high`、`xhigh` 通过 `--reasoning-effort` 传递;Grok 4.6 默认路由指定 `high`。
package/README.zh-TW.md CHANGED
@@ -47,6 +47,7 @@ Gemini CLI** 之類。每一個都只接一個模型家族,所以你交代的每
47
47
 
48
48
  ```bash
49
49
  npm i -g omnilane # 裝 CLI
50
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 你是操作者本人,不是模型
50
51
  omnilane route hardest-coding "修掉會間歇失敗的 auth token 更新測試"
51
52
  omnilane doctor # 看你手上有哪些 AI CLI / 金鑰
52
53
  omnilane ui start # 選配:在瀏覽器即時看派工
@@ -57,9 +58,17 @@ omnilane ui start # 選配:在瀏覽器即時
57
58
  ```bash
58
59
  git clone https://github.com/Seraphim0916/omnilane && cd omnilane
59
60
  ./install.sh # 偵測你的 CLI、接好技能、說你的語言
61
+ export OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1 # 你是操作者本人,不是模型
60
62
  omnilane route hardest-coding "修掉會間歇失敗的 auth token 更新測試"
61
63
  ```
62
64
 
65
+ > **那個 export 是做什麼的?** omnilane 會用呼叫者自己的能力分數來把關每一次派工,
66
+ > 所以派工必須表明「是誰在問」。人類在終端機前只要設一次
67
+ > `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1`,或每次帶 `--operator-asserted-human`。
68
+ > 模型驅動 omnilane 時**不能替自己主張**這個旗標,它要改用 `--caller-context FILE`
69
+ > 提供確切的廠商、模型與強度。兩者都沒有的話,派工會在建立工作前就被
70
+ > `missing-caller-context` 拒絕。
71
+
63
72
  > 第一次用?先跑 `omnilane doctor`——它會告訴你 omnilane 現在能接到哪些模型 CLI 與
64
73
  > API 金鑰,你就知道實際會跑什麼。
65
74
 
@@ -306,6 +315,7 @@ omnilane doctor [--json] [--strict] [--probe V] [--probe-timeout SEC] # 實際
306
315
  omnilane benchmark [--json] [--run] [--vendor V] [--cost-per-call V=USD] # 預設只乾跑
307
316
  dispatch.sh [--background] [--dry-run] [--thread NAME] [--mode advise|work|sysops] [--workdir 目錄]
308
317
  [--vendor V] [--model M] [--effort E] [--timeout SEC] [--job-timeout SEC]
318
+ [--caller-context FILE | --operator-asserted-human] # who is asking
309
319
  通道 "任務" # "-" 表示從 stdin 讀任務
310
320
  dispatch.sh [--json] --list [--json]
311
321
  dispatch.sh [--json] --explain 通道 [--json] # 離線逐候選解釋路由決策
@@ -515,6 +525,33 @@ scripts/dispatch.sh --dry-run hardest-coding "…" # 完整解析後的計畫,
515
525
 
516
526
  </details>
517
527
 
528
+ <details>
529
+ <summary><b>派工被拒了,是哪一種拒絕?</b></summary>
530
+
531
+ <br/>
532
+
533
+ 三個代碼,三種不同的修法。先跑 `omnilane doctor`——它的 `transport-overlay`
534
+ 檢查會直接告訴你問題出在本機設定還是你的請求。
535
+
536
+ `missing-caller-context`——你沒帶身分。真人加上
537
+ `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 或 `--operator-asserted-human`;
538
+ 模型驅動 omnilane 時要寫一份 `--caller-context FILE`,內含它精確的廠商、模型與
539
+ 強度,且不得替自己主張真人豁免。
540
+
541
+ `runtime-mapping-unverified`——你的身分沒問題,但**目標**沒有已驗證的本機請求
542
+ 選擇器。可能從未探測過,也可能探測失敗;`omnilane doctor` 會回報這類設定的數量,
543
+ overlay 的 `unproven[]` 記錄每一條失敗的原因。因供應商額度上限造成的拒絕,
544
+ 在額度恢復前不會自行解除。
545
+
546
+ `invalid-policy-input` 搭配 "transport contract evidence changed"——以上皆非。
547
+ 是 overlay 本身載不起來,因此**所有廠商**都會被拒。常見成因是廠商 CLI 升級:
548
+ overlay 釘住每家的執行檔與 runner 腳本雜湊,而 Codex 與 Claude 的證據路徑內嵌
549
+ 版本目錄,升級後是檔案消失而非雜湊改變。帶標籤的證據只降級自己那一家;
550
+ 未標籤的證據(例如探測清單)仍會關閉整個閘門。doctor 會指名檔案與廠商,
551
+ 重簽流程寫在派工技能裡。
552
+
553
+ </details>
554
+
518
555
  ## 📊 預設值與資料來源
519
556
 
520
557
  預設通道配置依據 Artificial Analysis 2026-07 快照(已對 AA 站上原始紀錄與
@@ -534,6 +571,28 @@ scripts/dispatch.sh --dry-run hardest-coding "…" # 完整解析後的計畫,
534
571
 
535
572
  ## 📜 版本歷程
536
573
 
574
+ ## v0.42.5 新功能
575
+
576
+ - **升級一支 CLI 不再擋掉所有廠商。** overlay 的證據項目可帶 `vendor` 標籤;帶標籤的項目雜湊漂移或檔案消失時,只讓該廠商降級為 `unknown-target-runtime`。未標籤的證據維持全域 fail-closed。
577
+ - **`omnilane doctor` 會載入 overlay。** 新增 `transport-overlay` 檢查,失敗時指名是哪個檔案、哪一家廠商,成功時回報各廠商的已驗證映射數——先前 doctor 全綠可以和「閘門拒絕所有派工」同時成立。
578
+ - **探測會記錄判定。** `probe.py` 以計費的 `modelUsage` 判斷 Claude 回應,並在 CLI 靜默改用預設強度時判為失敗。`build_overlay.py` 拒簽未通過的探測,改記進 overlay 的 `unproven[]`,不再無聲丟棄。
579
+ - **重建工具納入版控。** `build_overlay.py` 與 `probe.py` 移入 `scripts/lib/`,並接受 `--root`。
580
+ - **升級。** npm 發布後執行 `npm i -g omnilane@0.42.5`。既有的 repo symlink 安裝更新檢出後確認 `omnilane --version` 即可,不需重跑安裝。
581
+
582
+ ## v0.42.4 新功能
583
+
584
+ - **快速上手現在真的跑得起來。** `omnilane route` 必須知道「是誰在問」,但 60 秒上手漏了這件事,新安裝照抄會直接吃到 `missing-caller-context` 且沒有任何指引。現在會先用 `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 表明操作者身分,並說明模型主控該改用什麼。
585
+ - **指令參考。** `dispatch.sh` 的用法摘要補上 `[--caller-context FILE | --operator-asserted-human]`。
586
+
587
+ ## v0.42.3 新功能
588
+
589
+ - **純文件更新。** 路由、評分、閘門與執行器行為皆未變更。
590
+ - **`--caller-context` 進入快速參考。** 派工指令簽名現在明列這個參數,並說明模型主控未帶時會在建立工作前被 `missing-caller-context` 拒絕。
591
+ - **完整的 caller-context 範例。** 凍結 exact-AA 下行閘章節補上可直接複製的 JSON 範例,並要求在第一次派工前就建好,而非被拒絕後才補。
592
+ - **自己查強度,不要猜。** 當執行環境只給模型名稱而沒有強度時,走自己的祖先行程鏈讀出確切旗標;要比對整條鏈,不要抓主機上第一個同名行程。宣告最低分設定是查不到時的退路,不是第一步,因為過低的上限會靜默關掉車道。
593
+ - **兩個拒絕碼,兩種修法。** `missing-caller-context` 是沒有提供檔案;`runtime-mapping-unverified` 是目標缺少已驗證的本機選擇器,須以有真實證據支撐的 `--transport-overlay` 條目修正,絕不可透過修改凍結登錄檔解決。
594
+ - **升級。** npm 發布後執行 `npm i -g omnilane@0.42.3`。既有的 repo 符號連結安裝可更新檢出並確認 `omnilane --version`,不需重跑安裝。
595
+
537
596
  ## v0.42.2 新功能
538
597
 
539
598
  - **Grok 強度確實傳入 CLI。** 明示的 `low`、`medium`、`high`、`xhigh` 透過 `--reasoning-effort` 傳遞;Grok 4.6 預設路由指定 `high`。
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.42.2
1
+ 0.42.5