elanous 0.2.27 → 0.2.29

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 (700) 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/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 058a98ba.7eb28d5e6dc03565.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{4565-67e4c620597965c8.js → 1015-9cba22a5a4554797.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +8 -0
  9. package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 1142.65d002789ab3af7d.js} +2 -2
  10. package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +34 -0
  12. package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1516.dfaceff3fd2d0e0d.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +286 -0
  16. package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +24 -0
  17. package/apps/pwa/out/_next/static/chunks/1782-59db1b5aa06df38a.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 1852.7f7b53991fcb99ef.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +36 -0
  22. package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +64 -0
  24. package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 285adb1a.5654e605dddf86d2.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +115 -0
  31. package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3160-95c96f4d2a21dd26.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +90 -0
  36. package/apps/pwa/out/_next/static/chunks/328bb3ab-6628a1114fe3fb3b.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 3396-97b97928c49190c9.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 3403.7199205e65124486.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/419.736c0d6f426249a7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → 425cfc4d.fb91158e3971c39f.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 46bd8bea.2f4b4099172fcdb7.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 4759.1f76713aefb87db5.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +94 -0
  54. package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +62 -0
  60. package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +27 -0
  63. package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +104 -0
  64. package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 5591.a35e7a217734a8b9.js} +2 -2
  65. package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +93 -0
  66. package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 6013-2f769370d8b4c2c6.js} +3 -3
  69. package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +24 -0
  70. package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +2 -0
  72. package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 6534.1ab00f370db7b105.js} +1 -1
  73. package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +148 -0
  74. package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +149 -0
  75. package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +79 -0
  77. package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 6767.1fcfc9b8be83975f.js} +16 -16
  79. package/apps/pwa/out/_next/static/chunks/6776.06ff1e3b464cc607.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 6853.cc5174a9dee59593.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +287 -0
  86. package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 7375.050ea0d72968e49f.js} +16 -16
  92. package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +77 -0
  94. package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +74 -0
  97. package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7725-4f83d5541fbdb81b.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8332.6f0f49df772e163b.js +23 -0
  102. package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 8398.73a19b39715eda04.js} +1 -1
  103. package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 8471.8d2a8c74f09c36ff.js} +3 -3
  104. package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +226 -0
  106. package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 8767-2f6a634f5abeaa01.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +32 -0
  109. package/apps/pwa/out/_next/static/chunks/8795.32573a185af18c7b.js +41 -0
  110. package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 9143.ff14585db1d275ff.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9907.49be0fcadaf214b5.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{973cbf1b.3bbcf2b41548eca7.js → a435ad95.577add051b4facb2.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-a5635eba0d73b84e.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/{page-ff27902d0b11ef4f.js → page-8aaa6dedc4c10dfb.js} +1 -1
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-25a302273b054fd7.js → page-33bf667a5fb297bf.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-29900ed0011b2c83.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/{page-87b88f551f421d8b.js → page-9eb56166774eb256.js} +1 -1
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → bc324b7c.02a09dd93f6a399b.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +122 -0
  177. package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +1 -0
  183. package/apps/pwa/out/approvals/index.html +1 -1
  184. package/apps/pwa/out/approvals/index.txt +22 -22
  185. package/apps/pwa/out/autopilot/index.html +1 -1
  186. package/apps/pwa/out/autopilot/index.txt +22 -22
  187. package/apps/pwa/out/board/index.html +1 -1
  188. package/apps/pwa/out/board/index.txt +22 -22
  189. package/apps/pwa/out/botlab/index.html +1 -1
  190. package/apps/pwa/out/botlab/index.txt +21 -21
  191. package/apps/pwa/out/bots/index.html +1 -1
  192. package/apps/pwa/out/bots/index.txt +21 -21
  193. package/apps/pwa/out/ceo/index.html +1 -1
  194. package/apps/pwa/out/ceo/index.txt +22 -22
  195. package/apps/pwa/out/chat/index.html +1 -1
  196. package/apps/pwa/out/chat/index.txt +21 -21
  197. package/apps/pwa/out/consult/index.html +1 -1
  198. package/apps/pwa/out/consult/index.txt +22 -22
  199. package/apps/pwa/out/control/index.html +1 -1
  200. package/apps/pwa/out/control/index.txt +22 -22
  201. package/apps/pwa/out/decisions/index.html +1 -1
  202. package/apps/pwa/out/decisions/index.txt +21 -21
  203. package/apps/pwa/out/design-check/index.html +1 -1
  204. package/apps/pwa/out/design-check/index.txt +22 -22
  205. package/apps/pwa/out/editor/index.html +1 -1
  206. package/apps/pwa/out/editor/index.txt +22 -22
  207. package/apps/pwa/out/exec/index.html +1 -1
  208. package/apps/pwa/out/exec/index.txt +22 -22
  209. package/apps/pwa/out/field/index.html +1 -1
  210. package/apps/pwa/out/field/index.txt +22 -22
  211. package/apps/pwa/out/healthz +1 -1
  212. package/apps/pwa/out/index.html +1 -1
  213. package/apps/pwa/out/index.txt +21 -21
  214. package/apps/pwa/out/inside/index.html +1 -1
  215. package/apps/pwa/out/inside/index.txt +21 -21
  216. package/apps/pwa/out/intake/index.html +1 -1
  217. package/apps/pwa/out/intake/index.txt +22 -22
  218. package/apps/pwa/out/live/index.html +1 -1
  219. package/apps/pwa/out/live/index.txt +22 -22
  220. package/apps/pwa/out/live-run/index.html +1 -1
  221. package/apps/pwa/out/live-run/index.txt +22 -22
  222. package/apps/pwa/out/loops/index.html +1 -1
  223. package/apps/pwa/out/loops/index.txt +21 -21
  224. package/apps/pwa/out/market/index.html +1 -1
  225. package/apps/pwa/out/market/index.txt +21 -21
  226. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  227. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  228. package/apps/pwa/out/morning/index.html +1 -1
  229. package/apps/pwa/out/morning/index.txt +22 -22
  230. package/apps/pwa/out/observatory/index.html +1 -1
  231. package/apps/pwa/out/observatory/index.txt +22 -22
  232. package/apps/pwa/out/ops/checklist/index.html +1 -1
  233. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  234. package/apps/pwa/out/ops/release/index.html +1 -1
  235. package/apps/pwa/out/ops/release/index.txt +21 -21
  236. package/apps/pwa/out/ops/seats/index.html +1 -1
  237. package/apps/pwa/out/ops/seats/index.txt +21 -21
  238. package/apps/pwa/out/outputs/index.html +1 -1
  239. package/apps/pwa/out/outputs/index.txt +21 -21
  240. package/apps/pwa/out/reflection/index.html +1 -1
  241. package/apps/pwa/out/reflection/index.txt +22 -22
  242. package/apps/pwa/out/scheduler/index.html +1 -1
  243. package/apps/pwa/out/scheduler/index.txt +22 -22
  244. package/apps/pwa/out/sessions/index.html +1 -1
  245. package/apps/pwa/out/sessions/index.txt +21 -21
  246. package/apps/pwa/out/settings/devices/index.html +1 -1
  247. package/apps/pwa/out/settings/devices/index.txt +22 -22
  248. package/apps/pwa/out/settings/index.html +1 -1
  249. package/apps/pwa/out/settings/index.txt +22 -22
  250. package/apps/pwa/out/setup/done/index.html +1 -1
  251. package/apps/pwa/out/setup/done/index.txt +22 -22
  252. package/apps/pwa/out/setup/index.html +1 -1
  253. package/apps/pwa/out/setup/index.txt +22 -22
  254. package/apps/pwa/out/share/index.html +1 -1
  255. package/apps/pwa/out/share/index.txt +22 -22
  256. package/apps/pwa/out/showroom/index.html +1 -1
  257. package/apps/pwa/out/showroom/index.txt +21 -21
  258. package/apps/pwa/out/tasks/index.html +1 -1
  259. package/apps/pwa/out/tasks/index.txt +22 -22
  260. package/apps/pwa/out/term/index.html +1 -1
  261. package/apps/pwa/out/term/index.txt +22 -22
  262. package/apps/pwa/out/today/index.html +1 -1
  263. package/apps/pwa/out/today/index.txt +22 -22
  264. package/apps/pwa/out/trace/index.html +1 -1
  265. package/apps/pwa/out/trace/index.txt +22 -22
  266. package/apps/pwa/out/vault/index.html +1 -1
  267. package/apps/pwa/out/vault/index.txt +22 -22
  268. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  269. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  270. package/apps/pwa/out/workflows/index.html +1 -1
  271. package/apps/pwa/out/workflows/index.txt +22 -22
  272. package/apps/pwa/out/workspace/index.html +1 -1
  273. package/apps/pwa/out/workspace/index.txt +22 -22
  274. package/apps/pwa/out/worktrees/index.html +1 -1
  275. package/apps/pwa/out/worktrees/index.txt +22 -22
  276. package/graphs/implement-loop.yaml +38 -1
  277. package/graphs/release/release-loop.yaml +6 -2
  278. package/graphs/steward/recipes.yaml +6 -0
  279. package/graphs/steward/release-day.yaml +23 -0
  280. package/graphs/steward/steward.yaml +9 -1
  281. package/graphs/work/code-pr.yaml +23 -0
  282. package/package.json +1 -1
  283. package/plugins/agent-team/agents/research.md +1 -0
  284. package/scripts/browser-observe-cycle.ts +76 -2
  285. package/scripts/ci-typecheck-changed.ts +53 -19
  286. package/scripts/coord-channel-watch.sh +26 -6
  287. package/scripts/coord-role-pack.ts +143 -0
  288. package/scripts/detect-test-interference.ts +31 -1
  289. package/scripts/lib/morning-report-options.ts +41 -0
  290. package/scripts/pr-land-extra-remote-gates.ts +49 -0
  291. package/scripts/release-loop/docs-node.ts +51 -22
  292. package/scripts/release-loop/gate-batch-safe.ts +23 -0
  293. package/scripts/release-loop/gate-history.ts +422 -0
  294. package/scripts/release-loop/gate-node.ts +336 -39
  295. package/scripts/release-loop/gate-triage-node.ts +190 -0
  296. package/scripts/release-loop/node-verdict.ts +3 -1
  297. package/scripts/release-loop/publish-node.ts +3 -0
  298. package/scripts/release-loop/spawn-lane.ts +68 -0
  299. package/scripts/release-loop/tui-node-checks.ts +28 -2
  300. package/scripts/release-loop/version-node.ts +62 -4
  301. package/scripts/skills/public-check.ts +5 -2
  302. package/scripts/test-deterministic.ts +549 -37
  303. package/scripts/usage-rollup.ts +11 -3
  304. package/scripts/ux-sim.ts +7 -1
  305. package/scripts/verify-kpack6-live.ts +230 -0
  306. package/src/acp/codex-plugins.ts +17 -0
  307. package/src/acp/core-turn-bridge.ts +98 -22
  308. package/src/acp/elanous-extensions.ts +2 -0
  309. package/src/acp/server.ts +2 -0
  310. package/src/agent/ref-grounding.ts +18 -0
  311. package/src/agent/task-notification.ts +2 -1
  312. package/src/agent-mission/in-agent-plugin.ts +8 -3
  313. package/src/agent-substrate/pr-reviewer.ts +29 -21
  314. package/src/agent-substrate/self-review-cli.ts +34 -10
  315. package/src/briefing/brief-items.ts +151 -35
  316. package/src/budget/llm-cost.ts +25 -2
  317. package/src/budget/pty-usage-reemit.ts +7 -0
  318. package/src/budget/run-usage-rollup.ts +9 -0
  319. package/src/budget/usage-daily-store.ts +98 -0
  320. package/src/budget/usage-outcomes.ts +32 -0
  321. package/src/capture/tui-self-report.ts +22 -4
  322. package/src/chat/index.ts +31 -10
  323. package/src/chat/pickers/modal-runtime.ts +1 -0
  324. package/src/chat/pickers/modals.ts +3 -1
  325. package/src/chat/turn-typeahead.ts +123 -16
  326. package/src/claims/claims-ledger.ts +23 -0
  327. package/src/claims/claims-render.ts +22 -2
  328. package/src/cli/brief-cli.ts +131 -10
  329. package/src/cli/claims-cli.ts +24 -4
  330. package/src/cli/dashboard-name-flag.ts +48 -0
  331. package/src/cli/doctor-cli.ts +80 -0
  332. package/src/cli/log-event-names.ts +12 -0
  333. package/src/cli/msg-cli.ts +210 -11
  334. package/src/cli/plugin-cli.ts +11 -3
  335. package/src/cli/pr-cli.ts +443 -104
  336. package/src/cli/pr-land-heavy-remote.ts +233 -0
  337. package/src/cli/pr-land-overlap-evidence.ts +104 -5
  338. package/src/cli/pr-land-refusal.ts +20 -0
  339. package/src/cli/pty-takeover-cli.ts +125 -16
  340. package/src/cli/release-cli.ts +46 -2
  341. package/src/cli/remote-resolve.ts +2 -1
  342. package/src/cli/rfc-cli.ts +24 -0
  343. package/src/cli/seat-cli.ts +26 -16
  344. package/src/cli/tailscale-serve.ts +5 -8
  345. package/src/cli/tasks-cli.ts +400 -27
  346. package/src/cli/usage-cli.ts +155 -16
  347. package/src/cli/usage-daily-cli.ts +84 -0
  348. package/src/context-bus/context-now.ts +82 -5
  349. package/src/core-turn/auth-rejected-notice.ts +41 -0
  350. package/src/core-turn/run-core-turn.ts +13 -2
  351. package/src/core-turn/run-goal-loop.ts +17 -1
  352. package/src/core-turn/short-question.ts +45 -12
  353. package/src/core-turn/types.ts +7 -0
  354. package/src/dashboard/acp-active-model.ts +40 -0
  355. package/src/dashboard/auto-compact-runtime.ts +2 -0
  356. package/src/dashboard/boot-banner.ts +80 -0
  357. package/src/dashboard/dashboard-status-lines.ts +11 -0
  358. package/src/dashboard/detail-viewer-runtime.ts +15 -2
  359. package/src/dashboard/event-loop-stall-monitor.ts +4 -0
  360. package/src/dashboard/first-screen-band.ts +63 -13
  361. package/src/dashboard/goal-loop-thinking.ts +16 -0
  362. package/src/dashboard/hitl-boot.ts +9 -4
  363. package/src/dashboard/index.ts +235 -389
  364. package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
  365. package/src/dashboard/input/chat-main-log-actions.ts +4 -0
  366. package/src/dashboard/input/chat-main-log-command.ts +12 -1
  367. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +172 -3
  368. package/src/dashboard/input/chat-main-session.ts +6 -2
  369. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  370. package/src/dashboard/input/chat-main-turn.ts +2 -1
  371. package/src/dashboard/input/compact-prepass-recovery.ts +97 -0
  372. package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
  373. package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
  374. package/src/dashboard/input/external-input-host.ts +45 -0
  375. package/src/dashboard/input/log-fold-binding.ts +18 -0
  376. package/src/dashboard/input/mouse-wiring.ts +17 -4
  377. package/src/dashboard/input/turn-steer-bridge.ts +94 -0
  378. package/src/dashboard/log-click-runtime.ts +5 -3
  379. package/src/dashboard/running-build-status.ts +74 -0
  380. package/src/dashboard/seat-boot-preamble.ts +113 -0
  381. package/src/dashboard/seat-local-instructions.ts +305 -0
  382. package/src/dashboard/skill-detection-runtime.ts +24 -4
  383. package/src/dashboard/slash-runtime/dashboard-handlers.ts +100 -28
  384. package/src/dashboard/slash-runtime/model-choices.ts +35 -0
  385. package/src/dashboard/term-slash-runtime.ts +15 -0
  386. package/src/dashboard/turn-preamble.ts +30 -2
  387. package/src/dashboard/turn-session-layers.ts +176 -0
  388. package/src/dashboard/turn-stream-formatter.ts +14 -6
  389. package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
  390. package/src/domains/morning-report.ts +3 -1
  391. package/src/domains/release-tool.ts +8 -9
  392. package/src/domains/surface-events.ts +4 -1
  393. package/src/domains/watch-default-scheduler.ts +8 -9
  394. package/src/fold-stack.ts +24 -1
  395. package/src/git-fs/dirty.ts +32 -4
  396. package/src/git-fs/index.ts +43 -1
  397. package/src/github/pr-labels.ts +10 -4
  398. package/src/graph-runner/runner.ts +102 -14
  399. package/src/harness/harness-clean.ts +21 -3
  400. package/src/harness/harness-cli-command.ts +22 -6
  401. package/src/harness/harness-gc.ts +32 -5
  402. package/src/harness/harness-pod-dispatch.ts +11 -4
  403. package/src/hq/seats.ts +17 -3
  404. package/src/index.ts +48 -6
  405. package/src/input/external-input-queue.ts +219 -0
  406. package/src/intelligence-map/model-bench-scores.ts +102 -0
  407. package/src/interactive-terminal-modal.ts +13 -0
  408. package/src/llm/route-decision.ts +25 -0
  409. package/src/llm-stream-retry-display.ts +59 -0
  410. package/src/llm.ts +253 -55
  411. package/src/log-entry.ts +3 -3
  412. package/src/log-pane/search.ts +29 -4
  413. package/src/loops/agent-reply.ts +256 -0
  414. package/src/loops/budget.ts +37 -7
  415. package/src/loops/loop-cli.ts +3 -2
  416. package/src/loops/msg-address.ts +57 -0
  417. package/src/loops/msg-wake.ts +282 -0
  418. package/src/loops/orchestrator/inbox.ts +130 -0
  419. package/src/loops/orchestrator/resync-shadow.ts +100 -12
  420. package/src/loops/orchestrator/tick.ts +94 -3
  421. package/src/loops/registry.ts +42 -4
  422. package/src/maturity/feature-maturity.ts +1 -1
  423. package/src/memory.ts +20 -5
  424. package/src/msg/msg-sse-server.ts +141 -0
  425. package/src/msg/msg-store.ts +84 -14
  426. package/src/native-tool-catalog.ts +125 -0
  427. package/src/nexus/api/http-server.ts +5 -0
  428. package/src/nexus/api/ops-api.ts +2 -0
  429. package/src/nexus/api/project-autopsy.ts +127 -0
  430. package/src/nexus/api/terminals.ts +3 -0
  431. package/src/nexus/api/workflow-approvals.ts +2 -0
  432. package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
  433. package/src/oauth/codex-account-store.ts +15 -3
  434. package/src/oauth/codex-billing-route.ts +31 -0
  435. package/src/ops/overview-collect.ts +19 -2
  436. package/src/panes/log-pane.ts +67 -8
  437. package/src/patents/ledger.ts +128 -0
  438. package/src/persona/presets.ts +44 -0
  439. package/src/plugins/install/market-fetch.ts +32 -1
  440. package/src/plugins/maker/wizard-generate.ts +6 -4
  441. package/src/pod-lease/admission.ts +116 -41
  442. package/src/preview/terminal.ts +14 -1
  443. package/src/prompt-cache/types.ts +2 -0
  444. package/src/prompt-enhance/enhance.ts +24 -8
  445. package/src/prompt-library/universal-preamble.ts +273 -56
  446. package/src/pty-shell/pty-control-ipc.ts +4 -1
  447. package/src/pty-shell/pty-manifest.ts +77 -5
  448. package/src/pty-shell/registry.ts +19 -2
  449. package/src/pty-shell/tui-run-state.ts +253 -0
  450. package/src/release-loop/checklist.ts +11 -0
  451. package/src/release-loop/light-rc.ts +28 -3
  452. package/src/release-loop/merged-pr-checklist.ts +24 -5
  453. package/src/release-loop/rehearsal.ts +1 -1
  454. package/src/release-loop/rubric.ts +70 -0
  455. package/src/render.ts +5 -1
  456. package/src/rfc-registry/registry.ts +88 -0
  457. package/src/seat-dispatch/seat-request-ledger.ts +4 -0
  458. package/src/seat-loop/knowhow-lint.ts +233 -0
  459. package/src/seat-loop/seat-pack.ts +16 -4
  460. package/src/seat-loop/seat-report.ts +42 -2
  461. package/src/seat-loop/traffic-signal.ts +7 -0
  462. package/src/self-dev/ask-launch-flow.ts +48 -8
  463. package/src/self-dev/ask-path-candidates.ts +69 -14
  464. package/src/self-dev/decompose-proposal.ts +43 -1
  465. package/src/self-dev/graph-journey-nodes.ts +2 -0
  466. package/src/self-dev/launch-preflight-text.ts +5 -1
  467. package/src/self-dev/launch-preflight.ts +143 -10
  468. package/src/self-dev/run-supervisor.ts +71 -5
  469. package/src/self-dev/shard-aggregate.ts +2 -0
  470. package/src/self-dev/shard-run.ts +23 -2
  471. package/src/self-health/signatures.ts +132 -0
  472. package/src/self-implement/doctor-visit.ts +118 -0
  473. package/src/self-implement/gate-cli.ts +17 -4
  474. package/src/self-implement/goal-author-decompose.ts +80 -16
  475. package/src/self-implement/goal-author.ts +116 -73
  476. package/src/self-implement/goal-authoring-grounding.ts +1 -1
  477. package/src/self-implement/goal-file-name.ts +65 -0
  478. package/src/self-implement/goal-new-paths.ts +4 -5
  479. package/src/self-implement/graph-authority.ts +17 -3
  480. package/src/self-implement/graph-yaml.ts +15 -7
  481. package/src/self-implement/ground-goal.ts +2 -1
  482. package/src/self-implement/headless-elanous-driver.ts +16 -1
  483. package/src/self-implement/host-regate.ts +58 -9
  484. package/src/self-implement/orchestrator.ts +3 -10
  485. package/src/self-implement/review-mustfix-class.ts +115 -0
  486. package/src/self-implement/rework-policy.ts +80 -2
  487. package/src/self-implement/run-ledger.ts +111 -7
  488. package/src/self-implement/running-runs.ts +10 -6
  489. package/src/self-implement/self-implement-runtime.ts +32 -0
  490. package/src/self-implement/speed-claims.ts +145 -6
  491. package/src/session/pending-input.ts +62 -11
  492. package/src/session-runtime/index.ts +7 -1
  493. package/src/skills/tools/ops-ledger.ts +707 -0
  494. package/src/skills/tools/persistent-grounding.ts +103 -8
  495. package/src/skills/tools/shell.ts +196 -2
  496. package/src/status/bar.ts +32 -2
  497. package/src/status/status-provider-info.ts +58 -0
  498. package/src/steward/rejudge-tick.ts +12 -1
  499. package/src/steward/release-day.ts +158 -0
  500. package/src/steward/resync-tick.ts +123 -0
  501. package/src/task-agent/actions.ts +1 -0
  502. package/src/task-agent/adopt-pr.ts +140 -0
  503. package/src/task-agent/board.ts +11 -1
  504. package/src/task-agent/card-evidence.ts +37 -5
  505. package/src/task-agent/cover.ts +84 -17
  506. package/src/task-agent/failure-notify.ts +61 -0
  507. package/src/task-agent/green-sweep.ts +170 -0
  508. package/src/task-agent/land-worktree.ts +52 -5
  509. package/src/task-agent/live-move-history.ts +1 -0
  510. package/src/task-agent/live-moves.ts +43 -12
  511. package/src/task-agent/parent-host.ts +1 -1
  512. package/src/task-agent/postland-card.ts +139 -0
  513. package/src/task-agent/rejudge-on-head.ts +109 -7
  514. package/src/task-agent/remote-rejudge-bind.ts +91 -0
  515. package/src/task-agent/repair-branch-cas.ts +182 -0
  516. package/src/task-agent/repair-cycle.ts +288 -0
  517. package/src/task-agent/repair-next-move.ts +31 -0
  518. package/src/task-agent/repair-review.ts +24 -0
  519. package/src/task-agent/repair-worker.ts +87 -0
  520. package/src/task-agent/review-result-capture.ts +2 -1
  521. package/src/task-agent/shadow.ts +13 -7
  522. package/src/task-agent/task-hand.ts +115 -6
  523. package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
  524. package/src/task-orchestrator/surfaces/pod-command-job.ts +63 -7
  525. package/src/task-orchestrator/surfaces/pod-install-slots.ts +6 -11
  526. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +76 -0
  527. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +96 -0
  528. package/src/task-orchestrator/surfaces/self-implement-pod.ts +175 -43
  529. package/src/telegram.ts +30 -1
  530. package/src/terminal/session-registry.ts +6 -0
  531. package/src/thinking-line.ts +12 -3
  532. package/src/tool-runtime/index.ts +4 -0
  533. package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
  534. package/src/tool-runtime/ref-consult-runtime.ts +17 -2
  535. package/src/tool-runtime/run-shell-runtime.ts +4 -1
  536. package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
  537. package/src/tui.ts +5 -0
  538. package/src/user-config.ts +62 -7
  539. package/src/ux-sim/fake-llm.ts +29 -0
  540. package/src/ux-sim/fault-sqlite-busy.ts +50 -0
  541. package/src/ux-sim/in-process-cli.ts +175 -0
  542. package/src/version/packed-revision.json +1 -1
  543. package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
  548. package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +0 -148
  550. package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/1454-a9c338f5bb556f42.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
  557. package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +0 -24
  562. package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
  565. package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +0 -34
  567. package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
  572. package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
  577. package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
  582. package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
  584. package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
  586. package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
  596. package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
  600. package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
  602. package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
  604. package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
  612. package/apps/pwa/out/_next/static/chunks/7752.5cbdd0b433c54af9.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
  621. package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
  623. package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
  624. package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
  627. package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
  629. package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
  630. package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
  631. package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +0 -90
  635. package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +0 -79
  639. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/approvals/page-a1ce306364f08da9.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-07110da72c45e68f.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/board/page-d2d76d4a7eae91bd.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/botlab/page-30007380f2e2a3c1.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/bots/page-e5a9302c105725a3.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/ceo/page-b93c04b5311c97ec.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/chat/page-718a49e86bf25f9c.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/consult/page-20662900d6b4b455.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/control/page-f707a509515ac50c.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/decisions/page-6a16a48d1aa6e91f.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/design-check/page-fcb06e305f515527.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/editor/page-6acf5ec4e6c6d1af.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/exec/page-39f82acf619cca23.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/field/page-7c2c8f81b185f9c0.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/inside/page-ae7aff07e32676bb.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/intake/page-482c60c1bc540d0a.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/layout-7cb996c1aa08b6f5.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/live/page-623e08fe4477d606.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/live-run/page-db460cd8aecb8490.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/market/page-8397a5c6ca569bf4.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1917ea87ea71ab6b.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/not-found-670510eda8b9443f.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d73c3f1e00d93986.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-65caacf54389081e.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4bb7556e2e97a750.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-77e04b4f8762c666.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/outputs/page-15c0a4095baddfba.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/page-4eb96fc7241c2456.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/reflection/page-63e272a4cd3b6634.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d64ff212dc55d03.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/sessions/page-7f096248993fc2d4.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-e47fc72049149a38.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/settings/page-f7d808e31e005895.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-5c2b24b5496dad73.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/setup/page-76cdb531668b5191.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/share/page-e2b63345bba1a11f.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/showroom/page-d376e0c83edc041a.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/tasks/page-d6db55fe2c04d128.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/today/page-dab163b338e3b966.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/trace/page-08019efef111ed2e.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/vault/page-0260ffc7eda50db1.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-980ce6fe36ad95eb.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/workflows/page-99c4e6c7345a9156.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/workspace/page-0ab42e0f05823013.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ad9220422d20ba33.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/e117f801.e92bf10242653497.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +0 -122
  690. package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
  696. package/src/dashboard/bench-slash-runtime.ts +0 -40
  697. package/src/dashboard/input/search-modal-router.ts +0 -9
  698. package/src/dashboard/modals/pane-key-router.ts +0 -27
  699. package/src/dashboard/view-slash-runtime.ts +0 -48
  700. /package/apps/pwa/out/_next/static/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
@@ -0,0 +1,23 @@
1
+ graph_id: steward-release-day
2
+ loop:
3
+ title: 발행 날 그림자 판정
4
+ trigger:
5
+ cron: '*/5 * * * *'
6
+ version: 1
7
+ entry_node: release-day
8
+ terminal_nodes: [done, failed]
9
+ nodes:
10
+ - node_id: release-day
11
+ kind: agent
12
+ recipe: cmd:steward-release-day
13
+ max_visits: 1
14
+ - node_id: done
15
+ kind: gate
16
+ max_visits: 1
17
+ - node_id: failed
18
+ kind: gate
19
+ max_visits: 1
20
+ edges:
21
+ - from: release-day
22
+ on: outcome
23
+ map: { ok: done, fail: failed }
@@ -5,9 +5,14 @@ loop:
5
5
  cron: '*/15 8-23 * * *'
6
6
  events: [directive, linear-webhook]
7
7
  version: 1
8
- entry_node: rejudge
8
+ entry_node: resync
9
9
  terminal_nodes: [done, failed]
10
10
  nodes:
11
+ # SMART-MERGE-LIVE-TICK — update eligible PR heads before TA inspects them on this tick.
12
+ - node_id: resync
13
+ kind: agent
14
+ recipe: cmd:steward-resync
15
+ max_visits: 1
11
16
  # TA-REJUDGE-PERIODIC — `tasks rejudge --all` on a cadence (off unless taskAgent.rejudgeEveryMinutes > 0).
12
17
  # First so a Linear outage in sync cannot starve it; either outcome continues to sync.
13
18
  - node_id: rejudge
@@ -37,6 +42,9 @@ nodes:
37
42
  kind: gate
38
43
  max_visits: 1
39
44
  edges:
45
+ - from: resync
46
+ on: outcome
47
+ map: { ok: rejudge, fail: rejudge }
40
48
  - from: rejudge
41
49
  on: outcome
42
50
  map: { ok: sync, fail: sync }
@@ -0,0 +1,23 @@
1
+ # 1판: tasks hand 가 이 조합을 고르되 러너로 실행하지 않는다.
2
+ # make-code 단위가 준비되고 실물 code-pr 완주·재개 시험이 끝날 때까지 harness say 가 실행 주인이다.
3
+ graph_id: work-code-pr
4
+ version: 1
5
+ launcher: harness-say
6
+ entry_node: make-code
7
+ terminal_nodes: [done, needs-human, failed]
8
+ nodes:
9
+ - node_id: make-code
10
+ kind: subgraph
11
+ recipe: none
12
+ max_visits: 1
13
+ call: make-code@1
14
+ covers: [research, decide, make, verify, execute]
15
+ budget: { inner_steps: 20 }
16
+ contract: { inputs: [ask, context, prior], tools: harness-say, outputs: [result, evidence] }
17
+ - { node_id: done, kind: gate, recipe: none, max_visits: 1 }
18
+ - { node_id: needs-human, kind: gate, recipe: none, max_visits: 1 }
19
+ - { node_id: failed, kind: gate, recipe: none, max_visits: 1 }
20
+ edges:
21
+ - from: make-code
22
+ on: outcome
23
+ map: { done: done, rework: needs-human, needs-human: needs-human, failed: needs-human }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "elanous",
3
3
  "mcpName": "io.github.ElanvitalAI/elanous",
4
- "version": "0.2.27",
4
+ "version": "0.2.29",
5
5
  "description": "Self-healing coding harness where eyes, hands, and memory all turn on one sentence — it authors its own goals, implements them in isolated worktrees, and reviews its own work.",
6
6
  "license": "Apache-2.0",
7
7
  "author": "Elanvital AI",
@@ -33,6 +33,7 @@ You do **not**:
33
33
  ## Source priority
34
34
 
35
35
  1. **Local ref repos** (`~/source/ref/<project>/`) — fastest, token-cheap. Always check first.
36
+ - Exception: never open non-public copies of Claude Code under the ref root. For Claude Code, use only the public documentation (code.claude.com).
36
37
  2. **`~/.claude/skills/omni-crawl`** — web search (firecrawl + grok web/x/reddit + apify).
37
38
  3. **`~/.claude/skills/omni-digest`** — URL / PDF / X / YouTube / GitHub deep-dive.
38
39
  4. **`WebFetch` / `WebSearch`** — last resort for one-off lookups.
@@ -4,7 +4,15 @@
4
4
  // 기본 MCP 전송은 기존 McpClient 의 initialize + Mcp-Session-Id 수명주기를 탄다.
5
5
  // 스케줄러 진입점 배선은 다음 조각의 몫이다. 이 파일은 호출 가능한 함수만 내보낸다.
6
6
 
7
- import { McpClient, McpServerError, type McpHttpFetch } from '../src/mcp/client.js';
7
+ import { existsSync, readFileSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import {
10
+ McpClient,
11
+ McpConnectionError,
12
+ McpServerError,
13
+ type McpHttpFetch,
14
+ } from '../src/mcp/client.js';
15
+ import { getElanousConfigDir } from '../src/elanous-config-dir.js';
8
16
  import { debug } from '../src/debug/log.js';
9
17
 
10
18
  export const ELANOUS_PWA_URL = 'http://127.0.0.1:31415/app';
@@ -21,6 +29,10 @@ export const BROWSER_OBSERVE_OK = 'ok';
21
29
  export const BROWSER_OBSERVE_WRONG_SCREEN = 'wrong-screen';
22
30
  /** 관측하지 못했다 */
23
31
  export const BROWSER_OBSERVE_UNOBSERVED = 'unobserved';
32
+ /** `unobserved` 사유 — 루프백 owner 토큰을 못 읽어 Authorization 헤더를 못 붙였다 */
33
+ export const BROWSER_OBSERVE_REASON_AUTH_MISSING = 'auth-missing';
34
+ /** `unobserved` 사유 — 루프백 owner 토큰을 붙였는데 서버가 401 로 거부했다 */
35
+ export const BROWSER_OBSERVE_REASON_AUTH_REJECTED = 'auth-rejected';
24
36
 
25
37
  export type BrowserObserveStatus =
26
38
  | typeof BROWSER_OBSERVE_OK
@@ -50,6 +62,39 @@ export interface BrowserObserveResult extends BrowserObserveClassification {
50
62
  request: BrowserObserveMcpRequest;
51
63
  }
52
64
 
65
+ /** 루프백 owner 토큰을 어디서 읽는지 — `src/cli/mcp-reload.ts` 의 기존 꼴과 같은 자리다. */
66
+ export function browserObserveTokenPath(): string {
67
+ return join(getElanousConfigDir(), 'acp-token');
68
+ }
69
+
70
+ /**
71
+ * 루프백 ACP 토큰을 **읽기 전용**으로 얻는다(실패는 null).
72
+ * ⛔ `ensureAuthToken`(src/auth/acp-token.ts) 을 쓰지 않는다 — 그것은 «없으면 만든다».
73
+ * 이 조각은 새 토큰 생성 0: 파일이 없거나 비면 그대로 auth-missing 이다.
74
+ */
75
+ export function readBrowserObserveToken(): string | null {
76
+ const tokenPath = browserObserveTokenPath();
77
+ try {
78
+ if (!existsSync(tokenPath)) return null;
79
+ const token = readFileSync(tokenPath, 'utf8').trim();
80
+ return token.length > 0 ? token : null;
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+
86
+ /** MCP POST 전부에 `Authorization: Bearer <token>` 을 얹는 전송 래퍼. */
87
+ export function withBrowserObserveAuthorization(
88
+ fetchImpl: BrowserObserveHttpFetch,
89
+ token: string,
90
+ ): BrowserObserveHttpFetch {
91
+ return (url, init) =>
92
+ fetchImpl(url, {
93
+ ...init,
94
+ headers: { ...init.headers, authorization: `Bearer ${token}` },
95
+ });
96
+ }
97
+
53
98
  export type BrowserObserveMcpCall = (request: BrowserObserveMcpRequest) => Promise<unknown>;
54
99
  export type BrowserObserveLog = (category: string, event: string, data?: unknown) => void;
55
100
  export type BrowserObserveHttpFetch = McpHttpFetch;
@@ -58,6 +103,8 @@ export interface BrowserObserveDeps {
58
103
  mcpCall?: BrowserObserveMcpCall;
59
104
  fetch?: BrowserObserveHttpFetch;
60
105
  log?: BrowserObserveLog;
106
+ /** 토큰 획득 주입 자리 — 시험이 파일 시스템 없이 결정성을 얻는다. 생략하면 `readBrowserObserveToken` */
107
+ readToken?: () => string | null;
61
108
  }
62
109
 
63
110
  /**
@@ -328,6 +375,15 @@ function emit(
328
375
  }
329
376
 
330
377
  function unobservedFromCaught(caught: unknown): BrowserObserveClassification {
378
+ // 루프백 토큰을 붙였는데 서버가 401 로 거부한 경우 — McpClient 가
379
+ // McpConnectionError('auth-required') 로 던진다. 긴 오류 문자열 대신 이유 한 칸으로 가른다.
380
+ if (caught instanceof McpConnectionError && caught.reason === 'auth-required') {
381
+ return {
382
+ status: BROWSER_OBSERVE_UNOBSERVED,
383
+ observedUrl: null,
384
+ reason: BROWSER_OBSERVE_REASON_AUTH_REJECTED,
385
+ };
386
+ }
331
387
  if (caught instanceof McpServerError) {
332
388
  return {
333
389
  status: BROWSER_OBSERVE_UNOBSERVED,
@@ -342,14 +398,32 @@ function unobservedFromCaught(caught: unknown): BrowserObserveClassification {
342
398
  };
343
399
  }
344
400
 
401
+ /** 기본 전송(McpClient) 에 루프백 토큰을 얹는다. 토큰이 없으면 null — 401 이 보장된 호출은 아예 안 한다. */
402
+ function defaultAuthorizedMcpCall(deps: BrowserObserveDeps): BrowserObserveMcpCall | null {
403
+ const token = deps.readToken ? deps.readToken() : readBrowserObserveToken();
404
+ if (token === null) return null;
405
+ const base: BrowserObserveHttpFetch = deps.fetch ?? ((url, init) => fetch(url, init));
406
+ const authorized = withBrowserObserveAuthorization(base, token);
407
+ return (request) => callAsideReplViaMcpClient(request, authorized);
408
+ }
409
+
345
410
  /** MCP 로 브라우저에서 값을 가져와 공개 분류 함수에 넘긴다. 의존성 주입으로 실 데몬 없이 검증한다. */
346
411
  export async function observeBrowserCycle(
347
412
  deps: BrowserObserveDeps = {},
348
413
  ): Promise<BrowserObserveResult> {
349
414
  if (!deps.log) await ensureBrowserObserveLogSink();
350
415
  const log = deps.log ?? defaultLog;
351
- const mcpCall = deps.mcpCall ?? ((request) => callAsideReplViaMcpClient(request, deps.fetch));
352
416
  const request = buildBrowserObserveMcpRequest();
417
+ const mcpCall = deps.mcpCall ?? defaultAuthorizedMcpCall(deps);
418
+ if (mcpCall === null) {
419
+ const classified: BrowserObserveClassification = {
420
+ status: BROWSER_OBSERVE_UNOBSERVED,
421
+ observedUrl: null,
422
+ reason: BROWSER_OBSERVE_REASON_AUTH_MISSING,
423
+ };
424
+ emit(log, classified);
425
+ return { ...classified, request };
426
+ }
353
427
  try {
354
428
  const response = await mcpCall(request);
355
429
  const rpcError = jsonRpcErrorMessage(response);
@@ -759,7 +759,7 @@ export function exportedLiteralUnionMembersInChanges(
759
759
  pathsResult: ChangedPathResult = changedPathPairs(base),
760
760
  readBase: GitFileReader = readGitFile,
761
761
  readHead = (file: string) => readFileSync(file, 'utf8'),
762
- sources?: RepositorySources,
762
+ sources?: RepositorySources | (() => RepositorySources),
763
763
  ): LiteralUnionMemberCheck {
764
764
  if (pathsResult.failure) return { additions: [], failure: pathsResult.failure };
765
765
  const additions: LiteralUnionAddition[] = [];
@@ -780,7 +780,7 @@ export function exportedLiteralUnionMembersInChanges(
780
780
  }
781
781
  if (removals.length === 0) return { additions };
782
782
  try {
783
- return { additions, removals: literalUnionReferencesInSource(removals, changed, sources ?? repositoryTypeScriptSources()) };
783
+ return { additions, removals: literalUnionReferencesInSource(removals, changed, typeof sources === 'function' ? sources() : sources ?? repositoryTypeScriptSources()) };
784
784
  } catch (error: unknown) {
785
785
  return { additions, failure: `저장소 리터럴 참조 탐색 실패: ${error instanceof Error ? error.message : String(error)}` };
786
786
  }
@@ -873,6 +873,7 @@ export type GateIo = {
873
873
  literalUnionMembers?: (changed: ReadonlySet<string>, base: string) => LiteralUnionMember[] | LiteralUnionMemberCheck;
874
874
  readBaselineDiagnostics?: (base: string, command: string) => BaselineDiagnostics;
875
875
  runTscCmd: (cmd: string) => TscRun;
876
+ resolveTscScript?: (cwd: string) => string | undefined;
876
877
  /** Landing tree. Git, existsSync, tsc, and the test baseline are measured here — not in process.cwd(). */
877
878
  cwd?: string;
878
879
  /** Explicit base revision. Same rule as TSC_BASE_REF, without reading the process environment. */
@@ -949,7 +950,7 @@ function inspectTscResult(tsc: TscRun, changed: ReadonlySet<string>, baseline: R
949
950
  return false;
950
951
  }
951
952
 
952
- /** Above this many roots a narrowed program stops being much smaller than the whole one. */
953
+ /** Observation threshold only: a large affected program is still narrower than the whole repository. */
953
954
  export const TSC_GATE_ROOT_LIMIT = 400;
954
955
  /** Files tsconfig.gate.json compiles as roots (its `include`); other changed .ts files are never part of that program. */
955
956
  const GATE_ROOT_SOURCE = /^(?:src|scripts|test)\/.*\.ts$/;
@@ -979,19 +980,32 @@ export function planRootCheck(input: {
979
980
  return { mode: 'full', fallbackReason: '루트 계산 실패: 변경 파일 누락' };
980
981
  }
981
982
  const roots = [...computed.roots].filter((file) => GATE_ROOT_SOURCE.test(file)).sort();
982
- if (roots.length > TSC_GATE_ROOT_LIMIT) return { mode: 'full', fallbackReason: `루트 ${roots.length}개 > 상한 ${TSC_GATE_ROOT_LIMIT}`, roots: roots.length };
983
983
  return { mode: 'affected', roots, changedCount: gateChanged.size };
984
984
  }
985
- /**
986
- * K-OP-039 · 노하우를 «도구 출력»에 싣는 첫 조각(대표 2026-10-12 «어떤 에이전트가 와도 같은 수준»).
987
- * 승격된 전체 판정은 `apps/pwa/node_modules` 가 없으면 «가짜» PWA 타입 에러만 낸다 —
988
- * 10-12 하루 TC·UX 두 자리가 같은 가짜 TS2322(ChatMessage.tsx)로 코드를 고치려 했다.
989
- * 카드(내부 문서 `KNOWHOW` K-OP-039)의 처방 문면을 그대로 도구 출력에 싣는다.
990
- */
991
- const PWA_DEPS_MISSING_HINT = '환경: apps/pwa 의존성 없음 — (cd apps/pwa && bun install --frozen-lockfile) 뒤 재실행 · 코드 결함 아님(K-OP-039)';
985
+ /** Target checkout first, then the installed CLI's top-level and nested dependencies. */
986
+ export function resolveTscScript(cwd: string, scriptsDir = import.meta.dir, present: (path: string) => boolean = existsSync): string | undefined {
987
+ return [
988
+ join(cwd, 'node_modules/typescript/bin/tsc'),
989
+ join(scriptsDir, '../../typescript/bin/tsc'),
990
+ join(scriptsDir, '../node_modules/typescript/bin/tsc'),
991
+ ].find(present);
992
+ }
993
+
994
+ /** The installed compiler cannot resolve declarations from a checkout without its own dependencies. */
995
+ export function missingCheckoutTypeDependencies(cwd: string, needsPwa = false, present: (path: string) => boolean = existsSync): string[] {
996
+ const missing: string[] = [];
997
+ if (!present(join(cwd, 'node_modules'))) missing.push('node_modules');
998
+ if (!present(join(cwd, 'node_modules/bun-types'))) missing.push('bun-types');
999
+ if (needsPwa && !present(join(cwd, 'apps/pwa/node_modules'))) missing.push('apps/pwa/node_modules');
1000
+ return missing;
1001
+ }
992
1002
 
993
1003
  export function runGate(io: Partial<GateIo> = {}): void {
994
1004
  const cwd = io.cwd ?? process.cwd();
1005
+ const targetGit: GitRunner = (command, args, options) => execFileSync(command, args, { ...options, cwd, env: gitEnv() });
1006
+ const targetPaths = (base: string) => changedPathPairs(base, targetGit);
1007
+ const targetFile = (ref: string, path: string) => readGitFile(ref, path, targetGit);
1008
+ const targetSource = (file: string) => readFileSync(join(cwd, file), 'utf8');
995
1009
  const defaultChanged = () => changedTsFiles((cmd) => sh(cmd, cwd), process.env, cwd, io.baseRef);
996
1010
  const defaultRunTsc = (cmd: string) => runTsc(cmd, ((command, options) => execSync(command, { ...options, cwd, env: tscExecEnv(options?.env) })) as typeof execSync);
997
1011
  const { changedTsFiles: getChanged = defaultChanged, runTscCmd = defaultRunTsc, log = (message: string) => console.log(message), warn = (message: string) => console.warn(message), error = (message: string) => console.error(message), exit = ((code: number) => process.exit(code)) as GateIo['exit'] } = io;
@@ -999,10 +1013,10 @@ export function runGate(io: Partial<GateIo> = {}): void {
999
1013
  // Set 주입은 기존 테스트 심이며 기준 revision이 없다. 실제 ChangedTsFiles 경로만 Git 관측을 요구한다.
1000
1014
  const requiredExportFields = io.requiredExportFields ?? ((changed: ReadonlySet<string>, base: string) => base === 'injected test seam'
1001
1015
  ? { fields: [], removedSymbols: [], parameterIncreases: [] }
1002
- : requiredExportFieldsInChanges(changed, base));
1016
+ : requiredExportFieldsInChanges(changed, base, targetPaths(base), targetFile, targetSource));
1003
1017
  const literalUnionMembers = io.literalUnionMembers ?? ((changed: ReadonlySet<string>, base: string) => base === 'injected test seam'
1004
1018
  ? { additions: [] }
1005
- : exportedLiteralUnionMembersInChanges(changed, base));
1019
+ : exportedLiteralUnionMembersInChanges(changed, base, targetPaths(base), targetFile, targetSource, () => repositoryTypeScriptSources(cwd)));
1006
1020
  const changedResult = getChanged();
1007
1021
  const { files: changed, base, baseSource, head, diffFiles, warnings = [], failures = [] } = changedResult instanceof Set
1008
1022
  ? { files: changedResult, base: 'injected test seam', baseSource: 'injected test seam', head: 'injected test seam', diffFiles: new Set<string>(), warnings: [], failures: [] }
@@ -1099,15 +1113,33 @@ export function runGate(io: Partial<GateIo> = {}): void {
1099
1113
  }, { level: 'info' });
1100
1114
  log(`[tsc-gate] root 설정 범위 ${rootScope.size}개 관측 (apps/pwa/** 제외).`);
1101
1115
  if (runsPwa) log(`[tsc-gate] PWA 설정 범위 ${pwaScope.size}개 관측.`);
1102
- // ⛔ K-OP-039: 승격된 전체 판정은 apps/pwa 의존성 없이는 «가짜» PWA 타입 에러만 낸다(환경 문제 · 코드 결함 아님).
1103
- // 그 오류를 내기 «전에» 이 한 줄로 멈춘다(환경 줄이 곧 마지막 줄 = 판정) — 의존성이 있으면 아래
1104
- // 판정 규칙·출력 형식은 기존 그대로다. «못 쟀다 ≠ 통과» — PWA 미측정을 통과로 접지 않는다.
1105
- if (wholeRepository && !existsSync(join(cwd, 'apps/pwa/node_modules'))) {
1106
- error(`[tsc-gate] ${PWA_DEPS_MISSING_HINT}`);
1116
+ // K-OP-039: PWA checks without app dependencies produce fake type errors.
1117
+ // The target checkout's declarations are required even when a compiler is
1118
+ // supplied by the installed CLI or injected by another gate caller.
1119
+ const missing = missingCheckoutTypeDependencies(cwd, runsPwa || wholeRepository);
1120
+ if (missing.length > 0) {
1121
+ const quotedCwd = `'${cwd.replaceAll("'", "'\\''")}'`;
1122
+ const install = `cd ${quotedCwd} && bun install --frozen-lockfile${missing.includes('apps/pwa/node_modules') ? ' && (cd apps/pwa && bun install --frozen-lockfile)' : ''}`;
1123
+ error(`[tsc-gate] ⛔ 대상 트리 타입 의존성 없음: ${missing.join(', ')} — ${install}`);
1124
+ error('[tsc-gate] FAIL — 대상 의존성을 확인하지 못했다(설치본 tsc 존재 ≠ 대상 타입 검사 가능).');
1125
+ exit(1);
1126
+ return;
1127
+ }
1128
+ // The .bin shim uses `#!/usr/bin/env node`. A LaunchAgent can have Bun but no
1129
+ // node on PATH, so invoke the installed compiler with this process's absolute
1130
+ // runtime instead. A missing dependency must fail the gate, never fetch via npx.
1131
+ // Preserve the target checkout's compiler version when available. The
1132
+ // installed CLI may resolve TypeScript from a sibling top-level node_modules
1133
+ // or its own nested node_modules; verify each path before starting a child.
1134
+ const tscScript = (io.resolveTscScript ?? resolveTscScript)(cwd);
1135
+ if (!tscScript) {
1136
+ error('[tsc-gate] ⛔ TypeScript 실행 파일 없음 — 대상 트리 또는 설치본에 bun install --frozen-lockfile 뒤 재실행하십시오.');
1137
+ error('[tsc-gate] FAIL — tsc 를 실행하지 못했다(의존성 없음 ≠ 진단 0건).');
1107
1138
  exit(1);
1108
1139
  return;
1109
1140
  }
1110
- const tscBin = existsSync(join(cwd, 'node_modules/.bin/tsc')) ? 'node_modules/.bin/tsc' : 'npx tsc';
1141
+ const shellArg = (value: string) => `'${value.replaceAll("'", "'\\''")}'`;
1142
+ const tscBin = `${shellArg(process.execPath)} ${shellArg(tscScript)}`;
1111
1143
  const baseline = readTestTypecheckBaseline(cwd);
1112
1144
  const rootCommand = `${tscBin} --noEmit -p ${TYPECHECK_GATE_CONFIG}`;
1113
1145
  const pwaCommand = `${tscBin} --noEmit -p apps/pwa/tsconfig.json`;
@@ -1131,8 +1163,10 @@ export function runGate(io: Partial<GateIo> = {}): void {
1131
1163
  rootPlan = { mode: 'full', fallbackReason: `임시 tsconfig 쓰기 실패: ${cause instanceof Error ? cause.message : String(cause)}`, roots: rootPlan.roots.length };
1132
1164
  }
1133
1165
  }
1166
+ log(`[tsc-gate] root-plan ${JSON.stringify({ mode: rootPlan.mode, roots: rootPlan.mode === 'affected' ? rootPlan.roots.length : rootPlan.roots ?? null, promoted: rootPlan.mode === 'full', reason: rootPlan.mode === 'full' ? rootPlan.fallbackReason : rootPlan.roots.length > TSC_GATE_ROOT_LIMIT ? 'large-affected-kept' : null })}`);
1134
1167
  if (rootPlan.mode === 'affected') {
1135
1168
  log(`[tsc-gate] 영향 루트 ${rootPlan.roots.length}개 (변경 ${rootPlan.changedCount} + importer·전역 선언 ${rootPlan.roots.length - rootPlan.changedCount}) — 임시 tsconfig 로 root 검사.`);
1169
+ if (rootPlan.roots.length > TSC_GATE_ROOT_LIMIT) warn(`[tsc-gate] ⚠ 영향 루트 ${rootPlan.roots.length}개 > 관측선 ${TSC_GATE_ROOT_LIMIT} — 전체 승격 사유가 없어 영향 루트 검사를 유지한다.`);
1136
1170
  debug.log('typecheck.gate', 'roots', { mode: 'affected', roots: rootPlan.roots.length, fallbackReason: null }, { level: 'info' });
1137
1171
  } else {
1138
1172
  log(`[tsc-gate] 영향 루트 ${rootPlan.roots ?? '?'}개(전체로 폴백: ${rootPlan.fallbackReason})`);
@@ -1,9 +1,9 @@
1
1
  #!/bin/bash
2
2
  # ch5730-watch.sh — 조율 채널 감시자의 **단일 인스턴스 런처**
3
3
  #
4
- # ⭐ 채널 번호는 «인자»다 — 기본값은 아래 `PR_NUM`, 정본은 `MANUAL-multi-agent-coordination-channel` 머리말이다.
5
- # ⛔ 채널이 바뀌면 이 파일의 기본값 «한 줄»과 그 매뉴얼 머리말 «둘»만 고친다(이름은 안 바꾼다).
6
- # (2026-08-12 #5730→#8328 · 08-25 #8328→#12577 · 09-10 #12577→#16815 · 09-27 #16815→#20798).
4
+ # ⭐ 채널 번호는 `CH_PR` 우선, 기본값은 `MANUAL-multi-agent-coordination-channel` 머리말에서 읽는다.
5
+ # ⛔ 채널이 바뀌면 매뉴얼 머리말을 고친다(이름은 안 바꾼다).
6
+ # (2026-08-12 #5730→#8328 · 08-25 #8328→#12577 · 09-10 #12577→#16815 · 09-27 #16815→#20798 · 10-03 #20798→#23032 · 10-07 #23032→#24694 · 10-11 #24694→#26146 · 10-15 #26146→#27708).
7
7
  # ⛔ 채널은 «막힐 수 있다» — GitHub 은 코멘트 2500 을 넘기면 댓글을 차단한다. 그때의 절차 =
8
8
  # `내부 문서 `COORDINATION-CHANNEL`` 「채널이 막히면 — 순서」.
9
9
  #
@@ -49,9 +49,29 @@
49
49
  set -u
50
50
  set -o pipefail
51
51
 
52
- PR_NUM="${CH_PR:-24694}" # ⛔ 2026-10-07: #23032 가 2,500 상한 → 채널 «7»(OP) # ⛔ 2026-10-03: #20798 가 2,500 상한 → 채널 «6»(OP) # ⛔ 2026-09-27: #16815 가 2,500 상한에 닿아 채널 «5» 로 옮김(🅞 · 벽에 «닿은 뒤» — 미리 못 옮겼다)
53
- # 📏 이력: #5730(07-28~08-12) → #8328(08-11~08-25) → #12577(08-25~09-10) → #16815(09-10~09-27) → #20798(09-27~10-03) → #23032(10-03~10-07) → #24694.
54
- # ***수명이 «2주 안팎»이다 — 세 판이 전부 그랬다.*** 다음 벽은 09-24 언저리.
52
+ SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) || { echo '⛔ 스크립트 위치를 못 읽었다' >&2; exit 3; }
53
+ CANON="$SCRIPT_DIR/../docs/manual/MANUAL-multi-agent-coordination-channel-2026-07-28.md"
54
+ resolve_pr() {
55
+ [ -f "$CANON" ] || return 3
56
+ # 머리말의 실제 인용 제목만 읽는다. 설명·과거 채널·손상된 제목에서 추측하지 않는다.
57
+ head -40 "$CANON" | awk '
58
+ /^> ## / && /현재 채널/ {
59
+ count++
60
+ if ($0 !~ /^> ## .*현재 채널 = \[PR #[0-9]+\]\(https:\/\/github\.com\/ElanvitalAI\/elanous-agent\/pull\/[0-9]+\)/) { bad=1; next }
61
+ id=$0; sub(/^.*현재 채널 = \[PR #/, "", id); sub(/\].*$/, "", id)
62
+ url=$0; sub(/^.*\]\(https:\/\/github\.com\/ElanvitalAI\/elanous-agent\/pull\//, "", url); sub(/\).*$/, "", url)
63
+ if (id != url) bad=1
64
+ }
65
+ END { if (count == 1 && !bad) print id; else exit 3 }
66
+ '
67
+ }
68
+ PR_NUM="${CH_PR:-$(resolve_pr)}"
69
+ if ! [[ "$PR_NUM" =~ ^[0-9]+$ ]]; then
70
+ echo "⛔ 채널 번호를 못 읽었다 — $CANON 머리말 또는 CH_PR 를 확인한다" >&2
71
+ exit 3
72
+ fi
73
+ # 📏 이력: #5730 → #8328 → #12577 → #16815 → #20798 → #23032 → #24694 → #26146 → #27708.
74
+ # 수명은 판마다 달랐다. 2,300코멘트에 닿으면 다음 채널을 준비한다.
55
75
  # 🩹 발신이 rc=1 이면 먼저 세라: gh api repos/ElanvitalAI/elanous/issues/<n> --jq .comments
56
76
  REPO="${CH_REPO:-ElanvitalAI/elanous}"
57
77
  INTERVAL="${CH_INTERVAL:-60}"
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env bun
2
+ import { createHash } from 'node:crypto';
3
+ import { existsSync, readFileSync } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+
6
+ export type RolePackRole = 'coordinator' | 'guardian';
7
+
8
+ export interface RolePack {
9
+ role: RolePackRole;
10
+ version: string;
11
+ sha256: string;
12
+ body: string;
13
+ includedCardIds: string[];
14
+ excludedCardIds: string[];
15
+ sources: Array<{ path: string; sha256: string }>;
16
+ /** Source docs absent from this root, e.g. the published package ships no internal docs. */
17
+ missingSources: string[];
18
+ }
19
+
20
+ const SOURCE_PATHS = [
21
+ 'AGENTS.md',
22
+ 'docs/roles/OP.md',
23
+ 'docs/handbook/LOOP-AGENTS.md',
24
+ 'docs/handbook/OPERATIONS.md',
25
+ 'scripts/coord-role-pack.ts',
26
+ ] as const;
27
+
28
+ // OP's 2026-10-14 verified C/G harvest. These are guidance, never an L0 grant.
29
+ // Moving thresholds, dates, paths, and host capacity must be checked in live state.
30
+ const COORDINATOR_CARDS = [
31
+ ['C1', '기둥 우선순위는 루프 에이전트(L1) > 그래프 엔지니어링(L2) > TUI > 마찰 없는 SETUP > 받침 > 바닥으로 제안한다.'],
32
+ ['C2', '조율자·수호자·과제 담당 칸의 조기 전력화를 우선한다. M4 전 배치는 현 판 일정과 대표 결정을 다시 확인한다.'],
33
+ ['C3', '가속 칸은 루브릭 점수가 낮아도 앞 판 후보가 된다. 승인된 점수 밖 이동은 근거에 배치 덮어씀과 결정 출처를 남긴다.'],
34
+ ['C4', '판 용량은 고정값으로 보지 않는다. 착지 속도를 재고 뒤 판을 당길지 제안한다.'],
35
+ ['C5', '판과 발행 날짜의 대응은 현 일정 정본에서 확인한다. 과거 날짜 공식만으로 이동을 결정하지 않는다.'],
36
+ ['C6', '선행 칸의 판은 후행 칸보다 늦지 않게 제안한다. 컷 중인 판과 도는 런 칸은 옮기기 전 상태를 다시 확인한다.'],
37
+ ['C7', '일반 리뷰는 2라운드째 전제·요구·분할을 적고, 3라운드에 must-fix가 남거나 같은 지적이 2회면 쪼개기·부분 착지·연결골로 트리아지한다.'],
38
+ ['C8', '조각 착지 뒤에는 착지한 범위로 원 칸을 다시 이름 붙여 green을 제안하고, 잔여는 원 칸 선행과 남은 조각 근거를 가진 새 yellow 칸에 둔다.'],
39
+ ['C9', '서로 기다리는 PR은 통합 착지 또는 무해한 독립 조각의 순차 착지를 제안한다. 미설정이면 몸이 0인지를 계약으로 확인한다.'],
40
+ ['C10', 'TA 칸 첫 줄 대상 경로는 origin/main에 실제 있는 저장소 상대 파일로 확인한다. 신설 파일은 별도 신설 줄에 둔다.'],
41
+ ['C11', '관측·A/B 운영만 하는 칸은 구현 대상 경로를 억지로 넣지 말고 명시적 hold와 판정 근거를 제안한다.'],
42
+ ['C12', '여러 실패의 공용 원인이 확인되면 수리 칸을 컷 판의 P0·가속 후보로 제안하고, 영향 칸은 사유 있는 hold 뒤 수리 반영을 확인해 재발사를 제안한다.'],
43
+ ['C13', '최우선은 순서의 맨 앞이라는 뜻이다. 다른 일을 멈추는 조정은 자원이 실제로 부딪칠 때만 제안한다.'],
44
+ ['C14', '대표가 지정한 관심 태스크는 일반 리뷰 트리아지 상한 밖에서 지적 지점만 최소 수리하며 착지까지 추적한다. 막히면 다른 자리를 붙이도록 제안하고 추적 간격은 현재 지시를 확인한다.'],
45
+ ] as const;
46
+
47
+ const GUARDIAN_CARDS = [
48
+ ['G1', '착지와 TA 발사의 부하선은 서로 다를 수 있다. 현재 설정과 1분·5분 추세를 함께 재고 대기 루프에서 다시 판정한다.'],
49
+ ['G2', 'mbp의 무거운 타입검사·게이트·리뷰·빌드는 승인된 원격 호스트에 배치한다. worktree 전수 검색을 피하고 무거운 로그 조회는 자리당 동시 1로 제한한다.'],
50
+ ['G3', 'node-b의 착지·TUI 전용 슬롯과 일반 게이트 호스트의 현재 임대를 확인한다. 말로만 예약하지 말고 토큰·잠금으로 충돌을 막도록 제안한다.'],
51
+ ['G4', 'TA 부모와 Pod의 원격 배치, 호스트별 상한, 자리별 주기 한도는 현재 설정과 런 상태로 확인한다.'],
52
+ ['G5', '착지 슬롯은 전역으로 세고 OP 착지는 한 번에 하나씩 제안한다. 실행기 종료 뒤 고아 표지는 현 슬롯 원장에서 대조한다.'],
53
+ ['G6', 'heavy-remote의 gate-host-busy는 착지 실패로 단정하지 말고 현재 실행기 규약의 대기·재시도 경로로 보낸다. mbp 로컬 폴백은 제안하지 않는다.'],
54
+ ['G7', 'macOS 정기 작업의 gh 인증 실패는 keyring 접근 여부를 확인한다. 측정 실패는 못 잼과 종료 코드를 남기고 로그인 세션 루프를 제안한다.'],
55
+ ['G8', '시험이 운영 상태에 쓴 흔적은 우주 격리 결함으로 기록한다. 격리 수리와 운영 흔적 확인 뒤에만 청소를 제안한다.'],
56
+ ['G9', '운영 설정 변경은 사전 백업과 사후 diff를 요구한다. 문자열 SHA의 JSON 인용을 확인하고 비밀값은 출력하지 않는다.'],
57
+ ['G10', '같은 날 shadow→live 전환과 루프 상태 파일이 어긋나면 틱 실패를 의심한다. 임시 복구와 mode별 상태 분리 수리를 구별한다.'],
58
+ ['G11', '상주 감시는 세션 밖에서 돌리고 Monitor 만료 시 재무장과 심장박동을 확인한다.'],
59
+ ['G12', 'smbd·Finder의 지속 CPU 점유는 mbp 기저 부하 후보로 관측하고, 본부 이전 전 재측정할 항목으로 남긴다.'],
60
+ ] as const;
61
+
62
+ function sha256(body: string): string {
63
+ return createHash('sha256').update(body).digest('hex');
64
+ }
65
+
66
+ /** Deterministic, read-only L0 role pack. Knowledge cards require a separate verified source. */
67
+ export function buildCoordRolePackManifest(role: RolePackRole, root = resolve(import.meta.dir, '..')): RolePack {
68
+ const repo = resolve(root);
69
+ // The pack body is inline. Source docs only contribute hashes, so an installed package without them still builds.
70
+ const present = SOURCE_PATHS.filter((path) => existsSync(resolve(repo, path)));
71
+ const missingSources = SOURCE_PATHS.filter((path) => !present.includes(path));
72
+ const sources = present.map((path) => ({ path, sha256: sha256(readFileSync(resolve(repo, path), 'utf8')) }));
73
+ const packageJson = resolve(repo, 'package.json');
74
+ const version = existsSync(packageJson)
75
+ ? (JSON.parse(readFileSync(packageJson, 'utf8')) as { version: string }).version : 'unknown';
76
+ const roleText = role === 'coordinator'
77
+ ? [
78
+ '## 역할: 조율자',
79
+ '- 전체 칸과 자리의 관측을 모아 우선순위·분배·보류를 제안한다. 칸의 실제 판정은 담당 자리의 근거와 대조한다.',
80
+ '- 질문에 답하기 전에 메시지, 확인표, 과제 카드, 로그를 읽는다. 못 읽은 값은 측정 불가로 밝힌다.',
81
+ '- 세 번 실패하거나 새 경계가 반복되면 전제·요구·분할을 먼저 적는다. 핵심은 칸 판정에 필요한 것, 확장은 나머지다.',
82
+ '- 막힌 칸 하나가 착지 줄 전체를 멈추게 하지 않는다. 다음 준비 완료 칸을 본다.',
83
+ ]
84
+ : [
85
+ '## 역할: 수호자',
86
+ '- 전체 자원·호스트·임대·계정·과금·무결성을 관측하고 입장 또는 대기를 제안한다.',
87
+ '- 부하는 1분·5분 추세를 함께 보고, 한 번의 스파이크만으로 창을 닫지 않는다.',
88
+ '- 무거운 게이트는 원격 호스트에서 한 번만 실행한다. host slot busy는 실행 전 거부이며 그동안 가벼운 검토를 먼저 한다.',
89
+ '- 실제 공급자 크레딧과 경유 공급자의 비용을 구별하고, 비밀값은 출력하지 않는다.',
90
+ ];
91
+ const cards = role === 'coordinator' ? COORDINATOR_CARDS : GUARDIAN_CARDS;
92
+ const lines = [
93
+ '# 금지 목록',
94
+ '- 돈·보안 설정·자격·계정·외부 공개·되돌릴 수 없는 일은 사람 승인 없이 실행하지 않는다.',
95
+ '- L0에서는 우편 답글 제안만 한다. 칸 변경·잠금·착지·코드 쓰기는 하지 않는다.',
96
+ '- `pr land` 거부를 우회하거나 `gh pr merge`·force push·rebase를 실행하지 않는다.',
97
+ '- 자격 파일·토큰 원문을 읽거나 메시지·로그·팩에 싣지 않는다.',
98
+ '- 관측 실패를 성공 또는 0건으로 바꾸지 않는다.',
99
+ '',
100
+ `# ${role} 역할 팩`,
101
+ `판: ${version}`,
102
+ '출처: AGENTS.md 요지 · docs/roles/OP.md §1~2 · docs/handbook/LOOP-AGENTS.md §0,§5,§10 · docs/handbook/OPERATIONS.md §2~5 · scripts/coord-role-pack.ts 운영 지식 v1',
103
+ '권한과 현재 값은 코드·설정·운영 원장으로 다시 확인한다. 이 팩은 권한을 부여하지 않는다.',
104
+ '',
105
+ ...roleText,
106
+ '',
107
+ '## 검증된 운영 지식 v1',
108
+ '각 줄은 판단 제안이며 현재 값·권한은 운영 원장과 설정에서 다시 확인한다.',
109
+ '재는 명령: `eln release checklist status --version <판> --json`(칸·선행·판) · `eln config get harness.podPool`(Pod 풀) · `uptime`(부하 추세) · `eln self gate --help`(호스트·게이트 옵션). 명령이 못 재는 슬롯·런 상태는 담당 원장의 현행 명령을 확인한다.',
110
+ ...cards.map(([id, rule]) => `- ${id} · ${rule} → 팩 ${role === 'coordinator' ? '조율자' : '수호자'} v1`),
111
+ '',
112
+ '## 판단 순서',
113
+ '1. 원 요청과 지금의 우편 스레드·확인표 칸을 대조한다.',
114
+ '2. 코드·설정·실행 결과를 읽고, 문서와 충돌하면 현재 실행 결과를 따른다.',
115
+ '3. 관측·판단 근거·다음 행동을 분리해 답한다. 쓰기는 현재 확인 단계가 허용한 명령으로만 한다.',
116
+ '4. 근거가 없거나 안전 난간과 충돌하면 보류하고 담당 자리 또는 사람에게 올린다.',
117
+ '',
118
+ '위에 명시한 검증된 C/G 카드 외의 노하우 카드는 포함하지 않는다. 현재 관측과 담당 자리의 검증된 원장을 직접 확인한다.',
119
+ '## 출처 해시',
120
+ ...sources.map((source) => `- ${source.path}: ${source.sha256}`),
121
+ ...missingSources.map((path) => `- ${path}: 없음(이 설치본에 미포함)`),
122
+ '',
123
+ ];
124
+ const body = lines.join('\n');
125
+ return { role, version, sha256: sha256(body), body, includedCardIds: cards.map(([id]) => id), excludedCardIds: [], sources, missingSources };
126
+ }
127
+
128
+ /** Prompt body consumed by coordinator and guardian agents. */
129
+ export function buildCoordRolePack(role: RolePackRole, root = resolve(import.meta.dir, '..')): string {
130
+ return buildCoordRolePackManifest(role, root).body;
131
+ }
132
+
133
+ if (import.meta.main) {
134
+ const roleArg = process.argv.indexOf('--role');
135
+ const role = process.argv[roleArg + 1];
136
+ if (roleArg < 0 || (role !== 'coordinator' && role !== 'guardian')) {
137
+ console.error('usage: bun scripts/coord-role-pack.ts --role coordinator|guardian [--json]');
138
+ process.exitCode = 2;
139
+ } else {
140
+ const pack = buildCoordRolePackManifest(role);
141
+ process.stdout.write(process.argv.includes('--json') ? `${JSON.stringify(pack)}\n` : pack.body);
142
+ }
143
+ }
@@ -26,6 +26,9 @@ export type MeasuredRun = {
26
26
  fail: number | null;
27
27
  status: 'measured' | 'unmeasurable';
28
28
  reason?: string;
29
+ /** Names observed in Bun's failed-test output. Absent names must not be inferred from the selected files. */
30
+ failedFiles?: string[];
31
+ failedTests?: string[];
29
32
  };
30
33
 
31
34
  export type InterferenceReport = {
@@ -61,6 +64,32 @@ export function parseFailureCount(output: string): number | null {
61
64
  return Number(failures[0]![1]);
62
65
  }
63
66
 
67
+ /** Bun prints a file heading before its `(fail) name` lines. Only retain names actually printed by that run. */
68
+ export function parseFailedTestNames(output: string): { files: string[]; tests: string[] } {
69
+ const files = new Set<string>();
70
+ const tests = new Set<string>();
71
+ let currentFile: string | undefined;
72
+ for (const raw of output.replace(/\x1b\[[0-9;]*m/g, '').split(/\r?\n/)) {
73
+ const line = raw.trim();
74
+ if (/^(?:\d+\s+(?:pass|fail|skip)|Ran\s+\d+\s+tests?|Bun test v)/i.test(line)) { currentFile = undefined; continue; }
75
+ const failure = /^\(fail\)\s+(.+?)(?:\s+\[[^\]]+\])?$/.exec(line);
76
+ if (failure) {
77
+ tests.add(failure[1]!.trim());
78
+ if (currentFile) files.add(currentFile);
79
+ continue;
80
+ }
81
+ const heading = /^(.+):$/.exec(line);
82
+ if (heading) currentFile = /\.(?:test|spec)\.[cm]?[jt]sx?$/.test(heading[1]!) ? heading[1] : undefined;
83
+ }
84
+ return { files: [...files], tests: [...tests] };
85
+ }
86
+
87
+ export function failedNamesFromStreams(result: RunnerResult): { files: string[]; tests: string[] } {
88
+ const stdout = parseFailedTestNames(result.stdout);
89
+ const stderr = parseFailedTestNames(result.stderr);
90
+ return { files: [...new Set([...stdout.files, ...stderr.files])], tests: [...new Set([...stdout.tests, ...stderr.tests])] };
91
+ }
92
+
64
93
  async function measure(files: readonly string[], runner: TestRunner): Promise<MeasuredRun> {
65
94
  try {
66
95
  const result = await runner(files);
@@ -68,9 +97,10 @@ async function measure(files: readonly string[], runner: TestRunner): Promise<Me
68
97
  return { files: [...files], fail: null, status: 'unmeasurable', reason: result.signal ? `runner terminated by ${result.signal}` : 'runner exit code unavailable' };
69
98
  }
70
99
  const fail = parseFailureCount(`${result.stdout}${result.stderr}`);
100
+ const names = fail !== null && fail > 0 ? failedNamesFromStreams(result) : undefined;
71
101
  return fail === null
72
102
  ? { files: [...files], fail: null, status: 'unmeasurable', reason: 'test summary unavailable, ambiguous, or ran zero files' }
73
- : { files: [...files], fail, status: 'measured' };
103
+ : { files: [...files], fail, status: 'measured', ...(names?.files.length ? { failedFiles: names.files } : {}), ...(names?.tests.length ? { failedTests: names.tests } : {}) };
74
104
  } catch (error) {
75
105
  return { files: [...files], fail: null, status: 'unmeasurable', reason: error instanceof Error ? error.message : String(error) };
76
106
  }