elanous 0.2.41 → 0.2.42

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 (589) 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 → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 1063.2fb8a9dc55c731f2.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
  7. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 1262.e804feb8fd1acb8c.js} +2 -2
  9. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 1487.2f67b79444062da6.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
  15. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
  21. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
  22. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
  25. package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 2690.0521c738b7749931.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/{4702.4a4adc1f16d7c93b.js → 2974.595d1e29d040cb6a.js} +1 -1
  32. package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3207.a756c95e9ec8c3c8.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/{9541.eb8e2f8480c7feca.js → 3285.89ee2f298682f5e5.js} +2 -2
  34. package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 3347.f846266b5e5f3ede.js} +16 -16
  35. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
  36. package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
  37. package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
  38. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
  40. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{1661.0dd330f3d89f73f3.js → 3837.a210d7d0db8d8abd.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
  47. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
  48. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
  54. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
  55. package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +122 -0
  56. package/apps/pwa/out/_next/static/chunks/{1115.434ae2ecb0ad986d.js → 5112.4b9f300124fab7b3.js} +3 -3
  57. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
  59. package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
  69. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +226 -0
  72. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
  73. package/apps/pwa/out/_next/static/chunks/{2073.689dcb2680113d76.js → 6377.bc7df239edbff244.js} +1 -1
  74. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 6632.0eac1c554f8f2ef3.js} +1 -1
  77. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
  81. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
  82. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/{2527-5c636a43c7cc5dde.js → 7279-c199ea83f34338fa.js} +1 -1
  85. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 73d2eb0e.4966ad55293c801a.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 7411.9b4b8b747dc7b802.js} +2 -2
  90. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
  91. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 8262.ddc03e06b733f184.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
  102. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
  104. package/apps/pwa/out/_next/static/chunks/{8050-9b364bdef8f71927.js → 8546-6f03f8ea34dd61d9.js} +1 -1
  105. package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8673-bab689a55f7e13b9.js} +3 -3
  106. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{5937.c2df9e3447e1f667.js → 9249.976f1e69a9d80754.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{1971-7efb628c471dc5a0.js → 9353-12bfff0c130104cf.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/{7191.fdc955f7d96064a4.js → 9415.69e4a21c60c7d2db.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 9427.96aa912ddb5801e0.js} +16 -16
  118. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 9656-374232558fd528d0.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{6552.a3840aa7da35ad68.js → 9832.f4a98c878ecf2c0a.js} +1 -1
  123. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → b450776b.3db34d8d965f82d3.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
  178. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +22 -22
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +22 -22
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +22 -22
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +21 -21
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +21 -21
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +22 -22
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +21 -21
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +22 -22
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +22 -22
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +21 -21
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +22 -22
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -24
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +22 -22
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +22 -22
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +21 -21
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +22 -22
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -24
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -24
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +21 -21
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +21 -21
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +22 -22
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +22 -22
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +21 -21
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +21 -21
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +21 -21
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +22 -22
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +22 -22
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +21 -21
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +22 -22
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +22 -22
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +22 -22
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +22 -22
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +22 -22
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +21 -21
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +22 -22
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +22 -22
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +22 -22
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +22 -22
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +22 -22
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +22 -22
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +22 -22
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +22 -22
  278. package/docs/goal-context/04-mock-scenarios.md +13 -0
  279. package/graphs/catalog/catalog.yaml +1 -1
  280. package/graphs/heal/heal-loop.yaml +1 -0
  281. package/graphs/overlays/stop-heal-ladder.yaml +113 -0
  282. package/graphs/units/verbs/recipes.yaml +11 -11
  283. package/graphs/work/research-report.yaml +10 -2
  284. package/package.json +1 -1
  285. package/scripts/heal/run-role.ts +99 -5
  286. package/scripts/land-global-checks.ts +6 -1
  287. package/scripts/lib/decompose-ab.ts +1 -0
  288. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  289. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  290. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  291. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  292. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  293. package/scripts/lib/tui-regress-checks.ts +33 -13
  294. package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
  295. package/scripts/release-loop/gate-image-pin.ts +81 -0
  296. package/scripts/release-loop/gate-node-sim.ts +207 -0
  297. package/scripts/release-loop/gate-node.ts +285 -46
  298. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  299. package/scripts/release-loop/gate-radius-live.ts +97 -13
  300. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  301. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  302. package/scripts/release-loop/resume-release.ts +83 -8
  303. package/scripts/ux-sim.ts +18 -1
  304. package/scripts/warm-pool-provider-config.ts +263 -0
  305. package/skills/omni-crawl/SKILL.md +5 -2
  306. package/skills/omni-crawl/scripts/main.ts +84 -23
  307. package/src/acp/core-turn-bridge.ts +13 -0
  308. package/src/agent/registry.ts +2 -0
  309. package/src/agent/task-notification.ts +25 -5
  310. package/src/agent/types.ts +6 -0
  311. package/src/agent-mission/mission-cli.ts +24 -0
  312. package/src/agent-mission/mission-out.ts +595 -0
  313. package/src/agent-mission/tool-install.ts +88 -2
  314. package/src/agent-substrate/context-strategy.ts +4 -4
  315. package/src/agent-substrate/self-review-cli.ts +178 -13
  316. package/src/auto-research/research-turn.ts +123 -50
  317. package/src/autopilot/pr-manager.ts +38 -7
  318. package/src/autopilot/pty-control-loop.ts +2 -0
  319. package/src/capture/tui-self-report.ts +22 -6
  320. package/src/chat/index.ts +1 -1
  321. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  322. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  323. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  324. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  325. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  326. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  327. package/src/cli/pr-land-heavy-remote.ts +32 -0
  328. package/src/cli/pr-land-overlap-evidence.ts +100 -1
  329. package/src/cli/pr-land-pod-shadow-job.ts +60 -0
  330. package/src/cli/release-checklist-read-cli.ts +20 -10
  331. package/src/cli/research-cli.ts +4 -5
  332. package/src/cli/tasks-cli.ts +7 -0
  333. package/src/compact/auto.ts +8 -1
  334. package/src/control-plane/ledger.ts +52 -2
  335. package/src/control-plane/server.ts +16 -2
  336. package/src/core-turn/run-core-turn.ts +311 -90
  337. package/src/core-turn/run-goal-loop.ts +18 -0
  338. package/src/core-turn/types.ts +2 -0
  339. package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
  340. package/src/dashboard/classic-sidetab-mission.ts +185 -0
  341. package/src/dashboard/index.ts +149 -15
  342. package/src/dashboard/input/agent-wake.ts +23 -1
  343. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
  344. package/src/dashboard/mission-cli-consumer.ts +153 -0
  345. package/src/dashboard/seat-boot-preamble.ts +171 -1
  346. package/src/dashboard/side-basic-runtime.ts +54 -1
  347. package/src/dashboard/sidetab-runtime.ts +90 -1
  348. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  349. package/src/dashboard/skill-detection-runtime.ts +55 -15
  350. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  351. package/src/dashboard/turn-preamble.ts +53 -15
  352. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  353. package/src/graph-runner/graph-cli.ts +23 -7
  354. package/src/graph-runner/graph-tick.ts +10 -2
  355. package/src/graph-runner/runner.ts +1 -1
  356. package/src/grok/agent-search.ts +14 -4
  357. package/src/grok/credential.ts +28 -11
  358. package/src/harness/harness-pod-dispatch.ts +81 -15
  359. package/src/harness/harness-stop.ts +155 -11
  360. package/src/index.ts +34 -5
  361. package/src/instance/spawn-elanous.ts +6 -4
  362. package/src/llm.ts +166 -8
  363. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  364. package/src/loops/orchestrator/tick.ts +13 -0
  365. package/src/maturity/feature-maturity.ts +1 -1
  366. package/src/native-tool-catalog.ts +2 -2
  367. package/src/nexus/api/harness-traversal.ts +11 -0
  368. package/src/pr-tool/census.ts +3 -2
  369. package/src/pty-shell/tui-run-state.ts +188 -2
  370. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  371. package/src/release-loop/checklist.ts +9 -1
  372. package/src/repl/index.ts +43 -2
  373. package/src/research/axis-fanout.ts +121 -16
  374. package/src/research/bloom-exemplars.ts +3 -1
  375. package/src/research/gap-followup.ts +13 -1
  376. package/src/research/plugin-discovery.ts +36 -14
  377. package/src/research-bridge/invoke.ts +22 -5
  378. package/src/research-bridge/types.ts +2 -0
  379. package/src/self-dev/decompose.ts +119 -5
  380. package/src/self-dev/launch-preflight-text.ts +5 -6
  381. package/src/self-dev/orchestrate.ts +12 -2
  382. package/src/self-dev/review-provider-fallback.ts +9 -2
  383. package/src/self-dev/run-supervisor.ts +42 -4
  384. package/src/self-dev/run-types.ts +4 -0
  385. package/src/self-implement/doctor-visit.ts +88 -0
  386. package/src/self-implement/goal-author.ts +326 -3
  387. package/src/self-implement/graph-overlay-yaml.ts +7 -0
  388. package/src/self-implement/headless-elanous-driver.ts +31 -2
  389. package/src/self-implement/heal-intake.ts +112 -4
  390. package/src/self-implement/heal-triage.ts +20 -0
  391. package/src/self-implement/host-regate.ts +27 -4
  392. package/src/self-implement/merge-train.ts +5 -0
  393. package/src/self-implement/orchestrator.ts +126 -11
  394. package/src/self-implement/regate-detail.ts +38 -1
  395. package/src/self-implement/rework-child-provider.ts +25 -0
  396. package/src/self-implement/run-chart.ts +119 -0
  397. package/src/self-implement/run-ledger.ts +112 -11
  398. package/src/self-implement/run-stop.ts +188 -4
  399. package/src/self-implement/stop-autoheal.ts +13 -0
  400. package/src/session/chat.ts +38 -4
  401. package/src/session-runtime/index.ts +98 -4
  402. package/src/session-runtime/tier-flip.ts +3 -3
  403. package/src/sidetab-core/model.ts +19 -5
  404. package/src/sidetab-core/visible-agent-mission.ts +186 -0
  405. package/src/skills/name-match.ts +20 -0
  406. package/src/skills/tools/agent.ts +30 -2
  407. package/src/skills/tools/omni-search.ts +67 -5
  408. package/src/task-agent/pod-distributor-entry.ts +3 -0
  409. package/src/task-agent/task-hand.ts +27 -0
  410. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  411. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  412. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  413. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  414. package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
  415. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  416. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
  417. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  418. package/src/task-orchestrator/surfaces/self-implement-pod.ts +165 -45
  419. package/src/tokens.ts +35 -2
  420. package/src/tool-runtime/agent-runtime.ts +1 -0
  421. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  422. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  423. package/src/tool-runtime/types.ts +1 -0
  424. package/src/tui/entry.ts +14 -4
  425. package/src/tui/sidetab/attach.ts +47 -0
  426. package/src/tui-client/local-chat-turn.ts +26 -13
  427. package/src/tui.ts +22 -0
  428. package/src/ux-sim/fake-kubectl.ts +37 -3
  429. package/src/ux-sim/fault-pool-cap.ts +11 -6
  430. package/src/ux-sim/mock-scenario-catalog.json +41 -0
  431. package/src/ux-sim/mock-scenario-catalog.ts +156 -0
  432. package/src/ux-sim/scenario.ts +116 -23
  433. package/src/version/packed-revision.json +1 -1
  434. package/src/voice/voice-tts-singleton.ts +18 -3
  435. package/src/web-search/grok.ts +5 -9
  436. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
  437. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
  438. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
  439. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
  443. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
  445. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +0 -41
  453. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
  454. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
  456. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
  461. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
  467. package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
  472. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
  473. package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
  474. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
  481. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
  483. package/apps/pwa/out/_next/static/chunks/53aeb4ee-51c92f8d683f5220.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
  487. package/apps/pwa/out/_next/static/chunks/5744.b9415e18ad623100.js +0 -23
  488. package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
  490. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
  494. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
  496. package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +0 -2
  497. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
  499. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
  510. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
  527. package/apps/pwa/out/_next/static/chunks/9834.63ab2bbc3153172e.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/addc2b32.8c4ff8f0aefe987d.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
  588. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  589. /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
@@ -18,6 +18,7 @@ export interface ResearchGapFollowupInput {
18
18
  request: string;
19
19
  questions: readonly BloomResearchQuestion[];
20
20
  evidence: readonly ResearchEvidenceEnvelope[];
21
+ signal?: AbortSignal;
21
22
  /** Optional remaining time supplied by the owning turn; omitted uses the fixed 2-minute cap. */
22
23
  remainingBudgetMs?: number;
23
24
  roundsUsed?: number;
@@ -128,6 +129,7 @@ export async function runGapFollowup(
128
129
  deps: ResearchGapFollowupDeps = {},
129
130
  ): Promise<ResearchGapFollowupResult> {
130
131
  const plan = planGapFollowup(input);
132
+ if (input.signal?.aborted) return { ...plan, followupEvidence: [], discoveryCards: [] };
131
133
  const startedAt = (deps.now ?? Date.now)();
132
134
  const deadline = startedAt + plan.timeBudgetMs;
133
135
  const discover = async (failedQuestions: ReadonlySet<string>): Promise<{ cards: string[]; evidence: ResearchEvidenceEnvelope[] }> => {
@@ -139,6 +141,9 @@ export async function runGapFollowup(
139
141
  const remainingMs = deadline - (deps.now ?? Date.now)();
140
142
  if (remainingMs <= 0) break;
141
143
  const controller = new AbortController();
144
+ const abortFromParent = () => controller.abort(input.signal?.reason);
145
+ input.signal?.addEventListener('abort', abortFromParent, { once: true });
146
+ if (input.signal?.aborted) abortFromParent();
142
147
  const timer = setTimeout(() => controller.abort(new Error('plugin discovery time budget exhausted')),
143
148
  Math.min(10_000, remainingMs));
144
149
  try {
@@ -158,7 +163,10 @@ export async function runGapFollowup(
158
163
  questionId: gap.questionId, reason: error instanceof Error ? error.message.slice(0, 160) : String(error).slice(0, 160),
159
164
  }, { level: 'warn' });
160
165
  }
161
- finally { clearTimeout(timer); }
166
+ finally {
167
+ clearTimeout(timer);
168
+ input.signal?.removeEventListener('abort', abortFromParent);
169
+ }
162
170
  }
163
171
  return { cards, evidence };
164
172
  };
@@ -168,6 +176,9 @@ export async function runGapFollowup(
168
176
  }
169
177
 
170
178
  const controller = new AbortController();
179
+ const abortFromParent = () => controller.abort(input.signal?.reason);
180
+ input.signal?.addEventListener('abort', abortFromParent, { once: true });
181
+ if (input.signal?.aborted) abortFromParent();
171
182
  const timer = setTimeout(() => controller.abort(new Error('research gap follow-up time budget exhausted')),
172
183
  Math.max(1, deadline - (deps.now ?? Date.now)()));
173
184
  try {
@@ -200,6 +211,7 @@ export async function runGapFollowup(
200
211
  return { ...plan, followupEvidence: [...outcomes, ...discovered.evidence], discoveryCards: discovered.cards };
201
212
  } finally {
202
213
  clearTimeout(timer);
214
+ input.signal?.removeEventListener('abort', abortFromParent);
203
215
  }
204
216
  }
205
217
 
@@ -136,15 +136,30 @@ function card(gap: string, candidates: readonly PluginDiscoveryCandidate[], inst
136
136
 
137
137
  /** One bounded, fail-soft discovery attempt for a research capability gap. */
138
138
  export async function discoverResearchPlugin(gapText: string, deps: PluginDiscoveryDeps = {}): Promise<PluginDiscoveryResult> {
139
+ const discoveryStartedAt = performance.now();
140
+ const log = deps.log ?? ((event: string, data: Record<string, unknown>) => debug.log('research.plugin-discovery', event, data));
141
+ const observe = (event: string, data: Record<string, unknown>): void => {
142
+ try { log(event, data); } catch { /* timing must not change discovery behavior */ }
143
+ };
144
+ observe('started', {});
145
+ const finish = (result: PluginDiscoveryResult): PluginDiscoveryResult => {
146
+ observe('completed', {
147
+ elapsedMs: Math.round((performance.now() - discoveryStartedAt) * 10) / 10,
148
+ outcome: result.outcome,
149
+ candidateCount: result.candidates.length,
150
+ installed: result.installed !== undefined,
151
+ });
152
+ return result;
153
+ };
139
154
  const gap = safeGap(gapText);
140
- if (!gap) return { candidates: [], card: 'Plugin discovery skipped: unsafe or empty gap.', outcome: 'invalid-gap' };
155
+ if (!gap) return finish({ candidates: [], card: 'Plugin discovery skipped: unsafe or empty gap.', outcome: 'invalid-gap' });
141
156
  const aborted = (): PluginDiscoveryResult => ({ candidates: [], card: 'Plugin discovery skipped: time budget exhausted.', outcome: 'create-suggestion' });
142
- if (deps.signal?.aborted) return aborted();
143
- const log = deps.log ?? ((event: string, data: Record<string, unknown>) => debug.log('research.plugin-discovery', event, data));
157
+ if (deps.signal?.aborted) return finish(aborted());
144
158
  const threshold = Number.isSafeInteger(deps.githubStarThreshold) && (deps.githubStarThreshold as number) > 0
145
159
  ? deps.githubStarThreshold as number : configuredStarThreshold();
146
160
  const candidates: PluginDiscoveryCandidate[] = [];
147
161
 
162
+ const marketStartedAt = performance.now();
148
163
  try {
149
164
  const market = await (deps.market ?? (() => ensureMarketIndex('elanous')))();
150
165
  // A signed index is the only built-in source with a verifiable install spec.
@@ -159,15 +174,19 @@ export async function discoverResearchPlugin(gapText: string, deps: PluginDiscov
159
174
  installSpec: `${entry.name}@elanous` });
160
175
  }
161
176
  }
162
- } catch { log('market-unavailable', { gap: gap.slice(0, 80) }); }
163
- if (deps.signal?.aborted) return aborted();
177
+ } catch { observe('market-unavailable', { gap: gap.slice(0, 80) }); }
178
+ finally {
179
+ observe('stage-complete', { stage: 'signed-market', elapsedMs: Math.round((performance.now() - marketStartedAt) * 10) / 10 });
180
+ }
181
+ if (deps.signal?.aborted) return finish(aborted());
164
182
 
183
+ const searchStartedAt = performance.now();
165
184
  try {
166
185
  const found = await (deps.search ?? ((query: string, signal?: AbortSignal) => discoverCapability(query,
167
186
  { layer: 'skill', limit: MAX_CANDIDATES, community: false, signal })))(gap, deps.signal);
168
- if (deps.signal?.aborted) return aborted();
187
+ if (deps.signal?.aborted) return finish(aborted());
169
188
  for (const hit of found.slice(0, MAX_CANDIDATES)) {
170
- if (deps.signal?.aborted) return aborted();
189
+ if (deps.signal?.aborted) return finish(aborted());
171
190
  let url: URL;
172
191
  try { url = new URL(hit.url); } catch { continue; }
173
192
  if (url.protocol !== 'https:' || url.username || url.password) continue;
@@ -186,8 +205,11 @@ export async function discoverResearchPlugin(gapText: string, deps: PluginDiscov
186
205
  ? { installSpec: `https://github.com/${repo!.owner}/${repo!.repo}.git#${github.sha}` } : {}),
187
206
  });
188
207
  }
189
- } catch { log('search-unavailable', { gap: gap.slice(0, 80) }); }
190
- if (deps.signal?.aborted) return aborted();
208
+ } catch { observe('search-unavailable', { gap: gap.slice(0, 80) }); }
209
+ finally {
210
+ observe('stage-complete', { stage: 'capability-search', elapsedMs: Math.round((performance.now() - searchStartedAt) * 10) / 10 });
211
+ }
212
+ if (deps.signal?.aborted) return finish(aborted());
191
213
 
192
214
  const deduped = candidates.filter((item, index) => candidates.findIndex(other => other.url === item.url && other.name === item.name) === index)
193
215
  .slice(0, MAX_CANDIDATES);
@@ -197,20 +219,20 @@ export async function discoverResearchPlugin(gapText: string, deps: PluginDiscov
197
219
  if (installable.length === 1) {
198
220
  const candidate = installable[0]!;
199
221
  try {
200
- if (deps.signal?.aborted) return aborted();
222
+ if (deps.signal?.aborted) return finish(aborted());
201
223
  const item = await (deps.install ?? defaultInstall)(candidate.installSpec!);
202
224
  const undo = `eln plugin remove ${item.name}`;
203
225
  installed = { name: item.name, path: item.path,
204
226
  notice: `Reason: missing research capability ${gap}; source: ${candidate.source}; permissions: ${candidate.permissions.join(', ') || 'none declared'}.`, undo };
205
- log('installed', { name: item.name, source: candidate.source, undo });
227
+ observe('installed', { name: item.name, source: candidate.source, undo });
206
228
  } catch (error) {
207
- log('install-refused', { name: candidate.name, reason: error instanceof Error ? error.message.slice(0, 120) : 'unknown' });
229
+ observe('install-refused', { name: candidate.name, reason: error instanceof Error ? error.message.slice(0, 120) : 'unknown' });
208
230
  }
209
231
  }
210
232
  const outcome: PluginDiscoveryResult['outcome'] = installed ? 'installed' : deduped.length ? 'proposed' : 'create-suggestion';
211
233
  const result = { candidates: deduped, installed, card: card(gap, deduped, installed), outcome };
212
- log(outcome, { gap: gap.slice(0, 80), count: deduped.length, installed: installed?.name });
213
- return result;
234
+ observe(outcome, { gap: gap.slice(0, 80), count: deduped.length, installed: installed?.name });
235
+ return finish(result);
214
236
  }
215
237
 
216
238
  /** Re-query through exactly one installed, declared read-only skill with no local-file or shell tools. */
@@ -14,7 +14,7 @@
14
14
  // isolation without standing up the LLM stack.
15
15
 
16
16
  import type { ExternalResearchResult, InvokeResearchOpts } from './types.js';
17
- import type { SkillManifest } from '../skills/runner.js';
17
+ import type { ExecuteSkillOpts, SkillManifest } from '../skills/runner.js';
18
18
  import type { BloomResearchQuestion } from '../auto-research/question-ladder-contract.js';
19
19
  import type { AxisFanoutDeps, AxisFanoutResult } from '../research/axis-fanout.js';
20
20
  import { recordResult } from './store.js';
@@ -76,8 +76,23 @@ export type ResearchInvoker = (
76
76
  args: string,
77
77
  onProgress?: (delta: string) => void,
78
78
  signal?: AbortSignal,
79
+ skillRootDir?: string,
79
80
  ) => Promise<ResearchInvocationOutcome>;
80
81
 
82
+ export type ResearchSkillExecutorForTest = (
83
+ manifest: SkillManifest,
84
+ args: string,
85
+ onProgress?: (delta: string) => void,
86
+ opts?: ExecuteSkillOpts,
87
+ ) => Promise<{ finalResponse: string }>;
88
+
89
+ let researchSkillExecutorForTest: ResearchSkillExecutorForTest | null = null;
90
+
91
+ /** Replace only skill execution in tests; manifest parsing still uses the real selected skill root. */
92
+ export function setResearchSkillExecutorForTest(executor: ResearchSkillExecutorForTest | null): void {
93
+ researchSkillExecutorForTest = executor;
94
+ }
95
+
81
96
  let invoker: ResearchInvoker | null = null;
82
97
 
83
98
  /** Register the production / test invoker. Pass null to revert to
@@ -103,19 +118,21 @@ async function defaultInvoker(
103
118
  args: string,
104
119
  onProgress?: (delta: string) => void,
105
120
  signal?: AbortSignal,
121
+ skillRootDir?: string,
106
122
  ): Promise<ResearchInvocationOutcome> {
107
123
  const { parseSkillMd, executeSkill } = await import('../skills/runner.js');
108
- const manifest = parseSkillMd(skillName);
124
+ const manifest = parseSkillMd(skillName, skillRootDir);
109
125
  if (!manifest) {
110
126
  return {
111
127
  output: '',
112
128
  ok: false,
113
- error: `skill "${skillName}" not found under ~/.claude/skills/`,
129
+ error: `skill "${skillName}" not found under ${skillRootDir ?? '~/.claude/skills'}/`,
114
130
  };
115
131
  }
116
132
  try {
117
133
  // ★ research 격리 — 파일-쓰기 도구 deny 주입(main 트리 오염 차단). Bash·검색도구는 유지.
118
- const result = await executeSkill(withResearchIsolation(manifest), args, (delta) => {
134
+ const run = researchSkillExecutorForTest ?? executeSkill;
135
+ const result = await run(withResearchIsolation(manifest), args, (delta) => {
119
136
  if (onProgress) onProgress(delta);
120
137
  }, { signal });
121
138
  return researchOutcomeFromSkillRun(result);
@@ -138,7 +155,7 @@ export async function invokeResearch(
138
155
  ): Promise<ExternalResearchResult> {
139
156
  const skillName = opts.skill || DEFAULT_SKILL;
140
157
  const startedAt = new Date();
141
- const outcome = await (invoker ?? defaultInvoker)(skillName, topic, opts.onProgress, opts.signal);
158
+ const outcome = await (invoker ?? defaultInvoker)(skillName, topic, opts.onProgress, opts.signal, opts.skillRootDir);
142
159
  const finishedAt = new Date();
143
160
  const result: ExternalResearchResult = {
144
161
  topic,
@@ -28,6 +28,8 @@ export interface ExternalResearchResult {
28
28
  export interface InvokeResearchOpts {
29
29
  /** Skill name override; default 'omni-crawl'. */
30
30
  skill?: string;
31
+ /** Root directory containing the selected catalog entry. */
32
+ skillRootDir?: string;
31
33
  /** Stream progress chunks back to the caller (e.g. dashboard chat
32
34
  * pane) so the user sees activity for long-running invocations. */
33
35
  onProgress?: (delta: string) => void;
@@ -107,7 +107,7 @@ export interface SelfDevDecompositionMeta {
107
107
  * `authored-empty` Fabric 저작이 분해할 arc를 만들지 못했다
108
108
  * `llm-failed` LLM 호출 자체가 «실패»했다(타임아웃·제공자 장애) ⇒ 분해를 «못 한» 것이다
109
109
  * ⛔ 「쪼갤 필요가 없었다」와 Fabric 사전분해 실패는 다른 값이다. */
110
- outcome: 'decomposed' | 'single-no-subtasks' | 'missing-research-context' | 'grounding-empty' | 'authored-empty' | 'llm-failed';
110
+ outcome: 'decomposed' | 'single-no-subtasks' | 'slice-rejected' | 'missing-research-context' | 'grounding-empty' | 'authored-empty' | 'llm-failed';
111
111
  /** `llm-failed` 일 때만 실린다 — 문면의 «머리»를 자르지 않는다. */
112
112
  error?: string;
113
113
  /** Present for Fabric decomposition, including zero, to distinguish no omissions from no report. */
@@ -399,6 +399,10 @@ export function buildSelfDevDecomposePrompt(feature: string, maxTasks = DEFAULT_
399
399
  '- SEPARATE DEFINE FROM WIRE: adding a new function/type/export is a SEPARATE task from wiring it into an existing runtime call site. A task that both defines a new symbol AND integrates it across modules tends to leave dead-code (defined but never called) that fails integration gates. Pattern: (a) add the function + its unit test; then (b) a dependent task that wires it into the specific existing call site — name the exact `file.ts:function` to modify.',
400
400
  '- Exception to SEPARATE DEFINE FROM WIRE: Keep a definition and its registration/wiring in the same sub-feature — a handler with its route, a command with its CLI registration, a node with its graph/recipe entry.',
401
401
  '- Each sub-feature must be a self-contained, mergeable unit of work.',
402
+ '- LANDABLE SLICE CONTRACT: every sub-feature must state a completionBoundary that can be implemented and verified without a later sub-feature, future component, or unwired operational path. If it cannot stand alone, split it further or omit it.',
403
+ '- Every sub-feature must name one existing mock scenario as mockScenario.id (MS-01, MS-02, ...), plus a concrete mockScenario.injection and mockScenario.observation. Describe the event or input injected and the output/event that proves the slice works.',
404
+ '- List every required earlier slice explicitly in dependsOn. An empty list means this slice has no predecessor; never rely on implicit order or a future capability.',
405
+ '- Declare futureAssumptions as an array. If the slice needs any future component, later slice, or unwired operational path, list it there; that slice will be rejected with a decompose.slice-rejected event containing its id and reason, and must be split or omitted.',
402
406
  '- `dependsOn`: list the `id`s of sub-features that MUST land first (e.g. a shared',
403
407
  ' type/interface before its consumers). Independent sub-features share NO dependency',
404
408
  ' so they run in parallel. No cycles.',
@@ -410,8 +414,10 @@ export function buildSelfDevDecomposePrompt(feature: string, maxTasks = DEFAULT_
410
414
  '',
411
415
  '## Output (STRICT JSON — no prose, no code fence)',
412
416
  '{"subtasks":[{"id":"<short-slug>","feature":"<imperative sub-feature text>",',
413
- ' "dependsOn":["<id>",...],"hotPaths":["<path>",...],',
414
- ' "goalType":"<implement|research|document|operate>"}]}',
417
+ ' "completionBoundary":"<standalone change and observable outcome>",',
418
+ ' "mockScenario":{"id":"MS-01","injection":"<input/event injected>","observation":"<output/event observed>"},',
419
+ ' "futureAssumptions":[],"dependsOn":["<explicit predecessor id>",...],',
420
+ ' "hotPaths":["<path>",...],"goalType":"<implement|research|document|operate>"}]}',
415
421
  ].join('\n');
416
422
  }
417
423
 
@@ -421,6 +427,19 @@ interface RawSubtask {
421
427
  dependsOn?: unknown;
422
428
  hotPaths?: unknown;
423
429
  goalType?: unknown;
430
+ completionBoundary?: unknown;
431
+ mockScenario?: unknown;
432
+ futureAssumptions?: unknown;
433
+ }
434
+
435
+ interface RejectedDecompositionSlice {
436
+ id: string | null;
437
+ reasons: string[];
438
+ }
439
+
440
+ interface ValidatedDecomposition {
441
+ goals: SelfDevGoal[];
442
+ rejected: RejectedDecompositionSlice[];
424
443
  }
425
444
 
426
445
  const SELF_DEV_GOAL_TYPES = new Set(['implement', 'research', 'document', 'operate'] as const);
@@ -625,6 +644,90 @@ export function parseSelfDevDecomposition(
625
644
  return goals;
626
645
  }
627
646
 
647
+ /** Parse the production decomposition contract and keep a reason for each rejected slice. */
648
+ function parseValidatedSelfDevDecomposition(
649
+ subtasks: readonly unknown[],
650
+ defaults: { base?: string; autoMerge?: boolean },
651
+ ): ValidatedDecomposition {
652
+ const goals: SelfDevGoal[] = [];
653
+ const rejected: RejectedDecompositionSlice[] = [];
654
+ const allIds = new Set(subtasks.flatMap((value) => isRawSubtask(value)
655
+ && typeof value.id === 'string' && value.id.trim() ? [value.id.trim()] : []));
656
+ const seenIds = new Set<string>();
657
+
658
+ subtasks.forEach((value, index) => {
659
+ if (!isRawSubtask(value)) {
660
+ rejected.push({ id: null, reasons: ['slice must be an object'] });
661
+ return;
662
+ }
663
+ const feature = typeof value.feature === 'string' ? value.feature.trim() : '';
664
+ const id = typeof value.id === 'string' && value.id.trim() ? value.id.trim() : String(index);
665
+ const reasons: string[] = [];
666
+ const completionBoundary = typeof value.completionBoundary === 'string' ? value.completionBoundary.trim() : '';
667
+ if (!feature) reasons.push('feature is missing');
668
+ if (!completionBoundary) reasons.push('completionBoundary is missing');
669
+
670
+ const mock = value.mockScenario as { id?: unknown; injection?: unknown; observation?: unknown } | undefined;
671
+ const scenarioId = typeof mock?.id === 'string' ? mock.id.trim() : '';
672
+ const injection = typeof mock?.injection === 'string' ? mock.injection.trim() : '';
673
+ const observation = typeof mock?.observation === 'string' ? mock.observation.trim() : '';
674
+ if (!/^MS-[A-Z0-9][A-Z0-9-]*$/i.test(scenarioId)) reasons.push('mockScenario.id must be an MS id');
675
+ if (!injection) reasons.push('mockScenario.injection is missing');
676
+ if (!observation) reasons.push('mockScenario.observation is missing');
677
+
678
+ if (!Array.isArray(value.futureAssumptions)) reasons.push('futureAssumptions must be declared as an array');
679
+ else if (value.futureAssumptions.length > 0) reasons.push('future assumptions require split or omission');
680
+
681
+ if (value.dependsOn === undefined) reasons.push('dependsOn is missing; declare an explicit id array');
682
+ else if (!Array.isArray(value.dependsOn)) reasons.push('dependsOn must be an explicit id array');
683
+ const dependsOn = Array.isArray(value.dependsOn)
684
+ ? value.dependsOn.filter((dependency): dependency is string => typeof dependency === 'string' && dependency.trim().length > 0)
685
+ : [];
686
+ if (Array.isArray(value.dependsOn) && dependsOn.length !== value.dependsOn.length) reasons.push('dependsOn contains an invalid predecessor id');
687
+ for (const dependency of dependsOn) {
688
+ if (dependency === id || !allIds.has(dependency)) reasons.push(`dependsOn references a missing or self predecessor: ${dependency}`);
689
+ }
690
+
691
+ let uniqueId = id;
692
+ if (seenIds.has(uniqueId)) uniqueId = `${uniqueId}-${index}`;
693
+ seenIds.add(uniqueId);
694
+ if (reasons.length) {
695
+ rejected.push({ id, reasons: [...new Set(reasons)] });
696
+ return;
697
+ }
698
+
699
+ const llmHot = Array.isArray(value.hotPaths)
700
+ ? value.hotPaths.filter((path): path is string => typeof path === 'string')
701
+ : [];
702
+ const hotPaths = [...new Set([...llmHot, ...inferHotPaths(feature)])];
703
+ goals.push({
704
+ id: uniqueId,
705
+ feature,
706
+ completionBoundary,
707
+ mockScenario: { id: scenarioId, injection, observation },
708
+ ...(dependsOn.length ? { dependsOn } : {}),
709
+ ...(hotPaths.length ? { hotPaths } : {}),
710
+ ...(isSelfDevGoalType(value.goalType) ? { goalType: value.goalType } : {}),
711
+ ...defaults,
712
+ });
713
+ });
714
+
715
+ // A dependent slice cannot stay independently landable when its predecessor was rejected.
716
+ let removedDependent = true;
717
+ while (removedDependent) {
718
+ removedDependent = false;
719
+ const validIds = new Set(goals.map((goal) => goal.id));
720
+ for (const goal of [...goals]) {
721
+ const missing = (goal.dependsOn ?? []).filter((dependency) => !validIds.has(dependency));
722
+ if (missing.length === 0) continue;
723
+ goals.splice(goals.indexOf(goal), 1);
724
+ rejected.push({ id: goal.id ?? null, reasons: [`dependsOn references a rejected predecessor: ${missing.join(', ')}`] });
725
+ removedDependent = true;
726
+ }
727
+ }
728
+ return { goals, rejected };
729
+ }
730
+
628
731
  /**
629
732
  * Decompose a feature into a self-dev DAG via the LLM seam. Falls back to
630
733
  * a single goal (the whole feature) when decomposition yields nothing —
@@ -710,10 +813,21 @@ export async function decomposeSelfDevGoal(
710
813
  const rawSubtasks = extractRawSubtasks(raw);
711
814
  const actualTaskCount = rawSubtasks.length;
712
815
  const decomposition: SelfDevDecompositionMeta = { recommendedMaxTasks: maxTasks, actualTaskCount, truncatedAtHardMax: actualTaskCount > hardMaxTasks, exceededRecommendedMax: actualTaskCount > maxTasks, outcome: actualTaskCount === 0 ? 'single-no-subtasks' : 'decomposed' };
713
- const parsedGoals = parseSelfDevDecomposition(JSON.stringify({ subtasks: rawSubtasks.slice(0, hardMaxTasks) }), defaults);
816
+ const validated = parseValidatedSelfDevDecomposition(rawSubtasks.slice(0, hardMaxTasks), defaults);
817
+ for (const rejection of validated.rejected) {
818
+ debug.log(opts.observation?.category ?? 'self-dev.decompose', 'decompose.slice-rejected', {
819
+ ...observationIdentity(opts.observation ?? {}),
820
+ sliceId: rejection.id,
821
+ reasons: rejection.reasons,
822
+ }, { level: 'warn' });
823
+ }
824
+ const parsedGoals = validated.goals;
714
825
  const foldedGoals = foldRegistrationOnlyGoals(parsedGoals);
715
826
  const goals = parsedGoals.length > 0 ? pruneDanglingDependencies(foldedGoals) : [single];
716
- return finalizeDecomposition(feature, goals, decomposition, opts, parsedGoals.length > 0 ? arcHint : undefined, parsedGoals.length - foldedGoals.length);
827
+ const finalDecomposition = parsedGoals.length === 0 && validated.rejected.length > 0
828
+ ? { ...decomposition, outcome: 'slice-rejected' as const }
829
+ : decomposition;
830
+ return finalizeDecomposition(feature, goals, finalDecomposition, opts, parsedGoals.length > 0 ? arcHint : undefined, parsedGoals.length - foldedGoals.length);
717
831
  }
718
832
 
719
833
  /** Where the decompose model came from — `'explicit'` is the caller's `model` argument layer. */
@@ -1,3 +1,5 @@
1
+ import { parseTargetPathHintLine } from '../release-loop/checklist-target-path-hint.js';
2
+
1
3
  export type WorktreePathTouchAxis = 'touched' | 'untouched' | 'unreadable';
2
4
 
3
5
  /** 겹친 경로가 실제로 손대어졌는지의 읽기 전용 관측. */
@@ -534,15 +536,12 @@ export interface AskTargetPathHintsParseResult {
534
536
  }
535
537
 
536
538
  export function parseAskTargetPathHintsResult(askText: string): AskTargetPathHintsParseResult {
537
- // ⛔ 첫 «비어 있지 않은» 줄만 본다 — 본문 전체를 훑으면 산문 속 경로까지 끌려와 오탐이 된다.
538
- const firstLine = askText.split(/\r?\n/).find((line) => line.trim() !== '');
539
- if (firstLine === undefined) return { paths: [], rejected: [], labelMissing: true };
540
- const match = /^\s*(?:대상\s*경로|target\s*paths?)\s*[::]\s*(.*)$/i.exec(firstLine);
541
- if (!match) return { paths: [], rejected: [], labelMissing: true };
539
+ const parsed = parseTargetPathHintLine(askText);
540
+ if (parsed.labelMissing) return { paths: [], rejected: [], labelMissing: true };
542
541
 
543
542
  const paths: string[] = [];
544
543
  const rejected: AskTargetPathHintRejection[] = [];
545
- for (const fragment of match[1]!.split(/[·,]/)) {
544
+ for (const fragment of parsed.fragments) {
546
545
  const piece = fragment.trim().replace(/^`+|`+$/g, '');
547
546
  if (piece === '') rejected.push({ fragment, reason: 'empty' });
548
547
  // ⛔ 「경로처럼 생긴 것」만 남긴다 — 확장자나 디렉터리 구분자가 있어야 한다.
@@ -147,6 +147,16 @@ function shardIdentityFeature(feature: string, identity: SelfDevShardIdentity |
147
147
  : `${feature}\n\n## Shard identity\n${JSON.stringify(identity)}`;
148
148
  }
149
149
 
150
+ function selfDevGoalFeature(goal: SelfDevGoal): string {
151
+ const { completionBoundary, mockScenario } = goal;
152
+ const acceptance: string[] = [];
153
+ if (completionBoundary?.trim()) acceptance.push(`Completion boundary: ${completionBoundary.trim()}`);
154
+ if (mockScenario?.id?.trim()) acceptance.push(`Mock scenario: ${mockScenario.id.trim()}`);
155
+ if (mockScenario?.injection?.trim()) acceptance.push(`Injection: ${mockScenario.injection.trim()}`);
156
+ if (mockScenario?.observation?.trim()) acceptance.push(`Observation: ${mockScenario.observation.trim()}`);
157
+ return acceptance.length ? `${goal.feature}\n\n## Slice acceptance\n${acceptance.join('\n')}` : goal.feature;
158
+ }
159
+
150
160
  const SHARD_WORKING_MEMORY_EMIT_HINT =
151
161
  '\n\n## Working-memory handoff\nA downstream shard depends on this work. Before your final response, emit the following marker and one JSON object so it can reuse your findings. Put reusable boundaries in `reusables` and your key choices in `decisions`; use empty arrays when there are none.\n[WORKING-MEMORY]\n{"reusables":[],"decisions":[],"summary":"What this shard established for downstream work."}';
152
162
 
@@ -1236,7 +1246,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1236
1246
  surfaceKind: 'self-implement',
1237
1247
  surface: (goal) => ({
1238
1248
  kind: 'self-implement',
1239
- feature: goal.feature,
1249
+ feature: selfDevGoalFeature(goal),
1240
1250
  ...(goal.after !== undefined ? { after: goal.after } : {}),
1241
1251
  ...(goal.base !== undefined ? { base: goal.base } : {}),
1242
1252
  ...(goal.autoMerge !== undefined ? { autoMerge: goal.autoMerge } : {}),
@@ -1386,7 +1396,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
1386
1396
  const task = graph.getTask(taskId);
1387
1397
  if (task?.surface.kind === 'self-implement') {
1388
1398
  graph.updateTask(taskId, {
1389
- surface: { ...task.surface, feature: shardIdentityFeature(shard.goal.feature, identity) },
1399
+ surface: { ...task.surface, feature: shardIdentityFeature(selfDevGoalFeature(shard.goal), identity) },
1390
1400
  }, { now: now() });
1391
1401
  }
1392
1402
  }
@@ -230,6 +230,7 @@ export async function runSubscriptionReviewer(
230
230
  }
231
231
 
232
232
  export type ReviewFailureReason =
233
+ | 'credentials-unavailable'
233
234
  | 'overloaded'
234
235
  | 'rate-limited'
235
236
  | 'server-error'
@@ -238,11 +239,17 @@ export type ReviewFailureReason =
238
239
  | 'unknown-model-provider'
239
240
  | 'other';
240
241
 
241
- export type ReviewFallbackReason = Extract<ReviewFailureReason, 'overloaded' | 'rate-limited' | 'server-error' | 'timeout'>;
242
+ export type ReviewFallbackReason = Extract<ReviewFailureReason, 'credentials-unavailable' | 'overloaded' | 'rate-limited' | 'server-error' | 'timeout'>;
242
243
 
243
244
  /** 실패 사유는 집계 가능한 유한 값으로 남긴다. */
244
245
  export function classifyReviewProviderFailure(message: string): ReviewFailureReason {
245
246
  const m = message.toLowerCase();
247
+ // Credential absence is provider-local: move to the next configured provider, then let the caller
248
+ // preserve its current artifact if every configured provider is keyless.
249
+ if ((m.includes('unavailable') && /(api\s*key|credentials?)/.test(m))
250
+ || /configure\s+(?:an?\s+)?api\s*key/.test(m)
251
+ || /(?:missing|no)\s+(?:provider\s+)?(?:api\s*)?key\b/.test(m)
252
+ || /credentials?\s+(?:are\s+)?unavailable/.test(m)) return 'credentials-unavailable';
246
253
  // ⭐ 실물 문면을 먼저 둔다 — `#10069` 가 낸 그 문장이다.
247
254
  if (m.includes('overloaded') || m.includes('server_overloaded')) return 'overloaded';
248
255
  if (m.includes('rate limit') || m.includes('rate_limit') || m.includes('429')) return 'rate-limited';
@@ -253,7 +260,7 @@ export function classifyReviewProviderFailure(message: string): ReviewFailureRea
253
260
  }
254
261
 
255
262
  function isReviewFallbackReason(reason: ReviewFailureReason): reason is ReviewFallbackReason {
256
- return reason === 'overloaded' || reason === 'rate-limited' || reason === 'server-error' || reason === 'timeout';
263
+ return reason === 'credentials-unavailable' || reason === 'overloaded' || reason === 'rate-limited' || reason === 'server-error' || reason === 'timeout';
257
264
  }
258
265
 
259
266
  export interface ReviewProviderAttempt {
@@ -7,6 +7,8 @@ import { authorRepairGoal } from '../harness/helper-repair.js';
7
7
  export type { SupervisorStopReason } from './run-types.js';
8
8
  export { SUPERVISOR_STOP_REASONS } from './run-types.js';
9
9
  import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
10
+ import { readRunChart, recordRunChartDecision } from '../self-implement/run-chart.js';
11
+ import { runLedgerDir } from '../self-implement/run-ledger.js';
10
12
  import { debug } from '../debug/log.js';
11
13
  import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
12
14
  import { selectKnowhowPack } from '../self-implement/knowhow-pack.js';
@@ -215,8 +217,8 @@ export function needsHumanRepairGoal(result: SupervisorJobResult, reason: NeedsH
215
217
  const outside = expandedBeyondTargetPaths(result);
216
218
  const repairTargets = result.targetPaths?.length ? result.targetPaths : undefined;
217
219
  return [
218
- `[supervisor-needs-human-repair:${reason}] ${NEEDS_HUMAN_REPAIR_INSTRUCTION[reason]}`,
219
220
  ...(repairTargets?.length ? [`대상 경로: ${repairTargets.join(', ')}`] : []),
221
+ `[supervisor-needs-human-repair:${reason}] ${NEEDS_HUMAN_REPAIR_INSTRUCTION[reason]}`,
220
222
  ...(outside.length ? [`대상 경로 밖 변경: ${outside.join(', ')}`] : []),
221
223
  ...(result.error?.message ? [`이전 실패: ${result.error.message.slice(0, 200)}`] : []),
222
224
  result.feature,
@@ -447,7 +449,7 @@ function mustFixScopeDecision(
447
449
  return { byTask, ...(split.length ? { split } : {}), ...(askOwner.length ? { askOwner } : {}) };
448
450
  }
449
451
 
450
- export function decideNextRun(input: {
452
+ type DecideNextRunInput = {
451
453
  results: readonly SupervisorJobResult[];
452
454
  history?: readonly SupervisorRound[];
453
455
  limits?: SupervisorLimits;
@@ -463,7 +465,11 @@ export function decideNextRun(input: {
463
465
  needsHumanReasonRepairExecution?: boolean;
464
466
  /** 분해 제안을 실제 조각 실행으로 승격할 수 있는 supervisor 경로에만 true. */
465
467
  decompositionExecution?: boolean;
466
- }): SupervisorDecision {
468
+ /** Chart context available to the outer-supervisor judgment; pulled from this same run only. */
469
+ runChart?: readonly { device: string; stopKey: string; observed: string; verdict: string; action: string; handoff: string | null; why: string; readStopKeys: readonly string[] }[];
470
+ };
471
+
472
+ function decideNextRunCore(input: DecideNextRunInput): SupervisorDecision {
467
473
  const results = [...input.results];
468
474
  const history = [...(input.history ?? [])];
469
475
  const maxRounds = input.limits?.maxRounds ?? DEFAULT_MAX_ROUNDS;
@@ -923,6 +929,26 @@ export function decideNextRun(input: {
923
929
  };
924
930
  }
925
931
 
932
+ /** Consume an unread doctor→reauthor chart handoff before returning a terminal exit. */
933
+ export function decideNextRun(input: DecideNextRunInput): SupervisorDecision {
934
+ const decision = decideNextRunCore(input);
935
+ if (decision.action !== 'stop' || decision.stopReason === 'max-rounds') return decision;
936
+ const pendingReauthor = [...(input.runChart ?? [])].reverse().find((cell) => cell.handoff === 'reauthor'
937
+ && !input.runChart?.some((later) => later.device === 'outer-supervisor' && later.readStopKeys.includes(cell.stopKey)));
938
+ if (!pendingReauthor) return decision;
939
+ const eligible = input.results.filter((result) => decision.needsHuman.includes(result.taskId)
940
+ && result.status === 'failed' && result.feature.trim() && result.prNumber === undefined && !result.prUrl);
941
+ if (eligible.length === 0 || decision.round > (input.limits?.maxRounds ?? DEFAULT_MAX_ROUNDS)) return decision;
942
+ const taskIds = eligible.map((result) => result.taskId);
943
+ return { ...decision, action: 'relaunch', stopReason: undefined,
944
+ rerunnable: [...new Set([...decision.rerunnable, ...taskIds])],
945
+ needsHuman: decision.needsHuman.filter((taskId) => !taskIds.includes(taskId)),
946
+ classifications: decision.classifications.map((classification) => taskIds.includes(classification.taskId)
947
+ ? { ...classification, action: 'rerun' as const } : classification),
948
+ why: `run-chart handoff=reauthor consumed (${pendingReauthor.stopKey}) — needs-human 조각 ${taskIds.length}개를 재발사`,
949
+ };
950
+ }
951
+
926
952
  export function appendRound(
927
953
  history: readonly SupervisorRound[],
928
954
  results: readonly SupervisorJobResult[],
@@ -1298,6 +1324,10 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
1298
1324
  const allUnreviewedAreNoDiff = unreviewed.length > 0
1299
1325
  && unreviewed.every((result) => result.reviewReason === 'no-diff');
1300
1326
 
1327
+ const chartRunId = opts.runStore?.runId ?? results.find((result) => result.runId?.trim())?.runId ?? null;
1328
+ const chartDir = opts.runStore?.dir ?? runLedgerDir();
1329
+ const chartBeforeJudgment = chartRunId ? readRunChart(chartRunId, 'outer-supervisor', chartDir) : [];
1330
+
1301
1331
  let decision = decideNextRun({
1302
1332
  results,
1303
1333
  history,
@@ -1309,11 +1339,19 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
1309
1339
  ...(opts.limits ? { limits: opts.limits } : {}),
1310
1340
  ...(observed.deployFindings ? { deployFindings: observed.deployFindings } : {}),
1311
1341
  deliverableObservation: observed.state,
1342
+ runChart: chartBeforeJudgment,
1312
1343
  ...(unreviewed.length > 0 ? {
1313
1344
  reviewed: false,
1314
1345
  ...(allUnreviewedAreNoDiff ? { reviewReason: 'no-diff' } : {}),
1315
1346
  } : {}),
1316
1347
  });
1348
+ if (chartRunId) {
1349
+ recordRunChartDecision({ runId: chartRunId, device: 'outer-supervisor',
1350
+ stopKey: `${chartRunId}:outer-supervisor:${history.length + 1}`, observed: `results=${results.length}`,
1351
+ verdict: decision.action, action: decision.action === 'stop' ? decision.stopReason ?? 'stop' : 'relaunch',
1352
+ handoff: decision.action === 'stop' ? 'human' : 'macrophage', why: decision.why,
1353
+ readStopKeys: chartBeforeJudgment.map((cell) => cell.stopKey), dir: chartDir });
1354
+ }
1317
1355
 
1318
1356
  const reasonRepairSkipped = decision.action !== 'stop' || decision.stopReason !== 'needs-human' || history.length + 1 > maxRounds
1319
1357
  ? [] : results.flatMap((result) => {
@@ -1342,7 +1380,7 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
1342
1380
  }
1343
1381
  }
1344
1382
 
1345
- const runId = opts.runStore?.runId ?? results.find((result) => result.runId?.trim())?.runId ?? null;
1383
+ const runId = chartRunId;
1346
1384
 
1347
1385
  let decomposePromotion: DecomposePromotionObservation = decision.decomposable.length === 0
1348
1386
  ? { attempted: false, reason: 'no-decomposable-decision' }
@@ -27,6 +27,10 @@ export interface SelfDevGoal {
27
27
  kind?: JobKind;
28
28
  /** Decomposition intent; deliberately distinct from executable `kind`. */
29
29
  goalType?: SelfDevGoalType;
30
+ /** Required for default-LLM decomposition slices; included in the child task prompt. */
31
+ completionBoundary?: string;
32
+ /** Existing simulation evidence required to make a decomposed slice independently reviewable. */
33
+ mockScenario?: { id: string; injection: string; observation: string };
30
34
  /** Feature/goal text → `elanous self implement <feature>` for dev jobs. */
31
35
  feature: string;
32
36
  /** Pod lease predecessor goal ID or PR number. */