elanous 0.2.37 → 0.2.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 1026-44010f405704050c.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
  6. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 1632.7d87f998e714bede.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{4937-28d437999b77c9dd.js → 1923-5c1695332240246a.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
  18. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
  19. package/apps/pwa/out/_next/static/chunks/{3199.6a1a9b0e6cd01dc6.js → 2415.738b777642a02233.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/3124-561f7f037943cde2.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
  31. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 3291.f6c1005387d514bd.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
  34. package/apps/pwa/out/_next/static/chunks/{6877-84d47b7e85d0c41e.js → 3341-f09b9efbd7a82f70.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
  38. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 3528.e4b8ab70d339f965.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
  45. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
  57. package/apps/pwa/out/_next/static/chunks/{4036.d54e55e1ebf5acdc.js → 4804.6012b5cd33c22792.js} +2 -2
  58. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
  60. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
  65. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/{757-4fbaf50942b8c424.js → 5255-1b60d50eabe9f057.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
  68. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 5307.d7328020227880c2.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
  73. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 5638.107314dc479e2f37.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
  80. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6493.27ad77de7aac7966.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{1224.2ceca6c180d5130b.js → 7000.28157393caaf5343.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/{2479-fe7e188bd9402d14.js → 7311-60a7ea80d23c7521.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{5952.294fc574a8625184.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
  95. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 7628.6b16863ac3972333.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 7954.4f7a8832663ee979.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 8019.21ca554a821dad01.js} +16 -16
  102. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 8487.291666583bebe640.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 8879.ac06755bcf3e44a1.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
  111. package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
  116. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
  117. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
  121. package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/{page-5c112c6d7c33656e.js → page-c348a3959c5b5fc6.js} +1 -1
  140. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-88a1edbff62eaf1d.js → page-d1d1210f99f620ae.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/{page-b9af2ac1c4737ce8.js → page-7f569e533ddeecba.js} +1 -1
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/{page-fb9e639c107f5f72.js → page-a9d9a3e66459c1e0.js} +1 -1
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → bb6987f9.3647e1a23b0e3217.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/de8b930d.d94c0f42acf807fc.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → eaad0cba.771200940c529df7.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/graphs/release/recipes.yaml +9 -0
  278. package/graphs/release/release-loop.yaml +26 -18
  279. package/package.json +1 -1
  280. package/scripts/ask-op-inbox-once.ts +17 -0
  281. package/scripts/brand/check.ts +13 -4
  282. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  283. package/scripts/gate-0226-failure-census.ts +39 -0
  284. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  285. package/scripts/provision-export-redactions.ts +15 -0
  286. package/scripts/public-copy-lint.ts +122 -0
  287. package/scripts/public-export.ts +69 -2
  288. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  289. package/scripts/ratchets/train-side-invariants.sh +7 -1
  290. package/scripts/release-loop/cut-branch.ts +61 -12
  291. package/scripts/release-loop/gate-node.ts +161 -25
  292. package/scripts/release-loop/gate-partial.ts +82 -3
  293. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  294. package/scripts/release-loop/gate-radius-live.ts +4 -2
  295. package/scripts/release-loop/resume-cap.ts +2 -1
  296. package/scripts/release-loop/resume-release.ts +297 -8
  297. package/scripts/release-loop/resume.ts +13 -5
  298. package/scripts/release-loop/traffic-node.ts +12 -4
  299. package/scripts/release-loop/traffic-transition.ts +53 -13
  300. package/scripts/release-loop/version-node.ts +29 -4
  301. package/scripts/ux-sim.ts +1 -1
  302. package/scripts/video-pipeline.ts +2 -2
  303. package/src/acp/core-turn-bridge.ts +6 -1
  304. package/src/agent/run-context.ts +1 -1
  305. package/src/agent/task-notification.ts +3 -1
  306. package/src/agent-substrate/review-observation.ts +10 -0
  307. package/src/agent-substrate/self-review-cli.ts +195 -27
  308. package/src/auto-research/question-ladder-contract.ts +137 -0
  309. package/src/auto-research/research-turn.ts +134 -0
  310. package/src/autopilot/discovery/doc-lint.ts +1 -1
  311. package/src/bots/screen-probe.ts +1 -1
  312. package/src/capture/tui-self-report.ts +10 -2
  313. package/src/chat/index.ts +1 -0
  314. package/src/chat/tool-render/dispatch.ts +8 -1
  315. package/src/cli/guardian-cli.ts +3 -1
  316. package/src/cli/intake-cli.ts +48 -12
  317. package/src/cli/lesson-cli.ts +69 -9
  318. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  319. package/src/cli/pr-land-refusal.ts +1 -1
  320. package/src/cli/pty-takeover-cli.ts +58 -5
  321. package/src/cli/release-checklist-read-cli.ts +5 -2
  322. package/src/cli/release-cli.ts +47 -9
  323. package/src/cli/review-carry.ts +77 -0
  324. package/src/cli/self-update.ts +1 -1
  325. package/src/cli/tasks-card-show.ts +31 -1
  326. package/src/cli/tasks-cli.ts +62 -23
  327. package/src/cli/tasks-read-cli.ts +13 -5
  328. package/src/context-bus/context-now.ts +86 -2
  329. package/src/core-turn/run-core-turn.ts +9 -2
  330. package/src/core-turn/types.ts +3 -0
  331. package/src/dashboard/index.ts +18 -17
  332. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  333. package/src/dashboard/side-basic-runtime.ts +61 -0
  334. package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
  335. package/src/dashboard/term-slash-runtime.ts +2 -0
  336. package/src/dashboard/turn-preamble.ts +28 -4
  337. package/src/domains/guardian-tick.ts +9 -0
  338. package/src/git-fs/watcher.ts +27 -22
  339. package/src/git-fs/worktree.ts +19 -3
  340. package/src/graph-runner/graph-grow.ts +37 -9
  341. package/src/graph-runner/runner.ts +17 -2
  342. package/src/grok/credential.ts +107 -36
  343. package/src/hq/fence-wrapper.ts +1 -1
  344. package/src/hq/transfer.ts +1 -1
  345. package/src/index.ts +44 -14
  346. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  347. package/src/interactive-terminal-modal.ts +3 -0
  348. package/src/keybindings.ts +17 -22
  349. package/src/llm/provider-credentials.ts +1 -1
  350. package/src/llm-tool-schema.ts +20 -0
  351. package/src/llm.ts +81 -11
  352. package/src/loops/orchestrator/inbox-once.ts +28 -0
  353. package/src/loops/orchestrator/inbox.ts +130 -1
  354. package/src/loops/orchestrator/tick.ts +6 -3
  355. package/src/maturity/feature-maturity.ts +1 -0
  356. package/src/nexus/api/channel-ask-op.ts +96 -0
  357. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  358. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  359. package/src/nexus/api/terminals.ts +28 -6
  360. package/src/patents/ledger.ts +18 -1
  361. package/src/preview/terminal.ts +4 -2
  362. package/src/prompt-cache/anthropic.ts +2 -0
  363. package/src/prompt-enhance/enhance.ts +5 -0
  364. package/src/pty-shell/pty-manifest.ts +16 -2
  365. package/src/release-loop/gate-shards.ts +61 -0
  366. package/src/release-loop/light-rc.ts +7 -4
  367. package/src/release-loop/rehearsal.ts +1 -1
  368. package/src/repl/index.ts +10 -0
  369. package/src/research/axis-fanout.ts +133 -0
  370. package/src/research/edge-decision.ts +88 -0
  371. package/src/research/output-router.ts +127 -0
  372. package/src/research-bridge/format.ts +16 -1
  373. package/src/research-bridge/index.ts +1 -0
  374. package/src/research-bridge/invoke.ts +41 -5
  375. package/src/self-dev/decompose.ts +45 -9
  376. package/src/self-dev/draft-residue.ts +221 -2
  377. package/src/self-dev/draft-sweep.ts +29 -16
  378. package/src/self-dev/orchestrate.ts +1 -0
  379. package/src/self-dev/run-supervisor.ts +22 -7
  380. package/src/self-dev/shard-run.ts +260 -3
  381. package/src/self-implement/comment-only-source.ts +54 -0
  382. package/src/self-implement/doctor-visit.ts +25 -0
  383. package/src/self-implement/gate-artifacts.ts +2 -2
  384. package/src/self-implement/gate-baseline.ts +44 -9
  385. package/src/self-implement/gate-cli.ts +151 -86
  386. package/src/self-implement/gate-failure-signature.ts +44 -0
  387. package/src/self-implement/gate-remote.ts +2 -0
  388. package/src/self-implement/goal-author.ts +74 -3
  389. package/src/self-implement/goal-doc/section.ts +22 -0
  390. package/src/self-implement/goal-supervisor-fill.ts +38 -4
  391. package/src/self-implement/knowhow-pack.ts +120 -7
  392. package/src/self-implement/l8-merge-queue.ts +198 -32
  393. package/src/self-implement/off-diff-evidence.ts +23 -0
  394. package/src/self-implement/orchestrator.ts +55 -12
  395. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  396. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  397. package/src/self-implement/premise-review.ts +7 -5
  398. package/src/self-implement/run-ledger.ts +258 -0
  399. package/src/self-implement/seams.ts +33 -10
  400. package/src/self-implement/self-implement-cli.ts +26 -2
  401. package/src/session/channel-ask-op-envelope.ts +36 -0
  402. package/src/session/channel-op-reply-route.ts +200 -0
  403. package/src/session/chat.ts +3 -0
  404. package/src/session/index.ts +2 -0
  405. package/src/session-runtime/index.ts +9 -22
  406. package/src/skills/runner.ts +7 -3
  407. package/src/skills/tools/dev-harness.ts +2 -2
  408. package/src/skills/tools/schedule-wakeup.ts +1 -6
  409. package/src/status/bar.ts +3 -3
  410. package/src/storage/file-lock.ts +17 -4
  411. package/src/task-agent/adopt-pr.ts +63 -2
  412. package/src/task-agent/evidence-command-normalize.ts +42 -0
  413. package/src/task-agent/export-redactions-provision.ts +43 -0
  414. package/src/task-agent/parent-host.ts +59 -12
  415. package/src/task-agent/repair-cycle.ts +67 -8
  416. package/src/task-agent/repair-worker.ts +37 -1
  417. package/src/task-agent/task-hand.ts +98 -10
  418. package/src/task-agent/tier-split.ts +37 -3
  419. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  420. package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
  421. package/src/task-orchestrator/surfaces/self-implement-pod.ts +126 -48
  422. package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
  423. package/src/terminal/session-registry.ts +1 -0
  424. package/src/terminal/terminal-modal-router.ts +156 -0
  425. package/src/tool-hints/gate.ts +6 -4
  426. package/src/tool-hints/signals.ts +33 -1
  427. package/src/tui/chat/background-job-status.ts +8 -2
  428. package/src/tui/entry.ts +469 -31
  429. package/src/tui/sidetab/attach.ts +304 -0
  430. package/src/tui/sidetab/list.ts +176 -0
  431. package/src/tui/sidetab/nl-tool.ts +136 -0
  432. package/src/tui/slash/resume-command.ts +23 -0
  433. package/src/tui/slash/resume.ts +3 -23
  434. package/src/tui/slash/term-next.ts +2 -1
  435. package/src/tui-client/local-chat-turn.ts +29 -8
  436. package/src/user-config.ts +11 -2
  437. package/src/ux-sim/fake-llm.ts +11 -5
  438. package/src/ux-sim/next-tui-seat-scenarios.ts +53 -1
  439. package/src/version/packed-revision.json +1 -1
  440. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
  451. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
  454. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
  458. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/3578.4e9f9948a9a6f2f4.js +0 -2
  463. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
  465. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
  467. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
  468. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/4313.76f232c304a15bde.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/4725-34bed25720cc326b.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
  477. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
  479. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
  486. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
  487. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
  490. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
  493. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
  496. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
  508. package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
  510. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
  513. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
  517. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
  525. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
  527. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
  586. package/scripts/migrate-monad-to-elanous.ts +0 -195
  587. package/scripts/rebrand-elanous.ts +0 -242
  588. /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
@@ -5,6 +5,7 @@ import { spawnSync } from 'node:child_process';
5
5
  import { debug } from '../debug/log.js';
6
6
  import { narrowerEvidenceCommand } from './evidence-command-budget.js';
7
7
  import { resolveRunIdentity } from '../harness/harness-space.js';
8
+ import { authoredSignalCommandFromGoal } from './goal-doc/section.js';
8
9
  //
9
10
  // ⛔ **왜 필요한가** — 리뷰어의 증거 채널은 워크트리 diff 하나다(`seams.ts` 의 `reviewDiff`).
10
11
  // 그래서 자식이 **diff 로 드러나지 않는 이행**(명령을 돌려 확인한 결과·라이브 관측)을 했을 때
@@ -334,6 +335,26 @@ interface RequiredEvidenceCheckRun {
334
335
  readonly substitutedFor?: string;
335
336
  }
336
337
 
338
+ function authoredSignalCommand(goal: string): string | undefined {
339
+ const command = authoredSignalCommandFromGoal(goal);
340
+ if (!command) return undefined;
341
+ // Goal-authored signals run as one explicit command. Reject shell composition and
342
+ // substitutions; keep the accepted executable set aligned with goal-author's contract.
343
+ if (/[\r\n;|&<>`$()]/u.test(command) || /\b(?:sudo|eval|exec)\b/u.test(command)) return undefined;
344
+ const match = command.match(/^([A-Za-z0-9_./~-]+)\s+(.+)$/u);
345
+ if (!match) return undefined;
346
+ const executable = match[1]!.split('/').at(-1);
347
+ if (!new Set(['eln','bun','git','gh','rg','test','npm','pnpm','yarn','node','python','python3','pytest','make','cargo','go','curl','jq','sqlite3','grep','sed','awk','cat','find','docker','kubectl']).has(executable!)) return undefined;
348
+ if (executable === 'test' && !/^(?:-f|-e)\s+[^\s]+$/u.test(match[2]!)) return undefined;
349
+ return command;
350
+ }
351
+
352
+ export function authoredSignalExecution(goal: string, checks: readonly RequiredEvidenceCheckRun[]): { command: string; exitCode: number | null; stdout: string; stderr: string } | undefined {
353
+ const command = authoredSignalCommand(goal);
354
+ const run = command ? checks.find((check) => check.command === command) : undefined;
355
+ return run ? { command: run.command, exitCode: run.exitCode, stdout: run.stdout, stderr: run.stderr } : undefined;
356
+ }
357
+
337
358
  type EvidenceCommandRunner = (command: string, cwd: string) => Pick<ReturnType<typeof spawnSync>, 'status' | 'stdout' | 'stderr' | 'error'>;
338
359
 
339
360
  /**
@@ -436,6 +457,8 @@ export function runRequiredEvidenceChecks(goal: string, cwd: string, runId?: str
436
457
  } = {}): RequiredEvidenceCheckRun[] {
437
458
  const identity = resolveRunIdentity({ explicit: runId });
438
459
  const checks = requiredEvidenceFromGoal(goal).flatMap(({ tag, verifyCommand }) => verifyCommand ? [{ tag, command: verifyCommand }] : []);
460
+ const signalCommand = authoredSignalCommand(goal);
461
+ if (signalCommand && !checks.some(({ command }) => command === signalCommand)) checks.push({ tag: 'authored-signal', command: signalCommand });
439
462
  // Direct callers without a measured HEAD have no stable revision identity;
440
463
  // the run-owned wrapper supplies a temporary identity when appropriate.
441
464
  const timeoutCounts = options.headCommit ? options.timeoutCounts : undefined;
@@ -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';
@@ -226,7 +226,7 @@ import { formatGateFailedId, type PremiseReviewCard, type PremiseReviewInput } f
226
226
  import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
227
227
  import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
228
228
  import { resolveRunOutcome } from './run-outcome.js';
229
- 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';
230
230
  import { resolveEvidenceHeadCommit } from './evidence-command-budget.js';
231
231
  import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
232
232
  import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
@@ -1107,6 +1107,8 @@ export interface SelfImplementSeams {
1107
1107
  synthesizeGoalContext?: (input: { goalFile?: string }) => Promise<Pick<import('../harness/harness-worktree-add.js').HarnessWorktreeGoalMetadata, 'goalTitle' | 'goalDescription' | 'goalDescriptionSource'>>;
1108
1108
  createWorktree: (opts: { branch: string; base?: string; runId?: string } & import('../harness/harness-worktree-add.js').HarnessWorktreeGoalMetadata) => Promise<{
1109
1109
  path: string; branch: string;
1110
+ /** A single-use Pod may implement in its already checked-out source tree. */
1111
+ inPlace?: boolean;
1110
1112
  /** Strict provenance values are returned only after their recording succeeds. */
1111
1113
  owner?: string;
1112
1114
  command?: string;
@@ -2355,6 +2357,8 @@ export interface SelfImplementResult {
2355
2357
  walk?: readonly { node: string; round: number }[];
2356
2358
  /** Canonical run-identity join key; always present because resolveRunIdentity always mints or inherits one. */
2357
2359
  runId: string;
2360
+ /** Parent-observed goal-plan revision attempt evidence; omitted when no ledger evidence was read. */
2361
+ goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
2358
2362
  ok: boolean;
2359
2363
  stage: SelfImplementStage;
2360
2364
  /** Verbatim must-fix findings retained on a review-blocked terminal result. */
@@ -3329,7 +3333,12 @@ async function runPostMergeCleanup(
3329
3333
  goalFile: string | undefined,
3330
3334
  remoteBranch: string | undefined,
3331
3335
  observe: (event: string, data: Record<string, unknown>) => void,
3336
+ inPlace = false,
3332
3337
  ): Promise<void> {
3338
+ if (inPlace) {
3339
+ observe('post-merge-cleanup-preserved', { worktreePath, branch, reason: 'pod-inplace-source' });
3340
+ return;
3341
+ }
3333
3342
  if (!cleanup?.enabled) {
3334
3343
  observe('post-merge-cleanup-preserved', { worktreePath, branch, reason: cleanup ? 'disabled' : 'not-configured' });
3335
3344
  return;
@@ -5286,6 +5295,7 @@ async function runSelfImplementInner(
5286
5295
  observe('worktree', {
5287
5296
  path: wt.path,
5288
5297
  branch: wt.branch,
5298
+ inPlace: wt.inPlace === true,
5289
5299
  terminalLaunchHead: terminalLaunchHead ?? null,
5290
5300
  terminalLaunchDirtyPaths: terminalLaunchDirtyPaths ? [...terminalLaunchDirtyPaths] : null,
5291
5301
  // ⭐ 우리가 **무엇을 요청했는지는 이미 안다** — 시임 반환에서 되읽지 않는다.
@@ -5306,7 +5316,7 @@ async function runSelfImplementInner(
5306
5316
  // ⛔ 발사 부모(`harness ask`·`dev`)에는 ELANOUS_HARNESS_SPACE_ID 가 «없다» — 그 env 는 자식에게만 심긴다.
5307
5317
  // 그래서 getHarnessSpace() 만 보면 운영에서 늘 undefined 이고 정지 확인이 «한 번도» 안 돈다(#20040 착지 직후 실측).
5308
5318
  // `self send <space> --stop` 이 겨냥하는 것은 자식의 공간 = 워크트리 이름이다(아래 activeChildInboxId 와 같은 식 · dev-cli.ts recordRestart 폴백과 같다).
5309
- 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;
5310
5320
  if (parentSoftStopSpaceId) {
5311
5321
  try { s.onSoftStopSpaceReady?.(parentSoftStopSpaceId); } catch { /* UI registration must not break execution */ }
5312
5322
  }
@@ -5457,7 +5467,11 @@ async function runSelfImplementInner(
5457
5467
  // The repository copy travels with both local and Pod worktrees. Operational HQ ledgers are never read here.
5458
5468
  const knowhow = selectKnowhowPack(wt.path, opts.feature);
5459
5469
  if (knowhow.text) round0Feature = `${knowhow.text}\n\n${round0Feature}`;
5460
- 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 });
5461
5475
 
5462
5476
  // E1 착수 구체화(RFC-progressive-goal-elaboration §2 E1 · §7 간선 ①) — 고정 층(KPI·판정 신호)은 그대로, 카드만 덧붙인다.
5463
5477
  const elaboration = await (await import('./goal-elaborate.js')).runArrivalElaboration({ goal: opts.feature, prompt: round0Feature, cwd: wt.path, callLLM: s.elaborateCallLLM, observe });
@@ -5523,7 +5537,7 @@ async function runSelfImplementInner(
5523
5537
  readonly update?: (delivery: SupervisorDeliveryState, reason?: string) => void;
5524
5538
  };
5525
5539
  let supervisorDeliveryUpdates: PendingSupervisorDelivery[] = [];
5526
- const activeChildInboxId = normalizeSpaceId(basename(wt.path));
5540
+ const activeChildInboxId = normalizeSpaceId(wt.inPlace ? runId : basename(wt.path));
5527
5541
  const undeliveredSupervisorInputs: UndeliveredSupervisorInput[] = [];
5528
5542
  const recordUndeliveredSupervisorInput = (text: string, reason: string): void => {
5529
5543
  undeliveredSupervisorInputs.push({ text, reason });
@@ -7383,12 +7397,16 @@ async function runSelfImplementInner(
7383
7397
  try { after = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff */ }
7384
7398
  const targetDiff = after === undefined ? undefined : eligible(after);
7385
7399
  const resultLine = /(?:^|\n)\s*RESULT:\s*\S/m.test(impl.evidenceTranscript ?? impl.summary);
7386
- 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;
7387
7404
  goalOnlyReworkExhausted = !succeeded;
7388
7405
  observe('implementation-goal-only-rework', {
7389
7406
  status: succeeded ? 'succeeded' : 'exhausted', round: retryRound, targets,
7390
7407
  firstToolCalls, retryToolCalls: impl.toolCalls ?? null,
7391
7408
  targetDiffCount: targetDiff?.length ?? null, diffMeasured: after !== undefined, resultLine,
7409
+ ...(succeeded ? { evidenceBasis: resultLine ? 'result-and-target-diff' : 'declared-target-diff' } : {}),
7392
7410
  }, succeeded ? {} : { level: 'warn' });
7393
7411
  if (!succeeded) impl = { ...impl, ok: false, summary: `goal-only-rework-exhausted: ${impl.summary}` };
7394
7412
  round = retryRound;
@@ -7546,6 +7564,7 @@ async function runSelfImplementInner(
7546
7564
  catch { /* observation is fail-soft */ }
7547
7565
  }
7548
7566
  const evidenceChecks = runBudgetedEvidenceChecks(roundGoal, wt.path, runId, evidenceHead);
7567
+ const authoredSignal = authoredSignalExecution(roundGoal, evidenceChecks);
7549
7568
  const tagCoverage = coverRequiredEvidence(requiredEvidence, offDiffEvidence.items);
7550
7569
  // EVIDENCE-WIRING-EXEMPT — a requirement whose own `|| bun test …` check passed is covered by what the harness measured.
7551
7570
  const settledByCheck = settleUncoveredEvidence(tagCoverage.uncovered, { checks: evidenceChecks, required: requiredEvidence });
@@ -8141,15 +8160,17 @@ async function runSelfImplementInner(
8141
8160
  let goalSlotFill: SupervisorGoalFillResult = 'unverifiable';
8142
8161
  let goalSlotDeficit: import('./goal-supervisor-fill.js').SupervisorGoalDeficit | undefined;
8143
8162
  let goalSlotAction: 'remeasure' | 'connect-goal' | undefined;
8163
+ let goalSlotFillError = false;
8144
8164
  try {
8145
8165
  goalSlotFill = await fillUnverifiableGoalSlots({
8146
- path: opts.goalFile, round, gate, review,
8166
+ path: opts.goalFile, round, gate, review, ...(authoredSignal ? { authoredSignal } : {}),
8147
8167
  ...(goalWiring ? { wiring: goalWiring } : {}),
8148
8168
  independentlyCheck: s.independentlyCheckGoalSlots ?? (async () => false),
8149
8169
  observeDeficit: (deficit) => { goalSlotDeficit = deficit; },
8150
8170
  });
8151
8171
  } catch {
8152
8172
  goalSlotFill = 'rejected';
8173
+ goalSlotFillError = true;
8153
8174
  }
8154
8175
  if (goalSlotFill === 'not-applicable') {
8155
8176
  observe('goal-slot-remeasure-result', { round, result: goalSlotFill, gatePassed: gate.passed,
@@ -8173,7 +8194,7 @@ async function runSelfImplementInner(
8173
8194
  gate = measuredGate;
8174
8195
  let remeasureDeficit: import('./goal-supervisor-fill.js').SupervisorGoalDeficit | undefined;
8175
8196
  if (gate.passed) {
8176
- goalSlotFill = await fillUnverifiableGoalSlots({ path: opts.goalFile, round, gate, review,
8197
+ goalSlotFill = await fillUnverifiableGoalSlots({ path: opts.goalFile, round, gate, review, ...(authoredSignal ? { authoredSignal } : {}),
8177
8198
  independentlyCheck: s.independentlyCheckGoalSlots ?? (async () => false),
8178
8199
  observeDeficit: (deficit) => { remeasureDeficit = deficit; } });
8179
8200
  }
@@ -8181,8 +8202,27 @@ async function runSelfImplementInner(
8181
8202
  gatePassed: measuredGate.passed,
8182
8203
  ...(remeasureDeficit ? { deficitKind: remeasureDeficit.kind,
8183
8204
  deficitEvidenceId: remeasureDeficit.evidenceId, gateLog: remeasureDeficit.gateLog,
8184
- reason: remeasureDeficit.reason, inputSummary: remeasureDeficit.inputSummary, gateLogRef: remeasureDeficit.gateLogRef } : {}) });
8185
- if (!gate.passed || goalSlotFill === 'unverifiable' || goalSlotFill === 'rejected') {
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') {
8186
8226
  finalizeSupervisorDeliveries('goal-slot-remeasure-gate-failed');
8187
8227
  const reason = `goal-slot remeasurement ${!gate.passed ? 'failed' : goalSlotFill === 'rejected' ? 'rejected' : 'unmeasured'} · evidence ${goalSlotDeficit.evidenceId}`;
8188
8228
  const pr = await preserveBlockedArtifacts({ stage: 'gate-failed', reason, gate, salvageStatusExpected: false });
@@ -8193,7 +8233,10 @@ async function runSelfImplementInner(
8193
8233
  }
8194
8234
  }
8195
8235
  observe('goal-slot-fill', { round, result: goalSlotFill, gatePassed: gate.passed, reviewVerdict: review.verdict,
8196
- ...(goalSlotFill === 'unverifiable' && goalSlotDeficit ? { reason: goalSlotDeficit.reason, inputSummary: goalSlotDeficit.inputSummary, gateLogRef: goalSlotDeficit.gateLogRef } : {}),
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' } : {}),
8197
8240
  ...(goalSlotFill === 'not-applicable' ? { reason: 'test-step-scope-skipped', scopeReason: gate.scopeReason,
8198
8241
  testStepExecuted: gate.testStepExecuted } : {}) });
8199
8242
  if (goalSlotAction === 'connect-goal' && goalSlotDeficit) {
@@ -9042,7 +9085,7 @@ async function runSelfImplementInner(
9042
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) => {
9043
9086
  if (event.startsWith('post-merge-cleanup-')) cleanupOutcome = event.slice('post-merge-cleanup-'.length);
9044
9087
  observe(event, data);
9045
- }));
9088
+ }, wt.inPlace === true));
9046
9089
  exitJourneyNode('cleanup', { provenance: 'post-merge', runId, outcome: cleanupOutcome });
9047
9090
  const mergedLedger = (() => {
9048
9091
  try { return loadRunLedger(runId); } catch { return null; }
@@ -0,0 +1,82 @@
1
+ import { realpathSync } from 'node:fs';
2
+ import { relative, resolve, sep } from 'node:path';
3
+ import { debug } from '../debug/log.js';
4
+ import { runGitCommand } from '../git-fs/runner.js';
5
+ import { DEFAULT_BRANCH_WORKTREE_BASE, prepareWorktreeDependencies, resolveDefaultBranchBase, worktreeDependenciesAvailable } from '../git-fs/worktree.js';
6
+ import type { CreateWorktreeResult } from '../git-fs/worktree.js';
7
+
8
+ export type PodInplaceWorktree = CreateWorktreeResult & { readonly inPlace: true };
9
+
10
+ export function tryCreatePodInplaceWorktree(input: {
11
+ readonly repoRoot: string;
12
+ readonly cwd: string;
13
+ readonly branch: string;
14
+ readonly base?: string;
15
+ readonly runId?: string;
16
+ readonly goalFile?: string;
17
+ readonly env: NodeJS.ProcessEnv;
18
+ readonly dependencyFallbackRoot?: string;
19
+ }): PodInplaceWorktree | null {
20
+ if (input.env.ELANOUS_POD_INPLACE_WORKTREE !== '1') return null;
21
+ const skip = (reason: string): null => {
22
+ debug.log('self-implement', 'pod-inplace-worktree-skipped', { reason, branch: input.branch }, { level: 'warn' });
23
+ process.stderr.write(`ELANOUS_POD_INPLACE_SKIP reason=${reason}\n`);
24
+ return null;
25
+ };
26
+ if (input.env.ELANOUS_SUBSTRATE !== 'pod' || input.env.ELANOUS_POD_SINGLE_CHILD !== '1'
27
+ || !input.env.ELANOUS_POD_NAME?.trim() || !input.runId || input.env.ELANOUS_RUN_ID !== input.runId) {
28
+ return skip('not-single-owned-pod-child');
29
+ }
30
+ let repoRoot: string;
31
+ try {
32
+ repoRoot = realpathSync(input.repoRoot);
33
+ if (repoRoot !== realpathSync(input.cwd)) return skip('different-cwd');
34
+ } catch { return skip('repo-path-unavailable'); }
35
+ const git = (args: string[]) => runGitCommand(repoRoot, args, { encoding: 'utf8', timeout: 10_000 });
36
+ const top = git(['rev-parse', '--show-toplevel']);
37
+ if (top.status !== 0 || resolve(top.stdout.trim()) !== repoRoot) return skip('not-repo-root');
38
+ const head = git(['rev-parse', '--verify', 'HEAD']);
39
+ const resolvedBase = head.status === 0 ? head.stdout.trim() : '';
40
+ if (!/^[0-9a-f]{40,64}$/i.test(resolvedBase)) return skip('head-unavailable');
41
+ const base = input.base === DEFAULT_BRANCH_WORKTREE_BASE
42
+ ? (resolveDefaultBranchBase(repoRoot) ?? 'HEAD')
43
+ : (input.base ?? 'origin/main');
44
+ const pin = git(['rev-parse', '--verify', `${base}^{commit}`]);
45
+ if (pin.status !== 0 || pin.stdout.trim() !== resolvedBase) return skip('base-pin-mismatch');
46
+ const clean = git(['status', '--porcelain', '-z', '--untracked-files=all']);
47
+ let expectedGoalStatus: string | undefined;
48
+ if (input.goalFile) {
49
+ try {
50
+ const goalRelative = relative(repoRoot, realpathSync(resolve(repoRoot, input.goalFile))).split(sep).join('/');
51
+ if (/^docs\/goals\/GOAL-[^/]+\.md$/.test(goalRelative)) expectedGoalStatus = `?? ${goalRelative}`;
52
+ } catch { /* An unavailable goal file cannot exempt source dirt. */ }
53
+ }
54
+ const dirty = clean.stdout.split('\0').filter(Boolean);
55
+ if (clean.status !== 0 || (dirty.length > 0 && (dirty.length !== 1 || dirty[0] !== expectedGoalStatus))) return skip('source-dirty');
56
+ if (!worktreeDependenciesAvailable(repoRoot, input.dependencyFallbackRoot)) return skip('dependencies-unavailable');
57
+ const validBranch = git(['check-ref-format', '--branch', input.branch]);
58
+ if (validBranch.status !== 0) return skip('invalid-branch');
59
+ const held = git(['show-ref', '--verify', '--quiet', `refs/heads/${input.branch}`]);
60
+ if (held.status !== 1) return skip('branch-exists-or-unreadable');
61
+ const started = Date.now();
62
+ const switched = git(['switch', '--no-guess', '-c', input.branch]);
63
+ if (switched.status !== 0) {
64
+ throw new Error(`pod in-place branch switch failed: ${(switched.stderr || switched.stdout || `git exited ${switched.status}`).trim()}`);
65
+ }
66
+ const after = git(['rev-parse', '--verify', 'HEAD']);
67
+ const currentBranch = git(['branch', '--show-current']);
68
+ if (after.status !== 0 || after.stdout.trim() !== resolvedBase
69
+ || currentBranch.status !== 0 || currentBranch.stdout.trim() !== input.branch) {
70
+ throw new Error('pod in-place branch switch changed pin or branch unexpectedly');
71
+ }
72
+ const switchElapsedMs = Date.now() - started;
73
+ prepareWorktreeDependencies(repoRoot, repoRoot,
74
+ input.dependencyFallbackRoot ? { dependencyFallbackRoot: input.dependencyFallbackRoot } : {}, {});
75
+ const elapsedMs = Date.now() - started;
76
+ debug.log('self-implement', 'pod-inplace-worktree-selected', {
77
+ branch: input.branch, runId: input.runId, sourcePath: repoRoot,
78
+ resolvedBase, elapsedMs, switchElapsedMs, checkoutFiles: 0,
79
+ });
80
+ process.stderr.write(`ELANOUS_POD_INPLACE_SELECTED elapsedMs=${elapsedMs} switchMs=${switchElapsedMs} checkoutFiles=0\n`);
81
+ return { path: repoRoot, branch: input.branch, base: input.base ?? 'HEAD', resolvedBase, baseFreshness: 'head', inPlace: true };
82
+ }
@@ -3,8 +3,8 @@ export const WARM_POOL_PROFILES = ['fixed', 'gate', 'landing', 'feature'] as con
3
3
  export type WarmPoolProfile = (typeof WARM_POOL_PROFILES)[number];
4
4
  export type WarmPoolTier = 'lite' | 'standard';
5
5
  const STANDARD_HOST_MAX: Readonly<Record<string, number>> = {
6
- node-b: 16,
7
- node-c: 4,
6
+ 'node-b': 16,
7
+ 'node-c': 4,
8
8
  'elangram-wsl': 5,
9
9
  'host-e-wsl': 5,
10
10
  };
@@ -42,6 +42,11 @@ function latestFailingIds(input: FlexSignalsInput): readonly string[] | undefine
42
42
  return latest !== undefined && latest.length > 0 ? latest : undefined;
43
43
  }
44
44
 
45
+ /** P2 evidence may name a file only when the latest failure ID itself confirms that attribution. */
46
+ function latestPreexistingFailureId(input: FlexSignalsInput): string | undefined {
47
+ return latestFailingIds(input)?.find((id) => /\(preexisting\)\s*$/.test(id));
48
+ }
49
+
45
50
  /**
46
51
  * 게이트 실패 id — 생산자(orchestrator 의 roundSummaryEntries.failedIds)와 P3 파서가 «같은 꼴»을 쓰도록
47
52
  * 둘 다 이 함수 짝을 거친다. 꼴: `${name}@${file ?? '?'} (${attribution})`.
@@ -96,11 +101,8 @@ function judgeP2(input: PremiseReviewInput): PremiseFinding {
96
101
  }
97
102
  const preexistingIndex = attributions.indexOf('preexisting');
98
103
  if (preexistingIndex >= 0) {
99
- const latest = latestFailingIds(input);
100
- const evidence = latest !== undefined && preexistingIndex < latest.length
101
- ? latest[preexistingIndex]!
102
- : 'preexisting';
103
- return { premise: 'P2', verdict: 'wrong', evidence };
104
+ const latestPreexistingId = latestPreexistingFailureId(input);
105
+ return { premise: 'P2', verdict: 'wrong', evidence: latestPreexistingId ?? 'preexisting' };
104
106
  }
105
107
  if (attributions.includes('unknown')) {
106
108
  return { premise: 'P2', verdict: 'unknown', evidence: UNMEASURED };
@@ -452,6 +452,237 @@ export function loadRunGraphVariant(runId: string, dir = runLedgerDir()): RunGra
452
452
  return { variantId: record.variant_id, reason: record.reason };
453
453
  }
454
454
 
455
+ /**
456
+ * Axes compared between what a run asked for and what it actually ran with:
457
+ * the child LLM request (`childModel`/`childProvider`), `zaiCodingPlan.overage`,
458
+ * the Pod pool and the parent host.
459
+ */
460
+ export type RunRequestEffectiveAxis = 'childModel' | 'childProvider' | 'overagePolicy' | 'podPool' | 'parentHost';
461
+
462
+ /** Ledger event carrying one requested-vs-effective comparison row set. */
463
+ export const RUN_REQUEST_VS_EFFECTIVE_EVENT = 'run-request-vs-effective';
464
+
465
+ const RUN_REQUEST_EFFECTIVE_AXES: readonly RunRequestEffectiveAxis[] = [
466
+ 'childModel',
467
+ 'childProvider',
468
+ 'overagePolicy',
469
+ 'podPool',
470
+ 'parentHost',
471
+ ];
472
+
473
+ /** Values of the compared axes. Requested and effective sides share this shape so a row can name both. */
474
+ export interface RunRequestEffectiveValues {
475
+ childModel?: string;
476
+ childProvider?: string;
477
+ overagePolicy?: string;
478
+ podPool?: string;
479
+ parentHost?: string;
480
+ }
481
+
482
+ /** One axis whose requested value differs from the effective value observed while the run executed. */
483
+ export interface RunRequestEffectiveMismatch {
484
+ axis: RunRequestEffectiveAxis;
485
+ requested: string;
486
+ effective: string;
487
+ }
488
+
489
+ export interface RunRequestEffectiveComparison {
490
+ requested: RunRequestEffectiveValues;
491
+ effective: RunRequestEffectiveValues;
492
+ mismatches: RunRequestEffectiveMismatch[];
493
+ }
494
+
495
+ function isPlainRecord(value: unknown): value is Record<string, unknown> {
496
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
497
+ }
498
+
499
+ function readRunRequestEffectiveValues(value: unknown): RunRequestEffectiveValues {
500
+ if (!isPlainRecord(value)) return {};
501
+ const values: RunRequestEffectiveValues = {};
502
+ for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
503
+ const raw = value[axis];
504
+ if (typeof raw === 'string' && raw.trim()) values[axis] = raw.trim();
505
+ }
506
+ return values;
507
+ }
508
+
509
+ function nonEmptyString(value: unknown): string | undefined {
510
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
511
+ }
512
+
513
+ /** Compare both sides axis by axis; an axis observed on one side only is not a mismatch. */
514
+ export function compareRunRequestEffective(
515
+ requested: RunRequestEffectiveValues,
516
+ effective: RunRequestEffectiveValues,
517
+ ): RunRequestEffectiveMismatch[] {
518
+ const mismatches: RunRequestEffectiveMismatch[] = [];
519
+ for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
520
+ const requestedValue = requested[axis];
521
+ const effectiveValue = effective[axis];
522
+ if (requestedValue === undefined || effectiveValue === undefined || requestedValue === effectiveValue) continue;
523
+ mismatches.push({ axis, requested: requestedValue, effective: effectiveValue });
524
+ }
525
+ return mismatches;
526
+ }
527
+
528
+ /**
529
+ * Read the two sides out of one observer event. The canonical contract is an explicit
530
+ * `data.requested` / `data.effective` object. The real orchestrator records the
531
+ * requested child at run-origin and the selected execution provider at start.
532
+ */
533
+ function runRequestEffectiveSidesOf(entry: RunLedgerEntry): RunRequestEffectiveComparison {
534
+ const data = isPlainRecord(entry.data) ? entry.data : {};
535
+ const requested = readRunRequestEffectiveValues(data.requested);
536
+ const effective = readRunRequestEffectiveValues(data.effective);
537
+
538
+ if (entry.event === 'run-origin') {
539
+ requested.childProvider ??= nonEmptyString(data.childProvider);
540
+ requested.childModel ??= nonEmptyString(data.childModel);
541
+ }
542
+ if (entry.event === 'start') {
543
+ effective.childProvider ??= nonEmptyString(data.provider);
544
+ effective.childModel ??= nonEmptyString(data.model);
545
+ }
546
+
547
+ const childLlm = data.childLlm;
548
+ if (isPlainRecord(childLlm)) {
549
+ const provider = nonEmptyString(childLlm.provider);
550
+ if (provider !== undefined && requested.childProvider === undefined) requested.childProvider = provider;
551
+ const model = nonEmptyString(childLlm.model);
552
+ if (model !== undefined && requested.childModel === undefined) requested.childModel = model;
553
+ }
554
+ const zaiCodingPlan = data.zaiCodingPlan;
555
+ if (isPlainRecord(zaiCodingPlan)) {
556
+ const overage = nonEmptyString(zaiCodingPlan.overage);
557
+ if (overage !== undefined && requested.overagePolicy === undefined) requested.overagePolicy = overage;
558
+ }
559
+
560
+ for (const key of ['childStart', 'llmConsumeStart'] as const) {
561
+ const start = data[key];
562
+ if (!isPlainRecord(start)) continue;
563
+ const provider = nonEmptyString(start.provider);
564
+ if (provider !== undefined && effective.childProvider === undefined) effective.childProvider = provider;
565
+ const model = nonEmptyString(start.model);
566
+ if (model !== undefined && effective.childModel === undefined) effective.childModel = model;
567
+ }
568
+
569
+ return { requested, effective, mismatches: compareRunRequestEffective(requested, effective) };
570
+ }
571
+
572
+ /**
573
+ * Merge every non-comparison event of a run into one comparison. The request side keeps the
574
+ * first recorded value (run-origin) and the effective side keeps the last observed one
575
+ * (child start, first llm consume-start, actual Pod pool).
576
+ */
577
+ export function runRequestEffectiveFromLedger(ledger: readonly RunLedgerEntry[]): RunRequestEffectiveComparison {
578
+ const requested: RunRequestEffectiveValues = {};
579
+ const effective: RunRequestEffectiveValues = {};
580
+ for (const entry of ledger) {
581
+ if (entry.event === RUN_REQUEST_VS_EFFECTIVE_EVENT) continue;
582
+ const sides = runRequestEffectiveSidesOf(entry);
583
+ for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
584
+ const requestedValue = sides.requested[axis];
585
+ if (requestedValue !== undefined && requested[axis] === undefined) requested[axis] = requestedValue;
586
+ const effectiveValue = sides.effective[axis];
587
+ if (effectiveValue !== undefined && effective[axis] === undefined) effective[axis] = effectiveValue;
588
+ }
589
+ }
590
+ return { requested, effective, mismatches: compareRunRequestEffective(requested, effective) };
591
+ }
592
+
593
+ /** Mismatch rows this run already wrote, de-duplicated across repeated comparisons. */
594
+ export function recordedRunRequestEffectiveMismatches(
595
+ ledger: readonly RunLedgerEntry[],
596
+ ): RunRequestEffectiveMismatch[] {
597
+ const seen = new Set<string>();
598
+ const rows: RunRequestEffectiveMismatch[] = [];
599
+ for (const entry of ledger) {
600
+ if (entry.event !== RUN_REQUEST_VS_EFFECTIVE_EVENT) continue;
601
+ const recorded = isPlainRecord(entry.data) ? entry.data.mismatches : undefined;
602
+ if (!Array.isArray(recorded)) continue;
603
+ for (const row of recorded) {
604
+ if (!isPlainRecord(row)) continue;
605
+ const axis = row.axis;
606
+ if (typeof axis !== 'string' || !RUN_REQUEST_EFFECTIVE_AXES.includes(axis as RunRequestEffectiveAxis)) continue;
607
+ const requested = nonEmptyString(row.requested);
608
+ const effective = nonEmptyString(row.effective);
609
+ if (requested === undefined || effective === undefined) continue;
610
+ const key = `${axis}\u0000${requested}\u0000${effective}`;
611
+ if (seen.has(key)) continue;
612
+ seen.add(key);
613
+ rows.push({ axis: axis as RunRequestEffectiveAxis, requested, effective });
614
+ }
615
+ }
616
+ return rows;
617
+ }
618
+
619
+ export interface RunRequestVsEffectiveRecordOptions {
620
+ /** Ledger directory; default = `runLedgerDir()`. */
621
+ dir?: string;
622
+ }
623
+
624
+ /**
625
+ * Write one `run-request-vs-effective` row under the run's own ledger file, inheriting the
626
+ * run's goalId and shard identity so the run stays a single mission on the timeline.
627
+ */
628
+ export function recordRunRequestVsEffective(
629
+ runId: string,
630
+ requested: RunRequestEffectiveValues,
631
+ effective: RunRequestEffectiveValues,
632
+ options: RunRequestVsEffectiveRecordOptions = {},
633
+ ): RunRequestEffectiveComparison {
634
+ const dir = options.dir ?? runLedgerDir();
635
+ const ledger = loadRunLedger(runId, dir) ?? [];
636
+ const start = ledger.find((entry) => entry.event === 'start' && typeof entry.timestamp === 'string');
637
+ const goalOwner = ledger.find((entry) => nonEmptyString(entry.goalId) !== undefined);
638
+ const comparison: RunRequestEffectiveComparison = {
639
+ requested,
640
+ effective,
641
+ mismatches: compareRunRequestEffective(requested, effective),
642
+ };
643
+ appendRunLedgerEntry({
644
+ timestamp: new Date().toISOString(),
645
+ runId,
646
+ event: RUN_REQUEST_VS_EFFECTIVE_EVENT,
647
+ data: { requested: comparison.requested, effective: comparison.effective, mismatches: comparison.mismatches },
648
+ ...(goalOwner?.goalId === undefined ? {} : { goalId: goalOwner.goalId }),
649
+ ...(start?.orchestrationId === undefined ? {} : { orchestrationId: start.orchestrationId }),
650
+ ...(start?.shardId === undefined ? {} : { shardId: start.shardId }),
651
+ ...(start?.pieceIndex === undefined ? {} : { pieceIndex: start.pieceIndex }),
652
+ ...(start?.pieceTotal === undefined ? {} : { pieceTotal: start.pieceTotal }),
653
+ }, dir);
654
+ return comparison;
655
+ }
656
+
657
+ function sameRunRequestEffectiveMismatches(
658
+ left: readonly RunRequestEffectiveMismatch[],
659
+ right: readonly RunRequestEffectiveMismatch[],
660
+ ): boolean {
661
+ if (left.length !== right.length) return false;
662
+ const keys = new Set(right.map((row) => `${row.axis}\u0000${row.requested}\u0000${row.effective}`));
663
+ return left.every((row) => keys.has(`${row.axis}\u0000${row.requested}\u0000${row.effective}`));
664
+ }
665
+
666
+ /**
667
+ * Production hook: after any observer event lands, compare the run's requested and effective
668
+ * sides and write the mismatch rows when they differ. Idempotent — a run whose rows already
669
+ * match its current comparison writes nothing. Recording only; no alerting and no repair.
670
+ */
671
+ function recordRunRequestVsEffectiveFromLedger(runId: string, dir: string, appended: RunLedgerEntry): void {
672
+ // Keep unrelated observer writes O(1); only events carrying one side can
673
+ // change the comparison. In particular, a long run must not reread its
674
+ // complete ledger after every progress event.
675
+ if (!['run-origin', 'start', 'child-start', 'llm-consume-start'].includes(appended.event)
676
+ && !isPlainRecord(appended.data?.requested) && !isPlainRecord(appended.data?.effective)) return;
677
+ if (appended.event === RUN_REQUEST_VS_EFFECTIVE_EVENT) return;
678
+ const ledger = loadRunLedger(runId, dir);
679
+ if (!ledger?.length) return;
680
+ const comparison = runRequestEffectiveFromLedger(ledger);
681
+ if (comparison.mismatches.length === 0) return;
682
+ if (sameRunRequestEffectiveMismatches(recordedRunRequestEffectiveMismatches(ledger), comparison.mismatches)) return;
683
+ recordRunRequestVsEffective(runId, comparison.requested, comparison.effective, { dir });
684
+ }
685
+
455
686
  /** Append one observer event. Callers own fail-soft handling. */
456
687
  export function appendRunLedgerEntry(entry: RunLedgerEntry, dir = runLedgerDir()): void {
457
688
  if (refuseProductionLedgerWriteInTest(dir, 'run-ledger')) return;
@@ -465,6 +696,11 @@ export function appendRunLedgerEntry(entry: RunLedgerEntry, dir = runLedgerDir()
465
696
  const line = `${JSON.stringify(row)}\n`;
466
697
  if (!restoreArchivedRunLedger(dir, entry.runId, line)) appendFileSync(live, line, 'utf8');
467
698
  });
699
+ try {
700
+ recordRunRequestVsEffectiveFromLedger(entry.runId, dir, entry);
701
+ } catch {
702
+ // The comparison is observation: it must never fail a producer write that already landed.
703
+ }
468
704
  }
469
705
 
470
706
  /** Caller decision inside `appendRunLedgerEntryChecked`: either `append` exactly one entry, or skip with `result`. */
@@ -836,6 +1072,13 @@ export interface RunLedgerTimelineEntry {
836
1072
  pieceTotal?: number;
837
1073
  /** Producer-recorded `graph.unit` visits of this run, with terminal unmatched enters reported as orphans. */
838
1074
  unitVisits?: GraphUnitVisitClassification;
1075
+ /** Requested vs effective values this run recorded; present only when the two sides differ. */
1076
+ requestVsEffective?: {
1077
+ requested: RunRequestEffectiveValues;
1078
+ effective: RunRequestEffectiveValues;
1079
+ };
1080
+ /** Mismatch rows (axis · requested · effective) for this run; absent when requested equals effective. */
1081
+ mismatches?: RunRequestEffectiveMismatch[];
839
1082
  }
840
1083
 
841
1084
  export interface RunLedgerTimelineQueryOptions {
@@ -844,6 +1087,20 @@ export interface RunLedgerTimelineQueryOptions {
844
1087
  list?: (path: string) => string[];
845
1088
  }
846
1089
 
1090
+ /**
1091
+ * Timeline projection of the requested-vs-effective rows. Recorded rows win over a derived
1092
+ * comparison so the timeline shows what the run actually wrote; equal sides project nothing.
1093
+ */
1094
+ function runRequestEffectiveTimelineFields(
1095
+ ledger: readonly RunLedgerEntry[],
1096
+ ): Pick<RunLedgerTimelineEntry, 'mismatches' | 'requestVsEffective'> {
1097
+ const recorded = recordedRunRequestEffectiveMismatches(ledger);
1098
+ const derived = runRequestEffectiveFromLedger(ledger);
1099
+ const mismatches = recorded.length > 0 ? recorded : derived.mismatches;
1100
+ if (mismatches.length === 0) return {};
1101
+ return { mismatches, requestVsEffective: { requested: derived.requested, effective: derived.effective } };
1102
+ }
1103
+
847
1104
  /**
848
1105
  * Read runs whose sole recorded goalId equals the historian missionId.
849
1106
  * goalId is chosen because the producer already persists it on each observer event, while orchestrationId only groups shards.
@@ -878,6 +1135,7 @@ export function queryRunLedgerTimeline(missionId: string, options: RunLedgerTime
878
1135
  ...(execution.pieceIndex === undefined ? {} : { pieceIndex: execution.pieceIndex }),
879
1136
  ...(execution.pieceTotal === undefined ? {} : { pieceTotal: execution.pieceTotal }),
880
1137
  unitVisits: classifyGraphUnitVisits(ledger),
1138
+ ...runRequestEffectiveTimelineFields(ledger),
881
1139
  });
882
1140
  } catch {
883
1141
  // A corrupt or concurrently replaced ledger must not leak a partial run into another mission timeline.