docs(wp-0031): record verified OpenRouter diagnosis
Tested rather than relayed: OpenRouter answers 'User not found' for the delivered key, which means no account resolves it — an existing-account key reissue, not a new account. Ruled out credits (402), model permissions (403), provider config, and pod health. Also records a latent delivery defect: the secret carries a trailing newline, harmless today only because llm_connect/config.py:53 strips it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
17f2caee01
commit
4f59845f51
2 changed files with 33 additions and 0 deletions
|
|
@ -35,6 +35,7 @@
|
||||||
| workplan | ACTIVITY-WP-0029 | active | — | workplans/ACTIVITY-WP-0029-hub-port-alignment.md |
|
| workplan | ACTIVITY-WP-0029 | active | — | workplans/ACTIVITY-WP-0029-hub-port-alignment.md |
|
||||||
| workplan | ACTIVITY-WP-0030 | active | — | workplans/ACTIVITY-WP-0030-daily-sbom-catchup.md |
|
| workplan | ACTIVITY-WP-0030 | active | — | workplans/ACTIVITY-WP-0030-daily-sbom-catchup.md |
|
||||||
| workplan | ACTIVITY-WP-0031 | active | — | workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md |
|
| workplan | ACTIVITY-WP-0031 | active | — | workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md |
|
||||||
|
| workplan | ACTIVITY-WP-0032 | proposed | — | workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md |
|
||||||
| workplan | ADHOC-2026-06-01 | finished | — | workplans/ADHOC-2026-06-01.md |
|
| workplan | ADHOC-2026-06-01 | finished | — | workplans/ADHOC-2026-06-01.md |
|
||||||
| workplan | ADHOC-2026-08-20 | finished | — | workplans/ADHOC-2026-08-20.md |
|
| workplan | ADHOC-2026-08-20 | finished | — | workplans/ADHOC-2026-08-20.md |
|
||||||
| workplan | custodian-WP-0001 | done | — | workplans/custodian-WP-0001-temporal-backbone.md |
|
| workplan | custodian-WP-0001 | done | — | workplans/custodian-WP-0001-temporal-backbone.md |
|
||||||
|
|
@ -193,6 +194,11 @@
|
||||||
| task | ACTIVITY-WP-0031-T03 | done | — | workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md |
|
| task | ACTIVITY-WP-0031-T03 | done | — | workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md |
|
||||||
| task | ACTIVITY-WP-0031-T04 | done | — | workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md |
|
| task | ACTIVITY-WP-0031-T04 | done | — | workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md |
|
||||||
| task | ACTIVITY-WP-0031-T05 | wait | — | workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md |
|
| task | ACTIVITY-WP-0031-T05 | wait | — | workplans/ACTIVITY-WP-0031-production-execution-reliability-cleanup.md |
|
||||||
|
| task | ACTIVITY-WP-0032-T01 | wait | — | workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md |
|
||||||
|
| task | ACTIVITY-WP-0032-T02 | wait | — | workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md |
|
||||||
|
| task | ACTIVITY-WP-0032-T03 | wait | — | workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md |
|
||||||
|
| task | ACTIVITY-WP-0032-T04 | wait | — | workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md |
|
||||||
|
| task | ACTIVITY-WP-0032-T05 | wait | — | workplans/ACTIVITY-WP-0032-glas-profile-execution-contract.md |
|
||||||
| task | ADHOC-2026-06-01-T01 | done | — | workplans/ADHOC-2026-06-01.md |
|
| task | ADHOC-2026-06-01-T01 | done | — | workplans/ADHOC-2026-06-01.md |
|
||||||
| task | ADHOC-2026-06-01-T02 | done | — | workplans/ADHOC-2026-06-01.md |
|
| task | ADHOC-2026-06-01-T02 | done | — | workplans/ADHOC-2026-06-01.md |
|
||||||
| task | ADHOC-2026-06-01-T03 | done | — | workplans/ADHOC-2026-06-01.md |
|
| task | ADHOC-2026-06-01-T03 | done | — | workplans/ADHOC-2026-06-01.md |
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,33 @@ T01 still `wait`: the key rotation itself remains attended and
|
||||||
railiance-platform-owned. What changed is that the next failure will name its
|
railiance-platform-owned. What changed is that the next failure will name its
|
||||||
own cause.
|
own cause.
|
||||||
|
|
||||||
|
Diagnosis verified 2026-08-21 (previously relayed, now tested). Direct probe
|
||||||
|
from the llm-connect pod, no secret read or printed:
|
||||||
|
|
||||||
|
- `POST /execute` → `502 {"error":"provider_api_error","provider_status":401,
|
||||||
|
"message":"HTTP 401 from https://openrouter.ai/api/v1/chat/completions"}`
|
||||||
|
- `GET https://openrouter.ai/api/v1/key` with the delivered key →
|
||||||
|
**`401 {"error":{"message":"User not found.","code":401}}`**
|
||||||
|
|
||||||
|
"User not found" is OpenRouter's wording for a key that resolves to **no
|
||||||
|
account**. It is not insufficient credits (402) and not a model-permission
|
||||||
|
problem (403), so **no new OpenRouter account is required** — the existing
|
||||||
|
account needs a new key issued, because this key value is dead.
|
||||||
|
Key fingerprint for identification: `sha256[:12] = ab938241a2ec`, length 73
|
||||||
|
(+1, see below), prefix `sk-or-v1-`.
|
||||||
|
|
||||||
|
Ruled out along the way: provider/model config is correct
|
||||||
|
(`LLM_CONNECT_PROVIDER=openrouter`, `google/gemini-2.5-flash`); the Service and
|
||||||
|
pod are healthy; the ExternalSecret delivers exactly one key under the expected
|
||||||
|
name.
|
||||||
|
|
||||||
|
**Separate latent defect, railiance-platform lane:** the delivered secret has a
|
||||||
|
trailing newline (74 bytes for a 73-char key; `urllib` refuses it as a header
|
||||||
|
value outright). It is currently harmless only because
|
||||||
|
`llm_connect/config.py:53` calls `.strip()` on the env value. Any consumer that
|
||||||
|
does not strip would fail on a perfectly valid key. Worth fixing in the
|
||||||
|
OpenBao→ESO lane while the key is being replaced.
|
||||||
|
|
||||||
## Emergency-pause weekly SBOM fan-out
|
## Emergency-pause weekly SBOM fan-out
|
||||||
|
|
||||||
```task
|
```task
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue