@b00dea/cockpit 0.0.0-stage → 0.1.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 (363) hide show
  1. package/CHANGELOG.md +375 -0
  2. package/LICENSE +21 -0
  3. package/README.md +22 -2
  4. package/bin/cockpit.mjs +33 -0
  5. package/cockpit.schema.json +2574 -0
  6. package/dist/autonomy.d.ts +44 -0
  7. package/dist/autonomy.js +156 -0
  8. package/dist/bounded-read.d.ts +14 -0
  9. package/dist/bounded-read.js +42 -0
  10. package/dist/browser/commands.d.ts +62 -0
  11. package/dist/browser/commands.js +349 -0
  12. package/dist/browser/package-paths.d.ts +1 -0
  13. package/dist/browser/package-paths.js +6 -0
  14. package/dist/browser/proxy.d.ts +22 -0
  15. package/dist/browser/proxy.js +37 -0
  16. package/dist/browser/runtime.d.ts +117 -0
  17. package/dist/browser/runtime.js +183 -0
  18. package/dist/browser/surfaces.d.ts +141 -0
  19. package/dist/browser/surfaces.js +556 -0
  20. package/dist/browser/ui-gate.d.ts +15 -0
  21. package/dist/browser/ui-gate.js +18 -0
  22. package/dist/cli-guard.d.ts +5 -0
  23. package/dist/cli-guard.js +71 -0
  24. package/dist/cli-main.d.ts +139 -0
  25. package/dist/cli-main.js +1405 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.js +16 -0
  28. package/dist/command-table.d.ts +113 -0
  29. package/dist/command-table.js +512 -0
  30. package/dist/config/load.d.ts +171 -0
  31. package/dist/config/load.js +345 -0
  32. package/dist/config/sibling-toml.d.ts +48 -0
  33. package/dist/config/sibling-toml.js +160 -0
  34. package/dist/config/surface-tools-toml.d.ts +9 -0
  35. package/dist/config/surface-tools-toml.js +37 -0
  36. package/dist/config/verified-write.d.ts +43 -0
  37. package/dist/config/verified-write.js +89 -0
  38. package/dist/diagnostics.d.ts +26 -0
  39. package/dist/diagnostics.js +335 -0
  40. package/dist/emit.d.ts +22 -0
  41. package/dist/emit.js +43 -0
  42. package/dist/entrypoint-kinds.d.ts +3 -0
  43. package/dist/entrypoint-kinds.js +11 -0
  44. package/dist/environment/application/destructive.d.ts +6 -0
  45. package/dist/environment/application/destructive.js +425 -0
  46. package/dist/environment/application/doctor.d.ts +89 -0
  47. package/dist/environment/application/doctor.js +235 -0
  48. package/dist/environment/application/guard.d.ts +43 -0
  49. package/dist/environment/application/guard.js +622 -0
  50. package/dist/environment/application/health.d.ts +134 -0
  51. package/dist/environment/application/health.js +379 -0
  52. package/dist/environment/application/lifecycle-context.d.ts +228 -0
  53. package/dist/environment/application/lifecycle-context.js +154 -0
  54. package/dist/environment/application/lifecycle-state.d.ts +25 -0
  55. package/dist/environment/application/lifecycle-state.js +201 -0
  56. package/dist/environment/application/lifecycle.d.ts +17 -0
  57. package/dist/environment/application/lifecycle.js +729 -0
  58. package/dist/environment/application/logs.d.ts +45 -0
  59. package/dist/environment/application/logs.js +127 -0
  60. package/dist/environment/application/setup.d.ts +129 -0
  61. package/dist/environment/application/setup.js +741 -0
  62. package/dist/environment/application/shared.d.ts +11 -0
  63. package/dist/environment/application/shared.js +61 -0
  64. package/dist/environment/claims.d.ts +389 -0
  65. package/dist/environment/claims.js +1709 -0
  66. package/dist/environment/codex-hook-trust.d.ts +11 -0
  67. package/dist/environment/codex-hook-trust.js +185 -0
  68. package/dist/environment/compose-environment.d.ts +1 -0
  69. package/dist/environment/compose-environment.js +6 -0
  70. package/dist/environment/compose-ownership.d.ts +21 -0
  71. package/dist/environment/compose-ownership.js +117 -0
  72. package/dist/environment/compose-topology.d.ts +117 -0
  73. package/dist/environment/compose-topology.js +413 -0
  74. package/dist/environment/contract.d.ts +489 -0
  75. package/dist/environment/contract.js +761 -0
  76. package/dist/environment/declaration.d.ts +14 -0
  77. package/dist/environment/declaration.js +39 -0
  78. package/dist/environment/destructive-composition.d.ts +29 -0
  79. package/dist/environment/destructive-composition.js +333 -0
  80. package/dist/environment/docker-daemon.d.ts +30 -0
  81. package/dist/environment/docker-daemon.js +78 -0
  82. package/dist/environment/docker-endpoint.d.ts +10 -0
  83. package/dist/environment/docker-endpoint.js +19 -0
  84. package/dist/environment/env-schema-observation.d.ts +46 -0
  85. package/dist/environment/env-schema-observation.js +241 -0
  86. package/dist/environment/evidence.d.ts +136 -0
  87. package/dist/environment/evidence.js +437 -0
  88. package/dist/environment/executable.d.ts +26 -0
  89. package/dist/environment/executable.js +167 -0
  90. package/dist/environment/generated-application/authorities.d.ts +5 -0
  91. package/dist/environment/generated-application/authorities.js +61 -0
  92. package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
  93. package/dist/environment/generated-application/bootstrap-skill.js +328 -0
  94. package/dist/environment/generated-application/check.d.ts +13 -0
  95. package/dist/environment/generated-application/check.js +189 -0
  96. package/dist/environment/generated-application/custom-surface.d.ts +26 -0
  97. package/dist/environment/generated-application/custom-surface.js +289 -0
  98. package/dist/environment/generated-application/prepare.d.ts +29 -0
  99. package/dist/environment/generated-application/prepare.js +276 -0
  100. package/dist/environment/generated-application/publication.d.ts +33 -0
  101. package/dist/environment/generated-application/publication.js +547 -0
  102. package/dist/environment/generated-application/shared.d.ts +484 -0
  103. package/dist/environment/generated-application/shared.js +349 -0
  104. package/dist/environment/generated-application/surface-observation.d.ts +4 -0
  105. package/dist/environment/generated-application/surface-observation.js +69 -0
  106. package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
  107. package/dist/environment/generated-application/surface-outputs.js +389 -0
  108. package/dist/environment/generated-application/surfaces.d.ts +3 -0
  109. package/dist/environment/generated-application/surfaces.js +699 -0
  110. package/dist/environment/generated-application/sync.d.ts +6 -0
  111. package/dist/environment/generated-application/sync.js +109 -0
  112. package/dist/environment/git-observation.d.ts +183 -0
  113. package/dist/environment/git-observation.js +544 -0
  114. package/dist/environment/health-composition.d.ts +11 -0
  115. package/dist/environment/health-composition.js +628 -0
  116. package/dist/environment/host-observation.d.ts +56 -0
  117. package/dist/environment/host-observation.js +52 -0
  118. package/dist/environment/identity.d.ts +48 -0
  119. package/dist/environment/identity.js +85 -0
  120. package/dist/environment/init-application.d.ts +308 -0
  121. package/dist/environment/init-application.js +697 -0
  122. package/dist/environment/install-policy-observation.d.ts +71 -0
  123. package/dist/environment/install-policy-observation.js +284 -0
  124. package/dist/environment/install-policy.d.ts +48 -0
  125. package/dist/environment/install-policy.js +96 -0
  126. package/dist/environment/instance.d.ts +33 -0
  127. package/dist/environment/instance.js +122 -0
  128. package/dist/environment/instruction-pointer.d.ts +19 -0
  129. package/dist/environment/instruction-pointer.js +144 -0
  130. package/dist/environment/lifecycle-composition.d.ts +29 -0
  131. package/dist/environment/lifecycle-composition.js +675 -0
  132. package/dist/environment/lifecycle-stage.d.ts +115 -0
  133. package/dist/environment/lifecycle-stage.js +398 -0
  134. package/dist/environment/lifecycle.d.ts +75 -0
  135. package/dist/environment/lifecycle.js +354 -0
  136. package/dist/environment/logs.d.ts +132 -0
  137. package/dist/environment/logs.js +519 -0
  138. package/dist/environment/observations.d.ts +46 -0
  139. package/dist/environment/observations.js +344 -0
  140. package/dist/environment/operator-application.d.ts +50 -0
  141. package/dist/environment/operator-application.js +155 -0
  142. package/dist/environment/ports.d.ts +182 -0
  143. package/dist/environment/ports.js +1205 -0
  144. package/dist/environment/posture-observation.d.ts +68 -0
  145. package/dist/environment/posture-observation.js +253 -0
  146. package/dist/environment/read-composition.d.ts +27 -0
  147. package/dist/environment/read-composition.js +352 -0
  148. package/dist/environment/readiness-composition.d.ts +38 -0
  149. package/dist/environment/readiness-composition.js +130 -0
  150. package/dist/environment/reclaim.d.ts +333 -0
  151. package/dist/environment/reclaim.js +1835 -0
  152. package/dist/environment/repository-identity.d.ts +13 -0
  153. package/dist/environment/repository-identity.js +108 -0
  154. package/dist/environment/runtime-measurement-record.d.ts +38 -0
  155. package/dist/environment/runtime-measurement-record.js +111 -0
  156. package/dist/environment/runtime-measurement.d.ts +27 -0
  157. package/dist/environment/runtime-measurement.js +224 -0
  158. package/dist/environment/runtime-probe-residue.d.ts +43 -0
  159. package/dist/environment/runtime-probe-residue.js +148 -0
  160. package/dist/environment/runtime-probe.d.ts +72 -0
  161. package/dist/environment/runtime-probe.js +725 -0
  162. package/dist/environment/runtime.d.ts +505 -0
  163. package/dist/environment/runtime.js +2335 -0
  164. package/dist/environment/seed.d.ts +16 -0
  165. package/dist/environment/seed.js +43 -0
  166. package/dist/environment/selftest-application.d.ts +86 -0
  167. package/dist/environment/selftest-application.js +713 -0
  168. package/dist/environment/sensitive.d.ts +3 -0
  169. package/dist/environment/sensitive.js +48 -0
  170. package/dist/environment/setup-observation.d.ts +62 -0
  171. package/dist/environment/setup-observation.js +1473 -0
  172. package/dist/environment/setup.d.ts +43 -0
  173. package/dist/environment/setup.js +176 -0
  174. package/dist/environment/sibling-instructions.d.ts +33 -0
  175. package/dist/environment/sibling-instructions.js +224 -0
  176. package/dist/environment/sibling-registration.d.ts +45 -0
  177. package/dist/environment/sibling-registration.js +538 -0
  178. package/dist/environment/state.d.ts +371 -0
  179. package/dist/environment/state.js +2013 -0
  180. package/dist/environment/templates.d.ts +140 -0
  181. package/dist/environment/templates.js +685 -0
  182. package/dist/environment/tool-registration.d.ts +9 -0
  183. package/dist/environment/tool-registration.js +96 -0
  184. package/dist/environment/upgrade-application.d.ts +19 -0
  185. package/dist/environment/upgrade-application.js +175 -0
  186. package/dist/environment-exec/execute.d.ts +102 -0
  187. package/dist/environment-exec/execute.js +1175 -0
  188. package/dist/environment-exec/libexec-program.d.ts +6 -0
  189. package/dist/environment-exec/libexec-program.js +22 -0
  190. package/dist/environment-exec/verified-digest.d.ts +4 -0
  191. package/dist/environment-exec/verified-digest.js +16 -0
  192. package/dist/exact-keys.d.ts +7 -0
  193. package/dist/exact-keys.js +15 -0
  194. package/dist/fix-catalogue.d.ts +32 -0
  195. package/dist/fix-catalogue.js +60 -0
  196. package/dist/freshness.d.ts +29 -0
  197. package/dist/freshness.js +75 -0
  198. package/dist/generated-environment/adopt.d.ts +16 -0
  199. package/dist/generated-environment/adopt.js +275 -0
  200. package/dist/generated-environment/command.d.ts +47 -0
  201. package/dist/generated-environment/command.js +75 -0
  202. package/dist/generated-environment/transaction.d.ts +186 -0
  203. package/dist/generated-environment/transaction.js +1770 -0
  204. package/dist/grading/evaluate.d.ts +71 -0
  205. package/dist/grading/evaluate.js +403 -0
  206. package/dist/grading/grade.d.ts +33 -0
  207. package/dist/grading/grade.js +57 -0
  208. package/dist/guards/evaluator.d.ts +113 -0
  209. package/dist/guards/evaluator.js +1226 -0
  210. package/dist/guards/harness-adapter.d.ts +17 -0
  211. package/dist/guards/harness-adapter.js +57 -0
  212. package/dist/guards/host.d.ts +8 -0
  213. package/dist/guards/host.js +10 -0
  214. package/dist/guards/invocation-parser.d.ts +66 -0
  215. package/dist/guards/invocation-parser.js +595 -0
  216. package/dist/guards/local-identity.d.ts +40 -0
  217. package/dist/guards/local-identity.js +123 -0
  218. package/dist/guards/policy-pin.d.ts +13 -0
  219. package/dist/guards/policy-pin.js +175 -0
  220. package/dist/guards/protected-locations.d.ts +62 -0
  221. package/dist/guards/protected-locations.js +461 -0
  222. package/dist/guards/read-only.d.ts +37 -0
  223. package/dist/guards/read-only.js +315 -0
  224. package/dist/init/command.d.ts +40 -0
  225. package/dist/init/command.js +310 -0
  226. package/dist/init/derive.d.ts +51 -0
  227. package/dist/init/derive.js +715 -0
  228. package/dist/init/draft.d.ts +138 -0
  229. package/dist/init/draft.js +1205 -0
  230. package/dist/init/render.d.ts +35 -0
  231. package/dist/init/render.js +82 -0
  232. package/dist/init/scaffold.d.ts +53 -0
  233. package/dist/init/scaffold.js +121 -0
  234. package/dist/invocation.d.ts +13 -0
  235. package/dist/invocation.js +20 -0
  236. package/dist/package-metadata.d.ts +9 -0
  237. package/dist/package-metadata.js +19 -0
  238. package/dist/readiness.d.ts +53 -0
  239. package/dist/readiness.js +88 -0
  240. package/dist/references/named.d.ts +24 -0
  241. package/dist/references/named.js +27 -0
  242. package/dist/refusal.d.ts +15 -0
  243. package/dist/refusal.js +7 -0
  244. package/dist/registry-derivation.d.ts +31 -0
  245. package/dist/registry-derivation.js +32 -0
  246. package/dist/registry-resolve/command.d.ts +47 -0
  247. package/dist/registry-resolve/command.js +226 -0
  248. package/dist/registry-resolve/registry.d.ts +68 -0
  249. package/dist/registry-resolve/registry.js +292 -0
  250. package/dist/registry-resolve/render-shell.d.ts +18 -0
  251. package/dist/registry-resolve/render-shell.js +36 -0
  252. package/dist/repair.d.ts +29 -0
  253. package/dist/repair.js +8 -0
  254. package/dist/schema-json.d.ts +1 -0
  255. package/dist/schema-json.js +177 -0
  256. package/dist/schema.d.ts +1322 -0
  257. package/dist/schema.js +934 -0
  258. package/dist/setup/command.d.ts +4 -0
  259. package/dist/setup/command.js +4 -0
  260. package/dist/sha256.d.ts +1 -0
  261. package/dist/sha256.js +4 -0
  262. package/dist/surfaces/adoption.d.ts +41 -0
  263. package/dist/surfaces/adoption.js +217 -0
  264. package/dist/surfaces/consumer-instructions.d.ts +20 -0
  265. package/dist/surfaces/consumer-instructions.js +43 -0
  266. package/dist/surfaces/contract.d.ts +42 -0
  267. package/dist/surfaces/contract.js +169 -0
  268. package/dist/surfaces/core-declarations.d.ts +24 -0
  269. package/dist/surfaces/core-declarations.js +79 -0
  270. package/dist/surfaces/development-markers.d.ts +1 -0
  271. package/dist/surfaces/development-markers.js +18 -0
  272. package/dist/surfaces/generator-adapter.d.ts +71 -0
  273. package/dist/surfaces/generator-adapter.js +809 -0
  274. package/dist/surfaces/harness-registry.d.ts +180 -0
  275. package/dist/surfaces/harness-registry.js +117 -0
  276. package/dist/surfaces/mcp.d.ts +95 -0
  277. package/dist/surfaces/mcp.js +186 -0
  278. package/dist/surfaces/merge.d.ts +30 -0
  279. package/dist/surfaces/merge.js +105 -0
  280. package/dist/surfaces/ownership.d.ts +190 -0
  281. package/dist/surfaces/ownership.js +795 -0
  282. package/dist/surfaces/projection.d.ts +136 -0
  283. package/dist/surfaces/projection.js +681 -0
  284. package/dist/surfaces/render.d.ts +118 -0
  285. package/dist/surfaces/render.js +633 -0
  286. package/dist/surfaces/restrictions.d.ts +130 -0
  287. package/dist/surfaces/restrictions.js +447 -0
  288. package/dist/surfaces/selftest.d.ts +162 -0
  289. package/dist/surfaces/selftest.js +393 -0
  290. package/dist/surfaces/skill-contract.d.ts +85 -0
  291. package/dist/surfaces/skill-contract.js +449 -0
  292. package/dist/surfaces/sync.d.ts +57 -0
  293. package/dist/surfaces/sync.js +164 -0
  294. package/dist/team-metadata.d.ts +41 -0
  295. package/dist/team-metadata.js +512 -0
  296. package/dist/testing/gates.d.ts +91 -0
  297. package/dist/testing/gates.js +182 -0
  298. package/dist/testing/hooks.d.ts +59 -0
  299. package/dist/testing/hooks.js +139 -0
  300. package/dist/testing/verdict.d.ts +29 -0
  301. package/dist/testing/verdict.js +62 -0
  302. package/dist/work-orders/application.d.ts +99 -0
  303. package/dist/work-orders/application.js +383 -0
  304. package/dist/work-orders/composition.d.ts +124 -0
  305. package/dist/work-orders/composition.js +1010 -0
  306. package/dist/work-orders/contract.d.ts +61 -0
  307. package/dist/work-orders/contract.js +122 -0
  308. package/dist/work-orders/store.d.ts +158 -0
  309. package/dist/work-orders/store.js +197 -0
  310. package/docs/README.md +65 -0
  311. package/docs/architecture.md +136 -0
  312. package/docs/capability-matrix.md +50 -0
  313. package/docs/cli-reference.md +599 -0
  314. package/docs/command-list.md +51 -0
  315. package/docs/compose-patterns.md +99 -0
  316. package/docs/concepts.md +171 -0
  317. package/docs/configuration-essentials.md +172 -0
  318. package/docs/configuration-reference.md +621 -0
  319. package/docs/environment.md +760 -0
  320. package/docs/extending.md +43 -0
  321. package/docs/faq.md +111 -0
  322. package/docs/getting-started.md +608 -0
  323. package/docs/harness-surfaces.md +433 -0
  324. package/docs/joining-a-team.md +76 -0
  325. package/docs/release-policy.md +49 -0
  326. package/docs/safety-and-autonomy.md +419 -0
  327. package/docs/troubleshooting.md +361 -0
  328. package/docs/tutorial.md +170 -0
  329. package/docs/work-and-browser.md +254 -0
  330. package/libexec/browser-operation.cjs +186 -0
  331. package/libexec/fence-marker.cjs +101 -0
  332. package/libexec/fence-marker.d.cts +24 -0
  333. package/libexec/fenced-group-runner.cjs +77 -0
  334. package/libexec/fenced-supervisor.cjs +137 -0
  335. package/libexec/generated-filesystem.cjs +731 -0
  336. package/libexec/install-filesystem.cjs +225 -0
  337. package/libexec/rulesync-generator.NOTICE.md +1112 -0
  338. package/libexec/rulesync-generator.cjs +743 -0
  339. package/libexec/surface-generator-worker.cjs +266 -0
  340. package/libexec/surface-output-reader.cjs +99 -0
  341. package/libexec/surface-scratch-cleanup.cjs +14 -0
  342. package/libexec/validate-harness-evidence.d.mts +183 -0
  343. package/libexec/validate-harness-evidence.mjs +1312 -0
  344. package/package.json +74 -4
  345. package/surfaces/README.md +33 -0
  346. package/surfaces/agents/evaluator.agent.md +76 -0
  347. package/surfaces/guards/bash-guard.sh +48 -0
  348. package/surfaces/guards/claude.adapter.json +25 -0
  349. package/surfaces/guards/codex.adapter.json +24 -0
  350. package/surfaces/guards/opencode.adapter.json +25 -0
  351. package/surfaces/references/browser.md +63 -0
  352. package/surfaces/references/test-data-and-personas.md +84 -0
  353. package/surfaces/references/testing-tiers.md +11 -0
  354. package/surfaces/skills/cockpit-browser.skill.md +54 -0
  355. package/surfaces/skills/cockpit-explain.skill.md +32 -0
  356. package/surfaces/skills/cockpit-fix.skill.md +37 -0
  357. package/surfaces/skills/cockpit-setup.skill.md +39 -0
  358. package/surfaces/skills/cockpit-work.skill.md +34 -0
  359. package/surfaces/skills/collection.json +5 -0
  360. package/surfaces/skills/procedures/explain.md +61 -0
  361. package/surfaces/skills/procedures/fix.md +81 -0
  362. package/surfaces/skills/procedures/setup.md +379 -0
  363. package/surfaces/skills/procedures/work.md +105 -0
@@ -0,0 +1,621 @@
1
+ # Configuration reference
2
+
3
+ <!-- Generated by `npm run references`; edit its sources, not this file. -->
4
+
5
+ This generated reference is for users authoring or reviewing `cockpit.toml`. It is generated from the schema cockpit validates against, so it matches this version. For the handful of tables a typical cockpit sets, start with [Configuration essentials](configuration-essentials.md).
6
+
7
+ The same schema ships as JSON Schema in [`cockpit.schema.json`](https://github.com/b0dea/cockpit/blob/main/packages/cockpit/cockpit.schema.json), installed at `node_modules/@b00dea/cockpit/cockpit.schema.json`; point an editor at it for completion and validation as you type.
8
+
9
+ ## Defaults
10
+
11
+ The values cockpit uses for a key the configuration leaves out.
12
+
13
+ ```json
14
+ {
15
+ "cockpit": {
16
+ "siblings_root": "..",
17
+ "guide_cap": 200
18
+ },
19
+ "sibling": {
20
+ "toolchain": "none",
21
+ "guides": [
22
+ "CLAUDE.md",
23
+ "AGENTS.md"
24
+ ],
25
+ "instruction_pointer": false
26
+ },
27
+ "ports": {
28
+ "step": 100,
29
+ "count": 27
30
+ },
31
+ "guards": {
32
+ "hosted_db_hosts": [],
33
+ "vendor_endpoint_hosts": [],
34
+ "protected_branches": [
35
+ "main",
36
+ "master"
37
+ ],
38
+ "allow": [],
39
+ "deny": []
40
+ },
41
+ "mcp": {
42
+ "approved": {}
43
+ },
44
+ "work": {
45
+ "grading": "independent",
46
+ "attempt_cap": 2,
47
+ "wip_cap": 3,
48
+ "verification_timeout_seconds": 1800,
49
+ "evaluator_timeout_seconds": 900,
50
+ "gates": {}
51
+ },
52
+ "autonomy": {},
53
+ "environment": {
54
+ "resettable_volumes": [],
55
+ "generated_host_paths": [],
56
+ "compose_files": [],
57
+ "entrypoint_derivatives": [],
58
+ "install_policies": []
59
+ },
60
+ "surfaces": {
61
+ "tools": [
62
+ "claudecode",
63
+ "codexcli",
64
+ "opencode"
65
+ ],
66
+ "overlays": [],
67
+ "harnesses": [],
68
+ "bundles": [],
69
+ "adopted": []
70
+ }
71
+ }
72
+ ```
73
+
74
+ ## Tables
75
+
76
+ Each section is one TOML table: `[name]` holds one, `[[name]]` repeats. A table accepts only the keys it lists unless its rules below say otherwise. Rules are JSON Schema fragments that relate several keys of the same table. A pattern is a regular expression the value must contain a match for; `^` and `$` in it make it cover the whole value. A type that links to a shape is a table whose keys are listed once, under [Shapes](#shapes).
77
+
78
+ ### Top-level keys
79
+
80
+ | Key | Meaning | Type | Default | Constraints |
81
+ | --- | --- | --- | --- | --- |
82
+ | `unconfirmed` | Answers no person has stated yet; init writes them and doctor reports them. | array of string | | 1–11 items; each item: one of `"cockpit.name"`, `"sibling"`, `"estate.runnable"`, `"ports.bases"`, `"environment.install_policies"`, `"environment.test_data"`, `"environment.compose_files"`, `"environment.machine"`, `"environment.posture"`, `"testing"`, `"guards"` |
83
+ | `cockpit` | Identity and layout of this cockpit. | table: [`[cockpit]`](#cockpit) | | required |
84
+ | `sibling` | Product repositories the cockpit works across. | array of table: [`[[sibling]]`](#sibling) | | required; at least 1 item |
85
+ | `ports` | Port leasing for running stacks side by side. | table: [`[ports]`](#ports) | | required |
86
+ | `guards` | Rules that restrict what agents may run. | table: [`[guards]`](#guards) | `{}` | |
87
+ | `mcp` | Approval of MCP servers. | table: [`[mcp]`](#mcp) | `{}` | |
88
+ | `work` | How work orders are accepted, graded and closed. | table: [`[work]`](#work) | `{}` | |
89
+ | `autonomy` | Which decisions an agent may take without a person. | table: [`[autonomy]`](#autonomy) | `{}` | |
90
+ | `browser` | Browser automation for the stack. | table: [`[browser]`](#browser) | | |
91
+ | `testing` | Test stages and gates. | table: [`[testing]`](#testing) | | |
92
+ | `environment` | How the stack is reached, signed in to, built and kept. | table: [`[environment]`](#environment) | `{}` | |
93
+ | `surfaces` | Instructions, skills and settings generated for agent tools. | table: [`[surfaces]`](#surfaces) | `{}` | |
94
+
95
+ ### `[cockpit]`
96
+
97
+ | Key | Meaning | Type | Default | Constraints |
98
+ | --- | --- | --- | --- | --- |
99
+ | `name` | Name of this cockpit. | string | | required; pattern `^[a-z0-9][a-z0-9-]*$` |
100
+ | `siblings_root` | Directory holding the sibling checkouts, relative to the cockpit. | string | `".."` | |
101
+ | `guide_cap` | Most lines of always-loaded guidance; preflight fails above it. | integer | `200` | greater than 0; at most 9007199254740991 |
102
+
103
+ ### `[[sibling]]`
104
+
105
+ | Key | Meaning | Type | Default | Constraints |
106
+ | --- | --- | --- | --- | --- |
107
+ | `slug` | Short name of the sibling; also how the root AGENTS.md labels its copied guides. | string | | required; pattern `^[a-z0-9][a-z0-9-]*$` |
108
+ | `dir` | Checkout directory under the siblings root, or . for the siblings root itself. | string | | required; either (exactly `"."`) or (pattern [P1](#patterns)) |
109
+ | `remote` | Git remote to clone from; required when acquire is auto or manual and not allowed when none. | string | | at least 1 character |
110
+ | `branch` | Branch to check out when cloning. | string | | at least 1 character |
111
+ | `mount` | How the stack uses the checkout: always mounted, mounted under a profile, host only, or not mounted. | string | | required; either (one of `"always"`, `"host"`, `"none"`) or (pattern `^profile:[a-z0-9-]+$`) |
112
+ | `acquire` | How the checkout reaches disk: cloned by setup, cloned by a person, or not a repository. | string | | required; one of `"auto"`, `"manual"`, `"none"` |
113
+ | `var` | Name of the exported *_DIR environment variable that points at the checkout. | string | | required; pattern `^(?!(?:DOCKER_\|COMPOSE_\|LD_\|DYLD_\|LIBPATH$\|SHLIB_PATH$\|NODE_OPTIONS$\|NODE_PATH$\|BASH_ENV$\|ENV$\|PATH$\|IFS$))[A-Z][A-Z0-9_]*$` |
114
+ | `toolchain` | Toolchain that installs and tests the sibling; none for a directory of data. | string | `"none"` | one of `"node"`, `"python"`, `"ruby"`, `"go"`, `"rust"`, `"dotnet"`, `"none"` |
115
+ | `gate` | Set to operator for a lane that touches live data or local hardware; it never runs by default and asks first. | string | | exactly `"operator"` |
116
+ | `host_reason` | Why the sibling cannot join the stack; required when mount is host. | string | | at least 1 character |
117
+ | `guides` | Guide files the sibling publishes, copied into the cockpit's root AGENTS.md by sync. | array of string | `["CLAUDE.md","AGENTS.md"]` | each item: pattern [P1](#patterns) |
118
+ | `instruction_pointer` | Let setup add a pointer to the cockpit guide in this sibling, when the command line also approves it. | boolean | `false` | |
119
+ | `purpose` | What the sibling is for; printed when its checkout is missing. | string | | required; at least 1 character |
120
+ | `environment_files` | Template and instance environment file pairs the sibling needs. | array of table: [`[[sibling.environment_files]]`](#siblingenvironment_files) | | |
121
+ | `derives` | Facts about the sibling that cockpit derives rows or MCP servers from. | table: [`[sibling.derives]`](#siblingderives) | | |
122
+
123
+ - Must match `{"oneOf":[{"properties":{"acquire":{"enum":["none"]}},"not":{"required":["remote"]}},{"properties":{"acquire":{"enum":["auto","manual"]}},"required":["remote"]}]}`.
124
+ - Must match `{"anyOf":[{"properties":{"mount":{"enum":["host"]}},"required":["host_reason"]},{"properties":{"mount":{"not":{"enum":["host"]}}}}]}`.
125
+ - Must match `{"anyOf":[{"properties":{"gate":{"enum":["operator"]}},"required":["gate"]},{"not":{"anyOf":[{"properties":{"mount":{"enum":["host"]}}},{"properties":{"purpose":{"pattern":"\\b(?:[lL][iI][vV][eE]|[pP][rR][oO][dD][uU][cC][tT][iI][oO][nN]|[hH][aA][rR][dD][wW][aA][rR][eE]|[sS][iI][mM][uU][lL][aA][tT][oO][rR])\\b"}}}]}}]}`.
126
+
127
+ ### `[[sibling.environment_files]]`
128
+
129
+ | Key | Meaning | Type | Default | Constraints |
130
+ | --- | --- | --- | --- | --- |
131
+ | `template` | Tracked template file the instance is created from. | string | | required; pattern [P1](#patterns) |
132
+ | `instance` | Machine-local file created from the template and left out of version control. | string | | required; pattern [P1](#patterns) |
133
+
134
+ ### `[sibling.derives]`
135
+
136
+ | Key | Meaning | Type | Default | Constraints |
137
+ | --- | --- | --- | --- | --- |
138
+ | `mcp_sources` | MCP server declaration files this sibling publishes. | array of table: [`[[sibling.derives.mcp_sources]]`](#siblingderivesmcp_sources) | | required; 1–256 items |
139
+
140
+ ### `[[sibling.derives.mcp_sources]]`
141
+
142
+ | Key | Meaning | Type | Default | Constraints |
143
+ | --- | --- | --- | --- | --- |
144
+ | `path` | JSON file in the sibling with a top-level mcpServers object, as agent tools read from .mcp.json. | string | | required; pattern [P1](#patterns); at most 4096 characters |
145
+ | `provenance` | Where this MCP source declaration came from. | table: [`provenance` shape](#provenance-shape) | | required |
146
+
147
+ ### `[ports]`
148
+
149
+ | Key | Meaning | Type | Default | Constraints |
150
+ | --- | --- | --- | --- | --- |
151
+ | `step` | Offset between consecutive stacks' published ports. | integer | `100` | greater than 0; at most 9007199254740991 |
152
+ | `count` | Number of stacks that can run side by side. | integer | `27` | greater than 0; at most 9007199254740991 |
153
+ | `bases` | Base host port for each port variable; stack n publishes base plus n times step. | table of integer | | required; each key: pattern `^[A-Z][A-Z0-9_]*$`; each value: 1–65535 |
154
+
155
+ ### `[guards]`
156
+
157
+ | Key | Meaning | Type | Default | Constraints |
158
+ | --- | --- | --- | --- | --- |
159
+ | `hosted_db_hosts` | Hosted database host names the guards keep agents away from. | array of string | `[]` | at most 128 items; each item: pattern [P3](#patterns) |
160
+ | `vendor_endpoint_hosts` | Real vendor endpoint host names the guards keep agents away from. | array of string | `[]` | at most 128 items; each item: pattern [P3](#patterns) |
161
+ | `protected_branches` | Branches the guards keep agents from pushing to or rewriting. | array of string | `["main","master"]` | |
162
+ | `allow` | Commands allowed in addition to the built-in rules. | array of table: [`[[guards.allow]]`](#guardsallow) | `[]` | at most 64 items |
163
+ | `deny` | Commands refused in addition to the built-in rules. | array of table, one of: [`[[guards.deny]]` form 1](#guardsdeny-form-1), [`[[guards.deny]]` form 2](#guardsdeny-form-2) | `[]` | at most 64 items |
164
+
165
+ ### `[[guards.allow]]`
166
+
167
+ | Key | Meaning | Type | Default | Constraints |
168
+ | --- | --- | --- | --- | --- |
169
+ | `argv` | Command prefix, as an argument list, that is allowed. | array of string | | required; 1–32 items; each item: pattern [P4](#patterns) |
170
+ | `reason` | Why the command is allowed. | string | | required; 1–512 characters; pattern `\S`; pattern `^[^\x00-\x1f\x7f-\x9f]+$` |
171
+ | `cwd` | Allow only when run from this directory, relative to the cockpit. | string | | either (exactly `"."`) or (pattern [P1](#patterns), at most 4096 characters) |
172
+
173
+ ### `[[guards.deny]]` form 1
174
+
175
+ | Key | Meaning | Type | Default | Constraints |
176
+ | --- | --- | --- | --- | --- |
177
+ | `prefix` | Command prefix, as an argument list, that is refused. | array of string | | required; 1–32 items; each item: pattern [P4](#patterns) |
178
+ | `reason` | Why the command is refused. | string | | required; 1–512 characters; pattern `\S`; pattern `^[^\x00-\x1f\x7f-\x9f]+$` |
179
+ | `fix` | Safer command or step to suggest instead. | string | | 1–512 characters; pattern `\S`; pattern `^[^\x00-\x1f\x7f-\x9f]+$` |
180
+
181
+ ### `[[guards.deny]]` form 2
182
+
183
+ | Key | Meaning | Type | Default | Constraints |
184
+ | --- | --- | --- | --- | --- |
185
+ | `contains` | Argument sequence that is refused wherever it appears in a command. | array of string | | required; 1–32 items; each item: pattern [P4](#patterns) |
186
+ | `reason` | Why the command is refused. | string | | required; 1–512 characters; pattern `\S`; pattern `^[^\x00-\x1f\x7f-\x9f]+$` |
187
+ | `fix` | Safer command or step to suggest instead. | string | | 1–512 characters; pattern `\S`; pattern `^[^\x00-\x1f\x7f-\x9f]+$` |
188
+
189
+ ### `[mcp]`
190
+
191
+ | Key | Meaning | Type | Default | Constraints |
192
+ | --- | --- | --- | --- | --- |
193
+ | `approved` | Approved MCP servers, each mapped to the sha256 of the declaration a person reviewed; others stay disabled. | table of string | `{}` | each key: pattern `^(?=[\s\S]{0,128}$)(?:^[a-zA-Z0-9][a-zA-Z0-9_-]*$)`; each value: pattern `^[a-f0-9]{64}$` |
194
+
195
+ ### `[work]`
196
+
197
+ | Key | Meaning | Type | Default | Constraints |
198
+ | --- | --- | --- | --- | --- |
199
+ | `grading` | How an order earns done: independent (an evaluator grades it), checks (cockpit ran every criterion's check and all passed) or self (the agent reports met or unmet with a note). | string | `"independent"` | one of `"independent"`, `"checks"`, `"self"` |
200
+ | `evaluators` | Agent tools that run the independent grader for work grade and cockpit grade, tried in order: codexcli, claudecode, opencode. Defaults to the tools surfaces.tools lists that can evaluate, in that order, with the tool running the command moved last when it is detected (Claude Code or Codex), so another tool grades first. A list given here is used exactly as written. | array of string | | 1–3 items; each item: one of `"codexcli"`, `"claudecode"`, `"opencode"` |
201
+ | `attempt_cap` | Failed checks or grades before an order is blocked; may be lowered but not raised. | integer | `2` | 1–2 |
202
+ | `wip_cap` | Accepted orders that may be unfinished at once; may be lowered but not raised. | integer | `3` | 1–3 |
203
+ | `verification_timeout_seconds` | Seconds one criterion's check command may run before it is stopped and reported as not run. | integer | `1800` | 1–7200 |
204
+ | `evaluator_timeout_seconds` | Seconds one independent grading run may take before it is stopped. | integer | `900` | 1–7200 |
205
+ | `gates` | Who passes each work-order decision. | table: [`[work.gates]`](#workgates) | `{}` | |
206
+
207
+ ### `[work.gates]`
208
+
209
+ | Key | Meaning | Type | Default | Constraints |
210
+ | --- | --- | --- | --- | --- |
211
+ | `accept` | Who accepts a draft work order: agent, person or ci. Default agent. | string | | one of `"agent"`, `"person"`, `"ci"` |
212
+ | `amend` | Who accepts a changed contract. Default agent. Removing or rewriting an accepted criterion always needs a person or ci. | string | | one of `"agent"`, `"person"`, `"ci"` |
213
+ | `answer` | Who answers an open question on an order. Default agent. | string | | one of `"agent"`, `"person"`, `"ci"` |
214
+ | `signoff` | Who closes a graded order. Default agent. | string | | one of `"agent"`, `"person"`, `"ci"` |
215
+
216
+ ### `[autonomy]`
217
+
218
+ | Key | Meaning | Type | Default | Constraints |
219
+ | --- | --- | --- | --- | --- |
220
+ | `sync` | Who may run a sync that writes: agent, person or ci. Default agent. | string | | one of `"agent"`, `"person"`, `"ci"` |
221
+ | `stale_delete` | Who approves sync deleting files cockpit generated before and no longer generates. Default agent. | string | | one of `"agent"`, `"person"`, `"ci"` |
222
+ | `reset` | Who may apply a reset, which deletes stack data. Default person. | string | | one of `"agent"`, `"person"`, `"ci"` |
223
+ | `mcp_approve` | Who approves a declared MCP server: person records each digest in [mcp.approved]; agent lets sync enable every declared server as declared, so an agent that writes a sibling MCP source starts that process outside the guard. Default person. | string | | one of `"agent"`, `"person"` |
224
+
225
+ ### `[browser]`
226
+
227
+ | Key | Meaning | Type | Default | Constraints |
228
+ | --- | --- | --- | --- | --- |
229
+ | `engine` | Browser engine to drive. | string | `"chromium"` | one of `"chromium"`, `"firefox"`, `"webkit"` |
230
+ | `network_exposure` | Network rules the browser may reach beyond loopback; the default is loopback only. | string | `"<loopback>"` | pattern `^[a-z0-9.*:<>\[\],-]+$`; 1–512 characters |
231
+ | `network_exposure_reason` | Why the browser needs wider network access; required when network_exposure is wider than loopback. | string | | 1–512 characters |
232
+ | `harnesses` | Agent tools, with versions, that are wired to the browser. | array of table: [`[[browser.harnesses]]`](#browserharnesses) | | required; 1–3 items; unique items |
233
+ | `images` | Pinned container images for the browser. | table: [`[browser.images]`](#browserimages) | | required |
234
+ | `project` | Node project the browser commands load their Playwright driver from. | table: [`[browser.project]`](#browserproject) | | required |
235
+ | `endpoint` | WebSocket address of the browser server, using an allowed loopback host. | string | | format `uri` |
236
+ | `max_clients` | Most browser clients that may connect at once. | integer | | required; 1–64 |
237
+ | `proxy` | Proxy the browser reaches the application through. | table: [`[browser.proxy]`](#browserproxy) | | required |
238
+ | `resolver` | Fixed host name to address mappings the browser uses. | array of table: [`[[browser.resolver]]`](#browserresolver) | `[]` | at most 64 items |
239
+ | `authentication` | How browser sessions sign in to the application. | table: [`[browser.authentication]`](#browserauthentication) | | required |
240
+ | `data` | Statement about the data the browser touches; cockpit cannot observe it. | table: [`[browser.data]`](#browserdata) | | required |
241
+ | `request_preapproval` | Run browser tools without prompts; allowed only on isolated, non-production, non-restored data. | boolean | `false` | |
242
+ | `artifacts` | Generated host paths for browser output. | table: [`[browser.artifacts]`](#browserartifacts) | | required |
243
+
244
+ - Must match at least one of `[{"properties":{"request_preapproval":{"enum":[false]}}},{"properties":{"data":{"required":["mode","isolated","reaches_production"],"properties":{"mode":{"enum":["empty","seeded"]},"isolated":{"enum":[true]},"reaches_production":{"enum":[false]}}}}}]`.
245
+
246
+ ### `[[browser.harnesses]]`
247
+
248
+ | Key | Meaning | Type | Default | Constraints |
249
+ | --- | --- | --- | --- | --- |
250
+ | `target` | Agent tool the browser is wired to. | string | | required; one of `"claudecode"`, `"codexcli"`, `"opencode"` |
251
+ | `version` | Version of the agent tool the wiring was checked against. | string | | required; pattern `^\d+\.\d+\.\d+$` |
252
+
253
+ ### `[browser.images]`
254
+
255
+ | Key | Meaning | Type | Default | Constraints |
256
+ | --- | --- | --- | --- | --- |
257
+ | `mcp` | Image that serves the browser MCP server. | table: [`[browser.images.mcp]`](#browserimagesmcp) | | required |
258
+
259
+ ### `[browser.images.mcp]`
260
+
261
+ | Key | Meaning | Type | Default | Constraints |
262
+ | --- | --- | --- | --- | --- |
263
+ | `reference` | Image reference pinned by sha256 digest. | string | | required; pattern `^[a-z0-9][a-z0-9./:_-]*@sha256:[a-f0-9]{64}$` |
264
+ | `driver_version` | Playwright driver version the image carries. | string | | required; pattern [P5](#patterns); at most 128 characters |
265
+
266
+ ### `[browser.project]`
267
+
268
+ | Key | Meaning | Type | Default | Constraints |
269
+ | --- | --- | --- | --- | --- |
270
+ | `manifest` | package.json for the project; omit to use the one beside the lockfile. | string | | pattern [P1](#patterns) |
271
+ | `manifest_sha256` | SHA-256 of the manifest; required when manifest is set. | string | | pattern `^[a-f0-9]{64}$` |
272
+ | `lockfile` | Lockfile that pins the Playwright driver the browser commands load. | string | | required; pattern [P1](#patterns) |
273
+ | `sha256` | SHA-256 of the lockfile. | string | | required; pattern `^[a-f0-9]{64}$` |
274
+ | `driver_version` | Playwright driver version the lockfile pins. | string | | required; pattern [P5](#patterns); at most 128 characters |
275
+
276
+ ### `[browser.proxy]`
277
+
278
+ | Key | Meaning | Type | Default | Constraints |
279
+ | --- | --- | --- | --- | --- |
280
+ | `host_variable` | Port variable in [ports.bases] that leases the proxy port. | string | | pattern `^[A-Z][A-Z0-9_]*$`; at most 128 characters |
281
+ | `server_port` | Port the browser server listens on. | integer | | required; 1–65535 |
282
+ | `proxy_port` | Port the proxy listens on; differs from server_port. | integer | | required; 1–65535 |
283
+ | `allowed_hosts` | Host and port pairs the proxy allows. | array of string | | required; 1–64 items; unique items; each item: 1–260 characters |
284
+ | `bind` | Loopback address the proxy binds to. | string | `"127.0.0.1"` | one of `"127.0.0.1"`, `"::1"` |
285
+
286
+ ### `[[browser.resolver]]`
287
+
288
+ | Key | Meaning | Type | Default | Constraints |
289
+ | --- | --- | --- | --- | --- |
290
+ | `hostname` | Host name to resolve. | string | | required; pattern `^(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z][a-z0-9-]*$` |
291
+ | `address` | Address the host name resolves to. | string | | required; either (format `ipv4`, pattern `^(?:(?:25[0-5]\|2[0-4][0-9]\|1[0-9][0-9]\|[1-9][0-9]\|[0-9])\.){3}(?:25[0-5]\|2[0-4][0-9]\|1[0-9][0-9]\|[1-9][0-9]\|[0-9])$`) or (format `ipv6`, pattern `^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\|([0-9a-fA-F]{1,4}:){1,7}:\|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}\|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}\|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}\|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}\|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})\|:((:[0-9a-fA-F]{1,4}){1,7}\|:))$`) |
292
+
293
+ ### `[browser.authentication]`
294
+
295
+ | Key | Meaning | Type | Default | Constraints |
296
+ | --- | --- | --- | --- | --- |
297
+ | `policy` | Whether sessions share no sign-in, take turns on one, or each keep their own. | string | | required; one of `"none"`, `"serialized"`, `"per-worker"` |
298
+ | `states` | Saved sign-in states, one per worker. | array of table: [`[[browser.authentication.states]]`](#browserauthenticationstates) | `[]` | at most 64 items |
299
+
300
+ ### `[[browser.authentication.states]]`
301
+
302
+ | Key | Meaning | Type | Default | Constraints |
303
+ | --- | --- | --- | --- | --- |
304
+ | `worker` | Name of the worker the state belongs to. | string | | required; pattern `^[a-z0-9][a-z0-9_-]{0,63}$` |
305
+ | `path` | Saved sign-in state file under the auth artifact root. | string | | required; pattern [P1](#patterns) |
306
+
307
+ ### `[browser.data]`
308
+
309
+ | Key | Meaning | Type | Default | Constraints |
310
+ | --- | --- | --- | --- | --- |
311
+ | `mode` | What the data is: empty, seeded by the product, or restored from real data. | string | | required; one of `"empty"`, `"seeded"`, `"restored"` |
312
+ | `isolated` | True when the data is separate from anyone else's. | boolean | | required |
313
+ | `reaches_production` | True when browser actions can affect production. | boolean | | required |
314
+
315
+ ### `[browser.artifacts]`
316
+
317
+ | Key | Meaning | Type | Default | Constraints |
318
+ | --- | --- | --- | --- | --- |
319
+ | `mcp` | Generated host path for the browser MCP server's files. | string | | required; pattern [P1](#patterns) |
320
+ | `cli` | Generated host path for command-line browser output. | string | | required; pattern [P1](#patterns) |
321
+ | `auth` | Generated host path for saved sign-in state. | string | | required; pattern [P1](#patterns) |
322
+
323
+ ### `[testing]`
324
+
325
+ | Key | Meaning | Type | Default | Constraints |
326
+ | --- | --- | --- | --- | --- |
327
+ | `stages` | Commands that make up the test gates. | array of table: [`[[testing.stages]]`](#testingstages) | | required; 1–128 items |
328
+ | `gates` | Named gates that run stages before handing back changes. | array of table: [`[[testing.gates]]`](#testinggates) | | required; 1–128 items |
329
+ | `native_hooks` | How the repository's own git hooks are handled. | table: [`[testing.native_hooks]`](#testingnative_hooks) | `{"install":"inspect"}` | |
330
+ | `native_hook_policy` | Policy file for installing the repository's hooks; required for explicit-native. | table: [`[testing.native_hook_policy]`](#testingnative_hook_policy) | | |
331
+
332
+ - Must match exactly one of `[{"properties":{"native_hooks":{"properties":{"install":{"enum":["inspect"]}}}},"not":{"required":["native_hook_policy"]}},{"properties":{"native_hooks":{"properties":{"install":{"enum":["explicit-native"]}},"required":["install"]}},"required":["native_hooks","native_hook_policy"]}]`.
333
+
334
+ ### `[[testing.stages]]`
335
+
336
+ | Key | Meaning | Type | Default | Constraints |
337
+ | --- | --- | --- | --- | --- |
338
+ | `id` | Name of the stage. | string | | required; pattern `^[a-z][a-z0-9-]{0,63}$` |
339
+ | `command` | Command to run, as an argument list. | array of string | | required; 1–128 items; each item: 1–4096 characters |
340
+ | `requires_stack` | True when the stage needs the stack running. | boolean | | required |
341
+ | `timeout_seconds` | Seconds the stage may run before it is stopped and the gate reports DEGRADED. | integer | `1800` | 1–7200 |
342
+ | `select` | Arguments appended to the command when test-run --select names that kind; {value} becomes the selected value. | table: [`[testing.stages.select]`](#testingstagesselect) | | |
343
+
344
+ ### `[testing.stages.select]`
345
+
346
+ | Key | Meaning | Type | Default | Constraints |
347
+ | --- | --- | --- | --- | --- |
348
+ | `spec` | Arguments that select tests by spec; {value} becomes the selection. | array of string | | 1–32 items; each item: 1–4096 characters |
349
+ | `file` | Arguments that select tests by file; {value} becomes the selection. | array of string | | 1–32 items; each item: 1–4096 characters |
350
+ | `test` | Arguments that select tests by test name; {value} becomes the selection. | array of string | | 1–32 items; each item: 1–4096 characters |
351
+ | `route` | Arguments that select tests by route; {value} becomes the selection. | array of string | | 1–32 items; each item: 1–4096 characters |
352
+
353
+ ### `[[testing.gates]]`
354
+
355
+ | Key | Meaning | Type | Default | Constraints |
356
+ | --- | --- | --- | --- | --- |
357
+ | `id` | Name of the gate. | string | | required; pattern `^[a-z][a-z0-9-]{0,63}$` |
358
+ | `tier` | Whether the gate covers targeted changes or the full suite. | string | | required; one of `"targeted"`, `"full"` |
359
+ | `stages` | Stages the gate runs, by id. | array of string | | required; 1–128 items; each item: pattern `^[a-z][a-z0-9-]{0,63}$` |
360
+ | `changes` | Kind of change that calls for this gate. | string | | required; 1–4096 characters |
361
+
362
+ ### `[testing.native_hooks]`
363
+
364
+ | Key | Meaning | Type | Default | Constraints |
365
+ | --- | --- | --- | --- | --- |
366
+ | `install` | Inspect the repository's hooks, or install them as the policy file declares. | string | `"inspect"` | one of `"inspect"`, `"explicit-native"` |
367
+
368
+ ### `[testing.native_hook_policy]`
369
+
370
+ | Key | Meaning | Type | Default | Constraints |
371
+ | --- | --- | --- | --- | --- |
372
+ | `path` | Policy file, relative to the cockpit. | string | | required; pattern [P1](#patterns); at most 4096 characters |
373
+ | `sha256` | SHA-256 of the policy file. | string | | required; pattern `^[a-f0-9]{64}$` |
374
+
375
+ ### `[environment]`
376
+
377
+ | Key | Meaning | Type | Default | Constraints |
378
+ | --- | --- | --- | --- | --- |
379
+ | `addressing` | How the product is reached locally: by host name or by leased port. | string | | one of `"hostname"`, `"port"` |
380
+ | `authentication` | How the product signs in locally: real sign-in, bypassed, or none. | string | | one of `"real"`, `"bypassed"`, `"none"` |
381
+ | `posture_requirements` | Posture facts the product relies on, each tagged with the posture it depends on. | array of table: [`[[environment.posture_requirements]]`](#environmentposture_requirements) | | 1–128 items |
382
+ | `machine` | Least the container runtime must offer before the stack starts. | table: [`[environment.machine]`](#environmentmachine) | | |
383
+ | `resettable_volumes` | Compose volumes that reset may delete and recreate, named by their Compose key. | array of string | `[]` | unique items; each item: pattern `^[a-z0-9][a-z0-9_.-]*$` |
384
+ | `generated_host_paths` | Host paths cockpit generates and owns, relative to the cockpit. | array of string | `[]` | unique items; each item: pattern [P1](#patterns) |
385
+ | `compose_files` | Compose files, relative to the cockpit, that make up the stack; cockpit runs them as written. | array of string | `[]` | unique items; each item: pattern [P1](#patterns), pattern `^[^:]+$` |
386
+ | `entrypoint_derivatives` | Addresses derived from leased ports, such as application origins and callback URLs. | array of table: [`[[environment.entrypoint_derivatives]]`](#environmententrypoint_derivatives) | `[]` | |
387
+ | `install_policies` | The build and test commands the guard admits for each toolchain and lockfile. | array of table: [`[[environment.install_policies]]`](#environmentinstall_policies) | `[]` | |
388
+ | `seed` | Command up runs once the stack is healthy, whenever a resettable volume was created since the last successful seed. | table: [`[environment.seed]`](#environmentseed) | | |
389
+
390
+ ### `[[environment.posture_requirements]]`
391
+
392
+ | Key | Meaning | Type | Default | Constraints |
393
+ | --- | --- | --- | --- | --- |
394
+ | `requirement` | Name of the posture requirement the product relies on. | string | | required; pattern `^[a-z][a-z0-9-]*$`; 1–64 characters |
395
+ | `addressing` | Addressing posture this requirement depends on; set at least one of addressing and authentication. | string | | one of `"hostname"`, `"port"` |
396
+ | `authentication` | Authentication posture this requirement depends on; set at least one of addressing and authentication. | string | | one of `"real"`, `"bypassed"`, `"none"` |
397
+
398
+ - Must match at least one of `[{"required":["addressing"]},{"required":["authentication"]}]`.
399
+
400
+ ### `[environment.machine]`
401
+
402
+ | Key | Meaning | Type | Default | Constraints |
403
+ | --- | --- | --- | --- | --- |
404
+ | `runtime_memory_mb` | Least memory in megabytes the container runtime must offer before the stack starts. | integer | | required; greater than 0; at most 9007199254740991 |
405
+ | `runtime_cpus` | Least number of CPUs the container runtime must offer before the stack starts. | number | | required; greater than 0 |
406
+ | `free_disk_mb` | Least free disk space in megabytes the stack needs before it starts. | integer | | required; greater than 0; at most 9007199254740991 |
407
+ | `cold_start_seconds` | Seconds a first start may take; start fails and reports unhealthy beyond it. At most one hour. | integer | | required; greater than 0; at most 3600 |
408
+
409
+ ### `[[environment.entrypoint_derivatives]]`
410
+
411
+ | Key | Meaning | Type | Default | Constraints |
412
+ | --- | --- | --- | --- | --- |
413
+ | `name` | Name that identifies this entrypoint in command output. | string | | required; pattern `^[a-z0-9][a-z0-9-]*$` |
414
+ | `kind` | What the address is used for, such as an application origin or a callback URL. | string | | required; one of `"entrypoint"`, `"origin"`, `"callback_url"`, `"advertised_listener"`, `"cors_origin"`, `"public_base_url"` |
415
+ | `port` | Port-base variable from [ports.bases] whose leased port this address uses. | string | | required; pattern `^[A-Z][A-Z0-9_]*$` |
416
+ | `path` | Absolute URL path appended to the origin. | string | | required; pattern `^\/(?!\/)(?!\.{1,2}(?:\/\|$))(?!.*\/\.{1,2}(?:\/\|$))(?!.*[%\\?#\x00-\x20\x7f]).*$` |
417
+ | `hostname` | Named local URL host, a subdomain of .localhost; omit to use 127.0.0.1. | string | | pattern `^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+localhost(?![\s\S])`; at most 253 characters |
418
+ | `scheme` | URL scheme, http or https; omit to use http. | string | | one of `"http"`, `"https"` |
419
+
420
+ ### `[[environment.install_policies]]`
421
+
422
+ | Key | Meaning | Type | Default | Constraints |
423
+ | --- | --- | --- | --- | --- |
424
+ | `toolchain` | Toolchain of the siblings this policy applies to. | string | | required; one of `"node"`, `"python"`, `"ruby"`, `"go"`, `"rust"`, `"dotnet"` |
425
+ | `lockfile` | Lockfile, relative to the sibling, that selects this policy. | string | | required; pattern [P1](#patterns) |
426
+ | `build` | Build command, as an argument list, when the product owns one. | array of string | | 1–32 items; each item: pattern [P4](#patterns) |
427
+ | `test` | Test command, as an argument list, when the product owns one. | array of string | | 1–32 items; each item: pattern [P4](#patterns) |
428
+
429
+ ### `[environment.seed]`
430
+
431
+ | Key | Meaning | Type | Default | Constraints |
432
+ | --- | --- | --- | --- | --- |
433
+ | `argv` | Command, as an argument list, that fills the resettable volumes; it runs on the host in the cockpit directory with the leased ports in its environment. | array of string | | required; 1–256 items; each item: at least 1 character |
434
+ | `timeout_seconds` | Seconds the seed may run before it is stopped. | integer | | required; 1–3600 |
435
+
436
+ ### `[surfaces]`
437
+
438
+ | Key | Meaning | Type | Default | Constraints |
439
+ | --- | --- | --- | --- | --- |
440
+ | `tools` | Agent tools whose instructions, skills and settings sync writes and check compares. Defaults to the tools whose guard is measured (claudecode, codexcli, opencode); the other shipped targets are written only when listed. | array of string | `["claudecode","codexcli","opencode"]` | 1–5 items; each item: one of `"claudecode"`, `"codexcli"`, `"opencode"`, `"cursor"`, `"grokcli"` |
441
+ | `overlays` | Team-owned rules, subagents, skills and hooks added to the generated surfaces. | array of table: [`[[surfaces.overlays]]`](#surfacesoverlays) | `[]` | at most 256 items |
442
+ | `harnesses` | Agent tools beyond the shipped ones, with measured capabilities. | array of table: [`[[surfaces.harnesses]]`](#surfacesharnesses) | `[]` | at most 64 items |
443
+ | `bundles` | Bundle formats to publish, such as a Claude plugin bundle. | array of string | `[]` | at most 1 item; each item: exactly `"claudecode-plugin"` |
444
+ | `adopted` | Harness settings files cockpit merges with its own output. | array of table: [`[[surfaces.adopted]]`](#surfacesadopted) | `[]` | at most 3 items |
445
+
446
+ ### `[[surfaces.overlays]]`
447
+
448
+ | Key | Meaning | Type | Default | Constraints |
449
+ | --- | --- | --- | --- | --- |
450
+ | `name` | Name of the declaration; an overlay that reuses a core name replaces it. | string | | required; pattern `^[a-z0-9][a-z0-9-]*$`; at most 128 characters |
451
+ | `feature` | Kind of surface the overlay provides. | string | | required; one of `"rules"`, `"subagents"`, `"skills"`, `"hooks"` |
452
+ | `sources` | Files that make up the declaration. | array of table: [`[[surfaces.overlays.sources]]`](#surfacesoverlayssources) | | required; 1–256 items |
453
+ | `source` | Where the declaration was read from. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
454
+ | `replaces` | Core declaration this overlay replaces; required when the name matches a core one. | table: [`[surfaces.overlays.replaces]`](#surfacesoverlaysreplaces) | | |
455
+
456
+ ### `[[surfaces.overlays.sources]]`
457
+
458
+ | Key | Meaning | Type | Default | Constraints |
459
+ | --- | --- | --- | --- | --- |
460
+ | `path` | Path of the source file. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
461
+ | `bytes` | Full text of the source. | string | | required; at most 65536 characters |
462
+
463
+ ### `[surfaces.overlays.replaces]`
464
+
465
+ | Key | Meaning | Type | Default | Constraints |
466
+ | --- | --- | --- | --- | --- |
467
+ | `name` | Name of the core declaration being replaced. | string | | required; pattern `^[a-z0-9][a-z0-9-]*$`; at most 128 characters |
468
+ | `sha256` | SHA-256 of the original core declaration, recorded so a later change to it is reported. | string | | required; pattern `^[a-f0-9]{64}$` |
469
+
470
+ ### `[[surfaces.harnesses]]`
471
+
472
+ | Key | Meaning | Type | Default | Constraints |
473
+ | --- | --- | --- | --- | --- |
474
+ | `name` | Name of the custom harness; cannot reuse a shipped one. | string | | required; at most 128 characters; pattern `^[a-z0-9][a-z0-9-]*$`; pattern `^(?!(?:claudecode\|codexcli\|opencode\|cursor\|grokcli)$)` |
475
+ | `capabilities` | One row per surface feature saying what the harness supports. | array of table, one of: [`[[surfaces.harnesses.capabilities]]` form 1](#surfacesharnessescapabilities-form-1), [`[[surfaces.harnesses.capabilities]]` form 2](#surfacesharnessescapabilities-form-2), [`[[surfaces.harnesses.capabilities]]` form 3](#surfacesharnessescapabilities-form-3) | | required; exactly 6 items |
476
+
477
+ ### `[[surfaces.harnesses.capabilities]]` form 1
478
+
479
+ | Key | Meaning | Type | Default | Constraints |
480
+ | --- | --- | --- | --- | --- |
481
+ | `feature` | Surface feature this row describes. | string | | required; one of `"rules"`, `"mcp"`, `"subagents"`, `"skills"`, `"hooks"`, `"permissions"` |
482
+ | `measured_on` | Date the capability was measured. | string | | required; format `date`; pattern [P2](#patterns) |
483
+ | `spelling` | File the harness reads for this feature. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
484
+ | `control` | Path of the deliberately broken control file the capability was measured against. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
485
+ | `mechanism` | Code that emits the surface. | table: [`mechanism` shape](#mechanism-shape) | | required |
486
+ | `state` | Whether the harness enforces, only instructs, or lacks this capability. | string | | required; exactly `"enforced"` |
487
+ | `evidence` | Evidence that the harness enforces the capability. | table: [`[surfaces.harnesses.capabilities.evidence]`](#surfacesharnessescapabilitiesevidence) | | required |
488
+
489
+ ### `[surfaces.harnesses.capabilities.evidence]`
490
+
491
+ | Key | Meaning | Type | Default | Constraints |
492
+ | --- | --- | --- | --- | --- |
493
+ | `reference` | Probe record or file, relative to the cockpit. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
494
+ | `sha256` | SHA-256 of the evidence. | string | | required; pattern `^[a-f0-9]{64}$` |
495
+
496
+ ### `[[surfaces.harnesses.capabilities]]` form 2
497
+
498
+ | Key | Meaning | Type | Default | Constraints |
499
+ | --- | --- | --- | --- | --- |
500
+ | `feature` | Surface feature this row describes. | string | | required; one of `"rules"`, `"mcp"`, `"subagents"`, `"skills"`, `"hooks"`, `"permissions"` |
501
+ | `measured_on` | Date the capability was measured. | string | | required; format `date`; pattern [P2](#patterns) |
502
+ | `spelling` | File the harness reads for this feature. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
503
+ | `control` | Path of the deliberately broken control file the capability was measured against. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
504
+ | `mechanism` | Code that emits the surface. | table: [`mechanism` shape](#mechanism-shape) | | required |
505
+ | `state` | Whether the harness enforces, only instructs, or lacks this capability. | string | | required; exactly `"instructed"` |
506
+
507
+ ### `[[surfaces.harnesses.capabilities]]` form 3
508
+
509
+ | Key | Meaning | Type | Default | Constraints |
510
+ | --- | --- | --- | --- | --- |
511
+ | `feature` | Surface feature this row describes. | string | | required; one of `"rules"`, `"mcp"`, `"subagents"`, `"skills"`, `"hooks"`, `"permissions"` |
512
+ | `measured_on` | Date the capability was measured. | string | | required; format `date`; pattern [P2](#patterns) |
513
+ | `state` | Whether the harness enforces, only instructs, or lacks this capability. | string | | required; exactly `"unavailable"` |
514
+ | `reason` | Why the capability is unavailable. | string | | required; pattern `\S`; 1–4096 characters |
515
+
516
+ ### `[[surfaces.adopted]]`
517
+
518
+ | Key | Meaning | Type | Default | Constraints |
519
+ | --- | --- | --- | --- | --- |
520
+ | `path` | Harness settings file that was adopted. | string | | required; one of `".claude/settings.json"`, `".codex/config.toml"`, `".codex/hooks.json"` |
521
+ | `source` | Where the adopted copy now lives, under cockpit/adopted/. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
522
+ | `sha256` | SHA-256 of the bytes that were moved, as a record for review. | string | | required; pattern `^[a-f0-9]{64}$` |
523
+ | `adopted_on` | Date the file was adopted. | string | | required; format `date`; pattern [P2](#patterns) |
524
+ | `provenance` | Where the adoption came from; its kind must be declared. | table: [`provenance` shape](#provenance-shape) | | required |
525
+
526
+ ## Shapes
527
+
528
+ These tables recur in several places; each place links here instead of repeating the keys.
529
+
530
+ ### `mechanism` shape
531
+
532
+ | Key | Meaning | Type | Default | Constraints |
533
+ | --- | --- | --- | --- | --- |
534
+ | `module` | Module that implements the capability. | string | | required; pattern [P1](#patterns); pattern [P6](#patterns); at most 4096 characters |
535
+ | `export` | Export of the module that implements the capability. | string | | required; pattern `^[A-Za-z_$][A-Za-z0-9_$]*$`; at most 128 characters |
536
+
537
+ ### `provenance` shape
538
+
539
+ | Key | Meaning | Type | Default | Constraints |
540
+ | --- | --- | --- | --- | --- |
541
+ | `source` | File or place the value came from, relative to the repository. | string | | required; pattern [P1](#patterns); at most 4096 characters |
542
+ | `observed_on` | Date the source was looked at; required unless kind is declared. | string | | format `date`; pattern [P2](#patterns) |
543
+ | `kind` | How the value was established: declared by this file, measured, or inferred. | string | | required; one of `"declared"`, `"measured"`, `"inferred"` |
544
+ | `reason` | Why the value is what it is. | string | | required; pattern `\S`; 1–4096 characters |
545
+ | `confirmed` | Set to true once a person has confirmed an inferred value; inferred values require it. | boolean | | |
546
+
547
+ - Must match at least one of `[{"properties":{"kind":{"enum":["declared"]}}},{"properties":{"kind":{"enum":["measured"]}},"required":["observed_on"]},{"properties":{"kind":{"enum":["inferred"]},"confirmed":{"enum":[true]}},"required":["confirmed","observed_on"]}]`.
548
+
549
+ ## Patterns
550
+
551
+ Long patterns that several keys share, cited by name in the tables.
552
+
553
+ | Pattern | Regular expression |
554
+ | --- | --- |
555
+ | P1 | `^(?!\/)(?![A-Za-z][A-Za-z0-9+.-]*:)(?!.*(?:^\|\/)\.{1,2}(?:\/\|$))(?!.*\\)(?:[^/\x00-\x1f\x7f]+\/)*[^/\x00-\x1f\x7f]+$` |
556
+ | P2 | `^(?:(?:\d\d[2468][048]\|\d\d[13579][26]\|\d\d0[48]\|[02468][048]00\|[13579][26]00)-02-29\|\d{4}-(?:(?:0[13578]\|1[02])-(?:0[1-9]\|[12]\d\|3[01])\|(?:0[469]\|11)-(?:0[1-9]\|[12]\d\|30)\|(?:02)-(?:0[1-9]\|1\d\|2[0-8])))$` |
557
+ | P3 | `^(?:\*\.)?(?=[a-z0-9.-]{1,253}(?![\s\S]))[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*(?![\s\S])` |
558
+ | P4 | `^[^\x00-\x1f\x7f-\x9f\uD800-\uDFFF]{1,128}(?![\s\S])` |
559
+ | P5 | `^(?:0\|[1-9]\d*)\.(?:0\|[1-9]\d*)\.(?:0\|[1-9]\d*)(?:-(?:0\|[1-9]\d*\|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0\|[1-9]\d*\|\d*[A-Za-z-][0-9A-Za-z-]*))*)?$` |
560
+ | P6 | `^(?!.*(?:^\|\/)(?:\.git\|internal\|node_modules)(?:\/\|$)).+$` |
561
+
562
+ ## Checks beyond the schema
563
+
564
+ cockpit checks these rules when it loads the configuration (`x-cockpit-runtime-checks` in the JSON Schema). An editor validating against the JSON Schema does not report the ones marked in the last column (`x-cockpit-editor-limitations`).
565
+
566
+ | Path | Rule | Not reported by editors |
567
+ | --- | --- | --- |
568
+ | `sibling[].slug` | `unique` | |
569
+ | `sibling[].dir` | `unique` | |
570
+ | `sibling[].var` | `unique` | |
571
+ | `sibling[].environment_files[].instance` | `unique` | yes |
572
+ | `environment.resettable_volumes[]` | `unique` | |
573
+ | `environment.resettable_volumes[]` | `declared_compose_volume_key` | |
574
+ | `environment.generated_host_paths[]` | `unique` | |
575
+ | `environment.compose_files[]` | `unique` | |
576
+ | `environment.entrypoint_derivatives[].name` | `unique` | yes |
577
+ | `environment.install_policies[].toolchain+lockfile` | `unique` | yes |
578
+ | `environment.posture_requirements[].requirement` | `unique` | yes |
579
+ | `environment.entrypoint_derivatives[].port` | `declared_in_ports.bases` | yes |
580
+ | `browser.artifacts` | `exact_environment.generated_host_paths_coverage` | yes |
581
+ | `browser` | `matches_environment_addressing_authentication_and_client_cap` | yes |
582
+ | `browser.images` | `mcp_driver_shares_major_minor_with_project_driver` | yes |
583
+ | `testing.gates[].stages[]` | `references_declared_testing_stage` | yes |
584
+ | `sibling[].environment_files[]` | `template_and_instance_differ` | yes |
585
+ | `sibling[].derives.mcp_sources[].path` | `unique_within_sibling` | yes |
586
+ | `environment.seed` | `requires_resettable_volumes` | yes |
587
+ | `ports` | `count_times_base_count_within_shared_input_budget` (limit 4096) | |
588
+ | `surfaces.overlays[].name` | `unique` | yes |
589
+ | `surfaces.overlays[].sources[].path` | `unique` | yes |
590
+ | `surfaces.overlays[].sources` | `feature_namespace_and_complete_skill_definitions` | yes |
591
+ | `surfaces.overlays[].sources[].bytes` | `utf8_byte_length_at_most_65536` | yes |
592
+ | `surfaces.overlays[].replaces.name` | `matches_declaration_name` | yes |
593
+ | `surfaces.harnesses[].name` | `unique` | yes |
594
+ | `surfaces.harnesses[].capabilities` | `one_row_per_surface_feature` | yes |
595
+ | `surfaces.harnesses[].capabilities[].spelling` | `unique_when_emitted` | yes |
596
+ | `surfaces.adopted[].path` | `unique` | yes |
597
+ | `surfaces.adopted[].source` | `equals_cockpit/adopted/<path>` | yes |
598
+ | `surfaces.adopted[].provenance.kind` | `declared` | yes |
599
+
600
+ ## Skill size limits
601
+
602
+ Agent tools load every skill's frontmatter into each session and its entry point whenever the skill is used, so cockpit caps both and keeps the detail in a procedure file the agent reads only when it needs it. The limits come from `packages/cockpit/surfaces/skills/collection.json`, SHA-256 `d5ae65d3f69fbb6a33db2e8a63f93b936a37c8c0566cabdc3f248de6018ed7da`.
603
+
604
+ | Target | Measured as | Limit | Detail moved to |
605
+ | --- | --- | --- | --- |
606
+ | claudecode | frontmatter_bytes | 8192 | each skill's procedure |
607
+ | codexcli | frontmatter_bytes | 8192 | each skill's procedure |
608
+ | opencode | frontmatter_bytes | 8192 | each skill's procedure |
609
+ | cursor | frontmatter_bytes | 8192 | each skill's procedure |
610
+ | grokcli | frontmatter_bytes | 8192 | each skill's procedure |
611
+
612
+ | Skill entry point | Measured as | Limit | Detail moved to |
613
+ | --- | --- | --- | --- |
614
+ | `packages/cockpit/surfaces/skills/cockpit-setup.skill.md` | lines | 14 | `packages/cockpit/surfaces/skills/procedures/setup.md` |
615
+ | `packages/cockpit/surfaces/skills/cockpit-explain.skill.md` | lines | 7 | `packages/cockpit/surfaces/skills/procedures/explain.md` |
616
+ | `packages/cockpit/surfaces/skills/cockpit-fix.skill.md` | lines | 12 | `packages/cockpit/surfaces/skills/procedures/fix.md` |
617
+ | `packages/cockpit/surfaces/skills/cockpit-work.skill.md` | lines | 9 | `packages/cockpit/surfaces/skills/procedures/work.md` |
618
+
619
+ Each procedure is read on demand and has no size limit: `packages/cockpit/surfaces/skills/procedures/setup.md` (SHA-256 `0ef32e4d7d2304d5f9b150a59e90edbd825159386d89ee0ea19fe5142c06e366`), `packages/cockpit/surfaces/skills/procedures/explain.md` (SHA-256 `dce839b290d2a584fc5592c895c20425414e9201a4c35c2460ff0539d545f2bb`), `packages/cockpit/surfaces/skills/procedures/fix.md` (SHA-256 `a91365d5a79404d506e95a7d7a64fa50460dfc842265d1040402185767f527af`) and `packages/cockpit/surfaces/skills/procedures/work.md` (SHA-256 `b3e6b8de3a249e73e65f84624c991416933086308073ff979f10632aae988791`).
620
+
621
+ <!-- cockpit:ref schema=cockpit.guide_cap --> `cockpit.guide_cap` limits always-loaded guidance to 200 lines by default. The measured cost depends on each configuration's sibling guides, so it is not listed here.