diff --git a/adoption/templates/systemd/omniroute.service b/adoption/templates/systemd/omniroute.service index 61c1f256c..d12d5e839 100644 --- a/adoption/templates/systemd/omniroute.service +++ b/adoption/templates/systemd/omniroute.service @@ -38,11 +38,13 @@ # Generate it without printing any value: evidence/artifacts/omniroute-gateway-20260927/scripts/make_server_env.py.txt. # Values in that file override the Environment= lines below (systemd.exec(5), EnvironmentFile=). # -# The lsof shim. shim/ on PATH holds evidence/artifacts/omniroute-gateway-20260927/scripts/lsof-shim.sh.txt. Without -# it, serve's port preflight (bin/cli/commands/serve.mjs L252-261 at a58000c7 and 81c9b6da) reads null.length on a free -# port whenever lsof exits 1, and serve exits. Upstream 8183e9b79 (#14812, resolveServeBusyPids in serve.mjs) fixes this -# and is in 2f42a9ac1, so the shim is redundant on that build; it stays only for continuity with the recorded units. -# Drop the shim/ segment at the next rebuild after a free-port start passes without it. +# The lsof shim. shim/ on PATH holds evidence/artifacts/omniroute-sol-max-20260930/scripts/lsof-shim-v2.sh.txt (v2, sha256 +# b6ae900224df3dc7...; v1, the 2026-09-27 shim, is evidence/artifacts/omniroute-gateway-20260927/scripts/lsof-shim.sh.txt). Upstream's +# port preflight (bin/cli/utils/pid.mjs findListeningPids, used by serve.mjs resolveServeBusyPids) runs `lsof -ti :PORT`, which +# lists CLIENT sockets too: a client's dead pooled connection (CLOSE-WAIT) makes a restart, or systemd's restart after a crash, +# fail with "Port is already in use" although nothing listens. v2 answers that one query with exit status 2, which upstream's own +# fallback for an unusable discovery tool (#14518) turns into a bind probe of the port; a real second listener is still refused. +# v1 (no-match status 1 becomes 0, for the pre-#14812 null.length crash) is redundant since #14812 and does not help with clients. # # Posture. The workstation runs with REQUIRE_API_KEY=false and requireLogin=false by the user's decision, which is # safe on loopback only. Any multi-user or non-loopback host sets REQUIRE_API_KEY=true and keeps the dashboard login. @@ -67,7 +69,7 @@ After=network-online.target [Service] Type=simple EnvironmentFile=%h/.local/share/omniroute/server.env -# shim/ first, so serve's port preflight finds the lsof no-match adaptation (see "The lsof shim" above). +# shim/ first, so serve's port preflight is guarded by the bind probe and not by lsof (see "The lsof shim" above). Environment=PATH=@OMNIROUTE_PREFIX@/shim:@NODE_PREFIX@/bin:/usr/local/bin:/usr/bin:/bin # serve binds 0.0.0.0 when this is unset (bin/cli/utils/serverHost.mjs L16-26); the keyless posture needs loopback. Environment=OMNIROUTE_SERVER_HOST=127.0.0.1 diff --git a/docs/decisions/2026-09-30-omniroute-rebuild.md b/docs/decisions/2026-09-30-omniroute-rebuild.md index 247ad1383..93ff4d858 100644 --- a/docs/decisions/2026-09-30-omniroute-rebuild.md +++ b/docs/decisions/2026-09-30-omniroute-rebuild.md @@ -123,6 +123,8 @@ Every claim carries the evidence class used in the receipt (`receipt.json`, `evi | --- | --- | --- | --- | | #13788 (two commits) | both builds | `/v1/alpha/search` for Codex `web.run` | a release carries it (open upstream PR at the time of writing) | | affinity patch `045aa81f3` | 20128 | keeps a reused session pin ahead of OAuth occupancy | upstream ships an equivalent | +| upstream PR 15167 (`f5d8e150b`, one commit) | 20128 | `gpt-6.1-sol` in the Codex registry and both alias sets, so `max` and the `-max` suffix reach the wire | a release carries it (open upstream PR at the time of writing) | +| `lsof` shim v2 (`b6ae900224df3dc7`) | 20128's new prefix | keeps a client's dead connection from blocking a restart (upstream's bind-probe fallback becomes the preflight guard) | upstream's preflight counts only listeners | | `lsof` shim on `PATH` | both units | port preflight on a free port | redundant now: upstream #14812 (`8183e9b79`, `resolveServeBusyPids`) is in 2f42a9ac1; drop at the next rebuild after a free-port start passes without it | | settings above (512, `compressToolResults` false, headroom off in the engines map) | 20129 | defect mitigations | upstream fixes the defects | @@ -228,13 +230,42 @@ Classes are kept apart. - **Headerless `[ccr]` only** (the first plan, from our fixtures). Superseded by the user's direction to follow upstream. - **Compression on 20128.** Not applied; see below. +## Update 2026-09-30, 06:32Z: 20128 carries upstream PR 15167 (gpt-6.1-sol at max) + +**Why.** The rebuild's residual said `max` clamps to `xhigh` for `gpt-6.1-sol`. The live cost was measured before the restart: 1154 of 1495 `gpt-6.1-sol` +rows since 00:00Z had `max` requested and `xhigh` sent ([`checks/calllog-effort-counts-before-switch.json`](../../evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-before-switch.json)), +native Codex callers included, and the `-max` suffix of the new base was an unknown model id (HTTP 400 with the prefix, 401 without it). The user asked (relayed by the pi-practice session, not seen +first-hand here) for the highest quality on 6.1. + +**Source.** Upstream PR [#15167](https://github.com/diegosouzapw/OmniRoute/pull/15167), head `f5d8e150b79e0901fa18241c7f29bff889b87c14`, one commit, 5 files +23/-0 on release/v3.8.52 (same practice as +the #13788 carry: a cited upstream change, no self-written patch). It applies cleanly, its stable patch-id equals the cherry-pick's, and its registry entries use the capabilities +block whose context (872000) equals the live catalog's. Codex 0.159.2's bundled catalog lists `max` for `gpt-6.1-sol`. + +**Decision.** Carry it on 20128 only. The clamp and the suffix parser are in the Codex executor, which runs only on 20128; 20129's sharedgw node forwards to it. One restart, no +hindsight-live restart, 20129 unchanged (the Gate A owner's conditions). Alternatives: both builds (a second restart for no effect); wait for a release (upstream's release/v3.8.52 and +main lack it); use the body effort only (`max` in the body is the clamped path, the defect itself; the suffix ids `-max` and `-xhigh` were rejected with HTTP 400 before the carry). + +**A hazard found on the way, and its fix in the new prefix only.** `omniroute serve` refuses to start while any client holds a dead connection to its port: its preflight runs +`lsof -ti :PORT`, which lists client sockets, and hindsight-api held such a CLOSE-WAIT socket to 20128 (this is why the 00:02Z switch restarted hindsight-live). Upstream main and +release/v3.8.52 still do it. Shim v2 (`b6ae900224df3dc73fff2a50b3d7206d78895c6147e93e80b62e66d423e69854`; v1 was `b12c64614c54bc86...`) answers that one query with exit status 2, which upstream's own fallback for an unusable discovery tool +(`resolveServeBusyPids`, #14518) turns into a bind probe. Tests with kept outputs: control with shim v1, real `omniroute serve` of the candidate prefix: restart refused; shim v2: same restart +reaches health in 5 s; a second real instance is still refused. The previous prefix and 20129's prefix keep v1 (residual). + +**Applied.** 2026-09-30T06:32:50Z, `switch_gateways.py --only 20128`: three unit lines changed (Description, the PATH shim segment, ExecStart), MainPID 950031 to 3262255, 20129 and hindsight-live +untouched, no settings write, rollback copy in the switch directory. Probe gate before and after: `gpt-6.1-sol` with body `max` went from `xhigh` to `max` upstream, the suffix ids and the +bare id answer 200 with the right effort, astra stays `max`, a 0.157.1 client request answers 200. The gateway's context-window reconciler removed one automatic override row on restart +(same 872000 now in the registry). Everything is in [`evidence/artifacts/omniroute-sol-max-20260930/`](../../evidence/artifacts/omniroute-sol-max-20260930/receipt.json). + +**Also recorded.** The sharedgw connection expiry of 05:50Z to 05:55Z (claim C9): my baseline probe sent `sharedgw/gpt-6.1-sol-max` before the carry; 20128 answered 401 and 20129 parked the node's +only connection as expired for all callers until the dashboard's Test connection restored it. Upstream has no fix; the probe script now sends a lane request only after the bare id answered 200. + ## Comparison that would overturn it - The tip's `check:pack-boot` or a later unit run shows a defect the carries cause; then rebuild without the carry. - Upstream merges #13788 into a release or `main`: drop the carry. Upstream ships an equivalent of the affinity patch: drop it. Upstream fixes the session-dedup key collision, the integer re-encoding or the Responses tool-loop truncation: restore the upstream default of the matching setting (80, headroom on, `compressToolResults` true). -- Upstream lists `gpt-6.1-sol` in `CODEX_MAX_ALIAS_MODELS`: `max` stops clamping to `xhigh` for it. +- Upstream merges PR 15167 into a release: drop that carry (20128 carries it since 2026-09-30T06:32:50Z). - A measured drop of the cache-read share on 20128 traffic that arrives through the `sharedgw` hop (baseline 93.8% over 573 rows, reported by the pi-practice session, not reproduced here) after headerless dedup, beyond what the user accepts. - A first-time `apply_patch` failure, or another exact-match failure, traced to lite's whitespace folding on traffic through either @@ -263,8 +294,8 @@ Classes are kept apart. outputs of older models and very long sessions with large tool outputs. The Gate A owner's stated preference is off through the windows, and any change must land at least 6 h before the seal announcement with a new owner record. (b) `blockedProviders` and `noAuthFallbackDisabledProviders`, which the apply contract cannot read back. -- `max` effort on `gpt-6.1-sol` clamps to `xhigh` (static alias sets in `reasoningSuffix.ts`; a two-line local patch - would lift it and is not applied). +- `max` effort on `gpt-6.1-sol` clamped to `xhigh` on the rebuild (static alias sets in `reasoningSuffix.ts`); 20128 carries upstream PR 15167 + since 2026-09-30T06:32:50Z and sends `max` (update below); 20129 forwards and never had the clamp. - The live canary of the token-save settings (12 requests) waits for Codex capacity (2026-10-04T00:35Z); the output style it would have measured is now off. The cache-share effect of headerless dedup is unmeasured until the pi runs report. - The Opus review of the first plan returned twelve defects (three medium); the workflow was stopped in its fix stage, diff --git a/docs/foundation-stack.md b/docs/foundation-stack.md index b2f133988..1e14e0505 100644 --- a/docs/foundation-stack.md +++ b/docs/foundation-stack.md @@ -215,12 +215,12 @@ For owned lifecycle, preserve the same DATA_DIR/secrets through restart. Upstrea Since 2026-09-27 the workstation's gateway pools its Codex accounts for GPT-6 lanes. The [decision record](decisions/2026-09-27-omniroute-account-pool.md) holds the reasons, the keyless loopback posture and its risk, and the overturn conditions. Its [evidence](../evidence/artifacts/omniroute-gateway-20260927/README.md) holds the 2026-09-27 build's provenance, its installed unit and the probes. Both gateways were rebuilt on 2026-09-30 ([decision](decisions/2026-09-30-omniroute-rebuild.md), [evidence](../evidence/artifacts/omniroute-rebuild-20260930/README.md)). **What runs.** Two source builds of upstream's default branch `release/v3.8.51` at [`2f42a9ac1`](https://github.com/diegosouzapw/OmniRoute/commit/2f42a9ac19d1a247ec9ce5473b790843724b3061) (upstream tagged `v3.8.51` later, on the same tree; see the decision record): -- **20128**, `omniroute.service`, the shared gateway: build `ae5539a56`. It carries the open upstream PR [#13788](https://github.com/diegosouzapw/OmniRoute/pull/13788) (`/v1/alpha/search`, which Codex's standalone `web.run` calls) and the local affinity patch, which keeps a reused session pin ahead of OmniRoute's OAuth occupancy re-pick. +- **20128**, `omniroute.service`, the shared gateway: build `cf6748d04` (since 2026-09-30T06:32Z; `ae5539a56` before). It carries the open upstream PR [#13788](https://github.com/diegosouzapw/OmniRoute/pull/13788) (`/v1/alpha/search`, which Codex's standalone `web.run` calls), the local affinity patch, which keeps a reused session pin ahead of OmniRoute's OAuth occupancy re-pick, and the open upstream PR [#15167](https://github.com/diegosouzapw/OmniRoute/pull/15167) (`gpt-6.1-sol` in the Codex registry and alias sets, so `max` and the `-max` suffix reach the wire). - **20129**, `omniroute-fw.service`, the framework instance: build `87c4c488d`, which is `2f42a9ac1` + #13788. It has its own data directory, and a provider node inside it forwards to 20128. Upstream's merged [#14886](https://github.com/diegosouzapw/OmniRoute/pull/14886) (`7f5de7ba6`, in the base since `81c9b6da`) replaces the 2026-09-27 build's cherry-pick of [#14904](https://github.com/diegosouzapw/OmniRoute/pull/14904). Without such a fix, every `/v1` inference route answered HTTP 500 behind Next 16.3.5's request Proxy on this host's Node 24, as the coordinator reported. A synthetic fixture shows the same `Request` construction failure on Node 26, upstream's Docker base, where the gateway was not run. -The non-upstream deltas are #13788 (both gateways) and the affinity patch (20128 only); the `lsof` shim is still on both units' `PATH` but redundant, because upstream #14812 is in the base. The [decision's deltas table](decisions/2026-09-30-omniroute-rebuild.md#non-upstream-deltas) gives each one's purpose, evidence and the upstream change that retires it. While the affinity patch runs, create no OAuth (Codex) routing combo on 20128 (its standing constraint F1; the [decision record](decisions/2026-09-30-omniroute-rebuild.md#non-upstream-deltas) gives its basis and limits). +The non-upstream deltas are #13788 (both gateways), the affinity patch and #15167 (20128 only); the `lsof` shim is on both units' `PATH`: v1 (redundant since upstream #14812) for 20129 and the previous 20128 prefix, v2 in 20128's new prefix, which makes upstream's bind probe the preflight guard so that a client's dead pooled connection cannot block a restart. The [decision's deltas table](decisions/2026-09-30-omniroute-rebuild.md#non-upstream-deltas) gives each one's purpose, evidence and the upstream change that retires it. While the affinity patch runs, create no OAuth (Codex) routing combo on 20128 (its standing constraint F1; the [decision record](decisions/2026-09-30-omniroute-rebuild.md#non-upstream-deltas) gives its basis and limits). npm published 3.8.51 on 2026-09-30 (the tag's tree equals `2f42a9ac1`'s), so the pin's own condition is met, and the published package passed its own install, boot smoke and provenance check (`evidence/receipts/omniroute-3851-npm-qualification-20260930.json`); the component pin in `manifests/stack.json` is still 3.8.50, and moving it is a separate change to that shared file. Upstream already carries the fix, #14886. @@ -242,8 +242,8 @@ npm published 3.8.51 on 2026-09-30 (the tag's tree equals `2f42a9ac1`'s), so the Serve's port preflight counts any process with a socket on the port, a client in CLOSE_WAIT included, as the port's owner (`lsof -ti :PORT`, `bin/cli/utils/pid.mjs` L86). So before restarting 20128, restart the clients that hold connections to it, such as `hindsight-live.service`. - **Effort.** `a58000c7` caps `gpt-6-astra` at `ultra` ([`reasoningSuffix.ts` L11-31](https://github.com/diegosouzapw/OmniRoute/blob/a58000c7685f4091c7a6fd8ddf3ebce7d2ec67c3/open-sse/executors/codex/reasoningSuffix.ts#L11-L31)), and sends `max` on the wire for `ultra` ([`codex.ts` L1463](https://github.com/diegosouzapw/OmniRoute/blob/a58000c7685f4091c7a6fd8ddf3ebce7d2ec67c3/open-sse/executors/codex.ts#L1463)). - The gateway's `call_logs` recorded `max` requested and `max` upstream on `bf0255649`, the 2026-09-27 build before #13788 was added. - - `reasoningSuffix.ts` and both `codexClient.ts` files are byte-identical at `2f42a9ac1` (`codex.ts` changed only in upstream's #15119, which moves `getResponsesSubpath` into its own file and makes it refuse path traversal). No live effort observation has been recorded on the rebuilt gateways. - - `gpt-6.1-sol` is in neither alias set, so `max` clamps to `xhigh` for it until upstream lists it. + - `reasoningSuffix.ts` and both `codexClient.ts` files are byte-identical at `2f42a9ac1` (`codex.ts` changed only in upstream's #15119, which moves `getResponsesSubpath` into its own file and makes it refuse path traversal). The effort actually sent upstream is recorded in `call_logs` for rows with encrypted reasoning (`reasoning_effort_upstream`; NULL means absent, not none sent); the 2026-09-30 update of the decision record has the before and after. + - `gpt-6.1-sol` was in neither alias set on the rebuild, so `max` clamped to `xhigh` for it; 20128 carries upstream PR 15167 since 2026-09-30T06:32Z and sends `max`. Keep Thinking Budget `passthrough`. - **Compression.** `a58000c7` compresses native Codex passthrough when compression is on; `chatCore.ts` changes at `2f42a9ac1`, and the comment that advises excluding `codex/*` is now at L1437. diff --git a/evidence/artifacts/omniroute-sol-max-20260930/README.md b/evidence/artifacts/omniroute-sol-max-20260930/README.md new file mode 100644 index 000000000..0b0572212 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/README.md @@ -0,0 +1,20 @@ +# 20128 at max effort for gpt-6.1-sol: upstream PR 15167 on the running build, 2026-09-30 + +Record of the restart of the 20128 gateway (`omniroute.service`) at 2026-09-30T06:32:50Z onto build `cf6748d04` (the running build `ae5539a56` plus the one commit of +upstream PR 15167, head `f5d8e150b79e0901fa18241c7f29bff889b87c14`), of its qualification and of the read-backs; claims, evidence classes and residuals are in `receipt.json`. The decision is the +2026-09-30 update in [`docs/decisions/2026-09-30-omniroute-rebuild.md`](../../../docs/decisions/2026-09-30-omniroute-rebuild.md). + +| Files | What they are | Class | +| --- | --- | --- | +| `checks/upstream-pr-15167-identity.txt`, `checks/codex-bundled-catalog-0159.2.txt` | the PR's identity and patch-ids from git alone; the effort levels Codex 0.159.2 lists for the GPT-6 models | source review | +| `checks/calllog-effort-counts-before-switch.json`, `checks/calllog-effort-counts-after-switch.json` | counts of requested and upstream effort per model from 20128's call_logs (metadata columns, read-only) | our check | +| `checks/effort-wire-*.json` | what the Codex executor would put on the wire for 13 requests, on the running build's source and on the candidate's | our check | +| `checks/qualification-*.txt` | install, boot smoke (shim v1 as installed), upstream check:pack-boot, targeted tests on the candidate and on the running build's source | upstream check and our check | +| `checks/preflight-*.txt`, `checks/preflight-*.json` | the restart-blocking preflight trap (control with shim v1), the fix with shim v2, a second real instance still refused, and the scratch-port tables | our check | +| `checks/switch-output.txt`, `checks/readback-after-switch.txt`, `checks/unit-before-after.diff`, `checks/omniroute.service.after-switch.txt` | the switch script's output, the units' states and hashes, the three changed unit lines, the installed unit | our check | +| `checks/owner-record-*.json`, `checks/owner-record-diff.txt` | `gateway_record.py` (schema 2, both ports) before and after, and the path-by-path difference | our check | +| `checks/probe-gate-before-switch.json`, `checks/probe-gate-after-switch.json` | the same probe script before and after: statuses and the effort columns of each request | live model calls | +| `checks/sharedgw-connection-expiry-20260930.txt` | the 05:50Z to 05:55Z incident on 20129's sharedgw node and its repair (a transcription of printed outputs) | our check | +| `scripts/` | the harness as it ran, `lsof-shim-v2.sh.txt` (sha256 `b6ae900224df3dc73fff2a50b3d7206d78895c6147e93e80b62e66d423e69854`), and the diff of `switch_gateways.py` | our tools, not upstream | + +Host paths are masks (``, ``, ``, ``, ``, ``); colour codes are removed; nothing else in an output is edited. diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-after-switch.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-after-switch.json new file mode 100644 index 000000000..ac59b69fc --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-after-switch.json @@ -0,0 +1,43 @@ +{ + "observed_utc": "2026-09-30T06:34:09Z", + "store": "omniroute", + "since": "2026-09-30T06:30:03Z", + "filter": "gpt-6", + "groups": [ + { + "model": "gpt-6.1-sol-max", + "requested": "-", + "upstream": "max", + "reasoning_source": "encrypted", + "n": 3 + }, + { + "model": "gpt-6-astra-max", + "requested": "-", + "upstream": "max", + "reasoning_source": "encrypted", + "n": 1 + }, + { + "model": "gpt-6-sol", + "requested": "low", + "upstream": "low", + "reasoning_source": "encrypted", + "n": 1 + }, + { + "model": "gpt-6.1-sol", + "requested": "max", + "upstream": "max", + "reasoning_source": "encrypted", + "n": 1 + }, + { + "model": "gpt-6.1-sol-xhigh", + "requested": "-", + "upstream": "xhigh", + "reasoning_source": "encrypted", + "n": 1 + } + ] +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-before-switch.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-before-switch.json new file mode 100644 index 000000000..26a678c0a --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-before-switch.json @@ -0,0 +1,99 @@ +{ + "observed_utc": "2026-09-30T06:14:30Z", + "store": "omniroute", + "since": "2026-09-30T00:00:00Z", + "filter": "gpt-6", + "groups": [ + { + "model": "gpt-6.1-sol", + "requested": "max", + "upstream": "xhigh", + "reasoning_source": "encrypted", + "n": 1154 + }, + { + "model": "gpt-6.1-sol", + "requested": "-", + "upstream": "-", + "reasoning_source": null, + "n": 271 + }, + { + "model": "gpt-6-astra", + "requested": "max", + "upstream": "max", + "reasoning_source": "encrypted", + "n": 270 + }, + { + "model": "gpt-6-astra-max", + "requested": "max", + "upstream": "max", + "reasoning_source": "encrypted", + "n": 108 + }, + { + "model": "gpt-6-astra-ultra", + "requested": "max", + "upstream": "max", + "reasoning_source": "encrypted", + "n": 102 + }, + { + "model": "gpt-6-astra", + "requested": "-", + "upstream": "-", + "reasoning_source": null, + "n": 89 + }, + { + "model": "gpt-6.1-sol", + "requested": "xhigh", + "upstream": "xhigh", + "reasoning_source": "encrypted", + "n": 70 + }, + { + "model": "gpt-6-astra-ultra", + "requested": "-", + "upstream": "-", + "reasoning_source": null, + "n": 41 + }, + { + "model": "gpt-6-luna", + "requested": "-", + "upstream": "-", + "reasoning_source": null, + "n": 30 + }, + { + "model": "gpt-6-astra-max", + "requested": "-", + "upstream": "-", + "reasoning_source": null, + "n": 26 + }, + { + "model": "gpt-6-sol", + "requested": "-", + "upstream": "-", + "reasoning_source": null, + "n": 14 + }, + { + "model": "gpt-6-astra-max", + "requested": "-", + "upstream": "max", + "reasoning_source": "encrypted", + "n": 3 + }, + { + "model": "gpt-6-sol", + "requested": "low", + "upstream": "low", + "reasoning_source": "encrypted", + "n": 1 + } + ] +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/codex-bundled-catalog-0159.2.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/codex-bundled-catalog-0159.2.txt new file mode 100644 index 000000000..e8cb19805 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/codex-bundled-catalog-0159.2.txt @@ -0,0 +1,5 @@ +codex --version: codex-cli 0.159.2 +models in the bundled catalog: 11 +gpt-6-astra: default low, levels ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'], context_window 272000, max_context_window 872000 +gpt-6.1-sol: default low, levels ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'], context_window 272000, max_context_window 872000 +gpt-6-sol: default medium, levels ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'], context_window 272000, max_context_window 872000 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/effort-wire-candidate-B3.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/effort-wire-candidate-B3.json new file mode 100644 index 000000000..77952076f --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/effort-wire-candidate-B3.json @@ -0,0 +1,135 @@ +{ + "note": "wire_* is the body the executor built; nothing was sent. A case with no body effort and no suffix shows the connection default path, which depends on the gateway's thinking-budget setting and the connection defaults (a fresh scratch store here), so it is informational.", + "rows": [ + { + "requested_model": "gpt-6.1-sol", + "body_effort": "max", + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol", + "body_effort": "xhigh", + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "xhigh", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol", + "body_effort": "ultra", + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-max", + "body_effort": null, + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-ultra", + "body_effort": null, + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-xhigh", + "body_effort": null, + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "xhigh", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-high", + "body_effort": null, + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "high", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-max", + "body_effort": "low", + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol", + "body_effort": null, + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "medium", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6-astra-max", + "body_effort": null, + "wire_model": "gpt-6-astra", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6-astra", + "body_effort": "max", + "wire_model": "gpt-6-astra", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6-sol-max", + "body_effort": null, + "wire_model": "gpt-6-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6-sol", + "body_effort": "ultra", + "wire_model": "gpt-6-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + } + ] +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/effort-wire-running-build-B2.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/effort-wire-running-build-B2.json new file mode 100644 index 000000000..bd3e8034a --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/effort-wire-running-build-B2.json @@ -0,0 +1,135 @@ +{ + "note": "wire_* is the body the executor built; nothing was sent. A case with no body effort and no suffix shows the connection default path, which depends on the gateway's thinking-budget setting and the connection defaults (a fresh scratch store here), so it is informational.", + "rows": [ + { + "requested_model": "gpt-6.1-sol", + "body_effort": "max", + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "xhigh", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol", + "body_effort": "xhigh", + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "xhigh", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol", + "body_effort": "ultra", + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "xhigh", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-max", + "body_effort": null, + "wire_model": "gpt-6.1-sol-max", + "wire_reasoning_effort": "medium", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-ultra", + "body_effort": null, + "wire_model": "gpt-6.1-sol-ultra", + "wire_reasoning_effort": "medium", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-xhigh", + "body_effort": null, + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "xhigh", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-high", + "body_effort": null, + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "high", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol-max", + "body_effort": "low", + "wire_model": "gpt-6.1-sol-max", + "wire_reasoning_effort": "low", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6.1-sol", + "body_effort": null, + "wire_model": "gpt-6.1-sol", + "wire_reasoning_effort": "medium", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6-astra-max", + "body_effort": null, + "wire_model": "gpt-6-astra", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6-astra", + "body_effort": "max", + "wire_model": "gpt-6-astra", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6-sol-max", + "body_effort": null, + "wire_model": "gpt-6-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + }, + { + "requested_model": "gpt-6-sol", + "body_effort": "ultra", + "wire_model": "gpt-6-sol", + "wire_reasoning_effort": "max", + "wire_reasoning_keys": [ + "effort", + "summary" + ] + } + ] +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/omniroute.service.after-switch.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/omniroute.service.after-switch.txt new file mode 100644 index 000000000..91ce190a1 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/omniroute.service.after-switch.txt @@ -0,0 +1,30 @@ +[Unit] +Description=OmniRoute gateway 3.8.51 (release/v3.8.51 2f42a9ac1 + upstream #13788 as two commits + local session-affinity patch 045aa81f3 + upstream #15167 f5d8e150b; canary build cf6748d04; lsof shim v2), loopback only +Documentation=https://github.com/diegosouzapw/OmniRoute +After=network-online.target + +[Service] +Type=simple +EnvironmentFile=%h/.local/share/omniroute/server.env +# shim/ holds the lsof no-match adaptation for serve's port preflight (see shim/lsof; remove when upstream fixes it). +Environment=PATH=%h/.local/share/codex-ecosystem/tools/omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167/shim:%h/.local/share/codex-ecosystem/tools/node-24.21.0/bin:/usr/local/bin:/usr/bin:/bin +Environment=OMNIROUTE_MEMORY_MB=16384 +# Caller-version fallback for paths that do not forward the Codex client's own version (src/shared/constants/codexClient.ts). +Environment=CODEX_CLIENT_VERSION=0.159.1 +# Max-effort Astra can reason for minutes before its first content frame; the content-stall watchdog reuses the +# readiness budget (defaults 80 s / 180 s, src/shared/utils/runtimeTimeouts.ts), so both are raised for the lane. +Environment=STREAM_READINESS_TIMEOUT_MS=600000 +Environment=STREAM_READINESS_MAX_TIMEOUT_MS=600000 +# Hard stream lifetime (default 21 min, never reset by upstream bytes); bounded at 1 h, never 0. +Environment=STREAM_ACTIVE_TIMEOUT_MS=3600000 +# Templates stay the single writer for Codex/Claude configs (src/shared/services/cliRuntime.ts). +Environment=CLI_ALLOW_CONFIG_WRITES=false +ExecStart=%h/.local/share/codex-ecosystem/tools/omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167/bin/omniroute serve --port 20128 --no-open --no-tray +Restart=on-failure +RestartSec=5 +TimeoutStopSec=30 +UMask=0077 +NoNewPrivileges=true + +[Install] +WantedBy=default.target diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-after-switch.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-after-switch.json new file mode 100644 index 000000000..a38c2f5ac --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-after-switch.json @@ -0,0 +1,115 @@ +{ + "gateways": { + "20128": { + "build_sha": "cf6748d04", + "overrides": [ + [ + "context_length", + "gpt-5.5", + "codex", + "codex/gpt-5.5", + 272000 + ], + [ + "context_length", + "gpt-5.5-high", + "codex", + "codex/gpt-5.5-high", + 272000 + ], + [ + "context_length", + "gpt-5.5-low", + "codex", + "codex/gpt-5.5-low", + 272000 + ], + [ + "context_length", + "gpt-5.5-medium", + "codex", + "codex/gpt-5.5-medium", + 272000 + ], + [ + "context_length", + "gpt-5.5-xhigh", + "codex", + "codex/gpt-5.5-xhigh", + 272000 + ] + ], + "overrides_rows": 5, + "prefix": "omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167", + "routes": { + "combos": "16e4e6699a56bc53b1a076e92843b6568058a9dbe4abf31af412e2a38fcbae31", + "compression": "13fa45d614767e7002135335bf406b7219ce1dd87c88c49e08ea34927328f215", + "model_capability_overrides_stable": "2f0e6390f2b04044bc462773ac0e7df990245e630abbf331c97e007d08822b92", + "resilience": "92d2060b6ce52f2ee5ba39516e593e4aff675252645c85724d7874cc48d49a7a" + } + }, + "20129": { + "build_sha": "87c4c488d", + "overrides": [ + [ + "context_length", + "cx/gpt-6-astra", + "sharedgw", + "sharedgw/cx/gpt-6-astra", + 872000 + ], + [ + "context_length", + "cx/gpt-6-astra-max", + "sharedgw", + "sharedgw/cx/gpt-6-astra-max", + 872000 + ], + [ + "context_length", + "cx/gpt-6-sol", + "sharedgw", + "sharedgw/cx/gpt-6-sol", + 872000 + ], + [ + "context_length", + "gpt-6-astra-max", + "sharedgw", + "sharedgw/gpt-6-astra-max", + 872000 + ] + ], + "overrides_rows": 4, + "prefix": "omniroute-3.8.51-2f42a9ac-pr13788", + "routes": { + "combos": "06e7009a40b0751c698da86b77706bceeca70a00cbb08de3d3549be8925c5190", + "compression": "5262355b78029f0d2d3317f8491c210ef3473322109ea5d10e8beec9913dabb1", + "model_capability_overrides_stable": "00f7be7ebb5adf215a608bc911a5e9eb1db9d322ed387ea7197956c21d527522", + "resilience": "3ce8a52205a0b58260aa339727de71ba939e8f1007e6504d61045e081528816e" + } + } + }, + "schema": "omniroute-gateway-record/2", + "taken_utc": "2026-09-30T06:33:02Z", + "units": { + "omniroute-fw.service": { + "active_state": "active", + "dropins": [], + "exec_main_start": "Tue 2026-09-29 20:02:42 EDT", + "main_pid": "945817", + "n_restarts": "0", + "sub_state": "running", + "unit_file_sha256": "fbdace7eeec524e37794432aa4c57ac5a8b4b925ef0b700f70b5e299a951c802" + }, + "omniroute.service": { + "active_state": "active", + "dropins": [], + "exec_main_start": "Wed 2026-09-30 02:32:50 EDT", + "main_pid": "3262255", + "n_restarts": "0", + "sub_state": "running", + "unit_file_sha256": "b7797d7898160c858de7d56695bb97a3ac569c8cfded49affcb66b908528be45" + } + } +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-before-switch.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-before-switch.json new file mode 100644 index 000000000..30f3569db --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-before-switch.json @@ -0,0 +1,122 @@ +{ + "gateways": { + "20128": { + "build_sha": "ae5539a56", + "overrides": [ + [ + "context_length", + "gpt-5.5", + "codex", + "codex/gpt-5.5", + 272000 + ], + [ + "context_length", + "gpt-5.5-high", + "codex", + "codex/gpt-5.5-high", + 272000 + ], + [ + "context_length", + "gpt-5.5-low", + "codex", + "codex/gpt-5.5-low", + 272000 + ], + [ + "context_length", + "gpt-5.5-medium", + "codex", + "codex/gpt-5.5-medium", + 272000 + ], + [ + "context_length", + "gpt-5.5-xhigh", + "codex", + "codex/gpt-5.5-xhigh", + 272000 + ], + [ + "context_length", + "gpt-6.1-sol", + "codex", + "codex/gpt-6.1-sol", + 872000 + ] + ], + "overrides_rows": 6, + "prefix": "omniroute-3.8.51-2f42a9ac-pr13788-affinity2", + "routes": { + "combos": "16e4e6699a56bc53b1a076e92843b6568058a9dbe4abf31af412e2a38fcbae31", + "compression": "13fa45d614767e7002135335bf406b7219ce1dd87c88c49e08ea34927328f215", + "model_capability_overrides_stable": "aa6a53f4e32582c89ed51629608ad3a264ee93a6d46e75223fe2b31593c0576e", + "resilience": "92d2060b6ce52f2ee5ba39516e593e4aff675252645c85724d7874cc48d49a7a" + } + }, + "20129": { + "build_sha": "87c4c488d", + "overrides": [ + [ + "context_length", + "cx/gpt-6-astra", + "sharedgw", + "sharedgw/cx/gpt-6-astra", + 872000 + ], + [ + "context_length", + "cx/gpt-6-astra-max", + "sharedgw", + "sharedgw/cx/gpt-6-astra-max", + 872000 + ], + [ + "context_length", + "cx/gpt-6-sol", + "sharedgw", + "sharedgw/cx/gpt-6-sol", + 872000 + ], + [ + "context_length", + "gpt-6-astra-max", + "sharedgw", + "sharedgw/gpt-6-astra-max", + 872000 + ] + ], + "overrides_rows": 4, + "prefix": "omniroute-3.8.51-2f42a9ac-pr13788", + "routes": { + "combos": "06e7009a40b0751c698da86b77706bceeca70a00cbb08de3d3549be8925c5190", + "compression": "5262355b78029f0d2d3317f8491c210ef3473322109ea5d10e8beec9913dabb1", + "model_capability_overrides_stable": "00f7be7ebb5adf215a608bc911a5e9eb1db9d322ed387ea7197956c21d527522", + "resilience": "3ce8a52205a0b58260aa339727de71ba939e8f1007e6504d61045e081528816e" + } + } + }, + "schema": "omniroute-gateway-record/2", + "taken_utc": "2026-09-30T06:14:30Z", + "units": { + "omniroute-fw.service": { + "active_state": "active", + "dropins": [], + "exec_main_start": "Tue 2026-09-29 20:02:42 EDT", + "main_pid": "945817", + "n_restarts": "0", + "sub_state": "running", + "unit_file_sha256": "fbdace7eeec524e37794432aa4c57ac5a8b4b925ef0b700f70b5e299a951c802" + }, + "omniroute.service": { + "active_state": "active", + "dropins": [], + "exec_main_start": "Tue 2026-09-29 20:02:58 EDT", + "main_pid": "950031", + "n_restarts": "0", + "sub_state": "running", + "unit_file_sha256": "899e4fdb06775216094953815ed2836c2df9be12e26b459558a600742694b097" + } + } +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-diff.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-diff.txt new file mode 100644 index 000000000..4004532c7 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-diff.txt @@ -0,0 +1,14 @@ +paths before: 78, after: 73, different: 13 + /gateways/20128/build_sha: ae5539a56 -> cf6748d04 + /gateways/20128/overrides/5/0: context_length -> None + /gateways/20128/overrides/5/1: gpt-6.1-sol -> None + /gateways/20128/overrides/5/2: codex -> None + /gateways/20128/overrides/5/3: codex/gpt-6.1-sol -> None + /gateways/20128/overrides/5/4: 872000 -> None + /gateways/20128/overrides_rows: 6 -> 5 + /gateways/20128/prefix: omniroute-3.8.51-2f42a9ac-pr13788-affinity2 -> omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15 + /gateways/20128/routes/model_capability_overrides_stable: aa6a53f4e32582c89ed51629608ad3a264ee93a6d46e7522 -> 2f0e6390f2b04044bc462773ac0e7df990245e630abbf331 + /taken_utc: 2026-09-30T06:14:30Z -> 2026-09-30T06:33:02Z + /units/omniroute.service/exec_main_start: Tue 2026-09-29 20:02:58 EDT -> Wed 2026-09-30 02:32:50 EDT + /units/omniroute.service/main_pid: 950031 -> 3262255 + /units/omniroute.service/unit_file_sha256: 899e4fdb06775216094953815ed2836c2df9be12e26b4595 -> b7797d7898160c858de7d56695bb97a3ac569c8cfded49af diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-scratch-port-reproduction.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-scratch-port-reproduction.json new file mode 100644 index 000000000..c5d7be637 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-scratch-port-reproduction.json @@ -0,0 +1,21 @@ +{ + "me": 2540863, + "scratch_port": 25122, + "with_listener_and_client": { + "lsof": [ + 2540863 + ], + "findListeningPids": "[2540863]" + }, + "after_server_gone": { + "client_socket_state": "CLOSE-WAIT", + "lsof": [ + 2540863 + ], + "findListeningPids": "[2540863]" + }, + "after_client_closed": { + "lsof": [], + "findListeningPids": "[]" + } +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-scratch-port-table.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-scratch-port-table.json new file mode 100644 index 000000000..3a4e54c51 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-scratch-port-table.json @@ -0,0 +1,14 @@ +{ + "v1": { + "nothing_there": "[]", + "real_listener_and_client": "[2539511]", + "listener_gone_client_close_wait": "[2539511]", + "client_closed": "[]" + }, + "v2": { + "nothing_there": "[]", + "real_listener_and_client": "[null]", + "listener_gone_client_close_wait": "[]", + "client_closed": "[]" + } +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-second-instance-shim-v2.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-second-instance-shim-v2.txt new file mode 100644 index 000000000..0499b7c87 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-second-instance-shim-v2.txt @@ -0,0 +1,5 @@ +[2026-09-30T06:06:21Z] first instance health: 200 +[2026-09-30T06:06:23Z] second instance exit code: 1 +✖ Port 20197 is already in use by an unknown process. +[2026-09-30T06:06:23Z] first instance still healthy: 200 +namespace wrapper rc=0 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-trap-shim-v1-control.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-trap-shim-v1-control.txt new file mode 100644 index 000000000..b818dd5d9 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-trap-shim-v1-control.txt @@ -0,0 +1,9 @@ +[2026-09-30T06:05:24Z] shim label=v1; lsof on PATH: /ns-omni-trap-v1-20260930/shim/lsof sha256=b12c64614c54bc86 +[2026-09-30T06:05:24Z] phase 1: health=200 after 3s +[2026-09-30T06:05:29Z] client (pid 2461136) socket before stop: ESTAB ESTAB ESTAB +[2026-09-30T06:05:29Z] server stopped, exit 0 +[2026-09-30T06:05:31Z] client alive after stop: yes; its socket: CLOSE-WAIT | lsof -ti :20197 by the real tool: 2461136 +[2026-09-30T06:05:31Z] phase 2 (restart with the dead client connection still held): serve exited early after 1s +✖ Port 20197 is already in use by PID 2461136. +[2026-09-30T06:05:32Z] done +namespace wrapper rc=0 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-trap-shim-v2.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-trap-shim-v2.txt new file mode 100644 index 000000000..c03f3eaad --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-trap-shim-v2.txt @@ -0,0 +1,8 @@ +[2026-09-30T06:05:43Z] shim label=v2; lsof on PATH: /ns-omni-trap-v2-20260930/shim/lsof sha256=b6ae900224df3dc7 +[2026-09-30T06:05:43Z] phase 1: health=200 after 3s +[2026-09-30T06:05:48Z] client (pid 2472283) socket before stop: FIN-WAIT-2 ESTAB ESTAB +[2026-09-30T06:05:48Z] server stopped, exit 0 +[2026-09-30T06:05:50Z] client alive after stop: yes; its socket: CLOSE-WAIT | lsof -ti :20197 by the real tool: 2472283 +[2026-09-30T06:05:51Z] phase 2 (restart with the dead client connection still held): health=200 after 5s +[2026-09-30T06:05:56Z] done +namespace wrapper rc=0 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/probe-gate-after-switch.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/probe-gate-after-switch.json new file mode 100644 index 000000000..2e7234730 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/probe-gate-after-switch.json @@ -0,0 +1,303 @@ +{ + "label": "after-B3", + "started_utc": "2026-09-30T06:33:03Z", + "prompt": "Compute 48271 * 3917 and reply with only the number.", + "runs": [ + { + "port": "20128", + "model": "cx/gpt-6.1-sol", + "body_effort": "max", + "extra_headers": [], + "correlation_id": "probe-after-B3-9baa77891213", + "status": 200, + "event_types": [ + "response.created", + "response.in_progress", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "gpt-6.1-sol", + "usage": { + "input": 31, + "output": 142, + "reasoning": 133 + }, + "seconds": 9.4, + "shows": "native-style max request on the base id", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6.1-sol", + "requested_model": "codex/gpt-6.1-sol", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": "max", + "effort_upstream": "max" + } + }, + { + "port": "20128", + "model": "cx/gpt-6.1-sol-max", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-after-B3-8255fb981195", + "status": 200, + "event_types": [ + "response.created", + "response.in_progress", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "gpt-6.1-sol", + "usage": { + "input": 31, + "output": 145, + "reasoning": 136 + }, + "seconds": 9.4, + "shows": "model-id suffix max (parsed only when the base id is in the alias sets)", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6.1-sol-max", + "requested_model": "codex/gpt-6.1-sol-max", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": null, + "effort_upstream": "max" + } + }, + { + "port": "20128", + "model": "cx/gpt-6.1-sol-xhigh", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-after-B3-d90dcec0e488", + "status": 200, + "event_types": [ + "response.in_progress", + "response.created", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "gpt-6.1-sol", + "usage": { + "input": 31, + "output": 100, + "reasoning": 91 + }, + "seconds": 7.5, + "shows": "suffix xhigh (parsed for every model)", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6.1-sol-xhigh", + "requested_model": "codex/gpt-6.1-sol-xhigh", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": null, + "effort_upstream": "xhigh" + } + }, + { + "port": "20128", + "model": "gpt-6.1-sol-max", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-after-B3-9d5f50096114", + "status": 200, + "event_types": [ + "response.created", + "response.in_progress", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "gpt-6.1-sol", + "usage": { + "input": 31, + "output": 119, + "reasoning": 110 + }, + "seconds": 8.7, + "shows": "the bare id exactly as the framework lane's node forwards it (no provider prefix): must resolve to codex", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6.1-sol-max", + "requested_model": "codex/gpt-6.1-sol-max", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": null, + "effort_upstream": "max" + } + }, + { + "port": "20128", + "model": "cx/gpt-6-sol", + "body_effort": "low", + "extra_headers": [ + "User-Agent", + "Version", + "originator" + ], + "correlation_id": "probe-after-B3-1b4309402779", + "status": 200, + "event_types": [ + "response.created", + "response.in_progress", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "codex/gpt-6-sol", + "usage": { + "input": 31, + "output": 59, + "reasoning": 50 + }, + "seconds": 5.4, + "shows": "a request carrying the 0.157.1 User-Agent and Version header, on a model that client can use (Gate A owner's probe gate)", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6-sol", + "requested_model": "codex/gpt-6-sol", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": "low", + "effort_upstream": "low" + } + }, + { + "port": "20128", + "model": "cx/gpt-6-astra-max", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-after-B3-e959ee90e331", + "status": 200, + "event_types": [ + "response.created", + "response.in_progress", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "gpt-6-astra", + "usage": { + "input": 31, + "output": 125, + "reasoning": 116 + }, + "seconds": 12.2, + "shows": "the astra lane model at max: must stay max", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6-astra-max", + "requested_model": "codex/gpt-6-astra-max", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": null, + "effort_upstream": "max" + } + }, + { + "port": "20128", + "model": "cx/gpt-6.1-sol-nonexistent-probe", + "body_effort": "low", + "extra_headers": [], + "correlation_id": "probe-after-B3-cf69ee39b3c0", + "status": 400, + "error_message": "Model 'gpt-6.1-sol-nonexistent-probe' is not available in the active live catalog for provider 'codex'.", + "seconds": 0.0, + "shows": "a made-up id must answer 4xx", + "response_id_seen": false, + "call_log": null + }, + { + "port": "20129", + "model": "sharedgw/gpt-6.1-sol-max", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-after-B3-eb1a480eef09", + "status": 200, + "event_types": [ + "response.created", + "response.in_progress", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "gpt-6.1-sol", + "usage": { + "input": 31, + "output": 132, + "reasoning": 123 + }, + "seconds": 8.9, + "shows": "the framework lane's node forwarding the max suffix to 20128", + "call_log": "20129 rows are not read here (its store is separate and unchanged)" + } + ], + "finished_utc": "2026-09-30T06:34:09Z" +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/probe-gate-before-switch.json b/evidence/artifacts/omniroute-sol-max-20260930/checks/probe-gate-before-switch.json new file mode 100644 index 000000000..8bf564919 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/probe-gate-before-switch.json @@ -0,0 +1,187 @@ +{ + "label": "before-B2", + "started_utc": "2026-09-30T05:59:14Z", + "prompt": "Compute 48271 * 3917 and reply with only the number.", + "runs": [ + { + "port": "20128", + "model": "cx/gpt-6.1-sol", + "body_effort": "max", + "extra_headers": [], + "correlation_id": "probe-before-B2-806884bc0ca8", + "status": 200, + "event_types": [ + "response.created", + "response.in_progress", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "gpt-6.1-sol", + "usage": { + "input": 31, + "output": 129, + "reasoning": 120 + }, + "seconds": 9.3, + "shows": "native-style max request on the base id", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6.1-sol", + "requested_model": "codex/gpt-6.1-sol", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": "max", + "effort_upstream": "xhigh" + } + }, + { + "port": "20128", + "model": "cx/gpt-6.1-sol-max", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-before-B2-a2324c5e4556", + "status": 400, + "error_message": "Model 'gpt-6.1-sol-max' is not available in the active live catalog for provider 'codex'.", + "seconds": 0.0, + "shows": "model-id suffix max (parsed only when the base id is in the alias sets)", + "response_id_seen": false, + "call_log": null + }, + { + "port": "20128", + "model": "cx/gpt-6.1-sol-xhigh", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-before-B2-e8b97b4bb43b", + "status": 400, + "error_message": "Model 'gpt-6.1-sol-xhigh' is not available in the active live catalog for provider 'codex'.", + "seconds": 0.0, + "shows": "suffix xhigh (parsed for every model)", + "response_id_seen": false, + "call_log": null + }, + { + "port": "20128", + "model": "gpt-6.1-sol-max", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-before-B2-9800761de393", + "status": 401, + "error_message": "No active credentials for provider: openai.", + "seconds": 0.0, + "shows": "the bare id exactly as the framework lane's node forwards it (no provider prefix): must resolve to codex", + "response_id_seen": false, + "call_log": null + }, + { + "port": "20128", + "model": "cx/gpt-6-sol", + "body_effort": "low", + "extra_headers": [ + "User-Agent", + "Version", + "originator" + ], + "correlation_id": "probe-before-B2-da3ae3526ee2", + "status": 200, + "event_types": [ + "response.created", + "response.in_progress", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "codex/gpt-6-sol", + "usage": { + "input": 31, + "output": 65, + "reasoning": 56 + }, + "seconds": 5.4, + "shows": "a request carrying the 0.157.1 User-Agent and Version header, on a model that client can use (Gate A owner's probe gate)", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6-sol", + "requested_model": "codex/gpt-6-sol", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": "low", + "effort_upstream": "low" + } + }, + { + "port": "20128", + "model": "cx/gpt-6-astra-max", + "body_effort": null, + "extra_headers": [], + "correlation_id": "probe-before-B2-189ec8d480e4", + "status": 200, + "event_types": [ + "response.in_progress", + "response.created", + "response.output_item.added", + "response.reasoning_summary_part.added", + "response.reasoning_summary_text.delta", + "response.reasoning_summary_text.done", + "response.reasoning_summary_part.done", + "response.output_item.done", + "response.content_part.added", + "response.output_text.delta", + "response.output_text.done", + "response.content_part.done", + "response.completed" + ], + "served_model": "gpt-6-astra", + "usage": { + "input": 31, + "output": 142, + "reasoning": 133 + }, + "seconds": 10.2, + "shows": "the astra lane model at max: must stay max", + "response_id_seen": true, + "call_log": { + "provider": "codex", + "model": "gpt-6-astra-max", + "requested_model": "codex/gpt-6-astra-max", + "status": 200, + "reasoning_source": "encrypted", + "effort_requested": null, + "effort_upstream": "max" + } + }, + { + "port": "20128", + "model": "cx/gpt-6.1-sol-nonexistent-probe", + "body_effort": "low", + "extra_headers": [], + "correlation_id": "probe-before-B2-e484a160eeb8", + "status": 400, + "error_message": "Model 'gpt-6.1-sol-nonexistent-probe' is not available in the active live catalog for provider 'codex'.", + "seconds": 0.0, + "shows": "a made-up id must answer 4xx", + "response_id_seen": false, + "call_log": null + } + ], + "finished_utc": "2026-09-30T05:59:41Z" +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-install.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-install.txt new file mode 100644 index 000000000..42da279ed --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-install.txt @@ -0,0 +1,5 @@ +[2026-09-30T05:50:33Z] tarball 5d31e2489d7e239c2a12b77693df7bd7992233a105381ba5930fbf3fdb00273c /.tmp/ns-rebuild/pack/B3/omniroute-3.8.51.tgz +[2026-09-30T05:53:20Z] npm install rc=0 +[2026-09-30T05:53:24Z] npm rebuild rc=0 +[2026-09-30T05:53:24Z] shim sha256=b12c64614c54bc86bad8b5cd2778e04c50ae624f47b2d2d525d1a9edc00c8f56 mode=755 match=yes +[2026-09-30T05:53:24Z] installed BUILD_SHA=cf6748d04 version=3.8.51 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-pack-boot.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-pack-boot.txt new file mode 100644 index 000000000..7eddabfaf --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-pack-boot.txt @@ -0,0 +1,35 @@ +npm warn Unknown project config "onnxruntime-node-install". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. + +> omniroute@3.8.51 check:pack-boot +> node scripts/check/check-pack-boot.mjs + +[pack-boot] packing v3.8.51… +npm warn Unknown env config "onnxruntime-node-install". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. +npm warn Unknown project config "onnxruntime-node-install". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. + +> omniroute@3.8.51 prepare +> node -e "try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})" + +[pack-boot] installing omniroute-3.8.51.tgz into a clean prefix (postinstall runs for real)… +npm warn Unknown env config "onnxruntime-node-install". This will stop working in the next major version of npm. See `npm help npmrc` for supported config options. +npm warn deprecated prebuild-install@7.1.3: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. +npm warn install-scripts 7 packages have install scripts not yet covered by allowScripts: +npm warn install-scripts omniroute@3.8.51 (postinstall: node scripts/build/postinstall.mjs; prepare: node -e "try{require.resolve('husky')}catch(e){process.exit(0)};require('child_process').execSync('husky',{stdio:'inherit'})") +npm warn install-scripts keytar@7.9.0 (install: prebuild-install || npm run build) +npm warn install-scripts onnxruntime-node@1.30.0 (postinstall: node ./script/install) +npm warn install-scripts @parcel/watcher@2.6.0 (install: node scripts/build-from-source.js) +npm warn install-scripts @swc/core@1.16.12 (postinstall: node postinstall.js) +npm warn install-scripts protobufjs@7.6.6 (postinstall: node scripts/postinstall) +npm warn install-scripts esbuild@0.28.2 (postinstall: node install.js) +npm warn install-scripts +npm warn install-scripts Run `npm install -g --allow-scripts=omniroute,keytar,onnxruntime-node,@parcel/watcher,@swc/core,protobufjs,esbuild` to allow these scripts once, or `npm config set allow-scripts=omniroute,keytar,onnxruntime-node,@parcel/watcher,@swc/core,protobufjs,esbuild --location=user` to allow them for all global installs. +[pack-boot] installed package contains the complete sql.js WASM runtime +[pack-boot] installed package contains the node-machine-id runtime +[pack-boot] boot #1: installed CLI on :26072 (DATA_DIR isolated)… +[pack-boot] healthy: HTTP 200, version 3.8.51 +[pack-boot] machine-token auth passed with no/invalid/valid contrast controls +[pack-boot] settings write/read succeeded through the forced sql.js driver +[pack-boot] boot #2: rebooting on the same DATA_DIR to prove disk persistence… +[pack-boot] healthy: HTTP 200, version 3.8.51 +[pack-boot] value survived a clean shutdown + restart — disk persistence proven +[pack-boot] ✅ the packed tarball boots AND persists — #7065 class gate green diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-pipeline-times.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-pipeline-times.txt new file mode 100644 index 000000000..aca9c9b10 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-pipeline-times.txt @@ -0,0 +1,18 @@ +[2026-09-30T05:38:48Z] setup start base=ae5539a5623457a2e8bb7f5dddd3d0736a2ddeb7 pr=f5d8e150b79e0901fa18241c7f29bff889b87c14 cpus=40-47 +[2026-09-30T05:38:52Z] cherry-picked head=cf6748d04c1e0dd033fb6b6effa9bbaf5ed5466b stable-patch-id=14ec6648f50fc499d430f28d2af7840cd2d46055 upstream=14ec6648f50fc499d430f28d2af7840cd2d46055 +[2026-09-30T05:40:13Z] B3 ready head=cf6748d04 commits-over-tip=4 +[2026-09-30T05:40:13Z] effort probe B3 start +[2026-09-30T05:40:16Z] effort probe B3 end rc=0 +[2026-09-30T05:40:16Z] build B3 start +[2026-09-30T05:50:33Z] build B3 end rc=0 +[2026-09-30T05:50:33Z] B3 install start +[2026-09-30T05:53:24Z] B3 install end rc=0 +[2026-09-30T05:53:24Z] B3 smoke start +[2026-09-30T05:53:34Z] B3 smoke end rc=0 +[2026-09-30T05:53:34Z] B3 pack-boot start +[2026-09-30T05:58:02Z] B3 pack-boot end rc=0 +[2026-09-30T05:58:02Z] B3 targeted tests start (14 files) +[2026-09-30T05:58:10Z] B3 targeted tests end rc=0 +[2026-09-30T05:58:10Z] B2 baseline tests start +[2026-09-30T05:58:14Z] B2 baseline tests end rc=0 +[2026-09-30T05:58:14Z] DONE diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-smoke-shim-v1.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-smoke-shim-v1.txt new file mode 100644 index 000000000..16610a56d --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-smoke-shim-v1.txt @@ -0,0 +1,60 @@ +namespace wrapper rc=0 +start=2026-09-30T05:53:24Z uid=1000 cwd=/ns-omni-smoke-B3-20260929b/cwd +netns listeners before start: 0 +serve pid=2171991 +health=200 after 3 polls, 4s after start +last health code=200 +health body (first 400 bytes): {"status":"ok","timestamp":"2026-09-30T05:53:28.099Z"} +--- listeners while running (ss -Hltnp) +LISTEN 0 511 127.0.0.1:20198 0.0.0.0:* users:(("omniroute (v16.",pid=2172233,fd=36)) +LISTEN 0 511 127.0.0.1:20199 0.0.0.0:* users:(("omniroute (v16.",pid=2172233,fd=37)) +LISTEN 0 511 127.0.0.1:20197 0.0.0.0:* users:(("omniroute (v16.",pid=2172233,fd=21)) +--- process tree of serve (pstree -p) +MainThread(2171991)-+-esbuild(2172040)-+-{esbuild}(2172041) + | |-{esbuild}(2172042) + | |-{esbuild}(2172043) + | |-{esbuild}(2172044) + | |-{esbuild}(2172045) + | |-{esbuild}(2172141) + | |-{esbuild}(2172142) + | `-{esbuild}(2172143) + |-omniroute (v16.(2172233)-+-{omniroute (v16.}(2172235) + | |-{omniroute (v16.}(2172236) + | |-{omniroute (v16.}(2172237) + | |-{omniroute (v16.}(2172238) + | |-{omniroute (v16.}(2172239) + | |-{omniroute (v16.}(2172242) + | |-{omniroute (v16.}(2172327) + | |-{omniroute (v16.}(2172328) + | |-{omniroute (v16.}(2172329) + | |-{omniroute (v16.}(2172330) + | `-{omniroute (v16.}(2172462) + |-{MainThread}(2171995) + |-{MainThread}(2171996) + |-{MainThread}(2171997) + |-{MainThread}(2171998) + |-{MainThread}(2171999) + |-{MainThread}(2172007) + |-{MainThread}(2172029) + |-{MainThread}(2172046) + |-{MainThread}(2172047) + |-{MainThread}(2172048) + `-{MainThread}(2172049) +tree+listener pids: 2171991 2171995 2171996 2171997 2171998 2171999 2172007 2172029 2172040 2172041 2172042 2172043 2172044 2172045 2172046 2172047 2172048 2172049 2172141 2172142 2172143 2172233 2172235 2172236 2172237 2172238 2172239 2172242 2172327 2172328 2172329 2172330 2172462 +SIGTERM sent to pid 2171991; serve exit code=143 after 0s +--- listeners after exit (ss -Hltn) +listener count after exit: 0 +tree/listener pids still alive after exit: none +end=2026-09-30T05:53:34Z +data dir entries after run (names and modes only): +total 5732 +drwxr-x--- . +drwxr-xr-x .. +-rw------- .env +drwxr-xr-x logs +drwxr-xr-x server +-rw-r--r-- storage.sqlite +-rw-r--r-- storage.sqlite-shm +-rw-r--r-- storage.sqlite-wal +drwxr-xr-x supervisor +data dir mode 750 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-targeted-B2-baseline.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-targeted-B2-baseline.txt new file mode 100644 index 000000000..f1c7d5597 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-targeted-B2-baseline.txt @@ -0,0 +1,9 @@ +# tests 147 +# suites 4 +# pass 147 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 4364.269454 +rc=0 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-targeted-B3.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-targeted-B3.txt new file mode 100644 index 000000000..44893328c --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-targeted-B3.txt @@ -0,0 +1,9 @@ +# tests 147 +# suites 4 +# pass 147 +# fail 0 +# cancelled 0 +# skipped 0 +# todo 0 +# duration_ms 8031.202592 +rc=0 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/readback-after-switch.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/readback-after-switch.txt new file mode 100644 index 000000000..2ca9e5b15 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/readback-after-switch.txt @@ -0,0 +1,37 @@ +observed_utc=2026-09-30T06:33:03Z +--- omniroute.service +MainPID=3262255 +NRestarts=0 +ExecMainStartTimestamp=Wed 2026-09-30 02:32:50 EDT +ActiveState=active +SubState=running +--- omniroute-fw.service +MainPID=945817 +NRestarts=0 +ExecMainStartTimestamp=Tue 2026-09-29 20:02:42 EDT +ActiveState=active +SubState=running +--- hindsight-live.service +MainPID=948478 +NRestarts=0 +ExecMainStartTimestamp=Tue 2026-09-29 20:02:51 EDT +ActiveState=active +SubState=running +--- unit file sha256 (values-free files) +b7797d7898160c858de7d56695bb97a3ac569c8cfded49affcb66b908528be45 omniroute.service +fbdace7eeec524e37794432aa4c57ac5a8b4b925ef0b700f70b5e299a951c802 omniroute-fw.service +--- rollback copies in the switch directory +899e4fdb06775216094953815ed2836c2df9be12e26b459558a600742694b097 omniroute.service +drwx------ 4096 . +drwx------ 4096 .. +-rw------- 1723 omniroute.service +--- BUILD_SHA and shim of each prefix +omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167 BUILD_SHA=cf6748d04 shim/lsof sha256=b6ae900224df3dc73fff2a50b3d7206d78895c6147e93e80b62e66d423e69854 +omniroute-3.8.51-2f42a9ac-pr13788-affinity2 BUILD_SHA=ae5539a56 shim/lsof sha256=b12c64614c54bc86bad8b5cd2778e04c50ae624f47b2d2d525d1a9edc00c8f56 +omniroute-3.8.51-2f42a9ac-pr13788 BUILD_SHA=87c4c488d shim/lsof sha256=b12c64614c54bc86bad8b5cd2778e04c50ae624f47b2d2d525d1a9edc00c8f56 +--- health +20128: {"status":"ok","timestamp":"2026-09-30T06:33:03.332Z"} +20129: {"status":"ok","timestamp":"2026-09-30T06:33:03.344Z"} +--- serve process arguments per unit (prefix names only) +omniroute: omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167 +omniroute-fw: omniroute-3.8.51-2f42a9ac-pr13788 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/sharedgw-connection-expiry-20260930.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/sharedgw-connection-expiry-20260930.txt new file mode 100644 index 000000000..dbefa46c9 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/sharedgw-connection-expiry-20260930.txt @@ -0,0 +1,29 @@ +Transcription, not a recording: the values below are copied by hand from the returned outputs of the commands run on 2026-09-30 between 05:50Z and 05:55Z +(read-only sqlite opens in mode=ro of the 20129 store, status columns only and no credential column; the gateway's own test route; model requests through +20129 and 20128). Internal identifiers are shortened to eight hex characters. + +1. Cause, row of 20129's call_logs (timestamp, model, requested model, status, error type, error summary, duration ms): + 2026-09-30T05:50:13.561Z | gpt-6.1-sol-max | sharedgw/gpt-6.1-sol-max | 401 | unauthorized | [401]: No active credentials for provider: openai. | 6064 + It is the last request of the baseline run of probe_gate.py (scripts/probe_gate.py.txt, an earlier version that sent this request unconditionally). + The bare id gpt-6.1-sol-max was forwarded by the sharedgw node to 20128, whose registry lacked it, so it resolved to provider openai and answered 401. + +2. The sharedgw node's only connection before the repair (provider_connections, columns id, provider, auth_type, is_active, test_status, last_error_type, + error_code, last_error_at, last_tested, rate_limited_until, backoff_level; last_error text): + id 3eea0518 | provider openai-compatible-responses-3393b3bd | auth_type apikey | is_active 1 | test_status expired | last_error_type unauthorized | + error_code 401.0 | last_error_at 2026-09-30T05:50:13.572Z | last_tested 2026-09-30T05:03:17.973Z | rate_limited_until null | backoff_level 0 + last_error: [401]: No active credentials for provider: openai. + +3. Effect, requests through 20129 after 05:50:13.572Z: + 05:51:50Z sharedgw/gpt-6-astra -> HTTP 401 in 0.0 s, "All 1 connection(s) authentication expired - please reconnect in the dashboard" + 05:52:43Z sharedgw/gpt-6-astra-max -> HTTP 401 in 0.0 s, the same message + (20129 rows after 05:50:27.067Z: none; requests in flight before 05:50:13.572Z finished with 200. Direct requests to 20128 were never affected.) + +4. Repair, 05:54:44Z: POST /api/providers/3eea0518-.../test on 20129 (the dashboard's Test connection), body {}. Answer: HTTP 200, valid true, statusCode null, + latencyMs 604, testedAt 2026-09-30T05:54:45.300Z, error null, diagnosis type ok source upstream. + +5. The connection after the repair (same columns): + id 3eea0518 | is_active 1 | test_status active | last_error_type null | error_code null | last_error_at null | last_tested 2026-09-30T05:54:45.300Z | + rate_limited_until null | backoff_level 0 ; last_error: (empty) + 05:54:52Z sharedgw/gpt-6-astra -> HTTP 200, nine response events, last response.completed, 1.9 s. + Outage of the route for requests started after 05:50:13.572Z: until 05:54:45Z, about 4.5 minutes. No restart, no unit, settings or pool change. + A fresh owner record at 05:55:27Z equals the published 00:48:58Z record on 31 of 32 paths (only taken_utc differs); the record carries no connection status. diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/switch-output.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/switch-output.txt new file mode 100644 index 000000000..d0c61d1c0 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/switch-output.txt @@ -0,0 +1,6 @@ +20129 omniroute-fw.service: NOT in scope; running omniroute-3.8.51-2f42a9ac-pr13788 (87c4c488d) MainPID=945817 NRestarts=0 +20128 omniroute.service: running omniroute-3.8.51-2f42a9ac-pr13788-affinity2 (ae5539a56) -> omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167 (cf6748d04, shim v2); lines changed: ['Description', 'Environment', 'ExecStart']; prefix problems: [] +saved prior unit files to switch-2026-09-30T06:32:49Z +20128: health=True (ok) running prefix=omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167 identity_ok=True MainPID=3262255 NRestarts=0 +20129 omniroute-fw.service: untouched; running omniroute-3.8.51-2f42a9ac-pr13788 (87c4c488d) MainPID=945817 NRestarts=0 +switched: ['20128'] | rollback dir: /omniroute-tokensave-20260929/switch-2026-09-30T06:32:49Z diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/unit-before-after.diff b/evidence/artifacts/omniroute-sol-max-20260930/checks/unit-before-after.diff new file mode 100644 index 000000000..07bf5f566 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/unit-before-after.diff @@ -0,0 +1,27 @@ +--- /omniroute-tokensave-20260929/switch-2026-09-30T06:32:49Z/omniroute.service 2026-09-30 02:32:49.417181837 -0400 ++++ /.config/systemd/user/omniroute.service 2026-09-30 02:32:49.417267550 -0400 +@@ -1,5 +1,5 @@ + [Unit] +-Description=OmniRoute gateway 3.8.51 (release/v3.8.51 2f42a9ac1 + upstream #13788 as two commits + local session-affinity patch 045aa81f3; canary build ae5539a56), loopback only ++Description=OmniRoute gateway 3.8.51 (release/v3.8.51 2f42a9ac1 + upstream #13788 as two commits + local session-affinity patch 045aa81f3 + upstream #15167 f5d8e150b; canary build cf6748d04; lsof shim v2), loopback only + Documentation=https://github.com/diegosouzapw/OmniRoute + After=network-online.target + +@@ -7,7 +7,7 @@ + Type=simple + EnvironmentFile=%h/.local/share/omniroute/server.env + # shim/ holds the lsof no-match adaptation for serve's port preflight (see shim/lsof; remove when upstream fixes it). +-Environment=PATH=%h/.local/share/codex-ecosystem/tools/omniroute-3.8.51-2f42a9ac-pr13788-affinity2/shim:%h/.local/share/codex-ecosystem/tools/node-24.21.0/bin:/usr/local/bin:/usr/bin:/bin ++Environment=PATH=%h/.local/share/codex-ecosystem/tools/omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167/shim:%h/.local/share/codex-ecosystem/tools/node-24.21.0/bin:/usr/local/bin:/usr/bin:/bin + Environment=OMNIROUTE_MEMORY_MB=16384 + # Caller-version fallback for paths that do not forward the Codex client's own version (src/shared/constants/codexClient.ts). + Environment=CODEX_CLIENT_VERSION=0.159.1 +@@ -19,7 +19,7 @@ + Environment=STREAM_ACTIVE_TIMEOUT_MS=3600000 + # Templates stay the single writer for Codex/Claude configs (src/shared/services/cliRuntime.ts). + Environment=CLI_ALLOW_CONFIG_WRITES=false +-ExecStart=%h/.local/share/codex-ecosystem/tools/omniroute-3.8.51-2f42a9ac-pr13788-affinity2/bin/omniroute serve --port 20128 --no-open --no-tray ++ExecStart=%h/.local/share/codex-ecosystem/tools/omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167/bin/omniroute serve --port 20128 --no-open --no-tray + Restart=on-failure + RestartSec=5 + TimeoutStopSec=30 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/checks/upstream-pr-15167-identity.txt b/evidence/artifacts/omniroute-sol-max-20260930/checks/upstream-pr-15167-identity.txt new file mode 100644 index 000000000..9f2c7bb6c --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/checks/upstream-pr-15167-identity.txt @@ -0,0 +1,17 @@ +observed_utc=2026-09-30T06:08:14Z +pr head: f5d8e150b79e0901fa18241c7f29bff889b87c14 +release/v3.8.52 tip: a1a2dce1a64a4b123f80ec899fc88bb2aa34d1a4 +merge base: a1a2dce1a64a4b123f80ec899fc88bb2aa34d1a4 +commits beyond base: 1 +subject: feat(models): add GPT-6.1 Sol to Codex catalog and pricing + open-sse/config/providers/registry/codex/index.ts | 9 +++++++++ + open-sse/executors/codex/reasoningSuffix.ts | 2 ++ + src/lib/providers/codexFastTier.ts | 1 + + src/shared/constants/pricing/oauth-subscriptions.ts | 10 ++++++++++ + tests/unit/codex-fast-tier.test.ts | 1 + + 5 files changed, 23 insertions(+) +stable patch-id, upstream commit: 14ec6648f50fc499d430f28d2af7840cd2d46055 +stable patch-id, our cherry-pick: 14ec6648f50fc499d430f28d2af7840cd2d46055 +candidate head (B3): cf6748d04c1e0dd033fb6b6effa9bbaf5ed5466b +running build head (B2): ae5539a5623457a2e8bb7f5dddd3d0736a2ddeb7 +candidate commits over the release/v3.8.51 tip 2f42a9ac1: 4 diff --git a/evidence/artifacts/omniroute-sol-max-20260930/receipt.json b/evidence/artifacts/omniroute-sol-max-20260930/receipt.json new file mode 100644 index 000000000..f8bf6c088 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/receipt.json @@ -0,0 +1,149 @@ +{ + "schema": "omniroute-sol-max-receipt/1", + "id": "omniroute-sol-max-20260930", + "host": { + "name": "nativestack-5975wx-20260925", + "profile": "linux-wsl2-x86_64", + "scope": "one workstation; the 20128 user unit only" + }, + "subject": "20128 restarted at 2026-09-30T06:32:50Z onto build cf6748d04: the running build plus upstream PR 15167, so gpt-6.1-sol reaches max effort; the lsof shim v2 in the new prefix", + "status": "applied and read back; 20129 and hindsight-live untouched", + "recordings": { + "calllog-effort-counts-after-switch.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-after-switch.json", + "calllog-effort-counts-before-switch.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/calllog-effort-counts-before-switch.json", + "codex-bundled-catalog-0159.2.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/codex-bundled-catalog-0159.2.txt", + "effort-wire-candidate-B3.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/effort-wire-candidate-B3.json", + "effort-wire-running-build-B2.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/effort-wire-running-build-B2.json", + "omniroute.service.after-switch.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/omniroute.service.after-switch.txt", + "owner-record-after-switch.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-after-switch.json", + "owner-record-before-switch.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-before-switch.json", + "owner-record-diff.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/owner-record-diff.txt", + "preflight-scratch-port-reproduction.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-scratch-port-reproduction.json", + "preflight-scratch-port-table.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-scratch-port-table.json", + "preflight-second-instance-shim-v2.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-second-instance-shim-v2.txt", + "preflight-trap-shim-v1-control.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-trap-shim-v1-control.txt", + "preflight-trap-shim-v2.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/preflight-trap-shim-v2.txt", + "probe-gate-after-switch.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/probe-gate-after-switch.json", + "probe-gate-before-switch.json": "evidence/artifacts/omniroute-sol-max-20260930/checks/probe-gate-before-switch.json", + "qualification-install.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-install.txt", + "qualification-pack-boot.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-pack-boot.txt", + "qualification-pipeline-times.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-pipeline-times.txt", + "qualification-smoke-shim-v1.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-smoke-shim-v1.txt", + "qualification-targeted-B2-baseline.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-targeted-B2-baseline.txt", + "qualification-targeted-B3.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/qualification-targeted-B3.txt", + "readback-after-switch.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/readback-after-switch.txt", + "sharedgw-connection-expiry-20260930.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/sharedgw-connection-expiry-20260930.txt", + "switch-output.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/switch-output.txt", + "unit-before-after.diff": "evidence/artifacts/omniroute-sol-max-20260930/checks/unit-before-after.diff", + "upstream-pr-15167-identity.txt": "evidence/artifacts/omniroute-sol-max-20260930/checks/upstream-pr-15167-identity.txt" + }, + "evidence_classes": { + "source_review": "reads of upstream source and Codex 0.159.2's bundled catalog (git protocol, offline)", + "unchanged_upstream_check": "upstream's own scripts on our build: check:pack-artifact, check:pack-boot", + "our_integration_check": "our scripts and outputs: offline wire table, boot smokes, targeted tests, preflight tests, switch read-backs, owner record, call_logs reads", + "live_model_call": "tiny requests through the gateway (one prompt, a small multiplication), effort read from call_logs" + }, + "switch": { + "at_utc": "2026-09-30T06:32:50Z", + "tool": "scripts/switch_gateways.py.txt --only 20128", + "rollback_directory": "switch-2026-09-30T06:32:49Z", + "unit_sha256_before": "899e4fdb06775216094953815ed2836c2df9be12e26b459558a600742694b097", + "unit_sha256_after": "b7797d7898160c858de7d56695bb97a3ac569c8cfded49affcb66b908528be45", + "main_pid_after": "3262255", + "candidate_head": "cf6748d04c1e0dd033fb6b6effa9bbaf5ed5466b", + "previous_build": "ae5539a5623457a2e8bb7f5dddd3d0736a2ddeb7", + "shim_v2_sha256": "b6ae900224df3dc73fff2a50b3d7206d78895c6147e93e80b62e66d423e69854", + "shim_v1_sha256": "b12c64614c54bc86bad8b5cd2778e04c50ae624f47b2d2d525d1a9edc00c8f56" + }, + "claims": [ + { + "id": "C1", + "class": [ + "source_review", + "our_integration_check" + ], + "text": "upstream PR 15167 is one commit, f5d8e150b79e0901fa18241c7f29bff889b87c14, 5 files +23/-0, on release/v3.8.52 a1a2dce1a64a4b123f80ec899fc88bb2aa34d1a4 (the tip at the read); its stable patch-id 14ec6648f50fc499d430f28d2af7840cd2d46055 equals the patch-id of its cherry-pick cf6748d04c1e0dd033fb6b6effa9bbaf5ed5466b on the running 20128 build ae5539a5623457a2e8bb7f5dddd3d0736a2ddeb7; it adds gpt-6.1-sol and its effort aliases to the Codex registry with the capabilities block whose context is 872000 (the live catalog's value), gpt-6.1-sol to both alias sets of reasoningSuffix.ts, to the fast-tier default list (inert while codexServiceTier is absent, as on both stores) and to the pricing table", + "at": "checks/upstream-pr-15167-identity.txt; checks/codex-bundled-catalog-0159.2.txt (Codex 0.159.2's own catalog lists max for gpt-6.1-sol)" + }, + { + "id": "C2", + "class": [ + "our_integration_check" + ], + "text": "before the restart 20128 sent every max request for gpt-6.1-sol as xhigh: its call_logs held 1495 gpt-6.1-sol rows since 2026-09-30T00:00Z at 2026-09-30T06:14:30Z, 1154 of them with max requested and xhigh sent upstream; gpt-6-astra rows were sent max upstream (381 rows)", + "at": "checks/calllog-effort-counts-before-switch.json (metadata columns only, read-only sqlite)" + }, + { + "id": "C3", + "class": [ + "our_integration_check" + ], + "text": "offline, on the source of the running build and of the candidate (CodexExecutor.transformRequest, network blocked, nothing sent), exactly these requests change their wire model and effort, and no other: gpt-6.1-sol with body max: gpt-6.1-sol / xhigh -> gpt-6.1-sol / max; gpt-6.1-sol with body ultra: gpt-6.1-sol / xhigh -> gpt-6.1-sol / max; gpt-6.1-sol-max: gpt-6.1-sol-max / medium -> gpt-6.1-sol / max; gpt-6.1-sol-ultra: gpt-6.1-sol-ultra / medium -> gpt-6.1-sol / max; gpt-6.1-sol-max with body low: gpt-6.1-sol-max / low -> gpt-6.1-sol / max; 8 other rows (xhigh, high, astra, gpt-6-sol) are unchanged", + "at": "checks/effort-wire-running-build-B2.json, checks/effort-wire-candidate-B3.json" + }, + { + "id": "C4", + "class": [ + "unchanged_upstream_check", + "our_integration_check" + ], + "text": "the candidate cf6748d04c1e0dd033fb6b6effa9bbaf5ed5466b (the running build plus the PR's commit) built with upstream's scripts (build:release and build:cli-api from 2026-09-30T05:40:16Z to 2026-09-30T05:50:33Z, npm pack, check:pack-artifact exit 0), installed into a new unreferenced prefix (tarball sha256 5d31e2489d7e239c2a12b77693df7bd7992233a105381ba5930fbf3fdb00273c, BUILD_SHA cf6748d04), booted in a network-less namespace (health 200 after 4 s), passed upstream's check:pack-boot (two boots, persistence proven) and 147 of 147 targeted tests, equal to 147 of 147 on the running build's source with the same 14 files", + "at": "checks/qualification-*.txt" + }, + { + "id": "C5", + "class": [ + "our_integration_check" + ], + "text": "upstream's serve port preflight (pid.mjs findListeningPids: lsof -ti :PORT) counts client sockets, so a client's dead pooled connection (CLOSE-WAIT) refuses the next start: control with shim v1, real omniroute serve of the candidate prefix: 'Port 20197 is already in use by PID '; with shim v2 (sha256 b6ae900224df3dc73fff2a50b3d7206d78895c6147e93e80b62e66d423e69854, exit 2 for that one query so upstream's bind-probe fallback #14518 is the guard) the same restart reaches health 200 after 5 s; a second real instance is still refused (exit 1) and the first stays healthy; a scratch-port run of upstream's resolveServeBusyPids gives v1 busy and v2 not busy with the client in CLOSE-WAIT, and v2 busy with a real listener", + "at": "checks/preflight-*.txt, checks/preflight-*.json" + }, + { + "id": "C6", + "class": [ + "our_integration_check" + ], + "text": "the restart: switch_gateways.py --only 20128 at 2026-09-30T06:32:50Z; the unit file changed in exactly three lines (Description, the PATH shim segment, ExecStart: prefix omniroute-3.8.51-2f42a9ac-pr13788-affinity2 to ...-pr15167); unit sha256 899e4fdb06775216094953815ed2836c2df9be12e26b459558a600742694b097 to b7797d7898160c858de7d56695bb97a3ac569c8cfded49affcb66b908528be45; MainPID 950031 to 3262255, NRestarts 0; 20129 (omniroute-fw.service sha256 fbdace7eeec524e37794432aa4c57ac5a8b4b925ef0b700f70b5e299a951c802, MainPID 945817, NRestarts 0, BUILD_SHA 87c4c488d) and hindsight-live (MainPID 948478) unchanged; no settings write; rollback copy and the old prefix kept in the switch directory switch-2026-09-30T06:32:49Z", + "at": "checks/switch-output.txt, checks/readback-after-switch.txt, checks/unit-before-after.diff, checks/omniroute.service.after-switch.txt" + }, + { + "id": "C7", + "class": [ + "live_model_call", + "our_integration_check" + ], + "text": "probe gate, same script before (05:59Z) and after (06:33Z), tiny requests, effort from 20128's call_logs: cx/gpt-6.1-sol with body max: requested max / upstream xhigh before, max / max after; cx/gpt-6.1-sol-max: HTTP 400 (not in the live catalog) before, 200 with upstream max after; cx/gpt-6.1-sol-xhigh: 400 before, 200 with xhigh after; the bare id gpt-6.1-sol-max (what the sharedgw node forwards): 401 before, 200 with max after; cx/gpt-6-astra-max: upstream max before and after; a request carrying the 0.157.1 User-Agent and Version header on cx/gpt-6-sol: 200, low / low before and after; a made-up id: 400 before and after; one request through sharedgw/gpt-6.1-sol-max, sent only because the bare id answered 200: 200", + "at": "checks/probe-gate-before-switch.json, checks/probe-gate-after-switch.json, checks/calllog-effort-counts-after-switch.json" + }, + { + "id": "C8", + "class": [ + "our_integration_check" + ], + "text": "the owner record (gateway_record.py, schema omniroute-gateway-record/2) differs in 13 paths between 06:14:30Z and 06:33:02Z: build_sha, prefix, taken_utc, the unit hash, main_pid and exec_main_start of 20128, and, made by the gateway's own context-window reconciler on restart, the removal of the automatic override row (context_length, gpt-6.1-sol, codex, codex/gpt-6.1-sol, 872000), because the registry now carries that id with the same value (overrides_rows 6 to 5; route model_capability_overrides_stable digest changed); the effective context is unchanged; nothing on 20129 differs", + "at": "checks/owner-record-before-switch.json, checks/owner-record-after-switch.json, checks/owner-record-diff.txt" + }, + { + "id": "C9", + "class": [ + "our_integration_check" + ], + "text": "an unknown id through 20129's sharedgw node parks the node's only connection as expired for every caller: the baseline run of the probe gate sent sharedgw/gpt-6.1-sol-max at 05:50:13Z, 20128 could not place the bare id and answered 401, 20129 marked the connection expired, and requests through the node answered 401 until 05:54:45Z, when the dashboard's Test connection (POST /api/providers//test) restored it; no restart and no other change; upstream has no fix (release/v3.8.52 and main checked by commit message)", + "at": "checks/sharedgw-connection-expiry-20260930.txt (a transcription of the printed outputs)" + } + ], + "residuals": [ + "PR 15167 is open upstream; drop the carry when a release has it (the decision record's overturn conditions).", + "The sharedgw hazard is not fixed: any id through 20129's sharedgw node that 20128 resolves to a provider without credentials parks the node's connection for everyone; upstream has no fix and we have no cited reference for a local one. The probe gate now sends the lane request only after the bare id answered 200.", + "Only prefixes with shim v2 are protected from a dead client connection blocking a restart: the previous 20128 prefix (the rollback target) and 20129's prefix still carry shim v1, so a rollback, or a crash restart of 20129, can fail its preflight while a client such as hindsight-api holds a CLOSE-WAIT socket; then restart that client first and tell the Gate A owner.", + "The candidate's boot smoke ran with shim v1 in its prefix; the shim was replaced by v2 afterwards, and the boots with v2 are the first phases of the preflight smokes (same prefix, real omniroute serve). install.sh's recorded shim check shows v1.", + "The targeted tests do not cover the alias sets (the PR's one test edit is the fast-tier list); the effort evidence is the offline wire table and the live rows of the probe gate. a2's own two probe rows of 06:36Z carry no effort values because a 5-token answer has no reasoning item.", + "Effort max costs more tokens per request than xhigh on a pool with a tight weekly meter; no quota effect was measured here.", + "switch_gateways.py was extended after the 2026-09-30T00:02Z switch (--only, shim v2 accepted); the published copy is the current text and the diff is published; the earlier switch ran through the earlier text.", + "The previous prefix and the switch directory stay until Gate A's window closes; a rollback is itself a change and is announced to the Gate A owner first." + ], + "provenance": { + "scripts": "scripts/ (the harness as it ran; host paths are masks such as , , , ); post_switch.sh runs tools/omniroute/gateway_record.py (scratch copy of the repository file)", + "edits_to_outputs": "host paths are replaced by named placeholders and colour codes are removed; nothing else; the sharedgw transcription is a hand copy of printed outputs and says so" + } +} diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/blocknet.mjs.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/blocknet.mjs.txt new file mode 100644 index 000000000..a3d316641 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/blocknet.mjs.txt @@ -0,0 +1,27 @@ +// S1 screen preload: deny every network egress from the harness process and its worker +// threads (workers inherit execArgv, so this module loads in each). Unix-socket paths are +// allowed; TCP/TLS connects and fetch throw. Each denial is logged to stderr with a tag so +// the run log proves no model call, no gateway request and no model download happened. +import net from "node:net"; +import { isMainThread, threadId } from "node:worker_threads"; + +function deny(what) { + process.stderr.write(`S1-NETBLOCK thread=${isMainThread ? "main" : threadId} ${what}\n`); + const err = new Error(`S1 screen: network egress blocked (${what})`); + err.code = "ES1NETBLOCK"; + return err; +} + +globalThis.fetch = async (input) => { + throw deny(`fetch ${String(input && input.url ? input.url : input).slice(0, 120)}`); +}; + +const originalConnect = net.Socket.prototype.connect; +net.Socket.prototype.connect = function patchedConnect(...args) { + const a0 = args[0]; + const isPath = + (typeof a0 === "string" && Number.isNaN(Number(a0))) || + (a0 && typeof a0 === "object" && !Array.isArray(a0) && typeof a0.path === "string"); + if (isPath) return originalConnect.apply(this, args); + throw deny(`tcp ${JSON.stringify(a0 && typeof a0 === "object" ? { host: a0.host, port: a0.port } : a0)}`); +}; diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/calllog_effort_read.py.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/calllog_effort_read.py.txt new file mode 100644 index 000000000..cbe38f704 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/calllog_effort_read.py.txt @@ -0,0 +1,35 @@ +"""Read-only look at what effort a gateway actually sent upstream, from its call_logs rows (metadata columns only). +The columns reasoning_effort_requested (the client's effort value, verbatim) and reasoning_effort_upstream (the effort in the request the gateway +sent) are filled only for rows whose response carried encrypted reasoning (reasoning_source = 'encrypted'), from the provider request the +attempt captured; NULL means absent, stripped or not an encrypted-reasoning row, not 'none sent'. No request or response body, no account or +connection column and nothing from any other table is read. The store is opened with mode=ro. +Usage: calllog_effort_read.py rows [model substring] [limit] + calllog_effort_read.py counts [model substring]""" +import datetime +import json +import sqlite3 +import sys +from pathlib import Path + +STORES = {"omniroute": Path.home() / ".local/share/omniroute/storage.sqlite", "omniroute-fw": Path.home() / ".local/share/omniroute-fw/storage.sqlite"} +store, mode, since = sys.argv[1], sys.argv[2], sys.argv[3] +needle = sys.argv[4] if len(sys.argv) > 4 else "" +limit = int(sys.argv[5]) if len(sys.argv) > 5 else 20 +if store not in STORES or mode not in ("rows", "counts"): + sys.exit(__doc__) +connection = sqlite3.connect(f"file:{STORES[store]}?mode=ro", uri=True, timeout=10) +connection.execute("pragma query_only = on") +observed = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") +like = f"%{needle}%" +if mode == "rows": + cursor = connection.execute( + "select id, timestamp, provider, model, requested_model, status, reasoning_source, reasoning_effort_requested, reasoning_effort_upstream " + "from call_logs where timestamp >= ? and (model like ? or requested_model like ?) order by timestamp desc limit ?", (since, like, like, limit)) + names = [d[0] for d in cursor.description] + print(json.dumps({"observed_utc": observed, "store": store, "since": since, "filter": needle, "rows": [dict(zip(names, r)) for r in cursor.fetchall()]}, indent=1)) +else: + cursor = connection.execute( + "select model, coalesce(reasoning_effort_requested, '-') as requested, coalesce(reasoning_effort_upstream, '-') as upstream, reasoning_source, count(*) as n " + "from call_logs where timestamp >= ? and (model like ? or requested_model like ?) group by 1, 2, 3, 4 order by n desc limit 40", (since, like, like)) + names = [d[0] for d in cursor.description] + print(json.dumps({"observed_utc": observed, "store": store, "since": since, "filter": needle, "groups": [dict(zip(names, r)) for r in cursor.fetchall()]}, indent=1)) diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/codex_bundled_catalog.py.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/codex_bundled_catalog.py.txt new file mode 100644 index 000000000..a7d140c30 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/codex_bundled_catalog.py.txt @@ -0,0 +1,14 @@ +"""The effort levels Codex 0.159.2's bundled model catalog lists for the GPT-6 models, from `codex debug models --bundled` run offline (a network-less +user namespace, scratch HOME and CODEX_HOME). Usage: codex_bundled_catalog.py """ +import json +import sys + +models = json.load(open(sys.argv[1], encoding="utf-8")) +models = models["models"] if isinstance(models, dict) and "models" in models else models +print("codex --version:", open(sys.argv[2], encoding="utf-8").read().strip()) +print("models in the bundled catalog:", len(models)) +for model in models: + slug = model.get("slug") or model.get("id") + if slug in ("gpt-6.1-sol", "gpt-6-astra", "gpt-6-sol"): + levels = [(level.get("effort") if isinstance(level, dict) else level) for level in (model.get("supported_reasoning_levels") or [])] + print(f"{slug}: default {model.get('default_reasoning_level')}, levels {levels}, context_window {model.get('context_window')}, max_context_window {model.get('max_context_window')}") diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/effort_probe.mts.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/effort_probe.mts.txt new file mode 100644 index 000000000..000bbae87 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/effort_probe.mts.txt @@ -0,0 +1,49 @@ +// Offline probe (no network, no gateway, no model call): what the Codex executor of the checkout it runs in would put on the wire as `model` +// and `reasoning` for a set of requested model ids and body efforts. It calls CodexExecutor.transformRequest, the step that resolves the +// model-id suffix, the body effort and the per-model clamp, on a fresh scratch DATA_DIR. +// Usage (from a build's source checkout, network blocked by the preload): run.sh effort_probe.ts +import fs from "node:fs"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; + +const outPath = process.argv[2]; +const mod = await import(pathToFileURL(path.join(process.cwd(), "open-sse/executors/codex.ts")).href); +const executor = new mod.CodexExecutor(); + +// [requested model id, effort in the request body or null for none] +const CASES: Array<[string, string | null]> = [ + ["gpt-6.1-sol", "max"], + ["gpt-6.1-sol", "xhigh"], + ["gpt-6.1-sol", "ultra"], + ["gpt-6.1-sol-max", null], + ["gpt-6.1-sol-ultra", null], + ["gpt-6.1-sol-xhigh", null], + ["gpt-6.1-sol-high", null], + ["gpt-6.1-sol-max", "low"], + ["gpt-6.1-sol", null], + ["gpt-6-astra-max", null], + ["gpt-6-astra", "max"], + ["gpt-6-sol-max", null], + ["gpt-6-sol", "ultra"], +]; + +const rows: any[] = []; +for (const [model, effort] of CASES) { + const body: Record = { + model, + input: [{ type: "message", role: "user", content: [{ type: "input_text", text: "ping" }] }], + stream: true, + ...(effort ? { reasoning: { effort } } : {}), + }; + const wire: any = executor.transformRequest(model, body, true, { providerSpecificData: {} } as any); + rows.push({ + requested_model: model, + body_effort: effort, + wire_model: wire.model ?? null, + wire_reasoning_effort: wire.reasoning?.effort ?? null, + wire_reasoning_keys: wire.reasoning ? Object.keys(wire.reasoning).sort() : null, + }); +} +const out = { note: "wire_* is the body the executor built; nothing was sent. A case with no body effort and no suffix shows the connection default path, which depends on the gateway's thinking-budget setting and the connection defaults (a fresh scratch store here), so it is informational.", rows }; +fs.writeFileSync(outPath, JSON.stringify(out, null, 1) + "\n"); +console.log(JSON.stringify(rows.map((r) => `${r.requested_model} body=${r.body_effort ?? "-"} -> model=${r.wire_model} effort=${r.wire_reasoning_effort ?? "-"}`), null, 1)); diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/lsof-shim-v2.sh.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/lsof-shim-v2.sh.txt new file mode 100644 index 000000000..5bbf9a85d --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/lsof-shim-v2.sh.txt @@ -0,0 +1,14 @@ +#!/bin/sh +# Local adaptation (v2) for OmniRoute release/v3.8.51, used only on the omniroute.service PATH (recorded 2026-09-30; v1 is the 2026-09-27 shim). +# What it works around: `omniroute serve` refuses to start when its port preflight finds a process on the port. The preflight +# (bin/cli/utils/pid.mjs findListeningPids, called by bin/cli/commands/serve.mjs resolveServeBusyPids) runs `lsof -ti :PORT`, which lists every process +# with a socket on the port, CLIENTS included. A client that keeps a pooled connection open (a CLOSE-WAIT socket once the server is gone) therefore makes +# a restart, or systemd's automatic restart after a crash, fail with "Port is already in use" although nothing listens; v1 did not change that. +# Reference implementation: upstream's own fallback for an unusable discovery tool. resolveServeBusyPids (#14518) turns a null result into a bind probe +# of the port, which still refuses a real second listener. This shim answers the one query the preflight makes (`lsof -ti :PORT`) with exit status 2 and +# no output, which findListeningPids reports as null (only exit 1 with empty output means "no match"), so the bind probe is the guard. +# Every other lsof call passes through unchanged. It also covers what v1 covered: the no-match status 1 no longer reaches the caller. +case "$*" in + "-ti :"*) exit 2 ;; +esac +exec /usr/bin/lsof "$@" diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/post_switch.sh.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/post_switch.sh.txt new file mode 100644 index 000000000..d7789debe --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/post_switch.sh.txt @@ -0,0 +1,39 @@ +#!/bin/bash +# post_switch.sh SWITCH_DIR -- the read-backs and probes that follow the 20128 restart (all read-only except the probe requests, which are tiny model calls): +# the full owner record (gateway_record.py, schema omniroute-gateway-record/2, both ports), the units' states, the unit file before and after, the probe +# gate (with the framework-lane request, sent only if the bare id answers 200 on 20128), and the call_logs effort counts since the restart. +set -u +SWITCH_DIR="$1" +NS= +S= +UNITS=/.config/systemd/user +TOOLS= +stamp() { date -u +%FT%TZ; } +cd /tmp || exit 1 +python3 "$S/gateway_record_main.py" > "$NS/owner-record-after-switch.json" 2> "$NS/owner-record-after-switch.err"; echo "owner record rc=$?" +{ + echo "observed_utc=$(stamp)" + for u in omniroute omniroute-fw hindsight-live; do + echo "--- $u.service" + systemctl --user show "$u.service" -p ActiveState -p SubState -p MainPID -p NRestarts -p ExecMainStartTimestamp + done + echo "--- unit file sha256 (values-free files)" + ( cd "$UNITS" && sha256sum omniroute.service omniroute-fw.service ) + echo "--- rollback copies in the switch directory" + ( cd "$SWITCH_DIR" && sha256sum omniroute.service && ls -la | awk '{print $1, $5, $9}' | tail -n +2 ) + echo "--- BUILD_SHA and shim of each prefix" + for p in omniroute-3.8.51-2f42a9ac-pr13788-affinity2-pr15167 omniroute-3.8.51-2f42a9ac-pr13788-affinity2 omniroute-3.8.51-2f42a9ac-pr13788; do + echo "$p BUILD_SHA=$(cat $TOOLS/$p/lib/node_modules/omniroute/dist/BUILD_SHA) shim/lsof sha256=$(sha256sum $TOOLS/$p/shim/lsof | cut -c1-64)" + done + echo "--- health" + for port in 20128 20129; do echo "$port: $(curl -s -m 5 http://127.0.0.1:$port/api/health)"; done + echo "--- serve process arguments per unit (prefix names only)" + for u in omniroute omniroute-fw; do + pid=$(systemctl --user show "$u.service" -p MainPID --value); echo "$u: $(ps -o args= -p "$pid" | grep -o 'omniroute-[A-Za-z0-9._-]*' | head -1)" + done +} > "$NS/readback-after-switch.txt" 2>&1 +diff -u "$SWITCH_DIR/omniroute.service" "$UNITS/omniroute.service" > "$NS/unit-before-after.diff"; echo "unit diff lines: $(wc -l < "$NS/unit-before-after.diff")" +python3 "$NS/sol61-harness/probe_gate.py" after-B3 --lane > "$NS/probe-gate-after-switch.json" 2> "$NS/probe-gate-after-switch.err"; echo "probe gate rc=$?" +since=$(head -1 "$NS/readback-after-switch.txt" | cut -d= -f2) +python3 "$NS/sol61-harness/calllog_effort_read.py" omniroute counts "$(python3 -c "import datetime; print((datetime.datetime.strptime('$since','%Y-%m-%dT%H:%M:%SZ') - datetime.timedelta(minutes=3)).strftime('%Y-%m-%dT%H:%M:%SZ'))")" gpt-6 > "$NS/calllog-counts-after-switch.json" 2>&1; echo "counts rc=$?" +echo "[$(stamp)] post_switch done" diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/pr15167_identity.sh.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/pr15167_identity.sh.txt new file mode 100644 index 000000000..1b162acdc --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/pr15167_identity.sh.txt @@ -0,0 +1,16 @@ +#!/bin/bash +# pr15167_identity.sh: identity of upstream PR 15167 from git alone (no REST call): the head, base and merge base, the commit's files, its stable patch-id, and the +# same patch-id of the cherry-pick on our candidate. Run against the OmniRoute clone that holds refs/remotes/pr/15167. +C= +echo "observed_utc=$(date -u +%FT%TZ)" +echo "pr head: $(git -C $C rev-parse refs/remotes/pr/15167)" +echo "release/v3.8.52 tip: $(git -C $C rev-parse refs/remotes/origin/release/v3.8.52)" +echo "merge base: $(git -C $C merge-base refs/remotes/pr/15167 refs/remotes/origin/release/v3.8.52)" +echo "commits beyond base: $(git -C $C rev-list --count $(git -C $C merge-base refs/remotes/pr/15167 refs/remotes/origin/release/v3.8.52)..refs/remotes/pr/15167)" +echo "subject: $(git -C $C log -1 --format=%s refs/remotes/pr/15167)" +git -C $C diff --stat $(git -C $C merge-base refs/remotes/pr/15167 refs/remotes/origin/release/v3.8.52) refs/remotes/pr/15167 | sed 's/^/ /' +echo "stable patch-id, upstream commit: $(git -C $C show refs/remotes/pr/15167 | git patch-id --stable | cut -d' ' -f1)" +echo "stable patch-id, our cherry-pick: $(git -C show HEAD | git patch-id --stable | cut -d' ' -f1)" +echo "candidate head (B3): $(git -C rev-parse HEAD)" +echo "running build head (B2): $(git -C rev-parse HEAD)" +echo "candidate commits over the release/v3.8.51 tip 2f42a9ac1: $(git -C rev-list --count 2f42a9ac19d1a247ec9ce5473b790843724b3061..HEAD)" diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/preflight_shim_probe.py.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/preflight_shim_probe.py.txt new file mode 100644 index 000000000..3b8ed33cf --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/preflight_shim_probe.py.txt @@ -0,0 +1,45 @@ +"""Scratch-port test of the port preflight with shim v1 and shim v2 on PATH (no gateway involved). For each shim it runs upstream's own +resolveServeBusyPids (bin/cli/commands/serve.mjs of the B3 checkout) for a scratch port in four states: nothing there; a real listener; the listener +gone but a client still in CLOSE-WAIT; the client closed. Expected: v1 counts the CLOSE-WAIT client as busy (the trap); v2 does not, and both refuse a +real listener.""" +import json, os, shutil, socket, subprocess, tempfile, time +from pathlib import Path + +NODE = "/node-24.21.0/bin/node" +SERVE = "/bin/cli/commands/serve.mjs" +V1 = "/omniroute-3.8.51-2f42a9ac-pr13788-affinity2/shim/lsof" +V2 = "/lsof-shim-v2.sh" + +def busy(port, shim_dir): + code = f"import('file://{SERVE}').then(async m => console.log(JSON.stringify(await m.resolveServeBusyPids({port}))))" + env = {"PATH": f"{shim_dir}:/node-24.21.0/bin:/usr/bin:/bin", "HOME": tempfile.gettempdir()} + r = subprocess.run([NODE, "-e", code], capture_output=True, text=True, env=env, timeout=60) + last = (r.stdout.strip().splitlines() or [""])[-1] + return last if last.startswith("[") else (r.stderr.strip()[:160] or "no output") + +def scenario(port_holder): + server = socket.socket(); server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1); server.bind(("127.0.0.1", 0)); server.listen(5) + port = server.getsockname()[1] + return server, port + +results = {} +for label, shim in (("v1", V1), ("v2", V2)): + d = tempfile.mkdtemp(prefix="shim-" + label + "-") + shutil.copy(shim, Path(d) / "lsof"); os.chmod(Path(d) / "lsof", 0o755) + row = {} + # 1. nothing on the port: pick a free port, close the socket + s = socket.socket(); s.bind(("127.0.0.1", 0)); port = s.getsockname()[1]; s.close() + row["nothing_there"] = busy(port, d) + # 2. a real listener plus a connected client + server = socket.socket(); server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1); server.bind(("127.0.0.1", port)); server.listen(5) + client = socket.create_connection(("127.0.0.1", port)); conn, _ = server.accept() + row["real_listener_and_client"] = busy(port, d) + # 3. the listener is gone, the client has not closed its end (CLOSE-WAIT) + conn.close(); server.close(); time.sleep(0.5) + row["listener_gone_client_close_wait"] = busy(port, d) + # 4. the client closed + client.close(); time.sleep(0.3) + row["client_closed"] = busy(port, d) + results[label] = row + shutil.rmtree(d, ignore_errors=True) +print(json.dumps(results, indent=1)) diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/preflight_trap_probe.py.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/preflight_trap_probe.py.txt new file mode 100644 index 000000000..7e62fcca5 --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/preflight_trap_probe.py.txt @@ -0,0 +1,31 @@ +"""Scratch-port reproduction of serve's port-preflight trap (no gateway involved): after the server side of a connection is gone, a client that has not +closed its end stays in CLOSE-WAIT, and `lsof -ti :PORT` (what findListeningPids runs) still lists the client's pid although nothing listens. +Prints the lsof result and what upstream's findListeningPids returns for the port, with and without a listener.""" +import json, os, socket, subprocess, sys, time + +NODE = "/node-24.21.0/bin/node" +PID_MJS = "/bin/cli/utils/pid.mjs" + +def lsof(port): + r = subprocess.run(["/usr/bin/lsof", "-ti", f":{port}"], capture_output=True, text=True) + return sorted(int(x) for x in r.stdout.split() if x.strip().isdigit()) + +def discover(port): + code = f"import('file://{PID_MJS}').then(async m => console.log(JSON.stringify(await m.findListeningPids({port}))))" + r = subprocess.run([NODE, "-e", code], capture_output=True, text=True) + return r.stdout.strip() or r.stderr.strip()[:120] + +server = socket.socket(); server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1); server.bind(("127.0.0.1", 0)); server.listen(5) +port = server.getsockname()[1] +client = socket.create_connection(("127.0.0.1", port)) +conn, _ = server.accept() +out = {"me": os.getpid(), "scratch_port": port} +out["with_listener_and_client"] = {"lsof": lsof(port), "findListeningPids": discover(port)} +conn.close(); server.close() # the server side is gone; the client has not closed its end +time.sleep(0.5) +states = subprocess.run(["ss", "-Htn", f"( dport = :{port} )"], capture_output=True, text=True).stdout.split() +out["after_server_gone"] = {"client_socket_state": states[0] if states else None, "lsof": lsof(port), "findListeningPids": discover(port)} +client.close() +time.sleep(0.3) +out["after_client_closed"] = {"lsof": lsof(port), "findListeningPids": discover(port)} +print(json.dumps(out, indent=1)) diff --git a/evidence/artifacts/omniroute-sol-max-20260930/scripts/probe_gate.py.txt b/evidence/artifacts/omniroute-sol-max-20260930/scripts/probe_gate.py.txt new file mode 100644 index 000000000..83b7b8d2c --- /dev/null +++ b/evidence/artifacts/omniroute-sol-max-20260930/scripts/probe_gate.py.txt @@ -0,0 +1,139 @@ +"""Probe gate for the 20128 restart onto the upstream PR 15167 prefix: a few tiny live requests through the gateway and, for each, a read-only look at the +effort the gateway sent upstream (the call_logs row's two effort columns, filled for rows whose response carried encrypted reasoning). +Values-free: the gateway is keyless on loopback, so no credential is read or sent; the output holds status codes, response event types, the served +model, token counts and the metadata columns named below, never a request or response body. +Usage: probe_gate.py