elanous 0.2.29 → 0.2.32

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 (775) 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/{cIpv5nU9AycwYWZI9H589 → IVKr3AlRUVLKsw2fh7eXF}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{058a98ba.7eb28d5e6dc03565.js → 0bb0ff36.b8d418980951e5ba.js} +7 -7
  5. package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +27 -0
  8. package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +287 -0
  9. package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +62 -0
  10. package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/{6013-2f769370d8b4c2c6.js → 1335-6731f392c35216eb.js} +3 -3
  12. package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/{8332.6f0f49df772e163b.js → 1654.32de4b324981a188.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
  17. package/apps/pwa/out/_next/static/chunks/{8795.32573a185af18c7b.js → 1913.7cc6fb6055b1ed3f.js} +2 -2
  18. package/apps/pwa/out/_next/static/chunks/{419.736c0d6f426249a7.js → 2001.6c7e0fd02190886c.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6767.1fcfc9b8be83975f.js → 2213.2ccbada92c33ea0f.js} +16 -16
  24. package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/{4759.1f76713aefb87db5.js → 2871.0bca6137343b3f76.js} +1 -1
  28. package/apps/pwa/out/_next/static/chunks/{6776.06ff1e3b464cc607.js → 2898.fd781bc7cf01a7b7.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{1782-59db1b5aa06df38a.js → 2940-619bfd8ef337c611.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/{8471.8d2a8c74f09c36ff.js → 2985.39ccdecd36848b12.js} +4 -4
  31. package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +115 -0
  32. package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +64 -0
  33. package/apps/pwa/out/_next/static/chunks/{bc324b7c.02a09dd93f6a399b.js → 3267c0e6.d34854e7b3984a6e.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3278.2e5d15b53a4091c8.js +2 -0
  35. package/apps/pwa/out/_next/static/chunks/{7725-4f83d5541fbdb81b.js → 3541-ce3a5424ed5ad7f1.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +34 -0
  39. package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/{46bd8bea.2f4b4099172fcdb7.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
  41. package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/{1142.65d002789ab3af7d.js → 4174.92ed04922709ac9e.js} +2 -2
  43. package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +36 -0
  45. package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +286 -0
  49. package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +77 -0
  50. package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +226 -0
  51. package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +79 -0
  53. package/apps/pwa/out/_next/static/chunks/5173-233188df2f42c626.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +148 -0
  57. package/apps/pwa/out/_next/static/chunks/5307.60f2209e809bd627.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{3396-97b97928c49190c9.js → 5458-16cd7a2b51b74c8c.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/{3403.7199205e65124486.js → 5525.86debf231e181813.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{9143.ff14585db1d275ff.js → 5543.a438b8ab5a13ea47.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +74 -0
  65. package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +94 -0
  67. package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{8398.73a19b39715eda04.js → 6092.a7f99e68b188ca66.js} +1 -1
  70. package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/{5591.a35e7a217734a8b9.js → 6157.0c9af021de4fb31b.js} +2 -2
  72. package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{7375.050ea0d72968e49f.js → 6433.fc573af22bbc9ab7.js} +17 -17
  75. package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +90 -0
  77. package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +32 -0
  78. package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +104 -0
  80. package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +24 -0
  85. package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
  86. package/apps/pwa/out/_next/static/chunks/69-0a2c8209c6d4a158.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/{1852.7f7b53991fcb99ef.js → 7502.ccd5b8065545edd0.js} +2 -2
  94. package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
  95. package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{6534.1ab00f370db7b105.js → 7862.30a8d6482bb238eb.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{285adb1a.5654e605dddf86d2.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
  110. package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{1516.dfaceff3fd2d0e0d.js → 9138.b6e80031afb1d973.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{9907.49be0fcadaf214b5.js → 9221.7d22eaf353a2d4e7.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{8767-2f6a634f5abeaa01.js → 9279-d28c5b7754d010ae.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/{3160-95c96f4d2a21dd26.js → 9398-6aed28f0a96d0d6f.js} +1 -1
  118. package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{328bb3ab-6628a1114fe3fb3b.js → 997ce8a5-2ad501927003b41b.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{6853.cc5174a9dee59593.js → 9989.3694300e5f000b14.js} +1 -1
  123. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/control/page-a27b1e5a0d1b308f.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/morning/page-32866485913d6a04.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-8c66a3b24a745630.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/{page-29900ed0011b2c83.js → page-c219f2ed171131be.js} +1 -1
  163. package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/term/page-04d00ae9b0890349.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{425cfc4d.fb91158e3971c39f.js → b313b242.cb1265eea908db61.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +1 -0
  184. package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.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 +23 -23
  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 +22 -22
  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 +26 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  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/bin/elanous.mjs +7 -3
  279. package/graphs/context/nightly-condense.yaml +1 -0
  280. package/graphs/implement-loop.yaml +5 -0
  281. package/graphs/intake/intake-daily.yaml +8 -1
  282. package/graphs/intake/recipes.yaml +5 -0
  283. package/graphs/lecture/lecture-note.yaml +2 -2
  284. package/graphs/ops/harness-gc.yaml +1 -0
  285. package/graphs/release/recipes.yaml +3 -0
  286. package/graphs/release/release-loop.yaml +9 -5
  287. package/graphs/units/recipes.yaml +3 -0
  288. package/graphs/units/release-gate-recheck.yaml +15 -0
  289. package/package.json +2 -1
  290. package/scripts/check-native-tool-wiring.ts +3 -2
  291. package/scripts/ci-android-unit-tests.ts +16 -0
  292. package/scripts/ci-typecheck-changed.ts +63 -10
  293. package/scripts/coord-channel-watch.sh +22 -16
  294. package/scripts/coord-role-pack.ts +81 -2
  295. package/scripts/cron-run.ts +96 -3
  296. package/scripts/detect-test-interference.ts +38 -5
  297. package/scripts/gate-pr-cache.ts +65 -0
  298. package/scripts/gh-surface/capture.ts +126 -0
  299. package/scripts/gh-surface/gh +40 -0
  300. package/scripts/import-graph-scc.ts +38 -0
  301. package/scripts/install.ps1 +19 -0
  302. package/scripts/intake-social.ts +181 -0
  303. package/scripts/lecture-note/node.ts +71 -4
  304. package/scripts/lib/android-toolchain.ts +32 -0
  305. package/scripts/lib/deterministic-env.ts +62 -0
  306. package/scripts/lib/gate-test-env.ts +19 -0
  307. package/scripts/measure-goal-grounding-corpus.ts +2 -1
  308. package/scripts/measure-si-task-cpu.ts +143 -0
  309. package/scripts/ratchets/test-interference-patterns.allowlist.txt +255 -0
  310. package/scripts/ratchets/test-interference-patterns.ts +367 -0
  311. package/scripts/release-loop/cut-branch.ts +4 -3
  312. package/scripts/release-loop/export-check-node.ts +0 -1
  313. package/scripts/release-loop/fixtures/warm-failure-assertion/sample.junit.xml +8 -0
  314. package/scripts/release-loop/fixtures/warm-job-029/sample.json +1 -0
  315. package/scripts/release-loop/fixtures/warm-job-029/sample.junit.xml +10 -0
  316. package/scripts/release-loop/gate-closure.ts +12 -8
  317. package/scripts/release-loop/gate-diff.ts +1 -1
  318. package/scripts/release-loop/gate-host-mirror.ts +66 -0
  319. package/scripts/release-loop/gate-node.ts +523 -75
  320. package/scripts/release-loop/gate-partial.ts +106 -9
  321. package/scripts/release-loop/gate-pr-cache.ts +66 -0
  322. package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
  323. package/scripts/release-loop/gate-r2-verdict.ts +189 -0
  324. package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
  325. package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
  326. package/scripts/release-loop/import-graph-scc-run.ts +54 -0
  327. package/scripts/release-loop/import-graph-scc.ts +215 -0
  328. package/scripts/release-loop/node-verdict.ts +2 -0
  329. package/scripts/release-loop/prepare-node.ts +102 -4
  330. package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
  331. package/scripts/release-loop/resume-release.ts +33 -4
  332. package/scripts/release-loop/resume.ts +13 -5
  333. package/scripts/release-loop/spawn-lane.ts +2 -19
  334. package/scripts/release-loop/tui-sim-node.ts +3 -2
  335. package/scripts/release-loop/unattended-release.ts +16 -0
  336. package/scripts/test-deterministic.ts +5 -61
  337. package/scripts/train-reach-grouping.ts +48 -0
  338. package/scripts/tsc-incremental-cache.ts +86 -0
  339. package/scripts/tsc-incremental-diagnostics.ts +76 -0
  340. package/scripts/tsc-main-safety-net.ts +2 -2
  341. package/src/acp/client.ts +4 -1
  342. package/src/acp/core-turn-bridge.ts +65 -8
  343. package/src/acp/elanous-extensions.ts +3 -0
  344. package/src/acp/server.ts +3 -0
  345. package/src/acp/tool-trace.ts +186 -11
  346. package/src/ad-pipeline/run.ts +4 -2
  347. package/src/agent/runner.ts +169 -3
  348. package/src/agent/self-ambient-cache.ts +156 -0
  349. package/src/agent/self-ambient.ts +8 -1
  350. package/src/agent/subagent-callable.ts +3 -2
  351. package/src/agent/task-notification.ts +5 -0
  352. package/src/agent-mission/review-loop.ts +6 -3
  353. package/src/agent-substrate/acp-implementer.ts +14 -2
  354. package/src/agent-substrate/pr-reviewer.ts +14 -0
  355. package/src/agent-substrate/self-review-cli.ts +30 -4
  356. package/src/ask-user-question/tool.ts +22 -0
  357. package/src/autopilot/build/llm-conflict-merge.ts +56 -10
  358. package/src/autopilot/pr-manager.ts +80 -7
  359. package/src/briefing/brief-items.ts +24 -22
  360. package/src/capture/frame-state-detect.ts +39 -0
  361. package/src/capture/tui-self-report.ts +149 -6
  362. package/src/chat/chat-cli.ts +10 -2
  363. package/src/chat/index.ts +138 -26
  364. package/src/chat/input-control-key.ts +5 -3
  365. package/src/chat/pickers/modal-runtime.ts +6 -0
  366. package/src/chat/pickers/modals.ts +8 -2
  367. package/src/chat/tool-interrupt-behavior.ts +38 -0
  368. package/src/chat/tool-render/dispatch.ts +5 -1
  369. package/src/chat/turn-typeahead.ts +75 -20
  370. package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
  371. package/src/cli/agent-cli.ts +41 -13
  372. package/src/cli/ask-bare.ts +1 -0
  373. package/src/cli/config-audit.ts +123 -0
  374. package/src/cli/decisions-cli.ts +80 -6
  375. package/src/cli/import-cli.ts +12 -0
  376. package/src/cli/log-event-names.ts +17 -0
  377. package/src/cli/mcp-login.ts +21 -5
  378. package/src/cli/msg-cli.ts +89 -0
  379. package/src/cli/pod-cli.ts +14 -3
  380. package/src/cli/pr-cli.ts +273 -81
  381. package/src/cli/pr-land-base-read.ts +34 -0
  382. package/src/cli/pr-land-heavy-remote.ts +82 -26
  383. package/src/cli/pr-land-overlap-evidence.ts +109 -11
  384. package/src/cli/pr-land-pod-shadow-job.ts +106 -0
  385. package/src/cli/pr-land-pod-shadow.ts +16 -3
  386. package/src/cli/pr-land-refusal.ts +20 -5
  387. package/src/cli/pr-land-virtual-rebase.ts +108 -0
  388. package/src/cli/pty-takeover-cli.ts +88 -14
  389. package/src/cli/release-cli.ts +80 -14
  390. package/src/cli/seat-cli.ts +138 -3
  391. package/src/cli/self-update.ts +5 -2
  392. package/src/cli/sim-cli.ts +18 -0
  393. package/src/cli/tasks-cli.ts +97 -19
  394. package/src/context-bus/context-first.ts +13 -0
  395. package/src/context-bus/context-now.ts +13 -2
  396. package/src/context-bus/ops-events.ts +79 -0
  397. package/src/control-plane/lease-holder.ts +12 -8
  398. package/src/control-plane/ledger.ts +163 -4
  399. package/src/control-plane/server.ts +91 -11
  400. package/src/core-turn/run-core-turn.ts +2 -0
  401. package/src/core-turn/run-goal-loop.ts +243 -3
  402. package/src/core-turn/seat-turn-cap.ts +79 -0
  403. package/src/core-turn/short-question.ts +38 -6
  404. package/src/core-turn/types.ts +6 -0
  405. package/src/dashboard/acp-active-model.ts +42 -1
  406. package/src/dashboard/acp-boot.ts +3 -0
  407. package/src/dashboard/background-jobs-status.ts +66 -0
  408. package/src/dashboard/index.ts +339 -657
  409. package/src/dashboard/input/agent-wake.ts +242 -0
  410. package/src/dashboard/input/chat-main-entry-runtime.ts +6 -1
  411. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +4 -1
  412. package/src/dashboard/input/chat-main-session.ts +8 -1
  413. package/src/dashboard/input/chat-main-turn.ts +12 -3
  414. package/src/dashboard/input/compact-prepass-recovery.ts +33 -0
  415. package/src/dashboard/input/external-input-host.ts +49 -9
  416. package/src/dashboard/input/internal-turn.ts +261 -0
  417. package/src/dashboard/input/mouse-wiring.ts +108 -11
  418. package/src/dashboard/input/seat-autowake.ts +318 -0
  419. package/src/dashboard/input/turn-steer-bridge.ts +70 -0
  420. package/src/dashboard/log-click-runtime.ts +118 -2
  421. package/src/dashboard/loop-scheduler.ts +72 -0
  422. package/src/dashboard/seat-boot-preamble.ts +18 -0
  423. package/src/dashboard/skill-runtime.ts +2 -0
  424. package/src/dashboard/slash-runtime/dashboard-handlers.ts +126 -1181
  425. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
  426. package/src/dashboard/slash-runtime/index.ts +13 -0
  427. package/src/dashboard/turn-busy-teardown.ts +50 -0
  428. package/src/dashboard/turn-preamble.ts +116 -40
  429. package/src/dashboard/turn-session-layers.ts +4 -2
  430. package/src/dashboard/turn-start-segments.ts +222 -0
  431. package/src/decisions/decision-ledger.ts +45 -4
  432. package/src/discord-self-message.ts +4 -4
  433. package/src/display/prompt-row-owner.ts +146 -0
  434. package/src/display/resize-listener.ts +33 -2
  435. package/src/domains/release-tool.ts +18 -1
  436. package/src/field-note/transcribe.ts +17 -0
  437. package/src/fold-stack.ts +4 -2
  438. package/src/git-fs/index.ts +263 -36
  439. package/src/github/remote-call.ts +81 -0
  440. package/src/goals/registry.ts +46 -6
  441. package/src/goals/types.ts +7 -1
  442. package/src/graph-runner/runner.ts +1 -0
  443. package/src/grok/credential.ts +26 -0
  444. package/src/harness/gate-reserve.ts +87 -0
  445. package/src/harness/harness-clean.ts +2 -1
  446. package/src/harness/harness-cli-command.ts +52 -5
  447. package/src/harness/harness-gc.ts +2 -1
  448. package/src/harness/harness-incidents.ts +70 -20
  449. package/src/harness/harness-pod-dispatch.ts +87 -10
  450. package/src/harness/harness-queue.ts +68 -4
  451. package/src/harness/harness-stop.ts +4 -3
  452. package/src/harness/harness-substrate-default.ts +78 -7
  453. package/src/harness/harness-worktree-auto.ts +2 -1
  454. package/src/harness/harness-worktrees.ts +3 -2
  455. package/src/hooks/dispatch.ts +2 -1
  456. package/src/index.ts +156 -27
  457. package/src/input/external-input-queue.ts +64 -7
  458. package/src/intake-plane/slash.ts +14 -3
  459. package/src/keybindings.ts +4 -1
  460. package/src/llm/route-decision.ts +36 -0
  461. package/src/llm/tool-loop-steered-rejection.ts +41 -0
  462. package/src/llm-request-shape.ts +209 -0
  463. package/src/llm.ts +301 -283
  464. package/src/loops/consensus.ts +348 -0
  465. package/src/loops/msg-wake.ts +206 -4
  466. package/src/loops/observe.ts +19 -3
  467. package/src/loops/orchestrator/tick.ts +88 -12
  468. package/src/loops/orchestrator/traffic.ts +64 -1
  469. package/src/loops/registry.ts +30 -0
  470. package/src/market/signed-index.ts +14 -0
  471. package/src/maturity/feature-maturity.ts +1 -1
  472. package/src/mcp/mcp-oauth.ts +54 -5
  473. package/src/models/prompts.ts +28 -0
  474. package/src/msg/msg-sse-client.ts +223 -0
  475. package/src/msg/msg-store.ts +86 -2
  476. package/src/mss/logging/log-store.ts +225 -1
  477. package/src/mss/logging/render-categories.ts +5 -0
  478. package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
  479. package/src/nexus/api/http-server.ts +54 -15
  480. package/src/nexus/api/loop-resources.ts +19 -3
  481. package/src/nexus/api/ops-api.ts +11 -0
  482. package/src/nexus/daemon-thin-inventory.md +37 -0
  483. package/src/nexus/index.ts +70 -0
  484. package/src/nexus/state/state.ts +1 -0
  485. package/src/oauth/store.ts +32 -7
  486. package/src/onboarding/first-run.ts +28 -3
  487. package/src/ops/overview-cache.ts +16 -4
  488. package/src/ops/overview.ts +59 -2
  489. package/src/ops/resources.ts +82 -0
  490. package/src/plugins/maker/connector-maker.ts +41 -0
  491. package/src/plugins/maker/skill-maker.ts +42 -0
  492. package/src/pr-tool/census.ts +303 -0
  493. package/src/pr-tool/inflight-registry.ts +143 -0
  494. package/src/prompt-library/chat-conciseness.ts +13 -0
  495. package/src/prompt-library/universal-preamble.ts +10 -5
  496. package/src/pty-shell/pty-manifest.ts +12 -3
  497. package/src/pty-shell/tui-run-state.ts +34 -3
  498. package/src/release-loop/gate-host-reservation.ts +97 -0
  499. package/src/release-loop/landing-freeze.ts +5 -0
  500. package/src/release-loop/light-rc.ts +5 -2
  501. package/src/release-loop/placement.ts +92 -1
  502. package/src/release-loop/rehearsal-shard-plan.ts +149 -0
  503. package/src/release-loop/rehearsal.ts +73 -17
  504. package/src/repl/index.ts +20 -2
  505. package/src/seat-loop/seat-knowhow.ts +282 -0
  506. package/src/seat-loop/seat-loop.ts +41 -2
  507. package/src/seat-loop/traffic-signal.ts +5 -1
  508. package/src/self-dev/ask-launch-flow.ts +37 -3
  509. package/src/self-dev/decompose-compose-graph.ts +28 -27
  510. package/src/self-dev/decompose-proposal.ts +53 -38
  511. package/src/self-dev/decompose.ts +17 -0
  512. package/src/self-dev/dev-pipeline.ts +31 -2
  513. package/src/self-dev/draft-residue.ts +267 -33
  514. package/src/self-dev/draft-sweep.ts +59 -4
  515. package/src/self-dev/external-call-zero.ts +77 -0
  516. package/src/self-dev/launch-preflight-text.ts +6 -0
  517. package/src/self-dev/launch-preflight.ts +25 -3
  518. package/src/self-dev/local-supervisor-judge.ts +185 -0
  519. package/src/self-dev/run-supervisor.ts +229 -19
  520. package/src/self-dev/run-types.ts +20 -0
  521. package/src/self-dev/shard-aggregate.ts +13 -2
  522. package/src/self-dev/shard-plan.ts +56 -1
  523. package/src/self-dev/shard-run.ts +207 -12
  524. package/src/self-dev/spawn-lane-files.ts +19 -0
  525. package/src/self-implement/app-api-budget.ts +51 -11
  526. package/src/self-implement/config-gate.ts +2 -1
  527. package/src/self-implement/elanous-tui-spawn.ts +14 -0
  528. package/src/self-implement/expose-gate.ts +2 -1
  529. package/src/self-implement/follow-up-placement.ts +79 -0
  530. package/src/self-implement/gate-artifacts.ts +416 -0
  531. package/src/self-implement/gate-baseline.ts +96 -5
  532. package/src/self-implement/gate-cli.ts +207 -17
  533. package/src/self-implement/gate-remote.ts +136 -26
  534. package/src/self-implement/gate-scenario.ts +85 -0
  535. package/src/self-implement/goal-author.ts +160 -8
  536. package/src/self-implement/graph-authority.ts +38 -6
  537. package/src/self-implement/graph-overlay-condition.ts +92 -1
  538. package/src/self-implement/heal-triage.ts +79 -0
  539. package/src/self-implement/host-regate.ts +97 -7
  540. package/src/self-implement/orchestrator.ts +115 -134
  541. package/src/self-implement/pr-title.ts +123 -0
  542. package/src/self-implement/run-checkpoint.ts +235 -0
  543. package/src/self-implement/run-ledger.ts +162 -15
  544. package/src/self-implement/run-stop.ts +4 -3
  545. package/src/self-implement/run-ttl.ts +28 -4
  546. package/src/self-implement/seams.ts +2 -0
  547. package/src/self-implement/shadow-stage.ts +7 -6
  548. package/src/self-implement/stop-autoheal.ts +2 -1
  549. package/src/self-implement/train-gate-remote.ts +37 -8
  550. package/src/self-implement/train-reach-grouping.ts +157 -0
  551. package/src/self-implement/train-scenario-layers.ts +133 -0
  552. package/src/self-implement/uncommitted-work.ts +2 -0
  553. package/src/session/pending-input.ts +19 -0
  554. package/src/session/session-start.ts +224 -0
  555. package/src/session-runtime/index.ts +22 -267
  556. package/src/session-runtime/parallel-dispatch.ts +22 -5
  557. package/src/shell-runner/background-surface.ts +15 -5
  558. package/src/skills/tools/agent.ts +39 -6
  559. package/src/skills/tools/dev-harness.ts +6 -4
  560. package/src/skills/tools/list-dir.ts +11 -0
  561. package/src/skills/tools/schedule-wakeup.ts +408 -0
  562. package/src/skills/tools/shell.ts +246 -4
  563. package/src/status/bar.ts +26 -0
  564. package/src/steward/digest-delivery.ts +118 -0
  565. package/src/steward/hold-hygiene.ts +120 -0
  566. package/src/steward/resync-tick.ts +114 -23
  567. package/src/steward/ta-repair-event-collect.ts +158 -0
  568. package/src/steward/triage.ts +10 -0
  569. package/src/surface/shell-runner-boot.ts +5 -2
  570. package/src/task-agent/card-evidence.ts +25 -1
  571. package/src/task-agent/green-sweep.ts +8 -3
  572. package/src/task-agent/judge.ts +76 -0
  573. package/src/task-agent/land-queue.ts +79 -0
  574. package/src/task-agent/live-moves.ts +30 -9
  575. package/src/task-agent/postland-card.ts +5 -0
  576. package/src/task-agent/prelaunch-already-done.ts +98 -0
  577. package/src/task-agent/real-launch-guard.ts +37 -0
  578. package/src/task-agent/rejudge-on-head.ts +89 -12
  579. package/src/task-agent/remote-rejudge-bind.ts +28 -8
  580. package/src/task-agent/repair-cycle.ts +45 -7
  581. package/src/task-agent/repair-worker.ts +7 -0
  582. package/src/task-agent/run-identity.ts +200 -0
  583. package/src/task-agent/shadow.ts +50 -3
  584. package/src/task-agent/task-hand.ts +182 -5
  585. package/src/task-agent/train-landing.ts +77 -0
  586. package/src/task-agent/work-order.ts +104 -0
  587. package/src/task-orchestrator/surfaces/pod-command-job.ts +151 -37
  588. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
  589. package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
  590. package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
  591. package/src/task-orchestrator/surfaces/pod-install-slots.ts +121 -9
  592. package/src/task-orchestrator/surfaces/pod-lease.ts +118 -6
  593. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
  594. package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
  595. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +27 -0
  596. package/src/task-orchestrator/surfaces/pod-pool.ts +3 -1
  597. package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
  598. package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +67 -0
  599. package/src/task-orchestrator/surfaces/pod-source-receive.ts +19 -3
  600. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +141 -0
  601. package/src/task-orchestrator/surfaces/pod-warm-ta-shadow.ts +85 -0
  602. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +525 -0
  603. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
  604. package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
  605. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +362 -0
  606. package/src/task-orchestrator/surfaces/self-implement-pod.ts +138 -19
  607. package/src/telegram.ts +2 -4
  608. package/src/tui/chat/execution-badge.ts +5 -1
  609. package/src/tui/input/pickers.ts +732 -0
  610. package/src/tui/input-lag-probe.ts +230 -0
  611. package/src/tui/slash/mission.ts +492 -0
  612. package/src/tui/slash/term.ts +877 -0
  613. package/src/tui-client/dashboard-session.ts +9 -0
  614. package/src/tui.ts +52 -0
  615. package/src/user-config/gemini-server-tools.ts +9 -0
  616. package/src/user-config.ts +53 -16
  617. package/src/util/spawn-sync-output.ts +7 -0
  618. package/src/ux-sim/fake-bin.ts +154 -0
  619. package/src/ux-sim/fake-clock.ts +36 -0
  620. package/src/ux-sim/headless-tui.ts +72 -0
  621. package/src/ux-sim/in-process-cli.ts +2 -1
  622. package/src/ux-sim/scenario.ts +255 -0
  623. package/src/ux-sim/temp-git-remote.ts +82 -0
  624. package/src/version/packed-revision.json +1 -1
  625. package/src/video-pipeline/recipes/vlog.ts +25 -7
  626. package/apps/pwa/out/_next/static/chunks/1015-9cba22a5a4554797.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +0 -8
  630. package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +0 -34
  632. package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +0 -286
  635. package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +0 -24
  636. package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +0 -36
  639. package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +0 -64
  641. package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +0 -115
  647. package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +0 -90
  651. package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +0 -94
  662. package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +0 -62
  668. package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +0 -27
  671. package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +0 -104
  672. package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +0 -93
  673. package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +0 -24
  676. package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +0 -2
  678. package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +0 -148
  679. package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +0 -149
  680. package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +0 -79
  682. package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +0 -287
  688. package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +0 -77
  695. package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +0 -74
  698. package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +0 -226
  703. package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +0 -32
  705. package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/a435ad95.577add051b4facb2.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/botlab/page-a5635eba0d73b84e.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/app/loops/page-8aaa6dedc4c10dfb.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/morning/page-33bf667a5fb297bf.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +0 -122
  768. package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +0 -1
  774. package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +0 -1
  775. /package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → IVKr3AlRUVLKsw2fh7eXF}/_ssgManifest.js +0 -0
@@ -1,6 +1,7 @@
1
1
  import { execFile } from 'node:child_process';
2
2
  import { createHash, randomUUID } from 'node:crypto';
3
3
  import { appendFileSync, chmodSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync } from 'node:fs';
4
+ import { loadSeatPack } from './seat-knowhow.js';
4
5
  import { Database } from 'bun:sqlite';
5
6
  import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
6
7
  import { promisify } from 'node:util';
@@ -28,6 +29,7 @@ import { recordSeatAskShadow } from '../seat-dispatch/seat-ask.js';
28
29
  import { appendSeatRequestRows, listSeatRequests, withSeatRequestLedgerLock } from '../seat-dispatch/seat-request-ledger.js';
29
30
  import { answerCrossCheck, answerSeat, askCrossCheck, askSeat, crossCheckAnswer, deliveredSeatQuestion, hasSeatAnswer, isSeatId, seatCrossChecks, seatQuestions, type CrossCheckJudgment, type SeatId } from '../seat-dispatch/seat-questions.js';
30
31
  import { queryRunningRuns } from '../self-implement/running-runs.js';
32
+ import { collectDraftMetrics, DRAFT_NEEDS_OWNER_SEAT_CAP, shouldHoldSeatNewLaunch, type DraftMetrics } from '../self-dev/draft-sweep.js';
31
33
  import { checklistHistory, listChecklist, type Checklist } from '../release-loop/checklist.js';
32
34
  import { readSchedules, releasedVersion } from '../release-loop/feature-store.js';
33
35
  import { runOpDecide, type OpDecideCandidate } from './op-decide.js';
@@ -74,6 +76,12 @@ export type SeatDeps = {
74
76
  now?: () => Date;
75
77
  read?: (path: string) => string;
76
78
  run?: (args: string[]) => Promise<string>;
79
+ /** Current open draft inventory for the launch seat; injected tests avoid live GitHub. */
80
+ draftMetrics?: (now: Date) => Promise<DraftMetrics>;
81
+ /** Explicit needs-owner hold gate — the hold is an autonomous-launch guard. The orchestrator launch
82
+ * (loops/orchestrator/tick.ts) and the hook wake (hooks/dispatch.ts) pass true; tests assert this
83
+ * option instead of inferring the boundary from which seams are injected. */
84
+ needsOwnerGate?: boolean;
77
85
  /** Seat-folder resolver for every process this loop starts; production reads the registry-validated `seats/<role>` view, tests inject an isolated folder. */
78
86
  launchSeat?: (seat: string) => string;
79
87
  enqueue?: (seat: string, text: string, root: string, idempotencyKey: string, item: SeatItem) => Promise<{ id: string }>;
@@ -614,7 +622,10 @@ export async function gatherSeatInputs(seat: string, deps: SeatDeps = {}, ledger
614
622
  for (const request of pending) {
615
623
  if (request.source === 'seat-question' && ownedEvidence) request.evidence = ownedEvidence;
616
624
  }
617
- return { requests: pending, checklist, role: read(join(deps.repo ?? repoRoot, 'docs', 'roles', `${seat}.md`)).slice(0, 4_000) };
625
+ // SEAT-PACK-LOADER (RFC seat-knowhow §A3): full charter (4,000-char cut abolished) ⊕ knowhow 사실/참고 blocks, top-k on this turn's judgment items.
626
+ const pack = loadSeatPack(seat, [...pending, ...checklist].map((item) => `${item.title}\n${item.text ?? ''}`).join('\n'),
627
+ { repo: deps.repo ?? repoRoot, read, now: deps.now ?? (() => new Date()) });
628
+ return { requests: pending, checklist, role: pack.text };
618
629
  }
619
630
 
620
631
  /** OP-LOOP-DECIDE: filter open decision cards each OP turn. Shadow records; live decides/routes. A failure never blocks the turn. */
@@ -1500,7 +1511,7 @@ export async function runSeatLoopOnce(seat: string, deps: SeatDeps = {}): Promis
1500
1511
  ? ledger.find((row) => row.status === 'awaiting-resolution' && row.item && itemKey(row.item) === itemKey(item))?.inquiry ?? null
1501
1512
  : unfinished?.inquiry ?? await (deps.inquire ?? (async (asking: SeatId, work: SeatItem) => { try {
1502
1513
  const output = JSON.parse((await run(['agent', '--json', '--no-tools',
1503
- `[${asking} 자리 · 역할 docs/roles/${asking}.md] 이 항목을 판단할 근거가 부족한 경우에만 다른 자리 또는 사람에게 질문한다. 근거가 충분하면 null. JSON 객체 하나만 반환: null 또는 {"to":"OP|TC|MK|UX|CEO","question":"필요한 근거를 묻는 질문"}. 항목: ${work.id} ${work.title}\n내용: ${work.text}\n역할: ${(deps.read ?? defaultRead)(join(deps.repo ?? repoRoot, 'docs', 'roles', `${asking}.md`)).slice(0, 4_000)}`])).trim()) as { reply?: unknown };
1514
+ `[${asking} 자리 · 역할 docs/roles/${asking}.md] 이 항목을 판단할 근거가 부족한 경우에만 다른 자리 또는 사람에게 질문한다. 근거가 충분하면 null. JSON 객체 하나만 반환: null 또는 {"to":"OP|TC|MK|UX|CEO","question":"필요한 근거를 묻는 질문"}. 항목: ${work.id} ${work.title}\n내용: ${work.text}\n역할: ${loadSeatPack(asking, `${work.title}\n${work.text}`, { repo: deps.repo ?? repoRoot, read: deps.read ?? defaultRead, now: () => now }).text}`])).trim()) as { reply?: unknown };
1504
1515
  const value: unknown = typeof output?.reply === 'string' ? JSON.parse(output.reply) : output;
1505
1516
  if (value === null) return null;
1506
1517
  if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('invalid seat inquiry');
@@ -1696,6 +1707,34 @@ export async function runSeatLoopOnce(seat: string, deps: SeatDeps = {}): Promis
1696
1707
  }
1697
1708
  const action = planned!;
1698
1709
  if (action.kind === 'harness') {
1710
+ // A count is observation until the dispatch boundary uses it. Do not enqueue or call harness say for an over-cap seat.
1711
+ // NEEDS-OWNER-BOUNDARY: the hold is an autonomous-launch guard — the orchestrator launch
1712
+ // (loops/orchestrator/tick.ts) and the hook wake (hooks/dispatch.ts) opt in via deps.needsOwnerGate;
1713
+ // tests assert the option instead of inferring the boundary from which seams are injected.
1714
+ if (deps.needsOwnerGate ?? false) {
1715
+ let metrics: DraftMetrics | undefined;
1716
+ try {
1717
+ metrics = await (deps.draftMetrics ?? (async (clock: Date) => {
1718
+ const [{ resolveRepositoryName }, { githubDraftSweepAdapters }] = await Promise.all([
1719
+ import('../harness/repository-name.js'), import('../harness/harness-cli-command.js'),
1720
+ ]);
1721
+ return collectDraftMetrics(resolveRepositoryName({}), githubDraftSweepAdapters(), clock);
1722
+ }))(now);
1723
+ if (!metrics.needsOwnerBySeat) throw new Error('per-seat draft inventory missing');
1724
+ } catch (error) {
1725
+ // NEEDS-OWNER-POLICY: an unreadable census — gh unavailable, rate-limited, or one unreadable
1726
+ // claim comment — is unobserved, not failed-closed. Unobserved input never holds the seat's
1727
+ // dispatch; only an observed count over the cap does. The next loop pass re-collects.
1728
+ observe('launch-needs-owner-unobserved', { seat, item: item.id, reason: String(error).slice(0, 140) });
1729
+ }
1730
+ if (metrics && shouldHoldSeatNewLaunch(seat, metrics.needsOwnerBySeat ?? {})) {
1731
+ entry.status = 'wait';
1732
+ entry.reason = `needs-owner ${seat}: ${metrics.needsOwnerBySeat?.[seat]} > ${DRAFT_NEEDS_OWNER_SEAT_CAP}`;
1733
+ append(path, entry);
1734
+ observe('launch-held-needs-owner', { seat, item: item.id, count: metrics.needsOwnerBySeat?.[seat] });
1735
+ return entry;
1736
+ }
1737
+ }
1699
1738
  const launchedRunIds = new Set(ledger.flatMap((row) => row.seat === seat && row.status === 'launched' && row.runId ? [row.runId] : []));
1700
1739
  let running: readonly RunningSeatPod[] = [];
1701
1740
  let observationUnavailable = false;
@@ -6,6 +6,7 @@ export type TrafficSignal = {
6
6
  global: string;
7
7
  versions?: string[];
8
8
  hold?: string[];
9
+ order?: string[];
9
10
  paused?: Record<string, boolean>;
10
11
  };
11
12
  export type TrafficSignalRead = TrafficSignal | { unreadable: true } | null;
@@ -17,7 +18,8 @@ export function classifySeatTrafficProposal(message: string): 'hold' | 'UNHOLD'
17
18
  return null;
18
19
  }
19
20
 
20
- const defaultPath = (name: string): string => join(homedir(), 'elanous-hq', 'seat-state', 'OP', name);
21
+ export const opSeatStatePath = (name: string): string => join(homedir(), 'elanous-hq', 'seat-state', 'OP', name);
22
+ const defaultPath = opSeatStatePath;
21
23
  const missing = (error: unknown): boolean => (error as NodeJS.ErrnoException).code === 'ENOENT';
22
24
 
23
25
  /** A missing installation has no signal; an invalid or unreadable one cannot authorize a checklist launch. */
@@ -29,10 +31,12 @@ export function readTrafficSignal(path?: string): TrafficSignalRead {
29
31
  if (typeof row.global !== 'string'
30
32
  || (row.versions !== undefined && (!Array.isArray(row.versions) || !row.versions.every((version) => typeof version === 'string')))
31
33
  || (row.hold !== undefined && (!Array.isArray(row.hold) || !row.hold.every((id) => typeof id === 'string')))
34
+ || (row.order !== undefined && (!Array.isArray(row.order) || !row.order.every((id) => typeof id === 'string')))
32
35
  || (row.paused !== undefined && (!row.paused || typeof row.paused !== 'object' || Array.isArray(row.paused)
33
36
  || !Object.values(row.paused).every((paused) => typeof paused === 'boolean')))) return { unreadable: true };
34
37
  return { global: row.global, ...(row.versions !== undefined ? { versions: row.versions as string[] } : {}),
35
38
  ...(row.hold !== undefined ? { hold: row.hold as string[] } : {}),
39
+ ...(row.order !== undefined ? { order: row.order as string[] } : {}),
36
40
  ...(row.paused !== undefined ? { paused: row.paused as Record<string, boolean> } : {}) };
37
41
  } catch (error) {
38
42
  return missing(error) ? null : { unreadable: true };
@@ -13,6 +13,7 @@
13
13
  import { linesOutsideFencedCode } from '../self-implement/goal-author.js';
14
14
  import { existsSync } from 'node:fs';
15
15
  import { debug } from '../debug/log.js';
16
+ import { appendRunLedgerEntry, runLedgerDir } from '../self-implement/run-ledger.js';
16
17
  import { recordAuthoredGoal } from './authored-goal-trace.js';
17
18
  import { findAskPathCandidates, type AskPathCandidateOptions } from './ask-path-candidates.js';
18
19
  import { retiredEntranceNotice, type EntranceDeclaration } from './entrance-registry.js';
@@ -81,14 +82,35 @@ export type InvokerBehindDefaultBranch =
81
82
  | { readonly state: 'measured'; readonly commits: number; readonly baseRef: string }
82
83
  | { readonly state: 'unmeasurable'; readonly reason: string };
83
84
 
85
+ /** Ambient git location vars override `git -C <cwd>`; the invoker tree is the given cwd only. */
86
+ const GIT_LOCATION_ENV_KEYS = [
87
+ 'GIT_DIR', 'GIT_WORK_TREE', 'GIT_COMMON_DIR', 'GIT_INDEX_FILE',
88
+ 'GIT_OBJECT_DIRECTORY', 'GIT_ALTERNATE_OBJECT_DIRECTORIES',
89
+ ] as const;
90
+
91
+ function gitReadEnv(): NodeJS.ProcessEnv {
92
+ const env = { ...process.env };
93
+ for (const key of GIT_LOCATION_ENV_KEYS) delete env[key];
94
+ return env;
95
+ }
96
+
97
+ function gitRead(cwd: string, args: readonly string[]): string {
98
+ // git-spawn-allow: Reads only the given cwd after dropping ambient GIT_DIR/GIT_WORK_TREE so the invoker tree is that cwd, not the parent harness checkout.
99
+ return execFileSync('git', ['-C', cwd, ...args], {
100
+ encoding: 'utf8',
101
+ stdio: ['ignore', 'pipe', 'pipe'],
102
+ env: gitReadEnv(),
103
+ }).trim();
104
+ }
105
+
84
106
  /** 현재 인보커 작업 트리의 HEAD를 이미 알려진 원격 기본 브랜치 ref와만 비교한다. */
85
107
  export function measureInvokerBehindDefaultBranch(cwd: string): InvokerBehindDefaultBranch {
86
108
  try {
87
109
  // git-spawn-allow: Reads the known origin/HEAD remote-tracking ref without fetching or changing repository state.
88
- const baseRef = execFileSync('git', ['-C', cwd, 'rev-parse', '--abbrev-ref', 'origin/HEAD'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
110
+ const baseRef = gitRead(cwd, ['rev-parse', '--abbrev-ref', 'origin/HEAD']);
89
111
  if (!baseRef || baseRef === 'origin/HEAD') throw new Error('원격 기본 브랜치 ref를 해석하지 못했다');
90
112
  // git-spawn-allow: Counts commits reachable from the known remote default branch but not local HEAD without changing repository state.
91
- const raw = execFileSync('git', ['-C', cwd, 'rev-list', '--count', `HEAD..${baseRef}`], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
113
+ const raw = gitRead(cwd, ['rev-list', '--count', `HEAD..${baseRef}`]);
92
114
  const commits = Number(raw);
93
115
  if (!Number.isSafeInteger(commits) || commits < 0) throw new Error(`뒤처진 커밋 수가 유효하지 않다: ${raw || '(빈 값)'}`);
94
116
  return { state: 'measured', commits, baseRef };
@@ -102,7 +124,7 @@ export function measureInvokerBehindDefaultBranch(cwd: string): InvokerBehindDef
102
124
  function gitTopLevel(dir: string): string | null {
103
125
  try {
104
126
  // git-spawn-allow: Reads the repository top-level path without changing repository state.
105
- return execFileSync('git', ['-C', dir, 'rev-parse', '--show-toplevel'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim() || null;
127
+ return gitRead(dir, ['rev-parse', '--show-toplevel']) || null;
106
128
  } catch { return null; }
107
129
  }
108
130
 
@@ -828,6 +850,15 @@ export async function runAskLaunchFlow(
828
850
  const entrance = input.entrance;
829
851
  const askStartedAt = deps.now();
830
852
  const selfResolveClarifications = resolveSelfResolveClarifications(input.selfResolveClarifications);
853
+ // The Pod's logs.db disappears with the Job. Journal the two auto-authoring boundaries in its
854
+ // existing run ledger so the host's terminal collection can reemit them even on a failed Job.
855
+ const recordPodAuthoring = (event: 'ask-auto-target-candidates' | 'ask-auto-reauthor', data: Record<string, unknown>): void => {
856
+ if (process.env.ELANOUS_SUBSTRATE !== 'pod') return;
857
+ const runId = process.env.ELANOUS_RUN_ID ?? input.runId;
858
+ if (!runId) return;
859
+ try { appendRunLedgerEntry({ runId, event, data }, runLedgerDir()); }
860
+ catch (error) { deps.log('ask-auto-author-ledger-unavailable', { event, reason: error instanceof Error ? error.message : String(error) }, 'warn'); }
861
+ };
831
862
  deps.log('harness.entrance', {
832
863
  entrance: entrance.id,
833
864
  entranceStatus: entrance.status,
@@ -1061,6 +1092,7 @@ export async function runAskLaunchFlow(
1061
1092
  selection: { path: selectedPath ?? null, reason: selectionReason },
1062
1093
  ...(candidates.error === undefined ? {} : { error: candidates.error }),
1063
1094
  }, candidates.error === undefined && selectedPath ? 'info' : 'warn');
1095
+ recordPodAuthoring('ask-auto-target-candidates', { candidatePathCount: candidates.paths.length, selected: Boolean(selectedPath), outcome: selectionReason });
1064
1096
  }
1065
1097
  const selectedPaths = candidates.selection?.path
1066
1098
  ? [candidates.selection.path]
@@ -1072,6 +1104,7 @@ export async function runAskLaunchFlow(
1072
1104
  } else {
1073
1105
  deps.print('[ask] ⑴ ⚠️ 자동 재저작에 넣을 대상 경로 후보가 없다. 대상 경로를 확인해야 한다');
1074
1106
  }
1107
+ recordPodAuthoring('ask-auto-reauthor', { candidatePathCount: candidates.paths.length, firstPathCount: first.decision.result.paths.length, outcome: 'started' });
1075
1108
  authored = await authorAndPreflight(selectedPaths.length > 0
1076
1109
  ? `대상 경로: ${selectedPaths.join(' · ')}\n${input.askText}`
1077
1110
  : input.askText, selectedPaths);
@@ -1083,6 +1116,7 @@ export async function runAskLaunchFlow(
1083
1116
  secondPathCount: authored.decision.result.paths.length,
1084
1117
  helped: authored.decision.shouldLaunch,
1085
1118
  }, authored.decision.shouldLaunch ? 'info' : 'warn');
1119
+ recordPodAuthoring('ask-auto-reauthor', { candidatePathCount: candidates.paths.length, firstPathCount: first.decision.result.paths.length, secondPathCount: authored.decision.result.paths.length, helped: authored.decision.shouldLaunch });
1086
1120
  }
1087
1121
 
1088
1122
  const { goalFile: effectiveGoalFile, decision } = authored;
@@ -5,7 +5,8 @@ import { orderPiecesTopologically, type DecomposePiece } from './decompose-propo
5
5
  /** ⭐ RFC §5 «5단계» — `compose` 부모 그래프.
6
6
  *
7
7
  * RFC §4.4 는 ***"compose 그래프가 «부모»가 되고, 조각마다 자식 그래프 인스턴스를 연다"*** 라고 적었다.
8
- * 겹침→간선 파생은 `orderPiecesTopologically` 가 «이미» 한다(`#15782`). 여기서 더하는 것은 둘이다:
8
+ * ⛔ 겹침→간선 파생은 «없다»(2026-10-16 제거 · 대표 10-11 «겹침이라 미루는 현상 제거») — 순서 간선은 dependsOn 만 만든다.
9
+ * 여기서 더하는 것은 둘이다:
9
10
  *
10
11
  * ⓐ 그 순서를 ***`GraphTemplate` 로 세워*** 2단계 위상 검사를 «그대로» 걸 수 있게 한다.
11
12
  * ⓑ RFC 가 요구한 두 분모를 ***정적으로*** 잰다(원장 타임스탬프 대신 그래프 «경로»로).
@@ -42,22 +43,8 @@ export function composeGraphFromPieces(pieces: readonly DecomposePiece[], graphI
42
43
  if (!edges[dep]!.includes(piece.id)) { edges[dep]!.push(piece.id); hasIncoming.add(piece.id); }
43
44
  }
44
45
  }
45
- // hotPaths 겹침 — 파생기와 «같은 규칙»(배열 앞선 것 먼저 · 이미 길이 있으면 건너뛴다)을 쓴다.
46
- const reaches = (from: string, to: string): boolean => {
47
- const seen = new Set([from]); const stack = [from];
48
- while (stack.length) { const at = stack.pop()!; if (at === to) return true;
49
- for (const next of edges[at] ?? []) if (!seen.has(next)) { seen.add(next); stack.push(next); } }
50
- return false;
51
- };
52
- pieces.forEach((piece, index) => {
53
- if (!piece.hotPaths?.length) return;
54
- for (let earlier = 0; earlier < index; earlier++) {
55
- const other = pieces[earlier]!;
56
- if (!other.hotPaths?.some((path) => piece.hotPaths!.includes(path))) continue;
57
- if (reaches(piece.id, other.id)) continue;
58
- if (!edges[other.id]!.includes(piece.id)) { edges[other.id]!.push(piece.id); hasIncoming.add(piece.id); }
59
- }
60
- });
46
+ // ⛔ hotPaths 겹침 간선은 만들지 않는다(2026-10-16 제거 · 대표 10-11 «겹침이라 미루는 현상 제거»).
47
+ // 순서는 «의미 의존 dependsOn» 만 만든다 — 겹침은 pickDecomposeProposals 가 형제 겹침으로 따로 센다.
61
48
 
62
49
  for (const piece of pieces) {
63
50
  if (!hasIncoming.has(piece.id)) edges[COMPOSE_START]!.push(piece.id);
@@ -80,10 +67,11 @@ export function composeGraphFromPieces(pieces: readonly DecomposePiece[], graphI
80
67
  }
81
68
 
82
69
  /** RFC §5 5단계의 두 분모 — ⛔ 타임스탬프가 아니라 그래프 «경로»로 잰다.
83
- * A = 겹치는 조각쌍(전부 직렬이어야 한다) · B = 겹치지 않는 쌍(하나 이상이 «나란히 갈 수» 있어야 한다).
70
+ * A = 겹치는 조각쌍(선언된 의존 «외» 에는 직렬이어야 «하지 않는다») · B = 겹치지 않는 쌍(하나 이상이 «나란히 갈 수» 있어야 한다).
84
71
  * ⛔ A=0 이거나 B=0 이면 «통과가 아니라» `unmeasured` 다. */
85
72
  export interface ComposeConcurrencyReport {
86
73
  readonly overlappingPairs: number;
74
+ /** 겹치는 쌍 중 «선언된 의존 외» 이유로 그래프에서 직렬로 남은 것 — 간선이 dependsOn 뿐이므로 구조적으로 0 이다(방어 관측). */
87
75
  readonly overlappingSerialized: number;
88
76
  readonly nonOverlappingPairs: number;
89
77
  readonly nonOverlappingConcurrent: number;
@@ -102,9 +90,9 @@ export function analyzeComposeConcurrency(pieces: readonly DecomposePiece[]): Co
102
90
  return false;
103
91
  };
104
92
 
105
- // ⛔⭐ 「선언된 의존」과 「겹침에서 파생된 순서」를 «갈라» 본다.
106
- // 분해기가 dependsOn 으로 «의미로» 정한 순서는 결함이 아니다 — 그것을 「불필요한 직렬화」로 세면
107
- // 분모 B 가 거짓으로 0 이 되고, 통과할 판이 fail 로 뒤집힌다(이 갈림을 안 두었더니 실제로 그랬다).
93
+ // ⛔⭐ 「선언된 의존」으로 직렬된 쌍은 결함이 «아니다» — 분해기가 dependsOn 으로 «의미로» 정한 순서다.
94
+ // 겹침 간선이 사라진(2026-10-16) 그래프에서 남는 직렬은 전부 선언에서 오므로,
95
+ // overlappingSerialized 는 «선언 외 직렬»만 센다 — 0 이 아니면 새 간선 원천이 생겼다는 방어 관측이다.
108
96
  const ids = new Set(pieces.map((p) => p.id));
109
97
  const declared: Record<string, string[]> = Object.fromEntries(pieces.map((p) => [p.id, [] as string[]]));
110
98
  for (const piece of pieces) {
@@ -120,16 +108,29 @@ export function analyzeComposeConcurrency(pieces: readonly DecomposePiece[]): Co
120
108
  const a = pieces[i]!, b = pieces[j]!;
121
109
  const overlaps = Boolean(a.hotPaths?.some((p) => b.hotPaths?.includes(p)));
122
110
  const serial = reachIn(edges, a.id, b.id) || reachIn(edges, b.id, a.id);
123
- if (overlaps) { overlappingPairs++; if (serial) overlappingSerialized++; continue; }
111
+ if (overlaps) {
112
+ overlappingPairs++;
113
+ // ⛔ 선언된 의존으로 직렬된 겹침은 결함이 아니다 — «선언 외» 직렬만 센다.
114
+ if (!(reachIn(declared, a.id, b.id) || reachIn(declared, b.id, a.id)) && serial) overlappingSerialized++;
115
+ continue;
116
+ }
124
117
  // 선언된 의존으로 이미 순서가 있는 쌍은 분모 B 에서 «뺀다» — 나란히 갈 이유가 없는 쌍이다.
125
118
  if (reachIn(declared, a.id, b.id) || reachIn(declared, b.id, a.id)) continue;
126
119
  nonOverlappingPairs++;
127
120
  if (!serial) nonOverlappingConcurrent++;
128
121
  }
129
122
  }
130
- const verdict: ComposeConcurrencyReport['verdict'] =
131
- overlappingPairs === 0 || nonOverlappingPairs === 0 ? 'unmeasured'
132
- : overlappingSerialized === overlappingPairs && nonOverlappingConcurrent >= 1 ? 'pass'
133
- : 'fail';
134
- return { overlappingPairs, overlappingSerialized, nonOverlappingPairs, nonOverlappingConcurrent, verdict };
123
+ return {
124
+ overlappingPairs, overlappingSerialized, nonOverlappingPairs, nonOverlappingConcurrent,
125
+ verdict: composeConcurrencyVerdict({ overlappingPairs, overlappingSerialized, nonOverlappingPairs, nonOverlappingConcurrent }),
126
+ };
127
+ }
128
+
129
+ /** RFC §5 5단계 판정식 — 파생 그래프에서 fail 이 구조적으로 안 나와도 식 자체는 살아 있다. */
130
+ export function composeConcurrencyVerdict(
131
+ counts: Pick<ComposeConcurrencyReport, 'overlappingPairs' | 'overlappingSerialized' | 'nonOverlappingPairs' | 'nonOverlappingConcurrent'>,
132
+ ): ComposeConcurrencyReport['verdict'] {
133
+ return counts.overlappingPairs === 0 || counts.nonOverlappingPairs === 0 ? 'unmeasured'
134
+ : counts.overlappingSerialized === 0 && counts.nonOverlappingConcurrent >= 1 ? 'pass'
135
+ : 'fail';
135
136
  }
@@ -24,6 +24,7 @@
24
24
 
25
25
  import { readdirSync, readFileSync } from 'node:fs';
26
26
  import { join, resolve } from 'node:path';
27
+ import { debug } from '../debug/log.js';
27
28
  import { runLedgerDir } from '../self-implement/run-ledger.js';
28
29
  import type { SelfDevGoal, SelfDevJobResult } from './orchestrate.js';
29
30
 
@@ -36,10 +37,23 @@ export interface DecomposePiece {
36
37
  hotPaths?: readonly string[];
37
38
  }
38
39
 
40
+ /** 형제 겹침 한 쌍 — 같은 hotPaths 를 만지는 조각 «둘» (a 가 배열에서 앞선 조각이다). */
41
+ export interface HotPathOverlap {
42
+ a: string;
43
+ b: string;
44
+ paths: readonly string[];
45
+ }
46
+
39
47
  export interface DecomposeProposal {
40
48
  /** 이 제안을 소비할 키. shardId 가 있으면 그것, 없으면 원장 런의 runId 다. */
41
49
  shardId: string;
42
50
  pieces: DecomposePiece[];
51
+ /**
52
+ * 형제 겹침 — 같은 파일을 만지는 조각쌍 목록. ⓑ 겹침 간선 제거(2026-10-16) 후 겹침은
53
+ * 직렬화하지 않고 «여기» 남는다(관측 `hot-path-overlap` — 형제 맥락 주입 ②·OVERLAP-SIBLING-CTX MK 가 읽는다).
54
+ * 겹침이 없으면 빈 배열이다 — 키를 생략하지 않는다.
55
+ */
56
+ hotPathOverlaps: readonly HotPathOverlap[];
43
57
  /** 몇 번째 라운드의 제안인가(늦게 난 것이 이긴다). 없으면 모른다. */
44
58
  round?: number;
45
59
  }
@@ -55,7 +69,22 @@ type GoalPlanRevisionObservation = NonNullable<SelfDevJobResult['goalPlanRevisio
55
69
  type GoalPlanRevisionReadObservation = Extract<GoalPlanRevisionObservation, { status: 'read' }>;
56
70
  type GoalPlanRevisionReadFailureObservation = Extract<GoalPlanRevisionObservation, { status: 'read-failed' }>;
57
71
 
58
- /** 순수: 원장 엔트리들에서 조각별 «가장 늦은» 분해 제안을 뽑는다. */
72
+ /** 형제 겹침을 계산한다 — 같은 hotPaths 를 만지는 조각쌍(«배열 앞선 것»이 a 다). 순수 함수. */
73
+ function hotPathOverlapsOf(pieces: readonly DecomposePiece[]): HotPathOverlap[] {
74
+ const pairs: HotPathOverlap[] = [];
75
+ for (let i = 0; i < pieces.length; i++) {
76
+ const a = pieces[i]!;
77
+ if (!a.hotPaths?.length) continue;
78
+ for (let j = i + 1; j < pieces.length; j++) {
79
+ const b = pieces[j]!;
80
+ const paths = a.hotPaths.filter((path) => b.hotPaths?.includes(path));
81
+ if (paths.length) pairs.push({ a: a.id, b: b.id, paths });
82
+ }
83
+ }
84
+ return pairs;
85
+ }
86
+
87
+ /** 원장 엔트리들에서 조각별 «가장 늦은» 분해 제안을 뽑는다. 형제 겹침이 있으면 hot-path-overlap 관측을 낸다(fail-open). */
59
88
  export function pickDecomposeProposals(entries: readonly Ledgerish[]): Map<string, DecomposeProposal> {
60
89
  const out = new Map<string, DecomposeProposal>();
61
90
  for (const entry of entries) {
@@ -85,7 +114,18 @@ export function pickDecomposeProposals(entries: readonly Ledgerish[]): Map<strin
85
114
  const prior = out.get(shardId);
86
115
  // 늦은 라운드가 이긴다. 라운드를 모르면 나중에 온 것이 이긴다(원장은 append-only).
87
116
  if (prior && round !== undefined && prior.round !== undefined && prior.round > round) continue;
88
- out.set(shardId, { shardId, pieces, ...(round === undefined ? {} : { round }) });
117
+ // ⛔ 겹침은 «버리지 않는다» — 간선을 만들지 않는 대신 형제 겹침으로 따로 세어 관측한다.
118
+ // 형제 맥락 주입(②·OVERLAP-SIBLING-CTX MK)이 이 목록을 읽는다. 관측이 실패해도 읽기는 막지 않는다.
119
+ const hotPathOverlaps = hotPathOverlapsOf(pieces);
120
+ if (hotPathOverlaps.length) {
121
+ try { debug.log('self-dev.decompose', 'hot-path-overlap', { pairs: hotPathOverlaps }); } catch { /* fail-open */ }
122
+ }
123
+ out.set(shardId, {
124
+ shardId,
125
+ pieces,
126
+ hotPathOverlaps,
127
+ ...(round === undefined ? {} : { round }),
128
+ });
89
129
  }
90
130
  return out;
91
131
  }
@@ -97,7 +137,7 @@ export interface DecomposePieceOrdering {
97
137
  ordered?: DecomposePiece[];
98
138
  /** `dependsOn` 에서 «실제로 이어진» 간선 수. */
99
139
  dependsOnEdges: number;
100
- /** `hotPaths` 겹침에서 파생된 간선 수. ⛔ 위와 «따로» 센다 — 합치면 어느 축이 일했는지 못 본다. */
140
+ /** `hotPaths` 겹침 간선 수. ⓑ 간선 제거(2026-10-16) 후에는 «항상 0» — 옛 독자를 위해 필드는 남는다. */
101
141
  hotPathEdges: number;
102
142
  /** `dependsOn` 이 «조각 목록에 없는 id» 를 가리켜 버린 수. 0 이 아니면 분해기 산출이 어긋난 것이다. */
103
143
  danglingDependsOn: number;
@@ -113,15 +153,10 @@ export interface DecomposePieceOrdering {
113
153
  * 📏 실측(2026-09-06 · `decomposition-shadow-goals` 전수): 분해 표본 13건 중 의존 0 = **0건**
114
154
  * ⇒ 승격 가능 **0/13 = 0%**. 원장 132건 중 `attempted=true` 21건이 «전부» 실패했다.
115
155
  *
116
- * ⛔ 간선은 «두 축»이고 둘 다 「거부」가 아니라 「순서」다:
117
- * ⓐ `dependsOn` — 분해기가 «의미»로 명시한 것.
118
- * ⓑ `hotPaths` 겹침 — 같은 파일을 만지는 조각은 «앞선 것 먼저». 새로 만든 규칙이 아니라
119
- * 연합 경로 `orchestrate.ts:1105` 가 이미 쓰던 이 저장소의 «기존 결정»을 단일 경로에도 잇는 것이다.
120
- *
121
- * ⛔⭐ **두 축은 방향을 «다른 근거»로 정한다** — ⓐ 는 의미, ⓑ 는 배열 위치다.
122
- * 그래서 «섞어 걸면 가짜 순환»이 난다(B 가 A 에 의존하는데 B 가 배열 앞이면 A→B ⊕ B→A).
123
- * ⇒ ⓐ 를 «먼저 전부» 걸고, ⓑ 는 반대 방향으로 이미 길이 있으면 «건너뛴다».
124
- * 건너뛰어도 안전한 이유: 길이 있다는 것은 그 둘이 «이미 직렬»이라는 뜻이고, ⓑ 의 목적이 직렬화다.
156
+ * ⛔ 간선은 «한 축»이다 — ⓐ `dependsOn`, 분해기가 «의미»로 명시한 것만 순서를 만든다.
157
+ * ⓑ `hotPaths` 겹침 간선은 «제거됐다»(2026-10-16 · 대표 10-11 «겹침이라 미루는 현상 제거») —
158
+ * 겹침은 직렬화하지 않고 `DecomposeProposal.hotPathOverlaps` 로 형제 겹침으로 따로 남는다.
159
+ * 덕분에 ⓐ 와 배열 위치가 반대 방향을 가리켜 가짜 순환을 만들던 충돌 자체가 사라졌다.
125
160
  *
126
161
  * ⛔ 매달린 `dependsOn`(조각 목록에 없는 id)은 «버리고 센다» — 그것 때문에 승격 전체를 막지 않는다
127
162
  * (연합 경로의 `pruneDanglingDependencies` 와 같은 판단).
@@ -135,7 +170,6 @@ export function orderPiecesTopologically(pieces: readonly DecomposePiece[]): Dec
135
170
  const edges: Set<number>[] = pieces.map(() => new Set<number>());
136
171
  const indegree = pieces.map(() => 0);
137
172
  let dependsOnEdges = 0;
138
- let hotPathEdges = 0;
139
173
  let danglingDependsOn = 0;
140
174
 
141
175
  const addEdge = (from: number, to: number): boolean => {
@@ -155,28 +189,8 @@ export function orderPiecesTopologically(pieces: readonly DecomposePiece[]): Dec
155
189
  }
156
190
  });
157
191
 
158
- /** `from` 에서 `to` 로 «이미» 갈 수 있나. 조각 상한이 24(maxGoals)라 단순 DFS 로 충분하다. */
159
- const reaches = (from: number, to: number): boolean => {
160
- const seen = new Set<number>([from]);
161
- const stack = [from];
162
- while (stack.length) {
163
- const at = stack.pop()!;
164
- if (at === to) return true;
165
- for (const next of edges[at]!) if (!seen.has(next)) { seen.add(next); stack.push(next); }
166
- }
167
- return false;
168
- };
169
-
170
- // ⓑ hotPaths — 반대 방향으로 이미 길이 있으면 건너뛴다(가짜 순환 방지).
171
- pieces.forEach((piece, index) => {
172
- if (!piece.hotPaths?.length) return;
173
- for (let earlier = 0; earlier < index; earlier++) {
174
- const other = pieces[earlier]!;
175
- if (!other.hotPaths?.some((path) => piece.hotPaths!.includes(path))) continue;
176
- if (reaches(index, earlier)) continue;
177
- if (addEdge(earlier, index)) hotPathEdges++;
178
- }
179
- });
192
+ // ⓑ hotPaths 겹침 간선은 제거됐다(2026-10-16) — 순서는 ⓐ dependsOn 만 만든다.
193
+ // 겹침은 pickDecomposeProposals 가 hotPathOverlaps 로 따로 세고, 여기서는 간선을 만들지 않는다.
180
194
 
181
195
  // Kahn — ready 는 «원래 index 오름차순»으로만 꺼낸다.
182
196
  const ordered: DecomposePiece[] = [];
@@ -195,12 +209,12 @@ export function orderPiecesTopologically(pieces: readonly DecomposePiece[]): Dec
195
209
  if (ordered.length !== pieces.length) {
196
210
  return {
197
211
  dependsOnEdges,
198
- hotPathEdges,
212
+ hotPathEdges: 0,
199
213
  danglingDependsOn,
200
214
  cycle: pieces.filter((_, i) => !done[i]).map((piece) => piece.id),
201
215
  };
202
216
  }
203
- return { ordered, dependsOnEdges, hotPathEdges, danglingDependsOn };
217
+ return { ordered, dependsOnEdges, hotPathEdges: 0, danglingDependsOn };
204
218
  }
205
219
 
206
220
  export interface DecomposeProposalScan {
@@ -423,7 +437,8 @@ export function applyDecomposeProposals(
423
437
  feature: inherited.length ? [...inherited, piece.feature].join('\n') : piece.feature,
424
438
  ...(piece.dependsOn.length ? { dependsOn: [...piece.dependsOn] } : {}),
425
439
  // ⛔⭐ `...goal` 이 «부모의» hotPaths 를 그대로 흘린다 — 그러면 조각 전부가 서로 겹쳐
426
- // `orchestrate.ts` 가 전부를 직렬화한다(위상이 아니라 «한 줄»이 된다).
440
+ // «가짜 형제 겹침» 관측을 낸다. 겹침 간선·직렬화는 제거됐다(2026-10-16) — hotPaths 는
441
+ // hot-path-overlap 관측의 원천이므로 부모 것을 물려주면 그 관측이 오염된다.
427
442
  // ⇒ 조각 자신의 것이 있으면 그것으로 덮고, 없으면 «지운다»(부모 것을 상속하지 않는다).
428
443
  ...(piece.hotPaths?.length ? { hotPaths: [...piece.hotPaths] } : { hotPaths: undefined }),
429
444
  } as SelfDevGoal);
@@ -453,6 +453,22 @@ export function inferHotPaths(text: string): string[] {
453
453
  return [...new Set(matches)];
454
454
  }
455
455
 
456
+ /** A child without implementation targets inherits the parent's explicit target line and ask. */
457
+ export function inheritDecomposedTargetPaths(parentFeature: string, goals: SelfDevGoal[]): SelfDevGoal[] {
458
+ const declaredTargets = (feature: string) => [...new Set(feature.split(/\r?\n/)
459
+ .filter((line) => /^\s*(?:[-*]\s*)?대상 경로\s*:/.test(line))
460
+ .flatMap(inferHotPaths))];
461
+ const parentTargets = declaredTargets(parentFeature);
462
+ if (!parentTargets.length) return goals;
463
+ return goals.map((goal) => {
464
+ // hotPaths also contains inferred references; only an explicit target line establishes child scope.
465
+ const own = declaredTargets(goal.feature ?? '');
466
+ if (own.length) return goal;
467
+ return { ...goal, hotPaths: [...new Set([...(goal.hotPaths ?? []), ...parentTargets])],
468
+ feature: `${goal.feature}\n대상 경로: ${parentTargets.join(' · ')}` };
469
+ });
470
+ }
471
+
456
472
  /** Tolerant JSON extraction — LLM may wrap in a fence or prose. */
457
473
  function extractJsonObject(raw: string): unknown | null {
458
474
  const trimmed = raw.trim();
@@ -525,6 +541,7 @@ async function finalizeDecomposition(
525
541
  arcHint: number | undefined,
526
542
  foldedRegistration = 0,
527
543
  ): Promise<SelfDevDecomposition> {
544
+ goals = inheritDecomposedTargetPaths(feature, goals);
528
545
  if (arcHint === undefined || goals.length === 0) return observeDecomposition(goals, decomposition, undefined, opts.observation, opts.pathGrounding, foldedRegistration);
529
546
  try {
530
547
  const arcLlm = opts.arcLlm ?? opts.llm ?? (await defaultDecomposeLlm(opts.model));
@@ -21,7 +21,7 @@ import { readFileSync } from 'node:fs';
21
21
  import { dispatchTask, type DispatchTaskDeps } from '../execution-loop/dispatch-task.js';
22
22
  import { getNestDepth } from '../agent/nest-depth.js';
23
23
  import { appendRunLedgerEntry } from '../self-implement/run-ledger.js';
24
- import { appendEvidenceLocationRequirement, extractVerbatimOriginalAsk, formatGoalFileLintFinding, inspectAskDecisionSignalMarker, leadingGoalMetadata, lintGoalFile, parseGoalId, parseGoalType, tracedPathReferences, SUPERSEDED_BY_LINE, type GoalFileLintFinding, type GoalFileLintResult } from '../self-implement/goal-author.js';
24
+ import { appendEvidenceLocationRequirement, extractVerbatimOriginalAsk, formatGoalFileLintFinding, inspectAskDecisionSignalMarker, inspectGoalDoneBoundary, leadingGoalMetadata, lintGoalFile, markdownSection, parseGoalId, parseGoalType, tracedPathReferences, SUPERSEDED_BY_LINE, type GoalFileLintFinding, type GoalFileLintResult } from '../self-implement/goal-author.js';
25
25
  import { createRepositoryReferencedFileReader, type ReferencedFileReader } from '../self-implement/goal-file-reader.js';
26
26
  import { parseGoalDocumentClarifications } from '../self-implement/goal-author-clarification.js';
27
27
  import { requiredEvidenceFromGoal } from '../self-implement/off-diff-evidence.js';
@@ -164,8 +164,10 @@ export interface DevHarnessOpts {
164
164
  export interface DevChatOpts {
165
165
  /** 이어갈 세션 id/prefix(explicitSessionId). */
166
166
  session?: string;
167
- /** 새 세션 강제(reuseActive=!forceNew 로 파생). */
167
+ /** 새 세션 강제(`--new` · 0.2.31 부터 기본과 같다 — 호환). */
168
168
  forceNew?: boolean;
169
+ /** 활성 세션 이어하기(`--continue`/`--resume` 명시 · 대표 #73). 없으면 새 세션. */
170
+ continueActive?: boolean;
169
171
  /** 단일 JSON 라인 출력. */
170
172
  json?: boolean;
171
173
  /** tool-loop(Read/Grep/…/Bash) 활성(elanous agent 가 켬). */
@@ -1364,6 +1366,32 @@ export function preflightGoalFileEvidence(input: DevInput, text: string, allowNo
1364
1366
  );
1365
1367
  }
1366
1368
 
1369
+ /** TA 발사만 강제한다. 사람의 dev ask/say는 일주일 관측용 경고와 이벤트를 남긴다. */
1370
+ export const GOAL_DONE_BOUNDARY_HUMAN_OBSERVATION_START_MS = Date.parse('2026-10-16T00:00:00+09:00');
1371
+ export const GOAL_DONE_BOUNDARY_HUMAN_OBSERVATION_END_MS = Date.parse('2026-10-23T00:00:00+09:00');
1372
+
1373
+ export function preflightGoalDoneBoundary(input: DevInput, text: string, taskCardId = process.env.ELANOUS_TASK_CARD_ID, entrance?: EntranceId, source: 'goal' | 'request' = 'goal', nowMs = Date.now()): void {
1374
+ if ('text' in input) return;
1375
+ // One-week human observation is scoped to the authored ask/say doors; unrelated
1376
+ // manual-file consumers keep their existing output contract.
1377
+ if (!taskCardId?.trim() && entrance !== 'cli-dev-ask' && entrance !== 'cli-harness-ask' && entrance !== 'cli-harness-say') return;
1378
+ if (!taskCardId?.trim() && (nowMs < GOAL_DONE_BOUNDARY_HUMAN_OBSERVATION_START_MS || nowMs >= GOAL_DONE_BOUNDARY_HUMAN_OBSERVATION_END_MS)) return;
1379
+ const { missing } = inspectGoalDoneBoundary(source === 'request' ? text : markdownSection(text, 'ACCEPTANCE CRITERIA') ?? '');
1380
+ if (missing.length === 0) {
1381
+ debug.log('dev-pipeline', 'goal-done-boundary-ready', { file: input.file, taskCardId: taskCardId?.trim() || null, source });
1382
+ return;
1383
+ }
1384
+ const card = taskCardId?.trim() || null;
1385
+ const location = source === 'request' ? '원 요청' : '## ACCEPTANCE CRITERIA';
1386
+ const reason = `골 완료 경계 누락: ${missing.join(' · ')} (${location} 안에 '- <이름>: <구체적 완료 조건>' 세 행을 적으세요)`;
1387
+ if (card) {
1388
+ debug.log('dev-pipeline', 'goal-done-boundary-rejected', { file: input.file, taskCardId: card, missing, reason, source });
1389
+ throw new DevPipelineError(`${reason} · TA 카드 ${card}`);
1390
+ }
1391
+ debug.log('dev-pipeline', 'goal-done-boundary-warned', { file: input.file, taskCardId: null, missing, reason, source, observationWindow: '2026-10-16/2026-10-23' });
1392
+ process.stderr.write(`[dev] ${reason} — 사람 요청 관측 기간에는 발사를 계속합니다\n`);
1393
+ }
1394
+
1367
1395
  /** `--file` 골의 연속된 머리말 메타데이터에서 폐기 backlink를 찾아 발사 직전에 막는다. */
1368
1396
  export function preflightSupersededGoalFile(input: DevInput, text: string, allowSupersededGoal = false): void {
1369
1397
  if ('text' in input) return;
@@ -1967,6 +1995,7 @@ async function runDevPipelineDispatch(
1967
1995
 
1968
1996
  const readFile = deps.readFile ?? ((p: string) => readFileSync(p, 'utf8'));
1969
1997
  const inputText = resolveDevInputText(plan.input, readFile);
1998
+ preflightGoalDoneBoundary(plan.input, inputText, process.env.ELANOUS_TASK_CARD_ID, plan.entrance);
1970
1999
  preflightGoalFileEvidence(plan.input, inputText, spec.allowNoEvidence === true);
1971
2000
  preflightSupersededGoalFile(plan.input, inputText, spec.allowSupersededGoal === true);
1972
2001
  preflightGoalFileLint(plan.input, inputText, plan.dispatch, deps.cwd ?? process.cwd(), spec.allowGoalLintErrors === true, deps);