elanous 0.2.36 → 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 (741) 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/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.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/{4304.e9b2512834a9e23e.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/1923-5c1695332240246a.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
  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/{5711.957b095705c12560.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/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
  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/{3727.7949ccaacaa71242.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/3341-f09b9efbd7a82f70.js +1 -0
  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/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
  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/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
  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/4804.6012b5cd33c22792.js +90 -0
  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/{528.38ce20ef8aa251ff.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/5255-1b60d50eabe9f057.js +1 -0
  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/{2683.c9773a0c589b031b.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/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
  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/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
  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/7000.28157393caaf5343.js +62 -0
  88. package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
  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/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
  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/{3324.a09703033abcbd2f.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/{3410.7f9af5ab77cbe65f.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/{771.c3cdb6c1f7f47c02.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/{4615.8525eb0add35eba6.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/{6943.c6b24124853a47b2.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/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
  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/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
  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/{ceba0382.650712b56b85b582.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-c348a3959c5b5fc6.js +1 -0
  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-d1d1210f99f620ae.js +1 -0
  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-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
  153. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
  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-a9d9a3e66459c1e0.js +1 -0
  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-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
  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/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.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/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/graphs/drafts/recipes.yaml +27 -7
  279. package/graphs/release/recipes.yaml +9 -0
  280. package/graphs/release/release-loop.yaml +26 -18
  281. package/graphs/work/draft-close.yaml +54 -0
  282. package/graphs/work/green-close.yaml +37 -0
  283. package/graphs/work/recipes.yaml +46 -1
  284. package/graphs/work/run-research.yaml +35 -0
  285. package/package.json +1 -1
  286. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  287. package/scripts/ask-op-inbox-once.ts +17 -0
  288. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  289. package/scripts/brand/check.ts +13 -4
  290. package/scripts/codex-fallback-live-probe.ts +17 -15
  291. package/scripts/fleet/node-setup.sh +32 -2
  292. package/scripts/fleet/run-light-worker.sh +9 -0
  293. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  294. package/scripts/gate-0226-failure-census.ts +546 -0
  295. package/scripts/goals/authoring-metrics.ts +258 -0
  296. package/scripts/graph-units/draft-close-node.ts +222 -0
  297. package/scripts/hook-order-sweep.ts +7 -4
  298. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  299. package/scripts/land-global-checks.ts +69 -1
  300. package/scripts/measure-nl-routing-corpus.ts +207 -2
  301. package/scripts/provision-export-redactions.ts +15 -0
  302. package/scripts/public-copy-lint.ts +122 -0
  303. package/scripts/public-export.ts +69 -2
  304. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  305. package/scripts/ratchets/train-side-invariants.sh +7 -1
  306. package/scripts/release-loop/cut-branch.ts +61 -12
  307. package/scripts/release-loop/docs-node.ts +140 -0
  308. package/scripts/release-loop/gate-closure.ts +48 -0
  309. package/scripts/release-loop/gate-diff.ts +2 -1
  310. package/scripts/release-loop/gate-node.ts +161 -25
  311. package/scripts/release-loop/gate-partial.ts +82 -3
  312. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  313. package/scripts/release-loop/gate-radius-live.ts +4 -2
  314. package/scripts/release-loop/known-issues-node.ts +6 -4
  315. package/scripts/release-loop/notes-repair.ts +216 -0
  316. package/scripts/release-loop/prepare-node.ts +61 -5
  317. package/scripts/release-loop/resume-cap.ts +2 -1
  318. package/scripts/release-loop/resume-release.ts +406 -7
  319. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  320. package/scripts/release-loop/resume.ts +13 -5
  321. package/scripts/release-loop/traffic-node.ts +12 -4
  322. package/scripts/release-loop/traffic-transition.ts +53 -13
  323. package/scripts/release-loop/version-node.ts +109 -15
  324. package/scripts/train/green-leg.ts +176 -0
  325. package/scripts/tui-continue-real-evidence.ts +47 -0
  326. package/scripts/ux-sim.ts +1 -1
  327. package/scripts/video-pipeline.ts +2 -2
  328. package/src/acp/client.ts +31 -5
  329. package/src/acp/core-turn-bridge.ts +12 -1
  330. package/src/acp/stderr-summary.ts +49 -0
  331. package/src/agent/monad-agent-turn.ts +1 -0
  332. package/src/agent/run-context.ts +1 -1
  333. package/src/agent/task-notification.ts +3 -1
  334. package/src/agent/terminal-surface.ts +217 -0
  335. package/src/agent-substrate/pr-reviewer.ts +11 -3
  336. package/src/agent-substrate/review-observation.ts +10 -0
  337. package/src/agent-substrate/self-review-cli.ts +537 -57
  338. package/src/auto-research/question-ladder-contract.ts +137 -0
  339. package/src/auto-research/research-turn.ts +134 -0
  340. package/src/autopilot/discovery/doc-lint.ts +1 -1
  341. package/src/autopilot/lineage/sources.ts +1 -1
  342. package/src/autopilot/pr-manager.ts +64 -13
  343. package/src/boot/daemon-runtime.ts +35 -3
  344. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  345. package/src/bots/screen-probe.ts +1 -1
  346. package/src/budget/run-usage-rollup.ts +12 -7
  347. package/src/budget/unified-usage.ts +20 -0
  348. package/src/capture/tui-self-report.ts +42 -5
  349. package/src/chat/index.ts +1 -0
  350. package/src/chat/tool-render/dispatch.ts +8 -1
  351. package/src/cli/autopilot-cli.ts +24 -9
  352. package/src/cli/decisions-cli.ts +7 -4
  353. package/src/cli/doctor-cli.ts +116 -7
  354. package/src/cli/guardian-cli.ts +3 -1
  355. package/src/cli/intake-cli.ts +48 -12
  356. package/src/cli/lesson-cli.ts +69 -9
  357. package/src/cli/logs-cli.ts +357 -2
  358. package/src/cli/memory-cli.ts +30 -1
  359. package/src/cli/msg-cli.ts +15 -11
  360. package/src/cli/pr-granularity.ts +5 -3
  361. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  362. package/src/cli/pr-land-refusal.ts +1 -1
  363. package/src/cli/pty-takeover-cli.ts +58 -5
  364. package/src/cli/release-checklist-read-cli.ts +112 -4
  365. package/src/cli/release-cli.ts +89 -18
  366. package/src/cli/review-carry.ts +77 -0
  367. package/src/cli/self-update.ts +24 -6
  368. package/src/cli/self-utterances-cli.ts +13 -16
  369. package/src/cli/tasks-card-show.ts +31 -1
  370. package/src/cli/tasks-cli.ts +370 -33
  371. package/src/cli/tasks-read-cli.ts +13 -5
  372. package/src/cli/usage-cli.ts +12 -10
  373. package/src/context-bus/claude-memory-import.ts +99 -0
  374. package/src/context-bus/context-now.ts +86 -2
  375. package/src/context-bus/long-term-memory.ts +125 -0
  376. package/src/core-turn/run-core-turn.ts +9 -2
  377. package/src/core-turn/run-goal-loop.ts +5 -2
  378. package/src/core-turn/types.ts +5 -0
  379. package/src/dashboard/chat/acp-chat.ts +9 -0
  380. package/src/dashboard/index.ts +115 -30
  381. package/src/dashboard/input/agent-wake.ts +43 -0
  382. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  383. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  384. package/src/dashboard/replay-preview.ts +25 -0
  385. package/src/dashboard/side-basic-runtime.ts +61 -0
  386. package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
  387. package/src/dashboard/synchronized-frame-output.ts +74 -0
  388. package/src/dashboard/term-slash-runtime.ts +2 -0
  389. package/src/dashboard/turn-preamble.ts +28 -4
  390. package/src/display/coordinator.ts +45 -12
  391. package/src/display/resize-listener.ts +41 -20
  392. package/src/display/synchronized-output-region.ts +60 -0
  393. package/src/domains/guardian-tick.ts +9 -0
  394. package/src/domains/surface-events.ts +80 -1
  395. package/src/exec-requests/planner.ts +37 -2
  396. package/src/execution-loop/launch-gate.ts +4 -3
  397. package/src/git-fs/cli-stderr.ts +45 -0
  398. package/src/git-fs/gh-cli.ts +6 -3
  399. package/src/git-fs/git-cli.ts +11 -5
  400. package/src/git-fs/watcher.ts +27 -22
  401. package/src/git-fs/worktree.ts +19 -3
  402. package/src/graph-runner/graph-cli.ts +26 -2
  403. package/src/graph-runner/graph-grow.ts +37 -9
  404. package/src/graph-runner/graph-run-api.ts +3 -2
  405. package/src/graph-runner/runner.ts +34 -7
  406. package/src/graph-wizard/generate.ts +29 -6
  407. package/src/grok/credential.ts +107 -36
  408. package/src/harness/harness-cli-command.ts +179 -33
  409. package/src/harness/review-adapter.ts +26 -6
  410. package/src/hq/fence-wrapper.ts +1 -1
  411. package/src/hq/transfer.ts +1 -1
  412. package/src/index.ts +151 -18
  413. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  414. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  415. package/src/interactive-terminal-modal.ts +3 -0
  416. package/src/keybindings.ts +17 -22
  417. package/src/llm/provider-credentials.ts +1 -1
  418. package/src/llm/route-decision.ts +13 -0
  419. package/src/llm-tool-name.ts +37 -0
  420. package/src/llm-tool-schema.ts +55 -0
  421. package/src/llm.ts +203 -21
  422. package/src/loops/checker.ts +100 -0
  423. package/src/loops/consensus.ts +26 -2
  424. package/src/loops/loop-cli.ts +9 -4
  425. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  426. package/src/loops/orchestrator/inbox-once.ts +28 -0
  427. package/src/loops/orchestrator/inbox.ts +130 -1
  428. package/src/loops/orchestrator/tick.ts +55 -7
  429. package/src/maturity/feature-maturity.ts +1 -0
  430. package/src/model-tier/llm-tier-map.ts +12 -17
  431. package/src/msg/msg-store.ts +17 -0
  432. package/src/native-tool-catalog.ts +1 -1
  433. package/src/nexus/api/channel-ask-op.ts +96 -0
  434. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  435. package/src/nexus/api/graph-wizard-api.ts +27 -2
  436. package/src/nexus/api/grid.ts +24 -4
  437. package/src/nexus/api/http-server.ts +1 -1
  438. package/src/nexus/api/ops-api.ts +14 -6
  439. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  440. package/src/nexus/api/terminals.ts +28 -6
  441. package/src/nexus/state/state.ts +7 -1
  442. package/src/oauth/codex-account-store.ts +34 -1
  443. package/src/ops/loops-map.ts +46 -0
  444. package/src/ops/overview-cache.ts +22 -4
  445. package/src/ops/overview.ts +41 -5
  446. package/src/patents/ledger.ts +18 -1
  447. package/src/policy/llm-policy.ts +3 -1
  448. package/src/preview/terminal.ts +4 -2
  449. package/src/prompt-cache/anthropic.ts +2 -0
  450. package/src/prompt-enhance/enhance.ts +9 -4
  451. package/src/pty-shell/availability.ts +7 -0
  452. package/src/pty-shell/herdr-agent-report.ts +40 -31
  453. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  454. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  455. package/src/pty-shell/pty-control-ipc.ts +187 -18
  456. package/src/pty-shell/pty-manifest.ts +16 -2
  457. package/src/pty-shell/registry.ts +25 -15
  458. package/src/pty-shell/tui-run-state.ts +235 -1
  459. package/src/release-loop/checklist.ts +50 -5
  460. package/src/release-loop/feature-store.ts +9 -9
  461. package/src/release-loop/gate-shards.ts +61 -0
  462. package/src/release-loop/landed-but-yellow.ts +93 -12
  463. package/src/release-loop/light-rc.ts +7 -4
  464. package/src/release-loop/rehearsal.ts +1 -1
  465. package/src/repl/index.ts +18 -0
  466. package/src/research/axis-fanout.ts +133 -0
  467. package/src/research/edge-decision.ts +88 -0
  468. package/src/research/output-router.ts +127 -0
  469. package/src/research-bridge/format.ts +16 -1
  470. package/src/research-bridge/index.ts +1 -0
  471. package/src/research-bridge/invoke.ts +41 -5
  472. package/src/seat-loop/seat-report.ts +1 -0
  473. package/src/self-dev/ask-launch-flow.ts +86 -10
  474. package/src/self-dev/decompose-proposal.ts +29 -18
  475. package/src/self-dev/decompose.ts +45 -9
  476. package/src/self-dev/dev-pipeline.ts +29 -7
  477. package/src/self-dev/draft-residue.ts +221 -2
  478. package/src/self-dev/draft-sweep.ts +254 -16
  479. package/src/self-dev/draft-triage-rules.ts +19 -5
  480. package/src/self-dev/orchestrate.ts +1 -0
  481. package/src/self-dev/review-provider-fallback.ts +45 -7
  482. package/src/self-dev/run-supervisor.ts +22 -7
  483. package/src/self-dev/shard-plan.ts +48 -0
  484. package/src/self-dev/shard-run.ts +310 -6
  485. package/src/self-implement/comment-only-source.ts +54 -0
  486. package/src/self-implement/doctor-visit.ts +108 -0
  487. package/src/self-implement/gate-artifacts.ts +6 -2
  488. package/src/self-implement/gate-baseline.ts +99 -1
  489. package/src/self-implement/gate-cli.ts +231 -82
  490. package/src/self-implement/gate-failure-signature.ts +44 -0
  491. package/src/self-implement/gate-remote.ts +30 -4
  492. package/src/self-implement/gate-scope.ts +13 -1
  493. package/src/self-implement/goal-author.ts +407 -21
  494. package/src/self-implement/goal-doc/section.ts +22 -0
  495. package/src/self-implement/goal-supervisor-fill.ts +110 -27
  496. package/src/self-implement/importer-test-index.ts +215 -2
  497. package/src/self-implement/knowhow-pack.ts +125 -12
  498. package/src/self-implement/l8-merge-queue.ts +198 -32
  499. package/src/self-implement/off-diff-evidence.ts +23 -0
  500. package/src/self-implement/orchestrator.ts +369 -33
  501. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  502. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  503. package/src/self-implement/premise-review.ts +7 -5
  504. package/src/self-implement/review-round-brief.ts +300 -0
  505. package/src/self-implement/rework-policy.ts +14 -0
  506. package/src/self-implement/run-ledger.ts +428 -6
  507. package/src/self-implement/run-stop.ts +1 -1
  508. package/src/self-implement/running-runs.ts +17 -3
  509. package/src/self-implement/seams.ts +45 -16
  510. package/src/self-implement/self-implement-cli.ts +26 -2
  511. package/src/self-implement/stop-autoheal.ts +1 -0
  512. package/src/self-implement/test-seams.ts +13 -1
  513. package/src/self-implement/train-reach-grouping.ts +8 -2
  514. package/src/session/channel-ask-op-envelope.ts +36 -0
  515. package/src/session/channel-op-reply-route.ts +200 -0
  516. package/src/session/chat.ts +10 -1
  517. package/src/session/id-prefix.ts +60 -0
  518. package/src/session/index.ts +6 -0
  519. package/src/session-runtime/index.ts +18 -23
  520. package/src/skills/runner.ts +7 -3
  521. package/src/skills/tools/dev-harness.ts +2 -2
  522. package/src/skills/tools/pty.ts +5 -0
  523. package/src/skills/tools/schedule-wakeup.ts +1 -6
  524. package/src/status/bar.ts +3 -3
  525. package/src/status/metrics.ts +12 -1
  526. package/src/steward/rejudge-tick.ts +12 -5
  527. package/src/steward/resync-tick.ts +31 -4
  528. package/src/storage/file-lock.ts +17 -4
  529. package/src/task-agent/actions.ts +199 -4
  530. package/src/task-agent/adopt-pr.ts +63 -2
  531. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  532. package/src/task-agent/boundary-proof-producer.ts +147 -0
  533. package/src/task-agent/completion-evidence.ts +2 -1
  534. package/src/task-agent/evidence-command-normalize.ts +42 -0
  535. package/src/task-agent/export-redactions-provision.ts +43 -0
  536. package/src/task-agent/green-close-recipe.ts +239 -0
  537. package/src/task-agent/green-sweep.ts +64 -10
  538. package/src/task-agent/live-moves.ts +48 -3
  539. package/src/task-agent/map-host-adapter.ts +134 -0
  540. package/src/task-agent/map-reduce.ts +158 -0
  541. package/src/task-agent/map-run-ledger.ts +226 -0
  542. package/src/task-agent/parent-host.ts +74 -17
  543. package/src/task-agent/rejudge-on-head.ts +72 -5
  544. package/src/task-agent/repair-cycle.ts +108 -8
  545. package/src/task-agent/repair-next-move.ts +12 -2
  546. package/src/task-agent/repair-worker.ts +37 -1
  547. package/src/task-agent/review-prior-fix.ts +12 -2
  548. package/src/task-agent/shadow.ts +188 -5
  549. package/src/task-agent/task-hand.ts +253 -20
  550. package/src/task-agent/task-parent-role-llm.ts +9 -0
  551. package/src/task-agent/tier-split.ts +40 -5
  552. package/src/task-agent/work-order.ts +53 -2
  553. package/src/task-orchestrator/dispatcher.ts +46 -1
  554. package/src/task-orchestrator/generator-prompt.ts +6 -0
  555. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  556. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  557. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  558. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  559. package/src/task-orchestrator/surfaces/pod-pool.ts +77 -8
  560. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
  561. package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
  562. package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
  563. package/src/terminal/session-registry.ts +1 -0
  564. package/src/terminal/terminal-modal-router.ts +156 -0
  565. package/src/testing/linux-env.ts +177 -0
  566. package/src/tool-hints/gate.ts +6 -4
  567. package/src/tool-hints/signals.ts +33 -1
  568. package/src/tui/chat/background-job-status.ts +8 -2
  569. package/src/tui/chat/goal-interim.ts +5 -1
  570. package/src/tui/entry.ts +722 -30
  571. package/src/tui/input/at-picker.ts +55 -0
  572. package/src/tui/sidetab/attach.ts +304 -0
  573. package/src/tui/sidetab/list.ts +176 -0
  574. package/src/tui/sidetab/nl-tool.ts +136 -0
  575. package/src/tui/slash/resume-command.ts +23 -0
  576. package/src/tui/slash/resume.ts +38 -35
  577. package/src/tui/slash/signals.ts +114 -0
  578. package/src/tui/slash/term-next.ts +72 -0
  579. package/src/tui-client/local-chat-turn.ts +31 -9
  580. package/src/user-config.ts +30 -3
  581. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  582. package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
  583. package/src/ux-sim/fake-gh.ts +174 -0
  584. package/src/ux-sim/fake-kubectl.ts +142 -0
  585. package/src/ux-sim/fake-llm.ts +17 -6
  586. package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
  587. package/src/ux-sim/resume-picker-device.ts +173 -0
  588. package/src/ux-sim/session-id-seed.ts +60 -0
  589. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  590. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  591. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  592. package/src/version/packed-revision.json +1 -1
  593. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
  594. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
  600. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
  601. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
  604. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
  609. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
  612. package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
  613. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
  614. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
  618. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
  619. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
  621. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
  625. package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
  629. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
  632. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
  634. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
  636. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
  641. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
  653. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
  664. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
  666. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
  667. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
  672. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
  739. package/scripts/migrate-monad-to-elanous.ts +0 -195
  740. package/scripts/rebrand-elanous.ts +0 -242
  741. /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
@@ -33,7 +33,7 @@ export {
33
33
  } from './pr-evidence-artifact.js';
34
34
  import { judgePredictionAccuracy } from './judge-prediction-accuracy.js';
35
35
  import { classifyPodReviewBudgetResidue, measureReviewFindingRecurrence, type ReviewFindingRecurrence, type RecurrenceFinding } from './review-finding-recurrence.js';
36
- import type { ReviewRework } from '../self-dev/run-types.js';
36
+ import type { ReviewRework, SelfDevJobResult } from '../self-dev/run-types.js';
37
37
  import { createHash } from 'node:crypto';
38
38
  import { appendFileSync, copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync } from 'node:fs';
39
39
  import { writeGoalDocumentAtomic } from './goal-document-write.js';
@@ -109,6 +109,7 @@ import { getUserConfig } from '../user-config.js';
109
109
  import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
110
110
  import { classifyMergeHoldStop, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
111
111
  import { autohealFromStop, parseAutohealMode, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
112
+ import { recordParentNeedsOwnerVisit } from './doctor-visit.js';
112
113
  import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
113
114
  import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
114
115
  import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
@@ -217,7 +218,7 @@ function onePrChecklistLine(body: string): string {
217
218
  }
218
219
  import { renderRoundSummaryCard, type RoundSummaryEntry } from './round-summary-card.js';
219
220
  import { computeFlexSignals } from './flex-signals.js';
220
- import { resolveAdaptiveMaxReworkDecision, resolveEscalateTier, resolveEscalateTarget, buildReworkFeature, failIndicator, isRepeatedUnverifiedOnlyGateFailure, unverifiedRepeatKey, appendReworkHistory, truncateReworkHistoryByItem, applyReworkBudgetDecision, parseContractConflictRelaxation, parseReworkBudgetDecision, resolveReworkBudgetCarry, stripReworkBudgetHeaders, countConsecutiveMustFixIds, mergeReworkNotes, resolveReworkKind, type ReworkPlanRevision, type ReworkNotePart } from './rework-policy.js';
221
+ import { resolveAdaptiveMaxReworkDecision, resolveEscalateTier, resolveEscalateTarget, buildReworkFeature, failIndicator, isRepeatedUnverifiedOnlyGateFailure, unverifiedRepeatKey, appendReworkHistory, truncateReworkHistoryByItem, applyReworkBudgetDecision, parseContractConflictRelaxation, parseReworkBudgetDecision, resolveReworkBudgetCarry, stripReworkBudgetHeaders, countConsecutiveMustFixIds, mergeReworkNotes, resolveReworkKind, decideReviewRound, type ReviewRoundDecision, type ReworkPlanRevision, type ReworkNotePart } from './rework-policy.js';
221
222
  import type { SupervisionReworkSource } from './supervision-vocabulary.js';
222
223
  import { classifyReworkBudgetShadow } from './classify-shadow.js';
223
224
  import { createReworkBudgetJudgment, REWORK_BUDGET_JUDGMENT, reworkBudgetEvidenceForObservation, reworkBudgetWorkflow } from './rework-budget-judgment.js';
@@ -225,7 +226,7 @@ import { formatGateFailedId, type PremiseReviewCard, type PremiseReviewInput } f
225
226
  import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
226
227
  import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
227
228
  import { resolveRunOutcome } from './run-outcome.js';
228
- import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
229
+ import { authorLimitationCountFromGoal, authoredSignalExecution, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
229
230
  import { resolveEvidenceHeadCommit } from './evidence-command-budget.js';
230
231
  import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
231
232
  import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
@@ -301,6 +302,7 @@ import { hasModuleLoadFailure, type GateTestFailure } from './gate-baseline.js';
301
302
  import { commitWorktree, defaultBranchRef, preservationHasChanges } from './seams.js';
302
303
  import { detectUncommittedWork } from './uncommitted-work.js';
303
304
  import { execFile as execFileCallback, spawnSync } from 'node:child_process';
305
+ import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
304
306
  import { promisify } from 'node:util';
305
307
  import { blockedDraftDisposition, blockedDraftTargetFor, decideDraftOnStop, nextMoveFor, parseDraftOnStopMode, repairSalvageLinkComment, salvageBranchForRun, syntheticRepairBasePr, type DraftOnStopMode } from './blocked-draft-policy.js';
306
308
  import { formatLlmMergeOutcome } from '../autopilot/build/llm-conflict-merge.js';
@@ -336,6 +338,7 @@ import {
336
338
  export type { QuotaAccountAvailabilityEvidence };
337
339
  import { decideReworkSalvage, type ReworkSalvageEvidence } from './rework-salvage.js';
338
340
  import { type SupervisorGoalFillEvidence, fillUnverifiableGoalSlots, type SupervisorGoalFillResult } from './goal-supervisor-fill.js';
341
+ import { repairNextMove } from '../task-agent/repair-next-move.js';
339
342
  import { escalateGoalDocumentClarifications, recordSupervisorPlanRevision, type GoalClarificationEscalationResult, type SupervisorPlanRevisionRelaxation, type SupervisorPlanRevisionResult } from './goal-clarification-escalation.js';
340
343
  import { parseGoalDocumentClarifications, selfAnswerGoalDocumentClarifications, type GoalClarificationSelfResolver } from './goal-author-clarification.js';
341
344
  import {
@@ -1053,6 +1056,7 @@ export type ImplementTerminalStatus = {
1053
1056
  export interface SelfImplementSeams {
1054
1057
  /** Run-observer ledger sink. Tests inject an in-memory sink to avoid touching user state. */
1055
1058
  writeRunLedger?: RunLedgerWriter;
1059
+ checkUnwiredExports?: typeof findUnwiredExports;
1056
1060
  /** STOP-AUTOHEAL — heal action seams (live mode only runs actions given here; missing = needs-owner). */
1057
1061
  stopAutohealActions?: AutohealActions;
1058
1062
  /** STOP-AUTOHEAL — one-attempt guard reader. Default: real run ledger, or none when `writeRunLedger` is injected. */
@@ -1103,6 +1107,8 @@ export interface SelfImplementSeams {
1103
1107
  synthesizeGoalContext?: (input: { goalFile?: string }) => Promise<Pick<import('../harness/harness-worktree-add.js').HarnessWorktreeGoalMetadata, 'goalTitle' | 'goalDescription' | 'goalDescriptionSource'>>;
1104
1108
  createWorktree: (opts: { branch: string; base?: string; runId?: string } & import('../harness/harness-worktree-add.js').HarnessWorktreeGoalMetadata) => Promise<{
1105
1109
  path: string; branch: string;
1110
+ /** A single-use Pod may implement in its already checked-out source tree. */
1111
+ inPlace?: boolean;
1106
1112
  /** Strict provenance values are returned only after their recording succeeds. */
1107
1113
  owner?: string;
1108
1114
  command?: string;
@@ -1229,6 +1235,8 @@ export interface SelfImplementSeams {
1229
1235
  editPrComment?: (opts: { id: number; body: string; cwd: string }) => Promise<void>;
1230
1236
  addPrLabel?: (opts: { number: number; label: string; cwd: string }) => Promise<void>;
1231
1237
  readPrFiles?: (opts: { number: number; cwd: string; base?: string }) => Promise<string[]>;
1238
+ /** Read the authoritative GitHub head branch and creation timestamp before run attribution. */
1239
+ readPrAttribution?: (opts: { number: number; cwd: string }) => Promise<{ headRefName: string; createdAt: string }>;
1232
1240
  /** PR의 base/head SHA와 관측된 PR base를 한 응답에서 고정한다. 미주입·실패·빈 SHA면 검사 대상을 증명할 수 없어 fail-closed로 PR을 열어 둔다. */
1233
1241
  readPrCommitShas?: (opts: { number: number; cwd: string }) => Promise<{ baseCommit: string; headCommit: string; baseRefName?: string }>;
1234
1242
  /** 고정한 base/head SHA 쌍의 unified diff. 가변 PR 조회를 다시 사용하면 ABA head 변경에 안전하지 않으므로 두 SHA는 필수 입력이다. */
@@ -2349,6 +2357,8 @@ export interface SelfImplementResult {
2349
2357
  walk?: readonly { node: string; round: number }[];
2350
2358
  /** Canonical run-identity join key; always present because resolveRunIdentity always mints or inherits one. */
2351
2359
  runId: string;
2360
+ /** Parent-observed goal-plan revision attempt evidence; omitted when no ledger evidence was read. */
2361
+ goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
2352
2362
  ok: boolean;
2353
2363
  stage: SelfImplementStage;
2354
2364
  /** Verbatim must-fix findings retained on a review-blocked terminal result. */
@@ -3323,7 +3333,12 @@ async function runPostMergeCleanup(
3323
3333
  goalFile: string | undefined,
3324
3334
  remoteBranch: string | undefined,
3325
3335
  observe: (event: string, data: Record<string, unknown>) => void,
3336
+ inPlace = false,
3326
3337
  ): Promise<void> {
3338
+ if (inPlace) {
3339
+ observe('post-merge-cleanup-preserved', { worktreePath, branch, reason: 'pod-inplace-source' });
3340
+ return;
3341
+ }
3327
3342
  if (!cleanup?.enabled) {
3328
3343
  observe('post-merge-cleanup-preserved', { worktreePath, branch, reason: cleanup ? 'disabled' : 'not-configured' });
3329
3344
  return;
@@ -3560,6 +3575,17 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
3560
3575
  ...(loadLedger ? { loadLedger } : {}),
3561
3576
  ...(s?.writeRunLedger ? { writeLedger: s.writeRunLedger } : {}),
3562
3577
  });
3578
+ if (result.action === 'needs-owner') {
3579
+ try {
3580
+ const stopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
3581
+ const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey, evidence: result.reason ?? record.cause });
3582
+ if (visit.status === 'missing-ledger') {
3583
+ debug.log('run-doctor', 'visit-failed', { runId: stopEntry.runId, from: 'parent', symptom: 'needs-owner', error: 'run-ledger-missing' });
3584
+ }
3585
+ } catch (error) {
3586
+ try { debug.log('run-doctor', 'visit-failed', { runId: stopEntry.runId, from: 'parent', symptom: 'needs-owner', error: error instanceof Error ? error.message : String(error) }); } catch { /* fail-soft */ }
3587
+ }
3588
+ }
3563
3589
  s?.onStopAutoheal?.(result);
3564
3590
  } catch (error) {
3565
3591
  try { debug.log('self-implement.autoheal', 'dispatch-failed', { runId: stopEntry.runId, error: error instanceof Error ? error.message : String(error) }); } catch { /* fail-soft */ }
@@ -3813,6 +3839,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
3813
3839
  reworkCapProceed = false;
3814
3840
  const progressDelivery = { delivered: 0, unwired: 0, callbackFailed: 0 };
3815
3841
  let capturedPrNumber: number | undefined;
3842
+ let prAttributionMismatch = false;
3816
3843
  let openPrInvoked = false;
3817
3844
  const defaultProviderName = opts.seams.currentProviderName?.() ?? currentProviderName();
3818
3845
  const runProviderName = opts.childLlm?.provider ?? defaultProviderName;
@@ -3831,8 +3858,6 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
3831
3858
  openPrInvoked = true;
3832
3859
  const pr = await opts.seams.openPr(args);
3833
3860
  if (pr.rebind) debug.log('self-implement.same-cell', 'rebind-result', pr.rebind);
3834
- const number = recordedPrNumber(pr.number);
3835
- if (number !== undefined) capturedPrNumber = number;
3836
3861
  return pr;
3837
3862
  },
3838
3863
  onProgress: (event) => {
@@ -4266,6 +4291,9 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4266
4291
  hasCurrentCredentialFailure,
4267
4292
  (commit: string | undefined) => { finishedImplementationAtMainSync = true; preSyncCommit = commit; },
4268
4293
  preserveMergeHarvest,
4294
+ startedAtMs,
4295
+ (number) => { capturedPrNumber = number; },
4296
+ () => { prAttributionMismatch = true; },
4269
4297
  );
4270
4298
  terminalNode = result.node;
4271
4299
  await mergeChildProviderErrors();
@@ -4310,6 +4338,22 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4310
4338
  // ⛔ 이 스코프엔 `progress` 헬퍼가 «없다»(3695행 · 다른 스코프) — seam 을 직접 쓴다.
4311
4339
  progress: (stage, message) => { try { opts.seams.onProgress?.({ stage, message }); } catch { /* best-effort */ } },
4312
4340
  });
4341
+ if (addressedResult.abandonedClassification?.classification === 'report-deficit') {
4342
+ const classification = addressedResult.abandonedClassification;
4343
+ const basis = classification.classificationBasis;
4344
+ const kind = basis === 'terminal-state-not-reviewed' || basis === 'review-result-observation-unmeasured'
4345
+ ? 'unmeasured' as const : 'unverified' as const;
4346
+ const previousEvidence = JSON.stringify({ classification, stage: addressedResult.stage,
4347
+ review: addressedResult.review ?? null, gate: addressedResult.gate ?? null });
4348
+ const deficit = { evidenceId: `report:${runId}:${basis}`, kind, previousEvidence, round: roundCount };
4349
+ observeOuter('supervisor-report-deficit', { ...deficit, supervisorResult: 'unverifiable', classification });
4350
+ if (deficit.kind !== 'unverified') {
4351
+ const move = repairNextMove({ supervisorDeficit: deficit, supervisorResult: 'unverifiable' });
4352
+ if (move.kind === 'grounding') observeOuter('repair-next-move-input', {
4353
+ ...move.supervisorDeficit, supervisorResult: 'unverifiable', action: move.action, classification,
4354
+ });
4355
+ }
4356
+ }
4313
4357
  observeRunOutcome(observeOuter, {
4314
4358
  node: addressedResult.node,
4315
4359
  stage: addressedResult.stage,
@@ -4347,7 +4391,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4347
4391
  ...terminalDetail(addressedResult.sessionId),
4348
4392
  },
4349
4393
  });
4350
- observeRunRollup(observeOuter, addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
4394
+ observeRunRollup(observeOuter, prAttributionMismatch ? { ...addressedResult, prNumber: undefined } : addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
4351
4395
  observeProgressDelivery();
4352
4396
  return terminalResult;
4353
4397
  } catch (e) {
@@ -4422,7 +4466,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
4422
4466
  ...terminalDetail(addressedResult.sessionId ?? terminalSessionId),
4423
4467
  },
4424
4468
  });
4425
- observeRunRollup(observeOuter, addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
4469
+ observeRunRollup(observeOuter, prAttributionMismatch ? { ...addressedResult, prNumber: undefined } : addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
4426
4470
  observeProgressDelivery();
4427
4471
  return terminalResult;
4428
4472
  }
@@ -4841,6 +4885,25 @@ function recordedPrNumber(value: unknown): number | undefined {
4841
4885
  return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 ? value : undefined;
4842
4886
  }
4843
4887
 
4888
+ /** GitHub's second-precision createdAt cannot distinguish events within that second. */
4889
+ export function prCreatedInRunWindow(createdAt: string, startedAtMs: number): boolean {
4890
+ const createdAtMs = Date.parse(createdAt);
4891
+ if (!Number.isFinite(createdAtMs) || !Number.isFinite(startedAtMs)) return false;
4892
+ const secondPrecision = !/\.\d+(?:Z|[+-]\d\d:\d\d)$/.test(createdAt);
4893
+ return createdAtMs >= (secondPrecision ? Math.floor(startedAtMs / 1_000) * 1_000 : startedAtMs);
4894
+ }
4895
+
4896
+ function prAttributedToRun(
4897
+ attribution: { headRefName: string; createdAt: string }, branch: string, startedAtMs: number,
4898
+ boundCardReuse: { headRefName: string } | undefined,
4899
+ ): boolean {
4900
+ if (attribution.headRefName !== (boundCardReuse?.headRefName ?? branch)) return false;
4901
+ // A verified same-card PR predates this run. The production seam exposes the
4902
+ // exception only after the manager verifies card, PR identity, and leased push.
4903
+ return prCreatedInRunWindow(attribution.createdAt, startedAtMs)
4904
+ || (!!boundCardReuse && Number.isFinite(Date.parse(attribution.createdAt)));
4905
+ }
4906
+
4844
4907
  function rollupPrNumber(
4845
4908
  result: Pick<SelfImplementResult, 'prNumber'>,
4846
4909
  capturedPrNumber: number | undefined,
@@ -4936,6 +4999,9 @@ async function runSelfImplementInner(
4936
4999
  hasCurrentCredentialFailure: () => boolean = hasCredentialFailure,
4937
5000
  onMainSyncStarted: (commit: string | undefined) => void = () => {},
4938
5001
  preserveMergeHarvest: (reason: string, inputChars?: number) => Promise<boolean> = async () => false,
5002
+ startedAtMs = Date.now(),
5003
+ onPrAttributed: (number: number) => void = () => {},
5004
+ onPrAttributionMismatch: () => void = () => {},
4939
5005
  ): Promise<Omit<SelfImplementResult, 'runId'>> {
4940
5006
  const s = opts.seams;
4941
5007
  const pipelineStartedAtMs = Date.now();
@@ -5125,14 +5191,22 @@ async function runSelfImplementInner(
5125
5191
  : opts.goalFile
5126
5192
  ? 'authored-goal-file'
5127
5193
  : 'no-goal-file';
5128
- let activeProvider: Pick<ActiveProviderInfo, 'provider' | 'model' | 'auth'> | {
5129
- provider: 'unknown'; model: 'unknown'; auth: 'unknown';
5130
- };
5194
+ let activeProvider: { provider: string; model: string; auth: string };
5131
5195
  try {
5132
5196
  activeProvider = (s.inspectActiveProvider ?? inspectActiveProvider)();
5133
5197
  } catch {
5134
5198
  activeProvider = { provider: 'unknown', model: 'unknown', auth: 'unknown' };
5135
5199
  }
5200
+ const configuredProvider = activeProvider;
5201
+ if (opts.childLlm) {
5202
+ // The configured parent model can be sol while this run's implementation child is
5203
+ // explicitly luna. Attribute the run to the model actually passed to implement.
5204
+ activeProvider = {
5205
+ provider: opts.childLlm.provider,
5206
+ model: opts.childLlm.model,
5207
+ auth: configuredProvider.provider?.replace(/^auto:/, '') === opts.childLlm.provider ? configuredProvider.auth : 'unknown',
5208
+ };
5209
+ }
5136
5210
  // ⭐ 관측 이벤트와 «같은 값»을 원장으로도 보낸다 — 로그에만 있으면 원장 질의가 못 센다(`F12`).
5137
5211
  try { onActiveProvider(activeProvider); } catch { /* 보조 기록이 런을 죽이지 않는다 */ }
5138
5212
  const boundedFeature = boundReadableText(opts.feature, RUN_START_FEATURE_MAX_CHARS);
@@ -5146,6 +5220,7 @@ async function runSelfImplementInner(
5146
5220
  nestDepth: nestInfo().depth, goalSource, goalFile: opts.goalFile === undefined ? null : resolve(launchCwd, opts.goalFile),
5147
5221
  targetRoot: gitRootOf(launchCwd) ?? launchCwd, ...originObservationFields(),
5148
5222
  provider: activeProvider.provider ?? null, model: activeProvider.model ?? null, auth: activeProvider.auth ?? null,
5223
+ ...(opts.childLlm ? { configuredProvider: configuredProvider.provider ?? null, configuredModel: configuredProvider.model ?? null, modelSelectionSource: 'child' } : {}),
5149
5224
  ...(opts.correlationId !== undefined ? { correlationId: opts.correlationId } : {}),
5150
5225
  });
5151
5226
  try {
@@ -5220,6 +5295,7 @@ async function runSelfImplementInner(
5220
5295
  observe('worktree', {
5221
5296
  path: wt.path,
5222
5297
  branch: wt.branch,
5298
+ inPlace: wt.inPlace === true,
5223
5299
  terminalLaunchHead: terminalLaunchHead ?? null,
5224
5300
  terminalLaunchDirtyPaths: terminalLaunchDirtyPaths ? [...terminalLaunchDirtyPaths] : null,
5225
5301
  // ⭐ 우리가 **무엇을 요청했는지는 이미 안다** — 시임 반환에서 되읽지 않는다.
@@ -5240,7 +5316,7 @@ async function runSelfImplementInner(
5240
5316
  // ⛔ 발사 부모(`harness ask`·`dev`)에는 ELANOUS_HARNESS_SPACE_ID 가 «없다» — 그 env 는 자식에게만 심긴다.
5241
5317
  // 그래서 getHarnessSpace() 만 보면 운영에서 늘 undefined 이고 정지 확인이 «한 번도» 안 돈다(#20040 착지 직후 실측).
5242
5318
  // `self send <space> --stop` 이 겨냥하는 것은 자식의 공간 = 워크트리 이름이다(아래 activeChildInboxId 와 같은 식 · dev-cli.ts recordRestart 폴백과 같다).
5243
- const parentSoftStopSpaceId = s.parentSoftStopSpaceId || getHarnessSpace()?.id || normalizeSpaceId(basename(wt.path)) || undefined;
5319
+ const parentSoftStopSpaceId = s.parentSoftStopSpaceId || getHarnessSpace()?.id || normalizeSpaceId(wt.inPlace ? runId : basename(wt.path)) || undefined;
5244
5320
  if (parentSoftStopSpaceId) {
5245
5321
  try { s.onSoftStopSpaceReady?.(parentSoftStopSpaceId); } catch { /* UI registration must not break execution */ }
5246
5322
  }
@@ -5391,7 +5467,11 @@ async function runSelfImplementInner(
5391
5467
  // The repository copy travels with both local and Pod worktrees. Operational HQ ledgers are never read here.
5392
5468
  const knowhow = selectKnowhowPack(wt.path, opts.feature);
5393
5469
  if (knowhow.text) round0Feature = `${knowhow.text}\n\n${round0Feature}`;
5394
- observe('knowhow-pack', { ids: knowhow.ids, bytes: knowhow.bytes, injected: knowhow.bytes > 0 });
5470
+ const knowhowRevisionRead = runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 });
5471
+ const knowhowRevision = knowhowRevisionRead.status === 0 && /^[0-9a-f]{40,64}$/i.test(knowhowRevisionRead.stdout.trim())
5472
+ ? knowhowRevisionRead.stdout.trim() : null;
5473
+ observe('knowhow-pack', { ids: knowhow.ids, bytes: knowhow.bytes, injected: knowhow.bytes > 0,
5474
+ reason: knowhow.reason, repoPath: wt.path, repoRevision: knowhowRevision });
5395
5475
 
5396
5476
  // E1 착수 구체화(RFC-progressive-goal-elaboration §2 E1 · §7 간선 ①) — 고정 층(KPI·판정 신호)은 그대로, 카드만 덧붙인다.
5397
5477
  const elaboration = await (await import('./goal-elaborate.js')).runArrivalElaboration({ goal: opts.feature, prompt: round0Feature, cwd: wt.path, callLLM: s.elaborateCallLLM, observe });
@@ -5457,7 +5537,7 @@ async function runSelfImplementInner(
5457
5537
  readonly update?: (delivery: SupervisorDeliveryState, reason?: string) => void;
5458
5538
  };
5459
5539
  let supervisorDeliveryUpdates: PendingSupervisorDelivery[] = [];
5460
- const activeChildInboxId = normalizeSpaceId(basename(wt.path));
5540
+ const activeChildInboxId = normalizeSpaceId(wt.inPlace ? runId : basename(wt.path));
5461
5541
  const undeliveredSupervisorInputs: UndeliveredSupervisorInput[] = [];
5462
5542
  const recordUndeliveredSupervisorInput = (text: string, reason: string): void => {
5463
5543
  undeliveredSupervisorInputs.push({ text, reason });
@@ -6242,7 +6322,7 @@ async function runSelfImplementInner(
6242
6322
  return preserveReviewBlockedBranch(`review-blocked 작업 커밋 실패: ${commitError}`, false, `; 미커밋 작업은 worktree 에 남음: ${wt.path}`);
6243
6323
  }
6244
6324
  }
6245
- let pr: { url: string; number: number };
6325
+ let pr: OpenPrOutcome;
6246
6326
  try {
6247
6327
  pr = await withStepTimeout(s.openPr({
6248
6328
  title: prTitle(opts.feature, opts.goalFile),
@@ -6293,9 +6373,48 @@ async function runSelfImplementInner(
6293
6373
  : `중단 산출물의 draft PR 생성 실패(worktree·branch 보존 · 판정 본문 보존 실패: ${artifactError ?? 'unknown error'})`);
6294
6374
  return undefined;
6295
6375
  }
6296
- // The production draft sweep resolves run ownership from pr-opened, not
6297
- // from the blocked-draft diagnostic event. Bind this PR to the same run.
6298
- observe('pr-opened', { url: pr.url, number: pr.number, branch: wt.branch, draft: true });
6376
+ let draftAttribution: { headRefName: string; createdAt: string } | undefined;
6377
+ let draftAttributionReadError: string | undefined;
6378
+ try {
6379
+ if (s.readPrAttribution) {
6380
+ draftAttribution = await s.readPrAttribution({ number: pr.number, cwd: wt.path });
6381
+ } else {
6382
+ const viewed = spawnSync('gh', ['pr', 'view', String(pr.number), '--json', 'headRefName,createdAt'], { cwd: wt.path, encoding: 'utf8', timeout: 30_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
6383
+ if (viewed.status !== 0) throw new Error('gh pr view failed');
6384
+ const parsed = JSON.parse(viewed.stdout) as { headRefName?: unknown; createdAt?: unknown };
6385
+ if (typeof parsed.headRefName !== 'string' || typeof parsed.createdAt !== 'string') throw new Error('invalid PR attribution metadata');
6386
+ draftAttribution = { headRefName: parsed.headRefName, createdAt: parsed.createdAt };
6387
+ }
6388
+ } catch (error) { draftAttributionReadError = safeErrorDescription(error); }
6389
+ const expectedPrHead = pr.boundCardReuse?.headRefName ?? wt.branch;
6390
+ const draftAttributed = !draftAttributionReadError && !!draftAttribution
6391
+ && prAttributedToRun(draftAttribution, wt.branch, startedAtMs, pr.boundCardReuse);
6392
+ if (draftAttributionReadError || !draftAttribution) {
6393
+ onPrAttributionMismatch();
6394
+ observe('pr-attribution-unverified', {
6395
+ expectedBranch: expectedPrHead,
6396
+ number: pr.number,
6397
+ url: pr.url,
6398
+ reason: draftAttributionReadError ?? 'metadata-absent',
6399
+ }, { level: 'warn' });
6400
+ } else if (draftAttributed) {
6401
+ onPrAttributed(pr.number);
6402
+ observe('pr-opened', { url: pr.url, number: pr.number, branch: expectedPrHead, draft: true });
6403
+ } else {
6404
+ onPrAttributionMismatch();
6405
+ observe('pr-attribution-mismatch', {
6406
+ expectedBranch: expectedPrHead,
6407
+ actualBranch: draftAttribution?.headRefName ?? null,
6408
+ createdAt: draftAttribution?.createdAt ?? null,
6409
+ number: pr.number,
6410
+ url: pr.url,
6411
+ }, { level: 'warn' });
6412
+ }
6413
+ if (!draftAttributed) {
6414
+ blockedDraftPrFailure = `draft PR 귀속 확인 실패; worktree·branch 보존: ${wt.branch} (${wt.path})`;
6415
+ progress('aborted', blockedDraftPrFailure);
6416
+ return undefined;
6417
+ }
6299
6418
  observe('rework-blocked-draft-pr', {
6300
6419
  ...observation,
6301
6420
  url: pr.url,
@@ -6513,6 +6632,19 @@ async function runSelfImplementInner(
6513
6632
  return 'parked';
6514
6633
  }
6515
6634
  };
6635
+ let pendingReviewTriage: {
6636
+ round: number;
6637
+ verdict: 'fail';
6638
+ rawMustFix: string[];
6639
+ reflectedMustFix: string[];
6640
+ reflectionApplied: boolean;
6641
+ effectiveMax: number;
6642
+ } | undefined;
6643
+ const recordPendingReviewTriage = (decision: ReviewRoundDecision, nextNode: 'open-pr' | 'rework' | 'review-blocked', effectiveMax: number): void => {
6644
+ if (!pendingReviewTriage) return;
6645
+ observe('review-round-triage', { ...pendingReviewTriage, decision, nextNode, effectiveMax });
6646
+ pendingReviewTriage = undefined;
6647
+ };
6516
6648
  for (;;) {
6517
6649
  if (round > 0) {
6518
6650
  const stoppedBeforeRework = honorParentSoftStop('rework');
@@ -6670,6 +6802,17 @@ async function runSelfImplementInner(
6670
6802
  });
6671
6803
  }
6672
6804
  effectiveMax = budgetDecision.effectiveMax;
6805
+ if (pendingReviewTriage && budgetDecision.stop) {
6806
+ recordPendingReviewTriage('follow-up', budgetDecision.exit === 'proceed' ? 'open-pr' : 'review-blocked', effectiveMax);
6807
+ } else if (pendingReviewTriage && round <= effectiveMax) {
6808
+ const extendedDecision = decideReviewRound({
6809
+ verdict: pendingReviewTriage.verdict,
6810
+ mustFix: pendingReviewTriage.reflectedMustFix,
6811
+ round: pendingReviewTriage.round,
6812
+ effectiveMax,
6813
+ });
6814
+ if (extendedDecision === 'rework') recordPendingReviewTriage('rework', 'rework', effectiveMax);
6815
+ }
6673
6816
  if (parsedDecision) {
6674
6817
  if (diagnosisRefutations) {
6675
6818
  const adjudications = parseSupervisorRefutationAdjudications(diagnosis, diagnosisRefutations.refutations);
@@ -6878,6 +7021,7 @@ async function runSelfImplementInner(
6878
7021
  : 'UNCONVERGEABLE' as const;
6879
7022
  const supervisorOutcome = { supervisorVerdict, ...(goalCauseObserved ? { goalCauseObserved: true as const } : {}) };
6880
7023
  if (isReviewRework(reworkKind)) {
7024
+ recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
6881
7025
  if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
6882
7026
  const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', verdict: parsedDecision.verdict, reason: parsedDecision.reason, gate, decomposition: terminalDecomposition, salvageStatusExpected: false });
6883
7027
  await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked', unresolvedMustFix: review?.mustFix, decompositionPieces: terminalDecomposition?.pieces?.map((p) => p.feature), feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
@@ -6909,6 +7053,7 @@ async function runSelfImplementInner(
6909
7053
  const terminal = resolveRunOutcome({ termination: 'supervisor-abandoned', verdict: 'UNCONVERGEABLE', applied: true });
6910
7054
  const reason = `rework judged unconvergeable after ${round - 1} rework round(s)`;
6911
7055
  if (isReviewRework(reworkKind)) {
7056
+ recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
6912
7057
  if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
6913
7058
  const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', verdict: lastReworkVerdict, reason, gate, salvageStatusExpected: false });
6914
7059
  await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked', unresolvedMustFix: review?.mustFix, feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
@@ -6952,6 +7097,7 @@ async function runSelfImplementInner(
6952
7097
  );
6953
7098
  podDecision(acceptance.decision.action === 'accept');
6954
7099
  if (acceptance.decision.action === 'accept') {
7100
+ recordPendingReviewTriage('follow-up', 'open-pr', effectiveMax);
6955
7101
  if (podReviewBlockedDraft) {
6956
7102
  observe('merge-decision', {
6957
7103
  autoMerge: autoMergeEnabled(opts), reviewed: review?.reviewed === true, verdict: review?.verdict ?? 'none',
@@ -6990,6 +7136,7 @@ async function runSelfImplementInner(
6990
7136
  };
6991
7137
  }
6992
7138
  } else podDecision(false);
7139
+ recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
6993
7140
  const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', reason, gate, salvageStatusExpected: true });
6994
7141
  const salvage = blockedDraftNoChanges || blockedDraftPrFailure ? 'parked' : await salvageHardCap(canSalvage, pr);
6995
7142
  const disposition = { ...terminal, ...(salvage ? { salvage } : {}) };
@@ -7250,12 +7397,16 @@ async function runSelfImplementInner(
7250
7397
  try { after = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff */ }
7251
7398
  const targetDiff = after === undefined ? undefined : eligible(after);
7252
7399
  const resultLine = /(?:^|\n)\s*RESULT:\s*\S/m.test(impl.evidenceTranscript ?? impl.summary);
7253
- const succeeded = impl.ok && !!targetDiff?.length && resultLine;
7400
+ // A completed child can leave a real, declared-target diff while its
7401
+ // final screen omits RESULT. The measured diff is sufficient to enter
7402
+ // review/gate; a failed child or an unmeasured/empty diff still stops.
7403
+ const succeeded = impl.ok && !!targetDiff?.length;
7254
7404
  goalOnlyReworkExhausted = !succeeded;
7255
7405
  observe('implementation-goal-only-rework', {
7256
7406
  status: succeeded ? 'succeeded' : 'exhausted', round: retryRound, targets,
7257
7407
  firstToolCalls, retryToolCalls: impl.toolCalls ?? null,
7258
7408
  targetDiffCount: targetDiff?.length ?? null, diffMeasured: after !== undefined, resultLine,
7409
+ ...(succeeded ? { evidenceBasis: resultLine ? 'result-and-target-diff' : 'declared-target-diff' } : {}),
7259
7410
  }, succeeded ? {} : { level: 'warn' });
7260
7411
  if (!succeeded) impl = { ...impl, ok: false, summary: `goal-only-rework-exhausted: ${impl.summary}` };
7261
7412
  round = retryRound;
@@ -7349,7 +7500,7 @@ async function runSelfImplementInner(
7349
7500
  env.GIT_COMMITTER_NAME = childName;
7350
7501
  env.GIT_COMMITTER_EMAIL = childEmail;
7351
7502
  const git = (args: string[]) => spawnSync('git', ['--no-optional-locks', ...args], {
7352
- cwd, env, encoding: 'utf8', timeout: 20_000,
7503
+ cwd, env, encoding: 'utf8', timeout: 20_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER,
7353
7504
  });
7354
7505
  const staged = git(['add', '-A', '--', ...paths]);
7355
7506
  if (staged.status !== 0) return { ok: false, out: staged.stderr || staged.stdout || staged.error?.message || 'git add failed' };
@@ -7413,6 +7564,7 @@ async function runSelfImplementInner(
7413
7564
  catch { /* observation is fail-soft */ }
7414
7565
  }
7415
7566
  const evidenceChecks = runBudgetedEvidenceChecks(roundGoal, wt.path, runId, evidenceHead);
7567
+ const authoredSignal = authoredSignalExecution(roundGoal, evidenceChecks);
7416
7568
  const tagCoverage = coverRequiredEvidence(requiredEvidence, offDiffEvidence.items);
7417
7569
  // EVIDENCE-WIRING-EXEMPT — a requirement whose own `|| bun test …` check passed is covered by what the harness measured.
7418
7570
  const settledByCheck = settleUncoveredEvidence(tagCoverage.uncovered, { checks: evidenceChecks, required: requiredEvidence });
@@ -7858,10 +8010,11 @@ async function runSelfImplementInner(
7858
8010
  // Gate has passed. Measure newly exported runtime values before review, without
7859
8011
  // turning a static-analysis guess into a rework verdict during the first rollout.
7860
8012
  const wiringFiles = [...new Set([...(runFacts.changedFiles ?? []), ...(gateRouteFiles ?? []), ...untrackedFiles])];
8013
+ let goalWiring: 'unwired' | undefined;
7861
8014
  if (wiringFiles.some((file) => /^(?:src|scripts|apps\/pwa\/src)\/.*\.tsx?$/.test(file))) {
7862
8015
  const wiringBase = wt.resolvedBase;
7863
8016
  const wiring = wiringBase && /^[0-9a-f]{40}$/i.test(wiringBase)
7864
- ? findUnwiredExports({
8017
+ ? (s.checkUnwiredExports ?? findUnwiredExports)({
7865
8018
  cwd: wt.path,
7866
8019
  changedFiles: wiringFiles,
7867
8020
  // Timeouts and git errors throw → recorded as `failure`, never as "absent at base".
@@ -7871,6 +8024,15 @@ async function runSelfImplementInner(
7871
8024
  ),
7872
8025
  })
7873
8026
  : { checked: 0, unwired: [], failure: 'resolved-base-unavailable' };
8027
+ if (!wiring.failure && opts.goalFile && wiring.unwired.length > 0) {
8028
+ try {
8029
+ const declared = declaredPathsFromGoalDocumentText(readFileSync(opts.goalFile, 'utf8'));
8030
+ if (declared.readable && wiring.unwired.some(({ file }) =>
8031
+ declared.paths.some((target) => normalizeDeclaredScopePath(target) === normalizeDeclaredScopePath(file)))) {
8032
+ goalWiring = 'unwired';
8033
+ }
8034
+ } catch { /* unreadable goal text cannot establish a wiring deficit */ }
8035
+ }
7874
8036
  const wiringObservation = {
7875
8037
  round,
7876
8038
  checked: wiring.checked,
@@ -7996,15 +8158,98 @@ async function runSelfImplementInner(
7996
8158
  : `리뷰 미실행${review.failureReason !== undefined ? ` (${review.failureReason})` : ''}`);
7997
8159
  if (opts.goalFile) {
7998
8160
  let goalSlotFill: SupervisorGoalFillResult = 'unverifiable';
8161
+ let goalSlotDeficit: import('./goal-supervisor-fill.js').SupervisorGoalDeficit | undefined;
8162
+ let goalSlotAction: 'remeasure' | 'connect-goal' | undefined;
8163
+ let goalSlotFillError = false;
7999
8164
  try {
8000
8165
  goalSlotFill = await fillUnverifiableGoalSlots({
8001
- path: opts.goalFile, round, gate, review,
8166
+ path: opts.goalFile, round, gate, review, ...(authoredSignal ? { authoredSignal } : {}),
8167
+ ...(goalWiring ? { wiring: goalWiring } : {}),
8002
8168
  independentlyCheck: s.independentlyCheckGoalSlots ?? (async () => false),
8169
+ observeDeficit: (deficit) => { goalSlotDeficit = deficit; },
8003
8170
  });
8004
8171
  } catch {
8005
8172
  goalSlotFill = 'rejected';
8173
+ goalSlotFillError = true;
8174
+ }
8175
+ if (goalSlotFill === 'not-applicable') {
8176
+ observe('goal-slot-remeasure-result', { round, result: goalSlotFill, gatePassed: gate.passed,
8177
+ reason: 'test-step-scope-skipped', scopeReason: gate.scopeReason, testStepExecuted: gate.testStepExecuted });
8178
+ }
8179
+ if (goalSlotDeficit) {
8180
+ observe('supervisor-report-deficit', { runId, ...goalSlotDeficit, supervisorResult: goalSlotFill });
8181
+ if (goalSlotDeficit.kind !== 'unverified') {
8182
+ const move = repairNextMove({ supervisorDeficit: goalSlotDeficit,
8183
+ supervisorResult: goalSlotFill === 'rejected' ? 'rejected' : 'unverifiable' });
8184
+ if (move.kind === 'grounding') {
8185
+ goalSlotAction = move.action;
8186
+ observe('repair-next-move-input', { runId, ...move.supervisorDeficit,
8187
+ supervisorResult: goalSlotFill, action: move.action });
8188
+ }
8189
+ }
8190
+ }
8191
+ if (goalSlotFill === 'unverifiable' && gate.passed && goalSlotAction === 'remeasure' && goalSlotDeficit && runsGate) {
8192
+ observe('goal-slot-remeasure', { round, evidenceId: goalSlotDeficit.evidenceId, action: 'remeasure' });
8193
+ const measuredGate = await stepTimeout(s.gate(wt.path, { runId, round }), T.gate, 'gate');
8194
+ gate = measuredGate;
8195
+ let remeasureDeficit: import('./goal-supervisor-fill.js').SupervisorGoalDeficit | undefined;
8196
+ if (gate.passed) {
8197
+ goalSlotFill = await fillUnverifiableGoalSlots({ path: opts.goalFile, round, gate, review, ...(authoredSignal ? { authoredSignal } : {}),
8198
+ independentlyCheck: s.independentlyCheckGoalSlots ?? (async () => false),
8199
+ observeDeficit: (deficit) => { remeasureDeficit = deficit; } });
8200
+ }
8201
+ observe('goal-slot-remeasure-result', { round, evidenceId: goalSlotDeficit.evidenceId, result: goalSlotFill,
8202
+ gatePassed: measuredGate.passed,
8203
+ ...(remeasureDeficit ? { deficitKind: remeasureDeficit.kind,
8204
+ deficitEvidenceId: remeasureDeficit.evidenceId, gateLog: remeasureDeficit.gateLog,
8205
+ reason: remeasureDeficit.reason, reasonDetail: remeasureDeficit.reasonDetail,
8206
+ inputSummary: remeasureDeficit.inputSummary, gateLogRef: remeasureDeficit.gateLogRef } : {}) });
8207
+ if (goalSlotFill === 'unverifiable' && gate.passed) {
8208
+ finalizeSupervisorDeliveries('goal-slot-remeasurement-unverifiable');
8209
+ const evidenceReason = [remeasureDeficit?.reason, remeasureDeficit?.reasonDetail]
8210
+ .filter((part): part is string => Boolean(part)).join(' · ');
8211
+ const reason = `goal-slot remeasurement remained unverifiable after the second gate passed · evidence ${goalSlotDeficit.evidenceId}${evidenceReason ? ` · ${evidenceReason}` : ''}`;
8212
+ observe('goal-slot-remeasurement-preserved', {
8213
+ round, evidenceId: goalSlotDeficit.evidenceId, gatePassed: true,
8214
+ reason: remeasureDeficit?.reason ?? 'remeasurement-deficit-not-reported',
8215
+ ...(remeasureDeficit?.reasonDetail ? { reasonDetail: remeasureDeficit.reasonDetail } : {}),
8216
+ ...(remeasureDeficit?.gateLogRef ? { gateLogRef: remeasureDeficit.gateLogRef } : {}),
8217
+ disposition: 'preserve-for-recovery',
8218
+ });
8219
+ const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', reason, gate, salvageStatusExpected: false });
8220
+ return { ok: false, stage: 'review-blocked', node: 'rework', ...resolveRunOutcome({ termination: 'budget-exhausted' }),
8221
+ sessionId, worktreePath: wt.path, branch: wt.branch, gate,
8222
+ quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
8223
+ ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
8224
+ }
8225
+ if (!gate.passed || goalSlotFill === 'rejected') {
8226
+ finalizeSupervisorDeliveries('goal-slot-remeasure-gate-failed');
8227
+ const reason = `goal-slot remeasurement ${!gate.passed ? 'failed' : goalSlotFill === 'rejected' ? 'rejected' : 'unmeasured'} · evidence ${goalSlotDeficit.evidenceId}`;
8228
+ const pr = await preserveBlockedArtifacts({ stage: 'gate-failed', reason, gate, salvageStatusExpected: false });
8229
+ return { ok: false, stage: 'gate-failed', node: 'rework', ...resolveRunOutcome({ termination: 'abandoned' }),
8230
+ sessionId, worktreePath: wt.path, branch: wt.branch, gate,
8231
+ quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
8232
+ ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
8233
+ }
8234
+ }
8235
+ observe('goal-slot-fill', { round, result: goalSlotFill, gatePassed: gate.passed, reviewVerdict: review.verdict,
8236
+ ...(goalSlotDeficit ? { reason: goalSlotDeficit.reason, reasonDetail: goalSlotDeficit.reasonDetail,
8237
+ inputSummary: goalSlotDeficit.inputSummary, gateLogRef: goalSlotDeficit.gateLogRef } : {}),
8238
+ ...(!goalSlotDeficit && goalSlotFill === 'unverifiable' ? { reason: 'goal-slot-fill-no-deficit' } : {}),
8239
+ ...(goalSlotFillError ? { reason: 'goal-slot-fill-error' } : {}),
8240
+ ...(goalSlotFill === 'not-applicable' ? { reason: 'test-step-scope-skipped', scopeReason: gate.scopeReason,
8241
+ testStepExecuted: gate.testStepExecuted } : {}) });
8242
+ if (goalSlotAction === 'connect-goal' && goalSlotDeficit) {
8243
+ finalizeSupervisorDeliveries('goal-slot-connect-goal');
8244
+ const reason = `goal-slot wiring deficit · evidence ${goalSlotDeficit.evidenceId}`;
8245
+ const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', reason, gate, salvageStatusExpected: false });
8246
+ await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked',
8247
+ unresolvedMustFix: [reason], feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
8248
+ return { ok: false, stage: 'review-blocked', node: 'rework', ...resolveRunOutcome({ termination: 'abandoned' }),
8249
+ sessionId, worktreePath: wt.path, branch: wt.branch, gate, review,
8250
+ quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
8251
+ ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
8006
8252
  }
8007
- observe('goal-slot-fill', { round, result: goalSlotFill, gatePassed: gate.passed, reviewVerdict: review.verdict });
8008
8253
  }
8009
8254
  const evidenceFacts: ReflectEvidenceFacts = evidenceCoverage
8010
8255
  ? { requiredEvidence: evidenceCoverage.required, coveredEvidence: evidenceCoverage.covered, missingEvidence: evidenceCoverage.uncovered }
@@ -8066,6 +8311,9 @@ async function runSelfImplementInner(
8066
8311
  });
8067
8312
  } catch { /* fail-safe: REFUTE never changes a finding without supervisor judgment */ }
8068
8313
  }
8314
+ const rawReviewMustFix = [...review.mustFix];
8315
+ let reflectionApplied = false;
8316
+ let reviewTriageRecorded = false;
8069
8317
  if (review.verdict === 'fail' && review.mustFix.length > 0) {
8070
8318
  let effectiveMustFix = review.mustFix;
8071
8319
  if (s.reflectMustFix) {
@@ -8074,6 +8322,7 @@ async function runSelfImplementInner(
8074
8322
  try {
8075
8323
  const recurrenceHistory = recurrenceHistoryFor(review.mustFix);
8076
8324
  const reflected = await withStepTimeout(s.reflectMustFix({ mustFix: review.mustFix, goal: roundGoal, cwd: wt.path, evidenceFacts, gateFacts: gate.reflectGateFacts, citedPathFacts, ...(recurrenceHistory.length ? { recurrenceHistory } : {}), runId, round }), T.review, 'review');
8325
+ reflectionApplied = true;
8077
8326
  const rejectedItems = new Set(reflected.rejected.filter((r) => r.reason && r.reason.trim().length > 0).map((r) => r.item));
8078
8327
  const rejected = reflected.rejected.filter((r) => rejectedItems.has(r.item));
8079
8328
  effectiveMustFix = review.mustFix.filter((m) => !rejectedItems.has(m));
@@ -8110,6 +8359,17 @@ async function runSelfImplementInner(
8110
8359
  }
8111
8360
  }
8112
8361
  if (effectiveMustFix.length === 0) {
8362
+ observe('review-round-triage', {
8363
+ round,
8364
+ verdict: 'fail',
8365
+ rawMustFix: rawReviewMustFix,
8366
+ reflectedMustFix: effectiveMustFix,
8367
+ reflectionApplied,
8368
+ decision: 'pass',
8369
+ nextNode: 'open-pr',
8370
+ effectiveMax,
8371
+ });
8372
+ reviewTriageRecorded = true;
8113
8373
  finalizeSupervisorDeliveries('review-reflect-converged');
8114
8374
  completionStatus = 'review-reflect-converged';
8115
8375
  review.mustFix = [];
@@ -8119,6 +8379,21 @@ async function runSelfImplementInner(
8119
8379
  progress('reviewed', '리뷰: fail → warn (반사가 must-fix 를 «전부» 기각 — 사유는 위 줄과 PR 코멘트에)');
8120
8380
  break;
8121
8381
  }
8382
+ const reviewDecision = decideReviewRound({ verdict: review.verdict, mustFix: effectiveMustFix, round, effectiveMax });
8383
+ const reviewTriage = {
8384
+ round,
8385
+ verdict: review.verdict,
8386
+ rawMustFix: rawReviewMustFix,
8387
+ reflectedMustFix: [...effectiveMustFix],
8388
+ reflectionApplied,
8389
+ effectiveMax,
8390
+ };
8391
+ if (reviewDecision === 'follow-up') {
8392
+ pendingReviewTriage = { ...reviewTriage, verdict: 'fail' };
8393
+ } else {
8394
+ observe('review-round-triage', { ...reviewTriage, decision: reviewDecision, nextNode: 'rework' });
8395
+ reviewTriageRecorded = true;
8396
+ }
8122
8397
  appliedLastRound = [...effectiveMustFix];
8123
8398
  roundSummaryEntries.push({ round, kind: 'review', tried: impl.summary.replace(/\s+/g, ' ').trim().slice(0, 200),
8124
8399
  failedIds: effectiveMustFix.map(stableMustFixId), filesTouched: runFacts.changedFiles,
@@ -8171,6 +8446,18 @@ async function runSelfImplementInner(
8171
8446
  round++;
8172
8447
  continue;
8173
8448
  }
8449
+ if (!reviewTriageRecorded && !pendingReviewTriage) {
8450
+ observe('review-round-triage', {
8451
+ round,
8452
+ verdict: review.verdict,
8453
+ rawMustFix: rawReviewMustFix,
8454
+ reflectedMustFix: rawReviewMustFix,
8455
+ reflectionApplied: false,
8456
+ decision: 'pass',
8457
+ nextNode: 'open-pr',
8458
+ effectiveMax,
8459
+ });
8460
+ }
8174
8461
  }
8175
8462
  // EVIDENCE-WIRING-EXEMPT — a commandless [preservation] is covered once the changed-file gate passed.
8176
8463
  if (gate.passed && evidenceCoverage?.uncoveredCount) {
@@ -8517,7 +8804,7 @@ async function runSelfImplementInner(
8517
8804
  s.persistPrBodyArtifact,
8518
8805
  'self-implement-pr',
8519
8806
  );
8520
- let pr: { url: string; number: number };
8807
+ let pr: OpenPrOutcome;
8521
8808
  try {
8522
8809
  pr = await withStepTimeout(s.openPr({
8523
8810
  title: prTitle(opts.feature, opts.goalFile),
@@ -8548,15 +8835,64 @@ async function runSelfImplementInner(
8548
8835
  const current = runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 });
8549
8836
  if (current.status !== 0 || current.stdout.trim() !== reviewedHeadCommit) delete reviewedHeadResult.reviewedHeadCommit;
8550
8837
  }
8551
- observe('pr-opened', {
8552
- url: pr.url,
8553
- number: pr.number,
8554
- branch: wt.branch,
8555
- headCommit: runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 }).stdout.trim(),
8556
- autoMerge: canAuto,
8557
- autoReview: !!labels,
8558
- ...(preparedPrBody.truncated ? { prBodyTruncated: true, prBodyOriginalChars: preparedPrBody.originalChars } : {}),
8559
- });
8838
+ let prAttribution: { headRefName: string; createdAt: string } | undefined;
8839
+ let prAttributionReadError: string | undefined;
8840
+ try {
8841
+ if (s.readPrAttribution) {
8842
+ prAttribution = await s.readPrAttribution({ number: pr.number, cwd: wt.path });
8843
+ } else {
8844
+ const viewed = spawnSync('gh', ['pr', 'view', String(pr.number), '--json', 'headRefName,createdAt'], {
8845
+ cwd: wt.path, encoding: 'utf8', timeout: 30_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER,
8846
+ });
8847
+ if (viewed.status !== 0) throw new Error(viewed.stderr || viewed.stdout || 'gh pr view failed');
8848
+ const parsed = JSON.parse(viewed.stdout) as { headRefName?: unknown; createdAt?: unknown };
8849
+ if (typeof parsed.headRefName !== 'string' || typeof parsed.createdAt !== 'string') throw new Error('invalid PR attribution metadata');
8850
+ prAttribution = { headRefName: parsed.headRefName, createdAt: parsed.createdAt };
8851
+ }
8852
+ } catch (error) {
8853
+ prAttributionReadError = safeErrorDescription(error);
8854
+ }
8855
+ const expectedPrHead = pr.boundCardReuse?.headRefName ?? wt.branch;
8856
+ const prAttributed = !prAttributionReadError && !!prAttribution
8857
+ && prAttributedToRun(prAttribution, wt.branch, startedAtMs, pr.boundCardReuse);
8858
+ if (prAttributionReadError || !prAttribution) {
8859
+ onPrAttributionMismatch();
8860
+ observe('pr-attribution-unverified', {
8861
+ expectedBranch: expectedPrHead,
8862
+ number: pr.number,
8863
+ url: pr.url,
8864
+ reason: prAttributionReadError ?? 'metadata-absent',
8865
+ }, { level: 'warn' });
8866
+ } else if (!prAttributed) {
8867
+ onPrAttributionMismatch();
8868
+ observe('pr-attribution-mismatch', {
8869
+ expectedBranch: expectedPrHead,
8870
+ actualBranch: prAttribution.headRefName,
8871
+ createdAt: prAttribution.createdAt,
8872
+ number: pr.number,
8873
+ url: pr.url,
8874
+ }, { level: 'warn' });
8875
+ } else {
8876
+ const attributedNumber = recordedPrNumber(pr.number);
8877
+ if (attributedNumber !== undefined) onPrAttributed(attributedNumber);
8878
+ observe('pr-opened', {
8879
+ url: pr.url,
8880
+ number: pr.number,
8881
+ branch: expectedPrHead,
8882
+ headCommit: runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 }).stdout.trim(),
8883
+ autoMerge: canAuto,
8884
+ autoReview: !!labels,
8885
+ ...(preparedPrBody.truncated ? { prBodyTruncated: true, prBodyOriginalChars: preparedPrBody.originalChars } : {}),
8886
+ });
8887
+ }
8888
+ if (!prAttributed) {
8889
+ progress('aborted', `PR 귀속 확인 실패 — 외부 PR 후속 처리 중단 (${wt.branch}; worktree: ${wt.path})`);
8890
+ return {
8891
+ ok: false, stage: 'aborted', node: 'open-pr', ...resolveRunOutcome({ termination: 'abandoned' }),
8892
+ ...decisionSignalResult, ...scopeExpansionResult, sessionId, worktreePath: wt.path, branch: wt.branch,
8893
+ gate, ...(review ? { review } : {}), detail: 'PR attribution could not be verified; worktree and branch preserved',
8894
+ };
8895
+ }
8560
8896
  await flushPrComments(pr);
8561
8897
 
8562
8898
  // Inspect the opened PR itself: the goal text and the pre-sync worktree can differ from its final file list.
@@ -8749,7 +9085,7 @@ async function runSelfImplementInner(
8749
9085
  await withJourneyNode('cleanup', { provenance: 'post-merge', runId }, () => runPostMergeCleanup(s.postMergeCleanup, wt.path, wt.branch, opts.goalFile, mergedBase && defaultBranch && displayBranchName(mergedBase) === displayBranchName(defaultBranch) ? defaultBranch : undefined, (event, data) => {
8750
9086
  if (event.startsWith('post-merge-cleanup-')) cleanupOutcome = event.slice('post-merge-cleanup-'.length);
8751
9087
  observe(event, data);
8752
- }));
9088
+ }, wt.inPlace === true));
8753
9089
  exitJourneyNode('cleanup', { provenance: 'post-merge', runId, outcome: cleanupOutcome });
8754
9090
  const mergedLedger = (() => {
8755
9091
  try { return loadRunLedger(runId); } catch { return null; }