deepdebug-local-agent 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/.claude/context.md +2 -1
  2. package/CLAUDE.md +1 -1
  3. package/docs/la-protocol-v2.md +27 -4
  4. package/env.example +12 -0
  5. package/package.json +1 -1
  6. package/scripts/incident-parity/Gen.java +256 -0
  7. package/scripts/incident-parity/LogEntry.java +17 -0
  8. package/scripts/incident-parity/extract.py +51 -0
  9. package/scripts/incident-parity/gen.sh +32 -0
  10. package/src/incident-detector/README.md +52 -0
  11. package/src/incident-detector/aggregator.js +78 -0
  12. package/src/incident-detector/categorize.js +48 -0
  13. package/src/incident-detector/config.js +95 -0
  14. package/src/incident-detector/detector.js +93 -0
  15. package/src/incident-detector/emitter.js +164 -0
  16. package/src/incident-detector/index.js +44 -0
  17. package/src/incident-detector/java-compat.js +66 -0
  18. package/src/incident-detector/normalize.js +209 -0
  19. package/src/incident-detector/parse.js +114 -0
  20. package/src/incident-detector/sources/file-source.js +113 -0
  21. package/src/incident-detector/sources/loki-source.js +101 -0
  22. package/src/incident-detector/sources/stream-source.js +39 -0
  23. package/src/incident-detector/sources/webhook-source.js +109 -0
  24. package/src/incident-detector/store.js +119 -0
  25. package/src/la-protocol-v2/contract/CONTRACT_SOURCE.json +24 -16
  26. package/src/la-protocol-v2/contract/README.md +103 -3
  27. package/src/la-protocol-v2/contract/config.update.schema.json +85 -1
  28. package/src/la-protocol-v2/contract/hello.schema.json +26 -1
  29. package/src/la-protocol-v2/contract/incident.candidate.schema.json +11 -0
  30. package/src/la-protocol-v2/contract/index.json +9 -2
  31. package/src/la-protocol-v2/contract/ready.schema.json +8 -0
  32. package/src/la-protocol-v2/contract/register.schema.json +26 -1
  33. package/src/la-protocol-v2/contract/webhook.forward.schema.json +72 -3
  34. package/src/la-protocol-v2/contract.js +45 -7
  35. package/src/la-protocol-v2/llm-key/config.js +29 -0
  36. package/src/la-protocol-v2/llm-key/handler.js +33 -0
  37. package/src/la-protocol-v2/llm-key/install.js +21 -0
  38. package/src/la-protocol-v2/llm-key/store.js +173 -0
  39. package/src/la-protocol-v2/runtime.js +44 -1
  40. package/src/la-protocol-v2/session.js +47 -13
  41. package/src/la-protocol-v2/webhooks/assembler.js +85 -0
  42. package/src/la-protocol-v2/webhooks/config.js +51 -0
  43. package/src/la-protocol-v2/webhooks/handler.js +125 -0
  44. package/src/la-protocol-v2/webhooks/install.js +22 -0
  45. package/test/contract/la-protocol-v2/vectors/ack.vectors.json +91 -0
  46. package/test/contract/la-protocol-v2/vectors/config.update.vectors.json +1339 -0
  47. package/test/contract/la-protocol-v2/vectors/hello.vectors.json +261 -0
  48. package/test/contract/la-protocol-v2/vectors/incident.candidate.vectors.json +623 -0
  49. package/test/contract/la-protocol-v2/vectors/ready.vectors.json +599 -0
  50. package/test/contract/la-protocol-v2/vectors/register.vectors.json +275 -0
  51. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-after-last.json +186 -0
  52. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-body-hash-changes.json +186 -0
  53. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-last-flag-wrong.json +186 -0
  54. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-non-last-too-short.json +152 -0
  55. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-out-of-order.json +152 -0
  56. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-sha-mismatch.json +186 -0
  57. package/test/contract/la-protocol-v2/vectors/traces/invalid-webhook-chunk-total-changes.json +186 -0
  58. package/test/contract/la-protocol-v2/vectors/traces/valid-webhook-chunks-in-order.json +218 -0
  59. package/test/contract/la-protocol-v2/vectors/webhook.forward.vectors.json +1263 -0
  60. package/test/incident-detector/parity.test.js +66 -0
  61. package/test/incident-detector/parity.vectors.json +2619 -0
  62. package/test/incident-detector/size-model.test.js +127 -0
  63. package/test/incident-detector/sources.test.js +179 -0
  64. package/test/incident-detector/units.test.js +430 -0
  65. package/test/incident-detector/wiring.test.js +165 -0
  66. package/test/la-protocol-v2/contract-v21.test.js +107 -0
  67. package/test/la-protocol-v2/contract.test.js +6 -4
  68. package/test/la-protocol-v2/helpers/reference-cp.js +8 -4
  69. package/test/la-protocol-v2/llm-key.test.js +509 -0
  70. package/test/la-protocol-v2/traces.test.js +3 -3
  71. package/test/la-protocol-v2/webhook-receiver.test.js +702 -0
@@ -184,6 +184,1345 @@
184
184
  },
185
185
  "payload": {}
186
186
  }
187
+ },
188
+ {
189
+ "name": "llm-key-set-minimal",
190
+ "why": "a virtual LiteLLM key delivered on the signed v2 channel (config.update.llmKey, op set)",
191
+ "expect": {
192
+ "valid": true
193
+ },
194
+ "message": {
195
+ "schemaVersion": 2,
196
+ "type": "config.update",
197
+ "msgId": "00000000-0000-4000-8000-000000000101",
198
+ "seq": 1,
199
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
200
+ "workspaceId": "ws-1",
201
+ "ts": "2026-10-29T10:00:00Z",
202
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
203
+ "sig": {
204
+ "keyId": "vh-cp-2026-10",
205
+ "timestamp": "1793268000",
206
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
207
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
208
+ "workspaceId": "ws-1",
209
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
210
+ },
211
+ "payload": {
212
+ "llmKey": {
213
+ "op": "set",
214
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
215
+ "endpoint": "https://llm.eu.visionhammer.io",
216
+ "key": "sk-vector-not-a-real-key-0001",
217
+ "models": [
218
+ "vh-claude-sonnet-vertex",
219
+ "vh-embed"
220
+ ],
221
+ "expiresAt": "2026-12-31T23:59:59Z"
222
+ }
223
+ }
224
+ }
225
+ },
226
+ {
227
+ "name": "llm-key-set-longest-key-and-32-models",
228
+ "why": "256-char key and the 32-model cap",
229
+ "expect": {
230
+ "valid": true
231
+ },
232
+ "message": {
233
+ "schemaVersion": 2,
234
+ "type": "config.update",
235
+ "msgId": "00000000-0000-4000-8000-000000000102",
236
+ "seq": 1,
237
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
238
+ "workspaceId": "ws-1",
239
+ "ts": "2026-10-29T10:00:00Z",
240
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"bb76e4a6b85768d34926d5d1e1153cfced0b70c8352844f650cc2333b94e3807\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b\",\"models\":[\"m-00\",\"m-01\",\"m-02\",\"m-03\",\"m-04\",\"m-05\",\"m-06\",\"m-07\",\"m-08\",\"m-09\",\"m-10\",\"m-11\",\"m-12\",\"m-13\",\"m-14\",\"m-15\",\"m-16\",\"m-17\",\"m-18\",\"m-19\",\"m-20\",\"m-21\",\"m-22\",\"m-23\",\"m-24\",\"m-25\",\"m-26\",\"m-27\",\"m-28\",\"m-29\",\"m-30\",\"m-31\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
241
+ "sig": {
242
+ "keyId": "vh-cp-2026-10",
243
+ "timestamp": "1793268000",
244
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
245
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
246
+ "workspaceId": "ws-1",
247
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
248
+ },
249
+ "payload": {
250
+ "llmKey": {
251
+ "op": "set",
252
+ "keyId": "bb76e4a6b85768d34926d5d1e1153cfced0b70c8352844f650cc2333b94e3807",
253
+ "endpoint": "https://llm.eu.visionhammer.io",
254
+ "key": "sk-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b2_C3d4-A1b",
255
+ "models": [
256
+ "m-00",
257
+ "m-01",
258
+ "m-02",
259
+ "m-03",
260
+ "m-04",
261
+ "m-05",
262
+ "m-06",
263
+ "m-07",
264
+ "m-08",
265
+ "m-09",
266
+ "m-10",
267
+ "m-11",
268
+ "m-12",
269
+ "m-13",
270
+ "m-14",
271
+ "m-15",
272
+ "m-16",
273
+ "m-17",
274
+ "m-18",
275
+ "m-19",
276
+ "m-20",
277
+ "m-21",
278
+ "m-22",
279
+ "m-23",
280
+ "m-24",
281
+ "m-25",
282
+ "m-26",
283
+ "m-27",
284
+ "m-28",
285
+ "m-29",
286
+ "m-30",
287
+ "m-31"
288
+ ],
289
+ "expiresAt": "2026-12-31T23:59:59Z"
290
+ }
291
+ }
292
+ }
293
+ },
294
+ {
295
+ "name": "llm-key-set-endpoint-with-port-and-path",
296
+ "why": "endpoint may carry a port and a path, https only",
297
+ "expect": {
298
+ "valid": true
299
+ },
300
+ "message": {
301
+ "schemaVersion": 2,
302
+ "type": "config.update",
303
+ "msgId": "00000000-0000-4000-8000-000000000103",
304
+ "seq": 1,
305
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
306
+ "workspaceId": "ws-1",
307
+ "ts": "2026-10-29T10:00:00Z",
308
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io:4000/v1\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
309
+ "sig": {
310
+ "keyId": "vh-cp-2026-10",
311
+ "timestamp": "1793268000",
312
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
313
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
314
+ "workspaceId": "ws-1",
315
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
316
+ },
317
+ "payload": {
318
+ "llmKey": {
319
+ "op": "set",
320
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
321
+ "endpoint": "https://llm.eu.visionhammer.io:4000/v1",
322
+ "key": "sk-vector-not-a-real-key-0001",
323
+ "models": [
324
+ "vh-claude-sonnet-vertex",
325
+ "vh-embed"
326
+ ],
327
+ "expiresAt": "2026-12-31T23:59:59Z"
328
+ }
329
+ }
330
+ }
331
+ },
332
+ {
333
+ "name": "llm-key-revoke",
334
+ "why": "revoke names the key id only, never the key",
335
+ "expect": {
336
+ "valid": true
337
+ },
338
+ "message": {
339
+ "schemaVersion": 2,
340
+ "type": "config.update",
341
+ "msgId": "00000000-0000-4000-8000-000000000104",
342
+ "seq": 1,
343
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
344
+ "workspaceId": "ws-1",
345
+ "ts": "2026-10-29T10:00:00Z",
346
+ "paramsRaw": "{\"llmKey\":{\"op\":\"revoke\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\"}}",
347
+ "sig": {
348
+ "keyId": "vh-cp-2026-10",
349
+ "timestamp": "1793268000",
350
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
351
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
352
+ "workspaceId": "ws-1",
353
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
354
+ },
355
+ "payload": {
356
+ "llmKey": {
357
+ "op": "revoke",
358
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48"
359
+ }
360
+ }
361
+ }
362
+ },
363
+ {
364
+ "name": "llm-key-set-one-model-alias-with-slash",
365
+ "why": "an alias like vertex_ai/model is a valid model name",
366
+ "expect": {
367
+ "valid": true
368
+ },
369
+ "message": {
370
+ "schemaVersion": 2,
371
+ "type": "config.update",
372
+ "msgId": "00000000-0000-4000-8000-000000000105",
373
+ "seq": 1,
374
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
375
+ "workspaceId": "ws-1",
376
+ "ts": "2026-10-29T10:00:00Z",
377
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vertex_ai/claude-sonnet\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
378
+ "sig": {
379
+ "keyId": "vh-cp-2026-10",
380
+ "timestamp": "1793268000",
381
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
382
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
383
+ "workspaceId": "ws-1",
384
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
385
+ },
386
+ "payload": {
387
+ "llmKey": {
388
+ "op": "set",
389
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
390
+ "endpoint": "https://llm.eu.visionhammer.io",
391
+ "key": "sk-vector-not-a-real-key-0001",
392
+ "models": [
393
+ "vertex_ai/claude-sonnet"
394
+ ],
395
+ "expiresAt": "2026-12-31T23:59:59Z"
396
+ }
397
+ }
398
+ }
399
+ },
400
+ {
401
+ "name": "llm-key-rotation-set-with-a-new-key-id",
402
+ "why": "rotation = a new set with another key id; the LA replaces the old key",
403
+ "expect": {
404
+ "valid": true
405
+ },
406
+ "message": {
407
+ "schemaVersion": 2,
408
+ "type": "config.update",
409
+ "msgId": "00000000-0000-4000-8000-000000000106",
410
+ "seq": 1,
411
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
412
+ "workspaceId": "ws-1",
413
+ "ts": "2026-10-29T10:00:00Z",
414
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"22d5182066b642849b519baa358e89a4a85fa355a083e8b061f2dec1e8358ca1\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0002\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
415
+ "sig": {
416
+ "keyId": "vh-cp-2026-10",
417
+ "timestamp": "1793268000",
418
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
419
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
420
+ "workspaceId": "ws-1",
421
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
422
+ },
423
+ "payload": {
424
+ "llmKey": {
425
+ "op": "set",
426
+ "keyId": "22d5182066b642849b519baa358e89a4a85fa355a083e8b061f2dec1e8358ca1",
427
+ "endpoint": "https://llm.eu.visionhammer.io",
428
+ "key": "sk-vector-not-a-real-key-0002",
429
+ "models": [
430
+ "vh-claude-sonnet-vertex",
431
+ "vh-embed"
432
+ ],
433
+ "expiresAt": "2026-12-31T23:59:59Z"
434
+ }
435
+ }
436
+ }
437
+ },
438
+ {
439
+ "name": "llm-key-set-without-key",
440
+ "why": "a set must carry the key",
441
+ "expect": {
442
+ "valid": false,
443
+ "code": "schema_violation",
444
+ "keyword": "oneOf"
445
+ },
446
+ "message": {
447
+ "schemaVersion": 2,
448
+ "type": "config.update",
449
+ "msgId": "00000000-0000-4000-8000-000000000107",
450
+ "seq": 1,
451
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
452
+ "workspaceId": "ws-1",
453
+ "ts": "2026-10-29T10:00:00Z",
454
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
455
+ "sig": {
456
+ "keyId": "vh-cp-2026-10",
457
+ "timestamp": "1793268000",
458
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
459
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
460
+ "workspaceId": "ws-1",
461
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
462
+ },
463
+ "payload": {
464
+ "llmKey": {
465
+ "op": "set",
466
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
467
+ "endpoint": "https://llm.eu.visionhammer.io",
468
+ "models": [
469
+ "vh-claude-sonnet-vertex",
470
+ "vh-embed"
471
+ ],
472
+ "expiresAt": "2026-12-31T23:59:59Z"
473
+ }
474
+ }
475
+ }
476
+ },
477
+ {
478
+ "name": "llm-key-set-without-expires-at",
479
+ "why": "a key always expires",
480
+ "expect": {
481
+ "valid": false,
482
+ "code": "schema_violation",
483
+ "keyword": "oneOf"
484
+ },
485
+ "message": {
486
+ "schemaVersion": 2,
487
+ "type": "config.update",
488
+ "msgId": "00000000-0000-4000-8000-000000000108",
489
+ "seq": 1,
490
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
491
+ "workspaceId": "ws-1",
492
+ "ts": "2026-10-29T10:00:00Z",
493
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"]}}",
494
+ "sig": {
495
+ "keyId": "vh-cp-2026-10",
496
+ "timestamp": "1793268000",
497
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
498
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
499
+ "workspaceId": "ws-1",
500
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
501
+ },
502
+ "payload": {
503
+ "llmKey": {
504
+ "op": "set",
505
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
506
+ "endpoint": "https://llm.eu.visionhammer.io",
507
+ "key": "sk-vector-not-a-real-key-0001",
508
+ "models": [
509
+ "vh-claude-sonnet-vertex",
510
+ "vh-embed"
511
+ ]
512
+ }
513
+ }
514
+ }
515
+ },
516
+ {
517
+ "name": "llm-key-set-without-models",
518
+ "why": "the model list is the scope of the key",
519
+ "expect": {
520
+ "valid": false,
521
+ "code": "schema_violation",
522
+ "keyword": "oneOf"
523
+ },
524
+ "message": {
525
+ "schemaVersion": 2,
526
+ "type": "config.update",
527
+ "msgId": "00000000-0000-4000-8000-000000000109",
528
+ "seq": 1,
529
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
530
+ "workspaceId": "ws-1",
531
+ "ts": "2026-10-29T10:00:00Z",
532
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
533
+ "sig": {
534
+ "keyId": "vh-cp-2026-10",
535
+ "timestamp": "1793268000",
536
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
537
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
538
+ "workspaceId": "ws-1",
539
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
540
+ },
541
+ "payload": {
542
+ "llmKey": {
543
+ "op": "set",
544
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
545
+ "endpoint": "https://llm.eu.visionhammer.io",
546
+ "key": "sk-vector-not-a-real-key-0001",
547
+ "expiresAt": "2026-12-31T23:59:59Z"
548
+ }
549
+ }
550
+ }
551
+ },
552
+ {
553
+ "name": "llm-key-set-without-endpoint",
554
+ "why": "the LA must know where to call",
555
+ "expect": {
556
+ "valid": false,
557
+ "code": "schema_violation",
558
+ "keyword": "oneOf"
559
+ },
560
+ "message": {
561
+ "schemaVersion": 2,
562
+ "type": "config.update",
563
+ "msgId": "00000000-0000-4000-8000-000000000110",
564
+ "seq": 1,
565
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
566
+ "workspaceId": "ws-1",
567
+ "ts": "2026-10-29T10:00:00Z",
568
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
569
+ "sig": {
570
+ "keyId": "vh-cp-2026-10",
571
+ "timestamp": "1793268000",
572
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
573
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
574
+ "workspaceId": "ws-1",
575
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
576
+ },
577
+ "payload": {
578
+ "llmKey": {
579
+ "op": "set",
580
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
581
+ "key": "sk-vector-not-a-real-key-0001",
582
+ "models": [
583
+ "vh-claude-sonnet-vertex",
584
+ "vh-embed"
585
+ ],
586
+ "expiresAt": "2026-12-31T23:59:59Z"
587
+ }
588
+ }
589
+ }
590
+ },
591
+ {
592
+ "name": "llm-key-endpoint-http",
593
+ "why": "plain http is refused: the key would travel in clear",
594
+ "expect": {
595
+ "valid": false,
596
+ "code": "schema_violation",
597
+ "keyword": "oneOf"
598
+ },
599
+ "message": {
600
+ "schemaVersion": 2,
601
+ "type": "config.update",
602
+ "msgId": "00000000-0000-4000-8000-000000000111",
603
+ "seq": 1,
604
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
605
+ "workspaceId": "ws-1",
606
+ "ts": "2026-10-29T10:00:00Z",
607
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"http://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
608
+ "sig": {
609
+ "keyId": "vh-cp-2026-10",
610
+ "timestamp": "1793268000",
611
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
612
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
613
+ "workspaceId": "ws-1",
614
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
615
+ },
616
+ "payload": {
617
+ "llmKey": {
618
+ "op": "set",
619
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
620
+ "endpoint": "http://llm.eu.visionhammer.io",
621
+ "key": "sk-vector-not-a-real-key-0001",
622
+ "models": [
623
+ "vh-claude-sonnet-vertex",
624
+ "vh-embed"
625
+ ],
626
+ "expiresAt": "2026-12-31T23:59:59Z"
627
+ }
628
+ }
629
+ }
630
+ },
631
+ {
632
+ "name": "llm-key-endpoint-with-credentials",
633
+ "why": "no user:password in the endpoint",
634
+ "expect": {
635
+ "valid": false,
636
+ "code": "schema_violation",
637
+ "keyword": "oneOf"
638
+ },
639
+ "message": {
640
+ "schemaVersion": 2,
641
+ "type": "config.update",
642
+ "msgId": "00000000-0000-4000-8000-000000000112",
643
+ "seq": 1,
644
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
645
+ "workspaceId": "ws-1",
646
+ "ts": "2026-10-29T10:00:00Z",
647
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://user:pw@llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
648
+ "sig": {
649
+ "keyId": "vh-cp-2026-10",
650
+ "timestamp": "1793268000",
651
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
652
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
653
+ "workspaceId": "ws-1",
654
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
655
+ },
656
+ "payload": {
657
+ "llmKey": {
658
+ "op": "set",
659
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
660
+ "endpoint": "https://user:pw@llm.eu.visionhammer.io",
661
+ "key": "sk-vector-not-a-real-key-0001",
662
+ "models": [
663
+ "vh-claude-sonnet-vertex",
664
+ "vh-embed"
665
+ ],
666
+ "expiresAt": "2026-12-31T23:59:59Z"
667
+ }
668
+ }
669
+ }
670
+ },
671
+ {
672
+ "name": "llm-key-endpoint-with-query",
673
+ "why": "no query string (a second place for a secret)",
674
+ "expect": {
675
+ "valid": false,
676
+ "code": "schema_violation",
677
+ "keyword": "oneOf"
678
+ },
679
+ "message": {
680
+ "schemaVersion": 2,
681
+ "type": "config.update",
682
+ "msgId": "00000000-0000-4000-8000-000000000113",
683
+ "seq": 1,
684
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
685
+ "workspaceId": "ws-1",
686
+ "ts": "2026-10-29T10:00:00Z",
687
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io/v1?api_key=x\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
688
+ "sig": {
689
+ "keyId": "vh-cp-2026-10",
690
+ "timestamp": "1793268000",
691
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
692
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
693
+ "workspaceId": "ws-1",
694
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
695
+ },
696
+ "payload": {
697
+ "llmKey": {
698
+ "op": "set",
699
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
700
+ "endpoint": "https://llm.eu.visionhammer.io/v1?api_key=x",
701
+ "key": "sk-vector-not-a-real-key-0001",
702
+ "models": [
703
+ "vh-claude-sonnet-vertex",
704
+ "vh-embed"
705
+ ],
706
+ "expiresAt": "2026-12-31T23:59:59Z"
707
+ }
708
+ }
709
+ }
710
+ },
711
+ {
712
+ "name": "llm-key-endpoint-with-space",
713
+ "why": "endpoint is a bare URL",
714
+ "expect": {
715
+ "valid": false,
716
+ "code": "schema_violation",
717
+ "keyword": "oneOf"
718
+ },
719
+ "message": {
720
+ "schemaVersion": 2,
721
+ "type": "config.update",
722
+ "msgId": "00000000-0000-4000-8000-000000000114",
723
+ "seq": 1,
724
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
725
+ "workspaceId": "ws-1",
726
+ "ts": "2026-10-29T10:00:00Z",
727
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io /v1\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
728
+ "sig": {
729
+ "keyId": "vh-cp-2026-10",
730
+ "timestamp": "1793268000",
731
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
732
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
733
+ "workspaceId": "ws-1",
734
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
735
+ },
736
+ "payload": {
737
+ "llmKey": {
738
+ "op": "set",
739
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
740
+ "endpoint": "https://llm.eu.visionhammer.io /v1",
741
+ "key": "sk-vector-not-a-real-key-0001",
742
+ "models": [
743
+ "vh-claude-sonnet-vertex",
744
+ "vh-embed"
745
+ ],
746
+ "expiresAt": "2026-12-31T23:59:59Z"
747
+ }
748
+ }
749
+ }
750
+ },
751
+ {
752
+ "name": "llm-key-key-with-newline",
753
+ "why": "the key charset is closed: no whitespace, no control character",
754
+ "expect": {
755
+ "valid": false,
756
+ "code": "schema_violation",
757
+ "keyword": "oneOf"
758
+ },
759
+ "message": {
760
+ "schemaVersion": 2,
761
+ "type": "config.update",
762
+ "msgId": "00000000-0000-4000-8000-000000000115",
763
+ "seq": 1,
764
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
765
+ "workspaceId": "ws-1",
766
+ "ts": "2026-10-29T10:00:00Z",
767
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real\\nkey-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
768
+ "sig": {
769
+ "keyId": "vh-cp-2026-10",
770
+ "timestamp": "1793268000",
771
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
772
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
773
+ "workspaceId": "ws-1",
774
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
775
+ },
776
+ "payload": {
777
+ "llmKey": {
778
+ "op": "set",
779
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
780
+ "endpoint": "https://llm.eu.visionhammer.io",
781
+ "key": "sk-vector-not-a-real\nkey-0001",
782
+ "models": [
783
+ "vh-claude-sonnet-vertex",
784
+ "vh-embed"
785
+ ],
786
+ "expiresAt": "2026-12-31T23:59:59Z"
787
+ }
788
+ }
789
+ }
790
+ },
791
+ {
792
+ "name": "llm-key-key-with-space",
793
+ "why": "no whitespace in a key",
794
+ "expect": {
795
+ "valid": false,
796
+ "code": "schema_violation",
797
+ "keyword": "oneOf"
798
+ },
799
+ "message": {
800
+ "schemaVersion": 2,
801
+ "type": "config.update",
802
+ "msgId": "00000000-0000-4000-8000-000000000116",
803
+ "seq": 1,
804
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
805
+ "workspaceId": "ws-1",
806
+ "ts": "2026-10-29T10:00:00Z",
807
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
808
+ "sig": {
809
+ "keyId": "vh-cp-2026-10",
810
+ "timestamp": "1793268000",
811
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
812
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
813
+ "workspaceId": "ws-1",
814
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
815
+ },
816
+ "payload": {
817
+ "llmKey": {
818
+ "op": "set",
819
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
820
+ "endpoint": "https://llm.eu.visionhammer.io",
821
+ "key": "sk-vector not-a-real-key-0001",
822
+ "models": [
823
+ "vh-claude-sonnet-vertex",
824
+ "vh-embed"
825
+ ],
826
+ "expiresAt": "2026-12-31T23:59:59Z"
827
+ }
828
+ }
829
+ }
830
+ },
831
+ {
832
+ "name": "llm-key-key-too-short",
833
+ "why": "15 chars",
834
+ "expect": {
835
+ "valid": false,
836
+ "code": "schema_violation",
837
+ "keyword": "oneOf"
838
+ },
839
+ "message": {
840
+ "schemaVersion": 2,
841
+ "type": "config.update",
842
+ "msgId": "00000000-0000-4000-8000-000000000117",
843
+ "seq": 1,
844
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
845
+ "workspaceId": "ws-1",
846
+ "ts": "2026-10-29T10:00:00Z",
847
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-short-key-12\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
848
+ "sig": {
849
+ "keyId": "vh-cp-2026-10",
850
+ "timestamp": "1793268000",
851
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
852
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
853
+ "workspaceId": "ws-1",
854
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
855
+ },
856
+ "payload": {
857
+ "llmKey": {
858
+ "op": "set",
859
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
860
+ "endpoint": "https://llm.eu.visionhammer.io",
861
+ "key": "sk-short-key-12",
862
+ "models": [
863
+ "vh-claude-sonnet-vertex",
864
+ "vh-embed"
865
+ ],
866
+ "expiresAt": "2026-12-31T23:59:59Z"
867
+ }
868
+ }
869
+ }
870
+ },
871
+ {
872
+ "name": "llm-key-key-too-long",
873
+ "why": "257 chars",
874
+ "expect": {
875
+ "valid": false,
876
+ "code": "schema_violation",
877
+ "keyword": "oneOf"
878
+ },
879
+ "message": {
880
+ "schemaVersion": 2,
881
+ "type": "config.update",
882
+ "msgId": "00000000-0000-4000-8000-000000000118",
883
+ "seq": 1,
884
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
885
+ "workspaceId": "ws-1",
886
+ "ts": "2026-10-29T10:00:00Z",
887
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
888
+ "sig": {
889
+ "keyId": "vh-cp-2026-10",
890
+ "timestamp": "1793268000",
891
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
892
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
893
+ "workspaceId": "ws-1",
894
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
895
+ },
896
+ "payload": {
897
+ "llmKey": {
898
+ "op": "set",
899
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
900
+ "endpoint": "https://llm.eu.visionhammer.io",
901
+ "key": "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
902
+ "models": [
903
+ "vh-claude-sonnet-vertex",
904
+ "vh-embed"
905
+ ],
906
+ "expiresAt": "2026-12-31T23:59:59Z"
907
+ }
908
+ }
909
+ }
910
+ },
911
+ {
912
+ "name": "llm-key-key-id-not-sha256",
913
+ "why": "the key id is the 64-hex sha256 of the key",
914
+ "expect": {
915
+ "valid": false,
916
+ "code": "schema_violation",
917
+ "keyword": "oneOf"
918
+ },
919
+ "message": {
920
+ "schemaVersion": 2,
921
+ "type": "config.update",
922
+ "msgId": "00000000-0000-4000-8000-000000000119",
923
+ "seq": 1,
924
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
925
+ "workspaceId": "ws-1",
926
+ "ts": "2026-10-29T10:00:00Z",
927
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"ABCDEF\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
928
+ "sig": {
929
+ "keyId": "vh-cp-2026-10",
930
+ "timestamp": "1793268000",
931
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
932
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
933
+ "workspaceId": "ws-1",
934
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
935
+ },
936
+ "payload": {
937
+ "llmKey": {
938
+ "op": "set",
939
+ "keyId": "ABCDEF",
940
+ "endpoint": "https://llm.eu.visionhammer.io",
941
+ "key": "sk-vector-not-a-real-key-0001",
942
+ "models": [
943
+ "vh-claude-sonnet-vertex",
944
+ "vh-embed"
945
+ ],
946
+ "expiresAt": "2026-12-31T23:59:59Z"
947
+ }
948
+ }
949
+ }
950
+ },
951
+ {
952
+ "name": "llm-key-key-id-upper-case",
953
+ "why": "lower-case hex only",
954
+ "expect": {
955
+ "valid": false,
956
+ "code": "schema_violation",
957
+ "keyword": "oneOf"
958
+ },
959
+ "message": {
960
+ "schemaVersion": 2,
961
+ "type": "config.update",
962
+ "msgId": "00000000-0000-4000-8000-000000000120",
963
+ "seq": 1,
964
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
965
+ "workspaceId": "ws-1",
966
+ "ts": "2026-10-29T10:00:00Z",
967
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6FF70DD0F5A066910D2C77D289584F4774569FB9216F4A371C0EFE1968526F48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
968
+ "sig": {
969
+ "keyId": "vh-cp-2026-10",
970
+ "timestamp": "1793268000",
971
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
972
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
973
+ "workspaceId": "ws-1",
974
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
975
+ },
976
+ "payload": {
977
+ "llmKey": {
978
+ "op": "set",
979
+ "keyId": "6FF70DD0F5A066910D2C77D289584F4774569FB9216F4A371C0EFE1968526F48",
980
+ "endpoint": "https://llm.eu.visionhammer.io",
981
+ "key": "sk-vector-not-a-real-key-0001",
982
+ "models": [
983
+ "vh-claude-sonnet-vertex",
984
+ "vh-embed"
985
+ ],
986
+ "expiresAt": "2026-12-31T23:59:59Z"
987
+ }
988
+ }
989
+ }
990
+ },
991
+ {
992
+ "name": "llm-key-models-empty",
993
+ "why": "a key with no model is useless and unscoped",
994
+ "expect": {
995
+ "valid": false,
996
+ "code": "schema_violation",
997
+ "keyword": "oneOf"
998
+ },
999
+ "message": {
1000
+ "schemaVersion": 2,
1001
+ "type": "config.update",
1002
+ "msgId": "00000000-0000-4000-8000-000000000121",
1003
+ "seq": 1,
1004
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1005
+ "workspaceId": "ws-1",
1006
+ "ts": "2026-10-29T10:00:00Z",
1007
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
1008
+ "sig": {
1009
+ "keyId": "vh-cp-2026-10",
1010
+ "timestamp": "1793268000",
1011
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1012
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1013
+ "workspaceId": "ws-1",
1014
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1015
+ },
1016
+ "payload": {
1017
+ "llmKey": {
1018
+ "op": "set",
1019
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1020
+ "endpoint": "https://llm.eu.visionhammer.io",
1021
+ "key": "sk-vector-not-a-real-key-0001",
1022
+ "models": [],
1023
+ "expiresAt": "2026-12-31T23:59:59Z"
1024
+ }
1025
+ }
1026
+ }
1027
+ },
1028
+ {
1029
+ "name": "llm-key-models-33",
1030
+ "why": "at most 32 models",
1031
+ "expect": {
1032
+ "valid": false,
1033
+ "code": "schema_violation",
1034
+ "keyword": "oneOf"
1035
+ },
1036
+ "message": {
1037
+ "schemaVersion": 2,
1038
+ "type": "config.update",
1039
+ "msgId": "00000000-0000-4000-8000-000000000122",
1040
+ "seq": 1,
1041
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1042
+ "workspaceId": "ws-1",
1043
+ "ts": "2026-10-29T10:00:00Z",
1044
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"m-00\",\"m-01\",\"m-02\",\"m-03\",\"m-04\",\"m-05\",\"m-06\",\"m-07\",\"m-08\",\"m-09\",\"m-10\",\"m-11\",\"m-12\",\"m-13\",\"m-14\",\"m-15\",\"m-16\",\"m-17\",\"m-18\",\"m-19\",\"m-20\",\"m-21\",\"m-22\",\"m-23\",\"m-24\",\"m-25\",\"m-26\",\"m-27\",\"m-28\",\"m-29\",\"m-30\",\"m-31\",\"m-32\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
1045
+ "sig": {
1046
+ "keyId": "vh-cp-2026-10",
1047
+ "timestamp": "1793268000",
1048
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1049
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1050
+ "workspaceId": "ws-1",
1051
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1052
+ },
1053
+ "payload": {
1054
+ "llmKey": {
1055
+ "op": "set",
1056
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1057
+ "endpoint": "https://llm.eu.visionhammer.io",
1058
+ "key": "sk-vector-not-a-real-key-0001",
1059
+ "models": [
1060
+ "m-00",
1061
+ "m-01",
1062
+ "m-02",
1063
+ "m-03",
1064
+ "m-04",
1065
+ "m-05",
1066
+ "m-06",
1067
+ "m-07",
1068
+ "m-08",
1069
+ "m-09",
1070
+ "m-10",
1071
+ "m-11",
1072
+ "m-12",
1073
+ "m-13",
1074
+ "m-14",
1075
+ "m-15",
1076
+ "m-16",
1077
+ "m-17",
1078
+ "m-18",
1079
+ "m-19",
1080
+ "m-20",
1081
+ "m-21",
1082
+ "m-22",
1083
+ "m-23",
1084
+ "m-24",
1085
+ "m-25",
1086
+ "m-26",
1087
+ "m-27",
1088
+ "m-28",
1089
+ "m-29",
1090
+ "m-30",
1091
+ "m-31",
1092
+ "m-32"
1093
+ ],
1094
+ "expiresAt": "2026-12-31T23:59:59Z"
1095
+ }
1096
+ }
1097
+ }
1098
+ },
1099
+ {
1100
+ "name": "llm-key-models-duplicated",
1101
+ "why": "uniqueItems",
1102
+ "expect": {
1103
+ "valid": false,
1104
+ "code": "schema_violation",
1105
+ "keyword": "oneOf"
1106
+ },
1107
+ "message": {
1108
+ "schemaVersion": 2,
1109
+ "type": "config.update",
1110
+ "msgId": "00000000-0000-4000-8000-000000000123",
1111
+ "seq": 1,
1112
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1113
+ "workspaceId": "ws-1",
1114
+ "ts": "2026-10-29T10:00:00Z",
1115
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-embed\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
1116
+ "sig": {
1117
+ "keyId": "vh-cp-2026-10",
1118
+ "timestamp": "1793268000",
1119
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1120
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1121
+ "workspaceId": "ws-1",
1122
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1123
+ },
1124
+ "payload": {
1125
+ "llmKey": {
1126
+ "op": "set",
1127
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1128
+ "endpoint": "https://llm.eu.visionhammer.io",
1129
+ "key": "sk-vector-not-a-real-key-0001",
1130
+ "models": [
1131
+ "vh-embed",
1132
+ "vh-embed"
1133
+ ],
1134
+ "expiresAt": "2026-12-31T23:59:59Z"
1135
+ }
1136
+ }
1137
+ }
1138
+ },
1139
+ {
1140
+ "name": "llm-key-model-with-space",
1141
+ "why": "model alias charset",
1142
+ "expect": {
1143
+ "valid": false,
1144
+ "code": "schema_violation",
1145
+ "keyword": "oneOf"
1146
+ },
1147
+ "message": {
1148
+ "schemaVersion": 2,
1149
+ "type": "config.update",
1150
+ "msgId": "00000000-0000-4000-8000-000000000124",
1151
+ "seq": 1,
1152
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1153
+ "workspaceId": "ws-1",
1154
+ "ts": "2026-10-29T10:00:00Z",
1155
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
1156
+ "sig": {
1157
+ "keyId": "vh-cp-2026-10",
1158
+ "timestamp": "1793268000",
1159
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1160
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1161
+ "workspaceId": "ws-1",
1162
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1163
+ },
1164
+ "payload": {
1165
+ "llmKey": {
1166
+ "op": "set",
1167
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1168
+ "endpoint": "https://llm.eu.visionhammer.io",
1169
+ "key": "sk-vector-not-a-real-key-0001",
1170
+ "models": [
1171
+ "vh embed"
1172
+ ],
1173
+ "expiresAt": "2026-12-31T23:59:59Z"
1174
+ }
1175
+ }
1176
+ }
1177
+ },
1178
+ {
1179
+ "name": "llm-key-expires-at-not-a-timestamp",
1180
+ "why": "UTC RFC 3339",
1181
+ "expect": {
1182
+ "valid": false,
1183
+ "code": "schema_violation",
1184
+ "keyword": "oneOf"
1185
+ },
1186
+ "message": {
1187
+ "schemaVersion": 2,
1188
+ "type": "config.update",
1189
+ "msgId": "00000000-0000-4000-8000-000000000125",
1190
+ "seq": 1,
1191
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1192
+ "workspaceId": "ws-1",
1193
+ "ts": "2026-10-29T10:00:00Z",
1194
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31\"}}",
1195
+ "sig": {
1196
+ "keyId": "vh-cp-2026-10",
1197
+ "timestamp": "1793268000",
1198
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1199
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1200
+ "workspaceId": "ws-1",
1201
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1202
+ },
1203
+ "payload": {
1204
+ "llmKey": {
1205
+ "op": "set",
1206
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1207
+ "endpoint": "https://llm.eu.visionhammer.io",
1208
+ "key": "sk-vector-not-a-real-key-0001",
1209
+ "models": [
1210
+ "vh-claude-sonnet-vertex",
1211
+ "vh-embed"
1212
+ ],
1213
+ "expiresAt": "2026-12-31"
1214
+ }
1215
+ }
1216
+ }
1217
+ },
1218
+ {
1219
+ "name": "llm-key-revoke-with-key",
1220
+ "why": "a revoke never repeats the key",
1221
+ "expect": {
1222
+ "valid": false,
1223
+ "code": "schema_violation",
1224
+ "keyword": "oneOf"
1225
+ },
1226
+ "message": {
1227
+ "schemaVersion": 2,
1228
+ "type": "config.update",
1229
+ "msgId": "00000000-0000-4000-8000-000000000126",
1230
+ "seq": 1,
1231
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1232
+ "workspaceId": "ws-1",
1233
+ "ts": "2026-10-29T10:00:00Z",
1234
+ "paramsRaw": "{\"llmKey\":{\"op\":\"revoke\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"key\":\"sk-vector-not-a-real-key-0001\"}}",
1235
+ "sig": {
1236
+ "keyId": "vh-cp-2026-10",
1237
+ "timestamp": "1793268000",
1238
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1239
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1240
+ "workspaceId": "ws-1",
1241
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1242
+ },
1243
+ "payload": {
1244
+ "llmKey": {
1245
+ "op": "revoke",
1246
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1247
+ "key": "sk-vector-not-a-real-key-0001"
1248
+ }
1249
+ }
1250
+ }
1251
+ },
1252
+ {
1253
+ "name": "llm-key-op-unknown",
1254
+ "why": "op is set or revoke",
1255
+ "expect": {
1256
+ "valid": false,
1257
+ "code": "schema_violation",
1258
+ "keyword": "oneOf"
1259
+ },
1260
+ "message": {
1261
+ "schemaVersion": 2,
1262
+ "type": "config.update",
1263
+ "msgId": "00000000-0000-4000-8000-000000000127",
1264
+ "seq": 1,
1265
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1266
+ "workspaceId": "ws-1",
1267
+ "ts": "2026-10-29T10:00:00Z",
1268
+ "paramsRaw": "{\"llmKey\":{\"op\":\"rotate\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
1269
+ "sig": {
1270
+ "keyId": "vh-cp-2026-10",
1271
+ "timestamp": "1793268000",
1272
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1273
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1274
+ "workspaceId": "ws-1",
1275
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1276
+ },
1277
+ "payload": {
1278
+ "llmKey": {
1279
+ "op": "rotate",
1280
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1281
+ "endpoint": "https://llm.eu.visionhammer.io",
1282
+ "key": "sk-vector-not-a-real-key-0001",
1283
+ "models": [
1284
+ "vh-claude-sonnet-vertex",
1285
+ "vh-embed"
1286
+ ],
1287
+ "expiresAt": "2026-12-31T23:59:59Z"
1288
+ }
1289
+ }
1290
+ }
1291
+ },
1292
+ {
1293
+ "name": "llm-key-extra-budget-field",
1294
+ "why": "closed: no budget, no route list, no tag",
1295
+ "expect": {
1296
+ "valid": false,
1297
+ "code": "schema_violation",
1298
+ "keyword": "oneOf"
1299
+ },
1300
+ "message": {
1301
+ "schemaVersion": 2,
1302
+ "type": "config.update",
1303
+ "msgId": "00000000-0000-4000-8000-000000000128",
1304
+ "seq": 1,
1305
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1306
+ "workspaceId": "ws-1",
1307
+ "ts": "2026-10-29T10:00:00Z",
1308
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\",\"budget\":20}}",
1309
+ "sig": {
1310
+ "keyId": "vh-cp-2026-10",
1311
+ "timestamp": "1793268000",
1312
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1313
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1314
+ "workspaceId": "ws-1",
1315
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1316
+ },
1317
+ "payload": {
1318
+ "llmKey": {
1319
+ "op": "set",
1320
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1321
+ "endpoint": "https://llm.eu.visionhammer.io",
1322
+ "key": "sk-vector-not-a-real-key-0001",
1323
+ "models": [
1324
+ "vh-claude-sonnet-vertex",
1325
+ "vh-embed"
1326
+ ],
1327
+ "expiresAt": "2026-12-31T23:59:59Z",
1328
+ "budget": 20
1329
+ }
1330
+ }
1331
+ }
1332
+ },
1333
+ {
1334
+ "name": "llm-key-extra-field-on-revoke",
1335
+ "why": "closed",
1336
+ "expect": {
1337
+ "valid": false,
1338
+ "code": "schema_violation",
1339
+ "keyword": "oneOf"
1340
+ },
1341
+ "message": {
1342
+ "schemaVersion": 2,
1343
+ "type": "config.update",
1344
+ "msgId": "00000000-0000-4000-8000-000000000129",
1345
+ "seq": 1,
1346
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1347
+ "workspaceId": "ws-1",
1348
+ "ts": "2026-10-29T10:00:00Z",
1349
+ "paramsRaw": "{\"llmKey\":{\"op\":\"revoke\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"reason\":\"rotated\"}}",
1350
+ "sig": {
1351
+ "keyId": "vh-cp-2026-10",
1352
+ "timestamp": "1793268000",
1353
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1354
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1355
+ "workspaceId": "ws-1",
1356
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1357
+ },
1358
+ "payload": {
1359
+ "llmKey": {
1360
+ "op": "revoke",
1361
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1362
+ "reason": "rotated"
1363
+ }
1364
+ }
1365
+ }
1366
+ },
1367
+ {
1368
+ "name": "llm-key-with-flags-in-the-same-frame",
1369
+ "why": "a frame with the key carries nothing else, so it can be redacted as a whole",
1370
+ "expect": {
1371
+ "valid": false,
1372
+ "code": "schema_violation",
1373
+ "keyword": "maxProperties"
1374
+ },
1375
+ "message": {
1376
+ "schemaVersion": 2,
1377
+ "type": "config.update",
1378
+ "msgId": "00000000-0000-4000-8000-000000000130",
1379
+ "seq": 1,
1380
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1381
+ "workspaceId": "ws-1",
1382
+ "ts": "2026-10-29T10:00:00Z",
1383
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"},\"flags\":[{\"name\":\"content.relay\",\"enabled\":true}]}",
1384
+ "sig": {
1385
+ "keyId": "vh-cp-2026-10",
1386
+ "timestamp": "1793268000",
1387
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1388
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1389
+ "workspaceId": "ws-1",
1390
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1391
+ },
1392
+ "payload": {
1393
+ "llmKey": {
1394
+ "op": "set",
1395
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1396
+ "endpoint": "https://llm.eu.visionhammer.io",
1397
+ "key": "sk-vector-not-a-real-key-0001",
1398
+ "models": [
1399
+ "vh-claude-sonnet-vertex",
1400
+ "vh-embed"
1401
+ ],
1402
+ "expiresAt": "2026-12-31T23:59:59Z"
1403
+ },
1404
+ "flags": [
1405
+ {
1406
+ "name": "content.relay",
1407
+ "enabled": true
1408
+ }
1409
+ ]
1410
+ }
1411
+ }
1412
+ },
1413
+ {
1414
+ "name": "llm-key-with-retention-in-the-same-frame",
1415
+ "why": "same rule",
1416
+ "expect": {
1417
+ "valid": false,
1418
+ "code": "schema_violation",
1419
+ "keyword": "maxProperties"
1420
+ },
1421
+ "message": {
1422
+ "schemaVersion": 2,
1423
+ "type": "config.update",
1424
+ "msgId": "00000000-0000-4000-8000-000000000131",
1425
+ "seq": 1,
1426
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1427
+ "workspaceId": "ws-1",
1428
+ "ts": "2026-10-29T10:00:00Z",
1429
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"},\"retentionDays\":30}",
1430
+ "sig": {
1431
+ "keyId": "vh-cp-2026-10",
1432
+ "timestamp": "1793268000",
1433
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1434
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1435
+ "workspaceId": "ws-1",
1436
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1437
+ },
1438
+ "payload": {
1439
+ "llmKey": {
1440
+ "op": "set",
1441
+ "keyId": "6ff70dd0f5a066910d2c77d289584f4774569fb9216f4a371c0efe1968526f48",
1442
+ "endpoint": "https://llm.eu.visionhammer.io",
1443
+ "key": "sk-vector-not-a-real-key-0001",
1444
+ "models": [
1445
+ "vh-claude-sonnet-vertex",
1446
+ "vh-embed"
1447
+ ],
1448
+ "expiresAt": "2026-12-31T23:59:59Z"
1449
+ },
1450
+ "retentionDays": 30
1451
+ }
1452
+ }
1453
+ },
1454
+ {
1455
+ "name": "llm-key-key-id-differs-from-sha256-of-key",
1456
+ "why": "schema-valid, but the id is not the sha256 of the key: the LA acks rejected",
1457
+ "expect": {
1458
+ "valid": false,
1459
+ "code": "schema_violation",
1460
+ "rule": "llmKey-id-sha256"
1461
+ },
1462
+ "message": {
1463
+ "schemaVersion": 2,
1464
+ "type": "config.update",
1465
+ "msgId": "00000000-0000-4000-8000-000000000132",
1466
+ "seq": 1,
1467
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1468
+ "workspaceId": "ws-1",
1469
+ "ts": "2026-10-29T10:00:00Z",
1470
+ "paramsRaw": "{\"llmKey\":{\"op\":\"set\",\"keyId\":\"b8fc884cbc23d154b2a9feb32063698cd49668da662e5e9fc53e19a26ced8245\",\"endpoint\":\"https://llm.eu.visionhammer.io\",\"key\":\"sk-vector-not-a-real-key-0001\",\"models\":[\"vh-claude-sonnet-vertex\",\"vh-embed\"],\"expiresAt\":\"2026-12-31T23:59:59Z\"}}",
1471
+ "sig": {
1472
+ "keyId": "vh-cp-2026-10",
1473
+ "timestamp": "1793268000",
1474
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1475
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1476
+ "workspaceId": "ws-1",
1477
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1478
+ },
1479
+ "payload": {
1480
+ "llmKey": {
1481
+ "op": "set",
1482
+ "keyId": "b8fc884cbc23d154b2a9feb32063698cd49668da662e5e9fc53e19a26ced8245",
1483
+ "endpoint": "https://llm.eu.visionhammer.io",
1484
+ "key": "sk-vector-not-a-real-key-0001",
1485
+ "models": [
1486
+ "vh-claude-sonnet-vertex",
1487
+ "vh-embed"
1488
+ ],
1489
+ "expiresAt": "2026-12-31T23:59:59Z"
1490
+ }
1491
+ }
1492
+ }
1493
+ },
1494
+ {
1495
+ "name": "llm-key-revoke-key-id-short",
1496
+ "why": "a revoke needs the full 64-hex id",
1497
+ "expect": {
1498
+ "valid": false,
1499
+ "code": "schema_violation",
1500
+ "keyword": "oneOf"
1501
+ },
1502
+ "message": {
1503
+ "schemaVersion": 2,
1504
+ "type": "config.update",
1505
+ "msgId": "00000000-0000-4000-8000-000000000133",
1506
+ "seq": 1,
1507
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1508
+ "workspaceId": "ws-1",
1509
+ "ts": "2026-10-29T10:00:00Z",
1510
+ "paramsRaw": "{\"llmKey\":{\"op\":\"revoke\",\"keyId\":\"6ff70dd0\"}}",
1511
+ "sig": {
1512
+ "keyId": "vh-cp-2026-10",
1513
+ "timestamp": "1793268000",
1514
+ "nonce": "Zm9vYmFyYmF6cXV4MTIzNDU2",
1515
+ "tenantId": "3f2b8c1e-5a4d-4e7b-9c21-0a1b2c3d4e5f",
1516
+ "workspaceId": "ws-1",
1517
+ "signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
1518
+ },
1519
+ "payload": {
1520
+ "llmKey": {
1521
+ "op": "revoke",
1522
+ "keyId": "6ff70dd0"
1523
+ }
1524
+ }
1525
+ }
187
1526
  }
188
1527
  ]
189
1528
  }