@theodo/bernard 0.1.0-beta.0 → 0.1.0-beta.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 (260) hide show
  1. package/README.md +13 -12
  2. package/core/README.md +1 -1
  3. package/core/agents/review-quality.md +13 -12
  4. package/core/agents/review-security-bugs.md +1 -1
  5. package/core/agents/review-tests.md +1 -1
  6. package/core/coder/template/main.tf +14 -1
  7. package/core/skills/pull-request/SKILL.md +17 -7
  8. package/core/skills/pull-request/ci-fixer.md +3 -3
  9. package/dist/bin.mjs +4979 -3176
  10. package/dist/{config-BawD0TwQ.mjs → config-DtCwJKWe.mjs} +70 -6
  11. package/dist/config.d.mts +72 -4
  12. package/dist/config.mjs +1 -1
  13. package/dist/docs/404.html +23 -0
  14. package/dist/docs/CLAUDE.html +30 -0
  15. package/dist/docs/CONTEXT.html +30 -0
  16. package/dist/docs/CONTRIBUTING.html +62 -0
  17. package/dist/docs/assets/CLAUDE.md.BLSB-5gK.js +1 -0
  18. package/dist/docs/assets/CLAUDE.md.BLSB-5gK.lean.js +1 -0
  19. package/dist/docs/assets/CONTEXT.md.BovnvMGK.js +1 -0
  20. package/dist/docs/assets/CONTEXT.md.BovnvMGK.lean.js +1 -0
  21. package/dist/docs/assets/CONTRIBUTING.md.DwJsKrz3.js +33 -0
  22. package/dist/docs/assets/CONTRIBUTING.md.DwJsKrz3.lean.js +1 -0
  23. package/dist/docs/assets/app.URmpjWHb.js +312 -0
  24. package/dist/docs/assets/bernard.RCgrvDdX.svg +94 -0
  25. package/dist/docs/assets/chunks/@localSearchIndexroot.Ylq685Cw.js +1 -0
  26. package/dist/docs/assets/chunks/VPLocalSearchBox.C8gcRVj0.js +9 -0
  27. package/dist/docs/assets/chunks/dagre-GXQ25YYZ.2qvw8AqH.js +4 -0
  28. package/dist/docs/assets/chunks/framework.hgjl6W6o.js +20 -0
  29. package/dist/docs/assets/chunks/sizeCapture-INFHLROL.BEqL2zFi.js +1 -0
  30. package/dist/docs/assets/chunks/stateDiagram-v2-MP3YSRHH.3X7wNXKX.js +231 -0
  31. package/dist/docs/assets/chunks/theme.Cksh_UJH.js +2 -0
  32. package/dist/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js +1 -0
  33. package/dist/docs/assets/core_README.md.DyxYsikc.js +15 -0
  34. package/dist/docs/assets/core_README.md.DyxYsikc.lean.js +1 -0
  35. package/dist/docs/assets/demo_README.md.Cpi2pUU9.js +18 -0
  36. package/dist/docs/assets/demo_README.md.Cpi2pUU9.lean.js +1 -0
  37. package/dist/docs/assets/docs_adr_0001-what-the-core-is-built-for.md.BxOoMjST.js +1 -0
  38. package/dist/docs/assets/docs_adr_0001-what-the-core-is-built-for.md.BxOoMjST.lean.js +1 -0
  39. package/dist/docs/assets/docs_adr_0002-which-harness-a-project-runs-on.md.2GwF-nj0.js +1 -0
  40. package/dist/docs/assets/docs_adr_0002-which-harness-a-project-runs-on.md.2GwF-nj0.lean.js +1 -0
  41. package/dist/docs/assets/docs_adr_0003-how-core-content-reaches-each-harness.md.BMWE00Mf.js +1 -0
  42. package/dist/docs/assets/docs_adr_0003-how-core-content-reaches-each-harness.md.BMWE00Mf.lean.js +1 -0
  43. package/dist/docs/assets/docs_adr_0004-how-the-core-uses-external-tools.md.B7dtE7MB.js +1 -0
  44. package/dist/docs/assets/docs_adr_0004-how-the-core-uses-external-tools.md.B7dtE7MB.lean.js +1 -0
  45. package/dist/docs/assets/docs_adr_0005-what-drives-the-pipeline.md.DGn0CJeq.js +1 -0
  46. package/dist/docs/assets/docs_adr_0005-what-drives-the-pipeline.md.DGn0CJeq.lean.js +1 -0
  47. package/dist/docs/assets/docs_adr_0006-what-steps-hand-off-to-each-other.md.BflT5ugJ.js +1 -0
  48. package/dist/docs/assets/docs_adr_0006-what-steps-hand-off-to-each-other.md.BflT5ugJ.lean.js +1 -0
  49. package/dist/docs/assets/docs_adr_0007-how-humans-take-part-in-the-pipeline.md.CNX3gUD-.js +1 -0
  50. package/dist/docs/assets/docs_adr_0007-how-humans-take-part-in-the-pipeline.md.CNX3gUD-.lean.js +1 -0
  51. package/dist/docs/assets/docs_adr_0008-where-a-steps-reviewers-run.md.aGbaBOpB.js +1 -0
  52. package/dist/docs/assets/docs_adr_0008-where-a-steps-reviewers-run.md.aGbaBOpB.lean.js +1 -0
  53. package/dist/docs/assets/docs_adr_0009-where-pipeline-state-and-handoffs-live.md.C3tKmV-E.js +1 -0
  54. package/dist/docs/assets/docs_adr_0009-where-pipeline-state-and-handoffs-live.md.C3tKmV-E.lean.js +1 -0
  55. package/dist/docs/assets/docs_adr_0010-how-a-project-adapts-the-core.md.Bp7N6tUE.js +1 -0
  56. package/dist/docs/assets/docs_adr_0010-how-a-project-adapts-the-core.md.Bp7N6tUE.lean.js +1 -0
  57. package/dist/docs/assets/docs_adr_0011-how-the-factory-is-packaged-and-versioned.md.BBJIwnqa.js +1 -0
  58. package/dist/docs/assets/docs_adr_0011-how-the-factory-is-packaged-and-versioned.md.BBJIwnqa.lean.js +1 -0
  59. package/dist/docs/assets/docs_adr_0012-how-a-steps-failures-are-told-apart-and-routed.md.uCyrBfug.js +1 -0
  60. package/dist/docs/assets/docs_adr_0012-how-a-steps-failures-are-told-apart-and-routed.md.uCyrBfug.lean.js +1 -0
  61. package/dist/docs/assets/docs_adr_0013-when-code-lands.md.oXgiobfz.js +1 -0
  62. package/dist/docs/assets/docs_adr_0013-when-code-lands.md.oXgiobfz.lean.js +1 -0
  63. package/dist/docs/assets/docs_adr_0014-what-a-step-may-change.md.Zslg3bnJ.js +1 -0
  64. package/dist/docs/assets/docs_adr_0014-what-a-step-may-change.md.Zslg3bnJ.lean.js +1 -0
  65. package/dist/docs/assets/docs_adr_0015-how-a-project-shapes-its-ticket-flow.md.DNHMxwIT.js +1 -0
  66. package/dist/docs/assets/docs_adr_0015-how-a-project-shapes-its-ticket-flow.md.DNHMxwIT.lean.js +1 -0
  67. package/dist/docs/assets/docs_adr_0016-which-core-the-factory-repo-runs.md.CLN6LqBZ.js +1 -0
  68. package/dist/docs/assets/docs_adr_0016-which-core-the-factory-repo-runs.md.CLN6LqBZ.lean.js +1 -0
  69. package/dist/docs/assets/docs_adr_0017-where-a-tickets-record-lives.md.jjUeM-ex.js +1 -0
  70. package/dist/docs/assets/docs_adr_0017-where-a-tickets-record-lives.md.jjUeM-ex.lean.js +1 -0
  71. package/dist/docs/assets/docs_adr_0018-the-products-name.md.6xaX9vDs.js +1 -0
  72. package/dist/docs/assets/docs_adr_0018-the-products-name.md.6xaX9vDs.lean.js +1 -0
  73. package/dist/docs/assets/docs_adr_0019-how-a-finding-is-answered-and-judged.md.CKKoO9-3.js +1 -0
  74. package/dist/docs/assets/docs_adr_0019-how-a-finding-is-answered-and-judged.md.CKKoO9-3.lean.js +1 -0
  75. package/dist/docs/assets/docs_adr_0020-how-an-interrupted-run-resumes.md.DTIP-MBK.js +1 -0
  76. package/dist/docs/assets/docs_adr_0020-how-an-interrupted-run-resumes.md.DTIP-MBK.lean.js +1 -0
  77. package/dist/docs/assets/docs_adr_0021-how-a-step-runs-in-its-workspace.md.B2r3-FPg.js +1 -0
  78. package/dist/docs/assets/docs_adr_0021-how-a-step-runs-in-its-workspace.md.B2r3-FPg.lean.js +1 -0
  79. package/dist/docs/assets/docs_adr_0022-who-names-the-branches.md.DaVk8X0i.js +1 -0
  80. package/dist/docs/assets/docs_adr_0022-who-names-the-branches.md.DaVk8X0i.lean.js +1 -0
  81. package/dist/docs/assets/docs_adr_0023-how-a-version-ships-before-npm.md.C7-wuCbq.js +1 -0
  82. package/dist/docs/assets/docs_adr_0023-how-a-version-ships-before-npm.md.C7-wuCbq.lean.js +1 -0
  83. package/dist/docs/assets/docs_adr_0024-how-the-config-type-carries-its-docs.md.CQmwhWXs.js +1 -0
  84. package/dist/docs/assets/docs_adr_0024-how-the-config-type-carries-its-docs.md.CQmwhWXs.lean.js +1 -0
  85. package/dist/docs/assets/docs_adr_0025-how-a-steps-handoff-is-written-and-checked.md.CgXYdF2v.js +1 -0
  86. package/dist/docs/assets/docs_adr_0025-how-a-steps-handoff-is-written-and-checked.md.CgXYdF2v.lean.js +1 -0
  87. package/dist/docs/assets/docs_adr_0026-support-for-github-copilot.md.DJsawm-R.js +1 -0
  88. package/dist/docs/assets/docs_adr_0026-support-for-github-copilot.md.DJsawm-R.lean.js +1 -0
  89. package/dist/docs/assets/docs_adr_0027-which-forge-a-project-is-on.md.CY0qy9xh.js +1 -0
  90. package/dist/docs/assets/docs_adr_0027-which-forge-a-project-is-on.md.CY0qy9xh.lean.js +1 -0
  91. package/dist/docs/assets/docs_adr_0028-several-ticket-flows-in-one-pipeline.md.oxffo2qg.js +1 -0
  92. package/dist/docs/assets/docs_adr_0028-several-ticket-flows-in-one-pipeline.md.oxffo2qg.lean.js +1 -0
  93. package/dist/docs/assets/docs_adr_0029-the-branch-a-feature-works-on.md.CrgkP6YJ.js +1 -0
  94. package/dist/docs/assets/docs_adr_0029-the-branch-a-feature-works-on.md.CrgkP6YJ.lean.js +1 -0
  95. package/dist/docs/assets/docs_adr_0030-a-runner-without-coder.md.CW8sF7jK.js +1 -0
  96. package/dist/docs/assets/docs_adr_0030-a-runner-without-coder.md.CW8sF7jK.lean.js +1 -0
  97. package/dist/docs/assets/docs_adr_0031-how-the-run-viewer-reads-its-runs.md.opQYnVF2.js +1 -0
  98. package/dist/docs/assets/docs_adr_0031-how-the-run-viewer-reads-its-runs.md.opQYnVF2.lean.js +1 -0
  99. package/dist/docs/assets/docs_adr_0032-how-a-project-gets-the-viewer.md.DB9NjYJf.js +1 -0
  100. package/dist/docs/assets/docs_adr_0032-how-a-project-gets-the-viewer.md.DB9NjYJf.lean.js +1 -0
  101. package/dist/docs/assets/docs_adr_0033-the-repos-license.md.NPlkrPj8.js +1 -0
  102. package/dist/docs/assets/docs_adr_0033-the-repos-license.md.NPlkrPj8.lean.js +1 -0
  103. package/dist/docs/assets/docs_adr_0034-how-code-review-launches-its-reviewers.md.DSNpkfaL.js +1 -0
  104. package/dist/docs/assets/docs_adr_0034-how-code-review-launches-its-reviewers.md.DSNpkfaL.lean.js +1 -0
  105. package/dist/docs/assets/docs_adr_0035-how-the-package-is-published.md.C1f4B5eb.js +1 -0
  106. package/dist/docs/assets/docs_adr_0035-how-the-package-is-published.md.C1f4B5eb.lean.js +1 -0
  107. package/dist/docs/assets/docs_adr_0036-what-the-cores-pull-request-skill-does.md.op39HLAT.js +1 -0
  108. package/dist/docs/assets/docs_adr_0036-what-the-cores-pull-request-skill-does.md.op39HLAT.lean.js +1 -0
  109. package/dist/docs/assets/docs_adr_0037-how-a-team-reads-the-factorys-documentation.md.Dar_Xo4t.js +1 -0
  110. package/dist/docs/assets/docs_adr_0037-how-a-team-reads-the-factorys-documentation.md.Dar_Xo4t.lean.js +1 -0
  111. package/dist/docs/assets/docs_adr_0038-where-adapters-live.md.CkVD3riv.js +1 -0
  112. package/dist/docs/assets/docs_adr_0038-where-adapters-live.md.CkVD3riv.lean.js +1 -0
  113. package/dist/docs/assets/docs_adr_0039-the-repos-license.md.C_rraWpb.js +1 -0
  114. package/dist/docs/assets/docs_adr_0039-the-repos-license.md.C_rraWpb.lean.js +1 -0
  115. package/dist/docs/assets/docs_adr_0040-how-a-version-is-released.md.CCdwC07z.js +1 -0
  116. package/dist/docs/assets/docs_adr_0040-how-a-version-is-released.md.CCdwC07z.lean.js +1 -0
  117. package/dist/docs/assets/docs_adr_0041-who-opens-the-features-pull-request.md.qLu9WLaG.js +1 -0
  118. package/dist/docs/assets/docs_adr_0041-who-opens-the-features-pull-request.md.qLu9WLaG.lean.js +1 -0
  119. package/dist/docs/assets/docs_adr_0042-how-secrets-are-kept-out-of-committed-records.md.DJWazI4H.js +1 -0
  120. package/dist/docs/assets/docs_adr_0042-how-secrets-are-kept-out-of-committed-records.md.DJWazI4H.lean.js +1 -0
  121. package/dist/docs/assets/docs_getting-started.md.BpQFS8Gr.js +12 -0
  122. package/dist/docs/assets/docs_getting-started.md.BpQFS8Gr.lean.js +1 -0
  123. package/dist/docs/assets/docs_github.md.D4gkW71G.js +1 -0
  124. package/dist/docs/assets/docs_github.md.D4gkW71G.lean.js +1 -0
  125. package/dist/docs/assets/docs_overlay.md.DoWVb6OM.js +35 -0
  126. package/dist/docs/assets/docs_overlay.md.DoWVb6OM.lean.js +1 -0
  127. package/dist/docs/assets/docs_pipeline.md.DdHywWSk.js +1 -0
  128. package/dist/docs/assets/docs_pipeline.md.DdHywWSk.lean.js +1 -0
  129. package/dist/docs/assets/docs_recipes.md.8Xf6BsRA.js +45 -0
  130. package/dist/docs/assets/docs_recipes.md.8Xf6BsRA.lean.js +1 -0
  131. package/dist/docs/assets/fixtures_README.md.DzbQ0hft.js +1 -0
  132. package/dist/docs/assets/fixtures_README.md.DzbQ0hft.lean.js +1 -0
  133. package/dist/docs/assets/index.md.DHgL6CzS.js +28 -0
  134. package/dist/docs/assets/index.md.DHgL6CzS.lean.js +1 -0
  135. package/dist/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  136. package/dist/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  137. package/dist/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  138. package/dist/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  139. package/dist/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  140. package/dist/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  141. package/dist/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  142. package/dist/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  143. package/dist/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  144. package/dist/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  145. package/dist/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  146. package/dist/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  147. package/dist/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  148. package/dist/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  149. package/dist/docs/assets/packages_docs_README.md.PV1a27nC.js +3 -0
  150. package/dist/docs/assets/packages_docs_README.md.PV1a27nC.lean.js +1 -0
  151. package/dist/docs/assets/packages_viewer_README.md.BynKZSdN.js +3 -0
  152. package/dist/docs/assets/packages_viewer_README.md.BynKZSdN.lean.js +1 -0
  153. package/dist/docs/assets/style.C3E8Ltp6.css +1 -0
  154. package/dist/docs/bernard.svg +94 -0
  155. package/dist/docs/core/README.html +44 -0
  156. package/dist/docs/demo/README.html +47 -0
  157. package/dist/docs/docs/adr/0001-what-the-core-is-built-for.html +30 -0
  158. package/dist/docs/docs/adr/0002-which-harness-a-project-runs-on.html +30 -0
  159. package/dist/docs/docs/adr/0003-how-core-content-reaches-each-harness.html +30 -0
  160. package/dist/docs/docs/adr/0004-how-the-core-uses-external-tools.html +30 -0
  161. package/dist/docs/docs/adr/0005-what-drives-the-pipeline.html +30 -0
  162. package/dist/docs/docs/adr/0006-what-steps-hand-off-to-each-other.html +30 -0
  163. package/dist/docs/docs/adr/0007-how-humans-take-part-in-the-pipeline.html +30 -0
  164. package/dist/docs/docs/adr/0008-where-a-steps-reviewers-run.html +30 -0
  165. package/dist/docs/docs/adr/0009-where-pipeline-state-and-handoffs-live.html +30 -0
  166. package/dist/docs/docs/adr/0010-how-a-project-adapts-the-core.html +30 -0
  167. package/dist/docs/docs/adr/0011-how-the-factory-is-packaged-and-versioned.html +30 -0
  168. package/dist/docs/docs/adr/0012-how-a-steps-failures-are-told-apart-and-routed.html +30 -0
  169. package/dist/docs/docs/adr/0013-when-code-lands.html +30 -0
  170. package/dist/docs/docs/adr/0014-what-a-step-may-change.html +30 -0
  171. package/dist/docs/docs/adr/0015-how-a-project-shapes-its-ticket-flow.html +30 -0
  172. package/dist/docs/docs/adr/0016-which-core-the-factory-repo-runs.html +30 -0
  173. package/dist/docs/docs/adr/0017-where-a-tickets-record-lives.html +30 -0
  174. package/dist/docs/docs/adr/0018-the-products-name.html +30 -0
  175. package/dist/docs/docs/adr/0019-how-a-finding-is-answered-and-judged.html +30 -0
  176. package/dist/docs/docs/adr/0020-how-an-interrupted-run-resumes.html +30 -0
  177. package/dist/docs/docs/adr/0021-how-a-step-runs-in-its-workspace.html +30 -0
  178. package/dist/docs/docs/adr/0022-who-names-the-branches.html +30 -0
  179. package/dist/docs/docs/adr/0023-how-a-version-ships-before-npm.html +30 -0
  180. package/dist/docs/docs/adr/0024-how-the-config-type-carries-its-docs.html +30 -0
  181. package/dist/docs/docs/adr/0025-how-a-steps-handoff-is-written-and-checked.html +30 -0
  182. package/dist/docs/docs/adr/0026-support-for-github-copilot.html +30 -0
  183. package/dist/docs/docs/adr/0027-which-forge-a-project-is-on.html +30 -0
  184. package/dist/docs/docs/adr/0028-several-ticket-flows-in-one-pipeline.html +30 -0
  185. package/dist/docs/docs/adr/0029-the-branch-a-feature-works-on.html +30 -0
  186. package/dist/docs/docs/adr/0030-a-runner-without-coder.html +30 -0
  187. package/dist/docs/docs/adr/0031-how-the-run-viewer-reads-its-runs.html +30 -0
  188. package/dist/docs/docs/adr/0032-how-a-project-gets-the-viewer.html +30 -0
  189. package/dist/docs/docs/adr/0033-the-repos-license.html +30 -0
  190. package/dist/docs/docs/adr/0034-how-code-review-launches-its-reviewers.html +30 -0
  191. package/dist/docs/docs/adr/0035-how-the-package-is-published.html +30 -0
  192. package/dist/docs/docs/adr/0036-what-the-cores-pull-request-skill-does.html +30 -0
  193. package/dist/docs/docs/adr/0037-how-a-team-reads-the-factorys-documentation.html +30 -0
  194. package/dist/docs/docs/adr/0038-where-adapters-live.html +30 -0
  195. package/dist/docs/docs/adr/0039-the-repos-license.html +30 -0
  196. package/dist/docs/docs/adr/0040-how-a-version-is-released.html +30 -0
  197. package/dist/docs/docs/adr/0041-who-opens-the-features-pull-request.html +30 -0
  198. package/dist/docs/docs/adr/0042-how-secrets-are-kept-out-of-committed-records.html +30 -0
  199. package/dist/docs/docs/getting-started.html +41 -0
  200. package/dist/docs/docs/github.html +30 -0
  201. package/dist/docs/docs/overlay.html +64 -0
  202. package/dist/docs/docs/pipeline.html +30 -0
  203. package/dist/docs/docs/recipes.html +74 -0
  204. package/dist/docs/fixtures/README.html +30 -0
  205. package/dist/docs/hashmap.json +1 -0
  206. package/dist/docs/index.html +57 -0
  207. package/dist/docs/packages/docs/README.html +32 -0
  208. package/dist/docs/packages/viewer/README.html +32 -0
  209. package/dist/docs/vp-icons.css +0 -0
  210. package/dist/viewer/assets/Heading-C5Va5XMQ.js +1 -0
  211. package/dist/viewer/assets/SelectionIndicator-DxHiKGW_.js +1 -0
  212. package/dist/viewer/assets/alert-BI2omIo2.js +1 -0
  213. package/dist/viewer/assets/attempt-Dunc67N6.js +1 -0
  214. package/dist/viewer/assets/card-IsZ2ZhSn.js +1 -0
  215. package/dist/viewer/assets/{chunk-WQQL4CDK-DSpW9ZO8.js → chunk-WQQL4CDK-Bd4bkond.js} +1 -1
  216. package/dist/viewer/assets/context-CzP3x3DO.js +7 -0
  217. package/dist/viewer/assets/{dagre-NK4GIZVX-BzzW8pOj.js → dagre-NK4GIZVX-Bhq8pl9Y.js} +1 -1
  218. package/dist/viewer/assets/{index-CnzUhLCJ.css → index-B90XVeY-.css} +1 -1
  219. package/dist/viewer/assets/index-tH-KNwJL.js +10 -0
  220. package/dist/viewer/assets/{mermaid.core-D1FXi6mg.js → mermaid.core-I426eCuN.js} +4 -4
  221. package/dist/viewer/assets/pipeline-Hw_7tocN.js +1 -0
  222. package/dist/viewer/assets/routes-BOl7_JgK.js +1 -0
  223. package/dist/viewer/assets/runs._runId-D4q1mLCt.js +6 -0
  224. package/dist/viewer/assets/runs._runId.index-B-woIhKA.js +1 -0
  225. package/dist/viewer/assets/runs._runId.machines-SkWqrTI6.js +2 -0
  226. package/dist/viewer/assets/runs._runId.sessions-DBVWEbLY.js +1 -0
  227. package/dist/viewer/assets/{stateDiagram-v2-A6IESKWZ-J9KnYRFT.js → stateDiagram-v2-A6IESKWZ-DUwIje_A.js} +1 -1
  228. package/dist/viewer/assets/surface-B6LupC_E.js +1 -0
  229. package/dist/viewer/assets/table-B8t5lQz5.js +1 -0
  230. package/dist/viewer/assets/useEvent-DXj38gmC.js +1 -0
  231. package/dist/viewer/assets/useToggleState-D_NUC1vr.js +2 -0
  232. package/dist/viewer/index.html +5 -5
  233. package/fixtures/starters/azure-devops/.factory/factory.config.ts +2 -7
  234. package/fixtures/starters/azure-devops/.factory/factory.lock.json +7 -8
  235. package/fixtures/starters/github/.factory/factory.config.ts +2 -0
  236. package/fixtures/starters/github/.factory/factory.lock.json +6 -7
  237. package/fixtures/starters/gitlab/.factory/factory.config.ts +9 -0
  238. package/fixtures/starters/gitlab/.factory/factory.lock.json +19 -0
  239. package/fixtures/starters/gitlab/.factory/slots/checks.command.md +1 -0
  240. package/fixtures/starters/gitlab/.factory/slots/context.sources.md +3 -0
  241. package/fixtures/starters/gitlab/.factory/slots/review.detectors.md +5 -0
  242. package/package.json +9 -7
  243. package/core/skills/pull-request/scripts/pr-drive.sh +0 -208
  244. package/dist/viewer/assets/Heading-Dm1Q0gV2.js +0 -1
  245. package/dist/viewer/assets/api-C4lMOGdC.js +0 -7
  246. package/dist/viewer/assets/attempt-lbW5voCR.js +0 -1
  247. package/dist/viewer/assets/card-CtJKot3P.js +0 -1
  248. package/dist/viewer/assets/context-DEB-Y3Iz.js +0 -1
  249. package/dist/viewer/assets/index-Co9KwXRI.js +0 -10
  250. package/dist/viewer/assets/jsx-runtime-CkXRJ162.js +0 -1
  251. package/dist/viewer/assets/pipeline-B-myvM6K.js +0 -1
  252. package/dist/viewer/assets/routes-BzvVN6y-.js +0 -1
  253. package/dist/viewer/assets/runs._runId-BVT2VH_w.js +0 -6
  254. package/dist/viewer/assets/runs._runId.index-C3bbzwAC.js +0 -1
  255. package/dist/viewer/assets/runs._runId.machines-Cj21KdLd.js +0 -2
  256. package/dist/viewer/assets/runs._runId.sessions-Tg6Ou3_9.js +0 -1
  257. package/dist/viewer/assets/table-DzduWiYu.js +0 -1
  258. package/dist/viewer/assets/useEvent-CtTfOmE7.js +0 -1
  259. package/dist/viewer/assets/useToggleState-DfzJwOaN.js +0 -2
  260. package/fixtures/starters/azure-devops/.factory/skills/pull-request/SKILL.md +0 -29
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US" dir="ltr">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>How a version ships before npm | Bernard the taktician</title>
7
+ <meta name="description" content="An agentic factory for new builds and legacy migrations.">
8
+ <meta name="generator" content="VitePress v1.6.4">
9
+ <link rel="preload stylesheet" href="/docs/assets/style.C3E8Ltp6.css" as="style">
10
+ <link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
11
+
12
+ <script type="module" src="/docs/assets/app.URmpjWHb.js"></script>
13
+ <link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
+ <link rel="modulepreload" href="/docs/assets/chunks/framework.hgjl6W6o.js">
15
+ <link rel="modulepreload" href="/docs/assets/chunks/theme.Cksh_UJH.js">
16
+ <link rel="modulepreload" href="/docs/assets/chunks/sizeCapture-INFHLROL.BEqL2zFi.js">
17
+ <link rel="modulepreload" href="/docs/assets/chunks/dagre-GXQ25YYZ.2qvw8AqH.js">
18
+ <link rel="modulepreload" href="/docs/assets/chunks/stateDiagram-v2-MP3YSRHH.3X7wNXKX.js">
19
+ <link rel="modulepreload" href="/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js">
20
+ <link rel="modulepreload" href="/docs/assets/docs_adr_0023-how-a-version-ships-before-npm.md.C7-wuCbq.lean.js">
21
+ <link rel="icon" href="/docs/bernard.svg" type="image/svg+xml">
22
+ <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
23
+ <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
24
+ </head>
25
+ <body>
26
+ <div id="app"><div class="Layout" data-v-f87bd3ac><!--[--><!--]--><!--[--><span tabindex="-1" data-v-26966a6b></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-26966a6b>Skip to content</a><!--]--><!----><header class="VPNav" data-v-f87bd3ac data-v-a776a728><div class="VPNavBar" data-v-a776a728 data-v-257d37ee><div class="wrapper" data-v-257d37ee><div class="container" data-v-257d37ee><div class="title" data-v-257d37ee><div class="VPNavBarTitle has-sidebar" data-v-257d37ee data-v-1b9c14bd><a class="title" href="/docs/" data-v-1b9c14bd><!--[--><!--]--><!--[--><img class="VPImage logo" src="/docs/bernard.svg" alt data-v-4a9aa8e2><!--]--><span data-v-1b9c14bd>Bernard</span><!--[--><!--]--></a></div></div><div class="content" data-v-257d37ee><div class="content-body" data-v-257d37ee><!--[--><!--]--><div class="VPNavBarSearch search" data-v-257d37ee><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-257d37ee data-v-96ed2429><span id="main-nav-aria-label" class="visually-hidden" data-v-96ed2429> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/docs/getting-started.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Guides</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/CONTRIBUTING.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Contributing</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/docs/adr/0001-what-the-core-is-built-for.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Decisions</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-257d37ee data-v-772a648f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-772a648f data-v-32dadf2f data-v-033bec8f><span class="check" data-v-033bec8f><span class="icon" data-v-033bec8f><!--[--><span class="vpi-sun sun" data-v-32dadf2f></span><span class="vpi-moon moon" data-v-32dadf2f></span><!--]--></span></span></button></div><!----><div class="VPFlyout VPNavBarExtra extra" data-v-257d37ee data-v-6a77a12d data-v-6ff730e4><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-6ff730e4><span class="vpi-more-horizontal icon" data-v-6ff730e4></span></button><div class="menu" data-v-6ff730e4><div class="VPMenu" data-v-6ff730e4 data-v-7e1ab185><!----><!--[--><!--[--><!----><div class="group" data-v-6a77a12d><div class="item appearance" data-v-6a77a12d><p class="label" data-v-6a77a12d>Appearance</p><div class="appearance-action" data-v-6a77a12d><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6a77a12d data-v-32dadf2f data-v-033bec8f><span class="check" data-v-033bec8f><span class="icon" data-v-033bec8f><!--[--><span class="vpi-sun sun" data-v-32dadf2f></span><span class="vpi-moon moon" data-v-32dadf2f></span><!--]--></span></span></button></div></div></div><!----><!--]--><!--]--></div></div></div><!--[--><!--[--><!--[--><a class="viewer-switch" href="/">Run viewer</a><!--]--><!--]--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-257d37ee data-v-33d7d0d7><span class="container" data-v-33d7d0d7><span class="top" data-v-33d7d0d7></span><span class="middle" data-v-33d7d0d7></span><span class="bottom" data-v-33d7d0d7></span></span></button></div></div></div></div><div class="divider" data-v-257d37ee><div class="divider-line" data-v-257d37ee></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-f87bd3ac data-v-c5f097a9><div class="container" data-v-c5f097a9><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-c5f097a9><span class="vpi-align-left menu-icon" data-v-c5f097a9></span><span class="menu-text" data-v-c5f097a9>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-c5f097a9 data-v-cb88d934><button data-v-cb88d934>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-f87bd3ac data-v-979e8f18><div class="curtain" data-v-979e8f18></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-979e8f18><span class="visually-hidden" id="sidebar-aria-label" data-v-979e8f18> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Bernard</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CONTEXT.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Vocabulary</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Guides</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/getting-started.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Getting started</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/overlay.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>The overlay</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/recipes.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Recipes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Pipeline</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Contributing</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CONTRIBUTING.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Contributing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CLAUDE.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Rules for agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/github.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>GitHub</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/core/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Core content</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/packages/viewer/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Run viewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/packages/docs/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Documentation site</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/fixtures/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Fixtures</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/demo/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Demo</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible collapsed has-active" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Decisions</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0001-what-the-core-is-built-for.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0001 · What the core is built for</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0002-which-harness-a-project-runs-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0002 · Which harness a project runs on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0003-how-core-content-reaches-each-harness.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0003 · How core content reaches each harness</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0004-how-the-core-uses-external-tools.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0004 · How the core uses external tools</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0005-what-drives-the-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0005 · What drives the pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0006-what-steps-hand-off-to-each-other.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0006 · What steps hand off to each other</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0007-how-humans-take-part-in-the-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0007 · How humans take part in the pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0008-where-a-steps-reviewers-run.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0008 · Where a step's reviewers run</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0009-where-pipeline-state-and-handoffs-live.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0009 · Where pipeline state and handoffs live</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0010-how-a-project-adapts-the-core.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0010 · How a project adapts the core</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0011-how-the-factory-is-packaged-and-versioned.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0011 · How the factory is packaged and versioned</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0012-how-a-steps-failures-are-told-apart-and-routed.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0012 · How a step's failures are told apart and routed</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0013-when-code-lands.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0013 · When code lands</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0014-what-a-step-may-change.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0014 · What a step may change</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0015-how-a-project-shapes-its-ticket-flow.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0015 · How a project shapes its ticket flow</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0016-which-core-the-factory-repo-runs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0016 · Which core the factory repo runs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0017-where-a-tickets-record-lives.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0017 · Where a ticket's record lives</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0018-the-products-name.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0018 · The product's name</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0019-how-a-finding-is-answered-and-judged.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0019 · How a finding is answered and judged</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0020-how-an-interrupted-run-resumes.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0020 · How an interrupted run resumes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0021-how-a-step-runs-in-its-workspace.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0021 · How a step runs in its workspace</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0022-who-names-the-branches.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0022 · Who names the branches</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0023-how-a-version-ships-before-npm.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0023 · How a version ships before npm</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0024-how-the-config-type-carries-its-docs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0024 · How the config type carries its docs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0025-how-a-steps-handoff-is-written-and-checked.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0025 · How a step's handoff is written and checked</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0026-support-for-github-copilot.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0026 · Support for GitHub Copilot</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0027-which-forge-a-project-is-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0027 · Which forge a project is on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0028-several-ticket-flows-in-one-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0028 · Several ticket flows in one pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0029-the-branch-a-feature-works-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0029 · The branch a feature works on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0030-a-runner-without-coder.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0030 · A runner without Coder</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0031-how-the-run-viewer-reads-its-runs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0031 · How the run viewer reads its runs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0032-how-a-project-gets-the-viewer.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0032 · How a project gets the viewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0033-the-repos-license.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0033 · The repo's license</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0034-how-code-review-launches-its-reviewers.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0034 · How code review launches its reviewers</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0035-how-the-package-is-published.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0035 · How the package is published</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0036-what-the-cores-pull-request-skill-does.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0036 · What the core's pull-request skill does</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0037-how-a-team-reads-the-factorys-documentation.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0037 · How a team reads the factory's documentation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0038-where-adapters-live.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0038 · Where adapters live</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0039-the-repos-license.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0039 · The repo's license</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0040-how-a-version-is-released.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0040 · How a version is released</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0041-who-opens-the-features-pull-request.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0041 · Who opens the feature's pull request, and how a ticket reaches it</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0042-how-secrets-are-kept-out-of-committed-records.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0042 · How secrets are kept out of committed records</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-f87bd3ac data-v-67e000d0><div class="VPDoc has-sidebar has-aside" data-v-67e000d0 data-v-f8622dbf><!--[--><!--]--><div class="container" data-v-f8622dbf><div class="aside" data-v-f8622dbf><div class="aside-curtain" data-v-f8622dbf></div><div class="aside-container" data-v-f8622dbf><div class="aside-content" data-v-f8622dbf><div class="VPDocAside" data-v-f8622dbf data-v-fc01c646><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-fc01c646 data-v-172fd98a><div class="content" data-v-172fd98a><div class="outline-marker" data-v-172fd98a></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-172fd98a>On this page</div><ul class="VPDocOutlineItem root" data-v-172fd98a data-v-ea4171dd><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-fc01c646></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-f8622dbf><div class="content-container" data-v-f8622dbf><!--[--><!--]--><main class="main" data-v-f8622dbf><div style="position:relative;" class="vp-doc _docs_docs_adr_0023-how-a-version-ships-before-npm" data-v-f8622dbf><div><h1 id="how-a-version-ships-before-npm" tabindex="-1">How a version ships before npm <a class="header-anchor" href="#how-a-version-ships-before-npm" aria-label="Permalink to &quot;How a version ships before npm&quot;">​</a></h1><p>Superseded by ADR-0035 · 2026-10-22</p><h2 id="context" tabindex="-1">Context <a class="header-anchor" href="#context" aria-label="Permalink to &quot;Context&quot;">​</a></h2><p>ADR-0011 publishes the factory as one npm package. We cannot publish it yet: we have no rights on the <code>@theodo-group</code> organisation of npmjs.com. GitHub Packages, the registry ADR-0011 first named, needs a token even to install, and so would a restricted package on npmjs.com: a client&#39;s developers and its CI have neither.</p><h2 id="criteria" tabindex="-1">Criteria <a class="header-anchor" href="#criteria" aria-label="Permalink to &quot;Criteria&quot;">​</a></h2><ol><li><strong>Runs outside this repo now</strong>: until the package is on npm, nothing outside this repo can run the factory.</li><li><strong>Installs without a token</strong>: a client&#39;s developers and its CI have no token, nor access to this private repo.</li><li><strong>Dependencies installed as usual</strong>: a project installs them from npmjs.com, or from its client&#39;s mirror of it, as it does for any Node tool, rather than carrying them and their licences in the tarball.</li><li><strong>We control the releases</strong>: we decide when a version ships and what it is called, while releases are rare.</li></ol><h2 id="options" tabindex="-1">Options <a class="header-anchor" href="#options" aria-label="Permalink to &quot;Options&quot;">​</a></h2><ul><li><strong>Wait for publishing rights on npm.</strong> Nothing outside this repo can run the factory until then (1).</li><li><strong>A GitHub release of this repo.</strong> A project downloads the tarball, commits it and installs it: only the person who upgrades the factory needs access to this repo, and the project&#39;s developers and its CI install from the committed tarball (1, 2). The dependencies in <code>package.json</code> are installed with it, from npmjs.com (3). A release is manual, so that we decide when a version ships and what it is called (4). The tarball is committed in each project&#39;s history, once per upgrade, and a project upgrades by hand.</li><li><strong>GitHub Packages, as ADR-0011 first said.</strong> Every developer and every CI of a client project would need a GitHub token with access to it (2).</li><li><strong>A git dependency on a tag.</strong> The <code>workspace:*</code> dependencies don&#39;t install from git, so the build would have to be committed on a release branch. Installing would still need access to this private repo (2).</li><li><strong>Bundle the dependencies too, so that the tarball installs without a registry.</strong> The tarball would carry jiti, zod, xstate, handlebars, yaml and verkit, and their licences. A project installs them from npmjs.com, or from its client&#39;s mirror of it, as it does for any Node tool (3).</li><li><strong>Release from a merged release pull request, with release-please.</strong> It would derive the version from the Conventional Commits and write a changelog. We want to keep control of the releases while they are rare, and the manual release is two steps (4).</li></ul><h2 id="comparison" tabindex="-1">Comparison <a class="header-anchor" href="#comparison" aria-label="Permalink to &quot;Comparison&quot;">​</a></h2><table tabindex="0"><thead><tr><th>Option</th><th>1. Runs now</th><th>2. No token</th><th>3. Dependencies as usual</th><th>4. Control of releases</th></tr></thead><tbody><tr><td>Wait for npm</td><td>🔴</td><td>⚪</td><td>⚪</td><td>⚪</td></tr><tr><td>A GitHub release</td><td>🟢</td><td>🟢</td><td>🟢</td><td>🟢</td></tr><tr><td>GitHub Packages</td><td>⚪</td><td>🔴</td><td>⚪</td><td>⚪</td></tr><tr><td>A git dependency on a tag</td><td>⚪</td><td>🔴</td><td>⚪</td><td>⚪</td></tr><tr><td>Bundle the dependencies</td><td>⚪</td><td>⚪</td><td>🔴</td><td>⚪</td></tr><tr><td>release-please</td><td>⚪</td><td>⚪</td><td>⚪</td><td>🔴</td></tr></tbody></table><p>🟢 meets · 🟠 partly, or at a cost · 🔴 fails · ⚪ not discussed</p><h2 id="decision" tabindex="-1">Decision <a class="header-anchor" href="#decision" aria-label="Permalink to &quot;Decision&quot;">​</a></h2><p>A GitHub release of this repo. Until the package is on npm, a version is a GitHub release of this repo:</p><ul><li>The package is <code>@theodo-group/bernard</code>, the root of this repo. tsdown bundles the workspace packages into <code>dist/</code>: the <code>bernard</code> bin, and the <code>config</code> module a project&#39;s config imports <code>defineConfig</code> from, with its types. It ships <code>core/</code> and the starter overlay next to <code>dist/</code>. The dependencies in <code>package.json</code> are installed with it, from npmjs.com.</li><li>The package stays <code>private</code>, so that nothing publishes it by mistake. <code>pnpm pack</code> builds it all the same.</li><li>A release is manual, so that we decide when a version ships and what it is called. A pull request bumps <code>version</code> in <code>package.json</code>, along with the lock files that record it. Once it is merged, pushing a tag <code>vX.Y.Z</code> runs the Release workflow. It checks the package, then creates the release with the tarball attached and notes generated by GitHub. A version with a suffix, such as <code>0.1.0-alpha.0</code>, is a pre-release.</li><li>A project downloads the tarball into <code>.factory/</code>, commits it, and installs it with pnpm, which pins it in <code>.factory/package.json</code> as <code>file:theodo-group-bernard-&lt;version&gt;.tgz</code>. <code>.factory/</code> stays out of the project&#39;s own pnpm workspace, if it has one, so its lockfile is its own. Only the person who upgrades the factory needs access to this repo. The project&#39;s developers and its CI install from the committed tarball.</li><li><code>install.sh</code>, at the root of this repo, does all of that in one line, which <code>gh</code> fetches from the private repo. The same line upgrades the factory.</li><li><code>bernard</code> resolves the config&#39;s import of <code>@theodo-group/bernard/config</code> itself, so a config also loads where the package is not installed, such as in this repo.</li></ul><p>Bundling the dependencies is rejected for now. Releasing with release-please is rejected for now too: we revisit it when releasing by hand becomes a chore.</p><h2 id="consequences" tabindex="-1">Consequences <a class="header-anchor" href="#consequences" aria-label="Permalink to &quot;Consequences&quot;">​</a></h2><ul><li>The tarball, about 50 kB, is committed in each project&#39;s history, once per upgrade.</li><li>The factory&#39;s code is in the client&#39;s repository. The core&#39;s skills already were, rendered in <code>.claude/</code>.</li><li>A client that forbids binaries in git, or imposes its own registry, gets the same tarball pushed to that registry instead.</li><li>Renovate and Dependabot don&#39;t follow a file dependency: until the package is on npm, a project upgrades by hand.</li><li>Once we can publish to npm, a release publishes there too, and a project pins a version instead of a file, without touching its config. That switch remains in #23.</li></ul></div></div></main><footer class="VPDocFooter" data-v-f8622dbf data-v-020e2df0><!--[--><!--]--><div class="edit-info" data-v-020e2df0><div class="edit-link" data-v-020e2df0><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/theodo-group/bernard/edit/main/docs/adr/0023-how-a-version-ships-before-npm.md" target="_blank" rel="noreferrer" data-v-020e2df0><!--[--><span class="vpi-square-pen edit-link-icon" data-v-020e2df0></span> Edit this page on GitHub<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-020e2df0><span class="visually-hidden" id="doc-footer-aria-label" data-v-020e2df0>Pager</span><div class="pager" data-v-020e2df0><a class="VPLink link pager-link prev" href="/docs/docs/adr/0022-who-names-the-branches.html" data-v-020e2df0><!--[--><span class="desc" data-v-020e2df0>Previous page</span><span class="title" data-v-020e2df0>0022 · Who names the branches</span><!--]--></a></div><div class="pager" data-v-020e2df0><a class="VPLink link pager-link next" href="/docs/docs/adr/0024-how-the-config-type-carries-its-docs.html" data-v-020e2df0><!--[--><span class="desc" data-v-020e2df0>Next page</span><span class="title" data-v-020e2df0>0024 · How the config type carries its docs</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
27
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"claude.md\":\"BLSB-5gK\",\"context.md\":\"BovnvMGK\",\"contributing.md\":\"DwJsKrz3\",\"core_readme.md\":\"DyxYsikc\",\"demo_readme.md\":\"Cpi2pUU9\",\"docs_adr_0001-what-the-core-is-built-for.md\":\"BxOoMjST\",\"docs_adr_0002-which-harness-a-project-runs-on.md\":\"2GwF-nj0\",\"docs_adr_0003-how-core-content-reaches-each-harness.md\":\"BMWE00Mf\",\"docs_adr_0004-how-the-core-uses-external-tools.md\":\"B7dtE7MB\",\"docs_adr_0005-what-drives-the-pipeline.md\":\"DGn0CJeq\",\"docs_adr_0006-what-steps-hand-off-to-each-other.md\":\"BflT5ugJ\",\"docs_adr_0007-how-humans-take-part-in-the-pipeline.md\":\"CNX3gUD-\",\"docs_adr_0008-where-a-steps-reviewers-run.md\":\"aGbaBOpB\",\"docs_adr_0009-where-pipeline-state-and-handoffs-live.md\":\"C3tKmV-E\",\"docs_adr_0010-how-a-project-adapts-the-core.md\":\"Bp7N6tUE\",\"docs_adr_0011-how-the-factory-is-packaged-and-versioned.md\":\"BBJIwnqa\",\"docs_adr_0012-how-a-steps-failures-are-told-apart-and-routed.md\":\"uCyrBfug\",\"docs_adr_0013-when-code-lands.md\":\"oXgiobfz\",\"docs_adr_0014-what-a-step-may-change.md\":\"Zslg3bnJ\",\"docs_adr_0015-how-a-project-shapes-its-ticket-flow.md\":\"DNHMxwIT\",\"docs_adr_0016-which-core-the-factory-repo-runs.md\":\"CLN6LqBZ\",\"docs_adr_0017-where-a-tickets-record-lives.md\":\"jjUeM-ex\",\"docs_adr_0018-the-products-name.md\":\"6xaX9vDs\",\"docs_adr_0019-how-a-finding-is-answered-and-judged.md\":\"CKKoO9-3\",\"docs_adr_0020-how-an-interrupted-run-resumes.md\":\"DTIP-MBK\",\"docs_adr_0021-how-a-step-runs-in-its-workspace.md\":\"B2r3-FPg\",\"docs_adr_0022-who-names-the-branches.md\":\"DaVk8X0i\",\"docs_adr_0023-how-a-version-ships-before-npm.md\":\"C7-wuCbq\",\"docs_adr_0024-how-the-config-type-carries-its-docs.md\":\"CQmwhWXs\",\"docs_adr_0025-how-a-steps-handoff-is-written-and-checked.md\":\"CgXYdF2v\",\"docs_adr_0026-support-for-github-copilot.md\":\"DJsawm-R\",\"docs_adr_0027-which-forge-a-project-is-on.md\":\"CY0qy9xh\",\"docs_adr_0028-several-ticket-flows-in-one-pipeline.md\":\"oxffo2qg\",\"docs_adr_0029-the-branch-a-feature-works-on.md\":\"CrgkP6YJ\",\"docs_adr_0030-a-runner-without-coder.md\":\"CW8sF7jK\",\"docs_adr_0031-how-the-run-viewer-reads-its-runs.md\":\"opQYnVF2\",\"docs_adr_0032-how-a-project-gets-the-viewer.md\":\"DB9NjYJf\",\"docs_adr_0033-the-repos-license.md\":\"NPlkrPj8\",\"docs_adr_0034-how-code-review-launches-its-reviewers.md\":\"DSNpkfaL\",\"docs_adr_0035-how-the-package-is-published.md\":\"C1f4B5eb\",\"docs_adr_0036-what-the-cores-pull-request-skill-does.md\":\"op39HLAT\",\"docs_adr_0037-how-a-team-reads-the-factorys-documentation.md\":\"Dar_Xo4t\",\"docs_adr_0038-where-adapters-live.md\":\"CkVD3riv\",\"docs_adr_0039-the-repos-license.md\":\"C_rraWpb\",\"docs_adr_0040-how-a-version-is-released.md\":\"CCdwC07z\",\"docs_adr_0041-who-opens-the-features-pull-request.md\":\"qLu9WLaG\",\"docs_adr_0042-how-secrets-are-kept-out-of-committed-records.md\":\"DJWazI4H\",\"docs_getting-started.md\":\"BpQFS8Gr\",\"docs_github.md\":\"D4gkW71G\",\"docs_overlay.md\":\"DoWVb6OM\",\"docs_pipeline.md\":\"DdHywWSk\",\"docs_recipes.md\":\"8Xf6BsRA\",\"fixtures_readme.md\":\"DzbQ0hft\",\"index.md\":\"DHgL6CzS\",\"packages_docs_readme.md\":\"PV1a27nC\",\"packages_viewer_readme.md\":\"BynKZSdN\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Bernard the taktician\",\"description\":\"An agentic factory for new builds and legacy migrations.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/bernard.svg\",\"siteTitle\":\"Bernard\",\"outline\":[2,3],\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Guides\",\"link\":\"/docs/getting-started\"},{\"text\":\"Contributing\",\"link\":\"/CONTRIBUTING\"},{\"text\":\"Decisions\",\"link\":\"/docs/adr/0001-what-the-core-is-built-for\"}],\"sidebar\":[{\"text\":\"Bernard\",\"collapsed\":false,\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Vocabulary\",\"link\":\"/CONTEXT\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Getting started\",\"link\":\"/docs/getting-started\"},{\"text\":\"The overlay\",\"link\":\"/docs/overlay\"},{\"text\":\"Recipes\",\"link\":\"/docs/recipes\"},{\"text\":\"Pipeline\",\"link\":\"/docs/pipeline\"}]},{\"text\":\"Contributing\",\"collapsed\":false,\"items\":[{\"text\":\"Contributing\",\"link\":\"/CONTRIBUTING\"},{\"text\":\"Rules for agents\",\"link\":\"/CLAUDE\"},{\"text\":\"GitHub\",\"link\":\"/docs/github\"},{\"text\":\"Core content\",\"link\":\"/core/README\"},{\"text\":\"Run viewer\",\"link\":\"/packages/viewer/README\"},{\"text\":\"Documentation site\",\"link\":\"/packages/docs/README\"},{\"text\":\"Fixtures\",\"link\":\"/fixtures/README\"},{\"text\":\"Demo\",\"link\":\"/demo/README\"}]},{\"text\":\"Decisions\",\"collapsed\":true,\"items\":[{\"text\":\"0001 · What the core is built for\",\"link\":\"/docs/adr/0001-what-the-core-is-built-for\"},{\"text\":\"0002 · Which harness a project runs on\",\"link\":\"/docs/adr/0002-which-harness-a-project-runs-on\"},{\"text\":\"0003 · How core content reaches each harness\",\"link\":\"/docs/adr/0003-how-core-content-reaches-each-harness\"},{\"text\":\"0004 · How the core uses external tools\",\"link\":\"/docs/adr/0004-how-the-core-uses-external-tools\"},{\"text\":\"0005 · What drives the pipeline\",\"link\":\"/docs/adr/0005-what-drives-the-pipeline\"},{\"text\":\"0006 · What steps hand off to each other\",\"link\":\"/docs/adr/0006-what-steps-hand-off-to-each-other\"},{\"text\":\"0007 · How humans take part in the pipeline\",\"link\":\"/docs/adr/0007-how-humans-take-part-in-the-pipeline\"},{\"text\":\"0008 · Where a step's reviewers run\",\"link\":\"/docs/adr/0008-where-a-steps-reviewers-run\"},{\"text\":\"0009 · Where pipeline state and handoffs live\",\"link\":\"/docs/adr/0009-where-pipeline-state-and-handoffs-live\"},{\"text\":\"0010 · How a project adapts the core\",\"link\":\"/docs/adr/0010-how-a-project-adapts-the-core\"},{\"text\":\"0011 · How the factory is packaged and versioned\",\"link\":\"/docs/adr/0011-how-the-factory-is-packaged-and-versioned\"},{\"text\":\"0012 · How a step's failures are told apart and routed\",\"link\":\"/docs/adr/0012-how-a-steps-failures-are-told-apart-and-routed\"},{\"text\":\"0013 · When code lands\",\"link\":\"/docs/adr/0013-when-code-lands\"},{\"text\":\"0014 · What a step may change\",\"link\":\"/docs/adr/0014-what-a-step-may-change\"},{\"text\":\"0015 · How a project shapes its ticket flow\",\"link\":\"/docs/adr/0015-how-a-project-shapes-its-ticket-flow\"},{\"text\":\"0016 · Which core the factory repo runs\",\"link\":\"/docs/adr/0016-which-core-the-factory-repo-runs\"},{\"text\":\"0017 · Where a ticket's record lives\",\"link\":\"/docs/adr/0017-where-a-tickets-record-lives\"},{\"text\":\"0018 · The product's name\",\"link\":\"/docs/adr/0018-the-products-name\"},{\"text\":\"0019 · How a finding is answered and judged\",\"link\":\"/docs/adr/0019-how-a-finding-is-answered-and-judged\"},{\"text\":\"0020 · How an interrupted run resumes\",\"link\":\"/docs/adr/0020-how-an-interrupted-run-resumes\"},{\"text\":\"0021 · How a step runs in its workspace\",\"link\":\"/docs/adr/0021-how-a-step-runs-in-its-workspace\"},{\"text\":\"0022 · Who names the branches\",\"link\":\"/docs/adr/0022-who-names-the-branches\"},{\"text\":\"0023 · How a version ships before npm\",\"link\":\"/docs/adr/0023-how-a-version-ships-before-npm\"},{\"text\":\"0024 · How the config type carries its docs\",\"link\":\"/docs/adr/0024-how-the-config-type-carries-its-docs\"},{\"text\":\"0025 · How a step's handoff is written and checked\",\"link\":\"/docs/adr/0025-how-a-steps-handoff-is-written-and-checked\"},{\"text\":\"0026 · Support for GitHub Copilot\",\"link\":\"/docs/adr/0026-support-for-github-copilot\"},{\"text\":\"0027 · Which forge a project is on\",\"link\":\"/docs/adr/0027-which-forge-a-project-is-on\"},{\"text\":\"0028 · Several ticket flows in one pipeline\",\"link\":\"/docs/adr/0028-several-ticket-flows-in-one-pipeline\"},{\"text\":\"0029 · The branch a feature works on\",\"link\":\"/docs/adr/0029-the-branch-a-feature-works-on\"},{\"text\":\"0030 · A runner without Coder\",\"link\":\"/docs/adr/0030-a-runner-without-coder\"},{\"text\":\"0031 · How the run viewer reads its runs\",\"link\":\"/docs/adr/0031-how-the-run-viewer-reads-its-runs\"},{\"text\":\"0032 · How a project gets the viewer\",\"link\":\"/docs/adr/0032-how-a-project-gets-the-viewer\"},{\"text\":\"0033 · The repo's license\",\"link\":\"/docs/adr/0033-the-repos-license\"},{\"text\":\"0034 · How code review launches its reviewers\",\"link\":\"/docs/adr/0034-how-code-review-launches-its-reviewers\"},{\"text\":\"0035 · How the package is published\",\"link\":\"/docs/adr/0035-how-the-package-is-published\"},{\"text\":\"0036 · What the core's pull-request skill does\",\"link\":\"/docs/adr/0036-what-the-cores-pull-request-skill-does\"},{\"text\":\"0037 · How a team reads the factory's documentation\",\"link\":\"/docs/adr/0037-how-a-team-reads-the-factorys-documentation\"},{\"text\":\"0038 · Where adapters live\",\"link\":\"/docs/adr/0038-where-adapters-live\"},{\"text\":\"0039 · The repo's license\",\"link\":\"/docs/adr/0039-the-repos-license\"},{\"text\":\"0040 · How a version is released\",\"link\":\"/docs/adr/0040-how-a-version-is-released\"},{\"text\":\"0041 · Who opens the feature's pull request, and how a ticket reaches it\",\"link\":\"/docs/adr/0041-who-opens-the-features-pull-request\"},{\"text\":\"0042 · How secrets are kept out of committed records\",\"link\":\"/docs/adr/0042-how-secrets-are-kept-out-of-committed-records\"}]}],\"editLink\":{\"pattern\":\"https://github.com/theodo-group/bernard/edit/main/:path\",\"text\":\"Edit this page on GitHub\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
28
+
29
+ </body>
30
+ </html>
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US" dir="ltr">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>How the config type carries its docs | Bernard the taktician</title>
7
+ <meta name="description" content="An agentic factory for new builds and legacy migrations.">
8
+ <meta name="generator" content="VitePress v1.6.4">
9
+ <link rel="preload stylesheet" href="/docs/assets/style.C3E8Ltp6.css" as="style">
10
+ <link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
11
+
12
+ <script type="module" src="/docs/assets/app.URmpjWHb.js"></script>
13
+ <link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
+ <link rel="modulepreload" href="/docs/assets/chunks/framework.hgjl6W6o.js">
15
+ <link rel="modulepreload" href="/docs/assets/chunks/theme.Cksh_UJH.js">
16
+ <link rel="modulepreload" href="/docs/assets/chunks/sizeCapture-INFHLROL.BEqL2zFi.js">
17
+ <link rel="modulepreload" href="/docs/assets/chunks/dagre-GXQ25YYZ.2qvw8AqH.js">
18
+ <link rel="modulepreload" href="/docs/assets/chunks/stateDiagram-v2-MP3YSRHH.3X7wNXKX.js">
19
+ <link rel="modulepreload" href="/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js">
20
+ <link rel="modulepreload" href="/docs/assets/docs_adr_0024-how-the-config-type-carries-its-docs.md.CQmwhWXs.lean.js">
21
+ <link rel="icon" href="/docs/bernard.svg" type="image/svg+xml">
22
+ <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
23
+ <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
24
+ </head>
25
+ <body>
26
+ <div id="app"><div class="Layout" data-v-f87bd3ac><!--[--><!--]--><!--[--><span tabindex="-1" data-v-26966a6b></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-26966a6b>Skip to content</a><!--]--><!----><header class="VPNav" data-v-f87bd3ac data-v-a776a728><div class="VPNavBar" data-v-a776a728 data-v-257d37ee><div class="wrapper" data-v-257d37ee><div class="container" data-v-257d37ee><div class="title" data-v-257d37ee><div class="VPNavBarTitle has-sidebar" data-v-257d37ee data-v-1b9c14bd><a class="title" href="/docs/" data-v-1b9c14bd><!--[--><!--]--><!--[--><img class="VPImage logo" src="/docs/bernard.svg" alt data-v-4a9aa8e2><!--]--><span data-v-1b9c14bd>Bernard</span><!--[--><!--]--></a></div></div><div class="content" data-v-257d37ee><div class="content-body" data-v-257d37ee><!--[--><!--]--><div class="VPNavBarSearch search" data-v-257d37ee><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-257d37ee data-v-96ed2429><span id="main-nav-aria-label" class="visually-hidden" data-v-96ed2429> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/docs/getting-started.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Guides</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/CONTRIBUTING.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Contributing</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/docs/adr/0001-what-the-core-is-built-for.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Decisions</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-257d37ee data-v-772a648f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-772a648f data-v-32dadf2f data-v-033bec8f><span class="check" data-v-033bec8f><span class="icon" data-v-033bec8f><!--[--><span class="vpi-sun sun" data-v-32dadf2f></span><span class="vpi-moon moon" data-v-32dadf2f></span><!--]--></span></span></button></div><!----><div class="VPFlyout VPNavBarExtra extra" data-v-257d37ee data-v-6a77a12d data-v-6ff730e4><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-6ff730e4><span class="vpi-more-horizontal icon" data-v-6ff730e4></span></button><div class="menu" data-v-6ff730e4><div class="VPMenu" data-v-6ff730e4 data-v-7e1ab185><!----><!--[--><!--[--><!----><div class="group" data-v-6a77a12d><div class="item appearance" data-v-6a77a12d><p class="label" data-v-6a77a12d>Appearance</p><div class="appearance-action" data-v-6a77a12d><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6a77a12d data-v-32dadf2f data-v-033bec8f><span class="check" data-v-033bec8f><span class="icon" data-v-033bec8f><!--[--><span class="vpi-sun sun" data-v-32dadf2f></span><span class="vpi-moon moon" data-v-32dadf2f></span><!--]--></span></span></button></div></div></div><!----><!--]--><!--]--></div></div></div><!--[--><!--[--><!--[--><a class="viewer-switch" href="/">Run viewer</a><!--]--><!--]--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-257d37ee data-v-33d7d0d7><span class="container" data-v-33d7d0d7><span class="top" data-v-33d7d0d7></span><span class="middle" data-v-33d7d0d7></span><span class="bottom" data-v-33d7d0d7></span></span></button></div></div></div></div><div class="divider" data-v-257d37ee><div class="divider-line" data-v-257d37ee></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-f87bd3ac data-v-c5f097a9><div class="container" data-v-c5f097a9><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-c5f097a9><span class="vpi-align-left menu-icon" data-v-c5f097a9></span><span class="menu-text" data-v-c5f097a9>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-c5f097a9 data-v-cb88d934><button data-v-cb88d934>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-f87bd3ac data-v-979e8f18><div class="curtain" data-v-979e8f18></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-979e8f18><span class="visually-hidden" id="sidebar-aria-label" data-v-979e8f18> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Bernard</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CONTEXT.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Vocabulary</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Guides</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/getting-started.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Getting started</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/overlay.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>The overlay</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/recipes.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Recipes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Pipeline</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Contributing</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CONTRIBUTING.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Contributing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CLAUDE.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Rules for agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/github.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>GitHub</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/core/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Core content</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/packages/viewer/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Run viewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/packages/docs/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Documentation site</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/fixtures/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Fixtures</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/demo/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Demo</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible collapsed has-active" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Decisions</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0001-what-the-core-is-built-for.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0001 · What the core is built for</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0002-which-harness-a-project-runs-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0002 · Which harness a project runs on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0003-how-core-content-reaches-each-harness.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0003 · How core content reaches each harness</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0004-how-the-core-uses-external-tools.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0004 · How the core uses external tools</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0005-what-drives-the-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0005 · What drives the pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0006-what-steps-hand-off-to-each-other.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0006 · What steps hand off to each other</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0007-how-humans-take-part-in-the-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0007 · How humans take part in the pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0008-where-a-steps-reviewers-run.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0008 · Where a step's reviewers run</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0009-where-pipeline-state-and-handoffs-live.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0009 · Where pipeline state and handoffs live</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0010-how-a-project-adapts-the-core.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0010 · How a project adapts the core</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0011-how-the-factory-is-packaged-and-versioned.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0011 · How the factory is packaged and versioned</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0012-how-a-steps-failures-are-told-apart-and-routed.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0012 · How a step's failures are told apart and routed</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0013-when-code-lands.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0013 · When code lands</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0014-what-a-step-may-change.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0014 · What a step may change</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0015-how-a-project-shapes-its-ticket-flow.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0015 · How a project shapes its ticket flow</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0016-which-core-the-factory-repo-runs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0016 · Which core the factory repo runs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0017-where-a-tickets-record-lives.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0017 · Where a ticket's record lives</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0018-the-products-name.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0018 · The product's name</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0019-how-a-finding-is-answered-and-judged.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0019 · How a finding is answered and judged</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0020-how-an-interrupted-run-resumes.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0020 · How an interrupted run resumes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0021-how-a-step-runs-in-its-workspace.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0021 · How a step runs in its workspace</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0022-who-names-the-branches.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0022 · Who names the branches</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0023-how-a-version-ships-before-npm.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0023 · How a version ships before npm</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0024-how-the-config-type-carries-its-docs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0024 · How the config type carries its docs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0025-how-a-steps-handoff-is-written-and-checked.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0025 · How a step's handoff is written and checked</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0026-support-for-github-copilot.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0026 · Support for GitHub Copilot</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0027-which-forge-a-project-is-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0027 · Which forge a project is on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0028-several-ticket-flows-in-one-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0028 · Several ticket flows in one pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0029-the-branch-a-feature-works-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0029 · The branch a feature works on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0030-a-runner-without-coder.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0030 · A runner without Coder</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0031-how-the-run-viewer-reads-its-runs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0031 · How the run viewer reads its runs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0032-how-a-project-gets-the-viewer.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0032 · How a project gets the viewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0033-the-repos-license.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0033 · The repo's license</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0034-how-code-review-launches-its-reviewers.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0034 · How code review launches its reviewers</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0035-how-the-package-is-published.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0035 · How the package is published</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0036-what-the-cores-pull-request-skill-does.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0036 · What the core's pull-request skill does</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0037-how-a-team-reads-the-factorys-documentation.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0037 · How a team reads the factory's documentation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0038-where-adapters-live.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0038 · Where adapters live</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0039-the-repos-license.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0039 · The repo's license</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0040-how-a-version-is-released.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0040 · How a version is released</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0041-who-opens-the-features-pull-request.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0041 · Who opens the feature's pull request, and how a ticket reaches it</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0042-how-secrets-are-kept-out-of-committed-records.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0042 · How secrets are kept out of committed records</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-f87bd3ac data-v-67e000d0><div class="VPDoc has-sidebar has-aside" data-v-67e000d0 data-v-f8622dbf><!--[--><!--]--><div class="container" data-v-f8622dbf><div class="aside" data-v-f8622dbf><div class="aside-curtain" data-v-f8622dbf></div><div class="aside-container" data-v-f8622dbf><div class="aside-content" data-v-f8622dbf><div class="VPDocAside" data-v-f8622dbf data-v-fc01c646><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-fc01c646 data-v-172fd98a><div class="content" data-v-172fd98a><div class="outline-marker" data-v-172fd98a></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-172fd98a>On this page</div><ul class="VPDocOutlineItem root" data-v-172fd98a data-v-ea4171dd><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-fc01c646></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-f8622dbf><div class="content-container" data-v-f8622dbf><!--[--><!--]--><main class="main" data-v-f8622dbf><div style="position:relative;" class="vp-doc _docs_docs_adr_0024-how-the-config-type-carries-its-docs" data-v-f8622dbf><div><h1 id="how-the-config-type-carries-its-docs" tabindex="-1">How the config type carries its docs <a class="header-anchor" href="#how-the-config-type-carries-its-docs" aria-label="Permalink to &quot;How the config type carries its docs&quot;">​</a></h1><p>Accepted · 2026-10-22</p><h2 id="context" tabindex="-1">Context <a class="header-anchor" href="#context" aria-label="Permalink to &quot;Context&quot;">​</a></h2><p>A project writes <code>.factory/factory.config.ts</code> in its editor, against the types of <code>@theodo/bernard/config</code>. Each field must explain itself there, on hover, without a trip to <a href="./../overlay.html">docs/overlay.md</a>.</p><p>The zod schema in <code>packages/contracts</code> parses the config, and a type inferred from it carries the docs written on the schema&#39;s fields. The published types lose them: tsgo, which generates <code>dist/config.d.mts</code>, drops the comments of inferred types, where TypeScript 5 kept them.</p><h2 id="criteria" tabindex="-1">Criteria <a class="header-anchor" href="#criteria" aria-label="Permalink to &quot;Criteria&quot;">​</a></h2><ol><li><strong>Docs on hover in a project</strong>: each field must explain itself in the project&#39;s editor, which reads <code>dist/</code>, without a trip to the docs.</li><li><strong>The repo&#39;s own compiler</strong>: a second TypeScript in the dependencies, pinned for one plugin by a pnpm override, works around the compiler the repo chose.</li><li><strong>Types the project can check</strong>: the project&#39;s TypeScript checks what we publish under its own options.</li><li><strong>Little to write</strong>: a type generator to write or depend on is a lot for a hundred lines.</li></ol><h2 id="options" tabindex="-1">Options <a class="header-anchor" href="#options" aria-label="Permalink to &quot;Options&quot;">​</a></h2><ul><li><strong>Docs on the schema, types inferred.</strong> They reach the editor in this repo, which reads the sources, but not in a project, which reads <code>dist/</code> (1).</li><li><strong><code>FactoryConfigInput</code> written out in interfaces.</strong> The type <code>defineConfig</code> takes carries a doc on every field, and the hover shows plain types (1). A config field is written twice, in the schema and in <code>FactoryConfigInput</code>, and a test names the one left behind (4).</li><li><strong>Generate the <code>.d.ts</code> with TypeScript 6, which keeps the comments.</strong> A second TypeScript in the dependencies, pinned for one plugin by a pnpm override, to work around the compiler the repo chose (2).</li><li><strong>Publish the sources of the config module as its types.</strong> The project&#39;s TypeScript would check our sources under its own options, and fail on some (3).</li><li><strong>Write the docs as zod descriptions and generate the type from them.</strong> It would also generate the tables of <code>docs/overlay.md</code>. A type generator to write or depend on, for a hundred lines (4).</li></ul><h2 id="comparison" tabindex="-1">Comparison <a class="header-anchor" href="#comparison" aria-label="Permalink to &quot;Comparison&quot;">​</a></h2><table tabindex="0"><thead><tr><th>Option</th><th>1. Docs on hover</th><th>2. The repo&#39;s compiler</th><th>3. Checkable types</th><th>4. Little to write</th></tr></thead><tbody><tr><td>Docs on the schema, types inferred</td><td>🔴</td><td>🟢</td><td>⚪</td><td>🟢</td></tr><tr><td><code>FactoryConfigInput</code> written out</td><td>🟢</td><td>🟢</td><td>🟢</td><td>🟠</td></tr><tr><td>TypeScript 6 for the <code>.d.ts</code></td><td>🟢</td><td>🔴</td><td>⚪</td><td>⚪</td></tr><tr><td>Publish the sources</td><td>🟢</td><td>⚪</td><td>🔴</td><td>⚪</td></tr><tr><td>Generate the type from zod descriptions</td><td>🟢</td><td>⚪</td><td>⚪</td><td>🔴</td></tr></tbody></table><p>🟢 meets · 🟠 partly, or at a cost · 🔴 fails · ⚪ not discussed</p><h2 id="decision" tabindex="-1">Decision <a class="header-anchor" href="#decision" aria-label="Permalink to &quot;Decision&quot;">​</a></h2><p><code>FactoryConfigInput</code> written out in interfaces. So <code>FactoryConfigInput</code>, the type <code>defineConfig</code> takes, is written out in interfaces, with a doc on every field. The schema keeps the validation and the defaults, and no docs. A test checks at type level that <code>FactoryConfigInput</code> equals the schema&#39;s input, so the typecheck fails when they drift apart.</p><p>Generating the type from zod descriptions is rejected for now.</p><h2 id="consequences" tabindex="-1">Consequences <a class="header-anchor" href="#consequences" aria-label="Permalink to &quot;Consequences&quot;">​</a></h2><ul><li>A config field is written twice: in the schema and in <code>FactoryConfigInput</code>. The test names the one left behind.</li><li>The hover shows plain types, such as <code>harness: &#39;claude-code&#39; | &#39;pi&#39;</code>, rather than zod&#39;s.</li><li>A field&#39;s default is in its doc, since a type cannot carry it.</li><li>The output type, <code>FactoryConfig</code>, stays inferred: only the CLI reads it.</li></ul></div></div></main><footer class="VPDocFooter" data-v-f8622dbf data-v-020e2df0><!--[--><!--]--><div class="edit-info" data-v-020e2df0><div class="edit-link" data-v-020e2df0><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/theodo-group/bernard/edit/main/docs/adr/0024-how-the-config-type-carries-its-docs.md" target="_blank" rel="noreferrer" data-v-020e2df0><!--[--><span class="vpi-square-pen edit-link-icon" data-v-020e2df0></span> Edit this page on GitHub<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-020e2df0><span class="visually-hidden" id="doc-footer-aria-label" data-v-020e2df0>Pager</span><div class="pager" data-v-020e2df0><a class="VPLink link pager-link prev" href="/docs/docs/adr/0023-how-a-version-ships-before-npm.html" data-v-020e2df0><!--[--><span class="desc" data-v-020e2df0>Previous page</span><span class="title" data-v-020e2df0>0023 · How a version ships before npm</span><!--]--></a></div><div class="pager" data-v-020e2df0><a class="VPLink link pager-link next" href="/docs/docs/adr/0025-how-a-steps-handoff-is-written-and-checked.html" data-v-020e2df0><!--[--><span class="desc" data-v-020e2df0>Next page</span><span class="title" data-v-020e2df0>0025 · How a step's handoff is written and checked</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
27
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"claude.md\":\"BLSB-5gK\",\"context.md\":\"BovnvMGK\",\"contributing.md\":\"DwJsKrz3\",\"core_readme.md\":\"DyxYsikc\",\"demo_readme.md\":\"Cpi2pUU9\",\"docs_adr_0001-what-the-core-is-built-for.md\":\"BxOoMjST\",\"docs_adr_0002-which-harness-a-project-runs-on.md\":\"2GwF-nj0\",\"docs_adr_0003-how-core-content-reaches-each-harness.md\":\"BMWE00Mf\",\"docs_adr_0004-how-the-core-uses-external-tools.md\":\"B7dtE7MB\",\"docs_adr_0005-what-drives-the-pipeline.md\":\"DGn0CJeq\",\"docs_adr_0006-what-steps-hand-off-to-each-other.md\":\"BflT5ugJ\",\"docs_adr_0007-how-humans-take-part-in-the-pipeline.md\":\"CNX3gUD-\",\"docs_adr_0008-where-a-steps-reviewers-run.md\":\"aGbaBOpB\",\"docs_adr_0009-where-pipeline-state-and-handoffs-live.md\":\"C3tKmV-E\",\"docs_adr_0010-how-a-project-adapts-the-core.md\":\"Bp7N6tUE\",\"docs_adr_0011-how-the-factory-is-packaged-and-versioned.md\":\"BBJIwnqa\",\"docs_adr_0012-how-a-steps-failures-are-told-apart-and-routed.md\":\"uCyrBfug\",\"docs_adr_0013-when-code-lands.md\":\"oXgiobfz\",\"docs_adr_0014-what-a-step-may-change.md\":\"Zslg3bnJ\",\"docs_adr_0015-how-a-project-shapes-its-ticket-flow.md\":\"DNHMxwIT\",\"docs_adr_0016-which-core-the-factory-repo-runs.md\":\"CLN6LqBZ\",\"docs_adr_0017-where-a-tickets-record-lives.md\":\"jjUeM-ex\",\"docs_adr_0018-the-products-name.md\":\"6xaX9vDs\",\"docs_adr_0019-how-a-finding-is-answered-and-judged.md\":\"CKKoO9-3\",\"docs_adr_0020-how-an-interrupted-run-resumes.md\":\"DTIP-MBK\",\"docs_adr_0021-how-a-step-runs-in-its-workspace.md\":\"B2r3-FPg\",\"docs_adr_0022-who-names-the-branches.md\":\"DaVk8X0i\",\"docs_adr_0023-how-a-version-ships-before-npm.md\":\"C7-wuCbq\",\"docs_adr_0024-how-the-config-type-carries-its-docs.md\":\"CQmwhWXs\",\"docs_adr_0025-how-a-steps-handoff-is-written-and-checked.md\":\"CgXYdF2v\",\"docs_adr_0026-support-for-github-copilot.md\":\"DJsawm-R\",\"docs_adr_0027-which-forge-a-project-is-on.md\":\"CY0qy9xh\",\"docs_adr_0028-several-ticket-flows-in-one-pipeline.md\":\"oxffo2qg\",\"docs_adr_0029-the-branch-a-feature-works-on.md\":\"CrgkP6YJ\",\"docs_adr_0030-a-runner-without-coder.md\":\"CW8sF7jK\",\"docs_adr_0031-how-the-run-viewer-reads-its-runs.md\":\"opQYnVF2\",\"docs_adr_0032-how-a-project-gets-the-viewer.md\":\"DB9NjYJf\",\"docs_adr_0033-the-repos-license.md\":\"NPlkrPj8\",\"docs_adr_0034-how-code-review-launches-its-reviewers.md\":\"DSNpkfaL\",\"docs_adr_0035-how-the-package-is-published.md\":\"C1f4B5eb\",\"docs_adr_0036-what-the-cores-pull-request-skill-does.md\":\"op39HLAT\",\"docs_adr_0037-how-a-team-reads-the-factorys-documentation.md\":\"Dar_Xo4t\",\"docs_adr_0038-where-adapters-live.md\":\"CkVD3riv\",\"docs_adr_0039-the-repos-license.md\":\"C_rraWpb\",\"docs_adr_0040-how-a-version-is-released.md\":\"CCdwC07z\",\"docs_adr_0041-who-opens-the-features-pull-request.md\":\"qLu9WLaG\",\"docs_adr_0042-how-secrets-are-kept-out-of-committed-records.md\":\"DJWazI4H\",\"docs_getting-started.md\":\"BpQFS8Gr\",\"docs_github.md\":\"D4gkW71G\",\"docs_overlay.md\":\"DoWVb6OM\",\"docs_pipeline.md\":\"DdHywWSk\",\"docs_recipes.md\":\"8Xf6BsRA\",\"fixtures_readme.md\":\"DzbQ0hft\",\"index.md\":\"DHgL6CzS\",\"packages_docs_readme.md\":\"PV1a27nC\",\"packages_viewer_readme.md\":\"BynKZSdN\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Bernard the taktician\",\"description\":\"An agentic factory for new builds and legacy migrations.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/bernard.svg\",\"siteTitle\":\"Bernard\",\"outline\":[2,3],\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Guides\",\"link\":\"/docs/getting-started\"},{\"text\":\"Contributing\",\"link\":\"/CONTRIBUTING\"},{\"text\":\"Decisions\",\"link\":\"/docs/adr/0001-what-the-core-is-built-for\"}],\"sidebar\":[{\"text\":\"Bernard\",\"collapsed\":false,\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Vocabulary\",\"link\":\"/CONTEXT\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Getting started\",\"link\":\"/docs/getting-started\"},{\"text\":\"The overlay\",\"link\":\"/docs/overlay\"},{\"text\":\"Recipes\",\"link\":\"/docs/recipes\"},{\"text\":\"Pipeline\",\"link\":\"/docs/pipeline\"}]},{\"text\":\"Contributing\",\"collapsed\":false,\"items\":[{\"text\":\"Contributing\",\"link\":\"/CONTRIBUTING\"},{\"text\":\"Rules for agents\",\"link\":\"/CLAUDE\"},{\"text\":\"GitHub\",\"link\":\"/docs/github\"},{\"text\":\"Core content\",\"link\":\"/core/README\"},{\"text\":\"Run viewer\",\"link\":\"/packages/viewer/README\"},{\"text\":\"Documentation site\",\"link\":\"/packages/docs/README\"},{\"text\":\"Fixtures\",\"link\":\"/fixtures/README\"},{\"text\":\"Demo\",\"link\":\"/demo/README\"}]},{\"text\":\"Decisions\",\"collapsed\":true,\"items\":[{\"text\":\"0001 · What the core is built for\",\"link\":\"/docs/adr/0001-what-the-core-is-built-for\"},{\"text\":\"0002 · Which harness a project runs on\",\"link\":\"/docs/adr/0002-which-harness-a-project-runs-on\"},{\"text\":\"0003 · How core content reaches each harness\",\"link\":\"/docs/adr/0003-how-core-content-reaches-each-harness\"},{\"text\":\"0004 · How the core uses external tools\",\"link\":\"/docs/adr/0004-how-the-core-uses-external-tools\"},{\"text\":\"0005 · What drives the pipeline\",\"link\":\"/docs/adr/0005-what-drives-the-pipeline\"},{\"text\":\"0006 · What steps hand off to each other\",\"link\":\"/docs/adr/0006-what-steps-hand-off-to-each-other\"},{\"text\":\"0007 · How humans take part in the pipeline\",\"link\":\"/docs/adr/0007-how-humans-take-part-in-the-pipeline\"},{\"text\":\"0008 · Where a step's reviewers run\",\"link\":\"/docs/adr/0008-where-a-steps-reviewers-run\"},{\"text\":\"0009 · Where pipeline state and handoffs live\",\"link\":\"/docs/adr/0009-where-pipeline-state-and-handoffs-live\"},{\"text\":\"0010 · How a project adapts the core\",\"link\":\"/docs/adr/0010-how-a-project-adapts-the-core\"},{\"text\":\"0011 · How the factory is packaged and versioned\",\"link\":\"/docs/adr/0011-how-the-factory-is-packaged-and-versioned\"},{\"text\":\"0012 · How a step's failures are told apart and routed\",\"link\":\"/docs/adr/0012-how-a-steps-failures-are-told-apart-and-routed\"},{\"text\":\"0013 · When code lands\",\"link\":\"/docs/adr/0013-when-code-lands\"},{\"text\":\"0014 · What a step may change\",\"link\":\"/docs/adr/0014-what-a-step-may-change\"},{\"text\":\"0015 · How a project shapes its ticket flow\",\"link\":\"/docs/adr/0015-how-a-project-shapes-its-ticket-flow\"},{\"text\":\"0016 · Which core the factory repo runs\",\"link\":\"/docs/adr/0016-which-core-the-factory-repo-runs\"},{\"text\":\"0017 · Where a ticket's record lives\",\"link\":\"/docs/adr/0017-where-a-tickets-record-lives\"},{\"text\":\"0018 · The product's name\",\"link\":\"/docs/adr/0018-the-products-name\"},{\"text\":\"0019 · How a finding is answered and judged\",\"link\":\"/docs/adr/0019-how-a-finding-is-answered-and-judged\"},{\"text\":\"0020 · How an interrupted run resumes\",\"link\":\"/docs/adr/0020-how-an-interrupted-run-resumes\"},{\"text\":\"0021 · How a step runs in its workspace\",\"link\":\"/docs/adr/0021-how-a-step-runs-in-its-workspace\"},{\"text\":\"0022 · Who names the branches\",\"link\":\"/docs/adr/0022-who-names-the-branches\"},{\"text\":\"0023 · How a version ships before npm\",\"link\":\"/docs/adr/0023-how-a-version-ships-before-npm\"},{\"text\":\"0024 · How the config type carries its docs\",\"link\":\"/docs/adr/0024-how-the-config-type-carries-its-docs\"},{\"text\":\"0025 · How a step's handoff is written and checked\",\"link\":\"/docs/adr/0025-how-a-steps-handoff-is-written-and-checked\"},{\"text\":\"0026 · Support for GitHub Copilot\",\"link\":\"/docs/adr/0026-support-for-github-copilot\"},{\"text\":\"0027 · Which forge a project is on\",\"link\":\"/docs/adr/0027-which-forge-a-project-is-on\"},{\"text\":\"0028 · Several ticket flows in one pipeline\",\"link\":\"/docs/adr/0028-several-ticket-flows-in-one-pipeline\"},{\"text\":\"0029 · The branch a feature works on\",\"link\":\"/docs/adr/0029-the-branch-a-feature-works-on\"},{\"text\":\"0030 · A runner without Coder\",\"link\":\"/docs/adr/0030-a-runner-without-coder\"},{\"text\":\"0031 · How the run viewer reads its runs\",\"link\":\"/docs/adr/0031-how-the-run-viewer-reads-its-runs\"},{\"text\":\"0032 · How a project gets the viewer\",\"link\":\"/docs/adr/0032-how-a-project-gets-the-viewer\"},{\"text\":\"0033 · The repo's license\",\"link\":\"/docs/adr/0033-the-repos-license\"},{\"text\":\"0034 · How code review launches its reviewers\",\"link\":\"/docs/adr/0034-how-code-review-launches-its-reviewers\"},{\"text\":\"0035 · How the package is published\",\"link\":\"/docs/adr/0035-how-the-package-is-published\"},{\"text\":\"0036 · What the core's pull-request skill does\",\"link\":\"/docs/adr/0036-what-the-cores-pull-request-skill-does\"},{\"text\":\"0037 · How a team reads the factory's documentation\",\"link\":\"/docs/adr/0037-how-a-team-reads-the-factorys-documentation\"},{\"text\":\"0038 · Where adapters live\",\"link\":\"/docs/adr/0038-where-adapters-live\"},{\"text\":\"0039 · The repo's license\",\"link\":\"/docs/adr/0039-the-repos-license\"},{\"text\":\"0040 · How a version is released\",\"link\":\"/docs/adr/0040-how-a-version-is-released\"},{\"text\":\"0041 · Who opens the feature's pull request, and how a ticket reaches it\",\"link\":\"/docs/adr/0041-who-opens-the-features-pull-request\"},{\"text\":\"0042 · How secrets are kept out of committed records\",\"link\":\"/docs/adr/0042-how-secrets-are-kept-out-of-committed-records\"}]}],\"editLink\":{\"pattern\":\"https://github.com/theodo-group/bernard/edit/main/:path\",\"text\":\"Edit this page on GitHub\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
28
+
29
+ </body>
30
+ </html>
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US" dir="ltr">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>How a step's handoff is written and checked | Bernard the taktician</title>
7
+ <meta name="description" content="An agentic factory for new builds and legacy migrations.">
8
+ <meta name="generator" content="VitePress v1.6.4">
9
+ <link rel="preload stylesheet" href="/docs/assets/style.C3E8Ltp6.css" as="style">
10
+ <link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
11
+
12
+ <script type="module" src="/docs/assets/app.URmpjWHb.js"></script>
13
+ <link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
+ <link rel="modulepreload" href="/docs/assets/chunks/framework.hgjl6W6o.js">
15
+ <link rel="modulepreload" href="/docs/assets/chunks/theme.Cksh_UJH.js">
16
+ <link rel="modulepreload" href="/docs/assets/chunks/sizeCapture-INFHLROL.BEqL2zFi.js">
17
+ <link rel="modulepreload" href="/docs/assets/chunks/dagre-GXQ25YYZ.2qvw8AqH.js">
18
+ <link rel="modulepreload" href="/docs/assets/chunks/stateDiagram-v2-MP3YSRHH.3X7wNXKX.js">
19
+ <link rel="modulepreload" href="/docs/assets/chunks/virtual_mermaid-config.DDnGl6nM.js">
20
+ <link rel="modulepreload" href="/docs/assets/docs_adr_0025-how-a-steps-handoff-is-written-and-checked.md.CgXYdF2v.lean.js">
21
+ <link rel="icon" href="/docs/bernard.svg" type="image/svg+xml">
22
+ <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
23
+ <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
24
+ </head>
25
+ <body>
26
+ <div id="app"><div class="Layout" data-v-f87bd3ac><!--[--><!--]--><!--[--><span tabindex="-1" data-v-26966a6b></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-26966a6b>Skip to content</a><!--]--><!----><header class="VPNav" data-v-f87bd3ac data-v-a776a728><div class="VPNavBar" data-v-a776a728 data-v-257d37ee><div class="wrapper" data-v-257d37ee><div class="container" data-v-257d37ee><div class="title" data-v-257d37ee><div class="VPNavBarTitle has-sidebar" data-v-257d37ee data-v-1b9c14bd><a class="title" href="/docs/" data-v-1b9c14bd><!--[--><!--]--><!--[--><img class="VPImage logo" src="/docs/bernard.svg" alt data-v-4a9aa8e2><!--]--><span data-v-1b9c14bd>Bernard</span><!--[--><!--]--></a></div></div><div class="content" data-v-257d37ee><div class="content-body" data-v-257d37ee><!--[--><!--]--><div class="VPNavBarSearch search" data-v-257d37ee><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-257d37ee data-v-96ed2429><span id="main-nav-aria-label" class="visually-hidden" data-v-96ed2429> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/docs/getting-started.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Guides</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/CONTRIBUTING.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Contributing</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docs/docs/adr/0001-what-the-core-is-built-for.html" tabindex="0" data-v-96ed2429 data-v-c21a295c><!--[--><span data-v-c21a295c>Decisions</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-257d37ee data-v-772a648f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-772a648f data-v-32dadf2f data-v-033bec8f><span class="check" data-v-033bec8f><span class="icon" data-v-033bec8f><!--[--><span class="vpi-sun sun" data-v-32dadf2f></span><span class="vpi-moon moon" data-v-32dadf2f></span><!--]--></span></span></button></div><!----><div class="VPFlyout VPNavBarExtra extra" data-v-257d37ee data-v-6a77a12d data-v-6ff730e4><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-6ff730e4><span class="vpi-more-horizontal icon" data-v-6ff730e4></span></button><div class="menu" data-v-6ff730e4><div class="VPMenu" data-v-6ff730e4 data-v-7e1ab185><!----><!--[--><!--[--><!----><div class="group" data-v-6a77a12d><div class="item appearance" data-v-6a77a12d><p class="label" data-v-6a77a12d>Appearance</p><div class="appearance-action" data-v-6a77a12d><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6a77a12d data-v-32dadf2f data-v-033bec8f><span class="check" data-v-033bec8f><span class="icon" data-v-033bec8f><!--[--><span class="vpi-sun sun" data-v-32dadf2f></span><span class="vpi-moon moon" data-v-32dadf2f></span><!--]--></span></span></button></div></div></div><!----><!--]--><!--]--></div></div></div><!--[--><!--[--><!--[--><a class="viewer-switch" href="/">Run viewer</a><!--]--><!--]--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-257d37ee data-v-33d7d0d7><span class="container" data-v-33d7d0d7><span class="top" data-v-33d7d0d7></span><span class="middle" data-v-33d7d0d7></span><span class="bottom" data-v-33d7d0d7></span></span></button></div></div></div></div><div class="divider" data-v-257d37ee><div class="divider-line" data-v-257d37ee></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-f87bd3ac data-v-c5f097a9><div class="container" data-v-c5f097a9><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-c5f097a9><span class="vpi-align-left menu-icon" data-v-c5f097a9></span><span class="menu-text" data-v-c5f097a9>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-c5f097a9 data-v-cb88d934><button data-v-cb88d934>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-f87bd3ac data-v-979e8f18><div class="curtain" data-v-979e8f18></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-979e8f18><span class="visually-hidden" id="sidebar-aria-label" data-v-979e8f18> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Bernard</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CONTEXT.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Vocabulary</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Guides</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/getting-started.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Getting started</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/overlay.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>The overlay</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/recipes.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Recipes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Pipeline</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Contributing</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CONTRIBUTING.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Contributing</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/CLAUDE.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Rules for agents</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/github.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>GitHub</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/core/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Core content</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/packages/viewer/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Run viewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/packages/docs/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Documentation site</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/fixtures/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Fixtures</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/demo/README.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>Demo</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-b9208f43><section class="VPSidebarItem level-0 collapsible collapsed has-active" data-v-b9208f43 data-v-0b328883><div class="item" role="button" tabindex="0" data-v-0b328883><div class="indicator" data-v-0b328883></div><h2 class="text" data-v-0b328883>Decisions</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-0b328883><span class="vpi-chevron-right caret-icon" data-v-0b328883></span></div></div><div class="items" data-v-0b328883><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0001-what-the-core-is-built-for.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0001 · What the core is built for</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0002-which-harness-a-project-runs-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0002 · Which harness a project runs on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0003-how-core-content-reaches-each-harness.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0003 · How core content reaches each harness</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0004-how-the-core-uses-external-tools.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0004 · How the core uses external tools</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0005-what-drives-the-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0005 · What drives the pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0006-what-steps-hand-off-to-each-other.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0006 · What steps hand off to each other</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0007-how-humans-take-part-in-the-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0007 · How humans take part in the pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0008-where-a-steps-reviewers-run.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0008 · Where a step's reviewers run</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0009-where-pipeline-state-and-handoffs-live.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0009 · Where pipeline state and handoffs live</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0010-how-a-project-adapts-the-core.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0010 · How a project adapts the core</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0011-how-the-factory-is-packaged-and-versioned.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0011 · How the factory is packaged and versioned</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0012-how-a-steps-failures-are-told-apart-and-routed.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0012 · How a step's failures are told apart and routed</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0013-when-code-lands.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0013 · When code lands</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0014-what-a-step-may-change.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0014 · What a step may change</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0015-how-a-project-shapes-its-ticket-flow.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0015 · How a project shapes its ticket flow</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0016-which-core-the-factory-repo-runs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0016 · Which core the factory repo runs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0017-where-a-tickets-record-lives.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0017 · Where a ticket's record lives</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0018-the-products-name.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0018 · The product's name</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0019-how-a-finding-is-answered-and-judged.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0019 · How a finding is answered and judged</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0020-how-an-interrupted-run-resumes.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0020 · How an interrupted run resumes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0021-how-a-step-runs-in-its-workspace.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0021 · How a step runs in its workspace</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0022-who-names-the-branches.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0022 · Who names the branches</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0023-how-a-version-ships-before-npm.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0023 · How a version ships before npm</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0024-how-the-config-type-carries-its-docs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0024 · How the config type carries its docs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0025-how-a-steps-handoff-is-written-and-checked.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0025 · How a step's handoff is written and checked</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0026-support-for-github-copilot.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0026 · Support for GitHub Copilot</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0027-which-forge-a-project-is-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0027 · Which forge a project is on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0028-several-ticket-flows-in-one-pipeline.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0028 · Several ticket flows in one pipeline</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0029-the-branch-a-feature-works-on.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0029 · The branch a feature works on</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0030-a-runner-without-coder.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0030 · A runner without Coder</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0031-how-the-run-viewer-reads-its-runs.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0031 · How the run viewer reads its runs</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0032-how-a-project-gets-the-viewer.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0032 · How a project gets the viewer</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0033-the-repos-license.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0033 · The repo's license</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0034-how-code-review-launches-its-reviewers.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0034 · How code review launches its reviewers</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0035-how-the-package-is-published.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0035 · How the package is published</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0036-what-the-cores-pull-request-skill-does.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0036 · What the core's pull-request skill does</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0037-how-a-team-reads-the-factorys-documentation.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0037 · How a team reads the factory's documentation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0038-where-adapters-live.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0038 · Where adapters live</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0039-the-repos-license.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0039 · The repo's license</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0040-how-a-version-is-released.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0040 · How a version is released</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0041-who-opens-the-features-pull-request.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0041 · Who opens the feature's pull request, and how a ticket reaches it</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0b328883><div class="item" data-v-0b328883><div class="indicator" data-v-0b328883></div><a class="VPLink link link" href="/docs/docs/adr/0042-how-secrets-are-kept-out-of-committed-records.html" data-v-0b328883><!--[--><p class="text" data-v-0b328883>0042 · How secrets are kept out of committed records</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-f87bd3ac data-v-67e000d0><div class="VPDoc has-sidebar has-aside" data-v-67e000d0 data-v-f8622dbf><!--[--><!--]--><div class="container" data-v-f8622dbf><div class="aside" data-v-f8622dbf><div class="aside-curtain" data-v-f8622dbf></div><div class="aside-container" data-v-f8622dbf><div class="aside-content" data-v-f8622dbf><div class="VPDocAside" data-v-f8622dbf data-v-fc01c646><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-fc01c646 data-v-172fd98a><div class="content" data-v-172fd98a><div class="outline-marker" data-v-172fd98a></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-172fd98a>On this page</div><ul class="VPDocOutlineItem root" data-v-172fd98a data-v-ea4171dd><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-fc01c646></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-f8622dbf><div class="content-container" data-v-f8622dbf><!--[--><!--]--><main class="main" data-v-f8622dbf><div style="position:relative;" class="vp-doc _docs_docs_adr_0025-how-a-steps-handoff-is-written-and-checked" data-v-f8622dbf><div><h1 id="how-a-step-s-handoff-is-written-and-checked" tabindex="-1">How a step&#39;s handoff is written and checked <a class="header-anchor" href="#how-a-step-s-handoff-is-written-and-checked" aria-label="Permalink to &quot;How a step&#39;s handoff is written and checked&quot;">​</a></h1><p>Accepted · 2026-10-22</p><h2 id="context" tabindex="-1">Context <a class="header-anchor" href="#context" aria-label="Permalink to &quot;Context&quot;">​</a></h2><p>ADR-0006 typed the handoffs, but left them in the skills&#39; text: each skill wrote its own JSON file to its <code>handoffDir</code>, from an example in its instructions, and nothing checked it (#10). Changing a skill could change the format of its handoff as a side effect, and break the next step of the chain without anyone noticing.</p><h2 id="criteria" tabindex="-1">Criteria <a class="header-anchor" href="#criteria" aria-label="Permalink to &quot;Criteria&quot;">​</a></h2><ol><li><strong>The handoff&#39;s format is enforced</strong>: changing a skill could change the format of its handoff as a side effect, and break the next step of the chain without anyone noticing.</li><li><strong>A mismatch caught in the session</strong>: a mismatch found once the session is over costs a whole rerun.</li><li><strong>Each reader its part</strong>: the orchestrator and the next steps read different things, and the outcome&#39;s fields are the same for every skill.</li><li><strong>The contract follows the skill</strong>: the contract belongs to what the skill does, wherever the graph runs it.</li></ol><h2 id="options" tabindex="-1">Options <a class="header-anchor" href="#options" aria-label="Permalink to &quot;Options&quot;">​</a></h2><ul><li><strong>The skill writes its handoff file, checked after the session.</strong> A mismatch found once the session is over costs a whole rerun (2), and each skill&#39;s JSON example drifted from its schema (1).</li><li><strong>One answer constrained by the skill&#39;s schema, with an <code>outcome</code> and a <code>handoff</code>.</strong> A field the next step relies on is enforced in the session, so changing a skill can no longer change its handoff&#39;s format as a side effect (1, 2). Its two keys are for two readers: <code>outcome</code> for the orchestrator, <code>handoff</code> for the next steps (3). The schema is keyed on the skill, and the handoff&#39;s directory on the step (4).</li><li><strong>The outcome inside the handoff.</strong> The orchestrator and the next steps read different things, and the outcome&#39;s fields are the same for every skill (3).</li><li><strong>Schemas keyed on the step.</strong> The contract belongs to what the skill does, wherever the graph runs it (4).</li></ul><h2 id="comparison" tabindex="-1">Comparison <a class="header-anchor" href="#comparison" aria-label="Permalink to &quot;Comparison&quot;">​</a></h2><table tabindex="0"><thead><tr><th>Option</th><th>1. Format enforced</th><th>2. Caught in the session</th><th>3. Each reader its part</th><th>4. Follows the skill</th></tr></thead><tbody><tr><td>The skill writes its file, checked after</td><td>🟠</td><td>🔴</td><td>⚪</td><td>⚪</td></tr><tr><td>One constrained answer, <code>outcome</code> and <code>handoff</code></td><td>🟢</td><td>🟢</td><td>🟢</td><td>🟢</td></tr><tr><td>The outcome inside the handoff</td><td>⚪</td><td>⚪</td><td>🔴</td><td>⚪</td></tr><tr><td>Schemas keyed on the step</td><td>⚪</td><td>⚪</td><td>⚪</td><td>🔴</td></tr></tbody></table><p>🟢 meets · 🟠 partly, or at a cost · 🔴 fails · ⚪ not discussed</p><h2 id="decision" tabindex="-1">Decision <a class="header-anchor" href="#decision" aria-label="Permalink to &quot;Decision&quot;">​</a></h2><p>One answer constrained by the skill&#39;s schema, with an <code>outcome</code> and a <code>handoff</code>. A step&#39;s session ends with one answer, constrained by its skill&#39;s schema, with two keys for two readers:</p><ul><li><code>outcome</code> is what the orchestrator branches on and logs: <code>result</code>, <code>failureClass</code>, <code>error</code>, <code>openQuestions</code>, <code>tickets</code>.</li><li><code>handoff</code> is what the next steps read: the fields of the skill&#39;s schema.</li></ul><p>The schema is keyed on the skill, and the handoff&#39;s directory on the step: two steps that run one skill share its contract and keep their handoffs apart. Every core skill a step runs declares its handoff in <code>@bernard/contracts</code>, one file per skill in <code>handoffs/&lt;skill&gt;.ts</code>: <code>implement</code>, <code>validate</code>, <code>code-review</code>, <code>apply-review</code>. <code>pull-request</code> declares by name the default handoff, <code>{ summary }</code>. An overlay adds fields to them or declares its own skills&#39; (ADR-0010). A skill no step runs has no handoff.</p><p>The schemas carry the rules that one handoff can prove, such as a <code>contested</code> verdict requiring its proof (ADR-0019). The rules that span handoffs stay in the skills&#39; text.</p><p>The runner writes the handoff to <code>handoff.json</code> in the step&#39;s <code>&lt;step&gt;-&lt;attempt&gt;/</code> directory of the ticket&#39;s record, and commits it with the record (ADR-0017). The skills never write it: they read the earlier ones there. They carry no JSON example either: the fields&#39; meanings are in the schemas&#39; <code>.describe()</code>, which the model reads in the schema it is constrained with, and each skill keeps only its rules. Run by hand, <code>code-review</code> prints its handoff.</p><p>An answer that does not match its schema is a crash, not a step result (ADR-0012): the run is retried up to <code>maxCrashes</code> and never logged as an attempt.</p><p>The schema is exported from Zod as draft-7 JSON Schema for both harnesses (Claude Code&#39;s <code>--json-schema</code> rejects the 2020-12 meta-schema):</p><ul><li>On Claude Code, the session runs with <code>--json-schema</code>.</li><li>On Pi, which has no driver yet (ADR-0002, ADR-0013), a Bernard extension loaded with <code>pi -ne -e</code> registers a final-answer tool whose parameters are the JSON Schema. The tool returns <code>terminate: true</code> and sets <code>constrainedSampling: { type: &#39;json_schema&#39;, strict: &#39;prefer&#39; }</code>. The answer is read from <code>tool_execution_start</code> in <code>pi --mode json</code>, then checked again with Zod. Pi&#39;s strict mode cannot constrain the verdicts&#39; <code>oneOf</code>: there, Pi checks the tool&#39;s arguments and the model retries in the same session, which is still cheaper than a full rerun.</li></ul><h2 id="consequences" tabindex="-1">Consequences <a class="header-anchor" href="#consequences" aria-label="Permalink to &quot;Consequences&quot;">​</a></h2><ul><li>Changing a skill can no longer change its handoff&#39;s format as a side effect: a field the next step relies on is enforced in the session.</li><li>Handoffs carry no <code>schemaVersion</code> until a project outside this repo consumes the factory (ADR-0009).</li><li>The reviewers&#39; reports, written by subagents, stay files the skill checks, with their own schema.</li></ul></div></div></main><footer class="VPDocFooter" data-v-f8622dbf data-v-020e2df0><!--[--><!--]--><div class="edit-info" data-v-020e2df0><div class="edit-link" data-v-020e2df0><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/theodo-group/bernard/edit/main/docs/adr/0025-how-a-steps-handoff-is-written-and-checked.md" target="_blank" rel="noreferrer" data-v-020e2df0><!--[--><span class="vpi-square-pen edit-link-icon" data-v-020e2df0></span> Edit this page on GitHub<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-020e2df0><span class="visually-hidden" id="doc-footer-aria-label" data-v-020e2df0>Pager</span><div class="pager" data-v-020e2df0><a class="VPLink link pager-link prev" href="/docs/docs/adr/0024-how-the-config-type-carries-its-docs.html" data-v-020e2df0><!--[--><span class="desc" data-v-020e2df0>Previous page</span><span class="title" data-v-020e2df0>0024 · How the config type carries its docs</span><!--]--></a></div><div class="pager" data-v-020e2df0><a class="VPLink link pager-link next" href="/docs/docs/adr/0026-support-for-github-copilot.html" data-v-020e2df0><!--[--><span class="desc" data-v-020e2df0>Next page</span><span class="title" data-v-020e2df0>0026 · Support for GitHub Copilot</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
27
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"claude.md\":\"BLSB-5gK\",\"context.md\":\"BovnvMGK\",\"contributing.md\":\"DwJsKrz3\",\"core_readme.md\":\"DyxYsikc\",\"demo_readme.md\":\"Cpi2pUU9\",\"docs_adr_0001-what-the-core-is-built-for.md\":\"BxOoMjST\",\"docs_adr_0002-which-harness-a-project-runs-on.md\":\"2GwF-nj0\",\"docs_adr_0003-how-core-content-reaches-each-harness.md\":\"BMWE00Mf\",\"docs_adr_0004-how-the-core-uses-external-tools.md\":\"B7dtE7MB\",\"docs_adr_0005-what-drives-the-pipeline.md\":\"DGn0CJeq\",\"docs_adr_0006-what-steps-hand-off-to-each-other.md\":\"BflT5ugJ\",\"docs_adr_0007-how-humans-take-part-in-the-pipeline.md\":\"CNX3gUD-\",\"docs_adr_0008-where-a-steps-reviewers-run.md\":\"aGbaBOpB\",\"docs_adr_0009-where-pipeline-state-and-handoffs-live.md\":\"C3tKmV-E\",\"docs_adr_0010-how-a-project-adapts-the-core.md\":\"Bp7N6tUE\",\"docs_adr_0011-how-the-factory-is-packaged-and-versioned.md\":\"BBJIwnqa\",\"docs_adr_0012-how-a-steps-failures-are-told-apart-and-routed.md\":\"uCyrBfug\",\"docs_adr_0013-when-code-lands.md\":\"oXgiobfz\",\"docs_adr_0014-what-a-step-may-change.md\":\"Zslg3bnJ\",\"docs_adr_0015-how-a-project-shapes-its-ticket-flow.md\":\"DNHMxwIT\",\"docs_adr_0016-which-core-the-factory-repo-runs.md\":\"CLN6LqBZ\",\"docs_adr_0017-where-a-tickets-record-lives.md\":\"jjUeM-ex\",\"docs_adr_0018-the-products-name.md\":\"6xaX9vDs\",\"docs_adr_0019-how-a-finding-is-answered-and-judged.md\":\"CKKoO9-3\",\"docs_adr_0020-how-an-interrupted-run-resumes.md\":\"DTIP-MBK\",\"docs_adr_0021-how-a-step-runs-in-its-workspace.md\":\"B2r3-FPg\",\"docs_adr_0022-who-names-the-branches.md\":\"DaVk8X0i\",\"docs_adr_0023-how-a-version-ships-before-npm.md\":\"C7-wuCbq\",\"docs_adr_0024-how-the-config-type-carries-its-docs.md\":\"CQmwhWXs\",\"docs_adr_0025-how-a-steps-handoff-is-written-and-checked.md\":\"CgXYdF2v\",\"docs_adr_0026-support-for-github-copilot.md\":\"DJsawm-R\",\"docs_adr_0027-which-forge-a-project-is-on.md\":\"CY0qy9xh\",\"docs_adr_0028-several-ticket-flows-in-one-pipeline.md\":\"oxffo2qg\",\"docs_adr_0029-the-branch-a-feature-works-on.md\":\"CrgkP6YJ\",\"docs_adr_0030-a-runner-without-coder.md\":\"CW8sF7jK\",\"docs_adr_0031-how-the-run-viewer-reads-its-runs.md\":\"opQYnVF2\",\"docs_adr_0032-how-a-project-gets-the-viewer.md\":\"DB9NjYJf\",\"docs_adr_0033-the-repos-license.md\":\"NPlkrPj8\",\"docs_adr_0034-how-code-review-launches-its-reviewers.md\":\"DSNpkfaL\",\"docs_adr_0035-how-the-package-is-published.md\":\"C1f4B5eb\",\"docs_adr_0036-what-the-cores-pull-request-skill-does.md\":\"op39HLAT\",\"docs_adr_0037-how-a-team-reads-the-factorys-documentation.md\":\"Dar_Xo4t\",\"docs_adr_0038-where-adapters-live.md\":\"CkVD3riv\",\"docs_adr_0039-the-repos-license.md\":\"C_rraWpb\",\"docs_adr_0040-how-a-version-is-released.md\":\"CCdwC07z\",\"docs_adr_0041-who-opens-the-features-pull-request.md\":\"qLu9WLaG\",\"docs_adr_0042-how-secrets-are-kept-out-of-committed-records.md\":\"DJWazI4H\",\"docs_getting-started.md\":\"BpQFS8Gr\",\"docs_github.md\":\"D4gkW71G\",\"docs_overlay.md\":\"DoWVb6OM\",\"docs_pipeline.md\":\"DdHywWSk\",\"docs_recipes.md\":\"8Xf6BsRA\",\"fixtures_readme.md\":\"DzbQ0hft\",\"index.md\":\"DHgL6CzS\",\"packages_docs_readme.md\":\"PV1a27nC\",\"packages_viewer_readme.md\":\"BynKZSdN\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Bernard the taktician\",\"description\":\"An agentic factory for new builds and legacy migrations.\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/bernard.svg\",\"siteTitle\":\"Bernard\",\"outline\":[2,3],\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Guides\",\"link\":\"/docs/getting-started\"},{\"text\":\"Contributing\",\"link\":\"/CONTRIBUTING\"},{\"text\":\"Decisions\",\"link\":\"/docs/adr/0001-what-the-core-is-built-for\"}],\"sidebar\":[{\"text\":\"Bernard\",\"collapsed\":false,\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Vocabulary\",\"link\":\"/CONTEXT\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Getting started\",\"link\":\"/docs/getting-started\"},{\"text\":\"The overlay\",\"link\":\"/docs/overlay\"},{\"text\":\"Recipes\",\"link\":\"/docs/recipes\"},{\"text\":\"Pipeline\",\"link\":\"/docs/pipeline\"}]},{\"text\":\"Contributing\",\"collapsed\":false,\"items\":[{\"text\":\"Contributing\",\"link\":\"/CONTRIBUTING\"},{\"text\":\"Rules for agents\",\"link\":\"/CLAUDE\"},{\"text\":\"GitHub\",\"link\":\"/docs/github\"},{\"text\":\"Core content\",\"link\":\"/core/README\"},{\"text\":\"Run viewer\",\"link\":\"/packages/viewer/README\"},{\"text\":\"Documentation site\",\"link\":\"/packages/docs/README\"},{\"text\":\"Fixtures\",\"link\":\"/fixtures/README\"},{\"text\":\"Demo\",\"link\":\"/demo/README\"}]},{\"text\":\"Decisions\",\"collapsed\":true,\"items\":[{\"text\":\"0001 · What the core is built for\",\"link\":\"/docs/adr/0001-what-the-core-is-built-for\"},{\"text\":\"0002 · Which harness a project runs on\",\"link\":\"/docs/adr/0002-which-harness-a-project-runs-on\"},{\"text\":\"0003 · How core content reaches each harness\",\"link\":\"/docs/adr/0003-how-core-content-reaches-each-harness\"},{\"text\":\"0004 · How the core uses external tools\",\"link\":\"/docs/adr/0004-how-the-core-uses-external-tools\"},{\"text\":\"0005 · What drives the pipeline\",\"link\":\"/docs/adr/0005-what-drives-the-pipeline\"},{\"text\":\"0006 · What steps hand off to each other\",\"link\":\"/docs/adr/0006-what-steps-hand-off-to-each-other\"},{\"text\":\"0007 · How humans take part in the pipeline\",\"link\":\"/docs/adr/0007-how-humans-take-part-in-the-pipeline\"},{\"text\":\"0008 · Where a step's reviewers run\",\"link\":\"/docs/adr/0008-where-a-steps-reviewers-run\"},{\"text\":\"0009 · Where pipeline state and handoffs live\",\"link\":\"/docs/adr/0009-where-pipeline-state-and-handoffs-live\"},{\"text\":\"0010 · How a project adapts the core\",\"link\":\"/docs/adr/0010-how-a-project-adapts-the-core\"},{\"text\":\"0011 · How the factory is packaged and versioned\",\"link\":\"/docs/adr/0011-how-the-factory-is-packaged-and-versioned\"},{\"text\":\"0012 · How a step's failures are told apart and routed\",\"link\":\"/docs/adr/0012-how-a-steps-failures-are-told-apart-and-routed\"},{\"text\":\"0013 · When code lands\",\"link\":\"/docs/adr/0013-when-code-lands\"},{\"text\":\"0014 · What a step may change\",\"link\":\"/docs/adr/0014-what-a-step-may-change\"},{\"text\":\"0015 · How a project shapes its ticket flow\",\"link\":\"/docs/adr/0015-how-a-project-shapes-its-ticket-flow\"},{\"text\":\"0016 · Which core the factory repo runs\",\"link\":\"/docs/adr/0016-which-core-the-factory-repo-runs\"},{\"text\":\"0017 · Where a ticket's record lives\",\"link\":\"/docs/adr/0017-where-a-tickets-record-lives\"},{\"text\":\"0018 · The product's name\",\"link\":\"/docs/adr/0018-the-products-name\"},{\"text\":\"0019 · How a finding is answered and judged\",\"link\":\"/docs/adr/0019-how-a-finding-is-answered-and-judged\"},{\"text\":\"0020 · How an interrupted run resumes\",\"link\":\"/docs/adr/0020-how-an-interrupted-run-resumes\"},{\"text\":\"0021 · How a step runs in its workspace\",\"link\":\"/docs/adr/0021-how-a-step-runs-in-its-workspace\"},{\"text\":\"0022 · Who names the branches\",\"link\":\"/docs/adr/0022-who-names-the-branches\"},{\"text\":\"0023 · How a version ships before npm\",\"link\":\"/docs/adr/0023-how-a-version-ships-before-npm\"},{\"text\":\"0024 · How the config type carries its docs\",\"link\":\"/docs/adr/0024-how-the-config-type-carries-its-docs\"},{\"text\":\"0025 · How a step's handoff is written and checked\",\"link\":\"/docs/adr/0025-how-a-steps-handoff-is-written-and-checked\"},{\"text\":\"0026 · Support for GitHub Copilot\",\"link\":\"/docs/adr/0026-support-for-github-copilot\"},{\"text\":\"0027 · Which forge a project is on\",\"link\":\"/docs/adr/0027-which-forge-a-project-is-on\"},{\"text\":\"0028 · Several ticket flows in one pipeline\",\"link\":\"/docs/adr/0028-several-ticket-flows-in-one-pipeline\"},{\"text\":\"0029 · The branch a feature works on\",\"link\":\"/docs/adr/0029-the-branch-a-feature-works-on\"},{\"text\":\"0030 · A runner without Coder\",\"link\":\"/docs/adr/0030-a-runner-without-coder\"},{\"text\":\"0031 · How the run viewer reads its runs\",\"link\":\"/docs/adr/0031-how-the-run-viewer-reads-its-runs\"},{\"text\":\"0032 · How a project gets the viewer\",\"link\":\"/docs/adr/0032-how-a-project-gets-the-viewer\"},{\"text\":\"0033 · The repo's license\",\"link\":\"/docs/adr/0033-the-repos-license\"},{\"text\":\"0034 · How code review launches its reviewers\",\"link\":\"/docs/adr/0034-how-code-review-launches-its-reviewers\"},{\"text\":\"0035 · How the package is published\",\"link\":\"/docs/adr/0035-how-the-package-is-published\"},{\"text\":\"0036 · What the core's pull-request skill does\",\"link\":\"/docs/adr/0036-what-the-cores-pull-request-skill-does\"},{\"text\":\"0037 · How a team reads the factory's documentation\",\"link\":\"/docs/adr/0037-how-a-team-reads-the-factorys-documentation\"},{\"text\":\"0038 · Where adapters live\",\"link\":\"/docs/adr/0038-where-adapters-live\"},{\"text\":\"0039 · The repo's license\",\"link\":\"/docs/adr/0039-the-repos-license\"},{\"text\":\"0040 · How a version is released\",\"link\":\"/docs/adr/0040-how-a-version-is-released\"},{\"text\":\"0041 · Who opens the feature's pull request, and how a ticket reaches it\",\"link\":\"/docs/adr/0041-who-opens-the-features-pull-request\"},{\"text\":\"0042 · How secrets are kept out of committed records\",\"link\":\"/docs/adr/0042-how-secrets-are-kept-out-of-committed-records\"}]}],\"editLink\":{\"pattern\":\"https://github.com/theodo-group/bernard/edit/main/:path\",\"text\":\"Edit this page on GitHub\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
28
+
29
+ </body>
30
+ </html>