@wardby/cli 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (407) hide show
  1. package/.env.example +34 -4
  2. package/README.md +41 -4
  3. package/dist/claude-coding-worker/driver.d.ts +6 -1
  4. package/dist/claude-coding-worker/driver.js +27 -1
  5. package/dist/claude-coding-worker/main.js +2 -0
  6. package/dist/claude-coding-worker/tool-socket.d.ts +9 -0
  7. package/dist/claude-coding-worker/tool-socket.js +26 -0
  8. package/dist/cli-help.d.ts +1 -1
  9. package/dist/cli-help.js +13 -4
  10. package/dist/cli.d.ts +1 -1
  11. package/dist/cli.js +219 -29
  12. package/dist/coding/collect-exclude.d.ts +25 -0
  13. package/dist/coding/collect-exclude.js +76 -0
  14. package/dist/coding/profile.d.ts +67 -22
  15. package/dist/coding/profile.js +58 -25
  16. package/dist/coding/protected-path-wording.d.ts +24 -0
  17. package/dist/coding/protected-path-wording.js +55 -0
  18. package/dist/coding/protected-paths.d.ts +31 -0
  19. package/dist/coding/protected-paths.js +48 -0
  20. package/dist/coding/protocol.d.ts +75 -4
  21. package/dist/coding/protocol.js +107 -7
  22. package/dist/coding/registry/adapters.d.ts +2 -0
  23. package/dist/coding/registry/adapters.js +9 -0
  24. package/dist/coding/registry/allowlist.d.ts +9 -0
  25. package/dist/coding/registry/allowlist.js +28 -0
  26. package/dist/coding/registry/json-scan.d.ts +55 -0
  27. package/dist/coding/registry/json-scan.js +191 -0
  28. package/dist/coding/registry/lockfiles.d.ts +6 -0
  29. package/dist/coding/registry/lockfiles.js +89 -0
  30. package/dist/coding/registry/npm-lockfile.d.ts +9 -0
  31. package/dist/coding/registry/npm-lockfile.js +73 -0
  32. package/dist/coding/registry/npm-plan.d.ts +29 -0
  33. package/dist/coding/registry/npm-plan.js +289 -0
  34. package/dist/coding/registry/npm.d.ts +7 -0
  35. package/dist/coding/registry/npm.js +252 -0
  36. package/dist/coding/registry/pypi.d.ts +4 -0
  37. package/dist/coding/registry/pypi.js +210 -0
  38. package/dist/coding/registry/report.d.ts +37 -0
  39. package/dist/coding/registry/report.js +31 -0
  40. package/dist/coding/registry/token.d.ts +4 -0
  41. package/dist/coding/registry/token.js +7 -0
  42. package/dist/coding/registry/types.d.ts +286 -0
  43. package/dist/coding/registry/types.js +19 -0
  44. package/dist/coding/registry/worker-config.d.ts +14 -0
  45. package/dist/coding/registry/worker-config.js +31 -0
  46. package/dist/coding/services/builtins.d.ts +22 -0
  47. package/dist/coding/services/builtins.js +85 -0
  48. package/dist/coding/services/catalog.d.ts +443 -0
  49. package/dist/coding/services/catalog.js +159 -0
  50. package/dist/coding/services/declaration.d.ts +11 -0
  51. package/dist/coding/services/declaration.js +114 -0
  52. package/dist/coding/services/note.d.ts +8 -0
  53. package/dist/coding/services/note.js +15 -0
  54. package/dist/coding/services/resolve.d.ts +25 -0
  55. package/dist/coding/services/resolve.js +50 -0
  56. package/dist/coding/services/wording.d.ts +25 -0
  57. package/dist/coding/services/wording.js +70 -0
  58. package/dist/coding-proxy/main.js +24 -4
  59. package/dist/coding-worker/artifact.d.ts +6 -0
  60. package/dist/coding-worker/debug-trace.d.ts +37 -0
  61. package/dist/coding-worker/debug-trace.js +117 -0
  62. package/dist/coding-worker/driver.d.ts +13 -1
  63. package/dist/coding-worker/driver.js +102 -13
  64. package/dist/coding-worker/errors.js +8 -0
  65. package/dist/coding-worker/main.js +10 -2
  66. package/dist/coding-worker/sdk.d.ts +2 -2
  67. package/dist/coding-worker/sdk.js +7 -2
  68. package/dist/coding-worker/types.d.ts +3 -0
  69. package/dist/config/providers.d.ts +41 -0
  70. package/dist/config/providers.js +66 -0
  71. package/dist/core/budget-groups.d.ts +108 -5
  72. package/dist/core/budget-groups.js +125 -19
  73. package/dist/core/budget-wording.d.ts +22 -0
  74. package/dist/core/budget-wording.js +55 -0
  75. package/dist/core/datastores.js +18 -2
  76. package/dist/core/db.d.ts +5 -1
  77. package/dist/core/db.js +8 -2
  78. package/dist/core/dispatch.d.ts +33 -6
  79. package/dist/core/dispatch.js +260 -43
  80. package/dist/core/engine-native.js +27 -10
  81. package/dist/core/grants.d.ts +86 -0
  82. package/dist/core/grants.js +126 -0
  83. package/dist/core/host-events.d.ts +49 -0
  84. package/dist/core/host-events.js +257 -0
  85. package/dist/core/host-identity-links.d.ts +54 -0
  86. package/dist/core/host-identity-links.js +189 -0
  87. package/dist/core/host-status.d.ts +61 -0
  88. package/dist/core/host-status.js +211 -0
  89. package/dist/core/in-flight-runs.d.ts +8 -0
  90. package/dist/core/in-flight-runs.js +56 -0
  91. package/dist/core/provider-wording.d.ts +12 -0
  92. package/dist/core/provider-wording.js +44 -0
  93. package/dist/core/reconciler.d.ts +38 -2
  94. package/dist/core/reconciler.js +86 -2
  95. package/dist/core/repo-access.d.ts +99 -0
  96. package/dist/core/repo-access.js +136 -0
  97. package/dist/core/review-host-checks.d.ts +11 -0
  98. package/dist/core/review-host-checks.js +41 -0
  99. package/dist/core/review-host-tools.d.ts +47 -0
  100. package/dist/core/review-host-tools.js +347 -0
  101. package/dist/core/run-heartbeat.d.ts +27 -0
  102. package/dist/core/run-heartbeat.js +54 -0
  103. package/dist/core/runner.d.ts +30 -8
  104. package/dist/core/runner.js +237 -40
  105. package/dist/core/secrets.d.ts +11 -2
  106. package/dist/core/secrets.js +25 -6
  107. package/dist/core/subagent-memory-tools.d.ts +1 -1
  108. package/dist/core/subagent-memory-tools.js +16 -3
  109. package/dist/core/tool-admin.d.ts +81 -0
  110. package/dist/core/tool-admin.js +129 -0
  111. package/dist/core/tool-names.d.ts +42 -0
  112. package/dist/core/tool-names.js +64 -0
  113. package/dist/core/untrusted-content.d.ts +32 -0
  114. package/dist/core/untrusted-content.js +72 -0
  115. package/dist/core/webhooks.d.ts +8 -1
  116. package/dist/core/webhooks.js +23 -2
  117. package/dist/generated/prisma/browser.d.ts +100 -0
  118. package/dist/generated/prisma/client.d.ts +100 -0
  119. package/dist/generated/prisma/commonInputTypes.d.ts +30 -0
  120. package/dist/generated/prisma/enums.d.ts +6 -0
  121. package/dist/generated/prisma/enums.js +6 -1
  122. package/dist/generated/prisma/internal/class.d.ts +143 -0
  123. package/dist/generated/prisma/internal/class.js +4 -4
  124. package/dist/generated/prisma/internal/prismaNamespace.d.ts +1746 -577
  125. package/dist/generated/prisma/internal/prismaNamespace.js +179 -6
  126. package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +186 -0
  127. package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +179 -6
  128. package/dist/generated/prisma/models/Agent.d.ts +294 -1
  129. package/dist/generated/prisma/models/AgentRepository.d.ts +1425 -0
  130. package/dist/generated/prisma/models/AgentRepository.js +1 -0
  131. package/dist/generated/prisma/models/AgentTool.d.ts +95 -1
  132. package/dist/generated/prisma/models/AuthUser.d.ts +56 -1
  133. package/dist/generated/prisma/models/CodingAgentProfile.d.ts +258 -7
  134. package/dist/generated/prisma/models/CodingProxySession.d.ts +123 -2
  135. package/dist/generated/prisma/models/CodingRun.d.ts +1276 -95
  136. package/dist/generated/prisma/models/CodingService.d.ts +1348 -0
  137. package/dist/generated/prisma/models/CodingService.js +1 -0
  138. package/dist/generated/prisma/models/HostEventDelivery.d.ts +946 -0
  139. package/dist/generated/prisma/models/HostEventDelivery.js +1 -0
  140. package/dist/generated/prisma/models/HostIdentity.d.ts +1232 -0
  141. package/dist/generated/prisma/models/HostIdentity.js +1 -0
  142. package/dist/generated/prisma/models/HostIdentityLinkRequest.d.ts +1473 -0
  143. package/dist/generated/prisma/models/HostIdentityLinkRequest.js +1 -0
  144. package/dist/generated/prisma/models/Principal.d.ts +455 -0
  145. package/dist/generated/prisma/models/RegistryAllowance.d.ts +1148 -0
  146. package/dist/generated/prisma/models/RegistryAllowance.js +1 -0
  147. package/dist/generated/prisma/models/RegistryApprovedVersion.d.ts +1219 -0
  148. package/dist/generated/prisma/models/RegistryApprovedVersion.js +1 -0
  149. package/dist/generated/prisma/models/RegistryFetch.d.ts +1428 -0
  150. package/dist/generated/prisma/models/RegistryFetch.js +1 -0
  151. package/dist/generated/prisma/models/RegistryPlanRefusal.d.ts +1294 -0
  152. package/dist/generated/prisma/models/RegistryPlanRefusal.js +1 -0
  153. package/dist/generated/prisma/models/RegistryVersionFact.d.ts +1085 -0
  154. package/dist/generated/prisma/models/RegistryVersionFact.js +1 -0
  155. package/dist/generated/prisma/models/ResourceGrant.d.ts +1437 -0
  156. package/dist/generated/prisma/models/ResourceGrant.js +1 -0
  157. package/dist/generated/prisma/models/Run.d.ts +389 -1
  158. package/dist/generated/prisma/models/RunHostCheck.d.ts +1239 -0
  159. package/dist/generated/prisma/models/RunHostCheck.js +1 -0
  160. package/dist/generated/prisma/models/RunHostStatus.d.ts +1315 -0
  161. package/dist/generated/prisma/models/RunHostStatus.js +1 -0
  162. package/dist/generated/prisma/models/Tool.d.ts +15 -3
  163. package/dist/generated/prisma/models.d.ts +13 -0
  164. package/dist/help/build.d.ts +1 -0
  165. package/dist/help/build.js +9 -0
  166. package/dist/help/catalog.d.ts +24 -0
  167. package/dist/help/catalog.js +160 -0
  168. package/dist/help/cli.d.ts +2 -0
  169. package/dist/help/cli.js +65 -0
  170. package/dist/help/runtime.d.ts +3 -0
  171. package/dist/help/runtime.js +44 -0
  172. package/dist/help/search.d.ts +9 -0
  173. package/dist/help/search.js +104 -0
  174. package/dist/help-index.json +660 -0
  175. package/dist/import/cli-args.js +3 -2
  176. package/dist/import/create.d.ts +5 -0
  177. package/dist/import/create.js +67 -13
  178. package/dist/import/index.js +19 -9
  179. package/dist/import/neutral-schema.d.ts +11 -11
  180. package/dist/mcp/auth/access.d.ts +70 -0
  181. package/dist/mcp/auth/access.js +58 -0
  182. package/dist/mcp/auth/grants-cli.d.ts +149 -0
  183. package/dist/mcp/auth/grants-cli.js +518 -0
  184. package/dist/mcp/auth/host-account-cli.d.ts +2 -0
  185. package/dist/mcp/auth/host-account-cli.js +47 -0
  186. package/dist/mcp/auth/ownership.d.ts +26 -52
  187. package/dist/mcp/auth/ownership.js +19 -14
  188. package/dist/mcp/auth/repo-authorization.d.ts +22 -0
  189. package/dist/mcp/auth/repo-authorization.js +51 -0
  190. package/dist/mcp/auth/resource-server.d.ts +31 -2
  191. package/dist/mcp/auth/resource-server.js +84 -3
  192. package/dist/mcp/auth/self-hosted/browser.js +2 -2
  193. package/dist/mcp/auth/self-hosted/cli.js +47 -13
  194. package/dist/mcp/auth/self-hosted/credentials.d.ts +20 -2
  195. package/dist/mcp/auth/self-hosted/credentials.js +62 -4
  196. package/dist/mcp/auth/self-hosted/session.d.ts +2 -1
  197. package/dist/mcp/context.d.ts +27 -1
  198. package/dist/mcp/errors.d.ts +25 -6
  199. package/dist/mcp/errors.js +98 -0
  200. package/dist/mcp/host-events/github-ingress.d.ts +36 -0
  201. package/dist/mcp/host-events/github-ingress.js +92 -0
  202. package/dist/mcp/host-events/github-user-callback.d.ts +18 -0
  203. package/dist/mcp/host-events/github-user-callback.js +50 -0
  204. package/dist/mcp/index.d.ts +8 -1
  205. package/dist/mcp/index.js +106 -16
  206. package/dist/mcp/server.js +27 -9
  207. package/dist/mcp/tools/agents.js +446 -48
  208. package/dist/mcp/tools/budget-groups.js +3 -3
  209. package/dist/mcp/tools/datastore.js +22 -15
  210. package/dist/mcp/tools/grants.d.ts +2 -0
  211. package/dist/mcp/tools/grants.js +239 -0
  212. package/dist/mcp/tools/help.d.ts +5 -0
  213. package/dist/mcp/tools/help.js +67 -0
  214. package/dist/mcp/tools/host-accounts.d.ts +2 -0
  215. package/dist/mcp/tools/host-accounts.js +114 -0
  216. package/dist/mcp/tools/memory.d.ts +7 -1
  217. package/dist/mcp/tools/memory.js +5 -5
  218. package/dist/mcp/tools/repositories.d.ts +2 -0
  219. package/dist/mcp/tools/repositories.js +181 -0
  220. package/dist/mcp/tools/runs.d.ts +6 -0
  221. package/dist/mcp/tools/runs.js +60 -6
  222. package/dist/mcp/tools/scheduling.js +3 -6
  223. package/dist/mcp/tools/secrets.js +18 -6
  224. package/dist/mcp/tools/services.d.ts +2 -0
  225. package/dist/mcp/tools/services.js +222 -0
  226. package/dist/mcp/tools/subagents.js +52 -16
  227. package/dist/mcp/tools/tools.d.ts +41 -0
  228. package/dist/mcp/tools/tools.js +201 -40
  229. package/dist/mcp/tools/trigger.js +36 -6
  230. package/dist/mcp/tools/webhooks.js +15 -4
  231. package/dist/mcp/transport/streamable-http.d.ts +10 -0
  232. package/dist/mcp/transport/streamable-http.js +32 -2
  233. package/dist/providers/auth/delegating.d.ts +19 -0
  234. package/dist/providers/auth/delegating.js +71 -0
  235. package/dist/providers/auth/index.d.ts +2 -0
  236. package/dist/providers/auth/index.js +11 -0
  237. package/dist/providers/auth/self-hosted.d.ts +2 -1
  238. package/dist/providers/auth/self-hosted.js +16 -4
  239. package/dist/providers/auth/types.d.ts +6 -0
  240. package/dist/providers/coding-proxy/memory-ledger.d.ts +3 -0
  241. package/dist/providers/coding-proxy/memory-ledger.js +21 -2
  242. package/dist/providers/coding-proxy/metering.d.ts +4 -0
  243. package/dist/providers/coding-proxy/metering.js +28 -2
  244. package/dist/providers/coding-proxy/prisma-ledger.d.ts +17 -0
  245. package/dist/providers/coding-proxy/prisma-ledger.js +50 -5
  246. package/dist/providers/coding-proxy/proxy.d.ts +13 -0
  247. package/dist/providers/coding-proxy/proxy.js +479 -18
  248. package/dist/providers/coding-proxy/registry/audit.d.ts +131 -0
  249. package/dist/providers/coding-proxy/registry/audit.js +380 -0
  250. package/dist/providers/coding-proxy/registry/bounded-fetch.d.ts +16 -0
  251. package/dist/providers/coding-proxy/registry/bounded-fetch.js +77 -0
  252. package/dist/providers/coding-proxy/registry/plan.d.ts +58 -0
  253. package/dist/providers/coding-proxy/registry/plan.js +304 -0
  254. package/dist/providers/coding-proxy/registry/prisma-store.d.ts +34 -0
  255. package/dist/providers/coding-proxy/registry/prisma-store.js +151 -0
  256. package/dist/providers/coding-proxy/registry/service.d.ts +213 -0
  257. package/dist/providers/coding-proxy/registry/service.js +1137 -0
  258. package/dist/providers/coding-proxy/registry/store.d.ts +127 -0
  259. package/dist/providers/coding-proxy/registry/store.js +70 -0
  260. package/dist/providers/coding-proxy/runtime.d.ts +17 -0
  261. package/dist/providers/coding-proxy/runtime.js +63 -0
  262. package/dist/providers/coding-proxy/secure-fetch.js +0 -1
  263. package/dist/providers/coding-proxy/server.d.ts +11 -0
  264. package/dist/providers/coding-proxy/server.js +163 -0
  265. package/dist/providers/coding-proxy/types.d.ts +15 -0
  266. package/dist/providers/engine/types.d.ts +10 -0
  267. package/dist/providers/executor/build.d.ts +2 -2
  268. package/dist/providers/executor/composition.d.ts +3 -0
  269. package/dist/providers/executor/composition.js +19 -0
  270. package/dist/providers/executor/container.d.ts +105 -3
  271. package/dist/providers/executor/container.js +296 -20
  272. package/dist/providers/executor/dbos.d.ts +2 -3
  273. package/dist/providers/executor/in-process.d.ts +2 -3
  274. package/dist/providers/executor/routing.d.ts +7 -0
  275. package/dist/providers/executor/routing.js +13 -0
  276. package/dist/providers/executor/types.d.ts +22 -0
  277. package/dist/providers/jobs/claude-tool-setup.d.ts +23 -0
  278. package/dist/providers/jobs/claude-tool-setup.js +50 -0
  279. package/dist/providers/jobs/collect-prune.d.ts +7 -0
  280. package/dist/providers/jobs/collect-prune.js +27 -0
  281. package/dist/providers/jobs/docker-isolation.d.ts +48 -3
  282. package/dist/providers/jobs/docker-isolation.js +213 -22
  283. package/dist/providers/jobs/docker-services.d.ts +35 -0
  284. package/dist/providers/jobs/docker-services.js +191 -0
  285. package/dist/providers/jobs/docker.d.ts +49 -2
  286. package/dist/providers/jobs/docker.js +279 -32
  287. package/dist/providers/jobs/fake-kubernetes-api.d.ts +1 -0
  288. package/dist/providers/jobs/fake-kubernetes-api.js +12 -3
  289. package/dist/providers/jobs/kubernetes-isolation.d.ts +17 -2
  290. package/dist/providers/jobs/kubernetes-isolation.js +238 -57
  291. package/dist/providers/jobs/kubernetes-platform.d.ts +10 -4
  292. package/dist/providers/jobs/kubernetes-platform.js +11 -5
  293. package/dist/providers/jobs/kubernetes-preflight.js +3 -0
  294. package/dist/providers/jobs/kubernetes.d.ts +21 -2
  295. package/dist/providers/jobs/kubernetes.js +112 -21
  296. package/dist/providers/jobs/types.d.ts +18 -0
  297. package/dist/providers/llm/anthropic.js +6 -2
  298. package/dist/providers/llm/bedrock.js +2 -1
  299. package/dist/providers/llm/claude-messages.d.ts +5 -1
  300. package/dist/providers/llm/claude-messages.js +1 -0
  301. package/dist/providers/llm/claude-provider.d.ts +3 -1
  302. package/dist/providers/llm/claude-provider.js +5 -1
  303. package/dist/providers/llm/index.d.ts +1 -1
  304. package/dist/providers/llm/index.js +1 -1
  305. package/dist/providers/llm/pricing-anthropic.d.ts +10 -0
  306. package/dist/providers/llm/pricing-anthropic.js +32 -14
  307. package/dist/providers/llm/pricing-bedrock-claude.d.ts +8 -0
  308. package/dist/providers/llm/pricing-bedrock-claude.js +9 -0
  309. package/dist/providers/llm/routing.d.ts +10 -1
  310. package/dist/providers/llm/routing.js +18 -0
  311. package/dist/providers/llm/types.d.ts +12 -0
  312. package/dist/providers/llm/types.js +8 -1
  313. package/dist/providers/review-host/diff-lines.d.ts +16 -0
  314. package/dist/providers/review-host/diff-lines.js +59 -0
  315. package/dist/providers/review-host/github-events.d.ts +6 -0
  316. package/dist/providers/review-host/github-events.js +180 -0
  317. package/dist/providers/review-host/github-user-auth.d.ts +38 -0
  318. package/dist/providers/review-host/github-user-auth.js +128 -0
  319. package/dist/providers/review-host/github.d.ts +57 -0
  320. package/dist/providers/review-host/github.js +567 -0
  321. package/dist/providers/review-host/index.d.ts +12 -0
  322. package/dist/providers/review-host/index.js +30 -0
  323. package/dist/providers/review-host/review-format.d.ts +19 -0
  324. package/dist/providers/review-host/review-format.js +59 -0
  325. package/dist/providers/review-host/types.d.ts +284 -0
  326. package/dist/providers/review-host/types.js +24 -0
  327. package/dist/providers/vcs/git.d.ts +16 -6
  328. package/dist/providers/vcs/git.js +77 -13
  329. package/dist/providers/vcs/github.d.ts +74 -3
  330. package/dist/providers/vcs/github.js +195 -15
  331. package/dist/providers/vcs/types.d.ts +42 -4
  332. package/dist/quickstart/index.js +13 -2
  333. package/dist/sandbox/fetch-policy.d.ts +20 -2
  334. package/dist/sandbox/fetch-policy.js +64 -3
  335. package/dist/sandbox/host-functions.d.ts +9 -1
  336. package/dist/sandbox/host-functions.js +12 -5
  337. package/dist/serve.js +1 -1
  338. package/dist/wardby-bin.js +6 -0
  339. package/docs/README.md +30 -0
  340. package/docs/architecture-runtime.md +90 -0
  341. package/docs/assets/brand/wardby-icon-512.png +0 -0
  342. package/docs/assets/brand/wardby-icon.svg +16 -0
  343. package/docs/assets/brand/wardby-mascot-profile-512.png +0 -0
  344. package/docs/assets/brand/wardby-mascot.png +0 -0
  345. package/docs/assets/brand/wardby-mascot.svg +5 -0
  346. package/docs/assets/wardby-workflow.svg +106 -0
  347. package/docs/code-review-agents.md +481 -0
  348. package/docs/coding-agent-setup.md +172 -0
  349. package/docs/coding-packages.md +455 -0
  350. package/docs/coding-services.md +300 -0
  351. package/docs/coding-worker-byo-images.md +98 -0
  352. package/docs/coding-worker-isolation.md +1061 -0
  353. package/docs/getting-started-gke.md +615 -0
  354. package/docs/getting-started-identity-provider.md +308 -0
  355. package/docs/getting-started.md +133 -0
  356. package/docs/observability.md +53 -0
  357. package/docs/release-verification.md +66 -0
  358. package/docs/security-deployment.md +657 -0
  359. package/help/code-review-agents.md +31 -0
  360. package/help/coding-packages.md +31 -0
  361. package/help/coding-services.md +71 -0
  362. package/help/creating-agents.md +68 -0
  363. package/help/deploy-gke.md +39 -0
  364. package/help/deployment-targets.md +39 -0
  365. package/help/errors/budget-group-exhausted.md +25 -0
  366. package/help/errors/docker-isolation-unsupported.md +26 -0
  367. package/help/errors/protected-path.md +45 -0
  368. package/help/errors/repo-access.md +27 -0
  369. package/help/errors/service-declaration-invalid.md +27 -0
  370. package/help/errors/service-declaration-unavailable.md +25 -0
  371. package/help/errors/service-launcher-unsupported.md +30 -0
  372. package/help/errors/service-not-allowed.md +27 -0
  373. package/help/errors/service-unknown.md +23 -0
  374. package/help/errors/service-unready.md +49 -0
  375. package/help/getting-started.md +31 -0
  376. package/help/github.md +30 -0
  377. package/help/identity-and-access.md +39 -0
  378. package/help/mcp.md +30 -0
  379. package/help/native-capabilities.md +30 -0
  380. package/help/observability.md +41 -0
  381. package/help/operating-agents.md +30 -0
  382. package/help/security.md +27 -0
  383. package/help/troubleshooting/budgets.md +26 -0
  384. package/help/troubleshooting/coding-workers.md +47 -0
  385. package/help/troubleshooting/repository-access.md +27 -0
  386. package/package.json +12 -3
  387. package/prisma/migrations/20260925010000_coding_collect_exclude/migration.sql +8 -0
  388. package/prisma/migrations/20260925015000_allowed_egress_default/migration.sql +8 -0
  389. package/prisma/migrations/20260925020000_coding_package_registry/migration.sql +55 -0
  390. package/prisma/migrations/20260925030000_tool_name_per_owner/migration.sql +11 -0
  391. package/prisma/migrations/20260926010000_run_trigger_host_event/migration.sql +7 -0
  392. package/prisma/migrations/20260926020000_code_review_hosts/migration.sql +53 -0
  393. package/prisma/migrations/20260926030000_auth_user_roles/migration.sql +9 -0
  394. package/prisma/migrations/20260926040000_agent_effort/migration.sql +6 -0
  395. package/prisma/migrations/20260926050000_registry_lockfile_plan/migration.sql +32 -0
  396. package/prisma/migrations/20260926050000_repo_access_authorization/migration.sql +82 -0
  397. package/prisma/migrations/20260926060000_registry_plan_refusal/migration.sql +19 -0
  398. package/prisma/migrations/20260926100000_registry_plan_refusal_published_at/migration.sql +5 -0
  399. package/prisma/migrations/20260926190000_run_host_status/migration.sql +18 -0
  400. package/prisma/migrations/20260926210000_run_host_status_at_dispatch/migration.sql +5 -0
  401. package/prisma/migrations/20260927010000_resource_grants/migration.sql +72 -0
  402. package/prisma/migrations/20260927020000_proxy_session_budget_exhausted/migration.sql +3 -0
  403. package/prisma/migrations/20260927030000_coding_debug_trace/migration.sql +4 -0
  404. package/prisma/migrations/20260927040000_proxy_session_upstream_failure/migration.sql +3 -0
  405. package/prisma/migrations/20260927050000_coding_run_services/migration.sql +74 -0
  406. package/prisma/migrations/20260928000000_coding_run_tool_image/migration.sql +5 -0
  407. package/prisma/schema.prisma +407 -21
@@ -0,0 +1,660 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "pages": [
4
+ {
5
+ "id": "code-review-agents",
6
+ "title": "Run GitHub code-review agents",
7
+ "summary": "Link a read-only review agent to a repository for pull-request checks and trusted mention workflows.",
8
+ "audience": "operator",
9
+ "tags": [
10
+ "github",
11
+ "code-review",
12
+ "pull-requests",
13
+ "webhooks"
14
+ ],
15
+ "appliesTo": ">=0.2.1",
16
+ "sourcePath": "code-review-agents.md",
17
+ "markdown": "\n# Run GitHub code-review agents\n\nA native agent linked through Wardby's GitHub App can review pull requests\nwithout receiving repository credentials. On pull-request pushes it creates an\nin-progress check, reads the diff, then posts inline findings, one updated\nsummary comment, and a final approve, changes-requested, or comment result.\nBudget exhaustion or another failed review makes the check fail rather than\nsilently pass branch protection.\n\nPeople with write access to the repository may request another review with\n`@<app-slug> review`. Other mentions can be routed to a dedicated mention\nagent, which acknowledges the request and posts its final outcome. Do not give\na mention agent instructions that could echo secrets or internal details: its\nreply is visible wherever the mention was posted.\n\nWardby skips pull requests whose head is in a fork. It also ignores mentions\nfrom bots and people without write access. Repository links require the\nagent owner's linked GitHub access, or an explicitly recorded administrator\napproval.\n\nFor App permissions, webhook setup, trigger configuration, and security\ndetails, follow [`docs/code-review-agents.md`](../docs/code-review-agents.md).\n",
18
+ "plainText": "Run GitHub code-review agents A native agent linked through Wardby's GitHub App can review pull requests without receiving repository credentials. On pull-request pushes it creates an in-progress check, reads the diff, then posts inline findings, one updated summary comment, and a final approve, changes-requested, or comment result. Budget exhaustion or another failed review makes the check fail rather than silently pass branch protection. People with write access to the repository may request another review with @<app-slug review. Other mentions can be routed to a dedicated mention agent, which acknowledges the request and posts its final outcome. Do not give a mention agent instructions that could echo secrets or internal details: its reply is visible wherever the mention was posted. Wardby skips pull requests whose head is in a fork. It also ignores mentions from bots and people without write access. Repository links require the agent owner's linked GitHub access, or an explicitly recorded administrator approval. For App permissions, webhook setup, trigger configuration, and security details, follow docs/code-review-agents.md.",
19
+ "headings": [
20
+ {
21
+ "level": 1,
22
+ "text": "Run GitHub code-review agents",
23
+ "slug": "run-github-code-review-agents"
24
+ }
25
+ ]
26
+ },
27
+ {
28
+ "id": "coding-packages",
29
+ "title": "Approve packages for coding agents",
30
+ "summary": "Let Codex coding workers install vetted npm and PyPI dependencies through Wardby's registry proxy.",
31
+ "audience": "operator",
32
+ "tags": [
33
+ "coding-agents",
34
+ "packages",
35
+ "npm",
36
+ "pypi",
37
+ "supply-chain"
38
+ ],
39
+ "appliesTo": ">=0.2.1",
40
+ "sourcePath": "coding-packages.md",
41
+ "markdown": "\n# Approve packages for coding agents\n\nCoding workers have no direct registry network access. For **Codex** workers,\nWardby's registry proxy can allow `npm install` and `pip install` from a\nper-agent npm or PyPI allowlist. The proxy records what was fetched and applies\nsupply-chain checks, including package graph validation, release-age policy,\nand vulnerability filtering.\n\nAn empty allowlist keeps registry mode off. Approve only top-level packages;\nWardby validates and permits the required transitive dependency graph for the\nrun. Changing a package allowlist or policy needs `packages:approve` (or\n`agents:admin`) and a Wardby `admin` or `package-approver` role.\n\nRegistry mode works for Codex and Claude Code runs alike, on the `node`\ntoolchain (npm) and the `node-python` toolchain (npm and pip). Claude Code runs\nits shell commands in a separate, credential-free tool-runner container that\nreaches the registry through the run's proxy network. Use a pinned custom\nworker image when an agent needs system packages, another runtime, or\ndependencies that should be baked into the image.\n\nRead [`docs/coding-packages.md`](../docs/coding-packages.md) for allowlist\nsyntax, package-policy controls, lockfile behavior, and refusal errors.\n",
42
+ "plainText": "Approve packages for coding agents Coding workers have no direct registry network access. For Codex workers, Wardby's registry proxy can allow npm install and pip install from a per-agent npm or PyPI allowlist. The proxy records what was fetched and applies supply-chain checks, including package graph validation, release-age policy, and vulnerability filtering. An empty allowlist keeps registry mode off. Approve only top-level packages; Wardby validates and permits the required transitive dependency graph for the run. Changing a package allowlist or policy needs packages:approve (or agents:admin) and a Wardby admin or package-approver role. Registry mode works for Codex and Claude Code runs alike, on the node toolchain (npm) and the node-python toolchain (npm and pip). Claude Code runs its shell commands in a separate, credential-free tool-runner container that reaches the registry through the run's proxy network. Use a pinned custom worker image when an agent needs system packages, another runtime, or dependencies that should be baked into the image. Read docs/coding-packages.md for allowlist syntax, package-policy controls, lockfile behavior, and refusal errors.",
43
+ "headings": [
44
+ {
45
+ "level": 1,
46
+ "text": "Approve packages for coding agents",
47
+ "slug": "approve-packages-for-coding-agents"
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ "id": "coding-services",
53
+ "title": "Give coding runs the services their tests need",
54
+ "summary": "Let coding runs on the Kubernetes or Docker launcher start fresh PostgreSQL, Redis or MySQL instances declared in the repository's .wardby/services.yaml.",
55
+ "audience": "operator",
56
+ "tags": [
57
+ "coding-agents",
58
+ "services",
59
+ "postgres",
60
+ "redis",
61
+ "mysql",
62
+ "kubernetes",
63
+ "docker"
64
+ ],
65
+ "appliesTo": ">=0.2.1",
66
+ "sourcePath": "coding-services.md",
67
+ "markdown": "\n# Give coding runs the services their tests need\n\nA coding run can have a PostgreSQL, Redis or MySQL instance next to it for the\nlength of the run. Three parties agree before a service starts:\n\n- **The repository** declares it in `.wardby/services.yaml` on its base branch,\n for example `services: { postgres: \"16\" }`. Wardby reads the file from the\n run's base branch (the agent's `baseRef`, or a `baseRef` given to\n `trigger_agent` for that run), never from the run's own branch, so a change\n to the declaration takes effect only once it is merged into that base.\n- **The service catalog** says what each name and version is: a digest-pinned\n image, its readiness check, resources, and the variables the agent's shells\n receive (`testEnv`, such as `DATABASE_URL`). `list_services` and\n `get_service` need `agents:read`. `create_service`, `update_service` and\n `delete_service` need `services:manage` and the `admin` or\n `service-manager` role. Built-in entries (`postgres` 15, 16 and 17, `redis`\n 7, `mysql` 8) cannot be changed over MCP.\n- **The agent's owner** lists the catalog names its runs may use in\n `codingProfile.services`. An empty list, the default, allows none.\n\nAn agent with an empty list never reads the repository's declaration at all —\nwardby only looks at `.wardby/services.yaml` for an agent that allows at least\none service. Such an agent's runs simply start without services, whatever a\nrepository declares, and none of the errors below can apply to them.\n\nServices need the Kubernetes job launcher with Kubernetes 1.29 or later (each\nservice runs as a native sidecar in the run's pod) or the Docker job launcher\n(each service runs as its own container sharing the run's network namespace);\nboth start them for Codex and Claude Code agents. Each run gets its own empty\ninstance, reachable on `127.0.0.1`; the run's sandbox and network policy do\nnot change, and the instance is deleted with the run. Each service's CPU,\nmemory and disk count toward the run: on Kubernetes toward its pod, namespace\nquota and what a managed cluster bills; on Docker toward the host's memory,\nbecause its data is kept in memory.\n\nA bring-your-own worker image\n([`docs/coding-worker-byo-images.md`](../docs/coding-worker-byo-images.md))\nneeds driver v11 or later to run with services.\n\nCatalog values are visible to anyone with `agents:read`. Use throwaway test\ncredentials only; never put a real secret in `serviceEnv` or `testEnv`.\n\nEvery run protects `.wardby/**` except `.wardby/services.yaml`, so a coding\nagent may propose a declaration change in its pull request but cannot change\nother `.wardby/` files. An agent's own `protectedPaths` exceptions (entries\nstarting with `!`) must be literal file paths and cannot unprotect `.wardby/`.\n\nWhen upgrading a deployment that delegates to an identity provider, define the\n`services:manage` scope in the provider first; see\n[Configure identity and privileged access](identity-and-access.md).\n\nIf a run is refused or fails over its services, read the page for its code:\n\n- [`service_declaration_invalid`](errors/service-declaration-invalid.md)\n- [`service_declaration_unavailable`](errors/service-declaration-unavailable.md)\n- [`service_unknown`](errors/service-unknown.md)\n- [`service_not_allowed`](errors/service-not-allowed.md)\n- [`service_launcher_unsupported`](errors/service-launcher-unsupported.md)\n- [`service_unready`](errors/service-unready.md)\n\nRead [`docs/coding-services.md`](../docs/coding-services.md) for the file\nformat, catalog fields, built-in variables, custom entries, and capacity.\n",
68
+ "plainText": "Give coding runs the services their tests need A coding run can have a PostgreSQL, Redis or MySQL instance next to it for the length of the run. Three parties agree before a service starts: The repository declares it in .wardby/services.yaml on its base branch, for example services: { postgres: \"16\" }. Wardby reads the file from the run's base branch (the agent's baseRef, or a baseRef given to triggeragent for that run), never from the run's own branch, so a change to the declaration takes effect only once it is merged into that base. The service catalog says what each name and version is: a digest-pinned image, its readiness check, resources, and the variables the agent's shells receive (testEnv, such as DATABASEURL). listservices and getservice need agents:read. createservice, updateservice and deleteservice need services:manage and the admin or service-manager role. Built-in entries (postgres 15, 16 and 17, redis 7, mysql 8) cannot be changed over MCP. The agent's owner lists the catalog names its runs may use in codingProfile.services. An empty list, the default, allows none. An agent with an empty list never reads the repository's declaration at all — wardby only looks at .wardby/services.yaml for an agent that allows at least one service. Such an agent's runs simply start without services, whatever a repository declares, and none of the errors below can apply to them. Services need the Kubernetes job launcher with Kubernetes 1.29 or later (each service runs as a native sidecar in the run's pod) or the Docker job launcher (each service runs as its own container sharing the run's network namespace); both start them for Codex and Claude Code agents. Each run gets its own empty instance, reachable on 127.0.0.1; the run's sandbox and network policy do not change, and the instance is deleted with the run. Each service's CPU, memory and disk count toward the run: on Kubernetes toward its pod, namespace quota and what a managed cluster bills; on Docker toward the host's memory, because its data is kept in memory. A bring-your-own worker image (docs/coding-worker-byo-images.md) needs driver v11 or later to run with services. Catalog values are visible to anyone with agents:read. Use throwaway test credentials only; never put a real secret in serviceEnv or testEnv. Every run protects .wardby/ except .wardby/services.yaml, so a coding agent may propose a declaration change in its pull request but cannot change other .wardby/ files. An agent's own protectedPaths exceptions (entries starting with !) must be literal file paths and cannot unprotect .wardby/. When upgrading a deployment that delegates to an identity provider, define the services:manage scope in the provider first; see Configure identity and privileged access. If a run is refused or fails over its services, read the page for its code: servicedeclarationinvalid servicedeclarationunavailable serviceunknown servicenotallowed servicelauncherunsupported serviceunready Read docs/coding-services.md for the file format, catalog fields, built-in variables, custom entries, and capacity.",
69
+ "headings": [
70
+ {
71
+ "level": 1,
72
+ "text": "Give coding runs the services their tests need",
73
+ "slug": "give-coding-runs-the-services-their-tests-need"
74
+ }
75
+ ]
76
+ },
77
+ {
78
+ "id": "creating-agents",
79
+ "title": "Choose a native or coding agent",
80
+ "summary": "Decide whether a task should run as a native Wardby agent or an isolated Codex or Claude Code coding agent.",
81
+ "audience": "developer",
82
+ "tags": [
83
+ "agents",
84
+ "native-agents",
85
+ "coding-agents",
86
+ "codex",
87
+ "claude-code"
88
+ ],
89
+ "appliesTo": ">=0.2.1",
90
+ "sourcePath": "creating-agents.md",
91
+ "markdown": "\n# Choose a native or coding agent\n\nCreate a **native agent** when Wardby should run a model with explicit,\nattached capabilities to produce a bounded operational result. Create a\n**coding agent** when the task must inspect and change a Git repository, run\nproject checks, and optionally open a draft pull request.\n\n| Choose | Best for | Execution model | Typical result |\n| ------------ | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ |\n| Native agent | Review, triage, analysis, reporting, workflow coordination, and API-backed tasks | Wardby's managed native run loop with only its attached tools, secrets, datastores, and sub-agents | A structured result, report, decision, or bounded follow-up action |\n| Coding agent | Repository changes, tests, dependency updates, implementation work, and PR revisions | An isolated Codex or Claude Code worker with a trusted proxy and Git finalization | No changes, a bounded result, or one controlled draft pull request |\n\n## Start with a native agent\n\nNative agents are the default when a task does not need a full repository\nworkspace. Give the agent a narrow purpose, model, per-run budget, and only the\ntools or data it needs. Attach schedules or webhooks when the work should run\nwithout a person starting it manually.\n\nExamples include an architecture reviewer that writes findings to a datastore,\na release monitor that investigates an alert, or a triage agent that turns\nincoming information into a report for a person to act on.\n\n## Use a coding agent for repository work\n\nCoding agents use a `codingProfile` that selects Codex or Claude Code and names\nthe authorized repository. They run in isolated workers; Wardby keeps provider\ncredentials and the GitHub App private key in trusted components. A coding run\ncan change a checkout and run approved checks, but trusted finalization is what\nvalidates the result, pushes a controlled branch, and opens a draft pull\nrequest. It never auto-merges.\n\nBefore creating one, configure immutable worker images, the selected launcher,\nthe trusted coding proxy, and a narrowly installed GitHub App. The agent owner\nmust have the required repository access, or an administrator must explicitly\napprove the repository.\n\n## Decision checklist\n\nChoose a native agent when all of these are true:\n\n- The task can be completed with a narrow set of attached tools or data.\n- A repository checkout, shell-based project setup, and code changes are not\n required.\n- The intended output is an analysis, report, decision, or controlled API\n action.\n\nChoose a coding agent when any of these are true:\n\n- The agent must edit a repository or execute the project's test suite.\n- The reviewable outcome should be a branch or draft pull request.\n- The task needs a coding-agent builder such as Codex or Claude Code inside an\n isolated workspace.\n\nDo not use a coding agent merely because a task is complex. Start with the\nleast powerful execution model that can safely produce the required outcome.\nRead [Connect GitHub repositories](github.md) and\n[Troubleshoot coding workers](troubleshooting/coding-workers.md) before\nenabling repository-changing work.\n",
92
+ "plainText": "Choose a native or coding agent Create a native agent when Wardby should run a model with explicit, attached capabilities to produce a bounded operational result. Create a coding agent when the task must inspect and change a Git repository, run project checks, and optionally open a draft pull request. | Choose | Best for | Execution model | Typical result | | ------------ | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | | Native agent | Review, triage, analysis, reporting, workflow coordination, and API-backed tasks | Wardby's managed native run loop with only its attached tools, secrets, datastores, and sub-agents | A structured result, report, decision, or bounded follow-up action | | Coding agent | Repository changes, tests, dependency updates, implementation work, and PR revisions | An isolated Codex or Claude Code worker with a trusted proxy and Git finalization | No changes, a bounded result, or one controlled draft pull request | Start with a native agent Native agents are the default when a task does not need a full repository workspace. Give the agent a narrow purpose, model, per-run budget, and only the tools or data it needs. Attach schedules or webhooks when the work should run without a person starting it manually. Examples include an architecture reviewer that writes findings to a datastore, a release monitor that investigates an alert, or a triage agent that turns incoming information into a report for a person to act on. Use a coding agent for repository work Coding agents use a codingProfile that selects Codex or Claude Code and names the authorized repository. They run in isolated workers; Wardby keeps provider credentials and the GitHub App private key in trusted components. A coding run can change a checkout and run approved checks, but trusted finalization is what validates the result, pushes a controlled branch, and opens a draft pull request. It never auto-merges. Before creating one, configure immutable worker images, the selected launcher, the trusted coding proxy, and a narrowly installed GitHub App. The agent owner must have the required repository access, or an administrator must explicitly approve the repository. Decision checklist Choose a native agent when all of these are true: The task can be completed with a narrow set of attached tools or data. A repository checkout, shell-based project setup, and code changes are not required. The intended output is an analysis, report, decision, or controlled API action. Choose a coding agent when any of these are true: The agent must edit a repository or execute the project's test suite. The reviewable outcome should be a branch or draft pull request. The task needs a coding-agent builder such as Codex or Claude Code inside an isolated workspace. Do not use a coding agent merely because a task is complex. Start with the least powerful execution model that can safely produce the required outcome. Read Connect GitHub repositories and Troubleshoot coding workers before enabling repository-changing work.",
93
+ "headings": [
94
+ {
95
+ "level": 1,
96
+ "text": "Choose a native or coding agent",
97
+ "slug": "choose-a-native-or-coding-agent"
98
+ },
99
+ {
100
+ "level": 2,
101
+ "text": "Start with a native agent",
102
+ "slug": "start-with-a-native-agent"
103
+ },
104
+ {
105
+ "level": 2,
106
+ "text": "Use a coding agent for repository work",
107
+ "slug": "use-a-coding-agent-for-repository-work"
108
+ },
109
+ {
110
+ "level": 2,
111
+ "text": "Decision checklist",
112
+ "slug": "decision-checklist"
113
+ }
114
+ ]
115
+ },
116
+ {
117
+ "id": "deploy-gke",
118
+ "title": "Deploy Wardby on GKE Autopilot",
119
+ "summary": "Use the supported Google Cloud path for a private database, isolated coding workers, and HTTPS ingress.",
120
+ "audience": "operator",
121
+ "tags": [
122
+ "deployment",
123
+ "gke",
124
+ "gcp",
125
+ "kubernetes",
126
+ "production"
127
+ ],
128
+ "appliesTo": ">=0.2.1",
129
+ "sourcePath": "deploy-gke.md",
130
+ "markdown": "\n# Deploy Wardby on GKE Autopilot\n\nThe supported Google Cloud deployment creates a GKE Autopilot cluster, private\nCloud SQL for PostgreSQL, Artifact Registry, HTTPS Gateway, Google Secret\nManager synchronization, and isolated gVisor-backed **Codex** coding-worker\npods. It also applies namespace RBAC and default-deny network policies.\n\nUse a dedicated billed project, a hostname you control, remote Terraform state,\nand a GitHub App installed only on repositories that agents need. Review\nTerraform's plan and set cloud budgets before applying it: the deployment\ncreates billable resources.\n\nThe deployment process is:\n\n1. Install `gcloud`, Terraform, Docker with `linux/amd64` support, `kubectl`,\n Helm, Node.js 24, and authenticate to the target project.\n2. Configure `deploy/gke/terraform.tfvars`, apply Terraform, and prepare the\n Gateway's address, certificate map, Cloud Armor policy, and DNS record.\n3. Put first-time values in an untracked `.env.local`; `deploy/gke/up.sh`\n seeds Secret Manager without overwriting existing production values.\n4. Run `HOSTNAME=wardby.example.com deploy/gke/up.sh`, then verify DNS,\n certificate issuance, database IAM bootstrap, and service health.\n\nClaude Code's two-container executor is currently Docker-only; Kubernetes\ncoding workers use the Codex path. Configure an identity provider and GitHub\nApp before allowing people to use the public endpoint.\n\nFollow the complete, ordered guide at\n[`docs/getting-started-gke.md`](../docs/getting-started-gke.md). It includes\nthe precise IAM, DNS, bootstrap, upgrades, and teardown steps.\n",
131
+ "plainText": "Deploy Wardby on GKE Autopilot The supported Google Cloud deployment creates a GKE Autopilot cluster, private Cloud SQL for PostgreSQL, Artifact Registry, HTTPS Gateway, Google Secret Manager synchronization, and isolated gVisor-backed Codex coding-worker pods. It also applies namespace RBAC and default-deny network policies. Use a dedicated billed project, a hostname you control, remote Terraform state, and a GitHub App installed only on repositories that agents need. Review Terraform's plan and set cloud budgets before applying it: the deployment creates billable resources. The deployment process is: Install gcloud, Terraform, Docker with linux/amd64 support, kubectl, Helm, Node.js 24, and authenticate to the target project. Configure deploy/gke/terraform.tfvars, apply Terraform, and prepare the Gateway's address, certificate map, Cloud Armor policy, and DNS record. Put first-time values in an untracked .env.local; deploy/gke/up.sh seeds Secret Manager without overwriting existing production values. Run HOSTNAME=wardby.example.com deploy/gke/up.sh, then verify DNS, certificate issuance, database IAM bootstrap, and service health. Claude Code's two-container executor is currently Docker-only; Kubernetes coding workers use the Codex path. Configure an identity provider and GitHub App before allowing people to use the public endpoint. Follow the complete, ordered guide at docs/getting-started-gke.md. It includes the precise IAM, DNS, bootstrap, upgrades, and teardown steps.",
132
+ "headings": [
133
+ {
134
+ "level": 1,
135
+ "text": "Deploy Wardby on GKE Autopilot",
136
+ "slug": "deploy-wardby-on-gke-autopilot"
137
+ }
138
+ ]
139
+ },
140
+ {
141
+ "id": "deployment-targets",
142
+ "title": "Choose a deployment target",
143
+ "summary": "Pick the supported Wardby deployment path and understand its operational boundary.",
144
+ "audience": "operator",
145
+ "tags": [
146
+ "deployment",
147
+ "docker",
148
+ "gke",
149
+ "aws",
150
+ "production"
151
+ ],
152
+ "appliesTo": ">=0.2.1",
153
+ "sourcePath": "deployment-targets.md",
154
+ "markdown": "\n# Choose a deployment target\n\nWardby has one local path and two production-ready deployment shapes:\n\n- **Local development:** `wardby quickstart` runs the control plane locally\n with its portable PostgreSQL container. It is the best place to evaluate,\n develop agents, and connect a local Codex or Claude Code client.\n- **Production container baseline:** run the published production image with\n PostgreSQL, HTTPS ingress, durable storage, backups, and an operator-owned\n identity provider. The Compose and Caddy configuration is a reference\n baseline, not a managed platform.\n- **Google Kubernetes Engine Autopilot:** the supported Google Cloud path. It\n provisions GKE, private-IP Cloud SQL, Artifact Registry, isolated Codex\n workers, HTTPS Gateway, and GCP-native secret and network controls. See\n [Deploy on GKE](deploy-gke.md).\n\nAWS is supported as a portable runtime target and has a Bedrock Claude adapter,\nbut Wardby does not ship a native AWS deployment module. Other cloud providers\ncan run the production container image with equivalent database, ingress,\nidentity, secret, isolation, and observability controls; that infrastructure is\noperator-owned.\n\nThe older `deploy/gcp` Cloud Run module is deprecated. Do not choose it for a\nnew installation.\n\nBefore going live, complete the deployment security checklist and make a\nbackup, upgrades, alerting, and incident-response plan. Read\n[`docs/getting-started.md`](../docs/getting-started.md) for the local and\ncontainer setup, and [`docs/security-deployment.md`](../docs/security-deployment.md)\nfor the production controls.\n",
155
+ "plainText": "Choose a deployment target Wardby has one local path and two production-ready deployment shapes: Local development: wardby quickstart runs the control plane locally with its portable PostgreSQL container. It is the best place to evaluate, develop agents, and connect a local Codex or Claude Code client. Production container baseline: run the published production image with PostgreSQL, HTTPS ingress, durable storage, backups, and an operator-owned identity provider. The Compose and Caddy configuration is a reference baseline, not a managed platform. Google Kubernetes Engine Autopilot: the supported Google Cloud path. It provisions GKE, private-IP Cloud SQL, Artifact Registry, isolated Codex workers, HTTPS Gateway, and GCP-native secret and network controls. See Deploy on GKE. AWS is supported as a portable runtime target and has a Bedrock Claude adapter, but Wardby does not ship a native AWS deployment module. Other cloud providers can run the production container image with equivalent database, ingress, identity, secret, isolation, and observability controls; that infrastructure is operator-owned. The older deploy/gcp Cloud Run module is deprecated. Do not choose it for a new installation. Before going live, complete the deployment security checklist and make a backup, upgrades, alerting, and incident-response plan. Read docs/getting-started.md for the local and container setup, and docs/security-deployment.md for the production controls.",
156
+ "headings": [
157
+ {
158
+ "level": 1,
159
+ "text": "Choose a deployment target",
160
+ "slug": "choose-a-deployment-target"
161
+ }
162
+ ]
163
+ },
164
+ {
165
+ "id": "errors/budget-group-exhausted",
166
+ "title": "Budget group exhausted",
167
+ "summary": "Wardby refused the run because the shared budget group has no remaining capacity for the period.",
168
+ "audience": "operator",
169
+ "tags": [
170
+ "error",
171
+ "budget",
172
+ "refusal"
173
+ ],
174
+ "appliesTo": ">=0.2.1",
175
+ "sourcePath": "errors/budget-group-exhausted.md",
176
+ "markdown": "\n# Budget group exhausted\n\nAn error such as `budget_group_exhausted:week` means the agent's budget group\nhas no capacity left for that period after accounting for actual spending and\nactive reservations. Wardby refuses the run before model work or a coding\nworker begins.\n\n1. Inspect the budget group's `spentUsd` and `reservedUsd` values.\n2. Inspect active and recent runs that use the group.\n3. Wait for the period to reset, cancel unneeded active work, or deliberately\n adjust the agent or group budget.\n4. Trigger a new run after capacity is available; a refused run is not resumed\n automatically.\n\nDo not raise a limit merely to clear a refusal without confirming the intended\nowner, schedule, and overlapping work. See [Budget troubleshooting](../troubleshooting/budgets.md).\n",
177
+ "plainText": "Budget group exhausted An error such as budgetgroupexhausted:week means the agent's budget group has no capacity left for that period after accounting for actual spending and active reservations. Wardby refuses the run before model work or a coding worker begins. Inspect the budget group's spentUsd and reservedUsd values. Inspect active and recent runs that use the group. Wait for the period to reset, cancel unneeded active work, or deliberately adjust the agent or group budget. Trigger a new run after capacity is available; a refused run is not resumed automatically. Do not raise a limit merely to clear a refusal without confirming the intended owner, schedule, and overlapping work. See Budget troubleshooting.",
178
+ "headings": [
179
+ {
180
+ "level": 1,
181
+ "text": "Budget group exhausted",
182
+ "slug": "budget-group-exhausted"
183
+ }
184
+ ]
185
+ },
186
+ {
187
+ "id": "errors/docker-isolation-unsupported",
188
+ "title": "Coding-worker isolation unavailable",
189
+ "summary": "Wardby refused to launch a coding worker because it could not verify the required isolation controls.",
190
+ "audience": "operator",
191
+ "tags": [
192
+ "error",
193
+ "coding-agents",
194
+ "docker",
195
+ "isolation"
196
+ ],
197
+ "appliesTo": ">=0.2.1",
198
+ "sourcePath": "errors/docker-isolation-unsupported.md",
199
+ "markdown": "\n# Coding-worker isolation unavailable\n\n`docker_isolation_unsupported` means a required worker-isolation guarantee was\nmissing, unexpected, or could not be inspected. Wardby fails closed rather than\nrunning a worker with a weaker profile.\n\n1. Run `wardby coding preflight` and correct the reported launcher, image,\n proxy-network, or host-support issue.\n2. Confirm worker images are immutable image IDs or digests, not mutable tags.\n3. Confirm the trusted proxy and worker use the intended isolated network and\n that no unapproved host mount, Docker socket, environment, or network path\n is present.\n4. Re-run preflight before triggering another coding run.\n\nIf the deployment target does not support the selected coding provider, choose\na supported launcher/provider combination instead of disabling the controls.\nSee [Coding-worker troubleshooting](../troubleshooting/coding-workers.md).\n",
200
+ "plainText": "Coding-worker isolation unavailable dockerisolationunsupported means a required worker-isolation guarantee was missing, unexpected, or could not be inspected. Wardby fails closed rather than running a worker with a weaker profile. Run wardby coding preflight and correct the reported launcher, image, proxy-network, or host-support issue. Confirm worker images are immutable image IDs or digests, not mutable tags. Confirm the trusted proxy and worker use the intended isolated network and that no unapproved host mount, Docker socket, environment, or network path is present. Re-run preflight before triggering another coding run. If the deployment target does not support the selected coding provider, choose a supported launcher/provider combination instead of disabling the controls. See Coding-worker troubleshooting.",
201
+ "headings": [
202
+ {
203
+ "level": 1,
204
+ "text": "Coding-worker isolation unavailable",
205
+ "slug": "coding-worker-isolation-unavailable"
206
+ }
207
+ ]
208
+ },
209
+ {
210
+ "id": "errors/protected-path",
211
+ "title": "Run changed a protected path",
212
+ "summary": "A coding run's changes touched a path this agent may not edit, so none of its changes were kept.",
213
+ "audience": "operator",
214
+ "tags": [
215
+ "error",
216
+ "coding-agents",
217
+ "vcs"
218
+ ],
219
+ "appliesTo": ">=0.2.1",
220
+ "sourcePath": "errors/protected-path.md",
221
+ "markdown": "\n# Run changed a protected path\n\nA run that failed with category `protected_path` finished its work, but the\nchanges it collected included a file its agent is not allowed to edit. Wardby\ndiscards the run's changes entirely rather than dropping just that file:\nnothing from the run reaches a pull request.\n\nWardby protects two kinds of paths on every coding run:\n\n- **The agent's own `protectedPaths`**, a list of glob patterns set on the\n agent (`codingProfile.protectedPaths`, via `create_agent`/`update_agent`).\n An entry may start with `!` to carve out one literal file as an exception\n to the agent's own patterns; a whole tree can never be carved out this way.\n- **The `.wardby/` baseline**, which every coding run gets regardless of the\n agent's own settings. It protects everything under `.wardby/` except the one\n literal file `.wardby/services.yaml`, which any coding agent may propose a\n change to (see [Coding services](../coding-services.md)) — the baseline\n cannot be widened to cover that file, and no exception can narrow it further\n than that.\n\nWhat to do:\n\n1. Ask again without changing the named file. If the change is small, doing it\n yourself and letting the agent build on top is often fastest.\n2. If the agent genuinely needs to change that file, its owner (or an admin)\n can widen `codingProfile.protectedPaths` with `update_agent` — for example\n adding a `!`-prefixed exception for one file. This can never remove the\n `.wardby/` baseline itself.\n3. Otherwise, the repository owner makes the change directly and the agent\n works around it on the next run.\n\nWhen this run is a sub-run another agent dispatched (for example a router\nhanding work to a coding agent), the parent sees a failed sub-run on its own\nstatus comment: \"A sub-run could not open its changes: it changed a file its\nagent may not edit, so none of its changes were kept.\" That line never names\nthe file; check the sub-run's own PR comment or `get_run` for it.\n",
222
+ "plainText": "Run changed a protected path A run that failed with category protectedpath finished its work, but the changes it collected included a file its agent is not allowed to edit. Wardby discards the run's changes entirely rather than dropping just that file: nothing from the run reaches a pull request. Wardby protects two kinds of paths on every coding run: The agent's own protectedPaths, a list of glob patterns set on the agent (codingProfile.protectedPaths, via createagent/updateagent). An entry may start with ! to carve out one literal file as an exception to the agent's own patterns; a whole tree can never be carved out this way. The .wardby/ baseline, which every coding run gets regardless of the agent's own settings. It protects everything under .wardby/ except the one literal file .wardby/services.yaml, which any coding agent may propose a change to (see Coding services) — the baseline cannot be widened to cover that file, and no exception can narrow it further than that. What to do: Ask again without changing the named file. If the change is small, doing it yourself and letting the agent build on top is often fastest. If the agent genuinely needs to change that file, its owner (or an admin) can widen codingProfile.protectedPaths with updateagent — for example adding a !-prefixed exception for one file. This can never remove the .wardby/ baseline itself. Otherwise, the repository owner makes the change directly and the agent works around it on the next run. When this run is a sub-run another agent dispatched (for example a router handing work to a coding agent), the parent sees a failed sub-run on its own status comment: \"A sub-run could not open its changes: it changed a file its agent may not edit, so none of its changes were kept.\" That line never names the file; check the sub-run's own PR comment or getrun for it.",
223
+ "headings": [
224
+ {
225
+ "level": 1,
226
+ "text": "Run changed a protected path",
227
+ "slug": "run-changed-a-protected-path"
228
+ }
229
+ ]
230
+ },
231
+ {
232
+ "id": "errors/repo-access",
233
+ "title": "Repository access refused",
234
+ "summary": "Wardby refused repository work because it could not confirm the managed agent owner's required GitHub access.",
235
+ "audience": "operator",
236
+ "tags": [
237
+ "error",
238
+ "github",
239
+ "authorization",
240
+ "refusal"
241
+ ],
242
+ "appliesTo": ">=0.2.1",
243
+ "sourcePath": "errors/repo-access.md",
244
+ "markdown": "\n# Repository access refused\n\n`repo_access` means Wardby cannot authorize the agent owner's current access to\nthe selected repository. Nothing is cloned or pushed for a refusal at run\npreparation. The check also happens immediately before a coding run pushes, so\naccess lost during a run prevents publication.\n\n1. Confirm the agent has an owner and the intended repository is attached.\n2. Confirm that owner has linked their GitHub account to Wardby.\n3. Confirm the GitHub App is installed on the repository and the owner has the\n required permission: write for coding work, read for a read-only link.\n4. If no individual owner can hold the access, ask a Wardby administrator to\n record an explicit repository approval.\n5. Trigger a fresh run after the correction.\n\n`repo_access_unavailable` is different: GitHub could not be queried reliably.\nResolve the availability condition and retry later rather than treating it as\nan authorization success. See [Repository-access troubleshooting](../troubleshooting/repository-access.md).\n",
245
+ "plainText": "Repository access refused repoaccess means Wardby cannot authorize the agent owner's current access to the selected repository. Nothing is cloned or pushed for a refusal at run preparation. The check also happens immediately before a coding run pushes, so access lost during a run prevents publication. Confirm the agent has an owner and the intended repository is attached. Confirm that owner has linked their GitHub account to Wardby. Confirm the GitHub App is installed on the repository and the owner has the required permission: write for coding work, read for a read-only link. If no individual owner can hold the access, ask a Wardby administrator to record an explicit repository approval. Trigger a fresh run after the correction. repoaccessunavailable is different: GitHub could not be queried reliably. Resolve the availability condition and retry later rather than treating it as an authorization success. See Repository-access troubleshooting.",
246
+ "headings": [
247
+ {
248
+ "level": 1,
249
+ "text": "Repository access refused",
250
+ "slug": "repository-access-refused"
251
+ }
252
+ ]
253
+ },
254
+ {
255
+ "id": "errors/service-declaration-invalid",
256
+ "title": "Service declaration invalid",
257
+ "summary": "Wardby refused the coding run because the repository's .wardby/services.yaml on the base branch is not a valid declaration.",
258
+ "audience": "operator",
259
+ "tags": [
260
+ "error",
261
+ "coding-agents",
262
+ "services",
263
+ "refusal"
264
+ ],
265
+ "appliesTo": ">=0.2.1",
266
+ "sourcePath": "errors/service-declaration-invalid.md",
267
+ "markdown": "\n# Service declaration invalid\n\n`service_declaration_invalid` means the repository's `.wardby/services.yaml`,\nread from the run's base branch, could not be used. The run's `error` names the\nline and reason. Wardby refuses the run before a coding worker starts.\n\n1. Check the file on the base branch. Its only key is `services`, mapping\n catalog names (lowercase letters, digits and hyphens) to quoted version\n strings, for example `postgres: \"16\"`.\n2. Keep it to at most five services and under 8 KiB. Images, ports, commands\n and environment belong in the catalog, not in the repository.\n3. Merge the fix to the base branch; a fix on the run's own branch has no\n effect.\n4. Trigger a new run; a refused run is not resumed automatically.\n\nThe same code is used when the declared services' instructions would push the\ncoding task over its size limit; declare fewer services in that case. See\n[Coding services](../coding-services.md).\n",
268
+ "plainText": "Service declaration invalid servicedeclarationinvalid means the repository's .wardby/services.yaml, read from the run's base branch, could not be used. The run's error names the line and reason. Wardby refuses the run before a coding worker starts. Check the file on the base branch. Its only key is services, mapping catalog names (lowercase letters, digits and hyphens) to quoted version strings, for example postgres: \"16\". Keep it to at most five services and under 8 KiB. Images, ports, commands and environment belong in the catalog, not in the repository. Merge the fix to the base branch; a fix on the run's own branch has no effect. Trigger a new run; a refused run is not resumed automatically. The same code is used when the declared services' instructions would push the coding task over its size limit; declare fewer services in that case. See Coding services.",
269
+ "headings": [
270
+ {
271
+ "level": 1,
272
+ "text": "Service declaration invalid",
273
+ "slug": "service-declaration-invalid"
274
+ }
275
+ ]
276
+ },
277
+ {
278
+ "id": "errors/service-declaration-unavailable",
279
+ "title": "Service declaration unavailable",
280
+ "summary": "Wardby refused the coding run because it could not read .wardby/services.yaml from the base branch.",
281
+ "audience": "operator",
282
+ "tags": [
283
+ "error",
284
+ "coding-agents",
285
+ "services",
286
+ "github",
287
+ "refusal"
288
+ ],
289
+ "appliesTo": ">=0.2.1",
290
+ "sourcePath": "errors/service-declaration-unavailable.md",
291
+ "markdown": "\n# Service declaration unavailable\n\n`service_declaration_unavailable` means Wardby could not read\n`.wardby/services.yaml` from the run's base branch through the GitHub App, so\nit could not tell which services the run needs. A missing file is not this\nerror (no file means no services); this is a failed read. Wardby refuses the\nrun rather than start it without services the repository may require.\n\n1. Trigger the run again; the cause is often a transient GitHub error.\n2. If it repeats, confirm the GitHub App installation still covers the\n repository and has contents read access, and that the agent's base branch\n exists.\n3. Check the control-plane logs around the refusal for the GitHub response.\n\nSee [Repository access troubleshooting](../troubleshooting/repository-access.md)\nand [Coding services](../coding-services.md).\n",
292
+ "plainText": "Service declaration unavailable servicedeclarationunavailable means Wardby could not read .wardby/services.yaml from the run's base branch through the GitHub App, so it could not tell which services the run needs. A missing file is not this error (no file means no services); this is a failed read. Wardby refuses the run rather than start it without services the repository may require. Trigger the run again; the cause is often a transient GitHub error. If it repeats, confirm the GitHub App installation still covers the repository and has contents read access, and that the agent's base branch exists. Check the control-plane logs around the refusal for the GitHub response. See Repository access troubleshooting and Coding services.",
293
+ "headings": [
294
+ {
295
+ "level": 1,
296
+ "text": "Service declaration unavailable",
297
+ "slug": "service-declaration-unavailable"
298
+ }
299
+ ]
300
+ },
301
+ {
302
+ "id": "errors/service-launcher-unsupported",
303
+ "title": "Services are not available to this run",
304
+ "summary": "Wardby refused the coding run because the repository declares services and this deployment cannot start them.",
305
+ "audience": "operator",
306
+ "tags": [
307
+ "error",
308
+ "coding-agents",
309
+ "services",
310
+ "kubernetes",
311
+ "docker",
312
+ "refusal"
313
+ ],
314
+ "appliesTo": ">=0.2.1",
315
+ "sourcePath": "errors/service-launcher-unsupported.md",
316
+ "markdown": "\n# Services are not available to this run\n\n`service_launcher_unsupported` means the repository declares services, but this\ndeployment cannot start them. Services need a job launcher that starts them:\n\n- `JOB_LAUNCHER=kubernetes` and `JOB_LAUNCHER=docker` start them for Codex and\n Claude Code agents;\n- a deployment with `JOB_LAUNCHER=local` cannot start them at all.\n\n1. Run the coding agent on a deployment that uses the Kubernetes or Docker job\n launcher, or\n2. remove `.wardby/services.yaml` from the base branch if the repository's\n tests do not need the services.\n\nThis error only applies to an agent that already allows at least one service\n(`codingProfile.services` is non-empty): wardby reads a repository's\ndeclaration only for such an agent, and refuses rather than silently starting\nthe run without the services it names. An agent that allows no services never\nreads the declaration at all, so its runs are unaffected and start normally on\nany launcher. See [Coding-worker troubleshooting](../troubleshooting/coding-workers.md)\nand [Coding services](../coding-services.md).\n",
317
+ "plainText": "Services are not available to this run servicelauncherunsupported means the repository declares services, but this deployment cannot start them. Services need a job launcher that starts them: JOBLAUNCHER=kubernetes and JOBLAUNCHER=docker start them for Codex and Claude Code agents; a deployment with JOBLAUNCHER=local cannot start them at all. Run the coding agent on a deployment that uses the Kubernetes or Docker job launcher, or remove .wardby/services.yaml from the base branch if the repository's tests do not need the services. This error only applies to an agent that already allows at least one service (codingProfile.services is non-empty): wardby reads a repository's declaration only for such an agent, and refuses rather than silently starting the run without the services it names. An agent that allows no services never reads the declaration at all, so its runs are unaffected and start normally on any launcher. See Coding-worker troubleshooting and Coding services.",
318
+ "headings": [
319
+ {
320
+ "level": 1,
321
+ "text": "Services are not available to this run",
322
+ "slug": "services-are-not-available-to-this-run"
323
+ }
324
+ ]
325
+ },
326
+ {
327
+ "id": "errors/service-not-allowed",
328
+ "title": "Service not allowed for this agent",
329
+ "summary": "Wardby refused the coding run because the repository declares a service the agent's codingProfile.services does not allow.",
330
+ "audience": "operator",
331
+ "tags": [
332
+ "error",
333
+ "coding-agents",
334
+ "services",
335
+ "refusal"
336
+ ],
337
+ "appliesTo": ">=0.2.1",
338
+ "sourcePath": "errors/service-not-allowed.md",
339
+ "markdown": "\n# Service not allowed for this agent\n\n`service_not_allowed` means the repository declares a service that exists in\nthe catalog, but the agent's `codingProfile.services` does not list its name.\nWardby refuses the run before a coding worker starts.\n\n1. Confirm the repository should have the service; the declaration is on the\n base branch in `.wardby/services.yaml`.\n2. If it should, the agent's owner (or an admin) adds the name, for example\n `postgres`, to `codingProfile.services` with `update_agent`. Allowing a name\n allows every version the catalog has for it.\n3. Trigger a new run.\n\nEach allowed service reserves CPU, memory and disk for the whole run, so allow\nonly what the agent's repositories need. This error implies the agent already\nallows at least one service — an agent whose `codingProfile.services` is empty\nnever reads the declaration at all, so it never reaches this check. See\n[Coding services](../coding-services.md).\n",
340
+ "plainText": "Service not allowed for this agent servicenotallowed means the repository declares a service that exists in the catalog, but the agent's codingProfile.services does not list its name. Wardby refuses the run before a coding worker starts. Confirm the repository should have the service; the declaration is on the base branch in .wardby/services.yaml. If it should, the agent's owner (or an admin) adds the name, for example postgres, to codingProfile.services with updateagent. Allowing a name allows every version the catalog has for it. Trigger a new run. Each allowed service reserves CPU, memory and disk for the whole run, so allow only what the agent's repositories need. This error implies the agent already allows at least one service — an agent whose codingProfile.services is empty never reads the declaration at all, so it never reaches this check. See Coding services.",
341
+ "headings": [
342
+ {
343
+ "level": 1,
344
+ "text": "Service not allowed for this agent",
345
+ "slug": "service-not-allowed-for-this-agent"
346
+ }
347
+ ]
348
+ },
349
+ {
350
+ "id": "errors/service-unknown",
351
+ "title": "Service not in the catalog",
352
+ "summary": "Wardby refused the coding run because the repository declares a service name and version the service catalog does not have.",
353
+ "audience": "operator",
354
+ "tags": [
355
+ "error",
356
+ "coding-agents",
357
+ "services",
358
+ "refusal"
359
+ ],
360
+ "appliesTo": ">=0.2.1",
361
+ "sourcePath": "errors/service-unknown.md",
362
+ "markdown": "\n# Service not in the catalog\n\n`service_unknown` means `.wardby/services.yaml` on the base branch asks for a\nname and version, such as `postgres 14`, that has no entry in Wardby's service\ncatalog. Wardby refuses the run before a coding worker starts.\n\n1. Run `list_services` (needs `agents:read`) to see the names and versions\n available.\n2. Either change the declaration on the base branch to an available version,\n or ask someone with `services:manage` and the `admin` or `service-manager`\n role to add the entry with `create_service`, pinned by digest.\n3. Trigger a new run once the catalog or the declaration matches.\n\nSee [Coding services](../coding-services.md).\n",
363
+ "plainText": "Service not in the catalog serviceunknown means .wardby/services.yaml on the base branch asks for a name and version, such as postgres 14, that has no entry in Wardby's service catalog. Wardby refuses the run before a coding worker starts. Run listservices (needs agents:read) to see the names and versions available. Either change the declaration on the base branch to an available version, or ask someone with services:manage and the admin or service-manager role to add the entry with createservice, pinned by digest. Trigger a new run once the catalog or the declaration matches. See Coding services.",
364
+ "headings": [
365
+ {
366
+ "level": 1,
367
+ "text": "Service not in the catalog",
368
+ "slug": "service-not-in-the-catalog"
369
+ }
370
+ ]
371
+ },
372
+ {
373
+ "id": "errors/service-unready",
374
+ "title": "Service did not become ready",
375
+ "summary": "A coding run failed at launch because one of its services never passed its readiness check.",
376
+ "audience": "operator",
377
+ "tags": [
378
+ "error",
379
+ "coding-agents",
380
+ "services",
381
+ "kubernetes",
382
+ "docker"
383
+ ],
384
+ "appliesTo": ">=0.2.1",
385
+ "sourcePath": "errors/service-unready.md",
386
+ "markdown": "\n# Service did not become ready\n\nA run that failed with category `service_unready` (launcher error\n`coding_service_unready:<name>`) started, but the named service never became\nready, so the coding agent never started. A service is not ready when its\nreadiness command keeps failing past its failure threshold, its image cannot\nbe pulled or started, or it is still not ready when the launcher's start-up\nlimit runs out.\n\n1. On Kubernetes, inspect the run pod's init-container status and events for\n the `service-<name>` container: image pull errors, crash loops, or probe\n failures. On Docker the service's container is removed with the failed run,\n so reproduce it on the Docker host: pull the entry's image and run it with\n `--read-only`, `--user 10001:10001`, a `--tmpfs` at its `dataPath` and at\n each `writablePaths` entry, and its `serviceEnv`; then run its readiness\n command with `docker exec`.\n2. For a custom catalog entry, confirm the image runs as a non-root user with a\n read-only root filesystem: every directory it writes to must be its\n `dataPath` or one of its `writablePaths`. Probe over TCP on `127.0.0.1`\n rather than a Unix socket.\n3. Each entry's readiness settings (`periodSeconds`, `timeoutSeconds`,\n `failureThreshold`) apply within an overall start-up limit, whatever the\n entry's own threshold would otherwise allow. On Kubernetes that limit is\n the pod-start timeout (`KUBERNETES_READY_TIMEOUT_MS`, default 120000, an\n operator setting) and includes image pulls; if first pulls on new nodes\n are slow, raise it or mirror the image into a nearby registry. On Docker\n the limit is a fixed 120 seconds covering every service of the run\n together (they start one at a time), never runs past the run's own\n timeout, and has no setting to raise it; image pulls are not counted in it\n but may take up to 5 minutes each. The Docker launcher pulls without\n registry credentials, so pull a private or rate-limited image on the\n Docker host beforehand.\n4. Trigger a new run once the cause is fixed.\n\nWhen this run is a sub-run another agent dispatched (for example a router\nhanding work to a coding agent), the parent sees a failed sub-run on its own\nstatus comment, with a line naming the service: \"A sub-run could not start:\nThe `<name>` service didn't become ready, so the run couldn't start.\"\n\nSee [Coding services](../coding-services.md).\n",
387
+ "plainText": "Service did not become ready A run that failed with category serviceunready (launcher error codingserviceunready:<name) started, but the named service never became ready, so the coding agent never started. A service is not ready when its readiness command keeps failing past its failure threshold, its image cannot be pulled or started, or it is still not ready when the launcher's start-up limit runs out. On Kubernetes, inspect the run pod's init-container status and events for the service-<name container: image pull errors, crash loops, or probe failures. On Docker the service's container is removed with the failed run, so reproduce it on the Docker host: pull the entry's image and run it with --read-only, --user 10001:10001, a --tmpfs at its dataPath and at each writablePaths entry, and its serviceEnv; then run its readiness command with docker exec. For a custom catalog entry, confirm the image runs as a non-root user with a read-only root filesystem: every directory it writes to must be its dataPath or one of its writablePaths. Probe over TCP on 127.0.0.1 rather than a Unix socket. Each entry's readiness settings (periodSeconds, timeoutSeconds, failureThreshold) apply within an overall start-up limit, whatever the entry's own threshold would otherwise allow. On Kubernetes that limit is the pod-start timeout (KUBERNETESREADYTIMEOUTMS, default 120000, an operator setting) and includes image pulls; if first pulls on new nodes are slow, raise it or mirror the image into a nearby registry. On Docker the limit is a fixed 120 seconds covering every service of the run together (they start one at a time), never runs past the run's own timeout, and has no setting to raise it; image pulls are not counted in it but may take up to 5 minutes each. The Docker launcher pulls without registry credentials, so pull a private or rate-limited image on the Docker host beforehand. Trigger a new run once the cause is fixed. When this run is a sub-run another agent dispatched (for example a router handing work to a coding agent), the parent sees a failed sub-run on its own status comment, with a line naming the service: \"A sub-run could not start: The <name service didn't become ready, so the run couldn't start.\" See Coding services.",
388
+ "headings": [
389
+ {
390
+ "level": 1,
391
+ "text": "Service did not become ready",
392
+ "slug": "service-did-not-become-ready"
393
+ }
394
+ ]
395
+ },
396
+ {
397
+ "id": "getting-started",
398
+ "title": "Get started with Wardby",
399
+ "summary": "Set up a local Wardby control plane, verify it, and choose the next guide.",
400
+ "audience": "operator",
401
+ "tags": [
402
+ "setup",
403
+ "quickstart",
404
+ "operator"
405
+ ],
406
+ "appliesTo": ">=0.2.1",
407
+ "sourcePath": "getting-started.md",
408
+ "markdown": "\n# Get started with Wardby\n\nFrom the project you want Wardby to manage, run:\n\n```sh\nnpx --yes @wardby/cli@latest quickstart\n```\n\nThe quickstart creates local state under `.wardby/`, starts the local services,\napplies the required database migrations, and can register Wardby with Codex or\nClaude Code. Run `wardby doctor` afterwards to verify the local installation.\n\nUse [Operate agents](operating-agents.md) to create and supervise managed work.\nRead [Choose a native or coding agent](creating-agents.md) before creating your\nfirst agent.\nUse [MCP access](mcp.md) when connecting an MCP client. Before enabling coding\nagents against a repository, complete [GitHub integration](github.md).\nFor a self-hosted installation, start with [Choose a deployment target](deployment-targets.md)\nand [Configure identity and privileged access](identity-and-access.md).\n\nFor complete local setup and deployment prerequisites, read\n[`docs/getting-started.md`](../docs/getting-started.md).\n",
409
+ "plainText": "Get started with Wardby From the project you want Wardby to manage, run: npx --yes @wardby/cli@latest quickstart The quickstart creates local state under .wardby/, starts the local services, applies the required database migrations, and can register Wardby with Codex or Claude Code. Run wardby doctor afterwards to verify the local installation. Use Operate agents to create and supervise managed work. Read Choose a native or coding agent before creating your first agent. Use MCP access when connecting an MCP client. Before enabling coding agents against a repository, complete GitHub integration. For a self-hosted installation, start with Choose a deployment target and Configure identity and privileged access. For complete local setup and deployment prerequisites, read docs/getting-started.md.",
410
+ "headings": [
411
+ {
412
+ "level": 1,
413
+ "text": "Get started with Wardby",
414
+ "slug": "get-started-with-wardby"
415
+ }
416
+ ]
417
+ },
418
+ {
419
+ "id": "github-integration",
420
+ "title": "Connect GitHub repositories",
421
+ "summary": "Authorize repository access and configure Wardby coding or review agents through a scoped GitHub App.",
422
+ "audience": "operator",
423
+ "tags": [
424
+ "github",
425
+ "repositories",
426
+ "coding-agents",
427
+ "code-review"
428
+ ],
429
+ "appliesTo": ">=0.2.1",
430
+ "sourcePath": "github.md",
431
+ "markdown": "\n# Connect GitHub repositories\n\nWardby uses a GitHub App installed only on the repositories an agent may use.\nRepository access is checked against the agent owner's linked GitHub account,\nor an explicitly recorded administrator approval. Coding agents need write\naccess because they can push a branch and open a draft pull request.\n\nWardby rechecks access before preparing a coding workspace and again before\npushing. Losing access, unlinking the account, or a failed access check stops\nthe run without publishing changes. See [Repository-access troubleshooting](troubleshooting/repository-access.md)\nfor the resulting refusal states.\n\nWorkers do not receive the GitHub App private key. A trusted component validates\nthe changes, pushes a controlled branch, and opens at most one draft pull\nrequest. Wardby does not auto-merge coding-agent output.\n\nRead [`docs/coding-agent-setup.md`](../docs/coding-agent-setup.md) for coding\nagent setup and [`docs/code-review-agents.md`](../docs/code-review-agents.md)\nfor pull-request review agents and webhook configuration.\nUse [Run GitHub code-review agents](code-review-agents.md) for the operator\noverview of checks, mentions, and fork limitations.\n",
432
+ "plainText": "Connect GitHub repositories Wardby uses a GitHub App installed only on the repositories an agent may use. Repository access is checked against the agent owner's linked GitHub account, or an explicitly recorded administrator approval. Coding agents need write access because they can push a branch and open a draft pull request. Wardby rechecks access before preparing a coding workspace and again before pushing. Losing access, unlinking the account, or a failed access check stops the run without publishing changes. See Repository-access troubleshooting for the resulting refusal states. Workers do not receive the GitHub App private key. A trusted component validates the changes, pushes a controlled branch, and opens at most one draft pull request. Wardby does not auto-merge coding-agent output. Read docs/coding-agent-setup.md for coding agent setup and docs/code-review-agents.md for pull-request review agents and webhook configuration. Use Run GitHub code-review agents for the operator overview of checks, mentions, and fork limitations.",
433
+ "headings": [
434
+ {
435
+ "level": 1,
436
+ "text": "Connect GitHub repositories",
437
+ "slug": "connect-github-repositories"
438
+ }
439
+ ]
440
+ },
441
+ {
442
+ "id": "identity-and-access",
443
+ "title": "Configure identity and privileged access",
444
+ "summary": "Protect remote MCP access with an OAuth/OIDC provider and restrict sensitive operations with scopes and roles.",
445
+ "audience": "operator",
446
+ "tags": [
447
+ "identity",
448
+ "oauth",
449
+ "oidc",
450
+ "access-control",
451
+ "mcp"
452
+ ],
453
+ "appliesTo": ">=0.2.1",
454
+ "sourcePath": "identity-and-access.md",
455
+ "markdown": "\n# Configure identity and privileged access\n\nLocal stdio MCP created by `wardby quickstart` trusts the local operator. A\nshared HTTPS deployment needs an OAuth/OIDC identity provider. In delegating\nmode, that provider authenticates the caller and issues a signed JWT access\ntoken; Wardby verifies the token and enforces its scopes without administering\nthe provider's users or exchanging authorization codes.\n\nSet the provider's resource audience, `MCP_CANONICAL_URI`, and `AUTH_AUDIENCE`\nto the exact same public MCP URL. Tokens need a stable subject, expiry, issuer,\naudience, and the granted Wardby scopes in `scope` or `scp`.\n\nScopes authorize normal operations such as managing agents, runs, tools,\ndatastores, secrets, webhooks, budgets, packages, services, and memory. Three\nsensitive permissions have an additional role requirement:\n\n- `agents:admin` requires the Wardby `admin` role.\n- `packages:approve` requires the `admin` or `package-approver` role.\n- `services:manage` requires the `admin` or `service-manager` role.\n\nMap roles only from an IdP claim that users cannot self-assign. Removing a\nrole affects the next token the caller receives.\n\nWhen you upgrade a delegating-mode deployment, define any newly advertised\nscope, such as `services:manage`, in the provider before deploying. Clients\nthat request every advertised scope otherwise fail with `invalid_scope`.\n\nRead [`docs/getting-started-identity-provider.md`](../docs/getting-started-identity-provider.md)\nfor the required claims, scope list, role mapping, provider examples, and\nclient registration.\n",
456
+ "plainText": "Configure identity and privileged access Local stdio MCP created by wardby quickstart trusts the local operator. A shared HTTPS deployment needs an OAuth/OIDC identity provider. In delegating mode, that provider authenticates the caller and issues a signed JWT access token; Wardby verifies the token and enforces its scopes without administering the provider's users or exchanging authorization codes. Set the provider's resource audience, MCPCANONICALURI, and AUTHAUDIENCE to the exact same public MCP URL. Tokens need a stable subject, expiry, issuer, audience, and the granted Wardby scopes in scope or scp. Scopes authorize normal operations such as managing agents, runs, tools, datastores, secrets, webhooks, budgets, packages, services, and memory. Three sensitive permissions have an additional role requirement: agents:admin requires the Wardby admin role. packages:approve requires the admin or package-approver role. services:manage requires the admin or service-manager role. Map roles only from an IdP claim that users cannot self-assign. Removing a role affects the next token the caller receives. When you upgrade a delegating-mode deployment, define any newly advertised scope, such as services:manage, in the provider before deploying. Clients that request every advertised scope otherwise fail with invalidscope. Read docs/getting-started-identity-provider.md for the required claims, scope list, role mapping, provider examples, and client registration.",
457
+ "headings": [
458
+ {
459
+ "level": 1,
460
+ "text": "Configure identity and privileged access",
461
+ "slug": "configure-identity-and-privileged-access"
462
+ }
463
+ ]
464
+ },
465
+ {
466
+ "id": "mcp-access",
467
+ "title": "Connect an MCP client",
468
+ "summary": "Use Wardby's local stdio or protected HTTP MCP transport safely.",
469
+ "audience": "developer",
470
+ "tags": [
471
+ "mcp",
472
+ "oauth",
473
+ "codex",
474
+ "claude-code"
475
+ ],
476
+ "appliesTo": ">=0.2.1",
477
+ "sourcePath": "mcp.md",
478
+ "markdown": "\n# Connect an MCP client\n\nFor local use, `wardby quickstart` can register the local stdio MCP server with\nCodex or Claude Code. Local stdio trusts the local operator.\n\nFor remote access, Wardby exposes an OAuth 2.1-protected HTTP resource server.\nRun the service with `MCP_TRANSPORT=http`, set a canonical public URI, and use\nthe instance's configured identity-provider mode. Keep the MCP endpoint behind\nyour intended ingress and authentication boundary.\n\nMCP clients use Wardby to manage agents, budgets, tools, schedules, secrets,\ndatastores, and runs. They do not receive the provider or GitHub App\ncredentials held by Wardby's trusted components.\n\nWith the existing `agents:read` scope, clients can also use `search_help` to\nfind bundled self-hosted guidance with fuzzy matching and `get_help_article`\nto read a complete article by id. These tools use the same release-bundled,\noffline catalog as `wardby help`; they expose no instance data or credentials.\n\nSee [`docs/getting-started-identity-provider.md`](../docs/getting-started-identity-provider.md)\nfor the supported self-hosted and delegated identity-provider setup.\n",
479
+ "plainText": "Connect an MCP client For local use, wardby quickstart can register the local stdio MCP server with Codex or Claude Code. Local stdio trusts the local operator. For remote access, Wardby exposes an OAuth 2.1-protected HTTP resource server. Run the service with MCPTRANSPORT=http, set a canonical public URI, and use the instance's configured identity-provider mode. Keep the MCP endpoint behind your intended ingress and authentication boundary. MCP clients use Wardby to manage agents, budgets, tools, schedules, secrets, datastores, and runs. They do not receive the provider or GitHub App credentials held by Wardby's trusted components. With the existing agents:read scope, clients can also use searchhelp to find bundled self-hosted guidance with fuzzy matching and gethelparticle to read a complete article by id. These tools use the same release-bundled, offline catalog as wardby help; they expose no instance data or credentials. See docs/getting-started-identity-provider.md for the supported self-hosted and delegated identity-provider setup.",
480
+ "headings": [
481
+ {
482
+ "level": 1,
483
+ "text": "Connect an MCP client",
484
+ "slug": "connect-an-mcp-client"
485
+ }
486
+ ]
487
+ },
488
+ {
489
+ "id": "native-capabilities",
490
+ "title": "Use native agents, tools, and data",
491
+ "summary": "Attach scoped tools, secrets, datastores, memory, schedules, and sub-agents to a native Wardby agent.",
492
+ "audience": "developer",
493
+ "tags": [
494
+ "agents",
495
+ "tools",
496
+ "secrets",
497
+ "datastores",
498
+ "memory",
499
+ "schedules",
500
+ "subagents"
501
+ ],
502
+ "appliesTo": ">=0.2.1",
503
+ "sourcePath": "native-capabilities.md",
504
+ "markdown": "\n# Use native agents, tools, and data\n\nNative agents work through the Wardby control plane rather than a repository\ncheckout. Give each agent only the capabilities its job needs:\n\n- **Tools** for approved external actions or APIs.\n- **Secrets** as bindings to tools or agents; values remain in Wardby's trusted\n components rather than being returned through MCP.\n- **Datastores** for scoped application data and queries.\n- **Memory** for agent-owned durable context.\n- **Schedules and webhooks** to start event-driven work.\n- **Sub-agents** for delegated, bounded work with their own capability set.\n\nUse a budget or shared budget group on every agent, and inspect runs before\nexpanding its access. An access grant is intentional delegation: use it only\nwhen an owner permits one agent to use another resource. Creating or changing\ntools, secrets, datastores, schedules, webhooks, memory, and budget groups\nrequires the matching MCP scope.\n\nSee [Operate agents](operating-agents.md) for run and budget management, and\n[`README.md`](../README.md) for the feature overview and MCP operations.\n",
505
+ "plainText": "Use native agents, tools, and data Native agents work through the Wardby control plane rather than a repository checkout. Give each agent only the capabilities its job needs: Tools for approved external actions or APIs. Secrets as bindings to tools or agents; values remain in Wardby's trusted components rather than being returned through MCP. Datastores for scoped application data and queries. Memory for agent-owned durable context. Schedules and webhooks to start event-driven work. Sub-agents for delegated, bounded work with their own capability set. Use a budget or shared budget group on every agent, and inspect runs before expanding its access. An access grant is intentional delegation: use it only when an owner permits one agent to use another resource. Creating or changing tools, secrets, datastores, schedules, webhooks, memory, and budget groups requires the matching MCP scope. See Operate agents for run and budget management, and README.md for the feature overview and MCP operations.",
506
+ "headings": [
507
+ {
508
+ "level": 1,
509
+ "text": "Use native agents, tools, and data",
510
+ "slug": "use-native-agents-tools-and-data"
511
+ }
512
+ ]
513
+ },
514
+ {
515
+ "id": "observability",
516
+ "title": "Monitor Wardby",
517
+ "summary": "Scrape private Prometheus metrics and build production alerting around the coding proxy and run lifecycle.",
518
+ "audience": "operator",
519
+ "tags": [
520
+ "observability",
521
+ "prometheus",
522
+ "grafana",
523
+ "metrics",
524
+ "operations"
525
+ ],
526
+ "appliesTo": ">=0.2.1",
527
+ "sourcePath": "observability.md",
528
+ "markdown": "\n# Monitor Wardby\n\nWhen `METRICS_BIND` is configured, Wardby's coding proxy exposes Prometheus\nmetrics at `/metrics`. Keep that endpoint on a private network and permit only\nyour collector to scrape it. Metrics cover proxy requests, errors, latency,\naudit events, model cost, reserved and actual budget spend, coding outcomes,\nand Node.js process health; they intentionally exclude prompts, repository\ncontent, credentials, diffs, raw worker output, and run identifiers.\n\nFor a local dashboard stack, run:\n\n```sh\nnpm run observability:up\nnpm run observability:smoke\n```\n\nThis starts Prometheus and Grafana locally. Use `npm run observability:down`\nwhen finished.\n\nIn production, configure your own Prometheus-compatible collector, retention,\nprivate connectivity, alerts, and SLOs. GCP operators can use the Ops Agent or\nManaged Service for Prometheus; AWS operators can use the CloudWatch Agent\nPrometheus collector. Wardby's reference cloud deployments do not provision\nthem, and application/MCP metrics are currently narrower than coding-proxy\nmetrics.\n\nAlert on proxy failures, budget cutoffs, cleanup failures, stalled runs, and\nsustained latency or memory growth. Wardby's database remains the source of\ntruth for runs, budgets, and accounting.\n\nRead [`docs/observability.md`](../docs/observability.md) for configuration and\nthe full production checklist.\n",
529
+ "plainText": "Monitor Wardby When METRICSBIND is configured, Wardby's coding proxy exposes Prometheus metrics at /metrics. Keep that endpoint on a private network and permit only your collector to scrape it. Metrics cover proxy requests, errors, latency, audit events, model cost, reserved and actual budget spend, coding outcomes, and Node.js process health; they intentionally exclude prompts, repository content, credentials, diffs, raw worker output, and run identifiers. For a local dashboard stack, run: npm run observability:up npm run observability:smoke This starts Prometheus and Grafana locally. Use npm run observability:down when finished. In production, configure your own Prometheus-compatible collector, retention, private connectivity, alerts, and SLOs. GCP operators can use the Ops Agent or Managed Service for Prometheus; AWS operators can use the CloudWatch Agent Prometheus collector. Wardby's reference cloud deployments do not provision them, and application/MCP metrics are currently narrower than coding-proxy metrics. Alert on proxy failures, budget cutoffs, cleanup failures, stalled runs, and sustained latency or memory growth. Wardby's database remains the source of truth for runs, budgets, and accounting. Read docs/observability.md for configuration and the full production checklist.",
530
+ "headings": [
531
+ {
532
+ "level": 1,
533
+ "text": "Monitor Wardby",
534
+ "slug": "monitor-wardby"
535
+ }
536
+ ]
537
+ },
538
+ {
539
+ "id": "operating-agents",
540
+ "title": "Operate managed agents",
541
+ "summary": "Understand the identity, budget, capabilities, triggers, and result of a Wardby-managed agent.",
542
+ "audience": "operator",
543
+ "tags": [
544
+ "agents",
545
+ "budgets",
546
+ "schedules",
547
+ "runs"
548
+ ],
549
+ "appliesTo": ">=0.2.1",
550
+ "sourcePath": "operating-agents.md",
551
+ "markdown": "\n# Operate managed agents\n\nEvery Wardby-managed agent has an owner, system prompt, model, per-run budget,\nand explicitly attached capabilities. A run starts only when its identity,\npolicy, and available budget agree.\n\nCreate, update, pause, trigger, and inspect agents through Wardby's MCP tools.\nThe CLI is the bootstrap and operations fallback. Scheduled work requires a\nrunning scheduler: `wardby serve` runs MCP, scheduler, and reconciliation in\none process; `wardby mcp` alone does not execute schedules.\n\nUse [Choose a native or coding agent](creating-agents.md) to select the least\npowerful execution model that can safely produce the desired outcome.\n\nBefore a run starts, Wardby reserves its allowed spend. The reservation is\nconstrained by the agent's own budget, any shared budget group, and any\nsub-agent run tree. See [Budget troubleshooting](troubleshooting/budgets.md)\nwhen a run is refused for lack of budget.\n\nFor the full lifecycle and the controls applied to every managed run, read\n[`README.md`](../README.md).\n",
552
+ "plainText": "Operate managed agents Every Wardby-managed agent has an owner, system prompt, model, per-run budget, and explicitly attached capabilities. A run starts only when its identity, policy, and available budget agree. Create, update, pause, trigger, and inspect agents through Wardby's MCP tools. The CLI is the bootstrap and operations fallback. Scheduled work requires a running scheduler: wardby serve runs MCP, scheduler, and reconciliation in one process; wardby mcp alone does not execute schedules. Use Choose a native or coding agent to select the least powerful execution model that can safely produce the desired outcome. Before a run starts, Wardby reserves its allowed spend. The reservation is constrained by the agent's own budget, any shared budget group, and any sub-agent run tree. See Budget troubleshooting when a run is refused for lack of budget. For the full lifecycle and the controls applied to every managed run, read README.md.",
553
+ "headings": [
554
+ {
555
+ "level": 1,
556
+ "text": "Operate managed agents",
557
+ "slug": "operate-managed-agents"
558
+ }
559
+ ]
560
+ },
561
+ {
562
+ "id": "security-boundaries",
563
+ "title": "Understand Wardby security boundaries",
564
+ "summary": "Review the isolation, credential, budget, and action-authority controls that apply to managed work.",
565
+ "audience": "operator",
566
+ "tags": [
567
+ "security",
568
+ "isolation",
569
+ "credentials",
570
+ "budgets"
571
+ ],
572
+ "appliesTo": ">=0.2.1",
573
+ "sourcePath": "security.md",
574
+ "markdown": "\n# Understand Wardby security boundaries\n\nWardby is designed to make agent work bounded and reviewable. It applies hard\nper-agent and shared-budget limits, grants only explicitly attached tools,\nsecrets, datastores, and sub-agents, and records a durable result.\n\nNative tools run in a constrained QuickJS environment. Coding agents use\nisolated workers with bounded resources and a trusted proxy. Workers do not\nreceive provider credentials or the GitHub App private key. Coding finalization\ncreates a draft pull request; it does not grant the worker merge authority.\n\nTreat the deployment boundary as part of the security model. Restrict Docker or\nKubernetes administrator access, protect secrets, constrain network egress,\nand read the deployment guide before enabling a production repository.\n\nSee [`docs/security-deployment.md`](../docs/security-deployment.md) and\n[`docs/coding-worker-isolation.md`](../docs/coding-worker-isolation.md) for\nthe detailed operational model.\n",
575
+ "plainText": "Understand Wardby security boundaries Wardby is designed to make agent work bounded and reviewable. It applies hard per-agent and shared-budget limits, grants only explicitly attached tools, secrets, datastores, and sub-agents, and records a durable result. Native tools run in a constrained QuickJS environment. Coding agents use isolated workers with bounded resources and a trusted proxy. Workers do not receive provider credentials or the GitHub App private key. Coding finalization creates a draft pull request; it does not grant the worker merge authority. Treat the deployment boundary as part of the security model. Restrict Docker or Kubernetes administrator access, protect secrets, constrain network egress, and read the deployment guide before enabling a production repository. See docs/security-deployment.md and docs/coding-worker-isolation.md for the detailed operational model.",
576
+ "headings": [
577
+ {
578
+ "level": 1,
579
+ "text": "Understand Wardby security boundaries",
580
+ "slug": "understand-wardby-security-boundaries"
581
+ }
582
+ ]
583
+ },
584
+ {
585
+ "id": "troubleshooting/budgets",
586
+ "title": "Troubleshoot budgets and reservations",
587
+ "summary": "Diagnose run refusals caused by an exhausted agent, shared budget group, or sub-agent run tree.",
588
+ "audience": "operator",
589
+ "tags": [
590
+ "budgets",
591
+ "reservations",
592
+ "refusals",
593
+ "scheduling"
594
+ ],
595
+ "appliesTo": ">=0.2.1",
596
+ "sourcePath": "troubleshooting/budgets.md",
597
+ "markdown": "\n# Troubleshoot budgets and reservations\n\nWardby reserves budget when it dispatches a run. The reservation is limited by\nthe agent's `budgetUsd`, the remaining shared daily, weekly, or monthly budget\ngroup capacity, and the remaining parent run-tree capacity for a sub-agent.\n\nWhen no capacity remains, Wardby records the run as refused and does not start\na worker. Common errors include `budget_group_exhausted:day`,\n`budget_group_exhausted:week`, `budget_group_exhausted:month`, and\n`run_tree_exhausted`.\n\nInspect the agent, its budget group, and recent runs before increasing a limit.\nIn-progress runs retain their unspent reservation, so overlapping scheduled,\nwebhook, and manual runs share one cap rather than each assuming the full\nremaining balance.\n\nFor a shared-group refusal, read [Budget group exhausted](../errors/budget-group-exhausted.md).\n",
598
+ "plainText": "Troubleshoot budgets and reservations Wardby reserves budget when it dispatches a run. The reservation is limited by the agent's budgetUsd, the remaining shared daily, weekly, or monthly budget group capacity, and the remaining parent run-tree capacity for a sub-agent. When no capacity remains, Wardby records the run as refused and does not start a worker. Common errors include budgetgroupexhausted:day, budgetgroupexhausted:week, budgetgroupexhausted:month, and runtreeexhausted. Inspect the agent, its budget group, and recent runs before increasing a limit. In-progress runs retain their unspent reservation, so overlapping scheduled, webhook, and manual runs share one cap rather than each assuming the full remaining balance. For a shared-group refusal, read Budget group exhausted.",
599
+ "headings": [
600
+ {
601
+ "level": 1,
602
+ "text": "Troubleshoot budgets and reservations",
603
+ "slug": "troubleshoot-budgets-and-reservations"
604
+ }
605
+ ]
606
+ },
607
+ {
608
+ "id": "troubleshooting/coding-workers",
609
+ "title": "Troubleshoot coding workers",
610
+ "summary": "Investigate coding-worker setup, isolation preflight, and safe failure handling.",
611
+ "audience": "operator",
612
+ "tags": [
613
+ "coding-agents",
614
+ "docker",
615
+ "kubernetes",
616
+ "isolation",
617
+ "services"
618
+ ],
619
+ "appliesTo": ">=0.2.1",
620
+ "sourcePath": "troubleshooting/coding-workers.md",
621
+ "markdown": "\n# Troubleshoot coding workers\n\nBefore enabling a coding agent, configure an immutable worker image, the\ntrusted coding proxy, a scoped GitHub App installation, and the selected job\nlauncher. Run `wardby coding preflight` after changing the Docker or Kubernetes\nconfiguration.\n\nWardby refuses to weaken an isolation profile when a required host feature,\nnetwork setting, mount, environment, or cleanup guarantee cannot be verified.\nInvestigate the host configuration instead of bypassing the refusal.\n\nCodex and Claude Code workers have different supported launcher combinations.\nReview the deployment guide for your target before assigning a coding profile.\n\nFor the specific isolation refusal, read [Coding-worker isolation unavailable](../errors/docker-isolation-unsupported.md).\n\n## Service refusals and failures\n\nA repository can declare services such as PostgreSQL in `.wardby/services.yaml`\non its base branch. Wardby checks the declaration, the service catalog, and the\nagent's `codingProfile.services` before a run starts, and refuses the run with a\n`service_*` code when they disagree. The run's `error` (from `get_run`) is the\ncode followed by a sentence the requester also sees on the run's status comment.\n\n- [`service_declaration_invalid`](../errors/service-declaration-invalid.md):\n the file on the base branch is not a valid declaration.\n- [`service_declaration_unavailable`](../errors/service-declaration-unavailable.md):\n Wardby could not read the file through the GitHub App.\n- [`service_unknown`](../errors/service-unknown.md): the catalog has no such\n name and version.\n- [`service_not_allowed`](../errors/service-not-allowed.md): the agent does not\n allow that service.\n- [`service_launcher_unsupported`](../errors/service-launcher-unsupported.md):\n services need the Kubernetes or Docker job launcher.\n- [`service_unready`](../errors/service-unready.md): the run started but a\n service never became ready (launcher error `coding_service_unready:<name>`).\n\nSee [Coding services](../coding-services.md).\n",
622
+ "plainText": "Troubleshoot coding workers Before enabling a coding agent, configure an immutable worker image, the trusted coding proxy, a scoped GitHub App installation, and the selected job launcher. Run wardby coding preflight after changing the Docker or Kubernetes configuration. Wardby refuses to weaken an isolation profile when a required host feature, network setting, mount, environment, or cleanup guarantee cannot be verified. Investigate the host configuration instead of bypassing the refusal. Codex and Claude Code workers have different supported launcher combinations. Review the deployment guide for your target before assigning a coding profile. For the specific isolation refusal, read Coding-worker isolation unavailable. Service refusals and failures A repository can declare services such as PostgreSQL in .wardby/services.yaml on its base branch. Wardby checks the declaration, the service catalog, and the agent's codingProfile.services before a run starts, and refuses the run with a service code when they disagree. The run's error (from getrun) is the code followed by a sentence the requester also sees on the run's status comment. servicedeclarationinvalid: the file on the base branch is not a valid declaration. servicedeclarationunavailable: Wardby could not read the file through the GitHub App. serviceunknown: the catalog has no such name and version. servicenotallowed: the agent does not allow that service. servicelauncherunsupported: services need the Kubernetes or Docker job launcher. serviceunready: the run started but a service never became ready (launcher error codingserviceunready:<name). See Coding services.",
623
+ "headings": [
624
+ {
625
+ "level": 1,
626
+ "text": "Troubleshoot coding workers",
627
+ "slug": "troubleshoot-coding-workers"
628
+ },
629
+ {
630
+ "level": 2,
631
+ "text": "Service refusals and failures",
632
+ "slug": "service-refusals-and-failures"
633
+ }
634
+ ]
635
+ },
636
+ {
637
+ "id": "troubleshooting/repository-access",
638
+ "title": "Troubleshoot repository access",
639
+ "summary": "Diagnose why Wardby refused repository work or could not verify the agent owner's GitHub access.",
640
+ "audience": "operator",
641
+ "tags": [
642
+ "github",
643
+ "repositories",
644
+ "authorization",
645
+ "refusals"
646
+ ],
647
+ "appliesTo": ">=0.2.1",
648
+ "sourcePath": "troubleshooting/repository-access.md",
649
+ "markdown": "\n# Troubleshoot repository access\n\nWardby checks that the owner of a coding or repository-linked agent has the\nrequired current GitHub permission. A coding repository requires write access;\na read-only repository link requires read access. An administrator can record a\nrepository approval when no individual's access is appropriate.\n\n`repo_access` means the current owner no longer has the required permission,\nhas unlinked their account, or the repository was not authorized. Restore the\nowner's GitHub link and permission, or have an administrator review and record\nthe appropriate repository authorization.\n\n`repo_access_unavailable` means Wardby could not verify GitHub access after its\nretry. Do not treat it as permission granted: resolve the GitHub/API condition\nand re-run the work later.\n\nRead [Repository access refused](../errors/repo-access.md) for the safe\nremediation sequence.\n",
650
+ "plainText": "Troubleshoot repository access Wardby checks that the owner of a coding or repository-linked agent has the required current GitHub permission. A coding repository requires write access; a read-only repository link requires read access. An administrator can record a repository approval when no individual's access is appropriate. repoaccess means the current owner no longer has the required permission, has unlinked their account, or the repository was not authorized. Restore the owner's GitHub link and permission, or have an administrator review and record the appropriate repository authorization. repoaccessunavailable means Wardby could not verify GitHub access after its retry. Do not treat it as permission granted: resolve the GitHub/API condition and re-run the work later. Read Repository access refused for the safe remediation sequence.",
651
+ "headings": [
652
+ {
653
+ "level": 1,
654
+ "text": "Troubleshoot repository access",
655
+ "slug": "troubleshoot-repository-access"
656
+ }
657
+ ]
658
+ }
659
+ ]
660
+ }