@claudexor/schema 2.0.0 → 2.1.1

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 (128) hide show
  1. package/dist/agent-capabilities.d.ts +24 -24
  2. package/dist/attachment.d.ts +13 -13
  3. package/dist/auth.d.ts +21 -0
  4. package/dist/auth.d.ts.map +1 -1
  5. package/dist/auth.js +54 -0
  6. package/dist/auth.js.map +1 -1
  7. package/dist/budget.d.ts +17 -5
  8. package/dist/budget.d.ts.map +1 -1
  9. package/dist/budget.js +15 -0
  10. package/dist/budget.js.map +1 -1
  11. package/dist/config.d.ts +380 -20
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +81 -0
  14. package/dist/config.js.map +1 -1
  15. package/dist/control-gc.d.ts +185 -0
  16. package/dist/control-gc.d.ts.map +1 -0
  17. package/dist/control-gc.js +81 -0
  18. package/dist/control-gc.js.map +1 -0
  19. package/dist/control-operation-responses.d.ts +155 -29
  20. package/dist/control-operation-responses.d.ts.map +1 -1
  21. package/dist/control-run-detail.d.ts +140 -32
  22. package/dist/control-run-detail.d.ts.map +1 -1
  23. package/dist/control-spec.d.ts +6 -6
  24. package/dist/control-thread-apply.d.ts +2 -2
  25. package/dist/control.d.ts +427 -586
  26. package/dist/control.d.ts.map +1 -1
  27. package/dist/control.js +155 -54
  28. package/dist/control.js.map +1 -1
  29. package/dist/credential-profile.d.ts +454 -0
  30. package/dist/credential-profile.d.ts.map +1 -0
  31. package/dist/credential-profile.js +140 -0
  32. package/dist/credential-profile.js.map +1 -0
  33. package/dist/events.d.ts +20 -6
  34. package/dist/events.d.ts.map +1 -1
  35. package/dist/events.js +22 -0
  36. package/dist/events.js.map +1 -1
  37. package/dist/gate.d.ts +3 -3
  38. package/dist/harness.d.ts +243 -88
  39. package/dist/harness.d.ts.map +1 -1
  40. package/dist/harness.js +124 -46
  41. package/dist/harness.js.map +1 -1
  42. package/dist/index.d.ts +4 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +4 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/orchestrate.d.ts +23 -0
  47. package/dist/orchestrate.d.ts.map +1 -1
  48. package/dist/orchestrate.js +56 -0
  49. package/dist/orchestrate.js.map +1 -1
  50. package/dist/project.d.ts +2 -2
  51. package/dist/quota.d.ts +27 -9
  52. package/dist/quota.d.ts.map +1 -1
  53. package/dist/quota.js +14 -2
  54. package/dist/quota.js.map +1 -1
  55. package/dist/readiness.d.ts +596 -0
  56. package/dist/readiness.d.ts.map +1 -0
  57. package/dist/readiness.js +87 -0
  58. package/dist/readiness.js.map +1 -0
  59. package/dist/request-requirements.d.ts +8 -8
  60. package/dist/request-requirements.d.ts.map +1 -1
  61. package/dist/request-requirements.js +4 -1
  62. package/dist/request-requirements.js.map +1 -1
  63. package/dist/route.d.ts +4 -4
  64. package/dist/setup.d.ts +69 -24
  65. package/dist/setup.d.ts.map +1 -1
  66. package/dist/setup.js +25 -0
  67. package/dist/setup.js.map +1 -1
  68. package/dist/spec.d.ts +4 -4
  69. package/dist/task.d.ts +99 -4
  70. package/dist/task.d.ts.map +1 -1
  71. package/dist/task.js +48 -1
  72. package/dist/task.js.map +1 -1
  73. package/dist/telemetry.d.ts +309 -67
  74. package/dist/telemetry.d.ts.map +1 -1
  75. package/dist/telemetry.js +97 -1
  76. package/dist/telemetry.js.map +1 -1
  77. package/dist/thread.d.ts +26 -15
  78. package/dist/thread.d.ts.map +1 -1
  79. package/dist/thread.js +11 -0
  80. package/dist/thread.js.map +1 -1
  81. package/dist/tool-ref.d.ts +45 -0
  82. package/dist/tool-ref.d.ts.map +1 -0
  83. package/dist/tool-ref.js +45 -0
  84. package/dist/tool-ref.js.map +1 -0
  85. package/dist/workspace.d.ts +2 -2
  86. package/generated/BudgetObservation.schema.json +16 -0
  87. package/generated/ControlCredentialProfileCreateRequest.schema.json +32 -0
  88. package/generated/ControlCredentialProfileCreateResponse.schema.json +142 -0
  89. package/generated/ControlCredentialProfileDeleteResponse.schema.json +107 -0
  90. package/generated/ControlCredentialProfilesResponse.schema.json +155 -0
  91. package/generated/ControlGcReceipt.schema.json +170 -0
  92. package/generated/ControlGcRequest.schema.json +18 -0
  93. package/generated/ControlHarnessListResponse.schema.json +95 -2
  94. package/generated/ControlHarnessModelsResponse.schema.json +19 -0
  95. package/generated/ControlHarnessSettingsPatch.schema.json +9 -0
  96. package/generated/ControlQuotaResponse.schema.json +3 -2
  97. package/generated/ControlRunAgainDraft.schema.json +40 -0
  98. package/generated/ControlRunDetail.schema.json +178 -6
  99. package/generated/ControlRunListResponse.schema.json +174 -3
  100. package/generated/ControlRunStartRequest.schema.json +40 -0
  101. package/generated/ControlRunSummary.schema.json +174 -3
  102. package/generated/ControlSettingsSnapshot.schema.json +10 -0
  103. package/generated/ControlSettingsUpdateRequest.schema.json +9 -0
  104. package/generated/ControlSetupJob.schema.json +8 -0
  105. package/generated/ControlSetupJobCreateRequest.schema.json +5 -0
  106. package/generated/ControlSetupJobEvent.schema.json +8 -0
  107. package/generated/ControlSetupJobListResponse.schema.json +8 -0
  108. package/generated/ControlSetupJobSnapshot.schema.json +8 -0
  109. package/generated/ControlThread.schema.json +16 -4
  110. package/generated/ControlThreadCreateRequest.schema.json +6 -2
  111. package/generated/ControlThreadDetail.schema.json +32 -8
  112. package/generated/ControlThreadListResponse.schema.json +16 -4
  113. package/generated/ControlThreadTurnRequest.schema.json +40 -0
  114. package/generated/ControlThreadUpdateRequest.schema.json +11 -0
  115. package/generated/CredentialProfile.schema.json +78 -0
  116. package/generated/CredentialProfileStatus.schema.json +61 -0
  117. package/generated/GlobalConfig.schema.json +136 -0
  118. package/generated/HarnessEvent.schema.json +62 -5
  119. package/generated/HarnessManifest.schema.json +33 -2
  120. package/generated/HarnessModel.schema.json +19 -0
  121. package/generated/HarnessStatusDto.schema.json +95 -2
  122. package/generated/RunEvent.schema.json +3 -0
  123. package/generated/RunTelemetry.schema.json +202 -2
  124. package/generated/Session.schema.json +14 -0
  125. package/generated/TaskContract.schema.json +65 -4
  126. package/generated/Thread.schema.json +17 -5
  127. package/generated/ThreadHeadPing.schema.json +40 -0
  128. package/package.json +3 -2
@@ -363,10 +363,41 @@
363
363
  "known_models": {
364
364
  "type": "array",
365
365
  "items": {
366
- "type": "string"
366
+ "anyOf": [
367
+ {
368
+ "type": "string"
369
+ },
370
+ {
371
+ "type": "object",
372
+ "properties": {
373
+ "id": {
374
+ "type": "string",
375
+ "minLength": 1,
376
+ "description": "Model id/alias."
377
+ },
378
+ "routes": {
379
+ "type": "array",
380
+ "items": {
381
+ "type": "string",
382
+ "enum": [
383
+ "local_session",
384
+ "api_key"
385
+ ]
386
+ },
387
+ "minItems": 1,
388
+ "description": "Credential routes this model is available on."
389
+ }
390
+ },
391
+ "required": [
392
+ "id",
393
+ "routes"
394
+ ],
395
+ "additionalProperties": false
396
+ }
397
+ ]
367
398
  },
368
399
  "default": [],
369
- "description": "Manifest-declared model ids/aliases this harness accepts, used as the model truth source when the adapter has no live inventory; explicit models outside the truth source are refused."
400
+ "description": "Manifest-declared model ids/aliases this harness accepts (bare string = every credential route; object form scopes a model to specific routes), used as the model truth source when the adapter has no live inventory; explicit models outside the truth source are refused."
370
401
  },
371
402
  "known_models_verified_against": {
372
403
  "type": [
@@ -433,6 +464,14 @@
433
464
  "default": [],
434
465
  "description": "Intents the gateway will route to this harness."
435
466
  },
467
+ "routableIntents": {
468
+ "type": "array",
469
+ "items": {
470
+ "type": "string"
471
+ },
472
+ "default": [],
473
+ "description": "Intents the harness is actually routable for right now (doctor-gated); the server-side availability truth surfaces must read instead of re-deriving."
474
+ },
436
475
  "disabledIntents": {
437
476
  "type": "array",
438
477
  "items": {
@@ -527,6 +566,60 @@
527
566
  "default": [],
528
567
  "description": "Doctor-backed readiness by authentication source; an empty array means readiness was not reported."
529
568
  },
569
+ "readiness": {
570
+ "type": "array",
571
+ "items": {
572
+ "type": "object",
573
+ "properties": {
574
+ "id": {
575
+ "type": "string",
576
+ "description": "Stable machine id of the check (adapter probe id or auth source)."
577
+ },
578
+ "kind": {
579
+ "type": "string",
580
+ "enum": [
581
+ "binary",
582
+ "auth",
583
+ "smoke",
584
+ "model",
585
+ "probe"
586
+ ],
587
+ "description": "What KIND of readiness this is: binary presence, credential source, isolated smoke, configured-model validity, or a generic capability probe."
588
+ },
589
+ "title": {
590
+ "type": "string",
591
+ "description": "Human display name of the check."
592
+ },
593
+ "status": {
594
+ "type": "string",
595
+ "enum": [
596
+ "pass",
597
+ "fail",
598
+ "skip"
599
+ ],
600
+ "description": "Outcome; skip = not run / not applicable."
601
+ },
602
+ "detail": {
603
+ "type": [
604
+ "string",
605
+ "null"
606
+ ],
607
+ "default": null,
608
+ "description": "Redacted human-readable evidence for the outcome."
609
+ }
610
+ },
611
+ "required": [
612
+ "id",
613
+ "kind",
614
+ "title",
615
+ "status"
616
+ ],
617
+ "additionalProperties": false,
618
+ "description": "One display-ready readiness check row (daemon-normalized)."
619
+ },
620
+ "default": [],
621
+ "description": "Display-ready readiness checks, daemon-normalized from the raw evidence."
622
+ },
530
623
  "configuredModel": {
531
624
  "type": [
532
625
  "string",
@@ -37,6 +37,25 @@
37
37
  ],
38
38
  "default": null,
39
39
  "description": "Context window in tokens; null when the enumeration source does not report it."
40
+ },
41
+ "routes": {
42
+ "anyOf": [
43
+ {
44
+ "type": "array",
45
+ "items": {
46
+ "type": "string",
47
+ "enum": [
48
+ "local_session",
49
+ "api_key"
50
+ ]
51
+ }
52
+ },
53
+ {
54
+ "type": "null"
55
+ }
56
+ ],
57
+ "default": null,
58
+ "description": "Credential routes the model is scoped to; null = every route."
40
59
  }
41
60
  },
42
61
  "required": [
@@ -108,6 +108,15 @@
108
108
  "auto"
109
109
  ],
110
110
  "description": "New auth route preference."
111
+ },
112
+ "profileLimitAction": {
113
+ "type": "string",
114
+ "enum": [
115
+ "fail",
116
+ "ask",
117
+ "rotate"
118
+ ],
119
+ "description": "New profile-selection limit action (fail | ask | rotate)."
111
120
  }
112
121
  },
113
122
  "additionalProperties": false,
@@ -45,7 +45,7 @@
45
45
  "credential_route"
46
46
  ],
47
47
  "additionalProperties": false,
48
- "description": "Quota owner and credential route; subject ids are opaque and optional."
48
+ "description": "Quota owner and credential route; subject_id is the credential-profile id (null = the engine-default credential)."
49
49
  },
50
50
  "constraints": {
51
51
  "type": "array",
@@ -123,7 +123,8 @@
123
123
  "codex_app_server",
124
124
  "codex_rollout",
125
125
  "claude_statusline",
126
- "claude_api_retry"
126
+ "claude_api_retry",
127
+ "claude_oauth_usage"
127
128
  ],
128
129
  "description": "Vendor-owned machine-readable source of a quota snapshot."
129
130
  },
@@ -17,6 +17,10 @@
17
17
  "default": "",
18
18
  "description": "The user's prompt for the run."
19
19
  },
20
+ "instructions": {
21
+ "type": "string",
22
+ "description": "System-level instructions layered onto every task-producing lane; delivered natively (append-system-prompt / developer_instructions) or as a delimited prompt prefix."
23
+ },
20
24
  "attachments": {
21
25
  "type": "array",
22
26
  "items": {
@@ -441,6 +445,18 @@
441
445
  ],
442
446
  "description": "Per-run auth route override."
443
447
  },
448
+ "credentialProfileId": {
449
+ "anyOf": [
450
+ {
451
+ "type": "string",
452
+ "minLength": 1
453
+ },
454
+ {
455
+ "type": "null"
456
+ }
457
+ ],
458
+ "description": "Explicit per-run credential profile id; null FORCES the engine-default ladder past a thread-sticky profile; unknown/disabled ids refuse, never default."
459
+ },
444
460
  "autonomy": {
445
461
  "type": "string",
446
462
  "enum": [
@@ -454,6 +470,30 @@
454
470
  "type": "integer",
455
471
  "exclusiveMinimum": 0,
456
472
  "description": "Cap on orchestrate plan tool calls; only meaningful for mode=orchestrate."
473
+ },
474
+ "maxSeconds": {
475
+ "type": "integer",
476
+ "exclusiveMinimum": 0,
477
+ "maximum": 604800,
478
+ "description": "Hard wall-clock deadline for the whole run (seconds, from scheduler start, max 7 days); on expiry the run is cancelled with reason wall_clock_exceeded and partial artifacts are kept."
479
+ },
480
+ "denyPaths": {
481
+ "type": "array",
482
+ "items": {
483
+ "type": "string",
484
+ "minLength": 1
485
+ },
486
+ "description": "Per-run globs no candidate may touch at all; envelope-only (in-place runs are refused), enforced by the engine post-diff gate, disclosed per lane via path_deny receipts. accept_risk may still deliver (INV-111)."
487
+ },
488
+ "outputSchema": {
489
+ "type": "object",
490
+ "additionalProperties": {},
491
+ "description": "JSON Schema for the run's final answer; mandatory (incapable lane => preflight refusal), engine-validated into final/output.json with a typed outputConformance receipt."
492
+ },
493
+ "maxTurns": {
494
+ "type": "integer",
495
+ "exclusiveMinimum": 0,
496
+ "description": "Per-run turn cap (beats per-harness settings)."
457
497
  }
458
498
  },
459
499
  "additionalProperties": false,
@@ -354,12 +354,179 @@
354
354
  "number",
355
355
  "null"
356
356
  ],
357
- "description": "Settled spend in USD; null when unknown."
357
+ "description": "Settled cash in USD; null when unknown."
358
358
  },
359
359
  "spendEstimated": {
360
360
  "type": "boolean",
361
361
  "description": "True when spend is token-derived rather than natively reported."
362
362
  },
363
+ "inputTokens": {
364
+ "anyOf": [
365
+ {
366
+ "type": "integer",
367
+ "minimum": 0
368
+ },
369
+ {
370
+ "type": "null"
371
+ }
372
+ ],
373
+ "description": "Input tokens summed across all attempts; null when no harness reported them."
374
+ },
375
+ "outputTokens": {
376
+ "anyOf": [
377
+ {
378
+ "type": "integer",
379
+ "minimum": 0
380
+ },
381
+ {
382
+ "type": "null"
383
+ }
384
+ ],
385
+ "description": "Output tokens summed across all attempts; null when no harness reported them."
386
+ },
387
+ "cachedInputTokens": {
388
+ "anyOf": [
389
+ {
390
+ "type": "integer",
391
+ "minimum": 0
392
+ },
393
+ {
394
+ "type": "null"
395
+ }
396
+ ],
397
+ "description": "Cached input tokens summed across all attempts; null when no harness reported them."
398
+ },
399
+ "outputConformance": {
400
+ "anyOf": [
401
+ {
402
+ "type": "string",
403
+ "enum": [
404
+ "passed",
405
+ "failed"
406
+ ]
407
+ },
408
+ {
409
+ "type": "null"
410
+ }
411
+ ],
412
+ "description": "Structured-output conformance receipt (passed/failed); null when the run had no outputSchema."
413
+ },
414
+ "authRoute": {
415
+ "anyOf": [
416
+ {
417
+ "type": "object",
418
+ "properties": {
419
+ "requested": {
420
+ "type": "string",
421
+ "enum": [
422
+ "subscription",
423
+ "api_key",
424
+ "auto"
425
+ ],
426
+ "description": "Preferred auth route: subscription (native/OAuth session), api_key (a stored API key), or auto (engine picks subscription-first with policy fallback). A preference, not a secret."
427
+ },
428
+ "effective": {
429
+ "anyOf": [
430
+ {
431
+ "type": "string",
432
+ "enum": [
433
+ "local_session",
434
+ "api_key",
435
+ "unknown"
436
+ ],
437
+ "description": "Auth mode a route runs under: a native local session, an API key, or unknown."
438
+ },
439
+ {
440
+ "type": "null"
441
+ }
442
+ ],
443
+ "description": "Auth mode a route runs under: a native local session, an API key, or unknown.",
444
+ "default": null
445
+ },
446
+ "source": {
447
+ "anyOf": [
448
+ {
449
+ "type": "string",
450
+ "enum": [
451
+ "native_session",
452
+ "oauth_token_env",
453
+ "api_key_env",
454
+ "api_key_flag",
455
+ "provider_auth_file",
456
+ "none"
457
+ ],
458
+ "description": "Concrete credential source used or probed by a harness."
459
+ },
460
+ {
461
+ "type": "null"
462
+ }
463
+ ],
464
+ "description": "Concrete credential source used or probed by a harness.",
465
+ "default": null
466
+ },
467
+ "reason": {
468
+ "type": "string",
469
+ "enum": [
470
+ "as_requested",
471
+ "native_first",
472
+ "no_native_session_fallback",
473
+ "requested_route_unavailable",
474
+ "undisclosed"
475
+ ],
476
+ "description": "Deterministic reason for the effective auth route: as_requested, native_first (auto, INV-061), no_native_session_fallback (auto downgraded to api_key), requested_route_unavailable (explicit preference contradicted), or undisclosed."
477
+ },
478
+ "harnessId": {
479
+ "type": [
480
+ "string",
481
+ "null"
482
+ ],
483
+ "default": null
484
+ },
485
+ "attemptId": {
486
+ "type": [
487
+ "string",
488
+ "null"
489
+ ],
490
+ "default": null
491
+ },
492
+ "modelMismatch": {
493
+ "anyOf": [
494
+ {
495
+ "type": "object",
496
+ "properties": {
497
+ "requested": {
498
+ "type": "string"
499
+ },
500
+ "observed": {
501
+ "type": "string"
502
+ }
503
+ },
504
+ "required": [
505
+ "requested",
506
+ "observed"
507
+ ],
508
+ "additionalProperties": false
509
+ },
510
+ {
511
+ "type": "null"
512
+ }
513
+ ],
514
+ "default": null,
515
+ "description": "Requested-vs-observed model mismatch; null when none."
516
+ }
517
+ },
518
+ "required": [
519
+ "requested",
520
+ "reason"
521
+ ],
522
+ "additionalProperties": false
523
+ },
524
+ {
525
+ "type": "null"
526
+ }
527
+ ],
528
+ "description": "Auth route receipt (requested/effective/source/reason + disclosing attempt), projected verbatim from telemetry; null when unavailable."
529
+ },
363
530
  "access": {
364
531
  "type": "string",
365
532
  "enum": [
@@ -486,7 +653,10 @@
486
653
  "properties": {
487
654
  "capability": {
488
655
  "type": "string",
489
- "const": "browser"
656
+ "enum": [
657
+ "browser",
658
+ "path_deny"
659
+ ]
490
660
  },
491
661
  "harness_id": {
492
662
  "type": "string",
@@ -508,7 +678,8 @@
508
678
  "effective",
509
679
  "manifest_unsupported",
510
680
  "web_policy_off",
511
- "access_profile_incompatible"
681
+ "access_profile_incompatible",
682
+ "postdiff_only"
512
683
  ]
513
684
  },
514
685
  "evidence_refs": {
@@ -840,9 +1011,10 @@
840
1011
  "plan",
841
1012
  "summary",
842
1013
  "patch",
843
- "diagnostic"
1014
+ "diagnostic",
1015
+ "structured_output"
844
1016
  ],
845
- "description": "What kind of output this is: answer, report, plan, summary, patch, or diagnostic."
1017
+ "description": "What kind of output this is: answer, report, plan, summary, patch, diagnostic, or structured_output (schema-conformant final/output.json)."
846
1018
  },
847
1019
  "path": {
848
1020
  "type": "string",
@@ -986,7 +1158,7 @@
986
1158
  "null"
987
1159
  ],
988
1160
  "default": null,
989
- "description": "Spend so far in USD; null when unknown."
1161
+ "description": "CASH spend so far in USD; null when unknown."
990
1162
  },
991
1163
  "remainingUsd": {
992
1164
  "type": [
@@ -356,12 +356,179 @@
356
356
  "number",
357
357
  "null"
358
358
  ],
359
- "description": "Settled spend in USD; null when unknown."
359
+ "description": "Settled cash in USD; null when unknown."
360
360
  },
361
361
  "spendEstimated": {
362
362
  "type": "boolean",
363
363
  "description": "True when spend is token-derived rather than natively reported."
364
364
  },
365
+ "inputTokens": {
366
+ "anyOf": [
367
+ {
368
+ "type": "integer",
369
+ "minimum": 0
370
+ },
371
+ {
372
+ "type": "null"
373
+ }
374
+ ],
375
+ "description": "Input tokens summed across all attempts; null when no harness reported them."
376
+ },
377
+ "outputTokens": {
378
+ "anyOf": [
379
+ {
380
+ "type": "integer",
381
+ "minimum": 0
382
+ },
383
+ {
384
+ "type": "null"
385
+ }
386
+ ],
387
+ "description": "Output tokens summed across all attempts; null when no harness reported them."
388
+ },
389
+ "cachedInputTokens": {
390
+ "anyOf": [
391
+ {
392
+ "type": "integer",
393
+ "minimum": 0
394
+ },
395
+ {
396
+ "type": "null"
397
+ }
398
+ ],
399
+ "description": "Cached input tokens summed across all attempts; null when no harness reported them."
400
+ },
401
+ "outputConformance": {
402
+ "anyOf": [
403
+ {
404
+ "type": "string",
405
+ "enum": [
406
+ "passed",
407
+ "failed"
408
+ ]
409
+ },
410
+ {
411
+ "type": "null"
412
+ }
413
+ ],
414
+ "description": "Structured-output conformance receipt (passed/failed); null when the run had no outputSchema."
415
+ },
416
+ "authRoute": {
417
+ "anyOf": [
418
+ {
419
+ "type": "object",
420
+ "properties": {
421
+ "requested": {
422
+ "type": "string",
423
+ "enum": [
424
+ "subscription",
425
+ "api_key",
426
+ "auto"
427
+ ],
428
+ "description": "Preferred auth route: subscription (native/OAuth session), api_key (a stored API key), or auto (engine picks subscription-first with policy fallback). A preference, not a secret."
429
+ },
430
+ "effective": {
431
+ "anyOf": [
432
+ {
433
+ "type": "string",
434
+ "enum": [
435
+ "local_session",
436
+ "api_key",
437
+ "unknown"
438
+ ],
439
+ "description": "Auth mode a route runs under: a native local session, an API key, or unknown."
440
+ },
441
+ {
442
+ "type": "null"
443
+ }
444
+ ],
445
+ "description": "Auth mode a route runs under: a native local session, an API key, or unknown.",
446
+ "default": null
447
+ },
448
+ "source": {
449
+ "anyOf": [
450
+ {
451
+ "type": "string",
452
+ "enum": [
453
+ "native_session",
454
+ "oauth_token_env",
455
+ "api_key_env",
456
+ "api_key_flag",
457
+ "provider_auth_file",
458
+ "none"
459
+ ],
460
+ "description": "Concrete credential source used or probed by a harness."
461
+ },
462
+ {
463
+ "type": "null"
464
+ }
465
+ ],
466
+ "description": "Concrete credential source used or probed by a harness.",
467
+ "default": null
468
+ },
469
+ "reason": {
470
+ "type": "string",
471
+ "enum": [
472
+ "as_requested",
473
+ "native_first",
474
+ "no_native_session_fallback",
475
+ "requested_route_unavailable",
476
+ "undisclosed"
477
+ ],
478
+ "description": "Deterministic reason for the effective auth route: as_requested, native_first (auto, INV-061), no_native_session_fallback (auto downgraded to api_key), requested_route_unavailable (explicit preference contradicted), or undisclosed."
479
+ },
480
+ "harnessId": {
481
+ "type": [
482
+ "string",
483
+ "null"
484
+ ],
485
+ "default": null
486
+ },
487
+ "attemptId": {
488
+ "type": [
489
+ "string",
490
+ "null"
491
+ ],
492
+ "default": null
493
+ },
494
+ "modelMismatch": {
495
+ "anyOf": [
496
+ {
497
+ "type": "object",
498
+ "properties": {
499
+ "requested": {
500
+ "type": "string"
501
+ },
502
+ "observed": {
503
+ "type": "string"
504
+ }
505
+ },
506
+ "required": [
507
+ "requested",
508
+ "observed"
509
+ ],
510
+ "additionalProperties": false
511
+ },
512
+ {
513
+ "type": "null"
514
+ }
515
+ ],
516
+ "default": null,
517
+ "description": "Requested-vs-observed model mismatch; null when none."
518
+ }
519
+ },
520
+ "required": [
521
+ "requested",
522
+ "reason"
523
+ ],
524
+ "additionalProperties": false
525
+ },
526
+ {
527
+ "type": "null"
528
+ }
529
+ ],
530
+ "description": "Auth route receipt (requested/effective/source/reason + disclosing attempt), projected verbatim from telemetry; null when unavailable."
531
+ },
365
532
  "access": {
366
533
  "type": "string",
367
534
  "enum": [
@@ -488,7 +655,10 @@
488
655
  "properties": {
489
656
  "capability": {
490
657
  "type": "string",
491
- "const": "browser"
658
+ "enum": [
659
+ "browser",
660
+ "path_deny"
661
+ ]
492
662
  },
493
663
  "harness_id": {
494
664
  "type": "string",
@@ -510,7 +680,8 @@
510
680
  "effective",
511
681
  "manifest_unsupported",
512
682
  "web_policy_off",
513
- "access_profile_incompatible"
683
+ "access_profile_incompatible",
684
+ "postdiff_only"
514
685
  ]
515
686
  },
516
687
  "evidence_refs": {