elanous 0.2.41 → 0.2.43

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 (796) 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/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
  9. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{6874.d5cf7eb8edb2cabe.js → 1406.a1dc2ab6f8449374.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{5744.b9415e18ad623100.js → 1961.a81b12872c3e93a9.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/{3230-49298c3b73ef2268.js → 2268-53861f339e0b65a2.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/{9834.63ab2bbc3153172e.js → 2312.0c8b61e22d3136d7.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 2573.387a707f6f9d720c.js} +2 -2
  24. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 3072.01338851ca21a6f7.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
  28. package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3113.d7472bbc27d580c7.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{addc2b32.8c4ff8f0aefe987d.js → 3557ac4a.c8931684475018ad.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +79 -0
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → 363bfab3.9623b9f89363541f.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
  37. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
  42. package/apps/pwa/out/_next/static/chunks/4199.ce86b281fd0a60b7.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 4445.7990c76b3751a918.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
  52. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
  54. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
  56. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 5564.9e72532188f57586.js} +3 -3
  59. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5628.6ddb2d5ffba4ff4c.js +309 -0
  63. package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/{4133.2056bb4d78f621af.js → 5824.da9527b15a3221e5.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 5930.8b4df3b46c32b05a.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
  70. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
  73. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
  75. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 6540.c7bef57ad8f90a87.js} +16 -16
  78. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 6944.309f4e3ea54d1537.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +148 -0
  88. package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
  90. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
  93. package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
  96. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
  98. package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
  99. package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
  104. package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{2743.5d3f76948be32b34.js → 868.6e953be05bcf6dca.js} +2 -2
  106. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 8986.8e2e4efbfa655c59.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
  116. package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
  119. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{b2271e54.c1de3347976e90b0.js → aa57532f.510551854ff239b1.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-40f9e19149024298.js → page-79a8b5fee4c20871.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-a142dfb0331a05f5.js → page-ca2d09128c585ca4.js} +1 -1
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{53aeb4ee-51c92f8d683f5220.js → c7945435-b44d4dbe90ba0dcb.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → d96660fb.cbc21a2a88539dbb.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +122 -0
  177. package/apps/pwa/out/_next/static/chunks/{83184dcd-0ee6247ff41eb3f2.js → fb7d20d5-6892502b6ee39ca6.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  185. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +23 -23
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +23 -23
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +23 -23
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +22 -22
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +22 -22
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +23 -23
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +22 -22
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +23 -23
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +23 -23
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +22 -22
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +23 -23
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +24 -25
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +23 -23
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +23 -23
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +22 -22
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +23 -23
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +23 -23
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +24 -25
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +24 -25
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +22 -22
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +22 -22
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +23 -23
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +23 -23
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +22 -22
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +22 -22
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +22 -22
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +23 -23
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +23 -23
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +22 -22
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +23 -23
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +23 -23
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +23 -23
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +23 -23
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +23 -23
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +22 -22
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +23 -23
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +23 -23
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +23 -23
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +23 -23
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +23 -23
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +23 -23
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +23 -23
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +23 -23
  279. package/catalog/external-commands.yaml +5 -3
  280. package/catalog/meta/catalogVersion.yaml +2 -1
  281. package/catalog/signing/catalog-signing-public.pem +3 -0
  282. package/docs/goal-context/04-mock-scenarios.md +13 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/heal/heal-loop.yaml +1 -0
  285. package/graphs/intake/intake-daily.yaml +16 -0
  286. package/graphs/intake/news-sources.yaml +1 -0
  287. package/graphs/intake/recipes.yaml +7 -0
  288. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  289. package/graphs/overlays/stop-heal-ladder.yaml +113 -0
  290. package/graphs/profiles/local.yaml +5 -0
  291. package/graphs/profiles/pod.yaml +4 -0
  292. package/graphs/units/verbs/recipes.yaml +11 -11
  293. package/graphs/work/research-report.yaml +10 -2
  294. package/package.json +6 -2
  295. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  296. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  297. package/plugins/demo-browser-hand/plugin.json +13 -0
  298. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  299. package/plugins/demo-linear-secretary/plugin.json +15 -0
  300. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  301. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  302. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  303. package/plugins/demo-research/plugin.json +16 -0
  304. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  305. package/plugins/demo-video-briefing/plugin.json +15 -0
  306. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  307. package/scripts/build-signed-catalog.ts +48 -0
  308. package/scripts/ci-typecheck-main-delta.sh +88 -0
  309. package/scripts/codex-fallback-live-probe.ts +1 -1
  310. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  311. package/scripts/demo/demo1104-stage.config.ts +21 -0
  312. package/scripts/demo/demo1104-stage.ts +316 -0
  313. package/scripts/goal-method-audit.ts +17 -1
  314. package/scripts/graph-units/land-enqueue.ts +90 -0
  315. package/scripts/heal/run-role.ts +99 -5
  316. package/scripts/hooks/codex-notify.sh +32 -0
  317. package/scripts/install.sh +10 -38
  318. package/scripts/land-global-checks.ts +6 -1
  319. package/scripts/landing-heal/land-plan.ts +57 -0
  320. package/scripts/lib/decompose-ab.ts +1 -0
  321. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  322. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  323. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  324. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  325. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  326. package/scripts/lib/tui-regress-checks.ts +33 -13
  327. package/scripts/release-loop/auto-approve-node.ts +1 -1
  328. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  329. package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
  330. package/scripts/release-loop/gate-image-pin.ts +81 -0
  331. package/scripts/release-loop/gate-method.ts +139 -0
  332. package/scripts/release-loop/gate-node-sim.ts +207 -0
  333. package/scripts/release-loop/gate-node.ts +463 -64
  334. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  335. package/scripts/release-loop/gate-radius-live.ts +97 -13
  336. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  337. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  338. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  339. package/scripts/release-loop/node-verdict.ts +38 -25
  340. package/scripts/release-loop/preflight.ts +362 -8
  341. package/scripts/release-loop/resume-release.ts +83 -8
  342. package/scripts/release-loop/unattended-release.ts +20 -9
  343. package/scripts/rhythm/daily.ts +36 -4
  344. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  345. package/scripts/ux-sim.ts +18 -1
  346. package/scripts/video-pipeline.ts +9 -1
  347. package/scripts/warm-pool-provider-config.ts +286 -0
  348. package/skills/omni-crawl/SKILL.md +5 -2
  349. package/skills/omni-crawl/scripts/main.ts +84 -23
  350. package/src/acp/agent-manager.ts +1 -0
  351. package/src/acp/codex-app-server-agent.ts +33 -0
  352. package/src/acp/codex-app-server-client.ts +153 -16
  353. package/src/acp/core-turn-bridge.ts +27 -9
  354. package/src/acp/event-router.ts +20 -1
  355. package/src/acp/server.ts +6 -0
  356. package/src/agent/registry.ts +2 -0
  357. package/src/agent/task-notification.ts +25 -5
  358. package/src/agent/types.ts +6 -0
  359. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  360. package/src/agent-mission/claude-headless.ts +4 -1
  361. package/src/agent-mission/codex-exec.ts +105 -0
  362. package/src/agent-mission/driver.ts +192 -11
  363. package/src/agent-mission/grok-auth-status.ts +47 -0
  364. package/src/agent-mission/hand-hooks.ts +101 -0
  365. package/src/agent-mission/mission-cli.ts +63 -4
  366. package/src/agent-mission/mission-hand-reply.ts +118 -0
  367. package/src/agent-mission/mission-line.ts +180 -0
  368. package/src/agent-mission/mission-out.ts +833 -0
  369. package/src/agent-mission/tool-install.ts +200 -3
  370. package/src/agent-substrate/context-strategy.ts +4 -4
  371. package/src/agent-substrate/self-review-cli.ts +178 -13
  372. package/src/agents/general-purpose.md +1 -1
  373. package/src/auto-research/research-turn.ts +211 -53
  374. package/src/autopilot/pr-manager.ts +69 -10
  375. package/src/autopilot/pty-control-loop.ts +2 -0
  376. package/src/boot/daemon-tools/self-implement.ts +3 -1
  377. package/src/boot/daemon-tools/web-search.ts +1 -2
  378. package/src/briefing/brief-items.ts +55 -11
  379. package/src/capture/tui-self-report.ts +22 -6
  380. package/src/chat/index.ts +1 -1
  381. package/src/cli/agent-cli.ts +2 -1
  382. package/src/cli/catalog-cli.ts +31 -0
  383. package/src/cli/connector-cli.ts +16 -0
  384. package/src/cli/doctor-fix.ts +2 -2
  385. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  386. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  387. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  388. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  389. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  390. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  391. package/src/cli/intake-source-cli.ts +44 -8
  392. package/src/cli/msg-cli.ts +32 -3
  393. package/src/cli/pr-cli.ts +21 -1
  394. package/src/cli/pr-land-heavy-remote.ts +75 -5
  395. package/src/cli/pr-land-overlap-evidence.ts +113 -2
  396. package/src/cli/pr-land-pod-shadow-job.ts +202 -4
  397. package/src/cli/pr-land-pod-shadow.ts +9 -2
  398. package/src/cli/release-checklist-read-cli.ts +57 -19
  399. package/src/cli/release-cli.ts +23 -3
  400. package/src/cli/research-cli.ts +13 -5
  401. package/src/cli/setup-cli.ts +166 -6
  402. package/src/cli/setup-keys.ts +187 -0
  403. package/src/cli/task-plugin-wizard-host.ts +114 -0
  404. package/src/cli/tasks-cli.ts +61 -9
  405. package/src/cli/tui-test-cli.ts +186 -0
  406. package/src/compact/auto.ts +8 -1
  407. package/src/config.ts +4 -2
  408. package/src/connectors/linear-daily-progress.ts +228 -0
  409. package/src/connectors/linear-projector.ts +34 -12
  410. package/src/connectors/linear.ts +151 -7
  411. package/src/control-plane/ledger.ts +52 -2
  412. package/src/control-plane/server.ts +16 -2
  413. package/src/core-turn/deep-turn-bloom.ts +67 -0
  414. package/src/core-turn/research-policy.ts +37 -0
  415. package/src/core-turn/run-core-turn.ts +606 -95
  416. package/src/core-turn/run-goal-loop.ts +18 -0
  417. package/src/core-turn/types.ts +4 -0
  418. package/src/dashboard/chat/acp-chat.ts +10 -0
  419. package/src/dashboard/classic-sidetab-mission-job.ts +161 -0
  420. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  421. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  422. package/src/dashboard/classic-sidetab-mission.ts +347 -0
  423. package/src/dashboard/index.ts +517 -18
  424. package/src/dashboard/input/agent-wake.ts +23 -1
  425. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  426. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +17 -0
  427. package/src/dashboard/mission-cli-consumer.ts +165 -0
  428. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  429. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  430. package/src/dashboard/seat-boot-preamble.ts +171 -1
  431. package/src/dashboard/side-basic-runtime.ts +54 -1
  432. package/src/dashboard/sidetab-runtime.ts +90 -1
  433. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  434. package/src/dashboard/skill-detection-runtime.ts +55 -15
  435. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  436. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  437. package/src/dashboard/turn-preamble.ts +53 -15
  438. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  439. package/src/decisions/linear-progress-summary.ts +78 -0
  440. package/src/decisions/linear-progress-sync.ts +152 -0
  441. package/src/domains/outbound-alert.ts +49 -11
  442. package/src/domains/telegram-kind-route.ts +16 -9
  443. package/src/graph-runner/arg-allowance.ts +13 -0
  444. package/src/graph-runner/graph-cli.ts +23 -7
  445. package/src/graph-runner/graph-run-api.ts +3 -1
  446. package/src/graph-runner/graph-tick.ts +10 -2
  447. package/src/graph-runner/runner.ts +86 -18
  448. package/src/graph-wizard/mission-compose.ts +407 -12
  449. package/src/grok/agent-search.ts +14 -4
  450. package/src/grok/credential.ts +28 -11
  451. package/src/harness/dispatch-backpressure.ts +54 -1
  452. package/src/harness/dispatch-shadow-compare.ts +74 -0
  453. package/src/harness/harness-cli-command.ts +11 -1
  454. package/src/harness/harness-pod-dispatch.ts +81 -15
  455. package/src/harness/harness-stop.ts +155 -11
  456. package/src/harness/skill-exec.ts +21 -9
  457. package/src/harness/skill-select.ts +1 -1
  458. package/src/hooks/error-report-cloud.ts +101 -0
  459. package/src/hooks/receiver.ts +29 -2
  460. package/src/index.ts +159 -13
  461. package/src/instance/spawn-elanous.ts +6 -4
  462. package/src/intake-plane/actions.ts +354 -0
  463. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  464. package/src/intake-plane/intake-sources.ts +78 -8
  465. package/src/intake-plane/items.ts +14 -4
  466. package/src/intake-plane/linear-mission-sync.ts +80 -0
  467. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  468. package/src/intake-plane/linear-wish.ts +227 -1
  469. package/src/life/life-cli.ts +168 -0
  470. package/src/life/life-kinds.ts +160 -0
  471. package/src/live-supply/budget-consumer.ts +78 -0
  472. package/src/live-supply/read.ts +3 -0
  473. package/src/live-supply/snapshot.ts +45 -0
  474. package/src/llm/provider-credentials.ts +8 -2
  475. package/src/llm.ts +168 -9
  476. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  477. package/src/loops/orchestrator/tick.ts +13 -0
  478. package/src/maturity/feature-maturity.ts +4 -4
  479. package/src/msg/msg-sse-server.ts +3 -3
  480. package/src/msg/msg-store.ts +177 -19
  481. package/src/native-tool-catalog.ts +38 -4
  482. package/src/nexus/api/harness-traversal.ts +11 -0
  483. package/src/nexus/api/http-server.ts +37 -1
  484. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  485. package/src/nexus/index.ts +7 -2
  486. package/src/nexus/outbound/format.ts +9 -0
  487. package/src/nexus/outbound/router.ts +98 -13
  488. package/src/nexus/setup-status.ts +9 -0
  489. package/src/nexus/state/state.ts +3 -0
  490. package/src/oauth/codex-account-store.ts +20 -7
  491. package/src/oauth/codex-owner-mirror.ts +44 -0
  492. package/src/oauth/codex.ts +17 -2
  493. package/src/oauth/fallback-chain.ts +47 -17
  494. package/src/onboarding/first-run-doctor.ts +8 -1
  495. package/src/onboarding/first-run.ts +85 -26
  496. package/src/onboarding/key-setup.ts +103 -0
  497. package/src/onboarding/menu-answer.ts +13 -0
  498. package/src/onboarding/secret-prompt.ts +37 -0
  499. package/src/plugins/install/plugin-install.ts +59 -0
  500. package/src/pr-tool/census.ts +133 -2
  501. package/src/pty-shell/pty-control-ipc.ts +4 -1
  502. package/src/pty-shell/tui-run-state.ts +188 -2
  503. package/src/registry/catalog-server.ts +232 -0
  504. package/src/registry/loader.ts +45 -1
  505. package/src/registry/types.ts +1 -2
  506. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  507. package/src/release-loop/checklist.ts +9 -1
  508. package/src/repl/index.ts +43 -2
  509. package/src/research/axis-fanout.ts +136 -16
  510. package/src/research/bloom-exemplars.ts +3 -1
  511. package/src/research/gap-followup.ts +13 -1
  512. package/src/research/plugin-discovery.ts +36 -14
  513. package/src/research-bridge/invoke.ts +22 -5
  514. package/src/research-bridge/types.ts +2 -0
  515. package/src/self-dev/ask-launch-flow.ts +72 -1
  516. package/src/self-dev/decompose.ts +119 -5
  517. package/src/self-dev/dev-cli.ts +4 -1
  518. package/src/self-dev/dev-pipeline.ts +5 -0
  519. package/src/self-dev/draft-residue.ts +64 -5
  520. package/src/self-dev/graph-front-nodes.ts +2 -1
  521. package/src/self-dev/graph-journey-route.ts +76 -21
  522. package/src/self-dev/launch-preflight-text.ts +5 -6
  523. package/src/self-dev/launch-preflight.ts +58 -0
  524. package/src/self-dev/orchestrate.ts +13 -3
  525. package/src/self-dev/review-provider-fallback.ts +9 -2
  526. package/src/self-dev/run-supervisor.ts +42 -4
  527. package/src/self-dev/run-types.ts +4 -0
  528. package/src/self-dev/shard-aggregate.ts +4 -0
  529. package/src/self-dev/shard-run.ts +36 -15
  530. package/src/self-implement/abandoned-classification.ts +12 -3
  531. package/src/self-implement/budget-gate.ts +7 -0
  532. package/src/self-implement/child-llm-preference.ts +10 -1
  533. package/src/self-implement/doctor-visit.ts +118 -8
  534. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  535. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  536. package/src/self-implement/gate-artifacts.ts +2 -1
  537. package/src/self-implement/goal-author-cli.ts +4 -2
  538. package/src/self-implement/goal-author.ts +684 -7
  539. package/src/self-implement/graph-overlay-yaml.ts +37 -4
  540. package/src/self-implement/graph-overlay.ts +3 -1
  541. package/src/self-implement/graph-profile-yaml.ts +107 -0
  542. package/src/self-implement/graph-yaml.ts +26 -3
  543. package/src/self-implement/headless-elanous-driver.ts +31 -2
  544. package/src/self-implement/heal-intake.ts +112 -4
  545. package/src/self-implement/heal-triage.ts +20 -0
  546. package/src/self-implement/host-regate.ts +27 -4
  547. package/src/self-implement/merge-train.ts +5 -0
  548. package/src/self-implement/off-diff-evidence.ts +249 -5
  549. package/src/self-implement/orchestrator.ts +365 -25
  550. package/src/self-implement/regate-detail.ts +38 -1
  551. package/src/self-implement/rework-child-provider.ts +25 -0
  552. package/src/self-implement/run-chart.ts +122 -0
  553. package/src/self-implement/run-ledger.ts +162 -11
  554. package/src/self-implement/run-stop.ts +188 -4
  555. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  556. package/src/self-implement/stop-autoheal.ts +13 -0
  557. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  558. package/src/self-implement/train-gate-receipt.ts +166 -0
  559. package/src/self-implement/train-gate-remote.ts +62 -18
  560. package/src/session/chat.ts +40 -4
  561. package/src/session/session-fanout.ts +2 -0
  562. package/src/session/streaming/acp-stream-sink.ts +2 -1
  563. package/src/session/streaming/chunk-producer.ts +6 -0
  564. package/src/session/streaming/stream-compositor.ts +3 -2
  565. package/src/session-runtime/index.ts +135 -5
  566. package/src/session-runtime/retry-policy.ts +1 -1
  567. package/src/session-runtime/tier-flip.ts +3 -3
  568. package/src/setup/llm-env-detect.ts +3 -0
  569. package/src/setup/service-key-catalog.ts +46 -0
  570. package/src/setup/service-keys.ts +241 -0
  571. package/src/sidetab-core/model.ts +19 -5
  572. package/src/sidetab-core/visible-agent-mission.ts +262 -0
  573. package/src/skills/name-match.ts +20 -0
  574. package/src/skills/tools/agent.ts +53 -6
  575. package/src/skills/tools/omni-search.ts +173 -13
  576. package/src/task-agent/parent-host.ts +10 -0
  577. package/src/task-agent/pod-distributor-entry.ts +3 -0
  578. package/src/task-agent/repair-outcomes.ts +65 -0
  579. package/src/task-agent/task-hand.ts +47 -7
  580. package/src/task-orchestrator/dispatcher.ts +14 -1
  581. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  582. package/src/task-orchestrator/store.ts +16 -5
  583. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  584. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  585. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  586. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  587. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  588. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  589. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  590. package/src/task-orchestrator/surfaces/pod-source-receive.ts +178 -16
  591. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  592. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  593. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +237 -41
  594. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  595. package/src/task-orchestrator/surfaces/self-implement-pod.ts +337 -51
  596. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  597. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  598. package/src/task-orchestrator/types.ts +14 -0
  599. package/src/telegram.ts +14 -16
  600. package/src/terminal/coding-agent.ts +14 -5
  601. package/src/terminal/session-registry.ts +1 -1
  602. package/src/tokens.ts +35 -2
  603. package/src/tool-hints/gate.ts +1 -0
  604. package/src/tool-runtime/agent-runtime.ts +2 -0
  605. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  606. package/src/tool-runtime/browser-runtime.ts +2 -1
  607. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  608. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  609. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  610. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  611. package/src/tool-runtime/index.ts +6 -0
  612. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  613. package/src/tool-runtime/types.ts +4 -0
  614. package/src/tui/entry.ts +38 -5
  615. package/src/tui/sidetab/attach.ts +177 -1
  616. package/src/tui/sidetab/herdr-portal.ts +225 -0
  617. package/src/tui-client/local-chat-turn.ts +26 -13
  618. package/src/tui.ts +22 -0
  619. package/src/user-config.ts +34 -9
  620. package/src/user-intent/types.ts +4 -3
  621. package/src/ux-sim/browser-hand.ts +165 -0
  622. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  623. package/src/ux-sim/fake-browser-page.ts +81 -0
  624. package/src/ux-sim/fake-kubectl.ts +37 -3
  625. package/src/ux-sim/fake-linear-device.ts +31 -0
  626. package/src/ux-sim/fault-pool-cap.ts +11 -6
  627. package/src/ux-sim/graph-engine-sim.ts +47 -0
  628. package/src/ux-sim/linear-secretary.ts +216 -0
  629. package/src/ux-sim/mock-scenario-catalog.json +93 -0
  630. package/src/ux-sim/mock-scenario-catalog.ts +274 -0
  631. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  632. package/src/ux-sim/scenario.ts +185 -48
  633. package/src/ux-sim/service-key-setup.ts +50 -0
  634. package/src/ux-sim/term-slash-device.ts +74 -0
  635. package/src/ux-sim/turn-throw-sim.ts +31 -0
  636. package/src/version/packed-revision.json +1 -1
  637. package/src/voice/voice-tts-singleton.ts +18 -3
  638. package/src/web-search/exa.ts +77 -0
  639. package/src/web-search/grok.ts +5 -9
  640. package/src/web-search/index.ts +30 -9
  641. package/src/web-search/provider.ts +4 -1
  642. package/src/web-search/x-intent.ts +5 -0
  643. package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +0 -149
  644. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
  645. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
  647. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
  652. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
  654. package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
  665. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
  667. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
  671. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
  681. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
  682. package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
  683. package/apps/pwa/out/_next/static/chunks/4702.4a4adc1f16d7c93b.js +0 -64
  684. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
  691. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
  693. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
  696. package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
  699. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
  703. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +0 -62
  705. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
  706. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
  708. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/7191.fdc955f7d96064a4.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/8050-9b364bdef8f71927.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
  720. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +0 -93
  733. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
  738. package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
  794. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  795. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  796. /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -2,6 +2,7 @@ import { spawnSync } from 'node:child_process';
2
2
  import { existsSync, readFileSync } from 'node:fs';
3
3
  import { isAbsolute } from 'node:path';
4
4
  import { debug } from '../../src/debug/log.js';
5
+ import { parseGraphTemplateYaml, type LandUnitTrainPolicySpec } from '../../src/self-implement/graph-yaml.js';
5
6
 
6
7
  type RecordValue = Record<string, unknown>;
7
8
  type EnqueueResult = {
@@ -10,6 +11,93 @@ type EnqueueResult = {
10
11
  evidence: RecordValue;
11
12
  };
12
13
 
14
+ /** Facts collected by the train runner for one landing batch. Keep this input explicit:
15
+ * the graph unit enqueues one PR and cannot infer batch/theme/scenario facts itself. */
16
+ export type LandTrainObservation = {
17
+ readonly express: boolean;
18
+ readonly waitedForBatch: boolean;
19
+ readonly batchSize: number;
20
+ readonly groupBy: readonly string[];
21
+ readonly waitMinutes: number;
22
+ readonly scenarioSource: string;
23
+ readonly mockUsed: boolean;
24
+ readonly gateRuns: number;
25
+ readonly land: {
26
+ readonly perPr: string;
27
+ readonly pinnedHead: boolean;
28
+ readonly ejectOnFail: boolean;
29
+ readonly integrationPr: boolean;
30
+ };
31
+ };
32
+
33
+ export type LandPolicyDrift = {
34
+ readonly field: string;
35
+ readonly expected: unknown;
36
+ readonly observed: unknown;
37
+ };
38
+
39
+ function sameMembers(actual: readonly string[], expected: readonly string[]): boolean {
40
+ return actual.length === expected.length && expected.every((value) => actual.includes(value));
41
+ }
42
+
43
+ /** Compare runner-measured facts with the declared policy. Missing/invalid facts are drift,
44
+ * never an implicit pass. Express work bypasses batch size/theme waiting as declared. */
45
+ export function compareLandTrainPolicy(
46
+ policy: LandUnitTrainPolicySpec,
47
+ observed: LandTrainObservation,
48
+ ): LandPolicyDrift[] {
49
+ const drift: LandPolicyDrift[] = [];
50
+ const check = (field: string, expected: unknown, actual: unknown, matches: boolean): void => {
51
+ if (!matches) drift.push({ field, expected, observed: actual ?? null });
52
+ };
53
+ if (typeof observed.express !== 'boolean') {
54
+ check('/express', 'boolean', observed.express, false);
55
+ } else if (observed.express) {
56
+ check('/express/waitsForBatch', policy.express.waitsForBatch, observed.waitedForBatch, observed.waitedForBatch === policy.express.waitsForBatch);
57
+ } else {
58
+ const validSize = Number.isSafeInteger(observed.batchSize)
59
+ && observed.batchSize >= policy.batch.min && observed.batchSize <= policy.batch.max;
60
+ check('/batch/size', `${policy.batch.min}..${policy.batch.max}`, observed.batchSize, validSize);
61
+ check('/batch/groupBy', policy.batch.groupBy, observed.groupBy,
62
+ Array.isArray(observed.groupBy) && sameMembers(observed.groupBy, policy.batch.groupBy));
63
+ check('/batch/waitMinutes', `<=${policy.batch.maxWaitMin}`, observed.waitMinutes,
64
+ Number.isFinite(observed.waitMinutes) && observed.waitMinutes >= 0 && observed.waitMinutes <= policy.batch.maxWaitMin);
65
+ }
66
+ check('/scenarioPrebuild/source', policy.scenarioPrebuild.source, observed.scenarioSource,
67
+ policy.scenarioPrebuild.source.includes(observed.scenarioSource as typeof policy.scenarioPrebuild.source[number]));
68
+ check('/scenarioPrebuild/mock', policy.scenarioPrebuild.mock, observed.mockUsed,
69
+ observed.mockUsed === (policy.scenarioPrebuild.mock === 'required'));
70
+ check('/gate/runs', policy.gate.oncePerBatch ? 1 : 'unspecified', observed.gateRuns,
71
+ !policy.gate.oncePerBatch || observed.gateRuns === 1);
72
+ check('/land/perPr', policy.land.perPr, observed.land?.perPr, observed.land?.perPr === policy.land.perPr);
73
+ check('/land/pinnedHead', policy.land.pinnedHead, observed.land?.pinnedHead, observed.land?.pinnedHead === policy.land.pinnedHead);
74
+ check('/land/ejectOnFail', policy.land.ejectOnFail, observed.land?.ejectOnFail, observed.land?.ejectOnFail === policy.land.ejectOnFail);
75
+ check('/land/integrationPr', policy.land.integrationPr, observed.land?.integrationPr, observed.land?.integrationPr === policy.land.integrationPr);
76
+ return drift;
77
+ }
78
+
79
+ /** Runtime contract for the OP train runner: emit only on measured drift; tests inject the sink. */
80
+ export function observeLandPolicyDrift(
81
+ policy: LandUnitTrainPolicySpec,
82
+ observed: LandTrainObservation,
83
+ emit: (event: 'land.policy-drift', payload: { drift: readonly LandPolicyDrift[] }) => void = (_event, payload) => {
84
+ debug.log('land', 'policy-drift', payload, { level: 'warn' });
85
+ },
86
+ ): LandPolicyDrift[] {
87
+ const drift = compareLandTrainPolicy(policy, observed);
88
+ if (drift.length > 0) emit('land.policy-drift', { drift });
89
+ return drift;
90
+ }
91
+
92
+ function observeEnvelopePolicy(context: RecordValue, emit?: Parameters<typeof observeLandPolicyDrift>[2]): void {
93
+ if (context.landTrainObservation === undefined) return;
94
+ const parsed = parseGraphTemplateYaml(readFileSync(new URL('../../graphs/units/land/land.yaml', import.meta.url), 'utf8'), 'land.yaml');
95
+ const policy = parsed.template?.policy;
96
+ if (!policy) throw new Error(`land policy unavailable: ${parsed.errors.map((issue) => issue.message).join('; ')}`);
97
+ // Runtime envelopes are untrusted; the comparator treats absent fields as drift evidence.
98
+ observeLandPolicyDrift(policy, record(context.landTrainObservation) as unknown as LandTrainObservation, emit);
99
+ }
100
+
13
101
  function record(value: unknown): RecordValue {
14
102
  return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as RecordValue : {};
15
103
  }
@@ -29,8 +117,10 @@ export function runLandEnqueue(
29
117
  envelope: unknown,
30
118
  executable = process.env.ELANOUS_LAND_ENQUEUE,
31
119
  spawn: typeof spawnSync = spawnSync,
120
+ emitPolicyDrift?: Parameters<typeof observeLandPolicyDrift>[2],
32
121
  ): EnqueueResult {
33
122
  const context = record(record(envelope).context);
123
+ observeEnvelopePolicy(context, emitPolicyDrift);
34
124
  const rawPr = context.pr;
35
125
  const pr = typeof rawPr === 'number' ? rawPr : typeof rawPr === 'string' && /^\d+$/.test(rawPr) ? Number(rawPr) : NaN;
36
126
  const expectedHead = text(context.expectedHead);
@@ -16,7 +16,8 @@ import {
16
16
  type HealTriageHistory,
17
17
  type PathExists,
18
18
  } from '../../src/self-implement/heal-triage.js';
19
- import { loadRunLedger, runLedgerDir, type RunLedgerEntry } from '../../src/self-implement/run-ledger.js';
19
+ import { appendRunLedgerEntry, loadRunLedger, runLedgerDir, type RunLedgerEntry, type RunLedgerWriter } from '../../src/self-implement/run-ledger.js';
20
+ import { readDoctorVisits } from '../../src/self-implement/doctor-visit.js';
20
21
 
21
22
  interface GraphContext {
22
23
  graphId?: string;
@@ -51,6 +52,38 @@ function citationsOf(value: unknown): HealCitation[] {
51
52
  });
52
53
  }
53
54
 
55
+ function stringsAt(record: Record<string, unknown>, keys: readonly string[]): string[] {
56
+ return keys.flatMap((key) => {
57
+ const value = record[key];
58
+ return typeof value === 'string' ? [value] : Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [];
59
+ }).map((value) => value.trim()).filter(Boolean);
60
+ }
61
+
62
+ function materializedFacts(entries: readonly RunLedgerEntry[]): Record<string, unknown> {
63
+ const paths = new Set<string>();
64
+ const passed = new Set<string>();
65
+ const failed = new Set<string>();
66
+ const mustFix: string[] = [];
67
+ const diff: string[] = [];
68
+ let noProgressReason: string | undefined;
69
+ let reportDeficit = false;
70
+ for (const entry of entries) {
71
+ const data = entry.data ?? {};
72
+ if (entry.event === 'implemented') {
73
+ stringsAt(data, ['materializedPaths']).forEach((path) => paths.add(path));
74
+ }
75
+ stringsAt(data, ['passedTestNames', 'passedTests', 'testsPassed']).forEach((name) => passed.add(name));
76
+ stringsAt(data, ['failedTestNames', 'failedTests', 'testsFailed']).forEach((name) => failed.add(name));
77
+ if (entry.event === 'review-round-triage') stringsAt(data, ['rawMustFix']).forEach((item) => mustFix.push(item));
78
+ stringsAt(data, ['diffSummary', 'summary']).forEach((line) => diff.push(line.slice(0, 500)));
79
+ if (typeof data.noProgressReason === 'string') noProgressReason = data.noProgressReason;
80
+ if (data.terminationReason === 'no-progress') noProgressReason ??= typeof data.cause === 'string' ? data.cause : 'no-progress';
81
+ if (data.class === 'report-deficit' || data.abandonedClassification === 'report-deficit') reportDeficit = true;
82
+ }
83
+ return { ...(entries.length ? { materializedPaths: [...paths] } : {}), passedTestNames: [...passed], failedTestNames: [...failed], mustFix,
84
+ diffSummary: diff.slice(-10), ...(noProgressReason ? { noProgressReason } : {}), reportDeficit };
85
+ }
86
+
54
87
  function failureOf(ctx: GraphContext): HealFailureSignature {
55
88
  const input = asRecord(ctx.input);
56
89
  const raw = asRecord(input?.failure) ?? input ?? {};
@@ -66,6 +99,11 @@ function failureOf(ctx: GraphContext): HealFailureSignature {
66
99
  ...(typeof raw.environmentClaim === 'string' ? { environmentClaim: raw.environmentClaim } : {}),
67
100
  ...(typeof raw.namedSource === 'string' ? { namedSource: raw.namedSource } : {}),
68
101
  ...(typeof raw.errorText === 'string' ? { errorText: raw.errorText } : {}),
102
+ ...(typeof raw.goalText === 'string' ? { goalText: raw.goalText } : {}),
103
+ ...(typeof raw.noProgressReason === 'string' ? { noProgressReason: raw.noProgressReason } : {}),
104
+ ...(typeof raw.reportDeficit === 'boolean' ? { reportDeficit: raw.reportDeficit } : {}),
105
+ ...(Array.isArray(raw.mustFix) ? { mustFix: raw.mustFix.filter((item): item is string => typeof item === 'string') } : {}),
106
+ ...(Array.isArray(raw.materializedPaths) ? { materializedPaths: raw.materializedPaths.filter((item): item is string => typeof item === 'string') } : {}),
69
107
  ...(citations.length ? { citations } : {}),
70
108
  };
71
109
  }
@@ -103,6 +141,8 @@ export interface HealRoleDeps {
103
141
  ledgerDir?: string;
104
142
  search?: (query: string) => unknown;
105
143
  stateRoot?: string;
144
+ writeLedger?: RunLedgerWriter;
145
+ readVisits?: (runId: string) => ReturnType<typeof readDoctorVisits>;
106
146
  }
107
147
 
108
148
  function gitHeadExists(worktree: string, path: string): PathExists {
@@ -132,6 +172,11 @@ function signatureFromUnknown(value: unknown): HealFailureSignature | undefined
132
172
  ...(typeof raw.environmentClaim === 'string' ? { environmentClaim: raw.environmentClaim } : {}),
133
173
  ...(typeof raw.namedSource === 'string' ? { namedSource: raw.namedSource } : {}),
134
174
  ...(typeof raw.errorText === 'string' ? { errorText: raw.errorText } : {}),
175
+ ...(typeof raw.goalText === 'string' ? { goalText: raw.goalText } : {}),
176
+ ...(typeof raw.noProgressReason === 'string' ? { noProgressReason: raw.noProgressReason } : {}),
177
+ ...(typeof raw.reportDeficit === 'boolean' ? { reportDeficit: raw.reportDeficit } : {}),
178
+ ...(Array.isArray(raw.mustFix) ? { mustFix: raw.mustFix.filter((item): item is string => typeof item === 'string') } : {}),
179
+ ...(Array.isArray(raw.materializedPaths) ? { materializedPaths: raw.materializedPaths.filter((item): item is string => typeof item === 'string') } : {}),
135
180
  ...(citations.length ? { citations } : {}),
136
181
  };
137
182
  return Object.keys(signature).length ? signature : undefined;
@@ -255,17 +300,36 @@ export function roleResult(role: string, ctx: GraphContext, deps: HealRoleDeps =
255
300
  .filter(row => row.source === selector.source && row.ref === selector.ref)
256
301
  .sort((a, b) => Date.parse(b.at) - Date.parse(a.at)).at(0);
257
302
  if (!event) return withAddedFacts({ outcome: 'empty', reason: 'inbox-event-not-found' }, []);
258
- return withAddedFacts({ outcome: 'ok', entries: [{ errorText: event.summary }], event }, ['errorText']);
303
+ const runId = event.ref;
304
+ let ledger: RunLedgerEntry[] | null = null;
305
+ let visits: ReturnType<typeof readDoctorVisits> = [];
306
+ try {
307
+ ledger = deps.loadLedger ? deps.loadLedger(runId)
308
+ : loadRunLedger(runId, deps.ledgerDir ?? (deps.stateRoot ? runLedgerDir(deps.stateRoot) : undefined));
309
+ visits = deps.readVisits ? deps.readVisits(runId)
310
+ : readDoctorVisits(runId, deps.ledgerDir || deps.stateRoot ? { dir: deps.ledgerDir ?? runLedgerDir(deps.stateRoot!) } : {});
311
+ } catch { /* inbox refs can be non-ledger identifiers; absent evidence remains absent */ }
312
+ const facts = materializedFacts(ledger ?? []);
313
+ return withAddedFacts({ outcome: 'ok', entries: [{ errorText: event.summary, goalText: event.goalText,
314
+ goalId: event.goalId, goalFile: event.goalFile, ...facts, doctorVisits: visits }], event }, ['errorText', 'materializedPaths', 'doctorVisits']);
259
315
  }
260
316
  if (!asRecord(input.failure) && Object.keys(failure).length === 0) return withAddedFacts({ outcome: 'empty' }, []);
261
317
  const worktree = typeof input.worktree === 'string' ? input.worktree : '';
318
+ const runId = typeof input.runId === 'string' ? input.runId : '';
319
+ const ledger = runId ? (deps.loadLedger
320
+ ? deps.loadLedger(runId)
321
+ : loadRunLedger(runId, deps.ledgerDir ?? (process.env.ELANOUS_STATE_DIR ? runLedgerDir(process.env.ELANOUS_STATE_DIR) : undefined))) : null;
322
+ const doctorVisits = runId ? readDoctorVisits(runId, deps.ledgerDir ? { dir: deps.ledgerDir } : {}) : [];
262
323
  const paths = signature.unverified ?? [];
263
- if (!worktree || paths.length === 0) return withAddedFacts({ outcome: 'ok', entries: [signature] }, []);
324
+ const materialized = (ledger ?? []).filter((entry) => ['implemented', 'gated', 'reviewed', 'implement-abort-reason'].includes(entry.event))
325
+ .map((entry) => ({ event: entry.event, data: entry.data }));
326
+ const runEvidence = runId ? { materialized, doctorVisits } : {};
327
+ if (!worktree || paths.length === 0) return withAddedFacts({ outcome: 'ok', entries: [{ ...signature, ...runEvidence }] }, []);
264
328
  const exists = deps.exists ?? defaultExists(worktree);
265
329
  const marked = markDeletedUnverified(paths, exists);
266
330
  const changed = marked.some((path, index) => path !== paths[index]);
267
331
  const entry: HealFailureSignature = { ...signature, unverified: marked };
268
- return withAddedFacts({ outcome: 'ok', entries: [entry] }, changed ? ['unverified'] : []);
332
+ return withAddedFacts({ outcome: 'ok', entries: [{ ...entry, ...runEvidence }] }, changed ? ['unverified'] : []);
269
333
  }
270
334
  case 'triage': {
271
335
  const merged = mergedContextSignature(signature, ctx.outputs);
@@ -294,8 +358,38 @@ export function roleResult(role: string, ctx: GraphContext, deps: HealRoleDeps =
294
358
  const urls = citations.length ? `\n근거: ${citations.map((citation) => citation.url).join(' · ')}` : '';
295
359
  return withAddedFacts({ outcome: 'ok', next: 'implement', 'rework-note': `${file} 의 ${symbol} 을 고친다${urls}` }, []);
296
360
  }
361
+ case 'revise-goal': {
362
+ const collected = outputRecord(ctx.outputs, 'collect');
363
+ const collectedEntry = Array.isArray(collected?.entries) ? asRecord(collected.entries[0]) : undefined;
364
+ const goal = typeof input.goal === 'string' ? input.goal : typeof collectedEntry?.goalText === 'string' ? collectedEntry.goalText
365
+ : typeof failure.goal === 'string' ? failure.goal : '';
366
+ const paths = stringsAt(collectedEntry ?? failure, ['materializedPaths']);
367
+ const failures = stringsAt(collectedEntry ?? failure, ['failedTestNames']);
368
+ const mustFix = stringsAt(collectedEntry ?? failure, ['mustFix']);
369
+ const doctorVisits = Array.isArray(collectedEntry?.doctorVisits) ? collectedEntry.doctorVisits : [];
370
+ const before = goal.split(/\r?\n/).find((line) => /^\s*(?:[-*]\s*)?대상 경로\s*[::]/i.test(line));
371
+ if (!paths.length || !before) return withAddedFacts({ outcome: 'fail', reason: 'insufficient-materialized-evidence', needsHuman: true,
372
+ evidence: { changedPaths: paths, targetLineFound: Boolean(before), doctorVisits } }, []);
373
+ const after = `대상 경로: ${paths.join(', ')}`;
374
+ const revised = before !== after ? goal.replace(before, after) : '';
375
+ if (!revised) return withAddedFacts({ outcome: 'fail', reason: 'goal-not-revisable', needsHuman: true,
376
+ evidence: { changedPaths: paths, doctorVisits } }, []);
377
+ const changed = revised !== goal;
378
+ const diff = changed ? [`- ${before}`, `+ ${after}`] : [];
379
+ const runId = typeof input.runId === 'string' ? input.runId : typeof ctx.runId === 'string' ? ctx.runId : '';
380
+ if (runId) {
381
+ const at = new Date().toISOString();
382
+ const write = deps.writeLedger ?? ((entry: RunLedgerEntry) => { appendRunLedgerEntry(entry, deps.ledgerDir ?? (process.env.ELANOUS_STATE_DIR ? runLedgerDir(process.env.ELANOUS_STATE_DIR) : undefined)); });
383
+ write({ timestamp: at, runId, event: 'goal-refined', data: { outcome: 'refined', reason: 'materialized-run-mismatch', changedLines: diff, relaunchCount: 1 } });
384
+ write({ timestamp: at, runId, event: 'reauthor-relaunch-request', data: { target: 'same-cell', count: 1, revisedGoal: revised } });
385
+ }
386
+ return withAddedFacts({ outcome: 'ok', next: 'implement', reauthor: true, revisedGoal: revised,
387
+ goalDiff: diff, evidence: { changedPaths: paths, failedTests: failures, mustFix, noProgressReason: collectedEntry?.noProgressReason ?? signature.noProgressReason ?? '', doctorVisits,
388
+ passedTestNames: stringsAt(collectedEntry ?? failure, ['passedTestNames']), diffSummary: stringsAt(collectedEntry ?? failure, ['diffSummary']) },
389
+ followUpSuggestion: '<CELL>-FU: 남은 한 조각을 별도 칸으로 제안한다.', relaunchCount: 1,
390
+ event: 'goal-refined', eventData: { reason: 'materialized-run-mismatch', goalDiff: diff } }, ['revisedGoal', 'goalDiff']);
391
+ }
297
392
  case 'verify':
298
- case 'revise-goal':
299
393
  return withAddedFacts({ outcome: 'fail', reason: 'not-wired' }, []);
300
394
  case 'observe-deeper': {
301
395
  const runId = typeof input.runId === 'string' ? input.runId : '';
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bash
2
+ # ── Codex CLI notify hook — 손(hand) progress 전달 (HAND-HOOKS-NEXUS-STATUS · 2026-10-30) ──
3
+ #
4
+ # OP #54582 승인 · TC #54571 계약 기반. Codex notify 실행 시 알림 JSON 을 기존 계약
5
+ # `POST /v1/missions/{missionId}/line`(src/agent-mission/mission-line.ts · postMissionLineEvent)로
6
+ # **type:progress** 한 건만 보낸다. final 은 명시적 `mission reply --done` 전용,
7
+ # ask/answer/correct 는 예약 — 이 훅은 progress 만 보낸다.
8
+ #
9
+ # 인증: missionId+attemptId+손별 Bearer. token 은 child env 에만 둔다:
10
+ # ELANOUS_HAND_TOKEN — 손별 Bearer token(인자·파일 저장 금지)
11
+ # ELANOUS_MISSION_ID · ELANOUS_ATTEMPT_ID — 현재 미션/시도
12
+ # ELANOUS_NEXUS_URL — (선택) 계약 endpoint base
13
+ # 자격이 없으면 조용히 exit 0(fail-soft — 훅이 Codex 를 막지 않는다).
14
+ # PWA 손 카드 제외(TC graphEvents node-added kind=hand · DEMO1104-ARG-ADAPTIVE-VIEW가 렌더).
15
+ # OSC 는 폴백이며 화면 scraping 은 하지 않는다. 병렬 송신 없음(Pod concurrency=1).
16
+ #
17
+ # 인자/stdin: Codex 가 주는 notify JSON {tool_name, cwd, ...} — Codex 는 notify JSON 을
18
+ # 인자 하나(argv[1])로 넘기고, stdin 은 폴백이다.
19
+
20
+ set -uo pipefail
21
+ # Codex notify 프로그램 규약: JSON 을 argv[1] 로 받는다 — 인자가 없으면 stdin 을 읽는다.
22
+ if [ "$#" -gt 0 ]; then INPUT="$1"; else INPUT="$(cat)"; fi
23
+
24
+ HAND_CLI="$(cd "$(dirname "$0")/../.." && pwd)/src/agent-mission/hand-hooks.ts"
25
+
26
+ if [ -n "${ELANOUS_HAND_TOKEN:-}" ] && [ -n "${ELANOUS_MISSION_ID:-}" ] && [ -n "${ELANOUS_ATTEMPT_ID:-}" ] \
27
+ && command -v bun >/dev/null 2>&1 && [ -f "$HAND_CLI" ]; then
28
+ # 논블로킹(백그라운드 &)·출력 버림 — notify 경로를 지연시키지 않는다.
29
+ printf '%s' "$INPUT" | bun "$HAND_CLI" codex-notify >/dev/null 2>&1 &
30
+ fi
31
+
32
+ exit 0
@@ -154,7 +154,6 @@ missing_prerequisites() {
154
154
  command -v curl >/dev/null 2>&1 || MISSING+=(curl)
155
155
  command -v unzip >/dev/null 2>&1 || MISSING+=(unzip) # bun 공식 설치기가 쓴다
156
156
  fi
157
- command -v git >/dev/null 2>&1 || MISSING+=(git)
158
157
  }
159
158
  missing_prerequisites
160
159
  INSTALLED_DEPS=''
@@ -192,8 +191,9 @@ if ! command -v bun >/dev/null 2>&1 && [ "$BOOTSTRAP_BUN" -eq 1 ]; then
192
191
  fi
193
192
  fi
194
193
 
195
- # Keep this explicit set aligned with catalog/external-commands.yaml required entries.
196
- REQUIRED_COMMANDS=(git bun)
194
+ # Git enables repository/worktree features but is not needed to boot the installed TUI.
195
+ # Keep this set aligned with the runtime-required entries in catalog/external-commands.yaml.
196
+ REQUIRED_COMMANDS=(bun)
197
197
  HARNESS_COMMANDS=(gh rg codex)
198
198
  for command in "${REQUIRED_COMMANDS[@]}"; do
199
199
  if ! command -v "$command" >/dev/null 2>&1; then
@@ -379,27 +379,23 @@ if [ ! -f "$VERSION_DIR/package.json" ]; then
379
379
  fi
380
380
  # 🩸 2026-09-24 빈 GCP VM 실측: `--offline` 만 쓰면 bun 캐시가 빈 새 기계에서 의존성이 «전부» failed to resolve — 어떤
381
381
  # 새 기계에서도 설치가 안 됐다(이 맥은 캐시가 차 있어 가려졌다). ⇒ 캐시로 먼저(빠르고 네트워크 없음) ⊕ 실패하면 레지스트리.
382
- # 🩸 2026-09-24 빈 VM 실측: apt `nodejs npm` 이 있으면 PATH 의 node(v18)·node-gyp(9.3.0)가 node-pty 를 빌드해
383
- # bun 이 불러오는 순간 panic(uv_version_string)으로 죽었다. ⇒ 빌드 동안만 node=bun · node-gyp=최신 심을 PATH 앞에
384
- # (src/native/native-build-env.ts 와 같은 심).
385
- NATIVE_SHIM="$(mktemp -d "${TMPDIR:-/tmp}/elanous-native-build.XXXXXX")"
386
- ln -s "$BUN_EXEC" "$NATIVE_SHIM/node"
387
- printf '#!/bin/sh\nexec "%s" x node-gyp@latest "$@"\n' "$BUN_EXEC" > "$NATIVE_SHIM/node-gyp"
388
- chmod +x "$NATIVE_SHIM/node-gyp"
389
- if ! (cd "$VERSION_DIR" && PATH="$NATIVE_SHIM:$PATH" bun add --no-save --offline "$INSTALL_TARBALL" >/dev/null 2>&1); then
382
+ # Bun is the only runtime prerequisite. Skip lifecycle scripts: Bun otherwise runs optional
383
+ # utf-8-validate native builds on bare Ubuntu and fails without Python/compiler. Optional prebuilt
384
+ # packages (for example sharp) remain in the dependency graph.
385
+ if ! (cd "$VERSION_DIR" && bun add --no-save --ignore-scripts --offline "$INSTALL_TARBALL" >/dev/null 2>&1); then
390
386
  echo "dependencies not in the local bun cache — fetching them from the npm registry" >&2
391
387
  # bun prints «Blocked N postinstalls» and progress noise here — keep it out of the screen unless this step fails.
392
388
  ADD_LOG="$(mktemp "${TMPDIR:-/tmp}/elanous-bun-add.XXXXXX")"
393
389
  ADD_RC=0
394
- (cd "$VERSION_DIR" && PATH="$NATIVE_SHIM:$PATH" bun add --no-save "$INSTALL_TARBALL") >"$ADD_LOG" 2>&1 || ADD_RC=$?
390
+ (cd "$VERSION_DIR" && bun add --no-save --ignore-scripts "$INSTALL_TARBALL") >"$ADD_LOG" 2>&1 || ADD_RC=$?
395
391
  if [ "$ADD_RC" -ne 0 ]; then
396
392
  tail -n 20 "$ADD_LOG" >&2
397
- rm -f "$ADD_LOG"; rm -rf "$NATIVE_SHIM"
393
+ rm -f "$ADD_LOG"
398
394
  exit "$ADD_RC"
399
395
  fi
400
396
  rm -f "$ADD_LOG"
401
397
  fi
402
- rm -rf "$NATIVE_SHIM"
398
+ echo "If an optional native feature is unavailable, run 'elanous doctor --fix --yes' for repair guidance. The Bun TUI needs no system Node.js, Python, or compiler." >&2
403
399
  ln -sfn "versions/$VERSION_NAME" "$PREFIX/current"
404
400
  mkdir -p "$PREFIX/bin"
405
401
  # 절대 bun 경로를 설치 때 박고 엔트리는 current 를 거친다 — cron/systemd 의 짧은 PATH 와 판 전환 모두 지원.
@@ -478,30 +474,6 @@ if [ "$START_SETUP" -eq 0 ]; then
478
474
  fi
479
475
  # 🆕 2026-09-24 빈 VM 실측: 하니스(codex 백엔드)는 Codex CLI 를 자식으로 띄우는데 빈 기계엔 codex·node 가 «둘 다» 없었다.
480
476
  # ⚠️ 아래 설치 줄은 빈 기계에서 아직 «안 쟀다» — `elanous doctor` 의 codex 줄이 판정한다.
481
- # C++20 toolchain must precede node-pty's rebuild; only suggest missing prerequisites.
482
- if ! command -v make >/dev/null 2>&1 || ! command -v c++ >/dev/null 2>&1; then
483
- case "$(uname -s)" in
484
- Darwin) BUILD_HINT='xcode-select --install' ;;
485
- Linux)
486
- OS_ID='' OS_LIKE=''
487
- if [ -r "${ELANOUS_INSTALL_OS_RELEASE_FILE:-/etc/os-release}" ]; then
488
- while IFS='=' read -r key value; do
489
- value="${value#\"}"; value="${value%\"}"
490
- case "$key" in ID) OS_ID="$value" ;; ID_LIKE) OS_LIKE="$value" ;; esac
491
- done < "${ELANOUS_INSTALL_OS_RELEASE_FILE:-/etc/os-release}"
492
- fi
493
- BUILD_HINT=''
494
- case " $OS_ID $OS_LIKE " in
495
- *' debian '*|*' ubuntu '*) BUILD_HINT='sudo apt-get install -y build-essential' ;;
496
- *' fedora '*) BUILD_HINT='sudo dnf groupinstall -y "Development Tools"' ;;
497
- esac ;;
498
- *) BUILD_HINT='' ;;
499
- esac
500
- if [ -n "$BUILD_HINT" ]; then
501
- echo " $STEP) $BUILD_HINT"; STEP=$((STEP + 1))
502
- fi
503
- echo " $STEP) elanous doctor --fix --yes # $(t 'rebuild node-pty after installing build tools' '빌드 도구를 깐 뒤 node-pty 다시 빌드')"; STEP=$((STEP + 1))
504
- fi
505
477
  if ! command -v rg >/dev/null 2>&1; then
506
478
  if [ -z "${OS_ID:-}" ] && [ -r "${ELANOUS_INSTALL_OS_RELEASE_FILE:-/etc/os-release}" ]; then
507
479
  while IFS='=' read -r key value; do
@@ -62,8 +62,13 @@ function runNextMdCheck(cwd: string): LandGlobalChecksRun {
62
62
  const prfaq = join(dir, 'prfaq.md');
63
63
  writeFileSync(prfaq, '');
64
64
  try {
65
+ // The parent may itself be a release graph node. Its context points at temporary graph outputs
66
+ // (including docs worktrees already removed by the time pr land runs); this checker must inspect
67
+ // the checkout paths passed below instead of inheriting that unrelated graph input.
68
+ const env = { ...process.env };
69
+ delete env.ELANOUS_GRAPH_CONTEXT;
65
70
  const r = spawnSync('bun', [CHECK_NODE_SCRIPT, '--landing', '--prfaq', prfaq, '--files', 'release/next.md'], {
66
- cwd, encoding: 'utf8', maxBuffer: 8 * 1024 * 1024, timeout: 60_000,
71
+ cwd, encoding: 'utf8', maxBuffer: 8 * 1024 * 1024, timeout: 60_000, env,
67
72
  });
68
73
  return { status: r.status, output: `${r.stdout ?? ''}\n${r.stderr ?? ''}`, ...(r.error ? { error: r.error.message } : {}) };
69
74
  } finally {
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env bun
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { isAbsolute } from 'node:path';
4
+ import { planTrain, type TrainCandidate, type TrainDeferred } from '../../src/self-implement/merge-train.js';
5
+ import type { L8ShadowQueueState } from '../../src/self-implement/l8-merge-queue.js';
6
+
7
+ export const LAND_PLAN_MAX_BATCH = 8;
8
+
9
+ type LandPlan = { batch: TrainCandidate[]; deferred: TrainDeferred[] };
10
+
11
+ function inputPath(args: readonly string[]): string {
12
+ if (args.length !== 2 || args[0] !== '--input') throw new Error('usage: land-plan.ts --input <absolute-json-path>');
13
+ const path = args[1];
14
+ if (!path || !isAbsolute(path)) throw new Error('--input requires an absolute path');
15
+ if (!existsSync(path)) throw new Error('input file missing');
16
+ return path;
17
+ }
18
+
19
+ function isQueueState(value: unknown): value is L8ShadowQueueState {
20
+ if (!value || typeof value !== 'object' || !('pending' in value) || !Array.isArray(value.pending)
21
+ || !value.pending.every((item) => item && typeof item === 'object'
22
+ && Number.isSafeInteger(item.number) && item.number > 0
23
+ && typeof item.head === 'string' && /^[0-9a-f]{40}$/i.test(item.head)
24
+ && (item.files === undefined || Array.isArray(item.files) && item.files.every((file: unknown) => typeof file === 'string'))
25
+ && (item.filesUnmeasured === undefined || item.filesUnmeasured === true))
26
+ || !('verdicts' in value) || !Array.isArray(value.verdicts)
27
+ || !('deferred' in value ? Array.isArray(value.deferred) : true)) return false;
28
+ return true;
29
+ }
30
+
31
+ function candidates(state: L8ShadowQueueState): TrainCandidate[] {
32
+ return state.pending.map(({ number, head, files, filesUnmeasured }) => ({
33
+ number,
34
+ head,
35
+ ...(files === undefined ? {} : { files }),
36
+ ...(filesUnmeasured === undefined ? {} : { filesUnmeasured }),
37
+ }));
38
+ }
39
+
40
+ export function planLandQueue(state: unknown): LandPlan {
41
+ if (!isQueueState(state)) throw new Error('invalid shadow queue ledger');
42
+ return planTrain(candidates(state), { maxBatch: LAND_PLAN_MAX_BATCH });
43
+ }
44
+
45
+ export function runLandPlan(args: readonly string[]): LandPlan {
46
+ const state: unknown = JSON.parse(readFileSync(inputPath(args), 'utf8'));
47
+ return planLandQueue(state);
48
+ }
49
+
50
+ if (import.meta.main) {
51
+ try {
52
+ process.stdout.write(`${JSON.stringify(runLandPlan(process.argv.slice(2)))}\n`);
53
+ } catch (error) {
54
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
55
+ process.exitCode = 1;
56
+ }
57
+ }
@@ -204,6 +204,7 @@ function armSummary(records: readonly DecomposeAbRecord[], expectedRecords: numb
204
204
  'missing-research-context': 0,
205
205
  'grounding-empty': 0,
206
206
  'authored-empty': 0,
207
+ 'slice-rejected': 0,
207
208
  'llm-failed': 0,
208
209
  };
209
210
  for (const record of observed) outcomes[record.measurement.outcome] += 1;
@@ -0,0 +1,15 @@
1
+ elanous 0.2.41 · owner · daemon: online
2
+ ┌─ Dashboard help ─────────────────────────────────────────────┐
3
+ │ Commands │
4
+ │ ▸ 대화 │
5
+ │ /help 이 명령들 목록 │
6
+ │ /new 새 대화 시작 │
7
+ │ /quit 종료 │
8
+ │ │
9
+ │ Keys │
10
+ │ Enter 메시지 보내기 │
11
+ │ Ctrl+C 입력 지움 · 두 번 누르면 나갑니다 │
12
+ │ Esc 도움말 닫기 │
13
+ │ PgUp/PgDn 스크롤 │
14
+ └──────────────────────────────────────────────────────────────┘
15
+ ❯
@@ -0,0 +1,42 @@
1
+ PtyShellSnapshot process_id=pty_43b7df65 status=running source=live
2
+ [screen 160x40 cursor=(row 36, col 2, visible true)]
3
+ ─┤ ChatLog ├───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
4
+ elanous | daemon: absent · start: elanous --test=/private/var/folders/ws/f7tkbp2d4mg7_98pvhllpt140000gn/T/elanous-drive-UG60Kh nexus run --hmr
5
+
6
+
7
+
8
+
9
+
10
+ ┌─────────────────────────────────────────────── Dashboard help ───────────────────────────────────────────────┐
11
+ │Commands │
12
+ │▸ 시작 /clear (cls) 대화 기록 지우기 │
13
+ │/help (?) 명령과 키 보기 /model (m) 모델 바꾸기 — /model 빠름|보통|깊음 (코드… │
14
+ │/resume 지난 대화 이어 가기 · /resume <id 앞자리> /status (st) 지금 상태 — 모델 · 연결 · 계정 │
15
+ │▸ 지켜보기 /now 현재 맥락과 출처 표 — /now [주제] │
16
+ │/remaining 계정별 남은 사용량 ▸ 조사하기 │
17
+ │/context (ctx) Show / clear / drop attached files ▸ 판단하기 │
18
+ │/decide (dec) 열린 결정 카드 보기·답하기 — /decide [… ▸ 만들기 │
19
+ │/harness Harness — /harness <goal> (self-dev) · plan… ▸ 기억하기 │
20
+ │/memory (mem) Memory ops — list / show / search / ad… /session (sess) Session resume — list / load / sync … │
21
+ │▸ 그 밖 /quit (q, exit) 나가기 │
22
+ │/setup 상세 설정 — /setup · /setup reset(다음 실행 … /side 사이드탭 기초 — 목록 · 셸 생성 · 번호로 PTY 보… │
23
+ │ │
24
+ │Keys │
25
+ │Enter Send message │
26
+ │Esc Stop the answer (Esc again = rewind) · clear input / close help │
27
+ │Ctrl+U Clear text before cursor │
28
+ │Ctrl+W Delete previous word │
29
+ │Ctrl+← / → Move by word │
30
+ │Delete Delete next character │
31
+ │Home / End Move to start / end of line │
32
+ │Ctrl+A / E Move to start / end of line │
33
+ │PgUp / PgDn Scroll chat log │
34
+ │Ctrl+↑ Recall all queued lines (Enter while answering queues · empty Enter pushes now) │
35
+ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
36
+
37
+
38
+ ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
39
+ ❯
40
+ ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
41
+
42
+ 📁 work/OP-release-0241-resume │ ⌥ 트리 HEAD@02594ba │ ▶ 실행 02594ba │ gpt-6-luna │ ⛭ pid:56132 │ ctx 0 │ 🖥 MacBookProM5
@@ -0,0 +1,21 @@
1
+ elanous 0.2.41 · owner · daemon: online
2
+ ┌─ Dashboard help ─────────────────────────────────────────────┐
3
+ │ Commands │
4
+ │ ▸ 대화 │
5
+ │ /help 이 명령들 목록 │
6
+ │ /new 새 대화 시작 │
7
+ │ /quit 종료 │
8
+ │ ▸ 지시 │
9
+ │ /directive 대표 지시 │
10
+ │ /decide 결정 요청 │
11
+ │ ▸ 작업 │
12
+ │ /missions 미션 목록 │
13
+ │ /tasks 작업 목록 │
14
+ │ /review 리뷰 열기 │
15
+ │ /publish 발행 │
16
+ │ ▸ 시스템 │
17
+ │ /provider LLM 공급자 │
18
+ │ /model 모델 │
19
+ │ /settings 설정 │
20
+ └──────────────────────────────────────────────────────────────┘
21
+ ❯
@@ -0,0 +1,51 @@
1
+ [screen 160x50 cursor=(row 46, col 2, visible true)]
2
+ ─┤ ChatLog ├───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
3
+ elanous | daemon: absent · start: elanous --test=/var/folders/ws/f7tkbp2d4mg7_98pvhllpt140000gn/T/tui-regress-R6-EL8CgF nexus run --hmr
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+ ┌─────────────────────────────────────────────── Dashboard help ───────────────────────────────────────────────┐
15
+ │Commands │
16
+ │▸ 시작 /clear (cls) 대화 기록 지우기 │
17
+ │/help (?) 명령과 키 보기 /model (m) 모델 바꾸기 — /model 빠름|보통|깊음 (코드… │
18
+ │/resume 지난 대화 이어 가기 · /resume <id 앞자리> /status (st) 지금 상태 — 모델 · 연결 · 계정 │
19
+ │▸ 지켜보기 /now 현재 맥락과 출처 표 — /now [주제] │
20
+ │/remaining 계정별 남은 사용량 ▸ 조사하기 │
21
+ │/context (ctx) Show / clear / drop attached files ▸ 판단하기 │
22
+ │/decide (dec) 열린 결정 카드 보기·답하기 — /decide [… ▸ 만들기 │
23
+ │/harness Harness — /harness <goal> (self-dev) · plan… ▸ 기억하기 │
24
+ │/memory (mem) Memory ops — list / show / search / ad… /session (sess) Session resume — list / load / sync … │
25
+ │▸ 그 밖 /quit (q, exit) 나가기 │
26
+ │/setup 상세 설정 — /setup · /setup reset(다음 실행 … /side 사이드탭 기초 — 목록 · 셸 생성 · 번호로 PTY 보… │
27
+ │ │
28
+ │Keys │
29
+ │Enter Send message │
30
+ │Esc Stop the answer (Esc again = rewind) · clear input / close help │
31
+ │Ctrl+U Clear text before cursor │
32
+ │Ctrl+W Delete previous word │
33
+ │Ctrl+← / → Move by word │
34
+ │Delete Delete next character │
35
+ │Home / End Move to start / end of line │
36
+ │Ctrl+A / E Move to start / end of line │
37
+ │PgUp / PgDn Scroll chat log │
38
+ │Ctrl+↑ Recall all queued lines (Enter while answering queues · empty Enter pushes now) │
39
+ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+ ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
48
+ ❯
49
+ ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
50
+
51
+ 📁 tui-node-jrXm9J/tree │ ⌥ 트리 HEAD@02594ba │ ▶ 실행 02594ba │ gpt-6-luna │ ctx 0 │ 🖥 MacBookProM5