omnilane 0.42.4 → 0.42.6
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 +97 -1
- package/README.ja.md +48 -0
- package/README.ko.md +48 -0
- package/README.md +79 -0
- package/README.zh-CN.md +69 -0
- package/README.zh-TW.md +69 -0
- package/VERSION +1 -1
- package/docs/release-notes-0.42.5.md +99 -0
- package/package.json +2 -2
- package/plugin.json +1 -1
- package/scripts/doctor.sh +26 -0
- package/scripts/lib/aa_policy.py +38 -2
- package/scripts/lib/build_overlay.py +214 -0
- package/scripts/lib/overlay_health.py +97 -0
- package/scripts/lib/probe.py +408 -0
- package/skills/omnilane/SKILL.md +83 -1
- package/docs/release-notes-0.42.4.md +0 -47
|
@@ -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
|
+
"version": "0.42.6"
|
|
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.
|
|
16
|
+
"version": "0.42.6",
|
|
17
17
|
"category": "development",
|
|
18
18
|
"keywords": [
|
|
19
19
|
"routing",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omnilane",
|
|
3
|
-
"version": "0.42.
|
|
3
|
+
"version": "0.42.6",
|
|
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,101 @@ semantic version tags.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.42.6] - 2026-09-10
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Every transport overlay mapping now records an `evidence_tier` saying how
|
|
14
|
+
strongly its probe identified the responder. `billed-model` is the provider
|
|
15
|
+
naming the model it charged for (Claude's `modelUsage`, grok's under
|
|
16
|
+
`--output-format json`); `client-echo` is the CLI recording the model it asked
|
|
17
|
+
for (codex's session rollout, agy's `cli.log` resolver line); `selector-only`
|
|
18
|
+
is a CLI accepting the selector and reporting nothing further. A verified
|
|
19
|
+
mapping previously flattened these into one word, which overstated two of the
|
|
20
|
+
four vendors in the same way the gate itself did before 0.42.5.
|
|
21
|
+
- `omnilane doctor` reports the tier alongside each vendor's verified count and
|
|
22
|
+
names the vendors worth re-probing.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- The tier is derived from what a run produced rather than assigned per vendor,
|
|
27
|
+
so evidence written before this release re-judges as `selector-only` and a CLI
|
|
28
|
+
that begins reporting a billed model is promoted with no code change.
|
|
29
|
+
- `probe.py` gathers each CLI's own on-disk record of the request — codex through
|
|
30
|
+
the `thread.started` id that names its rollout, agy through the app data
|
|
31
|
+
directory prepared the way `run-gemini.sh` prepares it — and stores a digest of
|
|
32
|
+
the model-bearing lines beside the streams, so the judgement stays a pure
|
|
33
|
+
function that can re-judge an old sweep offline.
|
|
34
|
+
- Grok probes accept the billed model only as an exact match or with the single
|
|
35
|
+
`-build` suffix the provider adds; a prefix test would let `grok-4.6-anything`
|
|
36
|
+
pass as `grok-4.6`.
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- The overlay anchored vendor executables by paths written into
|
|
41
|
+
`build_overlay.py`, which drift out of use without failing: the live overlay
|
|
42
|
+
hashed claude `2.1.263` while every dispatch ran `2.1.266`, so eleven mappings
|
|
43
|
+
were verified against a binary that had not run in a day. Core evidence now
|
|
44
|
+
anchors the executable the runners resolve.
|
|
45
|
+
- The last two mappings carrying `PRIOR:` references instead of probe evidence
|
|
46
|
+
were re-probed, so every signed mapping now has a descriptor a reader can open.
|
|
47
|
+
- A failing codex probe recorded `exit-code: 1` and nothing else. Under
|
|
48
|
+
`exec --json` the refusal that ends a run is an stdout event, so the reason
|
|
49
|
+
never reached `unproven[]`.
|
|
50
|
+
|
|
51
|
+
### Removed
|
|
52
|
+
|
|
53
|
+
- The three `gpt-5.4-mini` mappings. The model passed its probe on 2026-09-07
|
|
54
|
+
and now returns HTTP 400 — "not supported when using Codex with a ChatGPT
|
|
55
|
+
account" — so those configurations move to `unproven[]` carrying that reason.
|
|
56
|
+
A signed overlay does not notice a lane dying upstream; only a re-probe does.
|
|
57
|
+
The overlay now holds 46 mappings and 9 unproven configurations.
|
|
58
|
+
|
|
59
|
+
### Notes
|
|
60
|
+
|
|
61
|
+
- The tier is reported and never enforced. Dispatch continues to turn on
|
|
62
|
+
`runtime_verified` alone, covered by a test asserting every decision is
|
|
63
|
+
byte-identical under all three tiers.
|
|
64
|
+
- agy and grok update themselves in the background when invoked; agy's `cli.log`
|
|
65
|
+
records `auto_updater.go: Spawned background update process`. Overlay evidence
|
|
66
|
+
drift is a routine consequence of using a vendor rather than an operator
|
|
67
|
+
action, and per-vendor degradation is what keeps that from stopping work.
|
|
68
|
+
|
|
69
|
+
## [0.42.5] - 2026-09-09
|
|
70
|
+
|
|
71
|
+
### Fixed
|
|
72
|
+
|
|
73
|
+
- One vendor's CLI upgrade refused every vendor's dispatch. Overlay evidence
|
|
74
|
+
compared in a single loop raised on the first mismatch, so an `agy`
|
|
75
|
+
1.1.27 -> 1.1.28 upgrade failed `load_registry` and returned
|
|
76
|
+
`invalid-policy-input` for codex, claude, and grok as well, although only the
|
|
77
|
+
seven gemini mappings depended on that binary. Evidence entries now take a
|
|
78
|
+
`vendor` tag; a tagged entry that drifts or disappears degrades only its own
|
|
79
|
+
vendor to `unknown-target-runtime`. Untagged evidence stays globally
|
|
80
|
+
fail-closed, and structural overlay checks stay hard failures.
|
|
81
|
+
- `omnilane doctor` reported 19 passed, 0 failed while every dispatch was
|
|
82
|
+
refused. A new `transport-overlay` check loads the configured overlay, names
|
|
83
|
+
the offending file and vendor on failure, reports per-vendor verified counts,
|
|
84
|
+
and warns when a vendor has degraded.
|
|
85
|
+
- `build_overlay.py` signed probes it never read. Six `claude-fable-5-1`
|
|
86
|
+
configurations had been unusable since 2026-09-07 because their probes hit a
|
|
87
|
+
quota refusal and were silently omitted. Probes now carry a per-vendor
|
|
88
|
+
`verdict`, non-passing probes are refused and recorded in the overlay's
|
|
89
|
+
`unproven[]`, and evidence predating the field is signed with a warning. The
|
|
90
|
+
six Fable configurations are listed in the probe table so their failures are
|
|
91
|
+
reported; a 2026-09-09 re-probe returned the same quota refusal, so they stay
|
|
92
|
+
unusable and `omnilane doctor` now says so.
|
|
93
|
+
- A Claude CLI probe that requested an unknown `--effort` returned exit 0, no
|
|
94
|
+
error, the right `modelUsage`, and the expected token while silently using the
|
|
95
|
+
default effort. The verdict now fails that case, so a mapping cannot be
|
|
96
|
+
certified at the wrong effort tier.
|
|
97
|
+
|
|
98
|
+
### Changed
|
|
99
|
+
|
|
100
|
+
- `build_overlay.py` and `probe.py` moved from an untracked `.rollback` sweep
|
|
101
|
+
directory into `scripts/lib/` and take `--root`, so overlay rebuilds survive a
|
|
102
|
+
cleanup of that directory.
|
|
103
|
+
|
|
9
104
|
## [0.42.4] - 2026-09-07
|
|
10
105
|
|
|
11
106
|
### Fixed
|
|
@@ -886,7 +981,8 @@ work to the wrong model, and records the evidence behind the shipped defaults.
|
|
|
886
981
|
- Initial shared routing table, cross-vendor dispatcher, runners, installer,
|
|
887
982
|
and baseline lint fixes.
|
|
888
983
|
|
|
889
|
-
[Unreleased]: https://github.com/Seraphim0916/omnilane/compare/v0.42.
|
|
984
|
+
[Unreleased]: https://github.com/Seraphim0916/omnilane/compare/v0.42.5...HEAD
|
|
985
|
+
[0.42.5]: https://github.com/Seraphim0916/omnilane/compare/v0.42.4...v0.42.5
|
|
890
986
|
[0.42.4]: https://github.com/Seraphim0916/omnilane/compare/v0.42.3...v0.42.4
|
|
891
987
|
[0.42.3]: https://github.com/Seraphim0916/omnilane/compare/v0.42.2...v0.42.3
|
|
892
988
|
[0.42.2]: https://github.com/Seraphim0916/omnilane/compare/v0.42.1...v0.42.2
|
package/README.ja.md
CHANGED
|
@@ -521,6 +521,36 @@ work の別名ではありません。サービス管理など、work の境界
|
|
|
521
521
|
|
|
522
522
|
</details>
|
|
523
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
|
+
|
|
524
554
|
## 📊 デフォルト値と出典
|
|
525
555
|
|
|
526
556
|
デフォルトのレーン割当は Artificial Analysis の 2026-07 スナップショット
|
|
@@ -543,6 +573,24 @@ work の別名ではありません。サービス管理など、work の境界
|
|
|
543
573
|
|
|
544
574
|
## 📜 リリース履歴
|
|
545
575
|
|
|
576
|
+
## v0.42.6 の新機能
|
|
577
|
+
|
|
578
|
+
- **「検証済み」が、どう検証されたかを示すようになりました。** 各 overlay マッピングは `evidence_tier` を持ちます。`billed-model` はプロバイダー自身が課金対象のモデル名を返した場合(claude、grok)、`client-echo` は CLI が自ら送信したモデルを記録した場合(codex、agy)、`selector-only` は CLI がセレクターを受け付けただけの場合です。`client-echo` は CLI が控えた注文書、`billed-model` はプロバイダーが発行した領収書です。
|
|
579
|
+
- **報告するだけで、拒否はしません。** ディスパッチは従来どおり `runtime_verified` のみで判断するため、ティアが低くても動いていたレーンが拒否されることはありません。3 つのティアすべてで判定が変わらないことをテストで保証しています。
|
|
580
|
+
- **ティアはベンダーではなく証拠に従います。** 本リリース以前のプローブは `selector-only` として再判定され、課金モデルを返すようになった CLI はコード変更なしに昇格します。
|
|
581
|
+
- **`omnilane doctor` が内訳を表示**し、再プローブすべきベンダーを名指しします。
|
|
582
|
+
- **overlay は実際に実行されるバイナリを固定します。** 従来はパスが `build_overlay.py` に直書きされ、使われていないバージョンを黙って指していました。実際には claude `2.1.266` が実行されているのに、overlay は `2.1.263` をハッシュしていました。
|
|
583
|
+
- **失われた 3 レーンを検出。** `gpt-5.4-mini` は 2026-09-07 のプローブでは通っていましたが、現在は HTTP 400(ChatGPT アカウントの Codex では非対応)を返します。署名済みの overlay はレーンが上流で失われても気付きません。該当の 3 構成は理由付きで `unproven[]` に移り、マッピングは 46 件になりました。
|
|
584
|
+
- **アップグレード。** npm 公開後は `npm i -g omnilane@0.42.6` を実行してください。
|
|
585
|
+
|
|
586
|
+
## v0.42.5 の新機能
|
|
587
|
+
|
|
588
|
+
- **1 つの CLI 更新が全ベンダーを止めることはなくなりました。** overlay の evidence に `vendor` タグを付与でき、タグ付きエントリのハッシュ差異やファイル消失は当該ベンダーのみを `unknown-target-runtime` に降格させます。タグなしの evidence は従来どおり全体を fail-closed にします。
|
|
589
|
+
- **`omnilane doctor` が overlay を読み込みます。** 新しい `transport-overlay` チェックは失敗時に該当ファイルとベンダーを示し、成功時はベンダーごとの検証済みマッピング数を報告します。
|
|
590
|
+
- **プローブが判定を記録します。** `probe.py` は課金された `modelUsage` で Claude の応答を判定し、CLI が不明な `--effort` を既定値へ黙って置き換えた場合を失敗とします。`build_overlay.py` は不合格のプローブに署名せず、overlay の `unproven[]` に記録します。
|
|
591
|
+
- **再構築ツールをバージョン管理下へ。** `build_overlay.py` と `probe.py` は `scripts/lib/` に移り、`--root` を受け取ります。
|
|
592
|
+
- **アップグレード。** npm 公開後は `npm i -g omnilane@0.42.5` を実行してください。
|
|
593
|
+
|
|
546
594
|
## v0.42.4 の新機能
|
|
547
595
|
|
|
548
596
|
- **クイックスタートが実際に動くようになりました。** `omnilane route` は「誰が依頼しているか」を必要としますが、60 秒クイックスタートにその記載が無く、新規インストールでは案内無しに `missing-caller-context` で拒否されていました。今は `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` で人間の操作者を一度宣言し、モデル呼び出し元が代わりに渡すものも説明します。
|
package/README.ko.md
CHANGED
|
@@ -507,6 +507,36 @@ work 는 지정한 디렉터리 안의 변경만 허용하며 모델 연결은
|
|
|
507
507
|
|
|
508
508
|
</details>
|
|
509
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
|
+
|
|
510
540
|
## 📊 기본값과 출처
|
|
511
541
|
|
|
512
542
|
기본 레인 배치는 Artificial Analysis 2026-07 스냅샷(AA 사이트 원본 레코드와
|
|
@@ -528,6 +558,24 @@ work 는 지정한 디렉터리 안의 변경만 허용하며 모델 연결은
|
|
|
528
558
|
|
|
529
559
|
## 📜 릴리스 기록
|
|
530
560
|
|
|
561
|
+
## v0.42.6 새 기능
|
|
562
|
+
|
|
563
|
+
- **"검증됨"이 어떻게 검증했는지도 알려줍니다.** 각 overlay 매핑은 `evidence_tier`를 가집니다. `billed-model`은 공급자가 과금한 모델을 직접 밝힌 경우(claude, grok), `client-echo`는 CLI가 자신이 보낸 모델을 기록한 경우(codex, agy), `selector-only`는 CLI가 셀렉터를 받아들이기만 한 경우입니다. `client-echo`는 CLI가 적어 둔 주문서이고, `billed-model`은 공급자가 발행한 영수증입니다.
|
|
564
|
+
- **보고만 하고 막지 않습니다.** 디스패치는 여전히 `runtime_verified`만으로 결정되므로, 낮은 등급이 기존에 동작하던 레인을 거부하는 일은 없습니다. 세 등급 모두에서 판정이 동일함을 테스트로 보장합니다.
|
|
565
|
+
- **등급은 공급업체가 아니라 증거를 따릅니다.** 이번 릴리스 이전의 프로브는 `selector-only`로 재판정되며, 과금 모델을 보고하기 시작한 CLI는 코드 변경 없이 승격됩니다.
|
|
566
|
+
- **`omnilane doctor`가 분포를 표시**하고 다시 프로브할 공급업체를 지목합니다.
|
|
567
|
+
- **overlay는 실제로 실행되는 바이너리를 고정합니다.** 기존에는 경로가 `build_overlay.py`에 하드코딩되어 사용되지 않는 버전을 조용히 가리켰습니다. 모든 디스패치가 claude `2.1.266`을 실행하는 동안 overlay는 `2.1.263`을 해시하고 있었습니다.
|
|
568
|
+
- **죽은 레인 3개를 찾았습니다.** `gpt-5.4-mini`는 2026-09-07 프로브에서는 통과했지만 지금은 HTTP 400(ChatGPT 계정의 Codex에서는 미지원)을 반환합니다. 서명된 overlay는 레인이 상류에서 사라져도 알아차리지 못합니다. 해당 3개 구성은 이유와 함께 `unproven[]`으로 이동했고, 매핑은 46개가 되었습니다.
|
|
569
|
+
- **업그레이드.** npm 게시 후 `npm i -g omnilane@0.42.6`를 실행하세요.
|
|
570
|
+
|
|
571
|
+
## v0.42.5 새 기능
|
|
572
|
+
|
|
573
|
+
- **CLI 하나를 업그레이드해도 모든 벤더가 막히지 않습니다.** overlay evidence 항목에 `vendor` 태그를 붙일 수 있으며, 태그가 있는 항목의 해시가 바뀌거나 파일이 사라지면 해당 벤더만 `unknown-target-runtime`으로 강등됩니다. 태그가 없는 evidence는 기존처럼 전체 fail-closed입니다.
|
|
574
|
+
- **`omnilane doctor`가 overlay를 로드합니다.** 새 `transport-overlay` 검사는 실패 시 문제가 된 파일과 벤더를 지목하고, 성공 시 벤더별 검증된 매핑 수를 보고합니다.
|
|
575
|
+
- **프로브가 판정을 기록합니다.** `probe.py`는 청구된 `modelUsage`로 Claude 응답을 판정하며, CLI가 알 수 없는 `--effort`를 기본값으로 조용히 대체한 경우를 실패로 처리합니다. `build_overlay.py`는 통과하지 못한 프로브에 서명하지 않고 overlay의 `unproven[]`에 기록합니다.
|
|
576
|
+
- **재빌드 도구를 버전 관리로.** `build_overlay.py`와 `probe.py`는 `scripts/lib/`로 옮겼고 `--root`를 받습니다.
|
|
577
|
+
- **업그레이드.** npm 게시 후 `npm i -g omnilane@0.42.5`를 실행하세요.
|
|
578
|
+
|
|
531
579
|
## v0.42.4 새 기능
|
|
532
580
|
|
|
533
581
|
- **퀵스타트가 실제로 동작합니다.** `omnilane route` 는 «누가 요청하는지»를 알아야 하지만 60초 시작에 그 내용이 없어, 새 설치에서는 안내 없이 `missing-caller-context` 로 거부되었습니다. 이제 `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 로 사람 운영자를 한 번 선언하며, 모델 호출자가 대신 전달할 것도 설명합니다.
|
package/README.md
CHANGED
|
@@ -379,6 +379,7 @@ omnilane ui status # report whether the Live UI is r
|
|
|
379
379
|
omnilane ui url # print the current authenticated local URL
|
|
380
380
|
omnilane ui stop # stop the Live UI
|
|
381
381
|
omnilane doctor [--json] [--strict] [--probe V] [--probe-timeout SEC] # live probe is opt-in
|
|
382
|
+
# transport-overlay check names a stale vendor
|
|
382
383
|
omnilane benchmark [--json] [--run] [--vendor V] [--cost-per-call V=USD] # dry-run by default
|
|
383
384
|
dispatch.sh [--background] [--dry-run] [--thread NAME] [--mode advise|work|sysops] [--workdir DIR]
|
|
384
385
|
[--vendor V] [--model M] [--effort E] [--timeout SEC] [--job-timeout SEC]
|
|
@@ -615,6 +616,66 @@ so one command can never spiral into a chain of agents spending your quota.
|
|
|
615
616
|
|
|
616
617
|
</details>
|
|
617
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
|
+
|
|
650
|
+
<details>
|
|
651
|
+
<summary><b>What does my mapping's evidence tier mean?</b></summary>
|
|
652
|
+
|
|
653
|
+
<br/>
|
|
654
|
+
|
|
655
|
+
It says how strongly the probe pinned down who answered. It does not affect
|
|
656
|
+
whether you can dispatch.
|
|
657
|
+
|
|
658
|
+
`billed-model` — the provider named the model it charged for. Claude reports it
|
|
659
|
+
in `modelUsage`; grok reports it the same way under `--output-format json`. This
|
|
660
|
+
is the provider's receipt.
|
|
661
|
+
|
|
662
|
+
`client-echo` — the CLI wrote down the model it asked for, and that record
|
|
663
|
+
matches your request. Codex keeps it in the session rollout; agy writes it to
|
|
664
|
+
`cli.log`. This is the CLI's copy of your order, not the provider's receipt: it
|
|
665
|
+
proves the request left as intended, not who served it.
|
|
666
|
+
|
|
667
|
+
`selector-only` — the CLI accepted the selector and reported nothing further.
|
|
668
|
+
Every mapping probed before v0.42.6 reads this way. It still dispatches; it is
|
|
669
|
+
simply the weakest of the three, and `omnilane doctor` names the vendors worth
|
|
670
|
+
re-probing.
|
|
671
|
+
|
|
672
|
+
None of the three certifies upstream provider identity, and none of them can
|
|
673
|
+
refuse a lane. The tier is derived from what a probe produced rather than from
|
|
674
|
+
the vendor, so a CLI that starts reporting a billed model is promoted on its
|
|
675
|
+
next sweep with no change to omnilane.
|
|
676
|
+
|
|
677
|
+
</details>
|
|
678
|
+
|
|
618
679
|
## 📊 Defaults and provenance
|
|
619
680
|
|
|
620
681
|
Default lane assignments follow Artificial Analysis coding/intelligence data
|
|
@@ -638,6 +699,24 @@ working notes, including per-benchmark caveats, live in
|
|
|
638
699
|
|
|
639
700
|
## 📜 Release history
|
|
640
701
|
|
|
702
|
+
## What's new in v0.42.6
|
|
703
|
+
|
|
704
|
+
- **A verified mapping now says how it was verified.** Each overlay mapping carries an `evidence_tier`: `billed-model` when the provider named the model it charged for (Claude, grok), `client-echo` when the CLI recorded the model it asked for (codex, agy), `selector-only` when the CLI accepted the selector and said nothing more. `client-echo` is the CLI's copy of your order; `billed-model` is the provider's receipt.
|
|
705
|
+
- **Reported, never enforced.** Dispatch still turns on `runtime_verified` alone, so a weaker tier never refuses a lane that used to run. A test asserts every decision is unchanged under all three tiers.
|
|
706
|
+
- **The tier follows the evidence, not the vendor.** A sweep predating this release re-judges as `selector-only`, and a CLI that begins reporting a billed model is promoted with no code change.
|
|
707
|
+
- **`omnilane doctor` shows the spread** and names the vendors worth re-probing.
|
|
708
|
+
- **Overlay evidence anchors the binary that runs.** Paths were written into `build_overlay.py` and drifted out of use silently — the live overlay hashed claude `2.1.263` while every dispatch ran `2.1.266`. Core evidence now resolves the executable the runners resolve.
|
|
709
|
+
- **Three dead lanes found.** `gpt-5.4-mini` passed its probe on 2026-09-07 and now returns HTTP 400 — "not supported when using Codex with a ChatGPT account". A signed overlay never notices a lane dying upstream; the re-probe did. Those three configurations move to `unproven[]` with that reason attached, leaving 46 mappings.
|
|
710
|
+
- **Upgrade.** After npm publication, run `npm i -g omnilane@0.42.6`. Existing repo-symlink installations can update their checkout and verify `omnilane --version` without rerunning installation.
|
|
711
|
+
|
|
712
|
+
## What's new in v0.42.5
|
|
713
|
+
|
|
714
|
+
- **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.
|
|
715
|
+
- **`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.
|
|
716
|
+
- **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.
|
|
717
|
+
- **Rebuild tooling is versioned.** `build_overlay.py` and `probe.py` live in `scripts/lib/` and take `--root`.
|
|
718
|
+
- **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.
|
|
719
|
+
|
|
641
720
|
## What's new in v0.42.4
|
|
642
721
|
|
|
643
722
|
- **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.
|
package/README.zh-CN.md
CHANGED
|
@@ -481,6 +481,57 @@ scripts/dispatch.sh --dry-run hardest-coding "…" # 完整解析后的计划,
|
|
|
481
481
|
|
|
482
482
|
</details>
|
|
483
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
|
+
|
|
511
|
+
<details>
|
|
512
|
+
<summary><b>映射上的证据等级是什么意思?</b></summary>
|
|
513
|
+
|
|
514
|
+
<br/>
|
|
515
|
+
|
|
516
|
+
它说明这次探测把「谁回答的」钉到多紧。它**不影响**你能不能派工。
|
|
517
|
+
|
|
518
|
+
`billed-model`——供应商自己说出它计费的模型。claude 放在 `modelUsage`;
|
|
519
|
+
grok 在 `--output-format json` 下也一样。这是供应商开的收据。
|
|
520
|
+
|
|
521
|
+
`client-echo`——CLI 记下自己送出的模型,而且那笔记录与你的请求相符。
|
|
522
|
+
codex 记在 session rollout,agy 写进 `cli.log`。这是 CLI 自己抄的订单,
|
|
523
|
+
不是收据:它证明请求照原样送出去了,不能证明是谁接的。
|
|
524
|
+
|
|
525
|
+
`selector-only`——CLI 收下选择器,其余不表态。v0.42.6 之前探测的每一条映射
|
|
526
|
+
都是这一级。它照样能派工,只是三级里最弱的一级;`omnilane doctor` 会点名
|
|
527
|
+
哪几家值得重探。
|
|
528
|
+
|
|
529
|
+
三者都不能证明上游供应商身分,也都不会让任何车道被拒。等级是从探测产出的
|
|
530
|
+
东西推导出来的,不是按厂商指定,所以哪支 CLI 开始汇报计费模型,下一次重探
|
|
531
|
+
就会自动升级,omnilane 不用改。
|
|
532
|
+
|
|
533
|
+
</details>
|
|
534
|
+
|
|
484
535
|
## 📊 默认值与数据来源
|
|
485
536
|
|
|
486
537
|
默认通道配置依据 Artificial Analysis 2026-07 快照(已对 AA 站上原始记录与
|
|
@@ -503,6 +554,24 @@ scripts/dispatch.sh --dry-run hardest-coding "…" # 完整解析后的计划,
|
|
|
503
554
|
|
|
504
555
|
## 📜 版本历程
|
|
505
556
|
|
|
557
|
+
## v0.42.6 新功能
|
|
558
|
+
|
|
559
|
+
- **「已验证」现在会说明是怎么验的。** 每条 overlay 映射带一个 `evidence_tier`:`billed-model` 是供应商自己说出计费的模型(claude、grok),`client-echo` 是 CLI 记下自己送出的模型(codex、agy),`selector-only` 是 CLI 收下选择器、其余不表态。`client-echo` 是 CLI 自己抄的订单,`billed-model` 是供应商开的收据。
|
|
560
|
+
- **只汇报,不拦截。** 派工照旧只看 `runtime_verified`,等级低不会让原本跑得动的车道被拒。已有测试确认三种等级下每个判定都不变。
|
|
561
|
+
- **等级跟着证据走,不跟着厂商走。** 本次发布之前的探测会重判为 `selector-only`;哪天某支 CLI 开始汇报计费模型,不改代码就自动升级。
|
|
562
|
+
- **`omnilane doctor` 显示分布**,并点名哪几家值得重探。
|
|
563
|
+
- **overlay 锚定的是真正在跑的可执行文件。** 过去路径写死在 `build_overlay.py` 里,会无声地锚到没在用的版本——线上 overlay 哈希的是 claude `2.1.263`,但每次派工跑的都是 `2.1.266`。
|
|
564
|
+
- **抓到三条已死的车道。** `gpt-5.4-mini` 在 2026-09-07 探测还会过,现在回 HTTP 400——「ChatGPT 账号使用 Codex 时不支持此模型」。签好的 overlay 永远不会发现某条车道在上游死掉,重探才会。那三条移进 `unproven[]` 并附上原因,映射剩 46 条。
|
|
565
|
+
- **升级。** npm 发布后运行 `npm i -g omnilane@0.42.6`。既有的 repo symlink 安装更新检出后确认 `omnilane --version` 即可。
|
|
566
|
+
|
|
567
|
+
## v0.42.5 新功能
|
|
568
|
+
|
|
569
|
+
- **升级一支 CLI 不再阻断所有厂商。** overlay 的证据项目可带 `vendor` 标签;带标签的项目哈希漂移或文件消失时,只让该厂商降级为 `unknown-target-runtime`。未标签的证据维持全局 fail-closed。
|
|
570
|
+
- **`omnilane doctor` 会加载 overlay。** 新增 `transport-overlay` 检查,失败时指出是哪个文件、哪一家厂商,成功时报告各厂商的已验证映射数。
|
|
571
|
+
- **探测会记录判定。** `probe.py` 以计费的 `modelUsage` 判断 Claude 响应,并在 CLI 静默改用默认强度时判为失败。`build_overlay.py` 拒签未通过的探测,改记入 overlay 的 `unproven[]`。
|
|
572
|
+
- **重建工具纳入版本控制。** `build_overlay.py` 与 `probe.py` 移入 `scripts/lib/`,并接受 `--root`。
|
|
573
|
+
- **升级。** npm 发布后运行 `npm i -g omnilane@0.42.5`。既有的 repo symlink 安装更新检出后确认 `omnilane --version` 即可。
|
|
574
|
+
|
|
506
575
|
## v0.42.4 新功能
|
|
507
576
|
|
|
508
577
|
- **快速上手现在真的跑得起来。** `omnilane route` 必须知道「是谁在问」,但 60 秒上手漏了这件事,新安装照抄会直接吃到 `missing-caller-context` 且没有任何指引。现在会先用 `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 表明操作者身分,并说明模型主控该改用什么。
|
package/README.zh-TW.md
CHANGED
|
@@ -525,6 +525,57 @@ scripts/dispatch.sh --dry-run hardest-coding "…" # 完整解析後的計畫,
|
|
|
525
525
|
|
|
526
526
|
</details>
|
|
527
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
|
+
|
|
555
|
+
<details>
|
|
556
|
+
<summary><b>映射上的證據等級是什麼意思?</b></summary>
|
|
557
|
+
|
|
558
|
+
<br/>
|
|
559
|
+
|
|
560
|
+
它說明這次探測把「誰回答的」釘到多緊。它**不影響**你能不能派工。
|
|
561
|
+
|
|
562
|
+
`billed-model`——供應商自己說出它計費的模型。claude 放在 `modelUsage`;
|
|
563
|
+
grok 在 `--output-format json` 下也一樣。這是供應商開的收據。
|
|
564
|
+
|
|
565
|
+
`client-echo`——CLI 記下自己送出的模型,而且那筆紀錄與你的請求相符。
|
|
566
|
+
codex 記在 session rollout,agy 寫進 `cli.log`。這是 CLI 自己抄的訂單,
|
|
567
|
+
不是收據:它證明請求照原樣送出去了,不能證明是誰接的。
|
|
568
|
+
|
|
569
|
+
`selector-only`——CLI 收下選擇器,其餘不表態。v0.42.6 之前探測的每一條映射
|
|
570
|
+
都是這一級。它照樣能派工,只是三級裡最弱的一級;`omnilane doctor` 會點名
|
|
571
|
+
哪幾家值得重探。
|
|
572
|
+
|
|
573
|
+
三者都不能證明上游供應商身分,也都不會讓任何車道被拒。等級是從探測產出的
|
|
574
|
+
東西推導出來的,不是按廠商指定,所以哪支 CLI 開始回報計費模型,下一次重探
|
|
575
|
+
就會自動升級,omnilane 不用改。
|
|
576
|
+
|
|
577
|
+
</details>
|
|
578
|
+
|
|
528
579
|
## 📊 預設值與資料來源
|
|
529
580
|
|
|
530
581
|
預設通道配置依據 Artificial Analysis 2026-07 快照(已對 AA 站上原始紀錄與
|
|
@@ -544,6 +595,24 @@ scripts/dispatch.sh --dry-run hardest-coding "…" # 完整解析後的計畫,
|
|
|
544
595
|
|
|
545
596
|
## 📜 版本歷程
|
|
546
597
|
|
|
598
|
+
## v0.42.6 新功能
|
|
599
|
+
|
|
600
|
+
- **「已驗證」現在會說明是怎麼驗的。** 每條 overlay 映射帶一個 `evidence_tier`:`billed-model` 是供應商自己說出計費的模型(claude、grok),`client-echo` 是 CLI 記下自己送出的模型(codex、agy),`selector-only` 是 CLI 收下選擇器、其餘不表態。白話說:`client-echo` 是 CLI 自己抄的訂單,`billed-model` 是供應商開的收據。
|
|
601
|
+
- **只回報,不擋人。** 派工照舊只看 `runtime_verified`,等級低不會讓原本跑得動的車道被拒。已有測試確認三種等級下每個判定都不變。
|
|
602
|
+
- **等級跟著證據走,不跟著廠商走。** 本次發布之前的探測會重判為 `selector-only`;哪天某支 CLI 開始回報計費模型,不改程式就自動升級。
|
|
603
|
+
- **`omnilane doctor` 顯示分佈**,並點名哪幾家值得重探。
|
|
604
|
+
- **overlay 錨定的是真正在跑的執行檔。** 過去路徑寫死在 `build_overlay.py` 裡,會無聲地錨到沒在用的版本——線上 overlay 雜湊的是 claude `2.1.263`,但每次派工跑的都是 `2.1.266`。現在改用 runner 實際解析到的執行檔。
|
|
605
|
+
- **抓到三條已死的車道。** `gpt-5.4-mini` 在 2026-09-07 探測還會過,現在回 HTTP 400——「ChatGPT 帳號使用 Codex 時不支援此模型」。簽好的 overlay 永遠不會發現某條車道在上游死掉,重探才會。那三條移進 `unproven[]` 並附上原因,映射剩 46 條。
|
|
606
|
+
- **升級。** npm 發布後執行 `npm i -g omnilane@0.42.6`。既有的 repo symlink 安裝更新檢出後確認 `omnilane --version` 即可,不需重跑安裝。
|
|
607
|
+
|
|
608
|
+
## v0.42.5 新功能
|
|
609
|
+
|
|
610
|
+
- **升級一支 CLI 不再擋掉所有廠商。** overlay 的證據項目可帶 `vendor` 標籤;帶標籤的項目雜湊漂移或檔案消失時,只讓該廠商降級為 `unknown-target-runtime`。未標籤的證據維持全域 fail-closed。
|
|
611
|
+
- **`omnilane doctor` 會載入 overlay。** 新增 `transport-overlay` 檢查,失敗時指名是哪個檔案、哪一家廠商,成功時回報各廠商的已驗證映射數——先前 doctor 全綠可以和「閘門拒絕所有派工」同時成立。
|
|
612
|
+
- **探測會記錄判定。** `probe.py` 以計費的 `modelUsage` 判斷 Claude 回應,並在 CLI 靜默改用預設強度時判為失敗。`build_overlay.py` 拒簽未通過的探測,改記進 overlay 的 `unproven[]`,不再無聲丟棄。
|
|
613
|
+
- **重建工具納入版控。** `build_overlay.py` 與 `probe.py` 移入 `scripts/lib/`,並接受 `--root`。
|
|
614
|
+
- **升級。** npm 發布後執行 `npm i -g omnilane@0.42.5`。既有的 repo symlink 安裝更新檢出後確認 `omnilane --version` 即可,不需重跑安裝。
|
|
615
|
+
|
|
547
616
|
## v0.42.4 新功能
|
|
548
617
|
|
|
549
618
|
- **快速上手現在真的跑得起來。** `omnilane route` 必須知道「是誰在問」,但 60 秒上手漏了這件事,新安裝照抄會直接吃到 `missing-caller-context` 且沒有任何指引。現在會先用 `OMNILANE_AA_OPERATOR_ASSERTED_HUMAN=1` 表明操作者身分,並說明模型主控該改用什麼。
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.42.
|
|
1
|
+
0.42.5
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Omnilane 0.42.5
|
|
2
|
+
|
|
3
|
+
This release stops one vendor's CLI upgrade from refusing every vendor's dispatch,
|
|
4
|
+
makes that failure visible in `omnilane doctor`, and stops the probe harness from
|
|
5
|
+
signing evidence it never read. Routing, scores, and the frozen AA registry are
|
|
6
|
+
unchanged.
|
|
7
|
+
|
|
8
|
+
## Why
|
|
9
|
+
|
|
10
|
+
On 2026-09-09 `agy` was upgraded from 1.1.27 to 1.1.28. That changed its sha256,
|
|
11
|
+
and `apply_transport_overlay` compared every evidence hash in one loop and raised
|
|
12
|
+
on the first mismatch, so `load_registry` failed and **every** dispatch was
|
|
13
|
+
refused:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{"allowed":false,"code":"invalid-policy-input","message":"transport contract evidence changed"}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Only the seven gemini mappings depended on that binary; the other forty-two were
|
|
20
|
+
collateral. `omnilane doctor` reported 19 passed, 0 failed throughout, because no
|
|
21
|
+
check ever loaded the overlay.
|
|
22
|
+
|
|
23
|
+
Re-probing showed the upgrade had changed nothing observable: all six agy
|
|
24
|
+
selectors still answered correctly. The outage was entirely the blast radius of a
|
|
25
|
+
config linter that had been given the authority of a security gate.
|
|
26
|
+
|
|
27
|
+
The same investigation found six `claude-fable-5-1` configurations that had been
|
|
28
|
+
unusable since 2026-09-07. Their probes had failed with a quota refusal, and
|
|
29
|
+
`build_overlay.py` simply omitted them — no record, no warning, nothing for an
|
|
30
|
+
operator to notice.
|
|
31
|
+
|
|
32
|
+
## Changes
|
|
33
|
+
|
|
34
|
+
### Evidence staleness is per vendor
|
|
35
|
+
|
|
36
|
+
- Overlay `evidence[]` entries take an optional `vendor` tag. A tagged entry whose
|
|
37
|
+
hash drifts, or whose file no longer exists, marks that vendor stale and skips
|
|
38
|
+
the `verified` upgrade for its mappings; `decide()` then returns
|
|
39
|
+
`unknown-target-runtime` for that vendor alone.
|
|
40
|
+
- Untagged entries keep the previous global fail-closed behaviour, so overlays
|
|
41
|
+
built before the tags exist are unaffected.
|
|
42
|
+
- Missing files are treated as staleness, not corruption: the codex and claude
|
|
43
|
+
evidence paths embed version directories, so their upgrades delete the file
|
|
44
|
+
rather than change its digest.
|
|
45
|
+
- Structural overlay checks — schema, snapshot, host, exact identity, selector
|
|
46
|
+
type, effort alignment — remain hard failures.
|
|
47
|
+
|
|
48
|
+
### Doctor loads the overlay
|
|
49
|
+
|
|
50
|
+
- A new `transport-overlay` check loads the configured overlay through
|
|
51
|
+
`aa_policy.load_registry` and names the offending file and vendor on failure.
|
|
52
|
+
It reports per-vendor verified counts on success and warns when a vendor has
|
|
53
|
+
degraded. `live-capable` is unchanged: it answers whether a CLI supports a live
|
|
54
|
+
session, which stays true while the gate refuses the vendor.
|
|
55
|
+
|
|
56
|
+
### Probes record a verdict
|
|
57
|
+
|
|
58
|
+
- `probe.py` now derives a `verdict`, `verdict_reason`, `observed_model`, and
|
|
59
|
+
`probed_at` from the raw evidence through a pure function, per vendor:
|
|
60
|
+
- Claude responses are judged on `modelUsage` — the billed model the CLI
|
|
61
|
+
reports — plus `is_error`, and are failed when stderr shows the CLI silently
|
|
62
|
+
substituted the default effort for an unknown `--effort`. Effort is half of a
|
|
63
|
+
scored identity, so that path would otherwise certify a mapping at the wrong
|
|
64
|
+
tier while exit status, `is_error`, `modelUsage`, and the expected token all
|
|
65
|
+
look correct.
|
|
66
|
+
- grok and agy reject invalid input outright, so exit status and a clean stderr
|
|
67
|
+
are sufficient.
|
|
68
|
+
- codex prints a banner to stderr on every run, so stderr is recorded for review
|
|
69
|
+
rather than treated as failure.
|
|
70
|
+
- `build_overlay.py` refuses to sign a non-passing probe and records it in a new
|
|
71
|
+
`unproven[]` block with its reason, so a quota refusal is visible instead of
|
|
72
|
+
silently dropping configurations. Evidence predating the verdict field is
|
|
73
|
+
still signed, with a warning naming each legacy entry.
|
|
74
|
+
- The six `claude-fable-5-1` and `claude-fable-5` configurations are listed in
|
|
75
|
+
the probe table so their failures reach `unproven[]`. Re-probing them on
|
|
76
|
+
2026-09-09 returned the same quota refusal as on 09-07, so they remain
|
|
77
|
+
unusable — but `omnilane doctor` now says so rather than leaving an operator
|
|
78
|
+
to discover it from a refused dispatch.
|
|
79
|
+
- `build_overlay.py` and `probe.py` moved from an untracked `.rollback` sweep
|
|
80
|
+
directory into `scripts/lib/`, and take `--root`; overlay rebuilds no longer
|
|
81
|
+
depend on a directory that a cleanup can delete.
|
|
82
|
+
|
|
83
|
+
## Verification boundary
|
|
84
|
+
|
|
85
|
+
A passing probe proves the CLI accepted the selector and, for Claude, that the
|
|
86
|
+
billed model matches the request. It still does not certify upstream provider
|
|
87
|
+
identity, and `upstream_identity_verified` remains `false`. grok, agy, and codex
|
|
88
|
+
expose no equivalent of `modelUsage` in the evidence captured so far.
|
|
89
|
+
|
|
90
|
+
The frozen AA registry and its approved SHA are unchanged. Coverage remains 78
|
|
91
|
+
scored targets, and the host overlay still verifies 49 mappings — codex 26,
|
|
92
|
+
claude 11, gemini 7, grok 5.
|
|
93
|
+
|
|
94
|
+
## Upgrade
|
|
95
|
+
|
|
96
|
+
Existing overlays keep working untouched. To gain per-vendor degradation, rebuild
|
|
97
|
+
the overlay with the new `build_overlay.py` so its evidence carries vendor tags.
|
|
98
|
+
Run `omnilane doctor` afterwards and confirm the `transport-overlay` check reports
|
|
99
|
+
the vendor counts you expect.
|