elanous 0.2.19 → 0.2.21

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 (509) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/MObU8ujkMciAKr6ljAV05/_buildManifest.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/088d8e8a.8069543d082bec12.js +160 -0
  5. package/apps/pwa/out/_next/static/chunks/1109.78a7a3288c0259d9.js +148 -0
  6. package/apps/pwa/out/_next/static/chunks/115.1c6690b8604f81c4.js +32 -0
  7. package/apps/pwa/out/_next/static/chunks/119fc678.6f591cdb84ca5791.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1262.76a3f08e67c5f816.js +309 -0
  9. package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 1268.0840ff91e083fcbd.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1307-c97eba9fb72a9a5e.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1358d292.5c87f12cad6eaa91.js +122 -0
  12. package/apps/pwa/out/_next/static/chunks/1438.27a1a7b8f2308004.js +149 -0
  13. package/apps/pwa/out/_next/static/chunks/1442.02d85cd88f4c1eac.js +79 -0
  14. package/apps/pwa/out/_next/static/chunks/1501-1aad662d82ba43f7.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1584.9e2dd53da6e6d4b1.js +24 -0
  16. package/apps/pwa/out/_next/static/chunks/1586.b989b0614afb77e6.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1609.2ad355062870151f.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1612-f6df0fc0eed7157b.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1923.37f1d5fe7ebe3860.js +27 -0
  21. package/apps/pwa/out/_next/static/chunks/1948.5f35b39eef222a94.js +5 -0
  22. package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/1993.3fd074a2a246234e.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{2977-e38442e86289f1d3.js → 211-9c9090c59e2c5907.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/2140.d2daf9ee96e295d1.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2212.0359851457473efc.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/224.583e562365a52f74.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/2328.0f37465646bafa7d.js +36 -0
  31. package/apps/pwa/out/_next/static/chunks/2372.bf71372184991937.js +286 -0
  32. package/apps/pwa/out/_next/static/chunks/2489-ff55a35b202c0f94.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/2549-a8515c86f9e8cb96.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/2655.72cc6a97276c5acc.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/2743-ef6e8c3ced74cce5.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/2840-5458ad50c49cac6a.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/2856.f75d5baef7f49b74.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3344.0de4b0ec5a454b7a.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/335.a13f339e97893437.js +94 -0
  45. package/apps/pwa/out/_next/static/chunks/3394.646348f34b2500be.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3443.6276909b53d72d53.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/3495.abd4254d808bf2dc.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/3522-1de1319d028ac89c.js +25 -0
  49. package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/3721.ba5b82db0d9a5572.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/3857-995ea9f5ef33d71e.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/3919.9ff7dc25afefee33.js +74 -0
  54. package/apps/pwa/out/_next/static/chunks/3998.bd9a69d9b50e9bd2.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4003.ab6db1dc266576c9.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/4144-fad095b48a1862ee.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/4216.e8ac94b9fe6b96ab.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/4327.c44dc2b55cb43ee5.js +34 -0
  59. package/apps/pwa/out/_next/static/chunks/4401.94257d497b6d26bc.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/4559.17ca2cdbaa8d414f.js +115 -0
  61. package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/4588.ad3364cb7fb97ada.js +86 -0
  63. package/apps/pwa/out/_next/static/chunks/4706.97e734bd4c9816ca.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/4982.6e44352f751b9a1b.js +77 -0
  66. package/apps/pwa/out/_next/static/chunks/5342.49c5c5a530e62b50.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5360-08a80abdf3a4da99.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5431.66c58ab1327ee0b7.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5717.bcfcb96e701b82e0.js +90 -0
  70. package/apps/pwa/out/_next/static/chunks/5755-30d102586789bf7f.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5957.3f1a4012388dd962.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5977-59fedea50d13c762.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/602.9bf02ac8e9502598.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6020.3a1b347e2d2dfacc.js +8 -0
  75. package/apps/pwa/out/_next/static/chunks/{4847.56f5bc454fbcc827.js → 6110.1297d4093fdfbb0d.js} +2 -2
  76. package/apps/pwa/out/_next/static/chunks/6158.566c890adc06a459.js +2 -0
  77. package/apps/pwa/out/_next/static/chunks/6375.fce1d174ba6d0324.js +64 -0
  78. package/apps/pwa/out/_next/static/chunks/6546.92a828aef441271f.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/658.957fdb0a8c6c6c8e.js +287 -0
  80. package/apps/pwa/out/_next/static/chunks/6706.323590aabb8b1293.js +226 -0
  81. package/apps/pwa/out/_next/static/chunks/6747.b67947f293a4c02d.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6767.8e6c5f6e744fcd9f.js +38 -0
  83. package/apps/pwa/out/_next/static/chunks/6868.000b24a3045c5574.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/6946.bba74e9c96050f30.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7033.a558f1b2f6912a53.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7065.46029c26c53eac50.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7087.6fae577d09249bc1.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7175-350f4ce2873bc038.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/722.de8d9801e0f6d414.js +41 -0
  91. package/apps/pwa/out/_next/static/chunks/{1470.98a6ab61ccb4131c.js → 726.83532d69452ee24b.js} +1 -1
  92. package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 7327-2d69fb321ba73389.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/7497.57981e9d7a75a52a.js +24 -0
  95. package/apps/pwa/out/_next/static/chunks/7630.2b9a68659053ff4e.js +193 -0
  96. package/apps/pwa/out/_next/static/chunks/7672.4af122ad892117c7.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/771.6ab889a233e7dae7.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/7899.597af4a9996c907f.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/79b78388.663188133449d707.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8096.f7da0776cfde6300.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8194.484f51e273d9abd2.js +217 -0
  105. package/apps/pwa/out/_next/static/chunks/8401-35e94e9091f5eb8d.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8769.815ca69879f608b4.js +104 -0
  109. package/apps/pwa/out/_next/static/chunks/8857-f1762140ef9a96b1.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/88729267.9c6c000157c83f2f.js +62 -0
  111. package/apps/pwa/out/_next/static/chunks/8f835b4f.048eeb02299e3e12.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9068.5f2764fccf86c1b2.js +93 -0
  113. package/apps/pwa/out/_next/static/chunks/9070.067c106528ec1ae6.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9247-7581825d511a64c0.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{7647.2fcd30d894d5ee30.js → 935.4ddaa99fc1d1126c.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/9451.ebfb0dcc9c02250f.js +23 -0
  118. package/apps/pwa/out/_next/static/chunks/9497-b0e758d1cd4ae8d7.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9559.e648369b1d57cf9a.js +62 -0
  120. package/apps/pwa/out/_next/static/chunks/9832.2ab2e818013574c7.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/a9f2b54d-40c16bd0efdb04b8.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-937c92292a4ab4f0.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-d781be3e3a9cfd74.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-b0a80997903852d8.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-2b1263165630d9c8.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea998f7f5d156bea.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-33c328b64ca508f8.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-e2d6bed48ac20120.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-111cabe4d1fd69ae.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-544dd4bd4847eeb7.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-3ee191319bf97d87.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-e4bcb2c503dab04b.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-300897dcbbd5ed76.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-a449f1ed472b81c2.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-9045094d6d3b5cd0.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-c06673596849ef45.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-103fa3191c1b2e08.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-9f81233f29dcd409.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/{page-b70cd005d9169e25.js → page-be8b4615c919e36c.js} +1 -1
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-c685b104e0dfa609.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-8d693331cfbb6add.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-cef4f30a4c22fae1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66ea1b54fc83fa15.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-7a12f61be4a579d1.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-c85b0589591a99c9.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-725a4da02dd129eb.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8cc707bd09a497d9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-90b55be1f15ce0e8.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cb16606e08be65db.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-16dc64b74ed6a40a.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-21bec4afeb2f0917.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-dc39ee7a36d26385.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-84ae759f76053672.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-3db58ddb61fe2be9.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c5315e30f3528dc4.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-2fe368efb6de3b6a.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8d04132dd0ac5e10.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-f23484de467c9ea3.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-c69762987b751174.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-5456692bda39aafb.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-d75f7cd65845ce98.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-5603f5e568b25ce3.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-d2cc0f4e89f42028.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-a6eb73b8a4840f1c.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-c0a3f4d10edb83fa.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6c0b88068c143f15.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-7f8d7fcdf058a845.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-22163556cd38bc88.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-141436fd26dd56fc.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/d70879db.c66c56a95a91efc6.js +66 -0
  174. package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → f6231284-45726550aba08fca.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{2ea96958.e8c7e112de50b067.js → f6b7c9ba.64a895b8b2fedbdc.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/f8626309.a4e5d362b1d55e59.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/framework-5c169757551134ed.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-f2b4016b9b981bc8.js +1 -0
  183. package/apps/pwa/out/_next/static/css/{d3427996da11e480.css → b9d8151e48998417.css} +1 -1
  184. package/apps/pwa/out/_next/static/css/e81df11490b4413b.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +24 -24
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +23 -23
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -0
  223. package/apps/pwa/out/live-run/index.txt +35 -0
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/graphs/demo/editor-recipes.yaml +22 -0
  279. package/graphs/drafts/recipes.yaml +4 -4
  280. package/graphs/implement-loop.yaml +277 -5
  281. package/graphs/retro/daily.yaml +25 -0
  282. package/graphs/retro/recipes.yaml +24 -0
  283. package/package.json +1 -1
  284. package/scripts/ask-marker-check.ts +3 -1
  285. package/scripts/coord-channel-watch.sh +31 -4
  286. package/scripts/docs-lint.ts +4 -1
  287. package/scripts/land-global-checks.ts +89 -0
  288. package/scripts/lib/pch-regress-map.ts +2 -1
  289. package/scripts/marketing/generate-ax-brief.ts +18 -1
  290. package/scripts/measure-nl-routing-corpus.ts +11 -3
  291. package/scripts/release-loop/gate-node.ts +296 -25
  292. package/scripts/release-loop/gate-timing.ts +116 -7
  293. package/scripts/release-loop/preflight.ts +6 -4
  294. package/scripts/release-loop/publish-window.ts +141 -0
  295. package/scripts/release-loop/release-docs.ts +1 -4
  296. package/scripts/release-loop/release-universe.ts +38 -0
  297. package/scripts/release-loop/resume-release.ts +4 -1
  298. package/scripts/release-loop/shard-plan.ts +50 -5
  299. package/scripts/release-loop/unattended-release.ts +10 -2
  300. package/scripts/release-story/draft.ts +5 -1
  301. package/scripts/retro/shadow-compare.ts +71 -0
  302. package/scripts/rhythm/daily.ts +8 -2
  303. package/src/agent-mission/driver.ts +34 -6
  304. package/src/autopilot/build/llm-conflict-merge.ts +132 -7
  305. package/src/autopilot/build/merge-intent.ts +135 -7
  306. package/src/away/release-watch.ts +20 -3
  307. package/src/browser-cdp/client.ts +10 -5
  308. package/src/cli/config-drift.ts +513 -0
  309. package/src/cli/log-event-names.ts +4 -0
  310. package/src/cli/ops-cli.ts +11 -0
  311. package/src/cli/ops-overview-cli.ts +50 -0
  312. package/src/cli/pod-cli.ts +1 -0
  313. package/src/cli/pr-cli.ts +20 -0
  314. package/src/cli/release-cli.ts +20 -5
  315. package/src/cli/retro-cli.ts +78 -0
  316. package/src/cli/tasks-cli.ts +200 -8
  317. package/src/dashboard/index.ts +40 -4
  318. package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -4
  319. package/src/dashboard/slash-runtime/help-from-registry.ts +57 -31
  320. package/src/domains/outbound-log-probe.ts +6 -1
  321. package/src/esc-abort-gate.ts +3 -1
  322. package/src/graph-runner/graph-cli.ts +57 -0
  323. package/src/graph-runner/graph-run-api.ts +218 -0
  324. package/src/graph-runner/runner.ts +11 -1
  325. package/src/graph-wizard/archetypes.ts +88 -0
  326. package/src/graph-wizard/generate.ts +545 -0
  327. package/src/graph-wizard/saved-steps.ts +120 -0
  328. package/src/graph-wizard/steps.ts +193 -0
  329. package/src/harness/harness-cli-command.ts +482 -59
  330. package/src/harness/harness-queue.ts +315 -25
  331. package/src/harness/harness-salvage-cli.ts +62 -0
  332. package/src/hq/fence-outcomes.ts +63 -0
  333. package/src/hq/fence-wrapper.ts +33 -0
  334. package/src/hq/hq.ts +11 -1
  335. package/src/index.ts +76 -10
  336. package/src/intake-plane/digest.ts +18 -11
  337. package/src/maturity/feature-maturity.ts +4 -3
  338. package/src/nexus/api/draft-metrics.ts +114 -0
  339. package/src/nexus/api/graph-kinds.ts +10 -4
  340. package/src/nexus/api/graph-wizard-api.ts +53 -0
  341. package/src/nexus/api/graphs-api.ts +220 -10
  342. package/src/nexus/api/harness-traversal.ts +205 -0
  343. package/src/nexus/api/http-server.ts +69 -3
  344. package/src/nexus/api/loop-edges.ts +4 -2
  345. package/src/nexus/api/ops-api.ts +22 -7
  346. package/src/nexus/api/ops-board-route.ts +48 -0
  347. package/src/nexus/outbound/router.ts +28 -8
  348. package/src/onboarding/entry-hints.ts +5 -0
  349. package/src/onboarding/first-run.ts +3 -0
  350. package/src/onboarding.ts +24 -6
  351. package/src/ops/overview-collect.ts +345 -0
  352. package/src/ops/overview-seat-era.ts +90 -0
  353. package/src/ops/overview.ts +223 -0
  354. package/src/release-loop/feature-store.ts +14 -11
  355. package/src/release-loop/gate-shards.ts +163 -0
  356. package/src/release-loop/release-schedule.ts +6 -2
  357. package/src/retro/daily.ts +372 -0
  358. package/src/seat-loop/op-decide.ts +173 -0
  359. package/src/seat-loop/seat-loop.ts +60 -3
  360. package/src/seat-loop/seat-report.ts +58 -3
  361. package/src/self-dev/ask-launch-flow.ts +9 -6
  362. package/src/self-dev/ask-launch-io.ts +52 -2
  363. package/src/self-dev/ask-path-candidates.ts +40 -2
  364. package/src/self-dev/draft-sweep.ts +371 -16
  365. package/src/self-dev/draft-triage-rules.ts +19 -4
  366. package/src/self-dev/graph-journey-nodes.ts +157 -0
  367. package/src/self-dev/graph-journey-route.ts +105 -0
  368. package/src/self-dev/launch-preflight.ts +43 -3
  369. package/src/self-dev/pr-preview.ts +84 -16
  370. package/src/self-dev/release-path-guard.ts +7 -4
  371. package/src/self-implement/blocked-draft-policy.ts +101 -0
  372. package/src/self-implement/execution-clarification.ts +11 -0
  373. package/src/self-implement/frozen-merges.ts +23 -0
  374. package/src/self-implement/gate-env-retry.ts +83 -0
  375. package/src/self-implement/goal-author.ts +14 -0
  376. package/src/self-implement/heal-intake.ts +3 -0
  377. package/src/self-implement/orchestrator.ts +234 -6
  378. package/src/self-implement/run-stop.ts +123 -0
  379. package/src/self-implement/run-ttl.ts +258 -0
  380. package/src/self-implement/salvage-retention.ts +123 -0
  381. package/src/self-implement/seams.ts +7 -0
  382. package/src/self-implement/self-implement-cli.ts +2 -0
  383. package/src/self-implement/self-implement-runtime.ts +12 -0
  384. package/src/self-implement/sibling-resync.ts +223 -0
  385. package/src/self-implement/stop-autoheal.ts +204 -0
  386. package/src/session-runtime/index.ts +5 -3
  387. package/src/shell-env-bootstrap.ts +17 -3
  388. package/src/task-agent/board.ts +1 -1
  389. package/src/task-agent/card-evidence.ts +105 -10
  390. package/src/task-agent/judge.ts +7 -0
  391. package/src/task-agent/live-moves.ts +120 -20
  392. package/src/task-agent/mission.ts +1 -1
  393. package/src/task-agent/parent-host.ts +315 -0
  394. package/src/task-agent/shadow.ts +10 -1
  395. package/src/task-agent/task-hand.ts +16 -4
  396. package/src/task-orchestrator/surfaces/pod-command-job.ts +60 -11
  397. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +4 -0
  398. package/src/task-orchestrator/surfaces/pod-gate-deps.ts +123 -0
  399. package/src/task-orchestrator/surfaces/pod-install-slots.ts +89 -0
  400. package/src/task-orchestrator/surfaces/pod-lease.ts +93 -10
  401. package/src/task-orchestrator/surfaces/pod-pool.ts +147 -34
  402. package/src/task-orchestrator/surfaces/self-implement-pod.ts +58 -9
  403. package/src/telegram-commands.ts +41 -0
  404. package/src/testing/real-cli-spawn.ts +106 -0
  405. package/src/tool-runtime/browser-runtime.ts +87 -3
  406. package/src/tool-runtime/index.ts +1 -0
  407. package/src/user-config.ts +76 -7
  408. package/src/version/packed-revision.json +1 -1
  409. package/apps/pwa/out/_next/static/J5H7BvqgSI8DUjtRRcA_S/_buildManifest.js +0 -1
  410. package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
  411. package/apps/pwa/out/_next/static/chunks/1157-cba0e8553d35a980.js +0 -1
  412. package/apps/pwa/out/_next/static/chunks/171-23a877ed11720de9.js +0 -1
  413. package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
  414. package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
  415. package/apps/pwa/out/_next/static/chunks/2336-e830c777eb6bce04.js +0 -1
  416. package/apps/pwa/out/_next/static/chunks/2375-e061bb24cd2b5cde.js +0 -1
  417. package/apps/pwa/out/_next/static/chunks/2415.ed6428ff334c7ce2.js +0 -1
  418. package/apps/pwa/out/_next/static/chunks/3094.67339318c7f72a3a.js +0 -2
  419. package/apps/pwa/out/_next/static/chunks/338-ceb956612dcfaa86.js +0 -1
  420. package/apps/pwa/out/_next/static/chunks/3395-835e4ceaa6335ba4.js +0 -1
  421. package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
  422. package/apps/pwa/out/_next/static/chunks/3441-be82e3595aef3a20.js +0 -1
  423. package/apps/pwa/out/_next/static/chunks/3689-89905039bf3e7257.js +0 -1
  424. package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
  425. package/apps/pwa/out/_next/static/chunks/3822-6f268bc26c6a84ac.js +0 -1
  426. package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
  427. package/apps/pwa/out/_next/static/chunks/4457-d7df81c90f9d0268.js +0 -1
  428. package/apps/pwa/out/_next/static/chunks/4551-77dadae76f6cbace.js +0 -1
  429. package/apps/pwa/out/_next/static/chunks/4978.6fd93b974441e87f.js +0 -1
  430. package/apps/pwa/out/_next/static/chunks/5012-f746f6549b869f91.js +0 -1
  431. package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
  432. package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
  433. package/apps/pwa/out/_next/static/chunks/62-5bfed1e23790b745.js +0 -1
  434. package/apps/pwa/out/_next/static/chunks/6320-9bc8561fde416e07.js +0 -1
  435. package/apps/pwa/out/_next/static/chunks/649-ca96d1c5d09e02b8.js +0 -1
  436. package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
  437. package/apps/pwa/out/_next/static/chunks/6726-85a7db59b288c53f.js +0 -1
  438. package/apps/pwa/out/_next/static/chunks/6735-33267c4630d0d963.js +0 -1
  439. package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/7633-141682015873beb6.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/8067-143791231c99bd02.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/8430-a10cfba8ef282d4e.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/8870-9614a213b990b10b.js +0 -25
  447. package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/9454-12c2f30dea62291c.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/976-4a9b4ebdca7c739a.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/9989-15cdf568bafa9fc8.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/ae787e4c-e5b1ef00b2dbceca.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/app/approvals/page-deef5ee191830f14.js +0 -1
  454. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-b193da485f9a14b2.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/app/board/page-b6e1a79df0e214f4.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/app/botlab/page-e84df4d907f703c7.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/app/bots/page-a5fb9a5db89ae4ea.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/app/ceo/page-1499f481d7fc52d6.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/app/chat/page-c7cf753aeb648790.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/app/consult/page-4118469e514e10fd.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/app/control/page-e968f7630654332a.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/app/decisions/page-505915052f947022.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c2f962fb4a3b06c6.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/app/editor/page-7b5ed0bd8a589ec4.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/app/exec/page-cf8193250dd42dd4.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/app/field/page-cf3f5dfa35dea8e9.js +0 -1
  467. package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/app/inside/page-5b29d9b06ceadade.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/app/intake/page-a15e7fcc283e9ca7.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/app/layout-d2915e7b70ff3d0e.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/app/loops/page-2595f0eba29f57e1.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/app/market/page-c776322454156e36.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-77bbd17f4435aa10.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/app/morning/page-049689e611ecc936.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/app/not-found-85954a4fb09c44eb.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/app/observatory/page-e773e552e1068ee6.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5633c4bfa7684b4a.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d829b92bd01b4994.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-061c317fc771becf.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a45ece8865ed4b6.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/app/page-0be990618c0d56bd.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/app/reflection/page-bfea4865dc244b73.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d6ba8e337741484.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/app/sessions/page-76a88b55d816482e.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-bba1542df59f61ce.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/app/settings/page-4185c95689bb372e.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-b699e1a8d5d34b8b.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/app/setup/page-c225e338c31bf274.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/app/share/page-449353f70507ca1f.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/app/showroom/page-90b889714102476d.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f1ee7fbeb7f96ddc.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/app/term/page-d59a95e1434dfaa0.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/app/today/page-71491a23414d1a47.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/app/trace/page-de7112bdb65fa4fe.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/app/vault/page-feb4d0d88079660d.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-f17d887b40dd6b1d.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/app/workflows/page-8da77be2192bcd5d.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/app/workspace/page-72c3b9a5e9582b29.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c3afe4c8d0c48c39.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/main-app-b9308f2d8a931531.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/webpack-6f35f9d892fa630b.js +0 -1
  507. package/apps/pwa/out/_next/static/css/85f53c6f35d11382.css +0 -1
  508. /package/apps/pwa/out/_next/static/{J5H7BvqgSI8DUjtRRcA_S → MObU8ujkMciAKr6ljAV05}/_ssgManifest.js +0 -0
  509. /package/skills/project-onboarding/{skill.md → SKILL.md} +0 -0
@@ -38,8 +38,12 @@
38
38
  # (파일 이름은 RFC 어휘를 남겨 둔다 — 사람이 찾는 이름과 조인 키가 다를 수 있다.)
39
39
  graph_id: self-implement
40
40
  version: 1
41
- entry_node: author
42
- terminal_nodes: [merge]
41
+ # ⭐ HARNESS-FULL-GRAPH (0.2.21 · 대표 10-08) — 입구부터 회수까지 «여정 전체»가 노드다.
42
+ # 📄 내부 문서 `RFC-harness-full-journey-as-graph-2026-10-08` · 코드 = src/self-dev/graph-journey-nodes.ts
43
+ # ⛔ 여정 노드(intake … stopped)의 id 는 원장·라이브 그래프 화면의 조인 키다 — 바꾸지 마라.
44
+ # 🔀 분기는 «데이터»다(`on:` 상태 키 ⊕ `map:` 값→노드) — 기본 = 풀세트, 환경(substrate·freeze·queue)이 일부를 건너뛴다.
45
+ entry_node: intake
46
+ terminal_nodes: [cleanup, stopped]
43
47
 
44
48
  # Runner-provided inputs are declared here so contract-flow can distinguish them from undeclared gaps.
45
49
  runner_inputs: [ask_text, goal, worktree, branch, review-intent, head-sha, base-branch]
@@ -61,8 +65,13 @@ runner_inputs: [ask_text, goal, worktree, branch, review-intent, head-sha, base-
61
65
  # 🔑 ⇒ ***여기 적은 도구 권한은 「선언」이고 「제한」이 아니다.*** 자식의 실제 권한은 코드가 정한다.
62
66
  # ⛔ 그러니 이 칸을 좁혀 「자식이 그 도구를 못 쓴다」고 읽지 마라 — 지금은 안 그렇다.
63
67
  # 🔎 반증: rg -n "readonly contract" src/self-implement/graph-templates.ts (⇒ 0건이면 여전히 그렇다)
68
+ # 🧩 `group:` = 나중에 `graphs/units/*.yaml` 로 들어 올릴 «한 노드로 부르는 부분 그래프» 단위(대표 10-08).
69
+ # entry · dispatch · author · dispatch-pod · build · verify · land · recover · end
70
+ # ⛔ 지금 파서는 이 칸을 «읽지 않는다»(무시) — 단위 호출은 0.2.22(RFC §6). 묶음은 «위치»가 아니라 이 태그로 정한다
71
+ # (오버레이가 /nodes/<번호> 로 가리켜 노드를 재배열할 수 없다).
64
72
  nodes:
65
73
  - node_id: author
74
+ group: author
66
75
  kind: agent
67
76
  recipe: goal-author
68
77
  max_visits: 2
@@ -74,6 +83,7 @@ nodes:
74
83
  outputs: [goal_path, goal_id, goal_type, grounding_context]
75
84
 
76
85
  - node_id: plan
86
+ group: author
77
87
  kind: agent
78
88
  recipe: harness-plan-rfc
79
89
  max_visits: 2
@@ -85,6 +95,7 @@ nodes:
85
95
  outputs: [rfc_path, markdown, arcs, open_questions]
86
96
 
87
97
  - node_id: decompose
98
+ group: author
88
99
  kind: judge
89
100
  recipe: fabric-decompose-adapter
90
101
  max_visits: 12
@@ -96,6 +107,7 @@ nodes:
96
107
  outputs: [pieces, ordering, depends_on_edges, hot_path_edges, omitted_goal_count]
97
108
 
98
109
  - node_id: implement
110
+ group: build
99
111
  kind: agent
100
112
  recipe: headless-goal-loop # seams.implement → 자식 PTY
101
113
  max_visits: 12
@@ -109,6 +121,7 @@ nodes:
109
121
  outputs: [diff, summary, changed-files]
110
122
 
111
123
  - node_id: gate
124
+ group: verify
112
125
  kind: gate
113
126
  recipe: gate-baseline # 변경 파일 «범위» · 새 회귀만
114
127
  max_visits: 11
@@ -122,6 +135,7 @@ nodes:
122
135
  outputs: [passed, gate-log, reflect-gate-facts]
123
136
 
124
137
  - node_id: review
138
+ group: verify
125
139
  kind: judge
126
140
  recipe: pr-reviewer # agent-substrate/pr-reviewer
127
141
  max_visits: 11
@@ -135,6 +149,7 @@ nodes:
135
149
  outputs: [verdict, must-fix, should-fix, review-summary]
136
150
 
137
151
  - node_id: rework
152
+ group: verify
138
153
  kind: agent
139
154
  recipe: headless-goal-loop # 같은 루프의 다음 라운드
140
155
  max_visits: 10
@@ -148,6 +163,7 @@ nodes:
148
163
  outputs: [diff, summary]
149
164
 
150
165
  - node_id: main-sync
166
+ group: land
151
167
  kind: git
152
168
  recipe: seams-git-merge-main # LLM 충돌해결 포함
153
169
  max_visits: 2
@@ -159,6 +175,7 @@ nodes:
159
175
  outputs: [synced, conflicts]
160
176
 
161
177
  - node_id: regate
178
+ group: land
162
179
  kind: gate
163
180
  recipe: gate-baseline # 충돌해결 «뒤» 재-gate
164
181
  max_visits: 2
@@ -170,6 +187,7 @@ nodes:
170
187
  outputs: [passed, gate-log]
171
188
 
172
189
  - node_id: open-pr
190
+ group: land
173
191
  kind: git
174
192
  recipe: seams-gh-open-pr
175
193
  # 📏 실측 2026-09-08 (원장 30일 · 전 우주 · 걸음 191개 소급 계산):
@@ -185,6 +203,7 @@ nodes:
185
203
  outputs: [pr-number, pr-url]
186
204
 
187
205
  - node_id: merge
206
+ group: land
188
207
  kind: git
189
208
  recipe: seams-gh-merge-squash
190
209
  # 📏 실측 2026-09-08 (원장 30일 · 전 우주 · 걸음 191개 소급 계산):
@@ -199,6 +218,176 @@ nodes:
199
218
  tools: gh-pr-merge
200
219
  outputs: [merged]
201
220
 
221
+ # ⛔ 여정 노드는 «목록 끝»에 둔다 — 오버레이가 JSON 포인터(/nodes/<번호>)로 노드를 가리킨다(rework-patient). 앞에 끼우면 번호가 밀린다.
222
+ # ───────── 여정 앞단: 입구 → 대기열 → 발사 관문 → 배치 ─────────
223
+ - node_id: intake
224
+ group: entry
225
+ kind: observe
226
+ recipe: harness-entrance # src/harness/harness-cli-command.ts (say · ask · TUI /harness)
227
+ max_visits: 1
228
+ terminal_stages: []
229
+ contract:
230
+ inputs: [ask_text]
231
+ tools: none
232
+ outputs: [entrance, journey_key]
233
+
234
+ - node_id: queue
235
+ group: entry
236
+ kind: gate
237
+ recipe: harness-queue # src/harness/harness-queue.ts (directSay 플래그 · 기본 끔 → 건너뜀)
238
+ max_visits: 1
239
+ terminal_stages: []
240
+ contract:
241
+ inputs: [entrance, seat]
242
+ tools: queue-write
243
+ outputs: [queue_item, queue_outcome]
244
+
245
+ - node_id: launch-gate
246
+ group: entry
247
+ kind: gate
248
+ recipe: pre-launch-gate # harness-cli-command.ts preLaunchGate (예산 · 같은 골 활성 런)
249
+ max_visits: 1
250
+ terminal_stages: []
251
+ contract:
252
+ inputs: [goal_id, budget]
253
+ tools: read-only
254
+ outputs: [launch_decision]
255
+
256
+ - node_id: dispatch
257
+ group: dispatch
258
+ kind: judge
259
+ recipe: harness-substrate-select # resolveLaunchSubstrate → substrate = local | pod
260
+ max_visits: 2
261
+ terminal_stages: []
262
+ contract:
263
+ inputs: [launch_decision]
264
+ tools: read-only
265
+ outputs: [substrate]
266
+
267
+ # ───────── Pod 배치 (substrate == pod 일 때만 — local 은 건너뛴다) ─────────
268
+ - node_id: pool-admit
269
+ group: dispatch-pod
270
+ kind: gate
271
+ recipe: pod-pool-admission # src/task-orchestrator/surfaces/self-implement-pod.ts (입장 · 멤버 슬롯 · 메모리 등급)
272
+ max_visits: 4
273
+ terminal_stages: []
274
+ contract:
275
+ inputs: [substrate, memory_tier]
276
+ tools: pod-lease
277
+ outputs: [pool_member]
278
+
279
+ - node_id: image-sync
280
+ group: dispatch-pod
281
+ kind: gate
282
+ recipe: pod-pool-image-sync # src/task-orchestrator/surfaces/pod-pool.ts syncPoolImages (멤버별 · pack 한 번)
283
+ max_visits: 4
284
+ terminal_stages: []
285
+ contract:
286
+ inputs: [pool_member]
287
+ tools: image-ship
288
+ outputs: [image_current]
289
+
290
+ - node_id: credential-refresh
291
+ group: dispatch-pod
292
+ kind: gate
293
+ recipe: pod-credential-prerefresh # self-implement-pod.ts podCodexCredentialWithPrerefresh
294
+ max_visits: 4
295
+ terminal_stages: []
296
+ contract:
297
+ inputs: [pool_member]
298
+ tools: credential-refresh
299
+ outputs: [usable_accounts]
300
+
301
+ # ───────── 착지: 동결 검사 → (보류) → 병합 → 회수 ─────────
302
+ - node_id: freeze-check
303
+ group: land
304
+ kind: gate
305
+ recipe: landing-freeze-admission # src/self-implement/frozen-merges.ts admitLandingMerge (병합 직전 한 곳)
306
+ max_visits: 4
307
+ terminal_stages: []
308
+ contract:
309
+ inputs: [pr-number]
310
+ tools: read-only
311
+ outputs: [freeze]
312
+
313
+ - node_id: hold
314
+ group: land
315
+ kind: hitl
316
+ recipe: frozen-merge-queue # frozen-merges.ts queueFrozenMerge → sweepFrozenMerges 가 해제 뒤 재개
317
+ max_visits: 4
318
+ terminal_stages: []
319
+ contract:
320
+ inputs: [pr-number, head-sha]
321
+ tools: queue-write
322
+ outputs: [held]
323
+
324
+ - node_id: cleanup
325
+ group: land
326
+ kind: git
327
+ recipe: post-merge-cleanup # src/self-implement/orchestrator.ts (워크트리 ⊕ 브랜치 회수)
328
+ max_visits: 1
329
+ terminal_stages: []
330
+ contract:
331
+ inputs: [worktree, branch]
332
+ tools: git-write
333
+ outputs: [cleaned]
334
+
335
+ # ───────── 실패 쪽: 결과 해석 → 수확 → heal → 다음 한 수 ─────────
336
+ - node_id: result-parse
337
+ group: recover
338
+ kind: observe
339
+ recipe: pod-failure-reason # src/task-orchestrator/surfaces/pod-failure-reason.ts
340
+ max_visits: 4
341
+ terminal_stages: []
342
+ contract:
343
+ inputs: [pod_log]
344
+ tools: read-only
345
+ outputs: [failure_reason]
346
+
347
+ - node_id: salvage
348
+ group: recover
349
+ kind: git
350
+ recipe: salvage-branch # salvage/si-task-<job>/… (Pod Job 이 push · salvage-branches.ts 가 읽는다)
351
+ max_visits: 4
352
+ terminal_stages: []
353
+ contract:
354
+ inputs: [worktree]
355
+ tools: git-write
356
+ outputs: [salvage_ref]
357
+
358
+ - node_id: heal
359
+ group: recover
360
+ kind: judge
361
+ recipe: heal-intake # src/self-implement/heal-intake.ts (호스트에서만)
362
+ max_visits: 4
363
+ terminal_stages: []
364
+ contract:
365
+ inputs: [failure_reason, salvage_ref]
366
+ tools: read-only
367
+ outputs: [heal_signature]
368
+
369
+ - node_id: next-move
370
+ group: recover
371
+ kind: judge
372
+ recipe: task-agent-judge # src/task-agent/judge.ts (판단부 → 실행부)
373
+ max_visits: 4
374
+ terminal_stages: []
375
+ contract:
376
+ inputs: [heal_signature]
377
+ tools: read-only
378
+ outputs: [next_action]
379
+
380
+ - node_id: stopped
381
+ group: end
382
+ kind: observe
383
+ recipe: journey-stopped # 거절·포기 — 종결
384
+ max_visits: 1
385
+ terminal_stages: []
386
+ contract:
387
+ inputs: []
388
+ tools: none
389
+ outputs: []
390
+
202
391
  # ═══════════════════════════════════════════════════════════════════════
203
392
  # 엣지 — ⛔ 출처는 «코드 선언 ⊕ 원장 실측» 둘 다다. 어느 하나만 보면 틀린다.
204
393
  # 📏 2026-09-08 실측 (pipeline-traversal-shadow 182 걸음 · 판정 함수가 «실제로 본» 것):
@@ -207,14 +396,83 @@ nodes:
207
396
  # gate→main-sync · gate→open-pr · review→open-pr
208
397
  # 🔑 그래서 엣지마다 `observed` 를 «값으로» 적는다 — 「선언했다」와 「돈다」를 가른다.
209
398
  edges:
399
+ # ───── 여정 앞단 — 분기는 «데이터»(on/map). 값은 코드가 낸다(RFC §4.3 ⑵) ─────
400
+ - from: intake
401
+ on: queue
402
+ map:
403
+ queued: queue # harness.queue.directSay 켬 ⊕ 자리 있음
404
+ direct: launch-gate # 기본(플래그 끔) — 대기열을 건너뛴다
405
+
406
+ - from: queue
407
+ on: queue_outcome
408
+ map:
409
+ launched: launch-gate # 대기열이 발사한 자식이 다시 intake 를 밟는다(queueLaunchId 로 잇는다)
410
+ waiting: stopped # 이 프로세스는 여기서 끝난다(발사는 대기열 tick 의 몫)
411
+ refused: stopped # 같은 요청이 이미 대기열에 있다
412
+
413
+ - from: launch-gate
414
+ on: outcome
415
+ map:
416
+ pass: dispatch
417
+ refuse: stopped
418
+
419
+ - from: dispatch
420
+ to: author
421
+
210
422
  - from: author
211
423
  to: plan
212
424
 
213
425
  - from: plan
214
426
  to: decompose
215
427
 
428
+ # ⭐ 실행 칸(substrate)이 «Pod 쪽 세 노드»를 켜고 끈다 — local 은 곧장 구현.
216
429
  - from: decompose
217
- to: implement
430
+ on: substrate
431
+ map:
432
+ local: implement
433
+ pod: pool-admit
434
+
435
+ - from: pool-admit
436
+ on: outcome
437
+ map:
438
+ admitted: image-sync
439
+ refused: stopped
440
+
441
+ - from: image-sync
442
+ to: credential-refresh
443
+
444
+ - from: credential-refresh
445
+ on: outcome
446
+ map:
447
+ usable: implement
448
+ exhausted: stopped
449
+
450
+ # 실패 쪽 — Pod 구현이 rc≠0 이면 결과 해석으로.
451
+ - from: implement
452
+ on: pod_result
453
+ map:
454
+ failed: result-parse
455
+
456
+ - from: result-parse
457
+ to: salvage
458
+
459
+ # ⚠️ heal 은 실패 사건 «접수»다 — 호스트에서만(Pod 안에서는 시작 안 함 · POD-RESULT-PARSE).
460
+ - from: salvage
461
+ to: heal
462
+
463
+ - from: heal
464
+ to: next-move
465
+
466
+ # 출구 라벨 = task-agent 판단부의 수(TaskMove · src/task-agent/judge.ts). 관측 배선은 0.2.22(판단이 카드 단위라 런 조인 먼저).
467
+ - from: next-move
468
+ on: move
469
+ map:
470
+ narrow-relaunch: dispatch
471
+ salvage-relaunch: dispatch
472
+ alternative: dispatch
473
+ wait-retry: dispatch
474
+ decision-card: stopped
475
+ wait: stopped
218
476
 
219
477
  - from: implement
220
478
  to: gate
@@ -264,6 +522,20 @@ edges:
264
522
  to: open-pr
265
523
  observed: 80
266
524
 
525
+ # ⭐ HARNESS-FULL-GRAPH — 코드 간선 open-pr→merge 사이에 «동결 검사»가 늘 끼어 있었다(병합 직전 한 곳).
267
526
  - from: open-pr
268
- to: merge
269
- observed: 80
527
+ to: freeze-check
528
+ observed: 80 # 옛 open-pr→merge 관측 — 그 사이에 동결 검사가 늘 있었다
529
+
530
+ - from: freeze-check
531
+ on: freeze
532
+ map:
533
+ open: merge
534
+ frozen: hold
535
+ taken: stopped # 다른 착지자(재개 sweep)가 그 PR 을 쥐었다
536
+
537
+ - from: hold
538
+ to: freeze-check # 해제 뒤 재검사
539
+
540
+ - from: merge
541
+ to: cleanup
@@ -0,0 +1,25 @@
1
+ graph_id: retro-daily
2
+ version: 1
3
+ loop:
4
+ title: 매일 회고
5
+ description: 지난 24시간 사실(retro facts)을 묶어 반복·«초록 뒤 재발»을 먼저 올리고, 사실 id 를 단 인사이트와 조치 초안(≤3)을 낸다 — 기본 shadow(체크리스트·메시지 0)
6
+ trigger:
7
+ cron: '40 22 * * *'
8
+ entry_node: collect
9
+ terminal_nodes: [done, failed]
10
+ nodes:
11
+ - { node_id: collect, kind: agent, recipe: 'cmd:collect', max_visits: 1 }
12
+ - { node_id: cluster, kind: agent, recipe: 'cmd:cluster', max_visits: 1 }
13
+ - { node_id: recur, kind: agent, recipe: 'cmd:recur', max_visits: 1 }
14
+ - { node_id: insight, kind: agent, recipe: 'cmd:insight', max_visits: 1 }
15
+ - { node_id: act, kind: agent, recipe: 'cmd:act', max_visits: 1 }
16
+ - { node_id: report, kind: agent, recipe: 'cmd:report', max_visits: 1 }
17
+ - { node_id: done, kind: gate, max_visits: 1 }
18
+ - { node_id: failed, kind: gate, max_visits: 1 }
19
+ edges:
20
+ - { from: collect, on: outcome, map: { ok: cluster, fail: failed } }
21
+ - { from: cluster, on: outcome, map: { ok: recur, fail: failed } }
22
+ - { from: recur, on: outcome, map: { ok: insight, fail: failed } }
23
+ - { from: insight, on: outcome, map: { ok: act, fail: failed } }
24
+ - { from: act, on: outcome, map: { ok: report, fail: failed } }
25
+ - { from: report, on: outcome, map: { ok: done, fail: failed } }
@@ -0,0 +1,24 @@
1
+ collect:
2
+ command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" collect'
3
+ dry_run_command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" collect'
4
+ timeout_ms: 600000
5
+ cluster:
6
+ command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" cluster'
7
+ dry_run_command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" cluster'
8
+ timeout_ms: 60000
9
+ recur:
10
+ command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" recur'
11
+ dry_run_command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" recur'
12
+ timeout_ms: 60000
13
+ insight:
14
+ command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" insight'
15
+ dry_run_command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" insight'
16
+ timeout_ms: 60000
17
+ act:
18
+ command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" act'
19
+ dry_run_command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" act'
20
+ timeout_ms: 60000
21
+ report:
22
+ command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" report'
23
+ dry_run_command: 'bun "$ELANOUS_GRAPH_DIR/../../src/retro/daily.ts" report'
24
+ timeout_ms: 60000
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "elanous",
3
3
  "mcpName": "io.github.ElanvitalAI/elanous",
4
- "version": "0.2.19",
4
+ "version": "0.2.21",
5
5
  "description": "Self-healing coding harness where eyes, hands, and memory all turn on one sentence — it authors its own goals, implements them in isolated worktrees, and reviews its own work.",
6
6
  "license": "Apache-2.0",
7
7
  "author": "Elanvital AI",
@@ -1191,7 +1191,9 @@ export function formatAxisObservations(a: Axis): readonly string[] {
1191
1191
  ];
1192
1192
  }
1193
1193
 
1194
- function main(files: string[]): number {
1194
+ /** CLI 본체. ⭐ 시험 심으로 export 한다(GATE-SPEED ③ · 2026-10-08) — 시험이 같은 출력 계약을
1195
+ * 프로세스 하나 안에서 잴 수 있게. 실물 진입점(`import.meta.main`)은 아래 한 줄 그대로다. */
1196
+ export function main(files: string[]): number {
1195
1197
  if (files.length === 0) {
1196
1198
  console.error('쓰는 법: bun scripts/ask-marker-check.ts <ask 파일…>');
1197
1199
  return 2;
@@ -240,15 +240,42 @@ lsof_fd1() {
240
240
  return 0
241
241
  }
242
242
 
243
+ # 🐧 lsof 가 없는 리눅스(게이트 Pod 이미지 · 0.2.20 컷 실측)에서는 /proc/<pid>/fd/1 을 읽어
244
+ # lsof -Ftn 과 «같은 모양»(t<type>\nn<name>)으로 낸다 — 아래 판정 표를 그대로 쓴다.
245
+ # ⛔ 못 읽으면(죽은 pid·권한) 1 을 돌려 「모름」으로 끝낸다.
246
+ proc_fd1() {
247
+ local pid="$1" target
248
+ target=$(readlink "/proc/$pid/fd/1" 2>/dev/null) || return 1
249
+ [ -n "$target" ] || return 1
250
+ case "$target" in
251
+ pipe:*) printf 'tPIPE\nn%s\n' "$target" ;;
252
+ socket:*) printf 'tunix\nn%s\n' "$target" ;;
253
+ *)
254
+ if [ -c "$target" ]; then printf 'tCHR\nn%s\n' "$target"
255
+ elif [ -f "$target" ]; then printf 'tREG\nn%s\n' "$target"
256
+ else printf 'tunknown\nn%s\n' "$target"
257
+ fi ;;
258
+ esac
259
+ return 0
260
+ }
261
+
243
262
  delivery_of() {
244
263
  local pid="$1" out t n
245
264
  case "$pid" in
246
265
  ''|*[!0-9]*) printf '⚠️ «못 쟀다»(감시자 pid 를 «증명하지 못했다») — 「정상」이 아니라 «모름»이다'; return 0 ;;
247
266
  esac
248
- command -v lsof >/dev/null 2>&1 || { printf '⚠️ «못 쟀다»(lsof 없음) — 「정상」이 아니라 «모름»이다'; return 0; }
249
- if ! out=$(lsof_fd1 "$pid"); then
250
- printf '⚠️ «못 쟀다»(lsof 가 %s틱 안에 안 끝나 죽였다) — 「정상」이 아니라 «모름»이다' "$LSOF_WAIT_TICKS"
251
- return 0
267
+ if command -v lsof >/dev/null 2>&1; then
268
+ if ! out=$(lsof_fd1 "$pid"); then
269
+ printf '⚠️ «못 쟀다»(lsof 가 %s틱 안에 안 끝나 죽였다) — 「정상」이 아니라 «모름»이다' "$LSOF_WAIT_TICKS"
270
+ return 0
271
+ fi
272
+ elif command -v readlink >/dev/null 2>&1 && [ -d /proc/self/fd ]; then
273
+ if ! out=$(proc_fd1 "$pid"); then
274
+ printf '⚠️ «못 쟀다»(/proc/%s/fd/1 을 못 읽었다 · lsof 없음) — 「정상」이 아니라 «모름»이다' "$pid"
275
+ return 0
276
+ fi
277
+ else
278
+ printf '⚠️ «못 쟀다»(lsof 없음) — 「정상」이 아니라 «모름»이다'; return 0
252
279
  fi
253
280
  t=$(printf '%s\n' "$out" | sed -n 's/^t//p' | head -1)
254
281
  n=$(printf '%s\n' "$out" | sed -n 's/^n//p' | head -1)
@@ -13,6 +13,7 @@ import {
13
13
  } from '../src/autopilot/discovery/doc-lint.js';
14
14
  import { parseIndexLinks } from '../src/autopilot/discovery/doc-inventory.js';
15
15
  import { execFileSync } from 'node:child_process';
16
+ import { runGitCommand } from '../src/git-fs/runner.js';
16
17
  import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
17
18
  import { basename, join, relative } from 'node:path';
18
19
  import { sourceIdentifierInventory, inlineCodeIdentifiers } from '../src/autopilot/discovery/source-identifiers.js';
@@ -80,7 +81,9 @@ const readText = (relPath: string): string | null => { try { return readFileSync
80
81
  // 전부 「못 읽음」이 되어 이 규칙이 통째로 잡음이 된다. 그래서 파일명 → repo 경로를 «한 번» 만든다.
81
82
  // ⛔ 같은 파일명이 둘 이상이면 «해석하지 않는다** — 틀린 파일을 대면 「어긋남」이 거짓으로 난다.
82
83
  const sourcePathsByBasename = new Map<string, string | null>();
83
- for (const relPath of execFileSync('git', ['ls-files', '*.ts', '*.tsx'], { cwd: repoRoot, encoding: 'utf-8' }).split('\n')) {
84
+ const lsFiles = runGitCommand(repoRoot, ['ls-files', '*.ts', '*.tsx'], { encoding: 'utf-8', maxBuffer: 64 * 1024 * 1024 });
85
+ if (lsFiles.status !== 0) throw new Error(`git ls-files failed: ${lsFiles.stderr.trim() || `rc=${lsFiles.status}`}`);
86
+ for (const relPath of lsFiles.stdout.split('\n')) {
84
87
  if (relPath === '') continue;
85
88
  const base = basename(relPath);
86
89
  sourcePathsByBasename.set(base, sourcePathsByBasename.has(base) ? null : relPath);
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env bun
2
+ // LAND-GLOBAL-CHECKS — 착지 게이트가 «전역 검사»를 바뀐 파일로 끌어온다.
3
+ //
4
+ // `pr land` 는 바뀐 파일만 본다. 그런데 저장소 전체를 훑는 정적 시험(전역 검사)은 «그 시험 파일»이
5
+ // 안 바뀌면 착지에서 한 번도 안 돈다 — 0.2.19 회귀 9 중 넷이 이 꼴이었다
6
+ // (hook-order-sweep #24719 · next.md B11 #24688 · machines 생성 Markdown #24729 · harness 하위 명령 목록 #24661).
7
+ //
8
+ // ⭐ 표는 «여기 한 곳»이다(경로 꼴 → 시험). 새 전역 검사를 붙이려면 이 표에 줄을 더한다.
9
+ // 재는 명령: `bun scripts/land-global-checks.ts` (표) · `bun scripts/land-global-checks.ts <바뀐 파일…>` (끌려오는 시험)
10
+
11
+ import { spawnSync } from 'node:child_process';
12
+
13
+ type LandGlobalCheck = {
14
+ /** 바뀐 파일 경로(저장소 루트 기준 · `/` 구분)에 대는 꼴. */
15
+ pattern: RegExp;
16
+ /** 끌려오는 전역 시험 파일. */
17
+ test: string;
18
+ /** 왜 이 꼴이 이 시험을 부르나 — 회귀 근거. */
19
+ why: string;
20
+ };
21
+
22
+ export const LAND_GLOBAL_CHECKS: readonly LandGlobalCheck[] = [
23
+ { pattern: /^apps\/pwa\/.+\.tsx$/, test: 'test/hook-order-sweep.test.ts', why: 'PWA 컴포넌트 훅 순서(#24719)' },
24
+ { pattern: /^release\/next\.md$/, test: 'scripts/release-story/draft.test.ts', why: '판 노트 초안·브랜드 규칙(#24688)' },
25
+ { pattern: /^docs\/ops\/machines\.yaml$/, test: 'test/machines-ledger-data.test.ts', why: '기계 원장 데이터 ↔ 생성 Markdown(#24729)' },
26
+ // 새 CLI 하위 명령은 `src/index.ts` 또는 `src/cli/` 의 등록 모듈에서 생긴다 — 입구 목록 시험(#24661).
27
+ { pattern: /^src\/(?:index|cli\/(?:[^/]+\/)*[^/]+)(?<!\.test)\.ts$/, test: 'src/index.test.ts', why: 'CLI 입구·하위 명령 목록(#24661)' },
28
+ ];
29
+
30
+ /** 바뀐 파일 → 끌려오는 전역 시험(표 순서 · 중복 없음). */
31
+ export function landGlobalChecks(changedFiles: readonly string[], table: readonly LandGlobalCheck[] = LAND_GLOBAL_CHECKS): string[] {
32
+ const tests: string[] = [];
33
+ for (const { pattern, test } of table) {
34
+ if (!tests.includes(test) && changedFiles.some((file) => pattern.test(file.replace(/\\/g, '/')))) tests.push(test);
35
+ }
36
+ return tests;
37
+ }
38
+
39
+ export type LandGlobalChecksRun = { status: number | null; output: string; error?: string };
40
+
41
+ type LandGlobalChecksGateIo = {
42
+ changedFiles: readonly string[];
43
+ cwd: string;
44
+ log: (message: string) => void;
45
+ error: (message: string) => void;
46
+ /** 시험 주입용 — 기본은 결정적 러너(`scripts/test-deterministic.ts`)로 끌려온 시험만 돌린다. */
47
+ runTests?: (tests: readonly string[], cwd: string) => LandGlobalChecksRun;
48
+ };
49
+
50
+ function runDeterministic(tests: readonly string[], cwd: string): LandGlobalChecksRun {
51
+ const r = spawnSync('bun', ['run', 'scripts/test-deterministic.ts', ...tests], {
52
+ cwd, encoding: 'utf8', maxBuffer: 256 * 1024 * 1024, timeout: 15 * 60_000,
53
+ });
54
+ return { status: r.status, output: `${r.stdout ?? ''}\n${r.stderr ?? ''}`, ...(r.error ? { error: r.error.message } : {}) };
55
+ }
56
+
57
+ /**
58
+ * 반환: true = 해당 없음 또는 끌려온 시험 통과 · false = 끌려온 시험이 실패했다(착지를 막는다).
59
+ * ⛔ 러너가 «못 돌았다»(spawn 실패·시간 초과)면 던진다 — 호출부(`gateVerdict`)가 「검사 못 함」으로 말한다.
60
+ */
61
+ export function runLandGlobalChecksGate(io: LandGlobalChecksGateIo): boolean {
62
+ const tests = landGlobalChecks(io.changedFiles);
63
+ if (tests.length === 0) {
64
+ io.log(`[land-global-checks] 해당 없음 — 바뀐 파일 ${io.changedFiles.length}개가 전역 검사 표(${LAND_GLOBAL_CHECKS.length}줄)의 꼴에 안 걸린다.`);
65
+ return true;
66
+ }
67
+ io.log(`[land-global-checks] 전역 검사 ${tests.length}개를 끌어온다: ${tests.join(' · ')}`);
68
+ const result = (io.runTests ?? runDeterministic)(tests, io.cwd);
69
+ if (result.error !== undefined || result.status === null) {
70
+ throw new Error(`전역 검사 러너가 못 돌았다 — ${result.error ?? 'status=null'}`);
71
+ }
72
+ if (result.status !== 0) {
73
+ const tail = result.output.split('\n').filter((line) => /\(fail\)|^\s*\d+ (pass|fail)|^Ran /.test(line)).slice(-12);
74
+ for (const line of tail) io.error(`[land-global-checks] ${line.trim()}`);
75
+ return false;
76
+ }
77
+ return true;
78
+ }
79
+
80
+ if (import.meta.main) {
81
+ const changed = process.argv.slice(2);
82
+ if (changed.length === 0) {
83
+ console.log(`전역 검사 표 ${LAND_GLOBAL_CHECKS.length}줄`);
84
+ for (const row of LAND_GLOBAL_CHECKS) console.log(`${row.pattern.source} → ${row.test} · ${row.why}`);
85
+ } else {
86
+ const tests = landGlobalChecks(changed);
87
+ console.log(`끌려오는 전역 시험 ${tests.length}개${tests.length ? `: ${tests.join(' · ')}` : ''}`);
88
+ }
89
+ }
@@ -15,7 +15,8 @@ export const PCH_REGRESS_MAP: Record<string, readonly string[]> = {
15
15
  'PCH-8': ['src/lib/chat-harness-ask.test.ts', 'src/components/chat/HarnessAskCard.test.tsx'],
16
16
  'PCH-9': ['src/components/chat/ChatPendingDecision.test.tsx', 'src/components/chat/ChatDecisionsChip.test.tsx'],
17
17
  'PCH-10': ['src/lib/chat-runtime.meta.test.ts'], // /rewind · /undo meta commands.
18
- 'PCH-11': ['src/lib/chat-fork.test.ts'],
18
+ // Full fork and turn-bearing rewind/undo branches; live PWA behavior still needs observation.
19
+ 'PCH-11': ['src/lib/chat-fork.test.ts', 'src/lib/chat-branch.test.ts'],
19
20
  'PCH-12': ['src/lib/chat-runtime.run-skill.test.ts'],
20
21
  'PCH-13': ['src/components/chat/ChatConversationList.test.tsx'], // Chat search; export has no identified PWA test.
21
22
  'PCH-14': ['src/lib/compact-mode.test.ts'], // Compact; plan toggle has no identified PWA test.
@@ -1,10 +1,11 @@
1
1
  import { readFileSync, writeFileSync } from 'node:fs';
2
- import { resolve } from 'node:path';
2
+ import { basename, resolve } from 'node:path';
3
3
  import { FEATURE_MATURITY } from '../../src/maturity/feature-maturity.js';
4
4
  import type { ChecklistItem } from '../../src/release-loop/checklist.js';
5
5
  import type { ReleaseSchedule } from '../../src/release-loop/release-schedule.js';
6
6
  import type { MergedRunLedgerQuery } from '../../src/self-implement/run-ledger.js';
7
7
  import { generateFeatureMap } from './generate-feature-map.js';
8
+ import { draftReleaseStory } from '../release-story/draft.js';
8
9
 
9
10
  const MAP = resolve(import.meta.dir, '../../docs/marketing/MAP-value-props-to-features.md');
10
11
  const AUTONOMY = new Set(['ORCH1', 'ORCH2', 'LOOP-LIVE1', 'AUTOQ-LOOP', 'AUTHOR-PAR', 'RUN-HELPER', 'FINISH-RATE']);
@@ -110,6 +111,22 @@ export function generateAxBrief(version: string, sources: AxBriefSources): strin
110
111
  ].join('\n');
111
112
  }
112
113
 
114
+ /** Derive the next release's internal brief from its ledgers and the RELEASE-STORY version-note draft.
115
+ * The release loop supplies its version, ledger sources and isolated story paths; the standalone CLI stays unchanged. */
116
+ export function generateNextVersionAxBrief(
117
+ nextVersion: string,
118
+ sources: AxBriefSources,
119
+ storyOptions: Omit<Parameters<typeof draftReleaseStory>[0], 'version'> = {},
120
+ ): string {
121
+ const brief = generateAxBrief(nextVersion, sources);
122
+ const story = draftReleaseStory({ ...storyOptions, version: nextVersion });
123
+ const announcementFile = story.files.find((file) => basename(file) === 'announcement.md');
124
+ const announcement = story.status === 'drafted' && announcementFile
125
+ ? readFileSync(announcementFile, 'utf8').replace(/^# [^\r\n]*\r?\n/, '').trim()
126
+ : '사용자 대상 변경 없음 — RELEASE-STORY 초안을 건너뜀';
127
+ return `${brief}\n## 5. 다음 판 변화·근거 (RELEASE-STORY 초안)\n\n> 공개 전 CMO 확인 필요 · 원천: release/next.md, 해당 판의 green 칸, 연결된 검증 소구점 원장\n\n${announcement}\n`;
128
+ }
129
+
113
130
  if (import.meta.main) {
114
131
  const args = process.argv.slice(2);
115
132
  const option = (name: string) => {