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
@@ -480,6 +480,69 @@ export function linesOutsideFencedCode(document: string): GoalDocSourceLine[] {
480
480
  return outside;
481
481
  }
482
482
 
483
+ /** TA 완료 경계는 기존 정식 절 안의 세 독립 행이다. 원문에 없는 값을 저작기가 만들지 않는다. */
484
+ export const GOAL_DONE_BOUNDARY_LABELS = ['완료 경계 코드', '완료 경계 실물', '완료 경계 증거 명령'] as const;
485
+ export type GoalDoneBoundaryLabel = typeof GOAL_DONE_BOUNDARY_LABELS[number];
486
+ // This is a declaration check, not a judgement of whether the proposed work
487
+ // is good. Remove only presentation marks before comparing known placeholders.
488
+ const GOAL_DONE_EMPTY_VALUES = new Set(['', 'na', 'ok', 'yes', 'pass', 'done', '완료', '확인']);
489
+ const GOAL_DONE_UNRESOLVED_PREFIXES = ['tbd', 'todo', 'unknown', 'notdeclared', 'notavailable', '미정', '추후', '없음'];
490
+
491
+ function isGoalDonePlaceholder(value: string): boolean {
492
+ const normalized = value.normalize('NFKC').toLowerCase().replace(/[\p{P}\p{S}\s]+/gu, '');
493
+ return GOAL_DONE_EMPTY_VALUES.has(normalized)
494
+ || GOAL_DONE_UNRESOLVED_PREFIXES.some((prefix) => normalized.startsWith(prefix));
495
+ }
496
+ // Evidence must be an executable command line, not another prose acceptance
497
+ // criterion. Keep this lexical: the preflight cannot safely run the command.
498
+ // An explicit executable is required so prose such as "Check that tests pass"
499
+ // does not become a false completion boundary.
500
+ const GOAL_DONE_EVIDENCE_COMMAND = /^(?:[A-Za-z_][\w-]*=(?:"[^"]*"|'[^']*'|[^\s]+)\s+)*(eln|bun|git|gh|rg|test|npm|pnpm|yarn|node|python|python3|pytest|bash|sh|make|cargo|go|curl|jq|sqlite3|grep|sed|awk|cat|find|ssh|docker|kubectl|(?:\.\/|\/|~\/)[^\s]+)(?:\s+(.*))?$/;
501
+ // The goal boundary parser never invokes commands, so compound shell lines are
502
+ // outside its supported evidence grammar and must not be accepted as proof.
503
+ const GOAL_DONE_UNSUPPORTED_SHELL_OPERATOR = /&&|\|\||[;|><`]|\$\(/;
504
+ // Only the narrow, concrete file predicates are accepted for `test`; the
505
+ // predicate also needs its operand, so `test -f` cannot claim proof.
506
+ const GOAL_DONE_SHELL_TEST_ARGS = /^-(?:f|e)\s+\S+(?:\s|$)/;
507
+
508
+ function isGoalDoneEvidenceCommand(value: string): boolean {
509
+ if (GOAL_DONE_UNSUPPORTED_SHELL_OPERATOR.test(value)) return false;
510
+ const match = GOAL_DONE_EVIDENCE_COMMAND.exec(value);
511
+ const args = match?.[2]?.trim() ?? '';
512
+ return !!match && args.length > 0 && (match[1] !== 'test' || GOAL_DONE_SHELL_TEST_ARGS.test(args));
513
+ }
514
+
515
+ function unwrapGoalDoneValue(value: string): string {
516
+ let result = value.trim();
517
+ const wrappers: Array<readonly [string, string]> = [['`', '`'], ['"', '"'], ["'", "'"], ['“', '”'], ['‘', '’']];
518
+ // Each pass removes two characters. Repeated wrappers cannot hide a marker.
519
+ while (result.length >= 2) {
520
+ const pair = wrappers.find(([open, close]) => result.startsWith(open) && result.endsWith(close));
521
+ if (!pair) break;
522
+ result = result.slice(pair[0].length, -pair[1].length).trim();
523
+ }
524
+ return result;
525
+ }
526
+
527
+ export function inspectGoalDoneBoundary(document: string): { values: Partial<Record<GoalDoneBoundaryLabel, string>>; missing: GoalDoneBoundaryLabel[] } {
528
+ const values: Partial<Record<GoalDoneBoundaryLabel, string>> = {};
529
+ for (const line of linesOutsideFencedCode(document)) {
530
+ const match = /^\s*(?:[-*]\s*)?(완료 경계 코드|완료 경계 실물|완료 경계 증거 명령)\s*:\s*(.*?)\s*$/.exec(line.text);
531
+ if (!match) continue;
532
+ const label = match[1] as GoalDoneBoundaryLabel;
533
+ const value = match[2]?.trim() ?? '';
534
+ const inspected = unwrapGoalDoneValue(value);
535
+ if (!isGoalDonePlaceholder(value)
536
+ && (label !== '완료 경계 증거 명령' || isGoalDoneEvidenceCommand(inspected))) values[label] = value;
537
+ }
538
+ return { values, missing: GOAL_DONE_BOUNDARY_LABELS.filter((label) => !values[label]) };
539
+ }
540
+
541
+ export function explicitGoalDoneBoundaryLines(ask: string): string[] {
542
+ const { values } = inspectGoalDoneBoundary(ask);
543
+ return GOAL_DONE_BOUNDARY_LABELS.flatMap((label) => values[label] ? [`- ${label}: ${values[label]}`] : []);
544
+ }
545
+
483
546
  // CommonMark 펜스는 **한 종류의 문자**가 3개 이상 이어진 런이다 — `[`~]{3,}` 는 혼합(백틱+틸드)까지
484
547
  // 펜스로 인정해 진짜 진양성을 펜스 안으로 숨긴다(리뷰 must-fix). 열기/닫기 모두 이 하나를 쓴다.
485
548
  const FENCE_RUN = /^ {0,3}(`{3,}|~{3,})(.*)$/;
@@ -795,7 +858,7 @@ const SERVER_ENTRY_PATH = /(?:^|\/)server[^/]*\.(?:[cm]?[jt]sx?)$/i;
795
858
  const LOOPBACK_ADDRESS_WITH_PORT = /(?<![\p{L}\p{N}.-])(?:localhost|127\.0\.0\.1|\[::1\])(?::\d+)(?![\p{L}\p{N}_])/iu;
796
859
 
797
860
  function targetPathsInLabelPiece(piece: string): string[] {
798
- return askPathTokens(piece).filter((path) => path.includes('/'));
861
+ return askPathTokens(piece).filter((path) => classifyTracedPathToken(path).kind === 'path');
799
862
  }
800
863
 
801
864
  function declaredTargetPaths(document: string): string[] {
@@ -1204,6 +1267,73 @@ interface TracedPathReference {
1204
1267
  endLine: number | null;
1205
1268
  }
1206
1269
 
1270
+ /** Every TRACED PATHS declaration token is one of these kinds. Nested repository paths are `path`. */
1271
+ export type TracedPathTokenKind = 'path' | 'bare' | 'residual' | 'repository-root' | 'empty-cover';
1272
+
1273
+ export interface TracedPathTokenClassification {
1274
+ readonly token: string;
1275
+ readonly kind: TracedPathTokenKind;
1276
+ /** Inspectable path when the token names one; null for an empty cover. */
1277
+ readonly path: string | null;
1278
+ /** Attached residual characters when `kind` is `residual` (for example `???` in `src/a.ts???`). */
1279
+ readonly residual: string | null;
1280
+ }
1281
+
1282
+ const EMPTY_COVER_TOKEN = '(빈 대상 경로)';
1283
+ /** Leftover punctuation after a complete file token (`src/a.ts???`). Must not steal extension letters. */
1284
+ const TRACED_PATH_RESIDUAL_TOKEN = /^((?:[A-Za-z0-9_.-]+\/)*[A-Za-z0-9_.-]+\.[A-Za-z0-9]+)([^A-Za-z0-9./\\:\s,;]+)$/;
1285
+
1286
+ function isEmptyCoverToken(token: string): boolean {
1287
+ const trimmed = token.trim();
1288
+ return trimmed === '' || trimmed === EMPTY_COVER_TOKEN;
1289
+ }
1290
+
1291
+ function repositoryRootFileExists(path: string, repositoryRoot: string): boolean {
1292
+ if (path.includes('/') || path.includes('\\') || isAbsolute(path)) return false;
1293
+ try {
1294
+ const realRoot = realpathSync(resolve(repositoryRoot));
1295
+ const absolutePath = resolve(realRoot, path);
1296
+ if (dirname(absolutePath) !== realRoot || !isSameOrNestedPath(absolutePath, realRoot)) return false;
1297
+ return lstatSync(absolutePath).isFile();
1298
+ } catch {
1299
+ return false;
1300
+ }
1301
+ }
1302
+
1303
+ /**
1304
+ * Classify one TRACED PATHS / 대상 경로 declaration token.
1305
+ * Residual characters stay attached until this plate splits them; locators (`file.ts:line`) stay locators.
1306
+ */
1307
+ export function classifyTracedPathToken(token: string, repositoryRoot?: string): TracedPathTokenClassification {
1308
+ const trimmed = token.trim();
1309
+ if (isEmptyCoverToken(trimmed)) {
1310
+ return { token: trimmed, kind: 'empty-cover', path: null, residual: null };
1311
+ }
1312
+ const unwrapped = stripInlineCode(trimmed).replace(TRACED_PATH_LEADING_LIST_MARKERS, '').trim();
1313
+ if (isEmptyCoverToken(unwrapped)) {
1314
+ return { token: trimmed, kind: 'empty-cover', path: null, residual: null };
1315
+ }
1316
+ const residualMatch = TRACED_PATH_RESIDUAL_TOKEN.exec(unwrapped);
1317
+ if (residualMatch?.[1] && residualMatch[2]) {
1318
+ return { token: trimmed, kind: 'residual', path: residualMatch[1], residual: residualMatch[2] };
1319
+ }
1320
+ const normalized = unwrapped.replaceAll('\\', '/');
1321
+ if (!normalized.includes('/')) {
1322
+ if (repositoryRoot && repositoryRootFileExists(normalized, repositoryRoot)) {
1323
+ return { token: trimmed, kind: 'repository-root', path: normalized, residual: null };
1324
+ }
1325
+ return { token: trimmed, kind: 'bare', path: normalized, residual: null };
1326
+ }
1327
+ return { token: trimmed, kind: 'path', path: normalized, residual: null };
1328
+ }
1329
+
1330
+ /** Inspectable traced path: nested or repository-root files only. Residual, bare-only, and empty covers are not injected. */
1331
+ export function canonicalTracedPathToken(token: string, repositoryRoot?: string): string | null {
1332
+ const classification = classifyTracedPathToken(token, repositoryRoot);
1333
+ if (classification.kind === 'path' || classification.kind === 'repository-root') return classification.path;
1334
+ return null;
1335
+ }
1336
+
1207
1337
  /**
1208
1338
  * Count lines an editor would address. A file's terminating newline closes the last line rather
1209
1339
  * than opening a new one, so `"one\n"` is one addressable line — counting the split remainder
@@ -1377,6 +1507,8 @@ export function tracedPathReferences(document: string): TracedPathReference[] {
1377
1507
  // 두 번 벗긴다 — 줄번호가 백틱 **안**(`p:42`)일 수도 **밖**(`p`:42)일 수도 있다.
1378
1508
  const path = match ? stripInlineCode(match[1].trim()).replace(TRACED_PATH_LEADING_LIST_MARKERS, '') : undefined;
1379
1509
  if (!path) continue;
1510
+ const classification = classifyTracedPathToken(path);
1511
+ if (classification.kind === 'residual' || classification.kind === 'empty-cover') continue;
1380
1512
  references.push({ path, line: match?.[2] ? Number(match[2]) : null, endLine: match?.[3] ? Number(match[3]) : null });
1381
1513
  }
1382
1514
  }
@@ -2323,13 +2455,24 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
2323
2455
  const unresolvedTargetPieces = targetLabels.flatMap((label) => label.split(/\s+[·,]\s*|[·,]\s+/))
2324
2456
  .flatMap((piece) => {
2325
2457
  const tokens = piece.trim().split(/\s+/).filter(Boolean);
2326
- return tokens.length === 0 ? ['(빈 대상 경로)'] : tokens.filter((token) => targetPathsInLabelPiece(token).length === 0);
2458
+ return tokens.length === 0
2459
+ ? ['(빈 대상 경로)']
2460
+ : tokens.filter((token) => targetPathsInLabelPiece(token).length === 0
2461
+ && classifyTracedPathToken(token, repositoryRoot).kind !== 'repository-root');
2327
2462
  });
2328
2463
  const labeledTargets = declaredTargetPaths(ask);
2464
+ const labeledRootFiles = targetLabels.flatMap((label) => label.split(/\s+[·,]\s*|[·,]\s+/))
2465
+ .flatMap((piece) => piece.trim().split(/\s+/).filter(Boolean))
2466
+ .flatMap((token) => {
2467
+ const classification = classifyTracedPathToken(token, repositoryRoot);
2468
+ return classification.kind === 'repository-root' && classification.path ? [classification.path] : [];
2469
+ });
2329
2470
  const scopedAskPaths = [...new Set(askPathTokens(targetScopedGoalText(ask)).filter((path) => path.includes('/')))];
2330
2471
  // A single repository path in an ask without a target label is still an explicit target.
2331
2472
  // Multiple mentions are ambiguous; do not turn background references into targets.
2332
- const requestedTargets = targetLabels.length ? labeledTargets : scopedAskPaths.length === 1 ? scopedAskPaths : [];
2473
+ const requestedTargets = targetLabels.length
2474
+ ? [...new Set([...labeledTargets, ...labeledRootFiles])]
2475
+ : scopedAskPaths.length === 1 ? scopedAskPaths : [];
2333
2476
  const known = [...new Set([
2334
2477
  ...requestedTargets, ...scopedAskPaths, ...(facts?.files ?? []),
2335
2478
  ...evidence.flatMap((item) => Array.from(item.text.matchAll(SOURCE_PATH), (match) => match[0]).filter((path) => path.includes('/'))),
@@ -2338,8 +2481,9 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
2338
2481
  try { root = repositoryRoot === undefined ? null : realpathSync(resolve(repositoryRoot)); }
2339
2482
  catch { root = null; }
2340
2483
  const valid = (path: string, allowDeclaredNew: boolean): boolean => {
2341
- if (!path.includes('/') || isAbsolute(path) || path.split('/').some((part) => part === '..' || part === '.')) return false;
2484
+ if (isAbsolute(path) || path.split('/').some((part) => part === '..' || part === '.')) return false;
2342
2485
  if (root === null) return false;
2486
+ if (!path.includes('/')) return classifyTracedPathToken(path, root).kind === 'repository-root';
2343
2487
  if (allowDeclaredNew && declaredNew.has(path) && isSafeNewTargetPath(path, root)) return true;
2344
2488
  try {
2345
2489
  const real = realpathSync(resolve(root, path));
@@ -2877,9 +3021,13 @@ interface AbsentFirstImplementationPath {
2877
3021
  }
2878
3022
 
2879
3023
  function askPathTokens(ask: string): string[] {
2880
- return ask.split(/\s+/)
2881
- .map((token) => token.replace(/^[`\p{P}]+|[`\p{P}]+$/gu, ''))
2882
- .filter((token) => token.includes('/') && /\.[^./]+$/.test(token));
3024
+ return ask.split(/\s+/).flatMap((raw) => {
3025
+ const withoutWrap = raw.replace(/^[`([{]+|[`)\]}]+$/g, '');
3026
+ if (classifyTracedPathToken(raw).kind === 'residual' || classifyTracedPathToken(withoutWrap).kind === 'residual') return [];
3027
+ const token = raw.replace(/^[`\p{P}]+|[`\p{P}]+$/gu, '');
3028
+ if (classifyTracedPathToken(token).kind === 'residual') return [];
3029
+ return token.includes('/') && /\.[^./]+$/.test(token) ? [token] : [];
3030
+ });
2883
3031
  }
2884
3032
 
2885
3033
  const ASK_QUANTITY_WORDS = new Set(['모든', '무조건', '전부', '아래의']);
@@ -2958,7 +3106,9 @@ interface NewTargetFile {
2958
3106
  export function isAskPathLocatorToken(path: string): boolean {
2959
3107
  // Evidence (`file.ts:line`) and prefixed (`ref:path`) tokens are not file paths.
2960
3108
  // This plate discards them; it does not strip the colon and retry the remainder.
2961
- return path.split(/[\\/]/).some((component) => component.includes(':'));
3109
+ if (path.split(/[\\/]/).some((component) => component.includes(':'))) return true;
3110
+ const kind = classifyTracedPathToken(path).kind;
3111
+ return kind === 'residual' || kind === 'empty-cover';
2962
3112
  }
2963
3113
 
2964
3114
  export function classifyAbsentFirstPathPresence(path: string, repositoryRoot?: string): AbsentFirstPathPresence {
@@ -5184,6 +5334,7 @@ async function authorGoalWithSupersededRootIntent(
5184
5334
  '',
5185
5335
  '## ACCEPTANCE CRITERIA',
5186
5336
  ...enhancement.checklist.map(requestedCriterionLine),
5337
+ ...explicitGoalDoneBoundaryLines(ask),
5187
5338
  '',
5188
5339
  '## REQUIRED EVIDENCE',
5189
5340
  '- [requested] Verify the decision signal and the verbatim ask.',
@@ -5634,6 +5785,7 @@ async function authorGoalWithSupersededRootIntent(
5634
5785
  : ['## STEPS', ...(resolvedSteps.length ? resolvedSteps.map((step) => `- ${step}`) : ['- No externally injected steps.']), '']),
5635
5786
  '## ACCEPTANCE CRITERIA',
5636
5787
  ...acceptanceSection,
5788
+ ...explicitGoalDoneBoundaryLines(ask),
5637
5789
  ...preservationAmbiguityCriteria(ambiguities, clarificationAnswers),
5638
5790
  ...preservationAmbiguityNotice(ambiguities),
5639
5791
  ...preservationAmbiguityClarification(clarificationQuestions, clarificationResponses),
@@ -17,6 +17,7 @@ import {
17
17
  import { applyGraphOverlays, selectOverlays, type GraphOverlaySpec, type OverlayRejection, type OverlaySelection, type OverlayStage } from './graph-overlay-yaml.js';
18
18
  import type { OverlayPatch } from './graph-overlay.js';
19
19
  import type { GraphTemplateSpec } from './graph-yaml.js';
20
+ import { pickSupervisorHealOverlay, type SupervisorOverlayPick } from './heal-triage.js';
20
21
 
21
22
  /** 2026-09-26 설정 졸업 — 그래프 권위는 항상 켬. 관측 출처는 default로 고정한다. */
22
23
  export type GraphAuthoritySource = 'default';
@@ -282,7 +283,10 @@ export function graphAuthorityFields(authority: GraphAuthority, template: GraphT
282
283
  /** 오버레이 조건이 «읽을 수 있는» 상태 키. ⛔ 여기 없는 키는 원장에 값이 안 실린다.
283
284
  * 🔑 그래서 «떨어뜨리되 말은 한다» — 아래 `stateExtraKeys` 가 그 이름을 남긴다.
284
285
  * ⭐ `author_grade` — 적응형 저작(GRAPH-AUTHOR-GRADE) 첫 조각: 저작 등급을 오버레이 상태의 «이름»으로 싣는다. */
285
- export const OVERLAY_STATE_KEYS = ['attempts', 'author_grade', 'goal_id'] as const;
286
+ export const OVERLAY_STATE_KEYS = [
287
+ 'attempts', 'author_grade', 'goal_id',
288
+ 'substrate', 'freeze', 'docs_only', 'provider', 'quota', 'machines', 'seats',
289
+ ] as const;
286
290
 
287
291
  /** 저작 등급의 오버레이 어휘 — `goal-author` 의 `GoalAuthorGrade`(`full|lite`) 를 오버레이 등급(`normal`) 로 옮긴다.
288
292
  * ⛔ 모르는 값(빈 값·오타)은 `undefined` — 등급을 «지어내지 않는다». */
@@ -303,7 +307,7 @@ export function normalizeAuthorGrade(value: unknown): 'lite' | 'normal' | 'compl
303
307
  * 여기서 «조용히» 떨어뜨리면 같은 병을 한 층 아래에서 다시 짓는 것이다. */
304
308
  export function overlayDecisionObservation<T extends Readonly<Record<string, unknown>>>(input: T & {
305
309
  readonly state: Readonly<Record<string, unknown>>;
306
- }): T & { readonly state: Readonly<Record<string, unknown>>; readonly stateExtraKeys?: readonly string[] } {
310
+ }): Omit<T, 'state'> & { readonly state: Readonly<Record<string, unknown>>; readonly stateExtraKeys?: readonly string[] } {
307
311
  const state: Record<string, unknown> = {};
308
312
  for (const key of OVERLAY_STATE_KEYS) {
309
313
  if (!Object.hasOwn(input.state, key)) continue;
@@ -313,6 +317,14 @@ export function overlayDecisionObservation<T extends Readonly<Record<string, unk
313
317
  return { ...input, state, ...(extra.length > 0 ? { stateExtraKeys: extra } : {}) };
314
318
  }
315
319
 
320
+ /** ⭐ 칸 GRAPH-SUPERVISOR-PICK(0.2.32) — `graph-overlay-decision` 원장에 실릴 슈퍼바이저 고르기 기록.
321
+ * `overlayDecisionObservation` 을 그대로 거친다 — 판단(outcome)·근거(evidence 한 줄)와 함께
322
+ * 판정에 쓴 상태 칸(`state`/`stateExtraKeys`)이 같이 남는다(예: `stop_class`). */
323
+ export type SupervisorPickRecord = SupervisorOverlayPick & {
324
+ readonly state: Readonly<Record<string, unknown>>;
325
+ readonly stateExtraKeys?: readonly string[];
326
+ };
327
+
316
328
  export function decideTemplate(input: {
317
329
  readonly goalType: GoalType | undefined;
318
330
  readonly authority: GraphAuthority;
@@ -329,22 +341,42 @@ export function decideTemplate(input: {
329
341
  readonly rejections: readonly OverlayRejection[];
330
342
  readonly appliedIds: readonly string[];
331
343
  readonly appliedPatches: readonly OverlayPatch[];
344
+ /** ⭐ 칸 GRAPH-SUPERVISOR-PICK(0.2.32) — `stage: 'heal'` 판에만 싣는다: 슈퍼바이저가 «선언된»
345
+ * 오버레이 중에서 고른 판단·근거. 다른 단계는 이 칸이 없다(기본 동작 보존). */
346
+ readonly supervisorPick?: SupervisorPickRecord;
332
347
  } {
333
348
  const base = activeTemplate(input.goalType, input.authority);
334
349
  if (!input.authority.enabled) return { template: base, selections: [], rejections: [], appliedIds: [], appliedPatches: [] };
350
+ // ⭐ 칸 GRAPH-SUPERVISOR-PICK(0.2.32) — 슈퍼바이저가 «선언된» heal 오버레이 중 하나를 고른다(능력표 ③b).
351
+ // ⛔ 고르기만 한다 — 새 노드를 짓지 않는다. 노드를 더하는 것은 선언의 patch 고, 그 적용은
352
+ // 아래 기존 selectOverlays/applyGraphOverlays 경로가 그대로 말한다.
353
+ // ⛔ 후보는 graphs/overlays/ 선언(loadGraphOverlays) 중 `stage: heal` 뿐이다 — 호출부가 준
354
+ // overlays 목록과 무관하게 «선언에서만» 고른다.
355
+ // 판단·근거는 overlayDecisionObservation(graph-overlay-decision 원장 칸)을 거쳐 기록 형태로 나간다.
356
+ let supervisorPick: SupervisorPickRecord | undefined;
357
+ if (input.stage === 'heal') {
358
+ const chosen = pickSupervisorHealOverlay({ state: input.state, graphId: base.graphId });
359
+ supervisorPick = overlayDecisionObservation({
360
+ outcome: chosen.outcome,
361
+ ...(chosen.overlayId !== undefined ? { overlayId: chosen.overlayId } : {}),
362
+ evidence: chosen.evidence,
363
+ state: input.state,
364
+ });
365
+ }
366
+ const pick: { supervisorPick?: SupervisorPickRecord } = supervisorPick === undefined ? {} : { supervisorPick };
335
367
  // ⛔ 「최초 결정」은 launch 단계다 — `runtime` 오버레이는 여기서 «후보가 아니다»(③ 다이나믹의 몫).
336
368
  const { applied, selections } = selectOverlays(input.overlays, {
337
369
  graphId: base.graphId, stage: input.stage, state: input.state,
338
370
  });
339
- if (applied.length === 0) return { template: base, selections, rejections: [], appliedIds: [], appliedPatches: [] };
371
+ if (applied.length === 0) return { template: base, selections, rejections: [], appliedIds: [], appliedPatches: [], ...pick };
340
372
  const spec = (input.specs ?? GRAPH_SPECS)[base.graphId];
341
373
  // ⛔ spec 을 못 얻으면 «변형하지 않는다» — 얹은 척하지 않는다(내장 폴백으로 돌 때가 그렇다).
342
- if (spec === undefined) return { template: base, selections, rejections: [], appliedIds: [], appliedPatches: [] };
374
+ if (spec === undefined) return { template: base, selections, rejections: [], appliedIds: [], appliedPatches: [], ...pick };
343
375
  const result = applyGraphOverlays(spec, applied);
344
376
  // ⛔ 전부 아니면 전무다 — 하나라도 거절되면 «기준 선언»으로 돈다(반쯤 얹힌 그래프를 만들지 않는다).
345
377
  return result.ok
346
- ? { template: specToTemplate(result.template), selections, rejections: [], appliedIds: result.overlayIds, appliedPatches: result.patches }
347
- : { template: base, selections, rejections: result.rejections, appliedIds: [], appliedPatches: [] };
378
+ ? { template: specToTemplate(result.template), selections, rejections: [], appliedIds: result.overlayIds, appliedPatches: result.patches, ...pick }
379
+ : { template: base, selections, rejections: result.rejections, appliedIds: [], appliedPatches: [], ...pick };
348
380
  }
349
381
 
350
382
  /** ⭐ RFC §5 — 노드 «방문 예산»(`max_visits`)을 실행이 «읽게» 한다.
@@ -1,4 +1,10 @@
1
1
  import type { RunStopClass } from './run-stop.js';
2
+ import type { RunContract } from './graph-run-contract.js';
3
+ import type { GateRoutingReason } from './graph-authority.js';
4
+ import { landingFreezeState, type LandingFreeze } from '../release-loop/landing-freeze.js';
5
+ import type { ActiveProviderInfo } from '../provider-summary.js';
6
+ import type { ResourceView } from '../control-plane/ledger.js';
7
+ import type { UserConfig } from '../user-config.js';
2
8
 
3
9
  /** ⭐ RFC §5 «4단계» — `applies_when` 을 «코드»가 판정한다.
4
10
  *
@@ -33,9 +39,29 @@ export function parseOverlayCondition(source: string): OverlayConditionParse {
33
39
  return { ok: true, condition: { key: key!, operator: operator as OverlayConditionOperator, literal } };
34
40
  }
35
41
 
42
+ /** L1 values are producer observations; an unobserved field is absent, never a default. */
43
+ export interface GraphRunState {
44
+ readonly attempts: number;
45
+ readonly goal_id?: string;
46
+ readonly stop_class?: RunStopClass;
47
+ readonly review_repeat?: number;
48
+ readonly sibling_overlap?: boolean;
49
+ readonly main_sync_conflict?: boolean;
50
+ readonly author_grade?: string;
51
+ readonly substrate?: 'local' | 'pod';
52
+ readonly freeze?: 'on' | 'off';
53
+ readonly docs_only?: boolean;
54
+ readonly provider?: string;
55
+ readonly quota?: 'ok' | 'low' | 'exhausted';
56
+ readonly machines?: number;
57
+ readonly seats?: 'on' | 'steward-only';
58
+ }
59
+
36
60
  /** Inputs known at a runtime overlay decision. Every field except `attempts` may be unknown. */
37
61
  export interface RuntimeOverlayStateInput {
38
62
  readonly attempts: number;
63
+ /** Producer results captured for this decision; omitted in callers not yet wired to L1. */
64
+ readonly producers?: L1OverlayProducerReadings;
39
65
  readonly goalId?: string;
40
66
  readonly stopClass?: RunStopClass;
41
67
  readonly reviewRepeat?: number;
@@ -44,10 +70,68 @@ export interface RuntimeOverlayStateInput {
44
70
  readonly mainSyncConflict?: unknown;
45
71
  /** Only a non-empty string is a measurement. */
46
72
  readonly authorGrade?: unknown;
73
+ /** Pass resolved producer values, not configuration wishes or fallback guesses. */
74
+ readonly substrate?: unknown;
75
+ /** Derived from readLandingFreeze's validated, expiry-aware result. */
76
+ readonly freeze?: unknown;
77
+ readonly docsOnly?: unknown;
78
+ readonly provider?: unknown;
79
+ readonly quota?: unknown;
80
+ readonly machines?: unknown;
81
+ readonly seats?: unknown;
82
+ }
83
+
84
+ /** Producer outputs supplied at the decision boundary; omission means the producer was not read. */
85
+ export interface L1OverlayProducerReadings {
86
+ readonly runContract?: Pick<RunContract, 'substrate'>;
87
+ readonly landingFreeze?: LandingFreeze | null;
88
+ /** routeGate's documents-only verdict is the known docs-only observation. */
89
+ readonly gateRoute?: { readonly reason: GateRoutingReason };
90
+ readonly activeProvider?: Pick<ActiveProviderInfo, 'provider'>;
91
+ /** Snapshot returned by assessQuotaExhaustion/readQuotaExhausted; only measured usage implies ok/low. */
92
+ readonly quotaAssessment?: { readonly exhausted: boolean | undefined; readonly accountAvailability: {
93
+ readonly currentUsedPercent?: number;
94
+ readonly thresholdPercent?: number;
95
+ } | undefined };
96
+ /** Result of listMachineResources (Nexus live membership), not fleet intent. */
97
+ readonly machineResources?: readonly Pick<ResourceView, 'machine' | 'expired'>[];
98
+ /** Resolved loop modes; do not pass an unreadable config as a default measurement. */
99
+ readonly seatConfig?: NonNullable<UserConfig['loops']>['seat'];
100
+ readonly stewardConfig?: NonNullable<UserConfig['loops']>['steward'];
101
+ }
102
+
103
+ /** Derive only observations from named producers. A missing producer never becomes false or zero. */
104
+ export function l1OverlayStateInput(readings: L1OverlayProducerReadings): Omit<RuntimeOverlayStateInput, 'attempts'> {
105
+ const quota = readings.quotaAssessment;
106
+ const currentUsed = quota?.accountAvailability?.currentUsedPercent;
107
+ const threshold = quota?.accountAvailability?.thresholdPercent;
108
+ const seat = readings.seatConfig;
109
+ return {
110
+ ...(readings.runContract ? { substrate: readings.runContract.substrate } : {}),
111
+ ...(readings.landingFreeze !== undefined ? { freeze: landingFreezeState(readings.landingFreeze) } : {}),
112
+ ...(readings.gateRoute ? { docsOnly: readings.gateRoute.reason === 'documents-only' } : {}),
113
+ ...(readings.activeProvider ? { provider: readings.activeProvider.provider } : {}),
114
+ ...(quota?.exhausted === true ? { quota: 'exhausted' } :
115
+ quota?.exhausted === false && currentUsed !== undefined && threshold !== undefined
116
+ ? { quota: currentUsed >= threshold ? 'low' : 'ok' } : {}),
117
+ ...(readings.machineResources ? { machines: new Set(readings.machineResources.filter((row) => !row.expired).map((row) => row.machine)).size } : {}),
118
+ ...(seat && readings.stewardConfig?.mode === 'live'
119
+ ? { seats: seat.mode === 'on' || seat.mode === 'live-safe' ? 'on' : 'steward-only' }
120
+ : {}),
121
+ };
47
122
  }
48
123
 
49
124
  /** ⛔ 아는 값만 싣는다 — 모르면 키를 «뺀다». 0·false·빈 문자열을 지어내지 않는다. */
50
- export function buildRuntimeOverlayState(input: RuntimeOverlayStateInput): Record<string, unknown> {
125
+ export function buildRuntimeOverlayState(input: RuntimeOverlayStateInput): GraphRunState & Record<string, unknown> {
126
+ const produced: Omit<RuntimeOverlayStateInput, 'attempts'> = input.producers === undefined ? {} : l1OverlayStateInput(input.producers);
127
+ // Once producers are supplied, even an omitted reading is unknown; direct legacy inputs cannot override it.
128
+ const substrate = input.producers === undefined ? input.substrate : produced.substrate;
129
+ const freeze = input.producers === undefined ? input.freeze : produced.freeze;
130
+ const docsOnly = input.producers === undefined ? input.docsOnly : produced.docsOnly;
131
+ const provider = input.producers === undefined ? input.provider : produced.provider;
132
+ const quota = input.producers === undefined ? input.quota : produced.quota;
133
+ const machines = input.producers === undefined ? input.machines : produced.machines;
134
+ const seats = input.producers === undefined ? input.seats : produced.seats;
51
135
  return {
52
136
  attempts: input.attempts,
53
137
  ...(input.goalId === undefined ? {} : { goal_id: input.goalId }),
@@ -56,6 +140,13 @@ export function buildRuntimeOverlayState(input: RuntimeOverlayStateInput): Recor
56
140
  ...(typeof input.siblingOverlap === 'boolean' ? { sibling_overlap: input.siblingOverlap } : {}),
57
141
  ...(typeof input.mainSyncConflict === 'boolean' ? { main_sync_conflict: input.mainSyncConflict } : {}),
58
142
  ...(typeof input.authorGrade === 'string' && input.authorGrade.length > 0 ? { author_grade: input.authorGrade } : {}),
143
+ ...(substrate === 'local' || substrate === 'pod' ? { substrate } : {}),
144
+ ...(freeze === 'on' || freeze === 'off' ? { freeze } : {}),
145
+ ...(typeof docsOnly === 'boolean' ? { docs_only: docsOnly } : {}),
146
+ ...(typeof provider === 'string' && provider.trim().length > 0 ? { provider } : {}),
147
+ ...(quota === 'ok' || quota === 'low' || quota === 'exhausted' ? { quota } : {}),
148
+ ...(typeof machines === 'number' && Number.isSafeInteger(machines) && machines >= 0 ? { machines } : {}),
149
+ ...(seats === 'on' || seats === 'steward-only' ? { seats } : {}),
59
150
  };
60
151
  }
61
152
 
@@ -1,5 +1,8 @@
1
1
  /** 결정론 트리아지 — 실패 서명과 이미 거친 역할만으로 다음 갈래를 고른다. */
2
2
 
3
+ import { defaultOverlaysDir, loadGraphOverlays, selectOverlays, type GraphOverlaySpec } from './graph-overlay-yaml.js';
4
+ import { GRAPH_SPECS } from './graph-templates.js';
5
+
3
6
  export type HealTriageOutcome =
4
7
  | 'environment-claimed'
5
8
  | 'untestable'
@@ -271,3 +274,79 @@ export function triageFailure(signature: HealFailureSignature, history?: HealTri
271
274
  evidence: ['observe-deeper 와 ground-external 을 둘 다 거쳤다', '더 올릴 해상도가 없다'],
272
275
  };
273
276
  }
277
+
278
+ /** ═══ 슈퍼바이저 고르기(0.2.32 칸 GRAPH-SUPERVISOR-PICK) — «선언된» 오버레이 중에서 고른다 ═══
279
+ *
280
+ * 능력표 ③b: 고르기만 한다. ⛔ 새 그래프 노드를 «짓지 않는다» — 후보를 읽고 선언된 조건을
281
+ * 판정해 overlayId 하나를 고를 뿐, 템플릿을 만들거나 노드를 더하지 않는다.
282
+ *
283
+ * 후보의 실체: `graphs/overlays/`(loadGraphOverlays) 선언 중 `stage: heal` 인 것만.
284
+ * 조건의 값은 코드가 낸다 — 선언의 appliesWhen 을 selectOverlays(선언 조건 판정 기계)로 판정한다.
285
+ * 결정론: 같은 입력·같은 선언이면 언제나 같은 답 — 조건이 맞는 후보 중 «선언 순서가 가장 앞»인 것.
286
+ */
287
+
288
+ /** 선언된 heal 오버레이 후보를 읽는 자리 — 시험이 갈아 끼운다. */
289
+ export type DeclaredHealOverlayLoader = () => readonly GraphOverlaySpec[];
290
+
291
+ export type SupervisorOverlayPickOutcome =
292
+ | 'picked'
293
+ | 'no-declared-candidate'
294
+ | 'no-applicable-candidate';
295
+
296
+ export interface SupervisorOverlayPickInput {
297
+ /** 선언 조건(appliesWhen) 판정에 쓸 상태 — 예: `{ stop_class: 'pod-died' }`. */
298
+ readonly state: Readonly<Record<string, unknown>>;
299
+ /** 후보를 좁힐 그래프 id — 기본은 활성 self-implement 그래프. */
300
+ readonly graphId?: string;
301
+ }
302
+
303
+ /** 고르기 결과 — outcome+evidence 계약(triageFailure·classifyReworkCapExhaustion 과 같은 양식). */
304
+ export interface SupervisorOverlayPick {
305
+ readonly outcome: SupervisorOverlayPickOutcome;
306
+ /** outcome='picked' 일 때 고른 선언 오버레이. */
307
+ readonly overlayId?: string;
308
+ readonly evidence: readonly string[];
309
+ }
310
+
311
+ /** `graphs/overlays/` 선언에서 `stage: heal` 인 것만 읽는다 — 고르기 후보의 실체. */
312
+ export function loadDeclaredHealOverlays(): readonly GraphOverlaySpec[] {
313
+ return loadGraphOverlays(defaultOverlaysDir()).overlays.filter((spec) => spec.stage === 'heal');
314
+ }
315
+
316
+ /**
317
+ * 선언된 heal 오버레이 후보 중 하나를 고른다. 조건이 맞는 후보가 여럿이면 선언 순서가
318
+ * 가장 앞인 것을 고른다(결정론). 던지지 않는다 — 못 고르는 이유는 evidence 가 말한다.
319
+ */
320
+ export function pickSupervisorHealOverlay(
321
+ input: SupervisorOverlayPickInput,
322
+ load: DeclaredHealOverlayLoader = loadDeclaredHealOverlays,
323
+ ): SupervisorOverlayPick {
324
+ let declared: readonly GraphOverlaySpec[];
325
+ try {
326
+ declared = load();
327
+ } catch (error) {
328
+ const why = error instanceof Error ? error.message : String(error);
329
+ return { outcome: 'no-declared-candidate', evidence: [`선언을 읽지 못했다: ${why}`] };
330
+ }
331
+ const healOnly = declared.filter((spec) => spec.stage === 'heal');
332
+ if (healOnly.length === 0) {
333
+ return { outcome: 'no-declared-candidate', evidence: ['선언된 heal 오버레이 후보가 없다'] };
334
+ }
335
+ const graphId = input.graphId ?? GRAPH_SPECS['self-implement']?.graphId;
336
+ if (!graphId) {
337
+ return { outcome: 'no-declared-candidate', evidence: ['활성 self-implement 그래프 선언이 없다'] };
338
+ }
339
+ let applied: readonly GraphOverlaySpec[];
340
+ try {
341
+ applied = selectOverlays(healOnly, { graphId, stage: 'heal', state: { ...input.state } }).applied;
342
+ } catch (error) {
343
+ const why = error instanceof Error ? error.message : String(error);
344
+ return { outcome: 'no-applicable-candidate', evidence: [`선언 조건 판정이 실패했다: ${why}`] };
345
+ }
346
+ const applicable = new Set(applied.map((spec) => spec.overlayId));
347
+ const first = healOnly.find((spec) => applicable.has(spec.overlayId));
348
+ if (!first) {
349
+ return { outcome: 'no-applicable-candidate', evidence: [`선언된 heal 후보 ${healOnly.length}개 중 조건이 맞는 것이 없다`] };
350
+ }
351
+ return { outcome: 'picked', overlayId: first.overlayId, evidence: [`선언된 heal 후보 ${healOnly.length}개 중 조건이 맞는 첫 선언: ${first.overlayId}`] };
352
+ }