@wardby/cli 0.4.1 → 0.5.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 (221) hide show
  1. package/.env.example +8 -1
  2. package/README.md +3 -1
  3. package/deploy/local/docker-compose.quickstart-coding.yml +27 -0
  4. package/dist/claude-coding-worker/driver.d.ts +2 -0
  5. package/dist/claude-coding-worker/driver.js +19 -3
  6. package/dist/claude-coding-worker/sdk.js +1 -1
  7. package/dist/cli.js +41 -22
  8. package/dist/coding/continuation-wording.d.ts +10 -0
  9. package/dist/coding/continuation-wording.js +13 -0
  10. package/dist/coding/docker-preflight.d.ts +12 -0
  11. package/dist/coding/docker-preflight.js +40 -0
  12. package/dist/coding/local-git.d.ts +22 -0
  13. package/dist/coding/local-git.js +102 -0
  14. package/dist/coding/local-repo-status.d.ts +7 -0
  15. package/dist/coding/local-repo-status.js +56 -0
  16. package/dist/coding/local-repo.d.ts +17 -0
  17. package/dist/coding/local-repo.js +65 -0
  18. package/dist/coding/observability.d.ts +1 -1
  19. package/dist/coding/observability.js +1 -0
  20. package/dist/coding/profile.d.ts +6 -0
  21. package/dist/coding/profile.js +13 -4
  22. package/dist/coding/protocol.d.ts +32 -7
  23. package/dist/coding/protocol.js +66 -4
  24. package/dist/coding-worker/artifact.d.ts +1 -0
  25. package/dist/coding-worker/errors.js +2 -0
  26. package/dist/config/providers.d.ts +13 -0
  27. package/dist/config/providers.js +21 -9
  28. package/dist/core/attribution.d.ts +13 -0
  29. package/dist/core/attribution.js +30 -0
  30. package/dist/core/budget-groups.d.ts +3 -1
  31. package/dist/core/budget-groups.js +53 -5
  32. package/dist/core/ci-context.d.ts +8 -0
  33. package/dist/core/ci-context.js +59 -0
  34. package/dist/core/delegation-siblings.d.ts +22 -0
  35. package/dist/core/delegation-siblings.js +40 -0
  36. package/dist/core/dispatch.d.ts +28 -4
  37. package/dist/core/dispatch.js +57 -15
  38. package/dist/core/engine-native.d.ts +16 -0
  39. package/dist/core/engine-native.js +49 -2
  40. package/dist/core/host-events.d.ts +25 -2
  41. package/dist/core/host-events.js +361 -19
  42. package/dist/core/host-status.d.ts +8 -3
  43. package/dist/core/host-status.js +38 -7
  44. package/dist/core/issue-events.d.ts +2 -6
  45. package/dist/core/issue-events.js +13 -19
  46. package/dist/core/pull-request-state-sync.d.ts +17 -0
  47. package/dist/core/pull-request-state-sync.js +53 -0
  48. package/dist/core/reconciler.d.ts +10 -1
  49. package/dist/core/reconciler.js +15 -2
  50. package/dist/core/related-pull-requests.d.ts +95 -0
  51. package/dist/core/related-pull-requests.js +338 -0
  52. package/dist/core/repo-access.d.ts +5 -1
  53. package/dist/core/repo-access.js +17 -1
  54. package/dist/core/review-fix-ledger.d.ts +20 -0
  55. package/dist/core/review-fix-ledger.js +41 -0
  56. package/dist/core/review-fix.d.ts +60 -0
  57. package/dist/core/review-fix.js +155 -0
  58. package/dist/core/review-host-tools.d.ts +13 -2
  59. package/dist/core/review-host-tools.js +72 -11
  60. package/dist/core/runner.d.ts +2 -2
  61. package/dist/core/runner.js +379 -184
  62. package/dist/core/serial-gate.d.ts +11 -0
  63. package/dist/core/serial-gate.js +19 -0
  64. package/dist/core/timing.d.ts +7 -0
  65. package/dist/core/timing.js +7 -0
  66. package/dist/generated/prisma/browser.d.ts +23 -0
  67. package/dist/generated/prisma/client.d.ts +23 -0
  68. package/dist/generated/prisma/commonInputTypes.d.ts +22 -0
  69. package/dist/generated/prisma/internal/class.d.ts +33 -0
  70. package/dist/generated/prisma/internal/class.js +4 -4
  71. package/dist/generated/prisma/internal/prismaNamespace.d.ts +274 -1
  72. package/dist/generated/prisma/internal/prismaNamespace.js +47 -2
  73. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +48 -0
  74. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +47 -2
  75. package/dist/generated/prisma/models/Agent.d.ts +422 -1
  76. package/dist/generated/prisma/models/AgentRepository.d.ts +120 -2
  77. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +42 -1
  78. package/dist/generated/prisma/models/CodingRun.d.ts +205 -1
  79. package/dist/generated/prisma/models/DeferredReview.d.ts +1336 -0
  80. package/dist/generated/prisma/models/DeferredReview.js +1 -0
  81. package/dist/generated/prisma/models/LocalPullRequest.d.ts +1384 -0
  82. package/dist/generated/prisma/models/LocalPullRequest.js +1 -0
  83. package/dist/generated/prisma/models/LocalReview.d.ts +1315 -0
  84. package/dist/generated/prisma/models/LocalReview.js +1 -0
  85. package/dist/generated/prisma/models/Run.d.ts +223 -0
  86. package/dist/generated/prisma/models/RunHostCheck.d.ts +148 -1
  87. package/dist/generated/prisma/models.d.ts +3 -0
  88. package/dist/help-index.json +486 -37
  89. package/dist/import/neutral-schema.d.ts +2 -2
  90. package/dist/mcp/auth/access.d.ts +3 -1
  91. package/dist/mcp/auth/host-account-cli.js +2 -2
  92. package/dist/mcp/auth/repo-authorization.d.ts +6 -7
  93. package/dist/mcp/auth/repo-authorization.js +21 -0
  94. package/dist/mcp/index.js +4 -1
  95. package/dist/mcp/tools/agents.js +46 -4
  96. package/dist/mcp/tools/host-accounts.js +2 -2
  97. package/dist/mcp/tools/repositories.js +71 -12
  98. package/dist/mcp/tools/runs.js +23 -0
  99. package/dist/mcp/tools/trigger.js +153 -24
  100. package/dist/providers/engine/types.d.ts +11 -0
  101. package/dist/providers/executor/composition.js +12 -7
  102. package/dist/providers/executor/container.d.ts +40 -3
  103. package/dist/providers/executor/container.js +140 -9
  104. package/dist/providers/executor/types.d.ts +1 -1
  105. package/dist/providers/jobs/fake-kubernetes-api.d.ts +3 -2
  106. package/dist/providers/jobs/fake-kubernetes-api.js +3 -0
  107. package/dist/providers/jobs/kubernetes-api.d.ts +3 -1
  108. package/dist/providers/jobs/kubernetes-client.d.ts +2 -1
  109. package/dist/providers/jobs/kubernetes-client.js +3 -0
  110. package/dist/providers/jobs/kubernetes-isolation.d.ts +7 -0
  111. package/dist/providers/jobs/kubernetes-isolation.js +8 -3
  112. package/dist/providers/jobs/kubernetes-preflight.d.ts +8 -0
  113. package/dist/providers/jobs/kubernetes-preflight.js +7 -0
  114. package/dist/providers/jobs/kubernetes-quota.d.ts +31 -0
  115. package/dist/providers/jobs/kubernetes-quota.js +110 -0
  116. package/dist/providers/jobs/kubernetes.d.ts +9 -0
  117. package/dist/providers/jobs/kubernetes.js +50 -0
  118. package/dist/providers/jobs/types.d.ts +7 -0
  119. package/dist/providers/review-host/ci.d.ts +7 -0
  120. package/dist/providers/review-host/ci.js +20 -0
  121. package/dist/providers/review-host/github-events.d.ts +7 -0
  122. package/dist/providers/review-host/github-events.js +31 -7
  123. package/dist/providers/review-host/github.d.ts +19 -2
  124. package/dist/providers/review-host/github.js +145 -2
  125. package/dist/providers/review-host/index.d.ts +8 -2
  126. package/dist/providers/review-host/index.js +14 -3
  127. package/dist/providers/review-host/local.d.ts +72 -0
  128. package/dist/providers/review-host/local.js +434 -0
  129. package/dist/providers/review-host/types.d.ts +65 -3
  130. package/dist/providers/review-host/types.js +5 -3
  131. package/dist/providers/vcs/git.d.ts +10 -20
  132. package/dist/providers/vcs/git.js +71 -127
  133. package/dist/providers/vcs/github-remote.d.ts +67 -0
  134. package/dist/providers/vcs/github-remote.js +201 -0
  135. package/dist/providers/vcs/github.d.ts +81 -0
  136. package/dist/providers/vcs/github.js +203 -6
  137. package/dist/providers/vcs/index.d.ts +16 -1
  138. package/dist/providers/vcs/index.js +43 -15
  139. package/dist/providers/vcs/local-remote.d.ts +44 -0
  140. package/dist/providers/vcs/local-remote.js +108 -0
  141. package/dist/providers/vcs/remote.d.ts +58 -0
  142. package/dist/providers/vcs/remote.js +1 -0
  143. package/dist/providers/vcs/routing.d.ts +33 -0
  144. package/dist/providers/vcs/routing.js +52 -0
  145. package/dist/providers/vcs/types.d.ts +12 -1
  146. package/dist/quickstart/coding-db.d.ts +11 -0
  147. package/dist/quickstart/coding-db.js +75 -0
  148. package/dist/quickstart/coding-doctor.d.ts +13 -0
  149. package/dist/quickstart/coding-doctor.js +88 -0
  150. package/dist/quickstart/coding-images.d.ts +15 -0
  151. package/dist/quickstart/coding-images.js +79 -0
  152. package/dist/quickstart/coding-seed.d.ts +63 -0
  153. package/dist/quickstart/coding-seed.js +85 -0
  154. package/dist/quickstart/coding.d.ts +66 -0
  155. package/dist/quickstart/coding.js +430 -0
  156. package/dist/quickstart/images.d.ts +19 -0
  157. package/dist/quickstart/images.js +63 -0
  158. package/dist/quickstart/index.js +61 -12
  159. package/dist/quickstart/starter-services.d.ts +45 -0
  160. package/dist/quickstart/starter-services.js +186 -0
  161. package/dist/quickstart-images.json +1 -0
  162. package/dist/serve.js +14 -1
  163. package/dist/viewer/api-schema.d.ts +176 -0
  164. package/dist/viewer/api-schema.js +27 -2
  165. package/dist/viewer/graph.d.ts +7 -2
  166. package/dist/viewer/graph.js +25 -11
  167. package/dist/viewer/http.d.ts +7 -1
  168. package/dist/viewer/http.js +8 -3
  169. package/dist/viewer/infra.d.ts +2 -0
  170. package/dist/viewer/infra.js +23 -0
  171. package/dist/viewer/run-detail.d.ts +2 -1
  172. package/dist/viewer/run-detail.js +2 -2
  173. package/docs/agent-recipes.md +127 -5
  174. package/docs/code-review-agents.md +293 -38
  175. package/docs/coding-agent-setup.md +141 -2
  176. package/docs/coding-packages.md +21 -0
  177. package/docs/coding-services.md +3 -0
  178. package/docs/coding-worker-isolation.md +56 -20
  179. package/docs/getting-started-gke.md +24 -0
  180. package/docs/getting-started.md +196 -10
  181. package/docs/jira-agents.md +26 -5
  182. package/docs/security-deployment.md +9 -0
  183. package/docs/viewer-api.md +21 -2
  184. package/help/admin-viewer.md +11 -1
  185. package/help/agent-recipes.md +30 -4
  186. package/help/builder-agent.md +4 -0
  187. package/help/code-review-agents.md +82 -2
  188. package/help/coding-packages.md +12 -1
  189. package/help/coding-services.md +4 -0
  190. package/help/cost-attribution.md +3 -1
  191. package/help/creating-agents.md +3 -0
  192. package/help/deploy-gke.md +2 -1
  193. package/help/errors/coding-provider-not-configured.md +60 -0
  194. package/help/errors/coding-turn-limit.md +25 -0
  195. package/help/errors/continuation-closed.md +75 -0
  196. package/help/errors/local-branch-conflict.md +37 -0
  197. package/help/errors/local-path-invalid.md +30 -0
  198. package/help/errors/local-ref-invalid.md +36 -0
  199. package/help/errors/local-ref-not-found.md +41 -0
  200. package/help/errors/local-repo-not-allowed.md +46 -0
  201. package/help/errors/local-repo-not-found.md +39 -0
  202. package/help/errors/model-unavailable.md +7 -6
  203. package/help/errors/vcs-github-not-configured.md +34 -0
  204. package/help/getting-started.md +28 -0
  205. package/help/github.md +22 -5
  206. package/help/jira.md +9 -2
  207. package/help/local-repositories.md +182 -0
  208. package/help/related-pull-requests.md +89 -0
  209. package/help/review-fix-rounds.md +69 -0
  210. package/help/troubleshooting/budgets.md +11 -0
  211. package/help/troubleshooting/coding-workers.md +22 -0
  212. package/help/troubleshooting/repository-access.md +5 -0
  213. package/package.json +3 -2
  214. package/prisma/migrations/20261004100000_delegations_and_coding_turns/migration.sql +12 -0
  215. package/prisma/migrations/20261005000000_review_fix_rounds/migration.sql +5 -0
  216. package/prisma/migrations/20261006000000_parallel_delegations/migration.sql +6 -0
  217. package/prisma/migrations/20261007000000_ci_rereview/migration.sql +4 -0
  218. package/prisma/migrations/20261008000000_review_after_ci/migration.sql +33 -0
  219. package/prisma/migrations/20261009000001_coding_run_local_branch/migration.sql +7 -0
  220. package/prisma/migrations/20261009000002_local_review/migration.sql +50 -0
  221. package/prisma/schema.prisma +98 -1
@@ -3,7 +3,7 @@ id: code-review-agents
3
3
  title: Run GitHub code-review agents
4
4
  summary: Link a read-only review agent to a repository for pull-request checks and trusted mention workflows.
5
5
  audience: operator
6
- tags: [github, code-review, pull-requests, webhooks]
6
+ tags: [github, code-review, pull-requests, webhooks, ci, checks, waitForCi]
7
7
  appliesTo: >=0.2.1
8
8
  ---
9
9
 
@@ -26,12 +26,92 @@ A mention on a pull request that a wardby coding run opened continues that
26
26
  run's branch. If this deployment has no record of the run that opened it (for
27
27
  example, another wardby deployment sharing the same GitHub App opened it), the
28
28
  App replies that it cannot continue the pull request instead of starting a
29
- run. Ask the deployment that opened it, or change the branch by hand.
29
+ run. Ask the deployment that opened it, or change the branch by hand. A
30
+ continuation also never pushes to a pull request that has since been merged
31
+ or closed — see
32
+ [Continuation's pull request is no longer open](errors/continuation-closed.md).
33
+
34
+ To review a branch of a git repository on the wardby host, without GitHub, see
35
+ [Use local git repositories](local-repositories.md).
36
+
37
+ A repository can also be linked so wardby fixes its own review's findings on
38
+ such a pull request automatically, up to a round cap — see
39
+ [Automatic review fix rounds](review-fix-rounds.md).
30
40
 
31
41
  Wardby skips pull requests whose head is in a fork. It also ignores mentions
32
42
  from bots and people without write access. Repository links require the
33
43
  agent owner's linked GitHub access, or an explicitly recorded administrator
34
44
  approval.
35
45
 
46
+ ## CI and sibling pull requests
47
+
48
+ `repo_pr_read` also returns `ci`: the CI check runs and commit statuses on the
49
+ pull request's head commit (Wardby's own checks left out), an overall state,
50
+ and a note. CI is the authority on whether the head builds and passes its
51
+ tests. The **Tests** list in a Wardby pull request's description was run in
52
+ Wardby's coding sandbox, which may have had an incomplete install (see the
53
+ **Dependency install incomplete** warning). Checks still running are reported
54
+ as pending.
55
+
56
+ If a review publishes only a comment while CI on the head is still running (or
57
+ has not reported yet), Wardby runs that review again once CI on the same head
58
+ has finished, so it can approve or request changes against the real result.
59
+ This happens at most once per head commit for each reviewer, only while the pull request is open
60
+ and still at that commit, and needs the App's **Check suite** event. CI that
61
+ reports only commit statuses (no check suites) does not trigger it, nor does a
62
+ commit status still pending when the last check suite finishes; use **Re-run**
63
+ on the review check instead.
64
+
65
+ Commit statuses need the App's **Commit statuses: Read** permission; without
66
+ it only check runs are shown.
67
+
68
+ ## Review after CI (`waitForCi`)
69
+
70
+ A `pull_request` link can set `waitForCi: true` so this reviewer reviews a
71
+ pushed head only after that head's own CI has finished, instead of racing
72
+ it. The gate below keeps it from approving while CI on that head is known
73
+ to be failing or still running; see the gate's own exceptions for when CI
74
+ can't be read or this run doesn't own the check.
75
+
76
+ On a push, Wardby reads CI on the new head before starting a `waitForCi`
77
+ reviewer. If CI is still pending, or nothing has reported yet, the review is
78
+ held rather than started; it starts once CI finishes (the same **Check
79
+ suite** event used for the re-review above), or — if CI never finishes —
80
+ after 15 minutes anyway. CI that reports only commit statuses (no check
81
+ suites), or a status still pending when the last check suite finishes,
82
+ never releases a held review early; it starts only at that 15-minute
83
+ fallback. The 15-minute fallback, and the 24-hour drop below, only run
84
+ where Wardby's scheduler process runs (`wardby scheduler`, or `wardby
85
+ serve` with the scheduler enabled); on an instance running only `wardby
86
+ mcp`, a held review starts only once a **Check suite** event arrives, so
87
+ with status-only CI it can wait indefinitely. A review still held after 24
88
+ hours is dropped. This is decided per pull request, never across a set of
89
+ related pull requests.
90
+
91
+ While CI on the head is failing or still running, `repo_publish_review`
92
+ refuses an approve verdict on a `waitForCi` reviewer's own check, returning
93
+ a tool error instead of publishing anything:
94
+
95
+ - `ci_failing` — CI is failing; request changes (or comment) instead.
96
+ - `ci_pending` — CI is still running; comment instead. The re-review above
97
+ then runs the review again once a CI check suite finishes.
98
+
99
+ Requesting changes or commenting is never affected by this gate. When CI
100
+ cannot be read at all, the gate is skipped and the review proceeds as it
101
+ would without `waitForCi`.
102
+
103
+ Add this to a reviewer's system prompt:
104
+
105
+ Reviewer step (CI and related pull requests). Read `ci` from repo_pr_read.
106
+ When `ci` and the description's Tests disagree, follow CI and say so; never
107
+ ask for a fix only because a sandbox test failed while CI passed. Report
108
+ pending checks as pending. If the description has a "Related pull requests"
109
+ section, a field, route or schema the change relies on may be added by one
110
+ of those pull requests: do not report it as missing; note the dependency
111
+ and the suggested merge order instead.
112
+
113
+ Wardby also writes that section: see
114
+ [Related pull requests across repositories](related-pull-requests.md).
115
+
36
116
  For App permissions, webhook setup, trigger configuration, and security
37
117
  details, follow [`docs/code-review-agents.md`](../docs/code-review-agents.md).
@@ -3,7 +3,7 @@ id: coding-packages
3
3
  title: Approve packages for coding agents
4
4
  summary: Let Codex coding workers install vetted npm and PyPI dependencies through Wardby's registry proxy.
5
5
  audience: operator
6
- tags: [coding-agents, packages, npm, pypi, supply-chain]
6
+ tags: [coding-agents, packages, npm, pypi, supply-chain, refusals, lockfile]
7
7
  appliesTo: >=0.2.1
8
8
  ---
9
9
 
@@ -27,5 +27,16 @@ reaches the registry through the run's proxy network. Use a pinned custom
27
27
  worker image when an agent needs system packages, another runtime, or
28
28
  dependencies that should be baked into the image.
29
29
 
30
+ When the registry refuses a package, the pull request opens with a
31
+ **Dependency install incomplete** warning naming each refused package and
32
+ any lock file the run changed. A changed lock file may then fail a clean
33
+ install in CI until it is regenerated, and the run's status comment shows ⚠️
34
+ if its own checks failed. A package reachable only through a refused one is
35
+ refused too, so a high-severity advisory deep in a toolchain blocks every run
36
+ that installs it.
37
+
38
+ Review agents see the pull request's CI results in `repo_pr_read` and are
39
+ told to trust CI over the sandbox's **Tests**.
40
+
30
41
  Read [`docs/coding-packages.md`](../docs/coding-packages.md) for allowlist
31
42
  syntax, package-policy controls, lockfile behavior, and refusal errors.
@@ -58,6 +58,10 @@ When upgrading a deployment that delegates to an identity provider, define the
58
58
  `services:manage` scope in the provider first; see
59
59
  [Configure identity and privileged access](identity-and-access.md).
60
60
 
61
+ For a repository on the wardby host (`local:/absolute/path`), the declaration is
62
+ read from the committed file at the run's base ref, never the working tree; see
63
+ [Use local git repositories](local-repositories.md).
64
+
61
65
  If a run is refused or fails over its services, read the page for its code:
62
66
 
63
67
  - [`service_declaration_invalid`](errors/service-declaration-invalid.md)
@@ -16,7 +16,9 @@ A run is attributed to an issue when:
16
16
 
17
17
  - a Jira event on that issue started it;
18
18
  - it reviews, or answers an `@wardby` mention on, a pull request Wardby opened
19
- for the issue;
19
+ for the issue — including a review that starts while the agent that asked
20
+ for the pull request is still running, before the pull request is linked to
21
+ the issue (Wardby then uses the issue of the coding run that opened it);
20
22
  - `trigger_agent` named an `issue`, or a webhook call's JSON body named a
21
23
  `wardbyIssue`, as `{ "provider": "jira", "key": "PROJ-123" }`, in a project
22
24
  the agent is linked to. Keys are matched without regard to case
@@ -85,6 +85,9 @@ A coding agent can also keep a repository's architecture knowledge current; see
85
85
  For an `@mention` builder with a router, see [Agent recipes](help://agent-recipes) and
86
86
  [Builder and router prompts](help://builder-agent).
87
87
 
88
+ A coding or review agent can also use a git folder on the wardby host instead of a
89
+ GitHub repository; see [Use local git repositories](local-repositories.md).
90
+
88
91
  Read [Connect GitHub repositories](github.md) and
89
92
  [Troubleshoot coding workers](troubleshooting/coding-workers.md) before
90
93
  enabling repository-changing work.
@@ -3,7 +3,7 @@ id: deploy-gke
3
3
  title: Deploy Wardby on GKE Autopilot
4
4
  summary: Use the supported Google Cloud path for a private database, isolated coding workers, and HTTPS ingress.
5
5
  audience: operator
6
- tags: [deployment, gke, gcp, kubernetes, production]
6
+ tags: [deployment, gke, gcp, kubernetes, production, secrets, jira]
7
7
  appliesTo: >=0.2.1
8
8
  ---
9
9
 
@@ -27,6 +27,7 @@ The deployment process is:
27
27
  Gateway's address, certificate map, Cloud Armor policy, and DNS record.
28
28
  3. Put first-time values in an untracked `.env.local`; `deploy/gke/up.sh`
29
29
  seeds Secret Manager without overwriting existing production values.
30
+ Jira settings are optional there, all or none; see [Jira](jira.md).
30
31
  4. Run `HOSTNAME=wardby.example.com deploy/gke/up.sh`, then verify DNS,
31
32
  certificate issuance, database IAM bootstrap, and service health.
32
33
 
@@ -0,0 +1,60 @@
1
+ ---
2
+ id: errors/coding-provider-not-configured
3
+ title: Coding provider not configured
4
+ summary: A coding run was refused because this server has no worker images for the agent's coding provider (Codex or Claude Code).
5
+ audience: operator
6
+ tags: [error, coding-agents, configuration, coding_provider_not_configured, CODING_WORKER_IMAGE, codex, claude-code]
7
+ appliesTo: ">=0.5.0"
8
+ ---
9
+
10
+ # Coding provider not configured
11
+
12
+ `coding_provider_not_configured:<provider>` means a coding agent's provider has
13
+ no worker images on this wardby server. Each provider's images are optional, so
14
+ a server can run Codex agents only, Claude Code agents only, or both. Starting
15
+ the run (a trigger, schedule, or webhook) fails at dispatch with this error,
16
+ before any worker starts and before anything is spent. A run records its worker
17
+ image at dispatch, so removing an image later doesn't affect most runs already
18
+ dispatched. The exceptions fail at launch with category
19
+ `preflight`: a Claude Code run when `CODING_CLAUDE_TOOL_RUNNER_IMAGE` has since
20
+ been unset, and a Codex run with no recorded worker image (one dispatched before
21
+ runs recorded it) when `CODING_WORKER_IMAGE` has since been unset.
22
+
23
+ - **`coding_provider_not_configured:codex`**: `CODING_WORKER_IMAGE` (the Codex
24
+ worker) isn't set, and the agent names no worker image of its own
25
+ (`codingProfile.workerImageRef`). An agent that sets `workerImageRef`, or uses
26
+ a toolchain with its own image (such as `CODING_WORKER_IMAGE_NODE_PYTHON_3_12`),
27
+ still runs without `CODING_WORKER_IMAGE`.
28
+ - **`coding_provider_not_configured:claude-code`**: `CODING_CLAUDE_WORKER_IMAGE`
29
+ or `CODING_CLAUDE_TOOL_RUNNER_IMAGE` isn't set. Claude Code needs both, and
30
+ even an agent's own `workerImageRef` doesn't replace the tool runner.
31
+
32
+ This error is about images, not API keys. A missing or invalid model API key
33
+ fails later, when the run calls the model.
34
+
35
+ ## What to do
36
+
37
+ Choose one:
38
+
39
+ 1. **Configure the provider.** Set its images on the wardby server and restart
40
+ it:
41
+ - Codex: `CODING_WORKER_IMAGE`.
42
+ - Claude Code: `CODING_CLAUDE_WORKER_IMAGE` and
43
+ `CODING_CLAUDE_TOOL_RUNNER_IMAGE`.
44
+
45
+ Each image must be immutable: a local `sha256:` image ID or a
46
+ `repo@sha256:` digest for Docker, and a registry digest for Kubernetes. With
47
+ the quickstart, re-run it and choose the provider you want; it pulls or builds
48
+ only that provider's images and keeps the ones already set. Then run
49
+ `wardby coding preflight`. See
50
+ [Local coding-agent setup](../../docs/coding-agent-setup.md).
51
+
52
+ 2. **Switch the agent to a configured provider.** Use `update_agent` to change
53
+ its `codingProfile.provider` and pick a model for that provider.
54
+
55
+ The server refuses to start with a coding launcher (`JOB_LAUNCHER=docker` or
56
+ `kubernetes`) when neither provider has images. That startup error names both
57
+ options.
58
+
59
+ Related: [Local git repositories](../local-repositories.md),
60
+ [Model not available](model-unavailable.md).
@@ -0,0 +1,25 @@
1
+ ---
2
+ id: errors/coding-turn-limit
3
+ title: Coding run reached its turn limit
4
+ summary: A Claude Code coding run stopped because it used every agent turn its codingProfile.maxTurns allows (200 by default), before it finished the task.
5
+ audience: operator
6
+ tags: [error, coding-agents, claude-code, turns, maxTurns]
7
+ appliesTo: ">=0.4.2"
8
+ ---
9
+
10
+ # Coding run reached its turn limit
11
+
12
+ `coding_turn_limit` (failure category `turn_limit`) means a Claude Code run used
13
+ all of its agent turns before it finished. Every file read, command and edit is
14
+ a turn. The limit is the agent's `codingProfile.maxTurns`, or 200 when it is
15
+ unset. Codex runs have no turn limit.
16
+
17
+ 1. Read the run's summary, and its debug trace if one was on
18
+ (`codingProfile.debugTraceMinutes`), to see whether the task was large or the
19
+ agent was repeating itself.
20
+ 2. For a large task, raise the limit (1 to 1000) with `update_agent`:
21
+ `{ "id": "<agent id>", "codingProfile": { "maxTurns": 400 } }`.
22
+ 3. For a loop, narrow the task or fix what it was retrying, then run it again.
23
+
24
+ The run's `budgetUsd` and `timeoutSec` still apply. See
25
+ [Troubleshoot coding workers](../troubleshooting/coding-workers.md).
@@ -0,0 +1,75 @@
1
+ ---
2
+ id: errors/continuation-closed
3
+ title: Continuation's pull request is no longer open
4
+ summary: A run asked to continue a pull request that was already merged or closed, so nothing was pushed.
5
+ audience: operator
6
+ tags: [error, coding-agents, vcs, pull-requests, continuation, continuePriorRun]
7
+ appliesTo: ">=0.4.2"
8
+ ---
9
+
10
+ # Continuation's pull request is no longer open
11
+
12
+ A coding run started with `continuePriorRun` (a mention follow-up, a Jira
13
+ issue-event task, or a review fix round) reuses the branch and pull request
14
+ the named run originally opened. Before cloning, and again right before it
15
+ pushes, wardby asks GitHub whether that pull request is still open. A run
16
+ that stopped with category `continuation_closed` got a definite answer that
17
+ it is not: the pull request was merged or closed, or GitHub no longer lists
18
+ an open pull request carrying that run's marker for the branch. Nothing from
19
+ the run was pushed either way, so the pull request (and anyone who merged or
20
+ closed it) is unaffected.
21
+
22
+ Two things besides an actual merge or close can also make the check come back
23
+ "no longer found," since it looks for an **open** pull request with that
24
+ exact base branch and the run's hidden marker still in its description:
25
+
26
+ - the pull request's base branch was retargeted to something other than the
27
+ one the run recorded;
28
+ - the hidden `<!-- wardby:<run-id> -->` marker was removed or edited out of
29
+ the pull request's description (wardby relies on it to find its own PR;
30
+ nothing else identifies it).
31
+
32
+ When the pull request was merged or closed **before the run started**, the
33
+ check before cloning catches it: the run's status is `refused`, and nothing
34
+ was spent beyond setup. When it was merged or closed **while the run was
35
+ working**, the check right before the push catches it instead: that run ends
36
+ `failed`, having already done its work, and that work is not pushed. Either
37
+ way the category (`get_run`'s `codingRun.failureCategory`) is
38
+ `continuation_closed`.
39
+
40
+ This is a safety check, not a flaky one: a transient GitHub failure while
41
+ checking (a timeout, a rate limit, a 5xx) is retried once, after a short
42
+ wait, and if it still fails, wardby proceeds as though the pull request were
43
+ still open rather than stopping the run on an unconfirmed answer — it only
44
+ ever refuses on a definite "merged", "closed", or "no longer found" answer.
45
+
46
+ ## What the requester sees
47
+
48
+ **(a) A parent agent that delegated the continuation** (a router that called
49
+ `continuePriorRun`, a Jira or mention follow-up) gets this back as its
50
+ sub-run's `refusal`, never the raw error code:
51
+
52
+ > The pull request this run was asked to continue is no longer open (merged
53
+ > or closed), so nothing was pushed. If the change is still needed, delegate
54
+ > again without continuePriorRun: it becomes a new pull request from the
55
+ > default branch.
56
+
57
+ **(b) A person watching the request** — the @-mention's status comment, or
58
+ the Jira issue comment for an issue-event task — sees a line about the
59
+ sub-run instead, without the error code:
60
+
61
+ > A sub-run was asked to continue a pull request that is no longer open
62
+ > (merged or closed); nothing was pushed.
63
+
64
+ ## What to do
65
+
66
+ If the change is still needed, ask again without `continuePriorRun` (or
67
+ without naming the closed pull request). The new run opens a fresh pull
68
+ request from the repository's default branch. If the check is wrongly
69
+ finding nothing when the pull request is in fact open, check that its base
70
+ branch still matches what wardby recorded and that the `<!-- wardby:... -->`
71
+ marker is still in its description, unedited.
72
+
73
+ Related: [Run GitHub code-review agents](../code-review-agents.md),
74
+ [Automatic review fix rounds](../review-fix-rounds.md),
75
+ [Related pull requests across repositories](../related-pull-requests.md).
@@ -0,0 +1,37 @@
1
+ ---
2
+ id: errors/local-branch-conflict
3
+ title: Run's branch was modified or is checked out
4
+ summary: The branch wardby/run-<id> moved since the run started, or it is checked out in the local repository, so wardby did not push to it.
5
+ audience: operator
6
+ tags: [error, local-repositories, coding-agents, vcs]
7
+ appliesTo: ">=0.5.0"
8
+ ---
9
+
10
+ # Run's branch was modified or is checked out
11
+
12
+ `local_branch_conflict` means wardby would not push a run's commit into the
13
+ local repository because the target branch `wardby/run-<run id>` is not in the
14
+ state the run expects. Either:
15
+
16
+ - the branch moved after the run cloned it, for example you or another run
17
+ committed to it, so the push would not be a fast-forward; or
18
+ - the branch is checked out in the repository, and wardby never changes the
19
+ branch you have checked out.
20
+
21
+ The run fails and nothing is pushed. Your repository, working tree and checked-out
22
+ branch are unchanged.
23
+
24
+ ## What to do
25
+
26
+ 1. Check what is checked out: `git -C /path/to/repo branch --show-current`. If
27
+ it is a `wardby/run-*` branch, switch to another one, such as `main`.
28
+ 2. If the branch moved, decide which work to keep. To build on the moved branch,
29
+ start a new run with `baseRef: wardby/run-<run id>` so it starts from the
30
+ branch's current tip.
31
+ 3. Start the run again.
32
+
33
+ To avoid this, treat `wardby/run-*` branches as wardby's while a run is active:
34
+ do not commit to them or check them out. To inspect a result, use
35
+ `git show wardby/run-<run id>` or create your own branch from it.
36
+
37
+ Related: [Local git repositories](../local-repositories.md).
@@ -0,0 +1,30 @@
1
+ ---
2
+ id: errors/local-path-invalid
3
+ title: Invalid file path in local repository read
4
+ summary: A file path given to a repository read was absolute or contained empty, dot or dot-dot segments.
5
+ audience: operator
6
+ tags: [error, local-repositories, coding-agents, vcs]
7
+ appliesTo: ">=0.5.0"
8
+ ---
9
+
10
+ # Invalid file path in local repository read
11
+
12
+ `local_path_invalid` means a read of a file in a local repository (for example
13
+ `repo_read_file` in a review, or wardby reading `.wardby/services.yaml`) used a
14
+ path wardby will not pass to git. Paths must be relative to the repository root.
15
+ A path is rejected when it:
16
+
17
+ - starts with `/`;
18
+ - contains an empty segment (`src//main.ts`), a `.` segment or a `..` segment; or
19
+ - is empty or contains a NUL.
20
+
21
+ Wardby reads files from the committed tree at a ref, so only regular files are
22
+ readable. A symlink, directory or submodule at that path is not.
23
+
24
+ ## What to do
25
+
26
+ Use a clean repository-relative path, such as `src/main.ts` or `docs/README.md`,
27
+ not `/home/you/repo/src/main.ts`, `./src/main.ts` or `src/../src/main.ts`. Use
28
+ `repo_list_files` to see what exists at the ref.
29
+
30
+ Related: [Local git repositories](../local-repositories.md).
@@ -0,0 +1,36 @@
1
+ ---
2
+ id: errors/local-ref-invalid
3
+ title: Invalid git branch or ref name
4
+ summary: A branch or ref name was rejected because it does not follow git's naming rules.
5
+ audience: operator
6
+ tags: [error, local-repositories, coding-agents, vcs]
7
+ appliesTo: ">=0.5.0"
8
+ ---
9
+
10
+ # Invalid git branch or ref name
11
+
12
+ `local_ref_invalid` means wardby refused a branch or ref name before passing it
13
+ to git. A name is rejected when it:
14
+
15
+ - is empty, starts with `-`, or contains `@{`, a NUL, a space or other
16
+ non-printable or non-ASCII character;
17
+ - is too long; or
18
+ - is not accepted by `git check-ref-format --branch` (for example it contains
19
+ `..`, a trailing `.lock`, or characters such as `~`, `^`, `:` or `\`).
20
+
21
+ It can also appear when a review is requested without `base` while the
22
+ repository's HEAD is detached, because there is no checked-out branch to use.
23
+
24
+ ## What to do
25
+
26
+ Use a plain branch name that git accepts. You can check one with:
27
+
28
+ ```
29
+ git check-ref-format --branch my-branch-name
30
+ ```
31
+
32
+ Valid examples: `feature/add-login`, `fix-123`, `release-1.0`. Invalid examples:
33
+ `-feature`, `feature branch`, `feature..fix`. For the detached HEAD case, pass
34
+ `review.base` explicitly or check out a branch.
35
+
36
+ Related: [Local git repositories](../local-repositories.md).
@@ -0,0 +1,41 @@
1
+ ---
2
+ id: errors/local-ref-not-found
3
+ title: Git branch or ref does not exist in the local repository
4
+ summary: A branch or base ref the run asked for was not found in the repository history.
5
+ audience: operator
6
+ tags: [error, local-repositories, coding-agents, vcs]
7
+ appliesTo: ">=0.5.0"
8
+ ---
9
+
10
+ # Git branch or ref does not exist in the local repository
11
+
12
+ `local_ref_not_found` means a branch, base or other ref named in a request does
13
+ not resolve to a commit in the local repository. It comes from:
14
+
15
+ - a coding run whose `baseRef` (on the agent's profile or in `trigger_agent`)
16
+ is not a branch of the repository;
17
+ - a continuation or a `baseRef: wardby/run-<run id>` whose result branch was
18
+ deleted, for example with `git branch -D`; or
19
+ - a review (`trigger_agent` with `review`) whose `branch` or `base` is not a
20
+ branch of the repository, or a file read at a ref that does not exist.
21
+
22
+ Only committed history counts. Uncommitted changes are not part of any branch.
23
+
24
+ ## What to do
25
+
26
+ 1. List the branches the repository really has:
27
+ ```
28
+ git -C /path/to/repo branch --all
29
+ ```
30
+ 2. Fix the name, or commit your work to a branch first:
31
+ ```
32
+ git switch -c my-branch
33
+ git commit -am "Work in progress"
34
+ ```
35
+ 3. If a result branch was deleted and you still have its commit, recreate it
36
+ with `git branch wardby/run-<run id> <commit>`. Otherwise start from another
37
+ branch.
38
+ 4. For a review, check both `branch` and `base`; `base` defaults to the branch
39
+ checked out in the repository.
40
+
41
+ Related: [Local git repositories](../local-repositories.md).
@@ -0,0 +1,46 @@
1
+ ---
2
+ id: errors/local-repo-not-allowed
3
+ title: Local repository is not in a trusted folder
4
+ summary: The repository path is outside every folder listed in LOCAL_REPO_ROOTS, so the run was refused.
5
+ audience: operator
6
+ tags: [error, local-repositories, coding-agents, vcs]
7
+ appliesTo: ">=0.5.0"
8
+ ---
9
+
10
+ # Local repository is not in a trusted folder
11
+
12
+ `local_repo_not_allowed` means wardby refused a local repository (a repository
13
+ written `local:/absolute/path`) because its real path, after resolving symlinks,
14
+ is not at or below any folder listed in the `LOCAL_REPO_ROOTS` environment
15
+ variable. If `LOCAL_REPO_ROOTS` is unset, no local repository is allowed.
16
+
17
+ A trusted folder that does not exist where the wardby server runs is ignored.
18
+ This is the usual cause when the server runs in a container, a pod or on
19
+ another machine: it cannot see the folder, so every repository under it is
20
+ refused with this error. `doctor` lists each trusted folder and reports a
21
+ missing one.
22
+
23
+ Wardby checks the folders when you create or update an agent, link a
24
+ repository, trigger a run, and again while a run uses the repository, so a
25
+ narrowed list also refuses agents that were saved earlier.
26
+
27
+ ## What to do
28
+
29
+ 1. Add the repository's folder (or a parent folder) to `LOCAL_REPO_ROOTS` on the
30
+ wardby server. Separate folders with the platform's path delimiter: `:` on
31
+ macOS and Linux, `;` on Windows. For example:
32
+ ```
33
+ LOCAL_REPO_ROOTS=/home/you/projects:/srv/repos
34
+ ```
35
+ 2. Restart the wardby server so it reads the new value.
36
+ 3. If you set up wardby with `quickstart`, run it again with
37
+ `--coding --trust /path/to/folder` (repeat `--trust` for more folders). It
38
+ keeps the folders already trusted and writes the new list to `.wardby/.env`.
39
+
40
+ 4. Run the wardby server directly on the machine that holds the folders, not
41
+ in a container.
42
+
43
+ If the repository path goes through a symlink, the symlink's target must be
44
+ inside a trusted folder; the link's own location does not count.
45
+
46
+ Related: [Local git repositories](../local-repositories.md), [Get started](../getting-started.md).
@@ -0,0 +1,39 @@
1
+ ---
2
+ id: errors/local-repo-not-found
3
+ title: Local repository path not found or not a git repository
4
+ summary: The repository path does not exist, is not the top level of a git work tree, or is not readable by the wardby server.
5
+ audience: operator
6
+ tags: [error, local-repositories, coding-agents, vcs]
7
+ appliesTo: ">=0.5.0"
8
+ ---
9
+
10
+ # Local repository path not found or not a git repository
11
+
12
+ `local_repo_not_found` means wardby could not use a local repository (written
13
+ `local:/absolute/path`) even though the path is inside a trusted folder. One of
14
+ these is true:
15
+
16
+ - the path does not exist (it was moved or deleted);
17
+ - the path is not the top level of a git work tree (it is a subfolder of a
18
+ repository, a bare repository, or not a repository at all); or
19
+ - the wardby server's user cannot read the folder.
20
+
21
+ Local repositories need the wardby server to run on the same machine as the
22
+ folders, outside a container. A server in a container, a pod or on another
23
+ machine usually cannot see the trusted folder at all; it ignores that folder,
24
+ so the repository fails with
25
+ [`local_repo_not_allowed`](local-repo-not-allowed.md) instead.
26
+
27
+ ## What to do
28
+
29
+ 1. Check the path from the machine that runs the wardby server:
30
+ ```
31
+ git -C /path/to/repo rev-parse --show-toplevel
32
+ ```
33
+ The output must be the path you gave wardby (after symlinks). If it is a
34
+ parent folder, use that folder instead.
35
+ 2. Make sure the server's user can read the folder.
36
+ 3. Make sure the path you gave is the folder that holds `.git`, not a
37
+ subfolder.
38
+
39
+ Related: [Local git repositories](../local-repositories.md).
@@ -45,12 +45,13 @@ A coding agent's model is checked against the catalog only
45
45
  never look up a provider adapter at all, so a model can pass this check and
46
46
  still fail later for reasons `model_unavailable` never reports.
47
47
 
48
- One such failure has a specific name: dispatching a Claude Code run throws
49
- `coding_provider_not_configured:claude-code` when this deployment's
50
- `CODING_CLAUDE_WORKER_IMAGE` or `CODING_CLAUDE_TOOL_RUNNER_IMAGE` isn't set —
51
- it means the Claude Code worker or tool-runner image itself isn't configured,
52
- not a missing credential, and there is no equivalent error or string for
53
- Codex. See [Local coding-agent setup](../../docs/coding-agent-setup.md).
48
+ One such failure has a specific name: dispatching a coding run throws
49
+ `coding_provider_not_configured:codex` or
50
+ `coding_provider_not_configured:claude-code` when this deployment has no
51
+ worker images for that provider (`CODING_WORKER_IMAGE` for Codex;
52
+ `CODING_CLAUDE_WORKER_IMAGE` and `CODING_CLAUDE_TOOL_RUNNER_IMAGE` for Claude
53
+ Code). It means the images themselves aren't configured, not a missing
54
+ credential. See [Coding provider not configured](coding-provider-not-configured.md).
54
55
 
55
56
  A missing or invalid API key behind a coding run's model-provider credential
56
57
  (`CODING_OPENAI_CREDENTIAL_REF` for Codex, `CODING_ANTHROPIC_CREDENTIAL_REF`
@@ -0,0 +1,34 @@
1
+ ---
2
+ id: errors/vcs-github-not-configured
3
+ title: GitHub is not configured for coding agents
4
+ summary: A coding run used a GitHub repository, but the wardby server has no GitHub App credentials (GITHUB_APP_ID and GITHUB_APP_PRIVATE_KEY).
5
+ audience: operator
6
+ tags: [error, coding-agents, github, vcs, configuration, GITHUB_APP_ID, GITHUB_APP_PRIVATE_KEY]
7
+ appliesTo: ">=0.5.0"
8
+ ---
9
+
10
+ # GitHub is not configured for coding agents
11
+
12
+ `vcs_github_not_configured` means a coding run's repository is a GitHub
13
+ repository, but the wardby server was started without GitHub App credentials,
14
+ so it cannot clone the repository or push the result. The run's failure
15
+ category is `preflight`. Nothing is pushed.
16
+
17
+ The server starts without the credentials so that it can serve local git
18
+ repositories (`local:/absolute/path`) on its own. When neither GitHub App
19
+ credentials nor `LOCAL_REPO_ROOTS` are set, the server logs a warning at
20
+ startup that names both options.
21
+
22
+ ## What to do
23
+
24
+ Choose one:
25
+
26
+ 1. **Use GitHub.** Install a GitHub App on the repository, then set
27
+ `GITHUB_APP_ID` and `GITHUB_APP_PRIVATE_KEY` on the wardby server and restart
28
+ it. See [Connect GitHub repositories](../github.md).
29
+ 2. **Use a local repository.** If the code is in a git folder on the machine
30
+ that runs the wardby server, set `LOCAL_REPO_ROOTS` and point the agent's
31
+ `codingProfile.repository` at `local:/absolute/path`. See
32
+ [Local git repositories](../local-repositories.md).
33
+
34
+ Related: [Get started](../getting-started.md).