@b00dea/cockpit 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/CHANGELOG.md +474 -0
  2. package/LICENSE +21 -0
  3. package/README.md +25 -2
  4. package/bin/cockpit.mjs +33 -0
  5. package/cockpit.schema.json +2644 -0
  6. package/dist/autonomy.d.ts +45 -0
  7. package/dist/autonomy.js +173 -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 +117 -0
  11. package/dist/browser/commands.js +453 -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 +118 -0
  17. package/dist/browser/runtime.js +186 -0
  18. package/dist/browser/surfaces.d.ts +141 -0
  19. package/dist/browser/surfaces.js +561 -0
  20. package/dist/browser/ui-gate.d.ts +15 -0
  21. package/dist/browser/ui-gate.js +18 -0
  22. package/dist/canonical-json.d.ts +2 -0
  23. package/dist/canonical-json.js +5 -0
  24. package/dist/cli-guard.d.ts +5 -0
  25. package/dist/cli-guard.js +71 -0
  26. package/dist/cli-main.d.ts +176 -0
  27. package/dist/cli-main.js +1584 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.js +16 -0
  30. package/dist/command-table.d.ts +121 -0
  31. package/dist/command-table.js +664 -0
  32. package/dist/config/load.d.ts +183 -0
  33. package/dist/config/load.js +367 -0
  34. package/dist/config/sibling-toml.d.ts +48 -0
  35. package/dist/config/sibling-toml.js +160 -0
  36. package/dist/config/surface-tools-toml.d.ts +9 -0
  37. package/dist/config/surface-tools-toml.js +37 -0
  38. package/dist/config/unconfirmed-toml.d.ts +9 -0
  39. package/dist/config/unconfirmed-toml.js +29 -0
  40. package/dist/config/verified-write.d.ts +43 -0
  41. package/dist/config/verified-write.js +89 -0
  42. package/dist/diagnostics.d.ts +26 -0
  43. package/dist/diagnostics.js +344 -0
  44. package/dist/docs/check.d.ts +16 -0
  45. package/dist/docs/check.js +197 -0
  46. package/dist/docs/decision-record.d.ts +34 -0
  47. package/dist/docs/decision-record.js +135 -0
  48. package/dist/docs/decisions.d.ts +16 -0
  49. package/dist/docs/decisions.js +103 -0
  50. package/dist/docs/markdown.d.ts +36 -0
  51. package/dist/docs/markdown.js +88 -0
  52. package/dist/docs/references.d.ts +32 -0
  53. package/dist/docs/references.js +148 -0
  54. package/dist/emit.d.ts +22 -0
  55. package/dist/emit.js +43 -0
  56. package/dist/entrypoint-kinds.d.ts +3 -0
  57. package/dist/entrypoint-kinds.js +11 -0
  58. package/dist/environment/application/confirm.d.ts +35 -0
  59. package/dist/environment/application/confirm.js +122 -0
  60. package/dist/environment/application/destructive.d.ts +6 -0
  61. package/dist/environment/application/destructive.js +429 -0
  62. package/dist/environment/application/doctor.d.ts +94 -0
  63. package/dist/environment/application/doctor.js +247 -0
  64. package/dist/environment/application/guard.d.ts +49 -0
  65. package/dist/environment/application/guard.js +677 -0
  66. package/dist/environment/application/health.d.ts +143 -0
  67. package/dist/environment/application/health.js +385 -0
  68. package/dist/environment/application/lifecycle-context.d.ts +235 -0
  69. package/dist/environment/application/lifecycle-context.js +154 -0
  70. package/dist/environment/application/lifecycle-state.d.ts +25 -0
  71. package/dist/environment/application/lifecycle-state.js +202 -0
  72. package/dist/environment/application/lifecycle.d.ts +18 -0
  73. package/dist/environment/application/lifecycle.js +737 -0
  74. package/dist/environment/application/logs.d.ts +45 -0
  75. package/dist/environment/application/logs.js +127 -0
  76. package/dist/environment/application/services.d.ts +60 -0
  77. package/dist/environment/application/services.js +89 -0
  78. package/dist/environment/application/setup.d.ts +129 -0
  79. package/dist/environment/application/setup.js +741 -0
  80. package/dist/environment/application/shared.d.ts +11 -0
  81. package/dist/environment/application/shared.js +61 -0
  82. package/dist/environment/application/siblings.d.ts +43 -0
  83. package/dist/environment/application/siblings.js +269 -0
  84. package/dist/environment/claims.d.ts +389 -0
  85. package/dist/environment/claims.js +1701 -0
  86. package/dist/environment/codex-hook-trust.d.ts +11 -0
  87. package/dist/environment/codex-hook-trust.js +185 -0
  88. package/dist/environment/compose-environment.d.ts +1 -0
  89. package/dist/environment/compose-environment.js +6 -0
  90. package/dist/environment/compose-ownership.d.ts +21 -0
  91. package/dist/environment/compose-ownership.js +117 -0
  92. package/dist/environment/compose-topology.d.ts +125 -0
  93. package/dist/environment/compose-topology.js +490 -0
  94. package/dist/environment/contract.d.ts +522 -0
  95. package/dist/environment/contract.js +794 -0
  96. package/dist/environment/declaration.d.ts +14 -0
  97. package/dist/environment/declaration.js +39 -0
  98. package/dist/environment/destructive-composition.d.ts +29 -0
  99. package/dist/environment/destructive-composition.js +333 -0
  100. package/dist/environment/docker-daemon.d.ts +30 -0
  101. package/dist/environment/docker-daemon.js +78 -0
  102. package/dist/environment/docker-endpoint.d.ts +10 -0
  103. package/dist/environment/docker-endpoint.js +19 -0
  104. package/dist/environment/env-schema-observation.d.ts +46 -0
  105. package/dist/environment/env-schema-observation.js +241 -0
  106. package/dist/environment/evidence.d.ts +136 -0
  107. package/dist/environment/evidence.js +437 -0
  108. package/dist/environment/executable.d.ts +38 -0
  109. package/dist/environment/executable.js +190 -0
  110. package/dist/environment/generated-application/authorities.d.ts +5 -0
  111. package/dist/environment/generated-application/authorities.js +61 -0
  112. package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
  113. package/dist/environment/generated-application/bootstrap-skill.js +328 -0
  114. package/dist/environment/generated-application/check.d.ts +13 -0
  115. package/dist/environment/generated-application/check.js +191 -0
  116. package/dist/environment/generated-application/custom-surface.d.ts +26 -0
  117. package/dist/environment/generated-application/custom-surface.js +289 -0
  118. package/dist/environment/generated-application/prepare.d.ts +29 -0
  119. package/dist/environment/generated-application/prepare.js +278 -0
  120. package/dist/environment/generated-application/publication.d.ts +33 -0
  121. package/dist/environment/generated-application/publication.js +547 -0
  122. package/dist/environment/generated-application/shared.d.ts +492 -0
  123. package/dist/environment/generated-application/shared.js +354 -0
  124. package/dist/environment/generated-application/surface-observation.d.ts +4 -0
  125. package/dist/environment/generated-application/surface-observation.js +69 -0
  126. package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
  127. package/dist/environment/generated-application/surface-outputs.js +400 -0
  128. package/dist/environment/generated-application/surfaces.d.ts +3 -0
  129. package/dist/environment/generated-application/surfaces.js +704 -0
  130. package/dist/environment/generated-application/sync.d.ts +6 -0
  131. package/dist/environment/generated-application/sync.js +124 -0
  132. package/dist/environment/git-observation.d.ts +202 -0
  133. package/dist/environment/git-observation.js +553 -0
  134. package/dist/environment/health-composition.d.ts +12 -0
  135. package/dist/environment/health-composition.js +645 -0
  136. package/dist/environment/host-observation.d.ts +56 -0
  137. package/dist/environment/host-observation.js +52 -0
  138. package/dist/environment/identity.d.ts +48 -0
  139. package/dist/environment/identity.js +85 -0
  140. package/dist/environment/init-application.d.ts +333 -0
  141. package/dist/environment/init-application.js +726 -0
  142. package/dist/environment/install-policy-observation.d.ts +71 -0
  143. package/dist/environment/install-policy-observation.js +284 -0
  144. package/dist/environment/install-policy.d.ts +48 -0
  145. package/dist/environment/install-policy.js +96 -0
  146. package/dist/environment/instance.d.ts +33 -0
  147. package/dist/environment/instance.js +122 -0
  148. package/dist/environment/instruction-pointer.d.ts +19 -0
  149. package/dist/environment/instruction-pointer.js +144 -0
  150. package/dist/environment/lifecycle-composition.d.ts +31 -0
  151. package/dist/environment/lifecycle-composition.js +742 -0
  152. package/dist/environment/lifecycle-stage.d.ts +120 -0
  153. package/dist/environment/lifecycle-stage.js +408 -0
  154. package/dist/environment/lifecycle.d.ts +75 -0
  155. package/dist/environment/lifecycle.js +354 -0
  156. package/dist/environment/logs.d.ts +132 -0
  157. package/dist/environment/logs.js +519 -0
  158. package/dist/environment/map-limit.d.ts +2 -0
  159. package/dist/environment/map-limit.js +13 -0
  160. package/dist/environment/mcp-observation.d.ts +9 -0
  161. package/dist/environment/mcp-observation.js +46 -0
  162. package/dist/environment/observations.d.ts +46 -0
  163. package/dist/environment/observations.js +346 -0
  164. package/dist/environment/operator-application.d.ts +79 -0
  165. package/dist/environment/operator-application.js +197 -0
  166. package/dist/environment/ports.d.ts +182 -0
  167. package/dist/environment/ports.js +1205 -0
  168. package/dist/environment/posture-observation.d.ts +68 -0
  169. package/dist/environment/posture-observation.js +253 -0
  170. package/dist/environment/presence.d.ts +4 -0
  171. package/dist/environment/presence.js +26 -0
  172. package/dist/environment/read-composition.d.ts +32 -0
  173. package/dist/environment/read-composition.js +397 -0
  174. package/dist/environment/readiness-composition.d.ts +57 -0
  175. package/dist/environment/readiness-composition.js +151 -0
  176. package/dist/environment/reclaim.d.ts +370 -0
  177. package/dist/environment/reclaim.js +1940 -0
  178. package/dist/environment/repository-identity.d.ts +13 -0
  179. package/dist/environment/repository-identity.js +108 -0
  180. package/dist/environment/runtime-measurement-record.d.ts +38 -0
  181. package/dist/environment/runtime-measurement-record.js +111 -0
  182. package/dist/environment/runtime-measurement.d.ts +27 -0
  183. package/dist/environment/runtime-measurement.js +224 -0
  184. package/dist/environment/runtime-probe-residue.d.ts +43 -0
  185. package/dist/environment/runtime-probe-residue.js +148 -0
  186. package/dist/environment/runtime-probe.d.ts +72 -0
  187. package/dist/environment/runtime-probe.js +725 -0
  188. package/dist/environment/runtime.d.ts +551 -0
  189. package/dist/environment/runtime.js +2405 -0
  190. package/dist/environment/seed.d.ts +16 -0
  191. package/dist/environment/seed.js +43 -0
  192. package/dist/environment/selftest-application.d.ts +86 -0
  193. package/dist/environment/selftest-application.js +713 -0
  194. package/dist/environment/sensitive.d.ts +3 -0
  195. package/dist/environment/sensitive.js +48 -0
  196. package/dist/environment/served-checkout-grants.d.ts +53 -0
  197. package/dist/environment/served-checkout-grants.js +182 -0
  198. package/dist/environment/setup-observation.d.ts +62 -0
  199. package/dist/environment/setup-observation.js +1473 -0
  200. package/dist/environment/setup.d.ts +43 -0
  201. package/dist/environment/setup.js +176 -0
  202. package/dist/environment/sibling-checkouts.d.ts +119 -0
  203. package/dist/environment/sibling-checkouts.js +254 -0
  204. package/dist/environment/sibling-instructions.d.ts +33 -0
  205. package/dist/environment/sibling-instructions.js +224 -0
  206. package/dist/environment/sibling-observation.d.ts +27 -0
  207. package/dist/environment/sibling-observation.js +45 -0
  208. package/dist/environment/sibling-pull.d.ts +23 -0
  209. package/dist/environment/sibling-pull.js +95 -0
  210. package/dist/environment/sibling-registration.d.ts +45 -0
  211. package/dist/environment/sibling-registration.js +538 -0
  212. package/dist/environment/stack-inputs.d.ts +18 -0
  213. package/dist/environment/stack-inputs.js +210 -0
  214. package/dist/environment/stack-inventory-prune.d.ts +31 -0
  215. package/dist/environment/stack-inventory-prune.js +129 -0
  216. package/dist/environment/stack-inventory-report.d.ts +44 -0
  217. package/dist/environment/stack-inventory-report.js +78 -0
  218. package/dist/environment/stack-inventory.d.ts +94 -0
  219. package/dist/environment/stack-inventory.js +418 -0
  220. package/dist/environment/state.d.ts +410 -0
  221. package/dist/environment/state.js +2153 -0
  222. package/dist/environment/templates.d.ts +140 -0
  223. package/dist/environment/templates.js +685 -0
  224. package/dist/environment/tool-registration.d.ts +9 -0
  225. package/dist/environment/tool-registration.js +92 -0
  226. package/dist/environment/upgrade-application.d.ts +19 -0
  227. package/dist/environment/upgrade-application.js +175 -0
  228. package/dist/environment-exec/execute.d.ts +105 -0
  229. package/dist/environment-exec/execute.js +1179 -0
  230. package/dist/environment-exec/libexec-program.d.ts +6 -0
  231. package/dist/environment-exec/libexec-program.js +22 -0
  232. package/dist/environment-exec/verified-digest.d.ts +4 -0
  233. package/dist/environment-exec/verified-digest.js +16 -0
  234. package/dist/exact-keys.d.ts +7 -0
  235. package/dist/exact-keys.js +15 -0
  236. package/dist/fix-catalogue.d.ts +32 -0
  237. package/dist/fix-catalogue.js +60 -0
  238. package/dist/freshness.d.ts +29 -0
  239. package/dist/freshness.js +75 -0
  240. package/dist/generated-environment/adopt.d.ts +16 -0
  241. package/dist/generated-environment/adopt.js +271 -0
  242. package/dist/generated-environment/command.d.ts +47 -0
  243. package/dist/generated-environment/command.js +75 -0
  244. package/dist/generated-environment/transaction.d.ts +186 -0
  245. package/dist/generated-environment/transaction.js +1770 -0
  246. package/dist/grading/evaluate.d.ts +71 -0
  247. package/dist/grading/evaluate.js +403 -0
  248. package/dist/grading/grade.d.ts +33 -0
  249. package/dist/grading/grade.js +57 -0
  250. package/dist/guards/answer-confirmation.d.ts +41 -0
  251. package/dist/guards/answer-confirmation.js +109 -0
  252. package/dist/guards/evaluator.d.ts +130 -0
  253. package/dist/guards/evaluator.js +1258 -0
  254. package/dist/guards/harness-adapter.d.ts +17 -0
  255. package/dist/guards/harness-adapter.js +57 -0
  256. package/dist/guards/host.d.ts +8 -0
  257. package/dist/guards/host.js +10 -0
  258. package/dist/guards/invocation-parser.d.ts +66 -0
  259. package/dist/guards/invocation-parser.js +595 -0
  260. package/dist/guards/local-identity.d.ts +44 -0
  261. package/dist/guards/local-identity.js +129 -0
  262. package/dist/guards/policy-change.d.ts +43 -0
  263. package/dist/guards/policy-change.js +159 -0
  264. package/dist/guards/policy-pin.d.ts +13 -0
  265. package/dist/guards/policy-pin.js +177 -0
  266. package/dist/guards/protected-locations.d.ts +62 -0
  267. package/dist/guards/protected-locations.js +461 -0
  268. package/dist/guards/read-only.d.ts +37 -0
  269. package/dist/guards/read-only.js +315 -0
  270. package/dist/init/command.d.ts +41 -0
  271. package/dist/init/command.js +330 -0
  272. package/dist/init/derive.d.ts +53 -0
  273. package/dist/init/derive.js +819 -0
  274. package/dist/init/draft.d.ts +140 -0
  275. package/dist/init/draft.js +1228 -0
  276. package/dist/init/render.d.ts +47 -0
  277. package/dist/init/render.js +104 -0
  278. package/dist/init/scaffold.d.ts +53 -0
  279. package/dist/init/scaffold.js +121 -0
  280. package/dist/invocation.d.ts +13 -0
  281. package/dist/invocation.js +20 -0
  282. package/dist/package-metadata.d.ts +9 -0
  283. package/dist/package-metadata.js +19 -0
  284. package/dist/readiness.d.ts +53 -0
  285. package/dist/readiness.js +88 -0
  286. package/dist/references/named.d.ts +24 -0
  287. package/dist/references/named.js +27 -0
  288. package/dist/refusal.d.ts +15 -0
  289. package/dist/refusal.js +7 -0
  290. package/dist/registry-derivation.d.ts +31 -0
  291. package/dist/registry-derivation.js +32 -0
  292. package/dist/registry-resolve/command.d.ts +47 -0
  293. package/dist/registry-resolve/command.js +226 -0
  294. package/dist/registry-resolve/registry.d.ts +68 -0
  295. package/dist/registry-resolve/registry.js +292 -0
  296. package/dist/registry-resolve/render-shell.d.ts +18 -0
  297. package/dist/registry-resolve/render-shell.js +36 -0
  298. package/dist/repair.d.ts +29 -0
  299. package/dist/repair.js +8 -0
  300. package/dist/repository-path.d.ts +9 -0
  301. package/dist/repository-path.js +16 -0
  302. package/dist/schema-json.d.ts +1 -0
  303. package/dist/schema-json.js +177 -0
  304. package/dist/schema.d.ts +1289 -0
  305. package/dist/schema.js +985 -0
  306. package/dist/setup/command.d.ts +4 -0
  307. package/dist/setup/command.js +4 -0
  308. package/dist/sha256.d.ts +1 -0
  309. package/dist/sha256.js +4 -0
  310. package/dist/surfaces/adoption.d.ts +41 -0
  311. package/dist/surfaces/adoption.js +217 -0
  312. package/dist/surfaces/consumer-instructions.d.ts +20 -0
  313. package/dist/surfaces/consumer-instructions.js +43 -0
  314. package/dist/surfaces/contract.d.ts +42 -0
  315. package/dist/surfaces/contract.js +169 -0
  316. package/dist/surfaces/core-declarations.d.ts +24 -0
  317. package/dist/surfaces/core-declarations.js +79 -0
  318. package/dist/surfaces/development-markers.d.ts +1 -0
  319. package/dist/surfaces/development-markers.js +18 -0
  320. package/dist/surfaces/generator-adapter.d.ts +71 -0
  321. package/dist/surfaces/generator-adapter.js +809 -0
  322. package/dist/surfaces/harness-registry.d.ts +260 -0
  323. package/dist/surfaces/harness-registry.js +146 -0
  324. package/dist/surfaces/mcp.d.ts +145 -0
  325. package/dist/surfaces/mcp.js +349 -0
  326. package/dist/surfaces/merge.d.ts +30 -0
  327. package/dist/surfaces/merge.js +105 -0
  328. package/dist/surfaces/ownership.d.ts +190 -0
  329. package/dist/surfaces/ownership.js +795 -0
  330. package/dist/surfaces/projection.d.ts +136 -0
  331. package/dist/surfaces/projection.js +716 -0
  332. package/dist/surfaces/render.d.ts +79 -0
  333. package/dist/surfaces/render.js +636 -0
  334. package/dist/surfaces/restrictions.d.ts +130 -0
  335. package/dist/surfaces/restrictions.js +447 -0
  336. package/dist/surfaces/selftest.d.ts +162 -0
  337. package/dist/surfaces/selftest.js +393 -0
  338. package/dist/surfaces/skill-contract.d.ts +85 -0
  339. package/dist/surfaces/skill-contract.js +449 -0
  340. package/dist/surfaces/sync.d.ts +57 -0
  341. package/dist/surfaces/sync.js +164 -0
  342. package/dist/team-metadata.d.ts +41 -0
  343. package/dist/team-metadata.js +513 -0
  344. package/dist/testing/gates.d.ts +91 -0
  345. package/dist/testing/gates.js +182 -0
  346. package/dist/testing/hooks.d.ts +59 -0
  347. package/dist/testing/hooks.js +139 -0
  348. package/dist/testing/test-protection.d.ts +34 -0
  349. package/dist/testing/test-protection.js +137 -0
  350. package/dist/testing/verdict.d.ts +29 -0
  351. package/dist/testing/verdict.js +62 -0
  352. package/dist/testing/weakening.d.ts +15 -0
  353. package/dist/testing/weakening.js +30 -0
  354. package/dist/work-orders/application-closure.d.ts +7 -0
  355. package/dist/work-orders/application-closure.js +76 -0
  356. package/dist/work-orders/application-context.d.ts +162 -0
  357. package/dist/work-orders/application-context.js +137 -0
  358. package/dist/work-orders/application-decisions.d.ts +27 -0
  359. package/dist/work-orders/application-decisions.js +121 -0
  360. package/dist/work-orders/application-grading.d.ts +11 -0
  361. package/dist/work-orders/application-grading.js +212 -0
  362. package/dist/work-orders/application.d.ts +6 -0
  363. package/dist/work-orders/application.js +223 -0
  364. package/dist/work-orders/composition.d.ts +101 -0
  365. package/dist/work-orders/composition.js +1202 -0
  366. package/dist/work-orders/contract.d.ts +77 -0
  367. package/dist/work-orders/contract.js +140 -0
  368. package/dist/work-orders/decisions.d.ts +23 -0
  369. package/dist/work-orders/decisions.js +55 -0
  370. package/dist/work-orders/store.d.ts +207 -0
  371. package/dist/work-orders/store.js +291 -0
  372. package/docs/README.md +68 -0
  373. package/docs/architecture.md +136 -0
  374. package/docs/capability-matrix.md +58 -0
  375. package/docs/cli-reference.md +807 -0
  376. package/docs/command-list.md +62 -0
  377. package/docs/compose-patterns.md +99 -0
  378. package/docs/concepts.md +173 -0
  379. package/docs/configuration-essentials.md +177 -0
  380. package/docs/configuration-reference.md +636 -0
  381. package/docs/docs-check.md +76 -0
  382. package/docs/environment.md +948 -0
  383. package/docs/extending.md +43 -0
  384. package/docs/faq.md +113 -0
  385. package/docs/getting-started.md +692 -0
  386. package/docs/harness-surfaces.md +500 -0
  387. package/docs/joining-a-team.md +76 -0
  388. package/docs/release-policy.md +49 -0
  389. package/docs/safety-and-autonomy.md +463 -0
  390. package/docs/troubleshooting.md +382 -0
  391. package/docs/tutorial.md +171 -0
  392. package/docs/work-and-browser.md +420 -0
  393. package/libexec/browser-operation.cjs +270 -0
  394. package/libexec/fence-marker.cjs +101 -0
  395. package/libexec/fence-marker.d.cts +24 -0
  396. package/libexec/fenced-group-runner.cjs +77 -0
  397. package/libexec/fenced-supervisor.cjs +137 -0
  398. package/libexec/generated-filesystem.cjs +731 -0
  399. package/libexec/install-filesystem.cjs +225 -0
  400. package/libexec/rulesync-generator.NOTICE.md +1112 -0
  401. package/libexec/rulesync-generator.cjs +743 -0
  402. package/libexec/surface-generator-worker.cjs +266 -0
  403. package/libexec/surface-output-reader.cjs +99 -0
  404. package/libexec/surface-scratch-cleanup.cjs +14 -0
  405. package/libexec/validate-harness-evidence.d.mts +183 -0
  406. package/libexec/validate-harness-evidence.mjs +1312 -0
  407. package/package.json +74 -4
  408. package/surfaces/README.md +33 -0
  409. package/surfaces/agents/evaluator.agent.md +76 -0
  410. package/surfaces/guards/bash-guard.sh +48 -0
  411. package/surfaces/guards/claude.adapter.json +25 -0
  412. package/surfaces/guards/codex.adapter.json +24 -0
  413. package/surfaces/guards/opencode.adapter.json +25 -0
  414. package/surfaces/references/browser.md +63 -0
  415. package/surfaces/references/test-data-and-personas.md +84 -0
  416. package/surfaces/references/testing-tiers.md +11 -0
  417. package/surfaces/skills/cockpit-browser.skill.md +59 -0
  418. package/surfaces/skills/cockpit-explain.skill.md +32 -0
  419. package/surfaces/skills/cockpit-fix.skill.md +37 -0
  420. package/surfaces/skills/cockpit-setup.skill.md +39 -0
  421. package/surfaces/skills/cockpit-work.skill.md +34 -0
  422. package/surfaces/skills/collection.json +5 -0
  423. package/surfaces/skills/procedures/explain.md +66 -0
  424. package/surfaces/skills/procedures/fix.md +95 -0
  425. package/surfaces/skills/procedures/setup.md +452 -0
  426. package/surfaces/skills/procedures/work.md +134 -0
@@ -0,0 +1,143 @@
1
+ import type { ExecuteProbeOutcome } from '../../environment-exec/execute.js';
2
+ import { RefusalError, type CheckoutId, type EnvironmentDiagnostic, type EnvironmentObservation, type ExecutionStep, type StackId } from '../contract.js';
3
+ import { type ResolvedExecutable } from '../executable.js';
4
+ import { type SetupCheckoutProjection } from '../setup-observation.js';
5
+ import { loadCockpitConfig, type LoadedConfigProjection } from '../../config/load.js';
6
+ import { type EvaluatedObservation, type PreflightContext, type PreflightEvaluation } from '../observations.js';
7
+ import { type ComparisonRemoteResult } from '../git-observation.js';
8
+ import type { CapturedRuntimeEvidence, EnvironmentSnapshot } from '../evidence.js';
9
+ import { type ReadinessRefusal } from './lifecycle-context.js';
10
+ interface ComparisonRemoteInput {
11
+ readonly executable: ResolvedExecutable;
12
+ readonly checkoutRoot: string;
13
+ readonly env: Readonly<Record<string, string>>;
14
+ readonly timeoutMs: number;
15
+ readonly stackId: StackId;
16
+ readonly checkoutId: CheckoutId;
17
+ readonly source: string;
18
+ readonly sibling: string;
19
+ readonly acquire: 'auto' | 'manual' | 'none';
20
+ readonly declaredRemote?: string;
21
+ }
22
+ export interface HealthObservationProducers {
23
+ readonly surfaces: () => Promise<readonly EnvironmentObservation[]>;
24
+ readonly envSchema: () => Promise<readonly EnvironmentObservation[]>;
25
+ readonly claims: () => Promise<readonly EnvironmentObservation[]>;
26
+ readonly git: () => Promise<readonly EnvironmentObservation[]>;
27
+ readonly host: () => Promise<readonly EnvironmentObservation[]>;
28
+ readonly lifecycle: () => Promise<readonly EnvironmentObservation[]>;
29
+ readonly ports: () => Promise<readonly EnvironmentObservation[]>;
30
+ readonly runtime: () => Promise<readonly EnvironmentObservation[]>;
31
+ readonly state: () => Promise<readonly EnvironmentObservation[]>;
32
+ readonly siblings: () => Promise<readonly EnvironmentObservation[]>;
33
+ readonly templates: () => Promise<readonly EnvironmentObservation[]>;
34
+ }
35
+ export type LoadedCockpitConfigResult = Extract<Awaited<ReturnType<typeof loadCockpitConfig>>, {
36
+ readonly kind: 'complete';
37
+ }>;
38
+ export interface HealthObservationSourceInput {
39
+ readonly checkout: SetupCheckoutProjection;
40
+ readonly configuration: LoadedConfigProjection;
41
+ readonly preflight: PreflightContext;
42
+ readonly env: Readonly<Record<string, string>>;
43
+ readonly gitExecutable: ResolvedExecutable;
44
+ readonly timeoutMs: number;
45
+ readonly producers: HealthObservationProducers;
46
+ readonly refreshPreflight: (previous: PreflightContext) => Promise<PreflightContext | undefined>;
47
+ /** Why no stack runs to observe (never brought up, asleep, or no runtime declared); null while one runs. */
48
+ readonly stopped: EnvironmentDiagnostic | null;
49
+ /** Refusals the producers met that explain missing evidence, read once evaluation has finished. */
50
+ readonly notices: () => readonly EnvironmentDiagnostic[];
51
+ }
52
+ export interface HealthObservationSource {
53
+ readonly kind: 'health-observation-source';
54
+ }
55
+ export interface ObservationCommandAdapters {
56
+ readonly load: (input: {
57
+ readonly configPath: string;
58
+ }, issue: (source: HealthObservationSourceInput) => HealthObservationSource | undefined, refuse?: ReadinessRefusal<undefined>, purpose?: 'doctor' | 'preflight') => Promise<HealthObservationSource | undefined>;
59
+ readonly execute: (step: ExecutionStep, options: {
60
+ readonly signal?: AbortSignal;
61
+ }) => Promise<ExecuteProbeOutcome>;
62
+ /**
63
+ * Which checkout serves each sibling, what a worktree lacks, and whether the running stack is stale.
64
+ * Reads cockpit.toml again unless handed the loaded configuration or called after `load`.
65
+ */
66
+ readonly inspectServedSiblings?: (loaded?: LoadedCockpitConfigResult) => Promise<readonly EnvironmentDiagnostic[]>;
67
+ }
68
+ export interface PreflightCommandInput {
69
+ readonly configPath: string;
70
+ }
71
+ export interface PreflightCommandAdapters extends ObservationCommandAdapters {
72
+ }
73
+ export interface ComparisonRemoteEvaluation {
74
+ readonly sibling: string;
75
+ readonly result: ComparisonRemoteResult;
76
+ }
77
+ interface ApplicationPreflightEvaluation {
78
+ readonly verdict: PreflightEvaluation['verdict'];
79
+ readonly revision: string;
80
+ readonly checks: readonly EvaluatedObservation[];
81
+ readonly comparisons: readonly ComparisonRemoteEvaluation[];
82
+ }
83
+ type PreflightCommandResult = Readonly<{
84
+ kind: 'complete';
85
+ status: 0;
86
+ diagnostics: readonly EnvironmentDiagnostic[];
87
+ result: ApplicationPreflightEvaluation;
88
+ }> | Readonly<{
89
+ kind: 'blocked';
90
+ status: 2;
91
+ diagnostics: readonly EnvironmentDiagnostic[];
92
+ result: ApplicationPreflightEvaluation;
93
+ }>;
94
+ /** The resolved intent and the measured runtime of the running stack, which a product gate reads. */
95
+ export interface RuntimeEvidenceObservation {
96
+ readonly snapshot: EnvironmentSnapshot;
97
+ readonly evidence: CapturedRuntimeEvidence;
98
+ }
99
+ /**
100
+ * A producer that cannot observe because another command's refusal stands in the way. Its diagnostics
101
+ * are that command's own, with their fixes, so they replace the producer's "evidence unavailable" and
102
+ * the rows that depend on it; any other thrown error stays unexposed.
103
+ */
104
+ export declare class ObservationProducerRefusal extends RefusalError {
105
+ readonly diagnostics: readonly EnvironmentDiagnostic[];
106
+ constructor(message: string, diagnostics: readonly EnvironmentDiagnostic[]);
107
+ }
108
+ export interface HealthEvaluation {
109
+ readonly preflight: PreflightEvaluation;
110
+ readonly comparisons: readonly ComparisonRemoteEvaluation[];
111
+ readonly producerFailures: readonly typeof healthProducerNames[number][];
112
+ /** The diagnostics of producers that failed on a refusal; their dependent evidence rows are left out of the report. */
113
+ readonly producerRefusals: readonly EnvironmentDiagnostic[];
114
+ readonly verdict: PreflightEvaluation['verdict'];
115
+ readonly stopped: EnvironmentDiagnostic | null;
116
+ readonly notices: readonly EnvironmentDiagnostic[];
117
+ }
118
+ interface PreparedHealthObservation {
119
+ readonly configPath: string;
120
+ readonly preflight: PreflightContext;
121
+ readonly comparisons: readonly ComparisonRemoteInput[];
122
+ readonly producers: HealthObservationProducers;
123
+ readonly refreshPreflight: (previous: PreflightContext) => Promise<PreflightContext | undefined>;
124
+ readonly expectedPreflight: Readonly<{
125
+ stackId: StackId;
126
+ source: string;
127
+ revision: string;
128
+ stage: 'bootstrap' | 'steady';
129
+ }>;
130
+ readonly stopped: EnvironmentDiagnostic | null;
131
+ readonly notices: () => readonly EnvironmentDiagnostic[];
132
+ readonly unobservable: ReadonlyMap<string, string>;
133
+ }
134
+ declare const healthProducerNames: readonly ["claims", "git", "host", "lifecycle", "ports", "runtime", "state", "templates", "envSchema", "siblings", "surfaces"];
135
+ export declare function applicationDiagnostic(code: EnvironmentDiagnostic['code'], message: string, target: string, fix?: string): EnvironmentDiagnostic;
136
+ export declare function issueHealthObservationSource(rawSource: HealthObservationSourceInput): HealthObservationSource | undefined;
137
+ export declare function prepareHealthObservation(input: {
138
+ readonly configPath: string;
139
+ }, source: HealthObservationSource): PreparedHealthObservation | undefined;
140
+ export declare function evaluateApplicationHealth(input: PreparedHealthObservation, adapters: ObservationCommandAdapters): Promise<HealthEvaluation>;
141
+ export declare function healthDiagnostics(health: HealthEvaluation): readonly EnvironmentDiagnostic[];
142
+ export declare function runPreflight(input: PreflightCommandInput, adapters: PreflightCommandAdapters): Promise<PreflightCommandResult>;
143
+ export {};
@@ -0,0 +1,385 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ import { RefusalError, ENVIRONMENT_CODES, errorCause, isCanonicalTimestamp, } from '../contract.js';
3
+ import { resolveLocalRemote } from '../setup.js';
4
+ import { resolvedGitExecutable } from '../executable.js';
5
+ import { declaresNothingToRun } from '../declaration.js';
6
+ import { checkoutId as deriveCheckoutId, stackId as deriveStackId } from '../identity.js';
7
+ import { consumeSetupCheckoutProjection } from '../setup-observation.js';
8
+ import { loadCockpitConfig } from '../../config/load.js';
9
+ import { aggregateObservations, stoppedStackApplicability, } from '../observations.js';
10
+ import { envSchemaToolMissing, VARLOCK_INSTALL_URL } from '../env-schema-observation.js';
11
+ import { SURFACE_OBSERVATION_CODES } from '../generated-application/surface-observation.js';
12
+ import { createComparisonRemoteRefStep, createGitObservationStep, observeComparisonRemoteRef, observeComparisonRemoteRevalidation, observeComparisonRemoteUrl, observeGit, } from '../git-observation.js';
13
+ import { consumeEffectiveConfiguration } from './lifecycle-context.js';
14
+ import { confinedPath, exactEnvironment, sameSource } from './shared.js';
15
+ /**
16
+ * A producer that cannot observe because another command's refusal stands in the way. Its diagnostics
17
+ * are that command's own, with their fixes, so they replace the producer's "evidence unavailable" and
18
+ * the rows that depend on it; any other thrown error stays unexposed.
19
+ */
20
+ export class ObservationProducerRefusal extends RefusalError {
21
+ diagnostics;
22
+ constructor(message, diagnostics) {
23
+ super(message);
24
+ this.diagnostics = diagnostics;
25
+ }
26
+ }
27
+ const issuedHealthObservationSources = new WeakMap();
28
+ const healthProducerNames = Object.freeze([
29
+ 'claims', 'git', 'host', 'lifecycle', 'ports', 'runtime', 'state', 'templates', 'envSchema', 'siblings', 'surfaces',
30
+ ]);
31
+ export function applicationDiagnostic(code, message, target, fix) {
32
+ return { severity: 'error', code, message, target, ...(fix === undefined ? {} : { fix }) };
33
+ }
34
+ function comparisonVerdict(result) {
35
+ if (result.kind === 'complete')
36
+ return result.state === 'mismatch' ? 'fail' : 'pass';
37
+ return result.kind === 'unavailable' ? 'unavailable' : 'pass';
38
+ }
39
+ function combinedVerdict(preflight, comparisons) {
40
+ const verdicts = [preflight, ...comparisons.map(({ result }) => comparisonVerdict(result))];
41
+ return verdicts.includes('fail') ? 'fail' : verdicts.includes('unavailable') ? 'unavailable' : 'pass';
42
+ }
43
+ function stageMatches(context, expected) {
44
+ try {
45
+ return Array.isArray(context.stages) && context.stages.every((authority) => authority.stage === expected);
46
+ }
47
+ catch {
48
+ // A throwing accessor or proxy trap makes the input malformed, which the caller refuses.
49
+ return false;
50
+ }
51
+ }
52
+ function exactHealthProducers(value) {
53
+ try {
54
+ if (!value || typeof value !== 'object' || Array.isArray(value))
55
+ return undefined;
56
+ const descriptors = Object.getOwnPropertyDescriptors(value);
57
+ if (Reflect.ownKeys(descriptors).length !== healthProducerNames.length)
58
+ return undefined;
59
+ const producers = {};
60
+ for (const name of healthProducerNames) {
61
+ const descriptor = descriptors[name];
62
+ if (!descriptor || !('value' in descriptor) || typeof descriptor.value !== 'function')
63
+ return undefined;
64
+ producers[name] = descriptor.value;
65
+ }
66
+ return producers;
67
+ }
68
+ catch {
69
+ // A throwing accessor or proxy trap makes the input malformed, which the caller refuses.
70
+ return undefined;
71
+ }
72
+ }
73
+ function singleDataElement(value) {
74
+ try {
75
+ if (!Array.isArray(value))
76
+ return undefined;
77
+ const keys = Reflect.ownKeys(value);
78
+ const element = Object.getOwnPropertyDescriptor(value, '0');
79
+ const length = Object.getOwnPropertyDescriptor(value, 'length');
80
+ if (keys.length !== 2 || !keys.includes('0') || !keys.includes('length')
81
+ || !element || !('value' in element) || !length || !('value' in length) || length.value !== 1)
82
+ return undefined;
83
+ return element.value;
84
+ }
85
+ catch {
86
+ // A throwing accessor or proxy trap makes the input malformed, which the caller refuses.
87
+ return undefined;
88
+ }
89
+ }
90
+ function exactDataObject(value, keys) {
91
+ try {
92
+ if (!value || typeof value !== 'object' || Array.isArray(value))
93
+ return undefined;
94
+ const descriptors = Object.getOwnPropertyDescriptors(value);
95
+ if (Reflect.ownKeys(descriptors).length !== keys.length)
96
+ return undefined;
97
+ const captured = {};
98
+ for (const key of keys) {
99
+ const descriptor = descriptors[key];
100
+ if (!descriptor || !('value' in descriptor))
101
+ return undefined;
102
+ captured[key] = descriptor.value;
103
+ }
104
+ return captured;
105
+ }
106
+ catch {
107
+ // A throwing accessor or proxy trap makes the input malformed, which the caller refuses.
108
+ return undefined;
109
+ }
110
+ }
111
+ function boundPreflightContext(value, expected) {
112
+ const context = exactDataObject(value, ['authorities', 'stages']);
113
+ const authority = exactDataObject(singleDataElement(context?.authorities), [
114
+ 'stackId', 'evaluatedAt', 'validThrough', 'revision', 'source', 'postures', 'environmentPostures', 'postureRequirements',
115
+ ]);
116
+ const stage = exactDataObject(singleDataElement(context?.stages), [
117
+ 'stackId', 'stage', 'observedAt', 'validThrough',
118
+ ]);
119
+ if (!context || !authority || !stage
120
+ || authority.stackId !== expected.stackId || stage.stackId !== expected.stackId
121
+ || authority.source !== expected.source || authority.revision !== expected.revision
122
+ || stage.stage !== expected.stage
123
+ || typeof authority.evaluatedAt !== 'string' || !isCanonicalTimestamp(authority.evaluatedAt)
124
+ || typeof authority.validThrough !== 'string' || !isCanonicalTimestamp(authority.validThrough)
125
+ || typeof stage.observedAt !== 'string' || !isCanonicalTimestamp(stage.observedAt)
126
+ || typeof stage.validThrough !== 'string' || !isCanonicalTimestamp(stage.validThrough)
127
+ || Date.parse(authority.evaluatedAt) > Date.parse(authority.validThrough)
128
+ || Date.parse(stage.observedAt) < Date.parse(authority.evaluatedAt)
129
+ || Date.parse(stage.observedAt) > Date.parse(authority.validThrough)
130
+ || Date.parse(authority.evaluatedAt) > Date.parse(stage.validThrough))
131
+ return undefined;
132
+ return value;
133
+ }
134
+ export function issueHealthObservationSource(rawSource) {
135
+ try {
136
+ if (!rawSource || typeof rawSource !== 'object' || Array.isArray(rawSource))
137
+ return undefined;
138
+ const descriptors = Object.getOwnPropertyDescriptors(rawSource);
139
+ const keys = ['checkout', 'configuration', 'preflight', 'env', 'gitExecutable', 'timeoutMs', 'producers', 'refreshPreflight',
140
+ 'stopped', 'notices'];
141
+ if (Reflect.ownKeys(descriptors).length !== keys.length
142
+ || keys.some((key) => !descriptors[key] || !('value' in descriptors[key])))
143
+ return undefined;
144
+ const checkout = consumeSetupCheckoutProjection(descriptors.checkout.value);
145
+ const loaded = consumeEffectiveConfiguration(descriptors.configuration.value);
146
+ const rawPreflight = descriptors.preflight.value;
147
+ const env = exactEnvironment(descriptors.env.value);
148
+ const executable = resolvedGitExecutable(descriptors.gitExecutable.value);
149
+ const timeoutMs = descriptors.timeoutMs.value;
150
+ const producers = exactHealthProducers(descriptors.producers.value);
151
+ const refreshPreflight = descriptors.refreshPreflight.value;
152
+ const stopped = descriptors.stopped.value;
153
+ const notices = descriptors.notices.value;
154
+ if (!checkout || loaded.kind !== 'complete' || !env || !executable || !producers
155
+ || typeof refreshPreflight !== 'function' || typeof notices !== 'function'
156
+ || stopped !== null && (typeof stopped !== 'object' || typeof stopped.code !== 'string' || typeof stopped.message !== 'string')
157
+ || !sameSource(checkout.source, loaded.source) || checkout.cockpitName !== loaded.config.cockpit.name
158
+ || typeof timeoutMs !== 'number' || !Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 30_000)
159
+ return undefined;
160
+ const resolvedTimeoutMs = timeoutMs;
161
+ const stack = deriveStackId({
162
+ cockpitId: checkout.cockpitId,
163
+ checkoutId: checkout.checkoutId,
164
+ variant: { kind: 'shared' },
165
+ });
166
+ // Only a stack that has run and still runs is observed in the steady stage; otherwise the
167
+ // rows that need no running stack are, and the reason none runs travels with them.
168
+ const stage = stopped === null || stageMatches(rawPreflight, 'steady') ? 'steady' : 'bootstrap';
169
+ const runtimeDeclared = !declaresNothingToRun(loaded.config.environment);
170
+ const expectedPreflight = { stackId: stack, source: loaded.source.path, revision: loaded.source.sha256, stage };
171
+ const preflight = boundPreflightContext(rawPreflight, expectedPreflight);
172
+ if (!preflight)
173
+ return undefined;
174
+ const siblingsRoot = resolve(dirname(loaded.source.path), loaded.config.cockpit.siblings_root);
175
+ const comparisons = loaded.config.sibling.map((sibling) => {
176
+ const declared = sibling.remote === undefined ? undefined : resolveLocalRemote(sibling.remote, siblingsRoot);
177
+ if (declared?.kind === 'unresolvable') {
178
+ throw new RefusalError(`sibling ${sibling.slug}: cannot resolve declared local remote ${JSON.stringify(declared.declared)} (${declared.errno})`);
179
+ }
180
+ const checkoutRoot = resolve(siblingsRoot, sibling.dir);
181
+ if (!confinedPath(siblingsRoot, checkoutRoot))
182
+ throw new RefusalError('sibling checkout escapes its configured root');
183
+ return {
184
+ executable,
185
+ checkoutRoot,
186
+ env,
187
+ timeoutMs: resolvedTimeoutMs,
188
+ stackId: stack,
189
+ checkoutId: deriveCheckoutId({ checkoutPath: checkoutRoot }),
190
+ source: `${loaded.source.path}:${sibling.slug}`,
191
+ sibling: sibling.slug,
192
+ acquire: sibling.acquire,
193
+ ...(declared === undefined ? {} : { declaredRemote: declared.remote }),
194
+ };
195
+ });
196
+ const prepared = {
197
+ configPath: loaded.source.path,
198
+ preflight,
199
+ comparisons,
200
+ producers,
201
+ refreshPreflight: refreshPreflight,
202
+ expectedPreflight,
203
+ stopped: stopped === null ? null : { ...stopped },
204
+ notices: notices,
205
+ unobservable: stopped === null ? new Map() : stoppedStackApplicability({ runtimeDeclared }),
206
+ };
207
+ const source = { kind: 'health-observation-source' };
208
+ issuedHealthObservationSources.set(source, prepared);
209
+ return source;
210
+ }
211
+ catch (error) {
212
+ throw new RefusalError(`health observation source could not be issued: ${errorCause(error)}`, { cause: error });
213
+ }
214
+ }
215
+ export function prepareHealthObservation(input, source) {
216
+ try {
217
+ if (!source || typeof source !== 'object')
218
+ return undefined;
219
+ const prepared = issuedHealthObservationSources.get(source);
220
+ issuedHealthObservationSources.delete(source);
221
+ return prepared && typeof input.configPath === 'string' && resolve(input.configPath) === prepared.configPath
222
+ && stageMatches(prepared.preflight, prepared.expectedPreflight.stage)
223
+ ? prepared
224
+ : undefined;
225
+ }
226
+ catch {
227
+ // A throwing accessor or proxy trap makes the input malformed, which the caller refuses.
228
+ return undefined;
229
+ }
230
+ }
231
+ async function executeObservationStep(adapters, step) {
232
+ try {
233
+ return { kind: 'complete', outcome: await adapters.execute(step, {}) };
234
+ }
235
+ catch (error) {
236
+ return { kind: 'unavailable', cause: errorCause(error) };
237
+ }
238
+ }
239
+ function comparisonProbeUnavailable(input, probe, cause) {
240
+ return {
241
+ kind: 'unavailable',
242
+ code: ENVIRONMENT_CODES.GIT_COMPARISON_REMOTE_MISMATCH,
243
+ reason: `${probe} execution is unavailable for sibling ${input.sibling}${cause === undefined ? '' : `: ${cause}`}`,
244
+ };
245
+ }
246
+ async function observeComparisonRemote(input, adapters) {
247
+ const applicability = createComparisonRemoteRefStep(input);
248
+ if (applicability.kind === 'not-applicable')
249
+ return applicability;
250
+ const statusStep = createGitObservationStep(input);
251
+ if (!statusStep)
252
+ return comparisonProbeUnavailable(input, 'Git status probe planning');
253
+ const statusExecution = await executeObservationStep(adapters, statusStep);
254
+ if (statusExecution.kind === 'unavailable')
255
+ return comparisonProbeUnavailable(input, 'Git status probe', statusExecution.cause);
256
+ const git = observeGit(statusStep, statusExecution.outcome, input);
257
+ const ref = createComparisonRemoteRefStep({ ...input, git });
258
+ if (ref.kind !== 'probe')
259
+ return ref;
260
+ const refExecution = await executeObservationStep(adapters, ref.step);
261
+ if (refExecution.kind === 'unavailable')
262
+ return comparisonProbeUnavailable(input, 'comparison upstream probe', refExecution.cause);
263
+ const url = observeComparisonRemoteRef(ref, refExecution.outcome);
264
+ if (url.kind !== 'probe')
265
+ return url;
266
+ const urlExecution = await executeObservationStep(adapters, url.step);
267
+ if (urlExecution.kind === 'unavailable')
268
+ return comparisonProbeUnavailable(input, 'comparison remote URL probe', urlExecution.cause);
269
+ const revalidation = observeComparisonRemoteUrl(url, urlExecution.outcome);
270
+ if (revalidation.kind !== 'probe')
271
+ return revalidation;
272
+ const revalidationExecution = await executeObservationStep(adapters, revalidation.step);
273
+ if (revalidationExecution.kind === 'unavailable') {
274
+ return comparisonProbeUnavailable(input, 'comparison upstream revalidation probe', revalidationExecution.cause);
275
+ }
276
+ return observeComparisonRemoteRevalidation(revalidation, revalidationExecution.outcome);
277
+ }
278
+ export async function evaluateApplicationHealth(input, adapters) {
279
+ const produced = await Promise.allSettled(healthProducerNames.map((name) => input.producers[name]()));
280
+ const producerFailures = healthProducerNames.filter((_, index) => produced[index]?.status === 'rejected');
281
+ const producerRefusals = produced.flatMap((result) => result.status === 'rejected' && result.reason instanceof ObservationProducerRefusal ? result.reason.diagnostics : []);
282
+ const observations = produced.map((result) => result.status === 'fulfilled'
283
+ ? result.value
284
+ : []);
285
+ // Reject unauthenticated observations before comparison probes cross the process boundary.
286
+ const initial = boundPreflightContext(await input.refreshPreflight(input.preflight), input.expectedPreflight);
287
+ if (!initial || initial.authorities[0]?.evaluatedAt !== input.preflight.authorities[0]?.evaluatedAt) {
288
+ throw new RefusalError('health preflight authority could not preserve its observation window');
289
+ }
290
+ aggregateObservations(observations, initial, input.unobservable);
291
+ const comparisons = [];
292
+ for (const comparisonInput of input.comparisons) {
293
+ const result = await observeComparisonRemote(comparisonInput, adapters);
294
+ comparisons.push({ sibling: comparisonInput.sibling, result });
295
+ }
296
+ const refreshed = boundPreflightContext(await input.refreshPreflight(initial), input.expectedPreflight);
297
+ if (!refreshed || refreshed.authorities[0]?.evaluatedAt !== input.preflight.authorities[0]?.evaluatedAt) {
298
+ throw new RefusalError('health preflight authority could not preserve its observation window');
299
+ }
300
+ const preflight = aggregateObservations(observations, refreshed, input.unobservable);
301
+ const frozenComparisons = comparisons;
302
+ const observedVerdict = combinedVerdict(preflight.verdict, frozenComparisons);
303
+ // Rows a running stack would answer were not observed, so passing the rest never passes health.
304
+ const incomplete = producerFailures.length > 0 || input.stopped !== null;
305
+ return {
306
+ preflight,
307
+ comparisons: frozenComparisons,
308
+ producerFailures,
309
+ producerRefusals,
310
+ verdict: incomplete && observedVerdict === 'pass' ? 'unavailable' : observedVerdict,
311
+ stopped: input.stopped,
312
+ notices: [...input.notices()],
313
+ };
314
+ }
315
+ export function healthDiagnostics(health) {
316
+ // Rows a refused producer would have answered only repeat that refusal as missing evidence.
317
+ const dependent = new Set(health.producerRefusals.length > 0 ? SURFACE_OBSERVATION_CODES : []);
318
+ const checks = health.preflight.checks
319
+ .filter(({ verdict }) => verdict === 'fail' || verdict === 'unavailable')
320
+ .filter(({ code }) => !dependent.has(code))
321
+ .map(({ code, reason, source, remedy }) => applicationDiagnostic(code, reason, source, remedy));
322
+ const comparisons = health.comparisons.flatMap(({ sibling, result }) => {
323
+ if ((result.kind === 'complete' && result.state === 'match') || result.kind === 'not-applicable')
324
+ return [];
325
+ return [applicationDiagnostic(result.code, result.reason, sibling, 'in the sibling checkout, run `git status --short --branch` and `git remote -v`; reconcile the selected upstream and declared repository, then rerun the command')];
326
+ });
327
+ const producerFailures = health.producerFailures.filter((producer) => producer !== 'surfaces' || health.producerRefusals.length === 0).map((producer) => applicationDiagnostic(ENVIRONMENT_CODES.EVIDENCE_UNAVAILABLE, `${producer} observation producer failed`, producer, `restore the ${producer} observation producer`));
328
+ // Varlock is optional for cockpit, so a sibling that adopted it but cannot be checked here warns
329
+ // instead of failing the row.
330
+ const advisories = health.preflight.checks.flatMap((check) => envSchemaToolMissing(check).map((sibling) => ({
331
+ severity: 'warning',
332
+ code: ENVIRONMENT_CODES.ENV_SCHEMA_TOOL_MISSING,
333
+ message: `sibling ${sibling} has an .env.schema but varlock is not installed, so its env schema was not checked`,
334
+ target: sibling,
335
+ fix: `install Varlock (${VARLOCK_INSTALL_URL}) and put it on PATH`,
336
+ })));
337
+ return [...health.stopped === null ? [] : [health.stopped], ...health.notices,
338
+ ...health.producerRefusals, ...checks, ...advisories, ...producerFailures, ...comparisons];
339
+ }
340
+ function unavailablePreflight(message, forwarded) {
341
+ return {
342
+ kind: 'blocked', status: 2,
343
+ diagnostics: forwarded ?? [applicationDiagnostic(ENVIRONMENT_CODES.LIFECYCLE_EVIDENCE_INVALID, message, 'preflight')],
344
+ result: {
345
+ verdict: 'unavailable', revision: '', checks: [], comparisons: [],
346
+ },
347
+ };
348
+ }
349
+ export async function runPreflight(input, adapters) {
350
+ let health;
351
+ let refused;
352
+ let servedFindings = Promise.resolve([]);
353
+ try {
354
+ const source = await adapters.load(input, issueHealthObservationSource, (diagnostics) => { refused = diagnostics; return undefined; }, 'preflight');
355
+ if (!source)
356
+ return unavailablePreflight('preflight observation source is unavailable', refused);
357
+ const observed = prepareHealthObservation(input, source);
358
+ if (!observed)
359
+ return unavailablePreflight('preflight requires authenticated steady lifecycle evidence');
360
+ // Reports only and catches its own errors, so it runs beside the health evaluation.
361
+ servedFindings = adapters.inspectServedSiblings?.() ?? Promise.resolve([]);
362
+ health = await evaluateApplicationHealth(observed, adapters);
363
+ }
364
+ catch (error) {
365
+ // A producer that refused (a configuration edited since `up`, for one) says why; its refusal
366
+ // outranks the lost observation window that refusal caused.
367
+ return unavailablePreflight(`preflight requires authentic observation and lifecycle evidence: ${errorCause(error)}`, refused);
368
+ }
369
+ const result = {
370
+ verdict: health.verdict,
371
+ revision: health.preflight.revision,
372
+ checks: health.preflight.checks,
373
+ comparisons: health.comparisons,
374
+ };
375
+ // A stopped stack never passes the gate, whatever the rows observable without it say.
376
+ const passed = health.verdict === 'pass' && health.stopped === null;
377
+ // Warnings only: a stale stack still answers, and whether a changed lockfile matters is the product's call.
378
+ const served = await servedFindings;
379
+ return {
380
+ kind: passed ? 'complete' : 'blocked',
381
+ status: passed ? 0 : 2,
382
+ diagnostics: [...healthDiagnostics(health), ...served],
383
+ result,
384
+ };
385
+ }