elanous 0.2.37 → 0.2.38

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 (588) 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/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 1026-44010f405704050c.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
  6. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 1632.7d87f998e714bede.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{4937-28d437999b77c9dd.js → 1923-5c1695332240246a.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
  18. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
  19. package/apps/pwa/out/_next/static/chunks/{3199.6a1a9b0e6cd01dc6.js → 2415.738b777642a02233.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/3124-561f7f037943cde2.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
  31. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 3291.f6c1005387d514bd.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
  34. package/apps/pwa/out/_next/static/chunks/{6877-84d47b7e85d0c41e.js → 3341-f09b9efbd7a82f70.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
  38. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 3528.e4b8ab70d339f965.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
  45. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
  57. package/apps/pwa/out/_next/static/chunks/{4036.d54e55e1ebf5acdc.js → 4804.6012b5cd33c22792.js} +2 -2
  58. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
  60. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
  65. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/{757-4fbaf50942b8c424.js → 5255-1b60d50eabe9f057.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
  68. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 5307.d7328020227880c2.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
  73. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 5638.107314dc479e2f37.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
  80. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6493.27ad77de7aac7966.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{1224.2ceca6c180d5130b.js → 7000.28157393caaf5343.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/{2479-fe7e188bd9402d14.js → 7311-60a7ea80d23c7521.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{5952.294fc574a8625184.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
  95. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 7628.6b16863ac3972333.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 7954.4f7a8832663ee979.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 8019.21ca554a821dad01.js} +16 -16
  102. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 8487.291666583bebe640.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 8879.ac06755bcf3e44a1.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
  111. package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
  116. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
  117. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
  121. package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/{page-5c112c6d7c33656e.js → page-c348a3959c5b5fc6.js} +1 -1
  140. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-88a1edbff62eaf1d.js → page-d1d1210f99f620ae.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/{page-b9af2ac1c4737ce8.js → page-7f569e533ddeecba.js} +1 -1
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/{page-fb9e639c107f5f72.js → page-a9d9a3e66459c1e0.js} +1 -1
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → bb6987f9.3647e1a23b0e3217.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/de8b930d.d94c0f42acf807fc.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → eaad0cba.771200940c529df7.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/graphs/release/recipes.yaml +9 -0
  278. package/graphs/release/release-loop.yaml +26 -18
  279. package/package.json +1 -1
  280. package/scripts/ask-op-inbox-once.ts +17 -0
  281. package/scripts/brand/check.ts +13 -4
  282. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  283. package/scripts/gate-0226-failure-census.ts +39 -0
  284. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  285. package/scripts/provision-export-redactions.ts +15 -0
  286. package/scripts/public-copy-lint.ts +122 -0
  287. package/scripts/public-export.ts +69 -2
  288. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  289. package/scripts/ratchets/train-side-invariants.sh +7 -1
  290. package/scripts/release-loop/cut-branch.ts +61 -12
  291. package/scripts/release-loop/gate-node.ts +161 -25
  292. package/scripts/release-loop/gate-partial.ts +82 -3
  293. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  294. package/scripts/release-loop/gate-radius-live.ts +4 -2
  295. package/scripts/release-loop/resume-cap.ts +2 -1
  296. package/scripts/release-loop/resume-release.ts +297 -8
  297. package/scripts/release-loop/resume.ts +13 -5
  298. package/scripts/release-loop/traffic-node.ts +12 -4
  299. package/scripts/release-loop/traffic-transition.ts +53 -13
  300. package/scripts/release-loop/version-node.ts +29 -4
  301. package/scripts/ux-sim.ts +1 -1
  302. package/scripts/video-pipeline.ts +2 -2
  303. package/src/acp/core-turn-bridge.ts +6 -1
  304. package/src/agent/run-context.ts +1 -1
  305. package/src/agent/task-notification.ts +3 -1
  306. package/src/agent-substrate/review-observation.ts +10 -0
  307. package/src/agent-substrate/self-review-cli.ts +195 -27
  308. package/src/auto-research/question-ladder-contract.ts +137 -0
  309. package/src/auto-research/research-turn.ts +134 -0
  310. package/src/autopilot/discovery/doc-lint.ts +1 -1
  311. package/src/bots/screen-probe.ts +1 -1
  312. package/src/capture/tui-self-report.ts +10 -2
  313. package/src/chat/index.ts +1 -0
  314. package/src/chat/tool-render/dispatch.ts +8 -1
  315. package/src/cli/guardian-cli.ts +3 -1
  316. package/src/cli/intake-cli.ts +48 -12
  317. package/src/cli/lesson-cli.ts +69 -9
  318. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  319. package/src/cli/pr-land-refusal.ts +1 -1
  320. package/src/cli/pty-takeover-cli.ts +58 -5
  321. package/src/cli/release-checklist-read-cli.ts +5 -2
  322. package/src/cli/release-cli.ts +47 -9
  323. package/src/cli/review-carry.ts +77 -0
  324. package/src/cli/self-update.ts +1 -1
  325. package/src/cli/tasks-card-show.ts +31 -1
  326. package/src/cli/tasks-cli.ts +62 -23
  327. package/src/cli/tasks-read-cli.ts +13 -5
  328. package/src/context-bus/context-now.ts +86 -2
  329. package/src/core-turn/run-core-turn.ts +9 -2
  330. package/src/core-turn/types.ts +3 -0
  331. package/src/dashboard/index.ts +18 -17
  332. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  333. package/src/dashboard/side-basic-runtime.ts +61 -0
  334. package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
  335. package/src/dashboard/term-slash-runtime.ts +2 -0
  336. package/src/dashboard/turn-preamble.ts +28 -4
  337. package/src/domains/guardian-tick.ts +9 -0
  338. package/src/git-fs/watcher.ts +27 -22
  339. package/src/git-fs/worktree.ts +19 -3
  340. package/src/graph-runner/graph-grow.ts +37 -9
  341. package/src/graph-runner/runner.ts +17 -2
  342. package/src/grok/credential.ts +107 -36
  343. package/src/hq/fence-wrapper.ts +1 -1
  344. package/src/hq/transfer.ts +1 -1
  345. package/src/index.ts +44 -14
  346. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  347. package/src/interactive-terminal-modal.ts +3 -0
  348. package/src/keybindings.ts +17 -22
  349. package/src/llm/provider-credentials.ts +1 -1
  350. package/src/llm-tool-schema.ts +20 -0
  351. package/src/llm.ts +81 -11
  352. package/src/loops/orchestrator/inbox-once.ts +28 -0
  353. package/src/loops/orchestrator/inbox.ts +130 -1
  354. package/src/loops/orchestrator/tick.ts +6 -3
  355. package/src/maturity/feature-maturity.ts +1 -0
  356. package/src/nexus/api/channel-ask-op.ts +96 -0
  357. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  358. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  359. package/src/nexus/api/terminals.ts +28 -6
  360. package/src/patents/ledger.ts +18 -1
  361. package/src/preview/terminal.ts +4 -2
  362. package/src/prompt-cache/anthropic.ts +2 -0
  363. package/src/prompt-enhance/enhance.ts +5 -0
  364. package/src/pty-shell/pty-manifest.ts +16 -2
  365. package/src/release-loop/gate-shards.ts +61 -0
  366. package/src/release-loop/light-rc.ts +7 -4
  367. package/src/release-loop/rehearsal.ts +1 -1
  368. package/src/repl/index.ts +10 -0
  369. package/src/research/axis-fanout.ts +133 -0
  370. package/src/research/edge-decision.ts +88 -0
  371. package/src/research/output-router.ts +127 -0
  372. package/src/research-bridge/format.ts +16 -1
  373. package/src/research-bridge/index.ts +1 -0
  374. package/src/research-bridge/invoke.ts +41 -5
  375. package/src/self-dev/decompose.ts +45 -9
  376. package/src/self-dev/draft-residue.ts +221 -2
  377. package/src/self-dev/draft-sweep.ts +29 -16
  378. package/src/self-dev/orchestrate.ts +1 -0
  379. package/src/self-dev/run-supervisor.ts +22 -7
  380. package/src/self-dev/shard-run.ts +260 -3
  381. package/src/self-implement/comment-only-source.ts +54 -0
  382. package/src/self-implement/doctor-visit.ts +25 -0
  383. package/src/self-implement/gate-artifacts.ts +2 -2
  384. package/src/self-implement/gate-baseline.ts +44 -9
  385. package/src/self-implement/gate-cli.ts +151 -86
  386. package/src/self-implement/gate-failure-signature.ts +44 -0
  387. package/src/self-implement/gate-remote.ts +2 -0
  388. package/src/self-implement/goal-author.ts +74 -3
  389. package/src/self-implement/goal-doc/section.ts +22 -0
  390. package/src/self-implement/goal-supervisor-fill.ts +38 -4
  391. package/src/self-implement/knowhow-pack.ts +120 -7
  392. package/src/self-implement/l8-merge-queue.ts +198 -32
  393. package/src/self-implement/off-diff-evidence.ts +23 -0
  394. package/src/self-implement/orchestrator.ts +55 -12
  395. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  396. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  397. package/src/self-implement/premise-review.ts +7 -5
  398. package/src/self-implement/run-ledger.ts +258 -0
  399. package/src/self-implement/seams.ts +33 -10
  400. package/src/self-implement/self-implement-cli.ts +26 -2
  401. package/src/session/channel-ask-op-envelope.ts +36 -0
  402. package/src/session/channel-op-reply-route.ts +200 -0
  403. package/src/session/chat.ts +3 -0
  404. package/src/session/index.ts +2 -0
  405. package/src/session-runtime/index.ts +9 -22
  406. package/src/skills/runner.ts +7 -3
  407. package/src/skills/tools/dev-harness.ts +2 -2
  408. package/src/skills/tools/schedule-wakeup.ts +1 -6
  409. package/src/status/bar.ts +3 -3
  410. package/src/storage/file-lock.ts +17 -4
  411. package/src/task-agent/adopt-pr.ts +63 -2
  412. package/src/task-agent/evidence-command-normalize.ts +42 -0
  413. package/src/task-agent/export-redactions-provision.ts +43 -0
  414. package/src/task-agent/parent-host.ts +59 -12
  415. package/src/task-agent/repair-cycle.ts +67 -8
  416. package/src/task-agent/repair-worker.ts +37 -1
  417. package/src/task-agent/task-hand.ts +98 -10
  418. package/src/task-agent/tier-split.ts +37 -3
  419. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  420. package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
  421. package/src/task-orchestrator/surfaces/self-implement-pod.ts +126 -48
  422. package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
  423. package/src/terminal/session-registry.ts +1 -0
  424. package/src/terminal/terminal-modal-router.ts +156 -0
  425. package/src/tool-hints/gate.ts +6 -4
  426. package/src/tool-hints/signals.ts +33 -1
  427. package/src/tui/chat/background-job-status.ts +8 -2
  428. package/src/tui/entry.ts +469 -31
  429. package/src/tui/sidetab/attach.ts +304 -0
  430. package/src/tui/sidetab/list.ts +176 -0
  431. package/src/tui/sidetab/nl-tool.ts +136 -0
  432. package/src/tui/slash/resume-command.ts +23 -0
  433. package/src/tui/slash/resume.ts +3 -23
  434. package/src/tui/slash/term-next.ts +2 -1
  435. package/src/tui-client/local-chat-turn.ts +29 -8
  436. package/src/user-config.ts +11 -2
  437. package/src/ux-sim/fake-llm.ts +11 -5
  438. package/src/ux-sim/next-tui-seat-scenarios.ts +53 -1
  439. package/src/version/packed-revision.json +1 -1
  440. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
  451. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
  454. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
  458. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/3578.4e9f9948a9a6f2f4.js +0 -2
  463. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
  465. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
  467. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
  468. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/4313.76f232c304a15bde.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/4725-34bed25720cc326b.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
  477. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
  479. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
  486. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
  487. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
  490. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
  493. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
  496. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
  508. package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
  510. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
  513. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
  517. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
  525. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
  527. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
  586. package/scripts/migrate-monad-to-elanous.ts +0 -195
  587. package/scripts/rebrand-elanous.ts +0 -242
  588. /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
@@ -0,0 +1,134 @@
1
+ import { streamLLM } from '../llm.js';
2
+ import { invokeResearchAxes } from '../research-bridge/index.js';
3
+ import type { AxisFanoutResult } from '../research/axis-fanout.js';
4
+ import { attachResearchEvidence, buildResearchQuestionLadderPrompt,
5
+ parseSixLevelResearchQuestionLadder, type ResearchEvidenceEnvelope,
6
+ type SixLevelResearchQuestionLadder } from './question-ladder-contract.js';
7
+
8
+ export interface ResearchQuestionLadderRunOptions {
9
+ generate?: (prompt: string) => Promise<string>;
10
+ invokeAxes?: (questions: SixLevelResearchQuestionLadder['questions']) => Promise<AxisFanoutResult>;
11
+ }
12
+
13
+ export interface ResearchGroundingResult {
14
+ ok: boolean;
15
+ output: string;
16
+ }
17
+
18
+ export interface ResearchQuestionLadderRunResult {
19
+ ok: boolean;
20
+ ladder: SixLevelResearchQuestionLadder;
21
+ output: string;
22
+ error?: string;
23
+ }
24
+
25
+ /** Generate Bloom axes, search each axis natively, and attach its source evidence. */
26
+ export async function runResearchQuestionLadder(
27
+ request: string,
28
+ options: ResearchQuestionLadderRunOptions = {},
29
+ ): Promise<ResearchQuestionLadderRunResult> {
30
+ const initial: SixLevelResearchQuestionLadder = { request, questions: [], evidence: [] };
31
+ let raw: string;
32
+ try {
33
+ raw = await (options.generate ?? defaultGenerate)(buildResearchQuestionLadderPrompt(request));
34
+ } catch (error) {
35
+ return { ok: false, ladder: initial, output: '', error: `question generation failed: ${errorText(error)}` };
36
+ }
37
+
38
+ let generated: unknown;
39
+ try {
40
+ generated = JSON.parse(extractJson(raw));
41
+ } catch (error) {
42
+ return { ok: false, ladder: initial, output: '', error: `question generation returned invalid JSON: ${errorText(error)}` };
43
+ }
44
+ const parsed = parseSixLevelResearchQuestionLadder(withRequest(generated, request));
45
+ if (!parsed.ok) return { ok: false, ladder: initial, output: '', error: parsed.reason };
46
+
47
+ const ladder = parsed.value;
48
+ const observedAt = new Date().toISOString();
49
+ let fanout: AxisFanoutResult;
50
+ try {
51
+ fanout = await (options.invokeAxes ?? invokeResearchAxes)(ladder.questions);
52
+ } catch (error) {
53
+ fanout = {
54
+ plan: [],
55
+ axes: ladder.questions.map((question) => ({ questionId: question.id, error: errorText(error), evidence: [{
56
+ questionId: question.id, sourceKind: 'search-query', source: question.searchTerms[0] ?? question.id,
57
+ ...(question.requestedWindow ? { requestedWindow: question.requestedWindow } : {}),
58
+ observedAt, content: errorText(error), outcome: 'failed', truncated: false,
59
+ }] })),
60
+ };
61
+ }
62
+
63
+ let allOk = true;
64
+ const sections: string[] = [`# Research: ${request}`, ''];
65
+ const byQuestion = new Map(fanout.axes.map((axis) => [axis.questionId, axis]));
66
+ for (const question of ladder.questions) {
67
+ const axis = byQuestion.get(question.id);
68
+ const axisEvidence = axis?.evidence ?? [];
69
+ const envelopes: ResearchEvidenceEnvelope[] = axisEvidence.length ? axisEvidence : [{
70
+ questionId: question.id, sourceKind: 'search-query', source: question.searchTerms[0] ?? question.id,
71
+ ...(question.requestedWindow ? { requestedWindow: question.requestedWindow } : {}),
72
+ observedAt, content: axis?.error ?? 'axis evidence missing', outcome: 'failed', truncated: false,
73
+ }];
74
+ const snippets: string[] = [];
75
+ for (const envelope of envelopes) {
76
+ const attached = attachResearchEvidence(ladder, envelope);
77
+ if (!attached.ok) {
78
+ allOk = false;
79
+ snippets.push(`Evidence rejected: ${attached.reason}`);
80
+ continue;
81
+ }
82
+ ladder.evidence = attached.value.evidence;
83
+ if (envelope.outcome !== 'complete') allOk = false;
84
+ snippets.push(`- [${envelope.outcome}] ${envelope.sourceKind} · ${envelope.source}: ${envelope.content}`);
85
+ }
86
+ sections.push(`## ${question.id} · Bloom ${question.level}: ${question.prompt}`,
87
+ `Search terms: ${question.searchTerms.join(', ')}`,
88
+ ...snippets);
89
+ }
90
+
91
+ const incompleteQuestions = ladder.questions.filter((question) => {
92
+ const evidence = ladder.evidence.filter((item) => item.questionId === question.id);
93
+ return evidence.length === 0 || evidence.some((item) => item.outcome !== 'complete');
94
+ }).length;
95
+ return {
96
+ ok: allOk,
97
+ ladder,
98
+ output: sections.join('\n\n'),
99
+ ...(allOk ? {} : { error: `${incompleteQuestions} of ${ladder.questions.length} question searches were incomplete` }),
100
+ };
101
+ }
102
+
103
+ /** Preserve usable partial findings when the grounding seam has only an ok/output contract. */
104
+ export function researchTurnForGrounding(result: ResearchQuestionLadderRunResult): ResearchGroundingResult {
105
+ const output = result.output.trim() || result.error || 'Research question ladder failed.';
106
+ return {
107
+ ok: result.ladder.evidence.some((item) => item.outcome === 'complete') && result.output.trim().length > 0,
108
+ output,
109
+ };
110
+ }
111
+
112
+ async function defaultGenerate(prompt: string): Promise<string> {
113
+ return streamLLM([{ role: 'user', content: prompt }], () => {}, {
114
+ usageSite: 'research-question-ladder',
115
+ usagePhase: 'research',
116
+ });
117
+ }
118
+
119
+ function withRequest(value: unknown, request: string): unknown {
120
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) return value;
121
+ return { ...(value as Record<string, unknown>), request };
122
+ }
123
+
124
+ function extractJson(raw: string): string {
125
+ const unfenced = raw.trim().replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/, '');
126
+ const start = unfenced.indexOf('{');
127
+ const end = unfenced.lastIndexOf('}');
128
+ if (start < 0 || end <= start) throw new Error('no JSON object found');
129
+ return unfenced.slice(start, end + 1);
130
+ }
131
+
132
+ function errorText(error: unknown): string {
133
+ return error instanceof Error ? error.message : String(error);
134
+ }
@@ -402,7 +402,7 @@ export async function lintGitHubIssueCommentPointers(
402
402
  // ⛔⭐ **파싱 실패는 `valid` 로 둔다**(리뷰 3R must-fix) — `issue_url` 형태를 못 읽은 것은
403
403
  // *"다른 데를 가리킨다"* 는 **증거가 아니다**. 대조가 가능할 때만 대조한다.
404
404
  // ⭐ GitHub 의 owner/repo 는 **대소문자를 구분하지 않는다**(리뷰 4R must-fix) — 양쪽을 같은
405
- // 규칙으로 정규화하지 않으면 `JOOSUNG80` vs `ElanvitalAI` 이 `mismatched` 로 오진된다.
405
+ // 규칙으로 정규화하지 않으면 대문자 owner 와 소문자 owner 를 `mismatched` 로 오진한다.
406
406
  const sameRepo = actual
407
407
  && actual.owner.toLowerCase() === owner.toLowerCase()
408
408
  && actual.repo.toLowerCase() === repo.toLowerCase();
@@ -343,7 +343,7 @@ export function interpretCrontab(out: { readonly code: number; readonly said: st
343
343
  // ⇒ 이제 «화이트리스트»다: 이 문면이 아니면 rc≠0 은 전부 「못 물었다」.
344
344
  // ⛔⭐ ***부분문자열로 보지 않는다***(3차 리뷰) — ssh 배너·MOTD 에 그 낱말이 섞이면
345
345
  // rc≠0 «실패»가 「빈 크론탭」으로 둔갑한다. ⇒ 다듬은 산출이 ***그 한 줄 «전체»***여야 한다.
346
- // 📏 실측(2026-09-01 · gcpvm): 정확히 `no crontab for user\n` ⊕ rc=1.
346
+ // 📏 실측(2026-09-01 · 원격 노드): 정확히 `no crontab for <user>\n` ⊕ rc=1.
347
347
  // (macOS 는 `crontab: ` 접두를 붙이는 판이 있어 그것만 허용한다)
348
348
  if (/^(crontab: )?no crontab for \S+$/i.test(out.said.trim())) return '';
349
349
  return null;
@@ -39,7 +39,7 @@ import { createTuiScreenMirror } from './tui-screen-mirror.js';
39
39
  import { getChannelBus } from '../terminal-matrix/index.js';
40
40
  import { publishSelfReportFrame } from './self-report-frame.js';
41
41
  import {
42
- upsertPtyManifest, updatePtyManifestFrame, touchLivePtyManifest, markPtyManifestClosed, removePtyManifest, getPtyManifest,
42
+ upsertPtyManifest, updatePtyManifestFrame, updatePtyManifestSession, touchLivePtyManifest, markPtyManifestClosed, removePtyManifest, getPtyManifest,
43
43
  updatePtyManifestBuild,
44
44
  } from '../pty-shell/pty-manifest.js';
45
45
  import { writeHarnessScreen } from '../harness/harness-screen.js';
@@ -468,7 +468,15 @@ export function startTuiSelfReport(deps: TuiSelfReportDeps = {}): () => void {
468
468
  lastEmittedText = text;
469
469
  // TUI-H9 — 이 프레임이 «지금 이 TUI 가 보여 주는 대화» 의 소유 기록이다. 재기동은 이 id 로만 잇는다
470
470
  // (읽기 실패 → 소유 없음 → 재기동 막힘 · 다른 세션으로 대체하지 않는다).
471
- try { claimTuiOwnedSession(readActiveSessionId(), at); } catch { claimTuiOwnedSession(null, at); }
471
+ let sessionId: string | null = null;
472
+ try {
473
+ sessionId = readActiveSessionId();
474
+ claimTuiOwnedSession(sessionId, at);
475
+ } catch {
476
+ sessionId = null;
477
+ claimTuiOwnedSession(null, at);
478
+ }
479
+ try { updatePtyManifestSession(surfaceId, sessionId ?? '', at); } catch { /* fail-soft */ }
472
480
  const frame: SelfReportFrame = { surfaceId, instance, kind: 'tui', mode: 'self-report', text, cols, rows, at, ...(runId ? { runId } : {}) };
473
481
  try { publishFrame(frame); } catch { /* fail-soft */ }
474
482
  // `at` is shared with the manifest write → its internal throttle keys
package/src/chat/index.ts CHANGED
@@ -514,6 +514,7 @@ export const SLASH_COMMANDS: SlashCommand[] = [
514
514
  { name: 'tablet', aliases: [], description: 'Tablet mode — collapse layout to log + input', subcommands: ['on', 'off', 'toggle', 'auto', 'status', 'browser-preview', 'bp'] },
515
515
  { name: 'surface', aliases: [], description: 'Surface control — open a pane/catalog launcher (/surface catalog · browser · preview · log · scratch · obsidian · skill) OR set a preferred LLM surface (/surface coding-agent · research-agent · control-agent · ops-agent · … · clear · status)', subcommands: ['catalog', 'browser', 'preview', 'browser-preview', 'log', 'scratch', 'obsidian', 'skill', 'skill-file', 'agents', 'coding-agent', 'coding-chat', 'research-agent', 'research-chat', 'control-agent', 'ops-ui-agent', 'ops-fleet-agent', 'ops-agent', 'clear', 'status'] },
516
516
  { name: 'term', aliases: ['terminal'], description: 'Interactive terminal modal — new / list / attach / detach / switch / kill / snapshot / resume', subcommands: ['new', 'list', 'attach', 'detach', 'switch', 'kill', 'snapshot', 'resume'] },
517
+ { name: 'side', aliases: [], description: '사이드탭 기초 — 목록 · 셸 생성 · 번호로 PTY 보기/attach', subcommands: ['list', 'new', 'attach'] },
517
518
  { name: 'claude', aliases: [], description: 'Spawn claude-code CLI in a terminal modal' },
518
519
  { name: 'codex', aliases: [], description: 'Spawn codex CLI in a terminal modal' },
519
520
  { name: 'gemini', aliases: [], description: 'Spawn gemini CLI in a terminal modal' },
@@ -89,7 +89,7 @@ export function renderToolResultVariants(
89
89
  // Only successful MsgPost results enter the compact renderer. Returning
90
90
  // null for errors lets the dashboard formatter use its existing generic
91
91
  // result path, including its expanded argument/result view.
92
- if (kind === 'MsgPost' && extractErrorText(call.result)) return null;
92
+ if (kind === 'MsgPost' && isMsgPostErrorResult(call.result)) return null;
93
93
  const model = buildToolRenderModel(kind, call, config);
94
94
  const collapsed = renderToolBlock(model, config.blockMaxLines, config.foldMode, config.expandHint);
95
95
  // ⭐ MsgPost 는 접힌 행에서 본문을 빼고 펼친 행에서만 싣는다 ⇒ 같은 model 로는 두 변형을
@@ -113,6 +113,13 @@ interface ToolRenderModelOptions {
113
113
  includeMsgPostBody?: boolean;
114
114
  }
115
115
 
116
+ /** MsgPost 오류 — `llm.ts` 가 throw 를 `{ error }` 로 감싼 형태와, `ok: false` 결과. */
117
+ function isMsgPostErrorResult(result: unknown): boolean {
118
+ if (extractErrorText(result)) return true;
119
+ const rec = asRecord(result);
120
+ return rec?.ok === false;
121
+ }
122
+
116
123
  function normalizeToolRenderName(name: string): ToolRenderKind | null {
117
124
  if (name === 'update_plan' || name === 'UpdatePlan') return 'UpdatePlan';
118
125
  if (name === 'update_goal' || name === 'UpdateGoal') return 'UpdateGoal';
@@ -72,7 +72,9 @@ export function registerGuardianCommands(program: Command): void {
72
72
  debug.log('ops.orphan-cli', 'observation-failed', { error: String(error) });
73
73
  } catch { /* guardian shadow still runs */ }
74
74
  }
75
- const result = await guardianTick(tickAt, plan, { config: cfg });
75
+ const result = await guardianTick(tickAt, plan, { config: cfg,
76
+ doctorShadow: async () => { (await import('../self-implement/doctor-visit.js')).recordPendingShadowDoctorReevaluations(); },
77
+ });
76
78
  await writeStdoutJson(JSON.stringify(result, null, 2) + '\n');
77
79
  } finally { db.close(); }
78
80
  });
@@ -13,6 +13,7 @@ import { debug } from '../debug/log.js';
13
13
  import { getUserConfig } from '../user-config.js';
14
14
  import { registerIntakeSourceCommands } from './intake-source-cli.js';
15
15
  import type { IntakeItem } from '../intake-plane/items.js';
16
+ import type { CollectSavedResult, FetchSavedMessages } from '../intake-plane/collect-telegram-saved.js';
16
17
  import type { TaskCard } from '../task-cards/card-store.js';
17
18
  import { collectFunnelCandidates, type FunnelDirectiveRow } from '../intake-plane/requirement-funnel.js';
18
19
 
@@ -31,6 +32,13 @@ export interface IntakeCandidatesCliDeps {
31
32
  write?: (text: string) => Promise<void>;
32
33
  }
33
34
 
35
+ export interface IntakeCliDeps extends IntakeCandidatesCliDeps {
36
+ /** 흡수 원장 우주 (기본 effectiveInstanceRoot()) — 시험은 격리 임시 root 를 넣는다. */
37
+ root?: string;
38
+ /** 텔레그램 «저장된 메시지» 연결 (기본 gramjsFetchSaved) — 시험은 가짜 fetch 를 넣는다. */
39
+ connectSaved?: () => Promise<{ fetch: FetchSavedMessages; close: () => Promise<void> }>;
40
+ }
41
+
34
42
  /** `--limit` 원 문자열 → 0 이상의 정수. 숫자만(`/^\d+$/`) 받고 나머지('' · 공백 · 음수 · 소수)는 거부한다. */
35
43
  export function parseCandidatesLimit(raw: string): number {
36
44
  const limit = /^\d+$/.test(raw) ? Number(raw) : NaN;
@@ -187,6 +195,40 @@ export async function runIntakeDigestCli(
187
195
  return {};
188
196
  }
189
197
 
198
+ export interface CollectTelegramSavedCliDeps {
199
+ root?: string;
200
+ connect?: () => Promise<{ fetch: FetchSavedMessages; close: () => Promise<void> }>;
201
+ write?: (text: string) => Promise<void>;
202
+ error?: (message: string) => void;
203
+ }
204
+
205
+ /**
206
+ * `intake collect-telegram-saved` — 읽기만 · 커서 이후만.
207
+ * «메시지 0»(필터로 비었나 · 커서를 다른 주체가 넘겼나)과 «원장 입력 0»(다른 주체가 이미 가져갔나)을 갈라 보여준다.
208
+ */
209
+ export async function runCollectTelegramSavedCli(
210
+ opts: { max?: string; dryRun?: boolean; json?: boolean },
211
+ deps: CollectTelegramSavedCliDeps = {},
212
+ ): Promise<CollectSavedResult | undefined> {
213
+ const { collectTelegramSaved, gramjsFetchSaved, renderCollectTelegramSavedResult } = await import('../intake-plane/collect-telegram-saved.js');
214
+ const root = deps.root ?? (await import('../instance/resolve.js')).effectiveInstanceRoot();
215
+ let conn: { fetch: FetchSavedMessages; close: () => Promise<void> };
216
+ try { conn = await (deps.connect ?? (() => gramjsFetchSaved()))(); }
217
+ catch (e) { (deps.error ?? ((message: string) => console.error(message)))(String((e as Error).message ?? e)); process.exitCode = 2; return undefined; }
218
+ try {
219
+ const res = await collectTelegramSaved(root, conn.fetch, {
220
+ max: Math.max(1, Number(opts.max ?? 300) || 300),
221
+ ...(opts.dryRun ? { dryRun: true } : {}),
222
+ });
223
+ const write = deps.write ?? writeStdoutFully;
224
+ if (opts.json) await write(JSON.stringify(res, null, 2));
225
+ else await write(renderCollectTelegramSavedResult(res));
226
+ return res;
227
+ } finally {
228
+ await conn.close();
229
+ }
230
+ }
231
+
190
232
  export function resolveIntakeCheckRoot(
191
233
  cwd: string,
192
234
  git: typeof runGitCommand = runGitCommand,
@@ -200,7 +242,7 @@ export function resolveIntakeCheckRoot(
200
242
  }
201
243
  }
202
244
 
203
- export function registerIntakeCommands(program: Command, candidateDeps: IntakeCandidatesCliDeps = {}): void {
245
+ export function registerIntakeCommands(program: Command, candidateDeps: IntakeCliDeps = {}): void {
204
246
  // ── intake check — 바깥 사실을 elanous 현재와 대조 (태스크 등록 없음) ──
205
247
  const intakeCmd = program.command('intake').description('바깥 사실·문서를 elanous 현재와 대조하거나 태스크로 받는다');
206
248
  registerIntakeSourceCommands(intakeCmd);
@@ -500,17 +542,11 @@ export function registerIntakeCommands(program: Command, candidateDeps: IntakeCa
500
542
  .option('--dry-run', '원장·커서를 바꾸지 않고 건수만')
501
543
  .option('--json', '구조화 출력')
502
544
  .action(async (opts: { max?: string; dryRun?: boolean; json?: boolean }) => {
503
- const { collectTelegramSaved, gramjsFetchSaved } = await import('../intake-plane/collect-telegram-saved.js');
504
- const { effectiveInstanceRoot } = await import('../instance/resolve.js');
505
- let conn: Awaited<ReturnType<typeof gramjsFetchSaved>>;
506
- try { conn = await gramjsFetchSaved(); } catch (e) { console.error(String((e as Error).message ?? e)); process.exitCode = 2; return; }
507
- try {
508
- const res = await collectTelegramSaved(effectiveInstanceRoot(), conn.fetch, { max: Math.max(1, Number(opts.max ?? 300) || 300), ...(opts.dryRun ? { dryRun: true } : {}) });
509
- if (opts.json) await writeStdoutFully(JSON.stringify(res, null, 2));
510
- else console.log(`텔레그램 저장된 메시지: 메시지 ${res.messages} · 원장 입력 ${res.raws} · 커서 ${res.cursorBefore} → ${res.cursorAfter}${res.dryRun ? ' (dry-run · 안 씀)' : res.ingest ? ` · 새 ${res.ingest.added} · 합침 ${res.ingest.merged} · 이미 끝난 것 ${res.ingest.seen}` : ''}`);
511
- } finally {
512
- await conn.close();
513
- }
545
+ await runCollectTelegramSavedCli(opts, {
546
+ ...(candidateDeps.root ? { root: candidateDeps.root } : {}),
547
+ ...(candidateDeps.connectSaved ? { connect: candidateDeps.connectSaved } : {}),
548
+ ...(candidateDeps.write ? { write: candidateDeps.write } : {}),
549
+ });
514
550
  });
515
551
 
516
552
  intakeCmd
@@ -1,5 +1,6 @@
1
1
  import type { Command } from 'commander';
2
- import { resolve } from 'node:path';
2
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
3
+ import { dirname, resolve } from 'node:path';
3
4
  import { debug } from '../debug/log.js';
4
5
  import { importLessons, scanLessonDocs } from '../lessons/lesson-import.js';
5
6
  import { LessonInputError, LessonLedger, type LessonLedgerOptions, type LessonRow, type LessonDetail } from '../lessons/lesson-ledger.js';
@@ -38,6 +39,11 @@ function detail(row: LessonDetail): string {
38
39
  '이력:', ...row.history.map(h => ` ${h.at} · ${h.event} · ${h.by} · ${h.detail}`)].join('\n');
39
40
  }
40
41
 
42
+ function validAuthoringLessonClass(value: string): boolean {
43
+ return new Set(['a-missing-predecessor', 'b-stale-path', 'c-unbounded-goal', 'd-rigid-acceptance',
44
+ 'e-format-trap', 'f-unaware-of-code', 'g-umbrella-scope']).has(value) || /^env-[a-z0-9][a-z0-9-]*$/u.test(value);
45
+ }
46
+
41
47
  export function registerLessonCommands(program: Command, options: LessonLedgerOptions = {}, out: Pick<Console, 'log'> = console): void {
42
48
  const root = program.command('lesson').description('사고 · 원인 · 처방 · 재발 교훈 원장');
43
49
  const ledger = () => new LessonLedger(options);
@@ -68,14 +74,68 @@ export function registerLessonCommands(program: Command, options: LessonLedgerOp
68
74
  reportError('page', error instanceof Error ? error.message : String(error));
69
75
  }
70
76
  });
71
- root.command('add <id>').requiredOption('--incident <text>').requiredOption('--cause <text>')
72
- .requiredOption('--remedy <text>').requiredOption('--owner <name>').requiredOption('--source <path>')
73
- .option('--enforced-by <paths>').option('--disproof <command>').option('--by <name>')
74
- .action(handle('add', (id: string, o: { incident: string; cause: string; remedy: string; owner: string; source: string; enforcedBy?: string; disproof?: string; by?: string }) => {
75
- const by = actor(o.by);
76
- const row = ledger().add({ id, incident: o.incident, cause: o.cause, remedy: o.remedy, owner: o.owner,
77
- source: o.source, by, ...(o.enforcedBy !== undefined ? { enforcedBy: o.enforcedBy } : {}),
78
- ...(o.disproof !== undefined ? { disproof: o.disproof } : {}) });
77
+ root.command('add [id]').option('--incident <text>').option('--cause <text>').option('--remedy <text>')
78
+ .option('--owner <name>').option('--source <path>').option('--enforced-by <paths>').option('--disproof <command>').option('--by <name>')
79
+ .option('--authoring', '05-authoring-lessons.jsonl에 저작 교훈 한 행 추가')
80
+ .option('--cell <name>').option('--class <class>').option('--diag <text>').option('--action <text>').option('--lesson <text>')
81
+ .option('--run <id>').option('--card <id>').option('--launch <id>').option('--goal-sha <sha>')
82
+ .option('--paths <paths>').option('--model <model>').option('--host <host>').option('--evidence <text>')
83
+ .option('--rule <text>').option('--ms <milliseconds>').option('--outcome <state>', 'pending, fixed 또는 repeated')
84
+ .option('--resolve-pending <state>', '같은 cell/class의 pending을 fixed 또는 repeated로 전이')
85
+ .action(handle('add', (id: string | undefined, o: Record<string, string | boolean | undefined>) => {
86
+ if (o.authoring) {
87
+ const required = ['source', 'cell', 'class', 'diag', 'action', 'lesson'] as const;
88
+ const missing = required.filter((key) => typeof o[key] !== 'string' || !(o[key] as string).trim());
89
+ if (missing.length) throw new LessonInputError(`authoring fields required: ${missing.map(key => `--${key}`).join(', ')}`);
90
+ if (!validAuthoringLessonClass(o.class as string)) throw new LessonInputError('--class is not in the authoring lesson class set');
91
+ const outcome = typeof o.outcome === 'string' ? o.outcome : 'pending';
92
+ if (!['pending', 'fixed', 'repeated'].includes(outcome)) throw new LessonInputError('--outcome must be pending, fixed, or repeated');
93
+ if (o.resolvePending !== undefined && !['fixed', 'repeated'].includes(o.resolvePending as string)) {
94
+ throw new LessonInputError('--resolve-pending must be fixed or repeated');
95
+ }
96
+ const row: Record<string, string> = {
97
+ ts: new Date().toISOString(), by: actor(typeof o.by === 'string' ? o.by : undefined),
98
+ source: o.source as string, cell: o.cell as string, class: o.class as string, diag: o.diag as string,
99
+ action: o.action as string, lesson: o.lesson as string, run: String(o.run ?? ''), card: String(o.card ?? ''),
100
+ launch: String(o.launch ?? ''), goalSha: String(o.goalSha ?? ''), paths: String(o.paths ?? ''),
101
+ model: String(o.model ?? ''), host: String(o.host ?? ''), evidence: String(o.evidence ?? ''),
102
+ rule: String(o.rule ?? ''), ms: String(o.ms ?? ''), outcome,
103
+ };
104
+ const path = resolve(process.cwd(), 'docs/goal-context/05-authoring-lessons.jsonl');
105
+ let lines: string[] = [];
106
+ try {
107
+ lines = readFileSync(path, 'utf8').split(/\r?\n/u).filter(Boolean);
108
+ for (const line of lines) {
109
+ const parsed: unknown = JSON.parse(line);
110
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error('not an object');
111
+ }
112
+ } catch (error) {
113
+ if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw new LessonInputError('authoring lessons ledger is unreadable or malformed');
114
+ }
115
+ if (typeof o.resolvePending === 'string') {
116
+ lines = lines.map((line) => {
117
+ const prior = JSON.parse(line) as Record<string, unknown>;
118
+ return prior.cell === row.cell && prior.class === row.class && prior.outcome === 'pending'
119
+ ? JSON.stringify({ ...prior, outcome: o.resolvePending }) : line;
120
+ });
121
+ }
122
+ mkdirSync(dirname(path), { recursive: true });
123
+ const next = [...lines, JSON.stringify(row)].join('\n') + '\n';
124
+ const temp = `${path}.tmp-${process.pid}`;
125
+ writeFileSync(temp, next, { encoding: 'utf8', flag: 'w' });
126
+ renameSync(temp, path);
127
+ emit({ written: true, row }, false, `저작 교훈 추가 · ${row.cell} · ${row.class} · ${row.outcome}`);
128
+ return;
129
+ }
130
+ const required = ['incident', 'cause', 'remedy', 'owner', 'source'] as const;
131
+ const missing: string[] = required.filter((key) => typeof o[key] !== 'string' || !(o[key] as string).trim());
132
+ if (!id?.trim()) missing.unshift('id');
133
+ if (missing.length) throw new LessonInputError(`required: ${missing.map(key => key === 'id' ? 'id' : `--${key}`).join(', ')}`);
134
+ const by = actor(typeof o.by === 'string' ? o.by : undefined);
135
+ const row = ledger().add({ id, incident: o.incident as string, cause: o.cause as string, remedy: o.remedy as string,
136
+ owner: o.owner as string, source: o.source as string, by,
137
+ ...(o.enforcedBy !== undefined ? { enforcedBy: o.enforcedBy as string } : {}),
138
+ ...(o.disproof !== undefined ? { disproof: o.disproof as string } : {}) });
79
139
  emit(row, false, format(row));
80
140
  }));
81
141
  root.command('recur <id>').requiredOption('--source <path>').option('--note <text>').option('--by <name>')
@@ -21,11 +21,13 @@
21
21
  * 하나라도 못 재거나 어긋나면 거부 — 호출부는 종전 거부를 그대로 낸다(fail-closed).
22
22
  * - 관측: `pr.land` · `overlap-evidence` (decision · reason · 잰 값).
23
23
  */
24
+ import { createHash } from 'node:crypto';
24
25
  import { basename, dirname, join, resolve } from 'node:path';
25
26
  import { debug } from '../debug/log.js';
26
27
  import type { CmdRunner } from '../autopilot/pr-manager.js';
27
28
  import { parseReviewResultOutput } from '../task-agent/review-result-capture.js';
28
29
  import { verifyVirtualRebasePatch } from './pr-land-virtual-rebase.js';
30
+ import { proveReviewCarry } from './review-carry.js';
29
31
 
30
32
  const SHA40 = /^[0-9a-f]{40}$/i;
31
33
 
@@ -36,6 +38,8 @@ interface OverlapEvidenceFile {
36
38
  gate?: { head: string; baseCommit: string; passed: boolean };
37
39
  /** `self review --json` stdout 을 받은 파일(TA: `<state>/review-results/<card>-<pr>-<head접두 10~40>.json`); 내용의 전체 head도 확인한다. */
38
40
  reviewResult: string;
41
+ /** Explicit old-head review for a mechanically merged main head. Always re-proved against Git. */
42
+ reviewCarry?: { oldHead: string; oldBase: string; newBase: string; patchId: string; pathsModesHash: string; reviewSha256: string };
39
43
  /** Evidence-file override for explicitly replaced failed reviews. Each reason is the verifier's refusal reason. */
40
44
  supersedes?: { reviewResult: string; reason: string }[];
41
45
  /** OPEN follow-up PR that owns the findings intentionally split from this landing. */
@@ -82,9 +86,15 @@ function checkSelectedReviewAttempts(input: VerifyOverlapEvidenceInput, e: Parti
82
86
  let names: readonly string[];
83
87
  try { names = input.listDir(dir); } catch { return { ok: false, reason: 'review-attempts-unmeasured' }; }
84
88
  const filename = new RegExp(`^[A-Za-z0-9][A-Za-z0-9._-]*-${input.pr}-([a-f0-9]{10,40})\\.json$`, 'i');
85
- const candidates = [...names].filter((name) => {
89
+ const selectedHead = e.reviewCarry?.oldHead?.toLowerCase() ?? head;
90
+ // A fresh review of the merged head supersedes carry. Never hide a failed current-head attempt.
91
+ if (e.reviewCarry && names.some((name) => {
86
92
  const match = filename.exec(name);
87
93
  return Boolean(match && head.startsWith(match[1]!.toLowerCase()));
94
+ })) return { ok: false, reason: 'carry-new-head-review-exists' };
95
+ const candidates = [...names].filter((name) => {
96
+ const match = filename.exec(name);
97
+ return Boolean(match && selectedHead.startsWith(match[1]!.toLowerCase()));
88
98
  }).map((name) => join(dir, name));
89
99
  if (!candidates.includes(selected)) return { ok: false, reason: 'review-selected-missing' };
90
100
  let physicalDir: string;
@@ -127,7 +137,7 @@ function checkSelectedReviewAttempts(input: VerifyOverlapEvidenceInput, e: Parti
127
137
  }
128
138
  for (const path of candidates) {
129
139
  if (path === selected) continue;
130
- const review = checkReview(input, { reviewResult: path }, head);
140
+ const review = checkReview(input, { reviewResult: path }, selectedHead);
131
141
  if (review.ok) {
132
142
  if (superseded.has(path)) return { ok: false, reason: 'review-supersedes-passing' };
133
143
  continue;
@@ -324,8 +334,12 @@ type Checked = { ok: false; reason: string; baseTip?: string; gateBase?: string;
324
334
  const ACCEPTED_REVIEW_VERDICTS: ReadonlySet<string> = new Set(['pass', 'warn']);
325
335
  const COMMIT_MARK = '\u0001';
326
336
 
327
- function checkReview(input: Pick<VerifyOverlapEvidenceInput, 'pr' | 'readFile'>, e: Partial<OverlapEvidenceFile>, head: string, baseTip?: string): { ok: false; reason: string; baseTip?: string } | { ok: true; reviewResult: string } {
337
+ function checkReview(input: Pick<VerifyOverlapEvidenceInput, 'pr' | 'readFile'> & Partial<Pick<VerifyOverlapEvidenceInput, 'cwd' | 'remote' | 'branch'>>,
338
+ e: Partial<OverlapEvidenceFile>, head: string, baseTip?: string): { ok: false; reason: string; baseTip?: string } | { ok: true; reviewResult: string } {
328
339
  if (typeof e.reviewResult !== 'string' || !e.reviewResult) return { ok: false, reason: 'review-missing', baseTip };
340
+ const carry = e.reviewCarry;
341
+ const reviewHead = carry?.oldHead?.toLowerCase() ?? head;
342
+ if (carry && (!SHA40.test(reviewHead) || reviewHead === head)) return { ok: false, reason: 'carry-invalid-old-head', baseTip };
329
343
  // TA 가 받는 자리(`<state>/review-results/<card>-<pr>-<head접두 10~40>.json` · reviewResultPath)만; 내용의 전체 head도 확인한다.
330
344
  const resultName = basename(e.reviewResult);
331
345
  const resultMatch = /^([A-Za-z0-9][A-Za-z0-9._-]*)-(\d+)-([a-f0-9]{10,40})\.json$/i.exec(resultName);
@@ -333,7 +347,7 @@ function checkReview(input: Pick<VerifyOverlapEvidenceInput, 'pr' | 'readFile'>,
333
347
  || !resultMatch
334
348
  || Number(resultMatch[2]) !== input.pr
335
349
  || resultMatch[3]!.length < 10
336
- || !head.startsWith(resultMatch[3]!.toLowerCase())) {
350
+ || !reviewHead.startsWith(resultMatch[3]!.toLowerCase())) {
337
351
  return { ok: false, reason: 'review-path-not-for-this-pr-head', baseTip };
338
352
  }
339
353
  let text: string;
@@ -341,7 +355,7 @@ function checkReview(input: Pick<VerifyOverlapEvidenceInput, 'pr' | 'readFile'>,
341
355
  const review = parseReviewResultOutput(text);
342
356
  if (!review) return { ok: false, reason: 'review-no-result', baseTip };
343
357
  if (review.pr !== input.pr) return { ok: false, reason: 'review-pr-mismatch', baseTip };
344
- if (!review.head || review.head.toLowerCase() !== head) return { ok: false, reason: 'review-head-mismatch', baseTip };
358
+ if (!review.head || review.head.toLowerCase() !== reviewHead) return { ok: false, reason: 'review-head-mismatch', baseTip };
345
359
  // The capture parser projects away model provenance; inspect the same last result-shaped line here.
346
360
  const raw = lastReviewRecord(text);
347
361
  if (raw) {
@@ -377,6 +391,25 @@ function checkReview(input: Pick<VerifyOverlapEvidenceInput, 'pr' | 'readFile'>,
377
391
  if (review.reviewed !== true) return { ok: false, reason: 'review-not-reviewed', baseTip };
378
392
  if (review.verdict === null || !ACCEPTED_REVIEW_VERDICTS.has(review.verdict)) return { ok: false, reason: `review-verdict-${review.verdict ?? 'null'}`, baseTip };
379
393
  if (review.mustFix !== 0) return { ok: false, reason: review.mustFix === null ? 'review-must-fix-unknown' : `review-must-fix-${review.mustFix}`, baseTip };
394
+ if (carry) {
395
+ if (!input.cwd || !input.remote || !input.branch) return { ok: false, reason: 'carry-repo-unmeasured', baseTip };
396
+ const digest = createHash('sha256').update(text).digest('hex');
397
+ if (carry.reviewSha256 !== digest) return { ok: false, reason: 'carry-review-hash-mismatch', baseTip };
398
+ const proof = proveReviewCarry(input.cwd, reviewHead, head, input.remote, input.branch);
399
+ if (!proof.ok) return { ok: false, reason: proof.reason, baseTip };
400
+ const gate = e.gate;
401
+ if (!gate || gate.passed !== true || gate.head?.toLowerCase() !== head
402
+ || gate.baseCommit?.toLowerCase() !== proof.newBase) {
403
+ return { ok: false, reason: 'carry-new-head-gate-missing-or-mismatch', baseTip };
404
+ }
405
+ if (carry.oldBase?.toLowerCase() !== proof.oldBase || carry.newBase?.toLowerCase() !== proof.newBase
406
+ || carry.patchId?.toLowerCase() !== proof.patchId || carry.pathsModesHash?.toLowerCase() !== proof.pathsModesHash) {
407
+ return { ok: false, reason: 'carry-proof-mismatch', baseTip };
408
+ }
409
+ debug.log('pr.land', 'review-carry', { pr: input.pr, remote: input.remote, branch: input.branch,
410
+ oldHead: reviewHead, newHead: head, oldBase: proof.oldBase,
411
+ newBase: proof.newBase, patchId: proof.patchId, reviewSha256: digest, decision: 'accepted' });
412
+ }
380
413
  return { ok: true, reviewResult: e.reviewResult };
381
414
  }
382
415
 
@@ -12,7 +12,7 @@ export function classifyPrLandRefusal(message: string, context: { isDraft?: bool
12
12
  if (message.startsWith('✗ ancestor-auto: ancestor-auto-not-ancestor:')) return 'not-ancestor';
13
13
  if (/^✗ (?:ancestor-auto|overlap-evidence): (?:review-missing|review-not-reviewed|review-error|review-no-result|review-unreadable|review-pr-mismatch|review-head-mismatch|review-path-not-for-this-pr-head|review-verdict-null|review-must-fix-unknown)(?:\b|$)/.test(message)) return 'review-missing';
14
14
  if (message.startsWith('✗ heavy-remote: PR base=unreadable ≠ main')) return 'pr-base-unreadable';
15
- if (/^✗ heavy-remote: (?:원격|병합 직전 원격|node-b) 게이트 gate-host-busy(?:\b|\s|$)/.test(message)) return 'gate-host-busy';
15
+ if (/^✗ heavy-remote: (?:원격|병합 직전 원격|[a-z][a-z0-9-]*) 게이트 gate-host-busy(?:\b|\s|$)/.test(message)) return 'gate-host-busy';
16
16
  if (message.startsWith('✗ heavy-remote: 원격 게이트 gate-rc-1 · remote: stdout: CONFLICT (content): Merge conflict')) return 'gate-merge-conflict';
17
17
  if (message.startsWith('✗ heavy-remote: 원격 게이트 gate-rc-1 · remote: stderr: 건드린 src/scripts 파일과 baseline 밖 test 파일은 tsc 클린이어야 합니다(touch-clean).')) return 'gate-touch-clean';
18
18
  if (message.startsWith('✗ public-export-leak: 바뀐 파일')) return 'public-export-leak';