@allocator-one/harness-cli 1.15.1 → 1.16.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.
package/spec/openapi.json CHANGED
@@ -624,7 +624,7 @@
624
624
  }
625
625
  },
626
626
  {
627
- "description": "Filter by assignee — \"me\" for the token owner, a user id, an email address, or an exact display name",
627
+ "description": "Filter by assignee — \"me\" for the token owner, a user id, an email address, or an exact display name; empty keeps only unassigned issues",
628
628
  "in": "query",
629
629
  "name": "assignee",
630
630
  "required": false,
@@ -733,7 +733,7 @@
733
733
  "get": {
734
734
  "callbacks": {},
735
735
  "deprecated": false,
736
- "description": "Requires the `harness:read` scope. The payload always carries `blocked` and `blocked_by` (identifiers of unresolved blockers: only a completed blocker resolves), `blockers` (each with `identifier`, `state_type` and `archived`, so a cancelled or archived blocker is visible as such), and `held` and `held_by` (the identifier of the issue whose `hold` label holds this one: itself or its nearest held ancestor, or null), `waiting_on_condition` and `conditions` (its wait conditions, see `/conditions`), and `execution` (the issue's latest plan step run: status, executor, attempt, retries and continues used, last outcome code, plan room URL, and `operator_job_id`, the Operator job it runs as at `/api/v1/operator/jobs/{id}`, null until recorded; or null); `include` embeds relations (direction-aware), children, and recent comments in one response.",
736
+ "description": "Requires the `harness:read` scope. The payload always carries `blocked` and `blocked_by` (identifiers of unresolved blockers: only a completed blocker resolves), `blockers` (each with `identifier`, `state_type` and `archived`, so a cancelled or archived blocker is visible as such), and `held` and `held_by` (the identifier of the issue whose `hold` label holds this one: itself or its nearest held ancestor, or null), `waiting_on_condition` and `conditions` (its wait conditions, see `/conditions`), and `execution` (the issue's latest plan step run: status, executor, attempt, retries and continues used, last outcome code, plan room URL, and `operator_job_id`, the Operator job it runs as at `/api/v1/operator/jobs/{id}`, null until recorded; or null); `plan` (the plan governing the issue, the nearest one rooted at the issue or an ancestor, or null: its `id`, `root` identifier, `status`, `held`, the `revision` number it runs, whether that revision lists the issue (`in_revision`) and the issue's `executor`); `include` embeds relations (direction-aware), children, and recent comments in one response.",
737
737
  "parameters": [
738
738
  {
739
739
  "description": "Issue identifier, e.g. ALL-4901 or CLI-12 (issues minted before team-prefixed numbering carry IO-)",
@@ -756,6 +756,79 @@
756
756
  ],
757
757
  "responses": {
758
758
  "200": {
759
+ "content": {
760
+ "application/json": {
761
+ "schema": {
762
+ "properties": {
763
+ "data": {
764
+ "properties": {
765
+ "plan": {
766
+ "additionalProperties": false,
767
+ "description": "The plan governing the issue, the nearest rooted at it or an ancestor; null when none does",
768
+ "nullable": true,
769
+ "properties": {
770
+ "executor": {
771
+ "description": "Who executes the issue now: operator for an Operator step, none for a person's",
772
+ "enum": [
773
+ "none",
774
+ "operator"
775
+ ],
776
+ "type": "string"
777
+ },
778
+ "held": {
779
+ "description": "The plan is held: none of its steps is workable",
780
+ "type": "boolean"
781
+ },
782
+ "id": {
783
+ "format": "uuid",
784
+ "type": "string"
785
+ },
786
+ "in_revision": {
787
+ "description": "The revision it runs lists the issue. An Operator step outside it waits for the next release; a person's step does not",
788
+ "type": "boolean"
789
+ },
790
+ "revision": {
791
+ "description": "The number of the revision it runs; null before its first release",
792
+ "nullable": true,
793
+ "type": "integer"
794
+ },
795
+ "root": {
796
+ "description": "The root issue's identifier, e.g. FR-1; opens the plan like its id",
797
+ "type": "string"
798
+ },
799
+ "status": {
800
+ "enum": [
801
+ "held",
802
+ "released",
803
+ "running",
804
+ "completed",
805
+ "needs_attention"
806
+ ],
807
+ "type": "string"
808
+ }
809
+ },
810
+ "required": [
811
+ "id",
812
+ "root",
813
+ "status",
814
+ "held",
815
+ "revision",
816
+ "in_revision",
817
+ "executor"
818
+ ],
819
+ "type": "object"
820
+ }
821
+ },
822
+ "type": "object"
823
+ }
824
+ },
825
+ "required": [
826
+ "data"
827
+ ],
828
+ "type": "object"
829
+ }
830
+ }
831
+ },
759
832
  "description": "Success"
760
833
  },
761
834
  "400": {
@@ -2961,7 +3034,56 @@
2961
3034
  "description": "Not found"
2962
3035
  },
2963
3036
  "409": {
2964
- "description": "The issue is not claimable. `error` is `conflict` and `reason` names why: `claimed_by_other`, `archived`, `agent_step`, `closed`, `blocked`, `held`, `plan_not_released`, `not_in_plan_revision`, `edited_since_release`, `open_children`, `waiting_on_condition` or `duplicate`."
3037
+ "content": {
3038
+ "application/json": {
3039
+ "schema": {
3040
+ "properties": {
3041
+ "error": {
3042
+ "enum": [
3043
+ "conflict"
3044
+ ],
3045
+ "type": "string"
3046
+ },
3047
+ "message": {
3048
+ "type": "string"
3049
+ },
3050
+ "plan": {
3051
+ "additionalProperties": false,
3052
+ "description": "For agent_step, plan_not_released, not_in_plan_revision and edited_since_release: the nearest plan governing the issue; absent otherwise. The message names it as the plan to release only when it is the one plan governing the issue",
3053
+ "properties": {
3054
+ "id": {
3055
+ "format": "uuid",
3056
+ "type": "string"
3057
+ },
3058
+ "root": {
3059
+ "description": "The plan's root issue identifier, e.g. FR-1",
3060
+ "type": "string"
3061
+ }
3062
+ },
3063
+ "required": [
3064
+ "id",
3065
+ "root"
3066
+ ],
3067
+ "type": "object"
3068
+ },
3069
+ "reason": {
3070
+ "type": "string"
3071
+ },
3072
+ "request_id": {
3073
+ "nullable": true,
3074
+ "type": "string"
3075
+ }
3076
+ },
3077
+ "required": [
3078
+ "error",
3079
+ "reason",
3080
+ "message"
3081
+ ],
3082
+ "type": "object"
3083
+ }
3084
+ }
3085
+ },
3086
+ "description": "The issue is not claimable. `error` is `conflict` and `reason` names why: `claimed_by_other`, `archived`, `agent_step`, `closed`, `blocked`, `held`, `plan_not_released`, `not_in_plan_revision`, `edited_since_release`, `open_children`, `waiting_on_condition` or `duplicate`. Only an Operator step is frozen to its plan's released revision: `not_in_plan_revision` and `edited_since_release` name an Operator step added or edited since the release, which runs only after the plan is released again; a person's step added or edited since then is claimable under the other rules. For `agent_step`, `plan_not_released`, `not_in_plan_revision` and `edited_since_release`, `plan` names the plan by `id` and `root` identifier (e.g. to run `harness plan release FR-1`)."
2965
3087
  },
2966
3088
  "422": {
2967
3089
  "description": "Validation error"
@@ -3588,6 +3710,15 @@
3588
3710
  "schema": {
3589
3711
  "type": "string"
3590
3712
  }
3713
+ },
3714
+ {
3715
+ "description": "active (default), archived, or all",
3716
+ "in": "query",
3717
+ "name": "scope",
3718
+ "required": false,
3719
+ "schema": {
3720
+ "type": "string"
3721
+ }
3591
3722
  }
3592
3723
  ],
3593
3724
  "responses": {
@@ -6821,10 +6952,147 @@
6821
6952
  }
6822
6953
  },
6823
6954
  "/api/v1/teams/{team_key}/plans": {
6955
+ "get": {
6956
+ "callbacks": {},
6957
+ "deprecated": false,
6958
+ "description": "Requires the `harness:read` scope. The plans rooted at an issue of this team, newest first, each with its `id`, `root` identifier and `title`, `status`, `held` (status is `held`), the `revision` number it runs (null before its first release), `released_at` and `inserted_at`. A plan's id or root identifier opens it at `/api/v1/plans/{id}`. A team key of another organization is 404. There is no pagination.",
6959
+ "parameters": [
6960
+ {
6961
+ "description": "Team key, e.g. ALL",
6962
+ "in": "path",
6963
+ "name": "team_key",
6964
+ "required": true,
6965
+ "schema": {
6966
+ "type": "string"
6967
+ }
6968
+ },
6969
+ {
6970
+ "description": "Only plans in this status",
6971
+ "in": "query",
6972
+ "name": "status",
6973
+ "required": false,
6974
+ "schema": {
6975
+ "enum": [
6976
+ "held",
6977
+ "released",
6978
+ "running",
6979
+ "completed",
6980
+ "needs_attention"
6981
+ ],
6982
+ "type": "string"
6983
+ }
6984
+ },
6985
+ {
6986
+ "description": "Maximum results",
6987
+ "in": "query",
6988
+ "name": "limit",
6989
+ "required": false,
6990
+ "schema": {
6991
+ "default": 50,
6992
+ "maximum": 100,
6993
+ "minimum": 1,
6994
+ "type": "integer"
6995
+ }
6996
+ }
6997
+ ],
6998
+ "responses": {
6999
+ "200": {
7000
+ "content": {
7001
+ "application/json": {
7002
+ "schema": {
7003
+ "properties": {
7004
+ "data": {
7005
+ "items": {
7006
+ "additionalProperties": false,
7007
+ "properties": {
7008
+ "held": {
7009
+ "description": "The plan is held: none of its steps is workable",
7010
+ "type": "boolean"
7011
+ },
7012
+ "id": {
7013
+ "format": "uuid",
7014
+ "type": "string"
7015
+ },
7016
+ "inserted_at": {
7017
+ "format": "date-time",
7018
+ "type": "string"
7019
+ },
7020
+ "released_at": {
7021
+ "format": "date-time",
7022
+ "nullable": true,
7023
+ "type": "string"
7024
+ },
7025
+ "revision": {
7026
+ "description": "The number of the revision it runs; null before its first release",
7027
+ "nullable": true,
7028
+ "type": "integer"
7029
+ },
7030
+ "root": {
7031
+ "description": "The root issue's identifier, e.g. FR-1; opens the plan like its id",
7032
+ "type": "string"
7033
+ },
7034
+ "status": {
7035
+ "enum": [
7036
+ "held",
7037
+ "released",
7038
+ "running",
7039
+ "completed",
7040
+ "needs_attention"
7041
+ ],
7042
+ "type": "string"
7043
+ },
7044
+ "title": {
7045
+ "description": "The root issue's title",
7046
+ "type": "string"
7047
+ }
7048
+ },
7049
+ "required": [
7050
+ "id",
7051
+ "root",
7052
+ "status",
7053
+ "held",
7054
+ "revision",
7055
+ "title",
7056
+ "released_at",
7057
+ "inserted_at"
7058
+ ],
7059
+ "type": "object"
7060
+ },
7061
+ "type": "array"
7062
+ }
7063
+ },
7064
+ "required": [
7065
+ "data"
7066
+ ],
7067
+ "type": "object"
7068
+ }
7069
+ }
7070
+ },
7071
+ "description": "Success"
7072
+ },
7073
+ "400": {
7074
+ "description": "Bad request"
7075
+ },
7076
+ "401": {
7077
+ "description": "Missing or invalid token"
7078
+ },
7079
+ "403": {
7080
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
7081
+ },
7082
+ "404": {
7083
+ "description": "Not found"
7084
+ },
7085
+ "422": {
7086
+ "description": "Validation error"
7087
+ }
7088
+ },
7089
+ "summary": "List a team's plans",
7090
+ "tags": []
7091
+ },
6824
7092
  "post": {
6825
7093
  "callbacks": {},
6826
7094
  "deprecated": false,
6827
- "description": "Requires the `harness:write` scope. Creates a whole plan in one transaction, or nothing: the root issue in this team, every step (Operator steps in the organization's Operator team, a person's in `team` or this team), their parents, `blocked_by` edges and wait conditions, and the plan, created `held`. Steps refer to each other by `key`. A gate condition may carry a `key` (`gate: <key>` is shorthand for a gate with that key, labelled with it unless `label` is given) and an `owner`: `role:<role>` (a fund-team role), `user:<id or email>` (a member who can use Operator) or `expert:<email>` (an outside expert, never a member's email). Only the owner ticks an owned gate, and nobody names an owner they would hold themselves. Owner violations: `invalid_owner`, `unknown_role`, `unknown_owner`, `owner_is_member`, `owner_is_actor`, `owner_not_allowed` and `duplicate_gate_key`. An invalid plan answers 422 `invalid_plan` with every violation, each naming the step's `key` and its `index` in `steps` (both null for the root and the plan). A plan has at most 100 steps, its root included. An optional Idempotency-Key works as for issue creation: an identical replay returns the plan with 200 and Idempotency-Replayed: true, and a key reused for a different request answers 409.",
7095
+ "description": "Requires the `harness:write` scope. Creates a whole plan in one transaction, or nothing: the root issue in this team, every step (Operator steps in the organization's Operator team, a person's in `team` or this team), their parents, `blocked_by` edges and wait conditions, and the plan, created `held`. Steps refer to each other by `key`. A gate condition may carry a `key` (`gate: <key>` is shorthand for a gate with that key, labelled with it unless `label` is given) and an `owner`: `role:<role>` (a fund-team role), `user:<id or email>` (a member who can use Operator) or `expert:<email>` (an outside expert, never a member's email). Only the owner ticks an owned gate, and nobody names an owner they would hold themselves. Owner violations: `invalid_owner`, `unknown_role`, `unknown_owner`, `owner_is_member`, `owner_is_actor`, `owner_not_allowed` and `duplicate_gate_key`. An invalid plan answers 422 `invalid_plan` with every violation, each naming the step's `key` and its `index` in `steps` (both null for the root and the plan). A plan has at most the organization's max plan steps setting (default 1000, at most 2000), its root included, and at most 100 Operator steps, the delegated grant's fixed limit; `too_many_steps` names the `cap` it hit. An optional Idempotency-Key works as for issue creation: an identical replay returns the plan with 200 and Idempotency-Replayed: true, and a key reused for a different request answers 409.",
6828
7096
  "parameters": [
6829
7097
  {
6830
7098
  "description": "Team key, e.g. ALL",
@@ -6911,6 +7179,7 @@
6911
7179
  "type": "integer"
6912
7180
  },
6913
7181
  "steps": {
7182
+ "description": "The root counts as a step, so a plan takes one step fewer than the organization's max plan steps setting (1,000 by default, at most 2,000); more answers 422 `too_many_steps`. At most 100 of them may be Operator steps.",
6914
7183
  "items": {
6915
7184
  "additionalProperties": false,
6916
7185
  "properties": {
@@ -7055,7 +7324,7 @@
7055
7324
  ],
7056
7325
  "type": "object"
7057
7326
  },
7058
- "maxItems": 99,
7327
+ "maxItems": 1999,
7059
7328
  "minItems": 1,
7060
7329
  "type": "array"
7061
7330
  },
@@ -8305,6 +8574,50 @@
8305
8574
  "violations": {
8306
8575
  "items": {
8307
8576
  "properties": {
8577
+ "cap": {
8578
+ "additionalProperties": false,
8579
+ "description": "For `too_many_steps`: the cap the plan is over; null for every other code",
8580
+ "nullable": true,
8581
+ "properties": {
8582
+ "ceiling": {
8583
+ "description": "For plan_steps: the highest the organization's max plan steps setting may be (2000); null for the fixed Operator cap",
8584
+ "nullable": true,
8585
+ "type": "integer"
8586
+ },
8587
+ "count": {
8588
+ "description": "The steps it counted",
8589
+ "type": "integer"
8590
+ },
8591
+ "kind": {
8592
+ "description": "operator_steps: the delegated grant's fixed limit on a plan's Operator steps; plan_steps: the organization's limit on all of a plan's steps, its max plan steps setting",
8593
+ "enum": [
8594
+ "operator_steps",
8595
+ "plan_steps"
8596
+ ],
8597
+ "type": "string"
8598
+ },
8599
+ "max": {
8600
+ "description": "The cap",
8601
+ "type": "integer"
8602
+ },
8603
+ "setting": {
8604
+ "description": "The organization setting that sets the cap (Harness settings, Plans); null for the fixed Operator cap",
8605
+ "enum": [
8606
+ "max_plan_steps"
8607
+ ],
8608
+ "nullable": true,
8609
+ "type": "string"
8610
+ }
8611
+ },
8612
+ "required": [
8613
+ "kind",
8614
+ "max",
8615
+ "count",
8616
+ "setting",
8617
+ "ceiling"
8618
+ ],
8619
+ "type": "object"
8620
+ },
8308
8621
  "code": {
8309
8622
  "description": "Machine-readable reason, e.g. dependency_cycle",
8310
8623
  "type": "string"
@@ -8338,7 +8651,8 @@
8338
8651
  "issue",
8339
8652
  "code",
8340
8653
  "field",
8341
- "message"
8654
+ "message",
8655
+ "cap"
8342
8656
  ],
8343
8657
  "type": "object"
8344
8658
  },
@@ -8365,15 +8679,14 @@
8365
8679
  "get": {
8366
8680
  "callbacks": {},
8367
8681
  "deprecated": false,
8368
- "description": "Requires the `harness:read` scope. The plan's status, budgets and current revision, and its whole tree in tree order, root first: each member's step `key`, `executor`, optional `agent_skill_id`, parent, state, readiness, wait conditions, the open gates an open member waits for (`waiting_for`: each gate's key, label, owner and `holders`, the people who can tick it, empty when nobody can and null when not known), and whether an edit since the release holds it (`held`) or it was added after the release (`in_revision` false). `edges` are the `blocks` edges between members (`from` blocks `to`). `estimate` is the spend ceiling for the open Operator steps under the current profile, or null. `progress` counts the plan's leaf steps, each in exactly one bucket (`completed`, `cancelled`, `failed`, `running`, `held`, `blocked`, `ready`, and `waiting` by reason), summing to `total`. `progress.truncated` is true when the tree is too large to read whole: the steps and counts then cover only part of it.",
8682
+ "description": "Requires the `harness:read` scope. The plan's status, budgets and current revision, and its whole tree in tree order, root first: each member's step `key`, `executor`, optional `agent_skill_id`, parent, state, readiness, wait conditions, the open gates an open member waits for (`waiting_for`: each gate's key, label, owner and `holders`, the people who can tick it, empty when nobody can and null when not known), and whether an edit since the release touched it (`held`) or it was added after the release (`in_revision` false). Only an Operator step waits for the next release on either; a person's step stays workable (`ready`), and the next release adds it to the revision. `edges` are the `blocks` edges between members (`from` blocks `to`). `estimate` is the spend ceiling for the open Operator steps under the current profile, or null. `progress` counts the plan's leaf steps, each in exactly one bucket (`completed`, `cancelled`, `failed`, `running`, `held`, `blocked`, `ready`, and `waiting` by reason), summing to `total`. `progress.truncated` is true when the tree is too large to read whole: the steps and counts then cover only part of it.",
8369
8683
  "parameters": [
8370
8684
  {
8371
- "description": "Plan id",
8685
+ "description": "The plan's id, or its root issue's identifier (e.g. FR-1, any casing). An identifier that roots no plan, or names another organization's issue, is 404 like an unknown id.",
8372
8686
  "in": "path",
8373
8687
  "name": "id",
8374
8688
  "required": true,
8375
8689
  "schema": {
8376
- "format": "uuid",
8377
8690
  "type": "string"
8378
8691
  }
8379
8692
  }
@@ -8992,15 +9305,14 @@
8992
9305
  "patch": {
8993
9306
  "callbacks": {},
8994
9307
  "deprecated": false,
8995
- "description": "Requires the `harness:write` scope. Changes step attributes (`executor`, `key`, `agent_skill_id`) of the steps named, by `step` key or `issue` identifier, and the budgets; only what is named changes. Editing a released step holds it until the plan is released again. A budget edit of a released plan answers 409 `plan_released`: hold it first. Descriptions, edges, conditions and parents are edited through the issue endpoints. Requires staff standing or being the plan's requester.",
9308
+ "description": "Requires the `harness:write` scope. Changes step attributes (`executor`, `key`, `agent_skill_id`) of the steps named, by `step` key or `issue` identifier, and the budgets; only what is named changes. Editing a released Operator step, or handing one to a person, holds it until the plan is released again; a person's step stays workable, and the next release takes the change in. A budget edit of a released plan answers 409 `plan_released`: hold it first. Descriptions, edges, conditions and parents are edited through the issue endpoints. Requires staff standing or being the plan's requester.",
8996
9309
  "parameters": [
8997
9310
  {
8998
- "description": "Plan id",
9311
+ "description": "The plan's id, or its root issue's identifier (e.g. FR-1, any casing). An identifier that roots no plan, or names another organization's issue, is 404 like an unknown id.",
8999
9312
  "in": "path",
9000
9313
  "name": "id",
9001
9314
  "required": true,
9002
9315
  "schema": {
9003
- "format": "uuid",
9004
9316
  "type": "string"
9005
9317
  }
9006
9318
  }
@@ -9694,13 +10006,57 @@
9694
10006
  "violations": {
9695
10007
  "items": {
9696
10008
  "properties": {
9697
- "code": {
9698
- "description": "Machine-readable reason, e.g. dependency_cycle",
9699
- "type": "string"
9700
- },
9701
- "field": {
10009
+ "cap": {
10010
+ "additionalProperties": false,
10011
+ "description": "For `too_many_steps`: the cap the plan is over; null for every other code",
9702
10012
  "nullable": true,
9703
- "type": "string"
10013
+ "properties": {
10014
+ "ceiling": {
10015
+ "description": "For plan_steps: the highest the organization's max plan steps setting may be (2000); null for the fixed Operator cap",
10016
+ "nullable": true,
10017
+ "type": "integer"
10018
+ },
10019
+ "count": {
10020
+ "description": "The steps it counted",
10021
+ "type": "integer"
10022
+ },
10023
+ "kind": {
10024
+ "description": "operator_steps: the delegated grant's fixed limit on a plan's Operator steps; plan_steps: the organization's limit on all of a plan's steps, its max plan steps setting",
10025
+ "enum": [
10026
+ "operator_steps",
10027
+ "plan_steps"
10028
+ ],
10029
+ "type": "string"
10030
+ },
10031
+ "max": {
10032
+ "description": "The cap",
10033
+ "type": "integer"
10034
+ },
10035
+ "setting": {
10036
+ "description": "The organization setting that sets the cap (Harness settings, Plans); null for the fixed Operator cap",
10037
+ "enum": [
10038
+ "max_plan_steps"
10039
+ ],
10040
+ "nullable": true,
10041
+ "type": "string"
10042
+ }
10043
+ },
10044
+ "required": [
10045
+ "kind",
10046
+ "max",
10047
+ "count",
10048
+ "setting",
10049
+ "ceiling"
10050
+ ],
10051
+ "type": "object"
10052
+ },
10053
+ "code": {
10054
+ "description": "Machine-readable reason, e.g. dependency_cycle",
10055
+ "type": "string"
10056
+ },
10057
+ "field": {
10058
+ "nullable": true,
10059
+ "type": "string"
9704
10060
  },
9705
10061
  "index": {
9706
10062
  "description": "The step's position in `steps`",
@@ -9727,7 +10083,8 @@
9727
10083
  "issue",
9728
10084
  "code",
9729
10085
  "field",
9730
- "message"
10086
+ "message",
10087
+ "cap"
9731
10088
  ],
9732
10089
  "type": "object"
9733
10090
  },
@@ -9754,15 +10111,14 @@
9754
10111
  "post": {
9755
10112
  "callbacks": {},
9756
10113
  "deprecated": false,
9757
- "description": "Requires the `harness:write` scope. Releases a held plan, or one that needs attention, as the credential's user: freezes its next revision and lets its ready steps run. A plan with Operator steps runs them in its plan room, created or reused with the releaser and `collaborators` as its people, under a delegated grant that needs a spend budget and the releaser's right to run Operator. Requires staff standing or being the plan's requester.",
10114
+ "description": "Requires the `harness:write` scope. Releases a held plan, or one that needs attention, as the credential's user: freezes its next revision, which takes in the steps added since the last one, and lets its ready steps run. A plan over the organization's max plan steps setting, or with more than 100 Operator steps, is refused with 422 `too_many_steps`, naming the `cap`. A plan with Operator steps runs them in its plan room, created or reused with the releaser and `collaborators` as its people, under a delegated grant that needs a spend budget and the releaser's right to run Operator. Requires staff standing or being the plan's requester.",
9758
10115
  "parameters": [
9759
10116
  {
9760
- "description": "Plan id",
10117
+ "description": "The plan's id, or its root issue's identifier (e.g. FR-1, any casing). An identifier that roots no plan, or names another organization's issue, is 404 like an unknown id.",
9761
10118
  "in": "path",
9762
10119
  "name": "id",
9763
10120
  "required": true,
9764
10121
  "schema": {
9765
- "format": "uuid",
9766
10122
  "type": "string"
9767
10123
  }
9768
10124
  }
@@ -10429,6 +10785,50 @@
10429
10785
  "violations": {
10430
10786
  "items": {
10431
10787
  "properties": {
10788
+ "cap": {
10789
+ "additionalProperties": false,
10790
+ "description": "For `too_many_steps`: the cap the plan is over; null for every other code",
10791
+ "nullable": true,
10792
+ "properties": {
10793
+ "ceiling": {
10794
+ "description": "For plan_steps: the highest the organization's max plan steps setting may be (2000); null for the fixed Operator cap",
10795
+ "nullable": true,
10796
+ "type": "integer"
10797
+ },
10798
+ "count": {
10799
+ "description": "The steps it counted",
10800
+ "type": "integer"
10801
+ },
10802
+ "kind": {
10803
+ "description": "operator_steps: the delegated grant's fixed limit on a plan's Operator steps; plan_steps: the organization's limit on all of a plan's steps, its max plan steps setting",
10804
+ "enum": [
10805
+ "operator_steps",
10806
+ "plan_steps"
10807
+ ],
10808
+ "type": "string"
10809
+ },
10810
+ "max": {
10811
+ "description": "The cap",
10812
+ "type": "integer"
10813
+ },
10814
+ "setting": {
10815
+ "description": "The organization setting that sets the cap (Harness settings, Plans); null for the fixed Operator cap",
10816
+ "enum": [
10817
+ "max_plan_steps"
10818
+ ],
10819
+ "nullable": true,
10820
+ "type": "string"
10821
+ }
10822
+ },
10823
+ "required": [
10824
+ "kind",
10825
+ "max",
10826
+ "count",
10827
+ "setting",
10828
+ "ceiling"
10829
+ ],
10830
+ "type": "object"
10831
+ },
10432
10832
  "code": {
10433
10833
  "description": "Machine-readable reason, e.g. dependency_cycle",
10434
10834
  "type": "string"
@@ -10462,7 +10862,8 @@
10462
10862
  "issue",
10463
10863
  "code",
10464
10864
  "field",
10465
- "message"
10865
+ "message",
10866
+ "cap"
10466
10867
  ],
10467
10868
  "type": "object"
10468
10869
  },
@@ -10492,12 +10893,11 @@
10492
10893
  "description": "Requires the `harness:write` scope. Pauses every step: none is ready until the plan is released again. Holding a held plan changes nothing. Requires staff standing or being the plan's requester.",
10493
10894
  "parameters": [
10494
10895
  {
10495
- "description": "Plan id",
10896
+ "description": "The plan's id, or its root issue's identifier (e.g. FR-1, any casing). An identifier that roots no plan, or names another organization's issue, is 404 like an unknown id.",
10496
10897
  "in": "path",
10497
10898
  "name": "id",
10498
10899
  "required": true,
10499
10900
  "schema": {
10500
- "format": "uuid",
10501
10901
  "type": "string"
10502
10902
  }
10503
10903
  }
@@ -17044,6 +17444,973 @@
17044
17444
  "summary": "List an outside expert's own assignments",
17045
17445
  "tags": []
17046
17446
  }
17447
+ },
17448
+ "/api/v1/reviews/prs/{owner}/{repo}/{number}": {
17449
+ "get": {
17450
+ "callbacks": {},
17451
+ "deprecated": false,
17452
+ "description": "Requires the `reviews:read` scope. The advisory and enforced gate projections computed from stored runs, findings and verdicts against the pull request head the gate knows (webhook or API re-read), the rounds behind each projection, and the decision recorded when the pull request merged. Status is never the client's own claim.",
17453
+ "parameters": [
17454
+ {
17455
+ "description": "The repository owner (the first half of `owner/name`)",
17456
+ "in": "path",
17457
+ "name": "owner",
17458
+ "required": true,
17459
+ "schema": {
17460
+ "type": "string"
17461
+ }
17462
+ },
17463
+ {
17464
+ "description": "The repository name (the second half of `owner/name`)",
17465
+ "in": "path",
17466
+ "name": "repo",
17467
+ "required": true,
17468
+ "schema": {
17469
+ "type": "string"
17470
+ }
17471
+ },
17472
+ {
17473
+ "description": "The pull request number",
17474
+ "in": "path",
17475
+ "name": "number",
17476
+ "required": true,
17477
+ "schema": {
17478
+ "minimum": 1,
17479
+ "type": "integer"
17480
+ }
17481
+ }
17482
+ ],
17483
+ "responses": {
17484
+ "200": {
17485
+ "content": {
17486
+ "application/json": {
17487
+ "schema": {
17488
+ "properties": {
17489
+ "data": {
17490
+ "additionalProperties": false,
17491
+ "properties": {
17492
+ "active_cycle": {
17493
+ "additionalProperties": false,
17494
+ "nullable": true,
17495
+ "properties": {
17496
+ "head_sha": {
17497
+ "pattern": "^[0-9a-f]{40}$",
17498
+ "type": "string"
17499
+ },
17500
+ "id": {
17501
+ "format": "uuid",
17502
+ "type": "string"
17503
+ },
17504
+ "inserted_at": {
17505
+ "format": "date-time",
17506
+ "type": "string"
17507
+ },
17508
+ "operation_id": {
17509
+ "format": "uuid",
17510
+ "type": "string"
17511
+ },
17512
+ "previous_cycle_id": {
17513
+ "format": "uuid",
17514
+ "nullable": true,
17515
+ "type": "string"
17516
+ }
17517
+ },
17518
+ "required": [
17519
+ "id",
17520
+ "operation_id",
17521
+ "previous_cycle_id",
17522
+ "head_sha",
17523
+ "inserted_at"
17524
+ ],
17525
+ "type": "object"
17526
+ },
17527
+ "advisory": {
17528
+ "additionalProperties": false,
17529
+ "properties": {
17530
+ "actionable": {
17531
+ "items": {
17532
+ "type": "object"
17533
+ },
17534
+ "type": "array"
17535
+ },
17536
+ "classification_pending": {
17537
+ "type": "boolean"
17538
+ },
17539
+ "conclusive": {
17540
+ "nullable": true,
17541
+ "type": "boolean"
17542
+ },
17543
+ "head_sha": {
17544
+ "nullable": true,
17545
+ "type": "string"
17546
+ },
17547
+ "legacy_pending_identities": {
17548
+ "items": {
17549
+ "type": "string"
17550
+ },
17551
+ "type": "array"
17552
+ },
17553
+ "rounds": {
17554
+ "items": {
17555
+ "type": "object"
17556
+ },
17557
+ "type": "array"
17558
+ },
17559
+ "run_id": {
17560
+ "format": "uuid",
17561
+ "nullable": true,
17562
+ "type": "string"
17563
+ },
17564
+ "run_url": {
17565
+ "format": "uri",
17566
+ "nullable": true,
17567
+ "type": "string"
17568
+ },
17569
+ "status": {
17570
+ "type": "string"
17571
+ }
17572
+ },
17573
+ "required": [
17574
+ "status",
17575
+ "head_sha",
17576
+ "conclusive",
17577
+ "run_id",
17578
+ "run_url",
17579
+ "actionable",
17580
+ "classification_pending",
17581
+ "legacy_pending_identities",
17582
+ "rounds"
17583
+ ],
17584
+ "type": "object"
17585
+ },
17586
+ "cycle_protocol": {
17587
+ "enum": [
17588
+ 1
17589
+ ],
17590
+ "type": "integer"
17591
+ },
17592
+ "decision": {
17593
+ "nullable": true,
17594
+ "type": "object"
17595
+ },
17596
+ "enforced": {
17597
+ "additionalProperties": false,
17598
+ "properties": {
17599
+ "actionable": {
17600
+ "items": {
17601
+ "type": "object"
17602
+ },
17603
+ "type": "array"
17604
+ },
17605
+ "classification_pending": {
17606
+ "type": "boolean"
17607
+ },
17608
+ "conclusive": {
17609
+ "nullable": true,
17610
+ "type": "boolean"
17611
+ },
17612
+ "head_sha": {
17613
+ "nullable": true,
17614
+ "type": "string"
17615
+ },
17616
+ "legacy_pending_identities": {
17617
+ "items": {
17618
+ "type": "string"
17619
+ },
17620
+ "type": "array"
17621
+ },
17622
+ "rounds": {
17623
+ "items": {
17624
+ "type": "object"
17625
+ },
17626
+ "type": "array"
17627
+ },
17628
+ "run_id": {
17629
+ "format": "uuid",
17630
+ "nullable": true,
17631
+ "type": "string"
17632
+ },
17633
+ "run_url": {
17634
+ "format": "uri",
17635
+ "nullable": true,
17636
+ "type": "string"
17637
+ },
17638
+ "status": {
17639
+ "type": "string"
17640
+ }
17641
+ },
17642
+ "required": [
17643
+ "status",
17644
+ "head_sha",
17645
+ "conclusive",
17646
+ "run_id",
17647
+ "run_url",
17648
+ "actionable",
17649
+ "classification_pending",
17650
+ "legacy_pending_identities",
17651
+ "rounds"
17652
+ ],
17653
+ "type": "object"
17654
+ },
17655
+ "head": {
17656
+ "additionalProperties": false,
17657
+ "nullable": true,
17658
+ "properties": {
17659
+ "base_sha": {
17660
+ "nullable": true,
17661
+ "type": "string"
17662
+ },
17663
+ "is_cross_repository": {
17664
+ "type": "boolean"
17665
+ },
17666
+ "merge_commit_sha": {
17667
+ "nullable": true,
17668
+ "type": "string"
17669
+ },
17670
+ "merged": {
17671
+ "type": "boolean"
17672
+ },
17673
+ "merged_at": {
17674
+ "format": "date-time",
17675
+ "nullable": true,
17676
+ "type": "string"
17677
+ },
17678
+ "reviewed_head_sha": {
17679
+ "nullable": true,
17680
+ "type": "string"
17681
+ },
17682
+ "sha": {
17683
+ "pattern": "^[0-9a-f]{40}$",
17684
+ "type": "string"
17685
+ },
17686
+ "source": {
17687
+ "type": "string"
17688
+ },
17689
+ "updated_at": {
17690
+ "format": "date-time",
17691
+ "type": "string"
17692
+ }
17693
+ },
17694
+ "required": [
17695
+ "sha",
17696
+ "base_sha",
17697
+ "source",
17698
+ "updated_at",
17699
+ "is_cross_repository",
17700
+ "merged",
17701
+ "reviewed_head_sha",
17702
+ "merge_commit_sha",
17703
+ "merged_at"
17704
+ ],
17705
+ "type": "object"
17706
+ },
17707
+ "lifecycle": {
17708
+ "additionalProperties": false,
17709
+ "description": "The head's gate check and its latest attempts.",
17710
+ "nullable": true,
17711
+ "properties": {
17712
+ "attempts": {
17713
+ "description": "Latest twenty, newest first.",
17714
+ "items": {
17715
+ "additionalProperties": false,
17716
+ "properties": {
17717
+ "actor_user_id": {
17718
+ "format": "uuid",
17719
+ "nullable": true,
17720
+ "type": "string"
17721
+ },
17722
+ "advisory_client_id": {
17723
+ "format": "uuid",
17724
+ "nullable": true,
17725
+ "type": "string"
17726
+ },
17727
+ "advisory_head_sha": {
17728
+ "nullable": true,
17729
+ "type": "string"
17730
+ },
17731
+ "advisory_report_sha256": {
17732
+ "nullable": true,
17733
+ "type": "string"
17734
+ },
17735
+ "advisory_run_id": {
17736
+ "format": "uuid",
17737
+ "nullable": true,
17738
+ "type": "string"
17739
+ },
17740
+ "correlated": {
17741
+ "type": "boolean"
17742
+ },
17743
+ "cycle_id": {
17744
+ "format": "uuid",
17745
+ "nullable": true,
17746
+ "type": "string"
17747
+ },
17748
+ "deadline_at": {
17749
+ "format": "date-time",
17750
+ "type": "string"
17751
+ },
17752
+ "execution_completed_at": {
17753
+ "format": "date-time",
17754
+ "nullable": true,
17755
+ "type": "string"
17756
+ },
17757
+ "finished_at": {
17758
+ "format": "date-time",
17759
+ "nullable": true,
17760
+ "type": "string"
17761
+ },
17762
+ "github_run_attempt": {
17763
+ "nullable": true,
17764
+ "type": "integer"
17765
+ },
17766
+ "github_run_id": {
17767
+ "nullable": true,
17768
+ "type": "string"
17769
+ },
17770
+ "id": {
17771
+ "format": "uuid",
17772
+ "type": "string"
17773
+ },
17774
+ "intent_at": {
17775
+ "format": "date-time",
17776
+ "type": "string"
17777
+ },
17778
+ "number": {
17779
+ "minimum": 1,
17780
+ "type": "integer"
17781
+ },
17782
+ "previous_attempt_id": {
17783
+ "format": "uuid",
17784
+ "nullable": true,
17785
+ "type": "string"
17786
+ },
17787
+ "reason": {
17788
+ "nullable": true,
17789
+ "type": "string"
17790
+ },
17791
+ "request_key": {
17792
+ "type": "string"
17793
+ },
17794
+ "review_run_id": {
17795
+ "format": "uuid",
17796
+ "nullable": true,
17797
+ "type": "string"
17798
+ },
17799
+ "state": {
17800
+ "enum": [
17801
+ "dispatch_pending",
17802
+ "dispatch_unknown",
17803
+ "queued",
17804
+ "running",
17805
+ "completed",
17806
+ "failed",
17807
+ "timed_out",
17808
+ "superseded",
17809
+ "legacy_unknown"
17810
+ ],
17811
+ "type": "string"
17812
+ },
17813
+ "terminal_reason": {
17814
+ "nullable": true,
17815
+ "type": "string"
17816
+ },
17817
+ "workflow": {
17818
+ "type": "string"
17819
+ },
17820
+ "workflow_ref": {
17821
+ "type": "string"
17822
+ }
17823
+ },
17824
+ "required": [
17825
+ "id",
17826
+ "number",
17827
+ "previous_attempt_id",
17828
+ "actor_user_id",
17829
+ "request_key",
17830
+ "reason",
17831
+ "state",
17832
+ "workflow",
17833
+ "workflow_ref",
17834
+ "correlated",
17835
+ "cycle_id",
17836
+ "advisory_run_id",
17837
+ "advisory_client_id",
17838
+ "advisory_head_sha",
17839
+ "advisory_report_sha256",
17840
+ "intent_at",
17841
+ "deadline_at",
17842
+ "github_run_id",
17843
+ "github_run_attempt",
17844
+ "review_run_id",
17845
+ "finished_at",
17846
+ "terminal_reason",
17847
+ "execution_completed_at"
17848
+ ],
17849
+ "type": "object"
17850
+ },
17851
+ "type": "array"
17852
+ },
17853
+ "check_id": {
17854
+ "format": "uuid",
17855
+ "type": "string"
17856
+ },
17857
+ "check_run_id": {
17858
+ "nullable": true,
17859
+ "type": "integer"
17860
+ },
17861
+ "create_outcome": {
17862
+ "nullable": true,
17863
+ "type": "string"
17864
+ },
17865
+ "head_sha": {
17866
+ "pattern": "^[0-9a-f]{40}$",
17867
+ "type": "string"
17868
+ },
17869
+ "publication_pending": {
17870
+ "type": "boolean"
17871
+ },
17872
+ "recovery": {
17873
+ "additionalProperties": false,
17874
+ "description": "Set while the latest attempt is failed or timed out: `next` is `automatic_retry` when Harness retries it, `retry` when a person must request one.",
17875
+ "nullable": true,
17876
+ "properties": {
17877
+ "attempt_id": {
17878
+ "format": "uuid",
17879
+ "type": "string"
17880
+ },
17881
+ "evidence_recorded": {
17882
+ "type": "boolean"
17883
+ },
17884
+ "next": {
17885
+ "enum": [
17886
+ "automatic_retry",
17887
+ "retry"
17888
+ ],
17889
+ "type": "string"
17890
+ },
17891
+ "state": {
17892
+ "enum": [
17893
+ "failed",
17894
+ "timed_out"
17895
+ ],
17896
+ "type": "string"
17897
+ },
17898
+ "terminal_reason": {
17899
+ "nullable": true,
17900
+ "type": "string"
17901
+ }
17902
+ },
17903
+ "required": [
17904
+ "attempt_id",
17905
+ "state",
17906
+ "terminal_reason",
17907
+ "evidence_recorded",
17908
+ "next"
17909
+ ],
17910
+ "type": "object"
17911
+ },
17912
+ "state": {
17913
+ "enum": [
17914
+ "dispatch_pending",
17915
+ "dispatch_unknown",
17916
+ "queued",
17917
+ "running",
17918
+ "completed",
17919
+ "failed",
17920
+ "timed_out",
17921
+ "superseded",
17922
+ "legacy_unknown",
17923
+ "waiting_for_advisory",
17924
+ "waiting_for_dispatch",
17925
+ "unregistered_evidence",
17926
+ "withdrawn"
17927
+ ],
17928
+ "type": "string"
17929
+ }
17930
+ },
17931
+ "required": [
17932
+ "check_id",
17933
+ "check_run_id",
17934
+ "head_sha",
17935
+ "state",
17936
+ "publication_pending",
17937
+ "create_outcome",
17938
+ "attempts",
17939
+ "recovery"
17940
+ ],
17941
+ "type": "object"
17942
+ },
17943
+ "pr_number": {
17944
+ "minimum": 1,
17945
+ "type": "integer"
17946
+ },
17947
+ "repo": {
17948
+ "type": "string"
17949
+ }
17950
+ },
17951
+ "required": [
17952
+ "repo",
17953
+ "pr_number",
17954
+ "head",
17955
+ "advisory",
17956
+ "enforced",
17957
+ "cycle_protocol",
17958
+ "active_cycle",
17959
+ "lifecycle",
17960
+ "decision"
17961
+ ],
17962
+ "type": "object"
17963
+ }
17964
+ },
17965
+ "required": [
17966
+ "data"
17967
+ ],
17968
+ "type": "object"
17969
+ }
17970
+ }
17971
+ },
17972
+ "description": "Success"
17973
+ },
17974
+ "400": {
17975
+ "description": "Bad request"
17976
+ },
17977
+ "401": {
17978
+ "description": "Missing or invalid token"
17979
+ },
17980
+ "403": {
17981
+ "description": "Missing scope, or `reviews_disabled` while the organization has not enabled review evidence"
17982
+ },
17983
+ "404": {
17984
+ "description": "Not found"
17985
+ },
17986
+ "422": {
17987
+ "description": "Validation error"
17988
+ }
17989
+ },
17990
+ "summary": "Get the Review Council gate status of a pull request",
17991
+ "tags": []
17992
+ }
17993
+ },
17994
+ "/api/v1/reviews/prs/{owner}/{repo}/{number}/retry": {
17995
+ "post": {
17996
+ "callbacks": {},
17997
+ "deprecated": false,
17998
+ "description": "Requires the `reviews:write` scope. Requires the exact current head/check/prior attempt and proof the previous execution stopped. An identical request key returns its existing attempt. Run-bound credentials are refused. The retained advisory basis and all current adverse obligations are rechecked before dispatch; retry never grants approval.",
17999
+ "parameters": [
18000
+ {
18001
+ "description": "The repository owner (the first half of `owner/name`)",
18002
+ "in": "path",
18003
+ "name": "owner",
18004
+ "required": true,
18005
+ "schema": {
18006
+ "type": "string"
18007
+ }
18008
+ },
18009
+ {
18010
+ "description": "The repository name (the second half of `owner/name`)",
18011
+ "in": "path",
18012
+ "name": "repo",
18013
+ "required": true,
18014
+ "schema": {
18015
+ "type": "string"
18016
+ }
18017
+ },
18018
+ {
18019
+ "description": "The pull request number",
18020
+ "in": "path",
18021
+ "name": "number",
18022
+ "required": true,
18023
+ "schema": {
18024
+ "minimum": 1,
18025
+ "type": "integer"
18026
+ }
18027
+ }
18028
+ ],
18029
+ "requestBody": {
18030
+ "content": {
18031
+ "application/json": {
18032
+ "schema": {
18033
+ "properties": {
18034
+ "check_id": {
18035
+ "format": "uuid",
18036
+ "type": "string"
18037
+ },
18038
+ "head_sha": {
18039
+ "pattern": "^[0-9a-f]{40}$",
18040
+ "type": "string"
18041
+ },
18042
+ "previous_attempt_id": {
18043
+ "format": "uuid",
18044
+ "nullable": true,
18045
+ "type": "string"
18046
+ },
18047
+ "reason": {
18048
+ "maxLength": 2000,
18049
+ "minLength": 1,
18050
+ "type": "string"
18051
+ },
18052
+ "request_key": {
18053
+ "maxLength": 128,
18054
+ "minLength": 1,
18055
+ "type": "string"
18056
+ }
18057
+ },
18058
+ "required": [
18059
+ "head_sha",
18060
+ "check_id",
18061
+ "previous_attempt_id",
18062
+ "request_key",
18063
+ "reason"
18064
+ ],
18065
+ "type": "object"
18066
+ }
18067
+ }
18068
+ },
18069
+ "required": true
18070
+ },
18071
+ "responses": {
18072
+ "200": {
18073
+ "content": {
18074
+ "application/json": {
18075
+ "schema": {
18076
+ "additionalProperties": false,
18077
+ "properties": {
18078
+ "data": {
18079
+ "additionalProperties": false,
18080
+ "properties": {
18081
+ "actor_user_id": {
18082
+ "format": "uuid",
18083
+ "nullable": true,
18084
+ "type": "string"
18085
+ },
18086
+ "advisory_client_id": {
18087
+ "format": "uuid",
18088
+ "nullable": true,
18089
+ "type": "string"
18090
+ },
18091
+ "advisory_head_sha": {
18092
+ "nullable": true,
18093
+ "type": "string"
18094
+ },
18095
+ "advisory_report_sha256": {
18096
+ "nullable": true,
18097
+ "type": "string"
18098
+ },
18099
+ "advisory_run_id": {
18100
+ "format": "uuid",
18101
+ "nullable": true,
18102
+ "type": "string"
18103
+ },
18104
+ "correlated": {
18105
+ "type": "boolean"
18106
+ },
18107
+ "cycle_id": {
18108
+ "format": "uuid",
18109
+ "nullable": true,
18110
+ "type": "string"
18111
+ },
18112
+ "deadline_at": {
18113
+ "format": "date-time",
18114
+ "type": "string"
18115
+ },
18116
+ "execution_completed_at": {
18117
+ "format": "date-time",
18118
+ "nullable": true,
18119
+ "type": "string"
18120
+ },
18121
+ "finished_at": {
18122
+ "format": "date-time",
18123
+ "nullable": true,
18124
+ "type": "string"
18125
+ },
18126
+ "github_run_attempt": {
18127
+ "nullable": true,
18128
+ "type": "integer"
18129
+ },
18130
+ "github_run_id": {
18131
+ "nullable": true,
18132
+ "type": "string"
18133
+ },
18134
+ "id": {
18135
+ "format": "uuid",
18136
+ "type": "string"
18137
+ },
18138
+ "intent_at": {
18139
+ "format": "date-time",
18140
+ "type": "string"
18141
+ },
18142
+ "number": {
18143
+ "minimum": 1,
18144
+ "type": "integer"
18145
+ },
18146
+ "previous_attempt_id": {
18147
+ "format": "uuid",
18148
+ "nullable": true,
18149
+ "type": "string"
18150
+ },
18151
+ "reason": {
18152
+ "nullable": true,
18153
+ "type": "string"
18154
+ },
18155
+ "request_key": {
18156
+ "type": "string"
18157
+ },
18158
+ "review_run_id": {
18159
+ "format": "uuid",
18160
+ "nullable": true,
18161
+ "type": "string"
18162
+ },
18163
+ "state": {
18164
+ "enum": [
18165
+ "dispatch_pending",
18166
+ "dispatch_unknown",
18167
+ "queued",
18168
+ "running",
18169
+ "completed",
18170
+ "failed",
18171
+ "timed_out",
18172
+ "superseded",
18173
+ "legacy_unknown"
18174
+ ],
18175
+ "type": "string"
18176
+ },
18177
+ "terminal_reason": {
18178
+ "nullable": true,
18179
+ "type": "string"
18180
+ },
18181
+ "workflow": {
18182
+ "type": "string"
18183
+ },
18184
+ "workflow_ref": {
18185
+ "type": "string"
18186
+ }
18187
+ },
18188
+ "required": [
18189
+ "id",
18190
+ "number",
18191
+ "previous_attempt_id",
18192
+ "actor_user_id",
18193
+ "request_key",
18194
+ "reason",
18195
+ "state",
18196
+ "workflow",
18197
+ "workflow_ref",
18198
+ "correlated",
18199
+ "cycle_id",
18200
+ "advisory_run_id",
18201
+ "advisory_client_id",
18202
+ "advisory_head_sha",
18203
+ "advisory_report_sha256",
18204
+ "intent_at",
18205
+ "deadline_at",
18206
+ "github_run_id",
18207
+ "github_run_attempt",
18208
+ "review_run_id",
18209
+ "finished_at",
18210
+ "terminal_reason",
18211
+ "execution_completed_at"
18212
+ ],
18213
+ "type": "object"
18214
+ },
18215
+ "outcome": {
18216
+ "enum": [
18217
+ "existing"
18218
+ ],
18219
+ "type": "string"
18220
+ }
18221
+ },
18222
+ "required": [
18223
+ "data",
18224
+ "outcome"
18225
+ ],
18226
+ "type": "object"
18227
+ }
18228
+ }
18229
+ },
18230
+ "description": "Identical retry already recorded"
18231
+ },
18232
+ "202": {
18233
+ "content": {
18234
+ "application/json": {
18235
+ "schema": {
18236
+ "additionalProperties": false,
18237
+ "properties": {
18238
+ "data": {
18239
+ "additionalProperties": false,
18240
+ "properties": {
18241
+ "actor_user_id": {
18242
+ "format": "uuid",
18243
+ "nullable": true,
18244
+ "type": "string"
18245
+ },
18246
+ "advisory_client_id": {
18247
+ "format": "uuid",
18248
+ "nullable": true,
18249
+ "type": "string"
18250
+ },
18251
+ "advisory_head_sha": {
18252
+ "nullable": true,
18253
+ "type": "string"
18254
+ },
18255
+ "advisory_report_sha256": {
18256
+ "nullable": true,
18257
+ "type": "string"
18258
+ },
18259
+ "advisory_run_id": {
18260
+ "format": "uuid",
18261
+ "nullable": true,
18262
+ "type": "string"
18263
+ },
18264
+ "correlated": {
18265
+ "type": "boolean"
18266
+ },
18267
+ "cycle_id": {
18268
+ "format": "uuid",
18269
+ "nullable": true,
18270
+ "type": "string"
18271
+ },
18272
+ "deadline_at": {
18273
+ "format": "date-time",
18274
+ "type": "string"
18275
+ },
18276
+ "execution_completed_at": {
18277
+ "format": "date-time",
18278
+ "nullable": true,
18279
+ "type": "string"
18280
+ },
18281
+ "finished_at": {
18282
+ "format": "date-time",
18283
+ "nullable": true,
18284
+ "type": "string"
18285
+ },
18286
+ "github_run_attempt": {
18287
+ "nullable": true,
18288
+ "type": "integer"
18289
+ },
18290
+ "github_run_id": {
18291
+ "nullable": true,
18292
+ "type": "string"
18293
+ },
18294
+ "id": {
18295
+ "format": "uuid",
18296
+ "type": "string"
18297
+ },
18298
+ "intent_at": {
18299
+ "format": "date-time",
18300
+ "type": "string"
18301
+ },
18302
+ "number": {
18303
+ "minimum": 1,
18304
+ "type": "integer"
18305
+ },
18306
+ "previous_attempt_id": {
18307
+ "format": "uuid",
18308
+ "nullable": true,
18309
+ "type": "string"
18310
+ },
18311
+ "reason": {
18312
+ "nullable": true,
18313
+ "type": "string"
18314
+ },
18315
+ "request_key": {
18316
+ "type": "string"
18317
+ },
18318
+ "review_run_id": {
18319
+ "format": "uuid",
18320
+ "nullable": true,
18321
+ "type": "string"
18322
+ },
18323
+ "state": {
18324
+ "enum": [
18325
+ "dispatch_pending",
18326
+ "dispatch_unknown",
18327
+ "queued",
18328
+ "running",
18329
+ "completed",
18330
+ "failed",
18331
+ "timed_out",
18332
+ "superseded",
18333
+ "legacy_unknown"
18334
+ ],
18335
+ "type": "string"
18336
+ },
18337
+ "terminal_reason": {
18338
+ "nullable": true,
18339
+ "type": "string"
18340
+ },
18341
+ "workflow": {
18342
+ "type": "string"
18343
+ },
18344
+ "workflow_ref": {
18345
+ "type": "string"
18346
+ }
18347
+ },
18348
+ "required": [
18349
+ "id",
18350
+ "number",
18351
+ "previous_attempt_id",
18352
+ "actor_user_id",
18353
+ "request_key",
18354
+ "reason",
18355
+ "state",
18356
+ "workflow",
18357
+ "workflow_ref",
18358
+ "correlated",
18359
+ "cycle_id",
18360
+ "advisory_run_id",
18361
+ "advisory_client_id",
18362
+ "advisory_head_sha",
18363
+ "advisory_report_sha256",
18364
+ "intent_at",
18365
+ "deadline_at",
18366
+ "github_run_id",
18367
+ "github_run_attempt",
18368
+ "review_run_id",
18369
+ "finished_at",
18370
+ "terminal_reason",
18371
+ "execution_completed_at"
18372
+ ],
18373
+ "type": "object"
18374
+ },
18375
+ "outcome": {
18376
+ "enum": [
18377
+ "created"
18378
+ ],
18379
+ "type": "string"
18380
+ }
18381
+ },
18382
+ "required": [
18383
+ "data",
18384
+ "outcome"
18385
+ ],
18386
+ "type": "object"
18387
+ }
18388
+ }
18389
+ },
18390
+ "description": "New immutable attempt queued"
18391
+ },
18392
+ "400": {
18393
+ "description": "Bad request"
18394
+ },
18395
+ "401": {
18396
+ "description": "Missing or invalid token"
18397
+ },
18398
+ "403": {
18399
+ "description": "Token not permitted (org-scoped, non-admin, or missing scope)"
18400
+ },
18401
+ "404": {
18402
+ "description": "Not found"
18403
+ },
18404
+ "409": {
18405
+ "description": "Head, attempt, execution or advisory prerequisite changed"
18406
+ },
18407
+ "422": {
18408
+ "description": "Validation error"
18409
+ }
18410
+ },
18411
+ "summary": "Retry a terminal review execution",
18412
+ "tags": []
18413
+ }
17047
18414
  }
17048
18415
  },
17049
18416
  "security": [