elanous 0.2.36 → 0.2.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (741) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 1026-44010f405704050c.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
  6. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 1632.7d87f998e714bede.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
  18. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
  19. package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 2415.738b777642a02233.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
  28. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
  31. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 3291.f6c1005387d514bd.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
  34. package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
  38. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
  40. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
  45. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
  57. package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +90 -0
  58. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
  60. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
  65. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
  68. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 5307.d7328020227880c2.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
  73. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
  75. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
  80. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
  84. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +62 -0
  88. package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
  95. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 7628.6b16863ac3972333.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 7954.4f7a8832663ee979.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 8019.21ca554a821dad01.js} +16 -16
  102. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 8487.291666583bebe640.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 8879.ac06755bcf3e44a1.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
  111. package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
  115. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
  116. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
  117. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
  121. package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/{page-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
  153. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/{page-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → eaad0cba.771200940c529df7.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/graphs/drafts/recipes.yaml +27 -7
  279. package/graphs/release/recipes.yaml +9 -0
  280. package/graphs/release/release-loop.yaml +26 -18
  281. package/graphs/work/draft-close.yaml +54 -0
  282. package/graphs/work/green-close.yaml +37 -0
  283. package/graphs/work/recipes.yaml +46 -1
  284. package/graphs/work/run-research.yaml +35 -0
  285. package/package.json +1 -1
  286. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  287. package/scripts/ask-op-inbox-once.ts +17 -0
  288. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  289. package/scripts/brand/check.ts +13 -4
  290. package/scripts/codex-fallback-live-probe.ts +17 -15
  291. package/scripts/fleet/node-setup.sh +32 -2
  292. package/scripts/fleet/run-light-worker.sh +9 -0
  293. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  294. package/scripts/gate-0226-failure-census.ts +546 -0
  295. package/scripts/goals/authoring-metrics.ts +258 -0
  296. package/scripts/graph-units/draft-close-node.ts +222 -0
  297. package/scripts/hook-order-sweep.ts +7 -4
  298. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  299. package/scripts/land-global-checks.ts +69 -1
  300. package/scripts/measure-nl-routing-corpus.ts +207 -2
  301. package/scripts/provision-export-redactions.ts +15 -0
  302. package/scripts/public-copy-lint.ts +122 -0
  303. package/scripts/public-export.ts +69 -2
  304. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  305. package/scripts/ratchets/train-side-invariants.sh +7 -1
  306. package/scripts/release-loop/cut-branch.ts +61 -12
  307. package/scripts/release-loop/docs-node.ts +140 -0
  308. package/scripts/release-loop/gate-closure.ts +48 -0
  309. package/scripts/release-loop/gate-diff.ts +2 -1
  310. package/scripts/release-loop/gate-node.ts +161 -25
  311. package/scripts/release-loop/gate-partial.ts +82 -3
  312. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  313. package/scripts/release-loop/gate-radius-live.ts +4 -2
  314. package/scripts/release-loop/known-issues-node.ts +6 -4
  315. package/scripts/release-loop/notes-repair.ts +216 -0
  316. package/scripts/release-loop/prepare-node.ts +61 -5
  317. package/scripts/release-loop/resume-cap.ts +2 -1
  318. package/scripts/release-loop/resume-release.ts +406 -7
  319. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  320. package/scripts/release-loop/resume.ts +13 -5
  321. package/scripts/release-loop/traffic-node.ts +12 -4
  322. package/scripts/release-loop/traffic-transition.ts +53 -13
  323. package/scripts/release-loop/version-node.ts +109 -15
  324. package/scripts/train/green-leg.ts +176 -0
  325. package/scripts/tui-continue-real-evidence.ts +47 -0
  326. package/scripts/ux-sim.ts +1 -1
  327. package/scripts/video-pipeline.ts +2 -2
  328. package/src/acp/client.ts +31 -5
  329. package/src/acp/core-turn-bridge.ts +12 -1
  330. package/src/acp/stderr-summary.ts +49 -0
  331. package/src/agent/monad-agent-turn.ts +1 -0
  332. package/src/agent/run-context.ts +1 -1
  333. package/src/agent/task-notification.ts +3 -1
  334. package/src/agent/terminal-surface.ts +217 -0
  335. package/src/agent-substrate/pr-reviewer.ts +11 -3
  336. package/src/agent-substrate/review-observation.ts +10 -0
  337. package/src/agent-substrate/self-review-cli.ts +537 -57
  338. package/src/auto-research/question-ladder-contract.ts +137 -0
  339. package/src/auto-research/research-turn.ts +134 -0
  340. package/src/autopilot/discovery/doc-lint.ts +1 -1
  341. package/src/autopilot/lineage/sources.ts +1 -1
  342. package/src/autopilot/pr-manager.ts +64 -13
  343. package/src/boot/daemon-runtime.ts +35 -3
  344. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  345. package/src/bots/screen-probe.ts +1 -1
  346. package/src/budget/run-usage-rollup.ts +12 -7
  347. package/src/budget/unified-usage.ts +20 -0
  348. package/src/capture/tui-self-report.ts +42 -5
  349. package/src/chat/index.ts +1 -0
  350. package/src/chat/tool-render/dispatch.ts +8 -1
  351. package/src/cli/autopilot-cli.ts +24 -9
  352. package/src/cli/decisions-cli.ts +7 -4
  353. package/src/cli/doctor-cli.ts +116 -7
  354. package/src/cli/guardian-cli.ts +3 -1
  355. package/src/cli/intake-cli.ts +48 -12
  356. package/src/cli/lesson-cli.ts +69 -9
  357. package/src/cli/logs-cli.ts +357 -2
  358. package/src/cli/memory-cli.ts +30 -1
  359. package/src/cli/msg-cli.ts +15 -11
  360. package/src/cli/pr-granularity.ts +5 -3
  361. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  362. package/src/cli/pr-land-refusal.ts +1 -1
  363. package/src/cli/pty-takeover-cli.ts +58 -5
  364. package/src/cli/release-checklist-read-cli.ts +112 -4
  365. package/src/cli/release-cli.ts +89 -18
  366. package/src/cli/review-carry.ts +77 -0
  367. package/src/cli/self-update.ts +24 -6
  368. package/src/cli/self-utterances-cli.ts +13 -16
  369. package/src/cli/tasks-card-show.ts +31 -1
  370. package/src/cli/tasks-cli.ts +370 -33
  371. package/src/cli/tasks-read-cli.ts +13 -5
  372. package/src/cli/usage-cli.ts +12 -10
  373. package/src/context-bus/claude-memory-import.ts +99 -0
  374. package/src/context-bus/context-now.ts +86 -2
  375. package/src/context-bus/long-term-memory.ts +125 -0
  376. package/src/core-turn/run-core-turn.ts +9 -2
  377. package/src/core-turn/run-goal-loop.ts +5 -2
  378. package/src/core-turn/types.ts +5 -0
  379. package/src/dashboard/chat/acp-chat.ts +9 -0
  380. package/src/dashboard/index.ts +115 -30
  381. package/src/dashboard/input/agent-wake.ts +43 -0
  382. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  383. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  384. package/src/dashboard/replay-preview.ts +25 -0
  385. package/src/dashboard/side-basic-runtime.ts +61 -0
  386. package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
  387. package/src/dashboard/synchronized-frame-output.ts +74 -0
  388. package/src/dashboard/term-slash-runtime.ts +2 -0
  389. package/src/dashboard/turn-preamble.ts +28 -4
  390. package/src/display/coordinator.ts +45 -12
  391. package/src/display/resize-listener.ts +41 -20
  392. package/src/display/synchronized-output-region.ts +60 -0
  393. package/src/domains/guardian-tick.ts +9 -0
  394. package/src/domains/surface-events.ts +80 -1
  395. package/src/exec-requests/planner.ts +37 -2
  396. package/src/execution-loop/launch-gate.ts +4 -3
  397. package/src/git-fs/cli-stderr.ts +45 -0
  398. package/src/git-fs/gh-cli.ts +6 -3
  399. package/src/git-fs/git-cli.ts +11 -5
  400. package/src/git-fs/watcher.ts +27 -22
  401. package/src/git-fs/worktree.ts +19 -3
  402. package/src/graph-runner/graph-cli.ts +26 -2
  403. package/src/graph-runner/graph-grow.ts +37 -9
  404. package/src/graph-runner/graph-run-api.ts +3 -2
  405. package/src/graph-runner/runner.ts +34 -7
  406. package/src/graph-wizard/generate.ts +29 -6
  407. package/src/grok/credential.ts +107 -36
  408. package/src/harness/harness-cli-command.ts +179 -33
  409. package/src/harness/review-adapter.ts +26 -6
  410. package/src/hq/fence-wrapper.ts +1 -1
  411. package/src/hq/transfer.ts +1 -1
  412. package/src/index.ts +151 -18
  413. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  414. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  415. package/src/interactive-terminal-modal.ts +3 -0
  416. package/src/keybindings.ts +17 -22
  417. package/src/llm/provider-credentials.ts +1 -1
  418. package/src/llm/route-decision.ts +13 -0
  419. package/src/llm-tool-name.ts +37 -0
  420. package/src/llm-tool-schema.ts +55 -0
  421. package/src/llm.ts +203 -21
  422. package/src/loops/checker.ts +100 -0
  423. package/src/loops/consensus.ts +26 -2
  424. package/src/loops/loop-cli.ts +9 -4
  425. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  426. package/src/loops/orchestrator/inbox-once.ts +28 -0
  427. package/src/loops/orchestrator/inbox.ts +130 -1
  428. package/src/loops/orchestrator/tick.ts +55 -7
  429. package/src/maturity/feature-maturity.ts +1 -0
  430. package/src/model-tier/llm-tier-map.ts +12 -17
  431. package/src/msg/msg-store.ts +17 -0
  432. package/src/native-tool-catalog.ts +1 -1
  433. package/src/nexus/api/channel-ask-op.ts +96 -0
  434. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  435. package/src/nexus/api/graph-wizard-api.ts +27 -2
  436. package/src/nexus/api/grid.ts +24 -4
  437. package/src/nexus/api/http-server.ts +1 -1
  438. package/src/nexus/api/ops-api.ts +14 -6
  439. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  440. package/src/nexus/api/terminals.ts +28 -6
  441. package/src/nexus/state/state.ts +7 -1
  442. package/src/oauth/codex-account-store.ts +34 -1
  443. package/src/ops/loops-map.ts +46 -0
  444. package/src/ops/overview-cache.ts +22 -4
  445. package/src/ops/overview.ts +41 -5
  446. package/src/patents/ledger.ts +18 -1
  447. package/src/policy/llm-policy.ts +3 -1
  448. package/src/preview/terminal.ts +4 -2
  449. package/src/prompt-cache/anthropic.ts +2 -0
  450. package/src/prompt-enhance/enhance.ts +9 -4
  451. package/src/pty-shell/availability.ts +7 -0
  452. package/src/pty-shell/herdr-agent-report.ts +40 -31
  453. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  454. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  455. package/src/pty-shell/pty-control-ipc.ts +187 -18
  456. package/src/pty-shell/pty-manifest.ts +16 -2
  457. package/src/pty-shell/registry.ts +25 -15
  458. package/src/pty-shell/tui-run-state.ts +235 -1
  459. package/src/release-loop/checklist.ts +50 -5
  460. package/src/release-loop/feature-store.ts +9 -9
  461. package/src/release-loop/gate-shards.ts +61 -0
  462. package/src/release-loop/landed-but-yellow.ts +93 -12
  463. package/src/release-loop/light-rc.ts +7 -4
  464. package/src/release-loop/rehearsal.ts +1 -1
  465. package/src/repl/index.ts +18 -0
  466. package/src/research/axis-fanout.ts +133 -0
  467. package/src/research/edge-decision.ts +88 -0
  468. package/src/research/output-router.ts +127 -0
  469. package/src/research-bridge/format.ts +16 -1
  470. package/src/research-bridge/index.ts +1 -0
  471. package/src/research-bridge/invoke.ts +41 -5
  472. package/src/seat-loop/seat-report.ts +1 -0
  473. package/src/self-dev/ask-launch-flow.ts +86 -10
  474. package/src/self-dev/decompose-proposal.ts +29 -18
  475. package/src/self-dev/decompose.ts +45 -9
  476. package/src/self-dev/dev-pipeline.ts +29 -7
  477. package/src/self-dev/draft-residue.ts +221 -2
  478. package/src/self-dev/draft-sweep.ts +254 -16
  479. package/src/self-dev/draft-triage-rules.ts +19 -5
  480. package/src/self-dev/orchestrate.ts +1 -0
  481. package/src/self-dev/review-provider-fallback.ts +45 -7
  482. package/src/self-dev/run-supervisor.ts +22 -7
  483. package/src/self-dev/shard-plan.ts +48 -0
  484. package/src/self-dev/shard-run.ts +310 -6
  485. package/src/self-implement/comment-only-source.ts +54 -0
  486. package/src/self-implement/doctor-visit.ts +108 -0
  487. package/src/self-implement/gate-artifacts.ts +6 -2
  488. package/src/self-implement/gate-baseline.ts +99 -1
  489. package/src/self-implement/gate-cli.ts +231 -82
  490. package/src/self-implement/gate-failure-signature.ts +44 -0
  491. package/src/self-implement/gate-remote.ts +30 -4
  492. package/src/self-implement/gate-scope.ts +13 -1
  493. package/src/self-implement/goal-author.ts +407 -21
  494. package/src/self-implement/goal-doc/section.ts +22 -0
  495. package/src/self-implement/goal-supervisor-fill.ts +110 -27
  496. package/src/self-implement/importer-test-index.ts +215 -2
  497. package/src/self-implement/knowhow-pack.ts +125 -12
  498. package/src/self-implement/l8-merge-queue.ts +198 -32
  499. package/src/self-implement/off-diff-evidence.ts +23 -0
  500. package/src/self-implement/orchestrator.ts +369 -33
  501. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  502. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  503. package/src/self-implement/premise-review.ts +7 -5
  504. package/src/self-implement/review-round-brief.ts +300 -0
  505. package/src/self-implement/rework-policy.ts +14 -0
  506. package/src/self-implement/run-ledger.ts +428 -6
  507. package/src/self-implement/run-stop.ts +1 -1
  508. package/src/self-implement/running-runs.ts +17 -3
  509. package/src/self-implement/seams.ts +45 -16
  510. package/src/self-implement/self-implement-cli.ts +26 -2
  511. package/src/self-implement/stop-autoheal.ts +1 -0
  512. package/src/self-implement/test-seams.ts +13 -1
  513. package/src/self-implement/train-reach-grouping.ts +8 -2
  514. package/src/session/channel-ask-op-envelope.ts +36 -0
  515. package/src/session/channel-op-reply-route.ts +200 -0
  516. package/src/session/chat.ts +10 -1
  517. package/src/session/id-prefix.ts +60 -0
  518. package/src/session/index.ts +6 -0
  519. package/src/session-runtime/index.ts +18 -23
  520. package/src/skills/runner.ts +7 -3
  521. package/src/skills/tools/dev-harness.ts +2 -2
  522. package/src/skills/tools/pty.ts +5 -0
  523. package/src/skills/tools/schedule-wakeup.ts +1 -6
  524. package/src/status/bar.ts +3 -3
  525. package/src/status/metrics.ts +12 -1
  526. package/src/steward/rejudge-tick.ts +12 -5
  527. package/src/steward/resync-tick.ts +31 -4
  528. package/src/storage/file-lock.ts +17 -4
  529. package/src/task-agent/actions.ts +199 -4
  530. package/src/task-agent/adopt-pr.ts +63 -2
  531. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  532. package/src/task-agent/boundary-proof-producer.ts +147 -0
  533. package/src/task-agent/completion-evidence.ts +2 -1
  534. package/src/task-agent/evidence-command-normalize.ts +42 -0
  535. package/src/task-agent/export-redactions-provision.ts +43 -0
  536. package/src/task-agent/green-close-recipe.ts +239 -0
  537. package/src/task-agent/green-sweep.ts +64 -10
  538. package/src/task-agent/live-moves.ts +48 -3
  539. package/src/task-agent/map-host-adapter.ts +134 -0
  540. package/src/task-agent/map-reduce.ts +158 -0
  541. package/src/task-agent/map-run-ledger.ts +226 -0
  542. package/src/task-agent/parent-host.ts +74 -17
  543. package/src/task-agent/rejudge-on-head.ts +72 -5
  544. package/src/task-agent/repair-cycle.ts +108 -8
  545. package/src/task-agent/repair-next-move.ts +12 -2
  546. package/src/task-agent/repair-worker.ts +37 -1
  547. package/src/task-agent/review-prior-fix.ts +12 -2
  548. package/src/task-agent/shadow.ts +188 -5
  549. package/src/task-agent/task-hand.ts +253 -20
  550. package/src/task-agent/task-parent-role-llm.ts +9 -0
  551. package/src/task-agent/tier-split.ts +40 -5
  552. package/src/task-agent/work-order.ts +53 -2
  553. package/src/task-orchestrator/dispatcher.ts +46 -1
  554. package/src/task-orchestrator/generator-prompt.ts +6 -0
  555. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  556. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  557. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  558. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  559. package/src/task-orchestrator/surfaces/pod-pool.ts +77 -8
  560. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
  561. package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
  562. package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
  563. package/src/terminal/session-registry.ts +1 -0
  564. package/src/terminal/terminal-modal-router.ts +156 -0
  565. package/src/testing/linux-env.ts +177 -0
  566. package/src/tool-hints/gate.ts +6 -4
  567. package/src/tool-hints/signals.ts +33 -1
  568. package/src/tui/chat/background-job-status.ts +8 -2
  569. package/src/tui/chat/goal-interim.ts +5 -1
  570. package/src/tui/entry.ts +722 -30
  571. package/src/tui/input/at-picker.ts +55 -0
  572. package/src/tui/sidetab/attach.ts +304 -0
  573. package/src/tui/sidetab/list.ts +176 -0
  574. package/src/tui/sidetab/nl-tool.ts +136 -0
  575. package/src/tui/slash/resume-command.ts +23 -0
  576. package/src/tui/slash/resume.ts +38 -35
  577. package/src/tui/slash/signals.ts +114 -0
  578. package/src/tui/slash/term-next.ts +72 -0
  579. package/src/tui-client/local-chat-turn.ts +31 -9
  580. package/src/user-config.ts +30 -3
  581. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  582. package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
  583. package/src/ux-sim/fake-gh.ts +174 -0
  584. package/src/ux-sim/fake-kubectl.ts +142 -0
  585. package/src/ux-sim/fake-llm.ts +17 -6
  586. package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
  587. package/src/ux-sim/resume-picker-device.ts +173 -0
  588. package/src/ux-sim/session-id-seed.ts +60 -0
  589. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  590. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  591. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  592. package/src/version/packed-revision.json +1 -1
  593. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
  594. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
  600. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
  601. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
  604. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
  609. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
  612. package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
  613. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
  614. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
  618. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
  619. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
  621. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
  625. package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
  629. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
  632. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
  634. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
  636. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
  641. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
  653. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
  664. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
  666. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
  667. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
  672. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
  739. package/scripts/migrate-monad-to-elanous.ts +0 -195
  740. package/scripts/rebrand-elanous.ts +0 -242
  741. /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
@@ -0,0 +1,91 @@
1
+ # Source: 44fe14face:docs/reports/gate-0226-failure-census.tsv (pre-change accepted census)
2
+ apps/android/app/src/test/kotlin/com/elanvitalai/elanous/android/data/FeedbackEnvelopeVectors.test.ts > Android FeedbackEnvelope shared vectors > runs FeedbackEnvelopeVectorsTest and verifies every shared vector was accounted for
3
+ apps/android/app/src/test/kotlin/com/elanvitalai/elanous/android/ui/chat/ChatHarnessBubble.test.ts > ChatScreen assistant bubble for harness-style turns > injects turn-end through NexusClient→ViewModel and observes the bubble badge
4
+ apps/android/app/src/test/kotlin/com/elanvitalai/elanous/android/ui/chat/ChatLastItemScrollOffset.test.ts > chatLastItemScrollOffset aligns the list to the last item end > ChatScreenLayoutTest drives ChatScreenLayout and observes last-item end alignment
5
+ scripts/hooks/claude-code-utterance.test.ts > UserPromptSubmit reaches the human Claude Code utterance query
6
+ scripts/lib/nl-routing-measurement.test.ts > NL routing corpus runner safety gate > the runner entrypoint stops after final surface resolution with non-zero exit and safety guidance
7
+ scripts/nl-routing-measurement.test.ts > NL routing corpus runner safety gate > the runner entrypoint stops after final surface resolution with non-zero exit and safety guidance
8
+ scripts/release-loop/freeze-off-parity.test.ts > freeze switch off: gate, publish and unattended release are byte-identical to pre-freeze behavior
9
+ scripts/test-deterministic.test.ts > terminateDirectChild > SIGKILLs the group when the direct child is already dead and a grandchild ignores SIGTERM
10
+ scripts/test-diet/effectiveness.test.ts > TD3 effectiveness > measure --effectiveness counts unreachable imports and leaves unreadable results absent
11
+ scripts/webclone/loop/mirror-age.test.ts > edition-check는 조용함을 재료 미러보다 앞에 두고, 미러는 기존 original-mirror 인자로 부른다
12
+ scripts/webclone/loop/mirror-age.test.ts > mirror-age > 12시간 경계 양쪽과 여러 미러를 fetchedAt만으로 한 줄씩 판정한다
13
+ scripts/webclone/loop/mirror-age.test.ts > mirror-age > 파일 mtime이 아니라 MIRROR.json fetchedAt으로 판정한다
14
+ scripts/webclone/loop/ruler-version.test.ts > ruler-version rc 계약 > 12시간을 넘긴 기준선은 rc 1 이고 ***origin-drift 로 재라***를 같이 낸다
15
+ scripts/webclone/loop/ruler-version.test.ts > ruler-version rc 계약 > 최근 기준선은 rc 0 이고 「묵었다」고 말하지 않는다
16
+ scripts/webclone/measure-fidelity.test.ts > main RenderProbe wiring > 로컬 링크가 우세한 미러 진입 문서는 링크 수와 self-contained 상태를 보존한다
17
+ scripts/webclone/measure-fidelity.test.ts > main RenderProbe wiring > 원격 링크가 60% 이상인 미러 진입 문서를 non-self-contained로 기록한다
18
+ scripts/webclone/measure-fidelity.test.ts > main RenderProbe wiring > 통제한 로컬 원문과 성공 프로브가 최종 렌더 위치까지 JSON 산출로 연결된다
19
+ scripts/webclone/measure-fidelity.test.ts > main mirror-entry locality wiring > 네트워크 지배 미러는 참조 수를 내고 픽셀 차이를 품질로 읽을 수 없다고 말한다
20
+ scripts/webclone/measure-fidelity.test.ts > main mirror-entry locality wiring > 로컬 지배 미러는 참조 수를 내고 네트워크 지배 경고를 내지 않는다
21
+ scripts/webclone/measure-fidelity.test.ts > main mirror-entry locality wiring > 미러 진입 문서가 없으면 참조 수와 지배 판정을 못 쟀다로 보존한다
22
+ scripts/webclone/measure-fidelity.test.ts > main overlay observability wiring > 원본과 사본 처리 수를 더해 내고 잔여 덮개면 픽셀 차이를 미신뢰로 표시한다
23
+ scripts/webclone/measure-fidelity.test.ts > main screenshot reliability wiring > 실제 정상·빈 PNG를 기본 통계 추출 경로로 읽어 RMSE를 보존하고 미러 공백 사유를 JSON에 낸다
24
+ src/acp/grok-leader-manager.test.ts > GrokLeaderManager · ensureLeader idempotency contract > ensureLeader returns state object (does not throw)
25
+ src/agent-mission/driver-workdir.test.ts > ignored files outside workdir are detected when created or modified
26
+ src/agent-mission/driver-workdir.test.ts > workdir skips git, runs PTY in the folder by default, and accepts a new mp4
27
+ src/autopilot/build/isolated-instance.test.ts > createIsolatedInstance — 주입 worktree > ★ defaultMergeMainIntoWorktree — fetch 실패 → error / up-to-date / merged (실 git)
28
+ src/dashboard/first-screen-band-wiring.test.ts > showDashboard renders the startup band before and after the real first chat input
29
+ src/directives/directive-index.test.ts > FTS5, incremental byte offsets, version search, redaction, track votes and labels; originals stay unchanged
30
+ src/git-fs/spawn-discipline.test.ts > 실제 저장소 — 이 게이트가 지키는 것 > 실물 git 프론트도어는 --help를 git argv로 전달하고 상태 줄과 git 종료 코드를 보존한다
31
+ src/git-fs/spawn-discipline.test.ts > 실제 저장소 — 이 게이트가 지키는 것 > 실물 진입점에서 scripts 유예와 요약을 산출한다
32
+ src/graph-runner/graph-cli.test.ts > graph YAML triggers.schedule fires through the workflow scheduler into graph tick and persists a run
33
+ src/graph-runner/graph-cli.test.ts > graph tick defaults to idle and --start passes JSON input, prints results, and does not restart a finished run
34
+ src/graph-runner/graph-variant-cli.test.ts > a paused variant resumes from its saved graph after the original template changes
35
+ src/graph-runner/graph-variant-cli.test.ts > a route plan without a budget also executes the changed route
36
+ src/graph-runner/graph-variant-cli.test.ts > ambiguous outcome plan is rejected before ledger or node execution
37
+ src/graph-runner/graph-variant-cli.test.ts > two plans on the same template execute distinct persisted variant graphs through fake nodes
38
+ src/graph-runner/graph-variant-cli.test.ts > variant preserves unrelated node and edge metadata in its runnable snapshot
39
+ src/harness/dogfood.test.ts > assertThrowawayTarget — C 안전 가드(auto-approve 우회 방지) > runHarnessDogfood 도 실경로 target 을 current CLI guidance와 함께 refuse
40
+ src/harness/dogfood.test.ts > assertThrowawayTarget — C 안전 가드(auto-approve 우회 방지) > ★ 실경로(홈·repo·시스템) → refuse with current CLI guidance
41
+ src/mss/logging/log-store.test.ts > LogStore writer contention > carries a failed open observation to the next writable connection
42
+ src/plugins/adapters/claude-package.test.ts > readClaudePackageLedger > reads this machine live ledger without a pluginsRoot override
43
+ src/self-implement/orchestrator-blocked-draft.test.ts > environment branch is committed and pushed to an existing origin without opening a PR
44
+ src/self-implement/orchestrator-blocked-draft.test.ts > environment stop without origin commits changes on the local branch for checkout recovery
45
+ src/self-implement/orchestrator-blocked-draft.test.ts > failed environment push is reported to the caller and never presented as preserved
46
+ src/self-implement/orchestrator-blocked-draft.test.ts > missing worktree keeps provider attribution and reports failed preservation without a draft
47
+ src/self-implement/orchestrator-blocked-draft.test.ts > no changes takes precedence over environment branch preservation
48
+ src/self-implement/orchestrator-blocked-draft.test.ts > quota-exhausted blocked run preserves its branch without opening a draft; implementation deficit still opens one
49
+ src/self-implement/orchestrator-blocked-draft.test.ts > worktree-only environment stop never pushes, even when an origin exists
50
+ src/self-implement/run-chain-query.test.ts > queryRunChain > pages past a full matching dispatch result page to find an old matching session
51
+ src/self-implement/seams-usage-role.test.ts > goal summary passes classify usage role alongside the unchanged resolved model
52
+ src/session-runtime/coding-surface-shell.test.ts > coding surface — shell 실행 tool 노출 > runtime 없는 Agent 폴백은 부모 도구·dispatcher·중단 신호를 자식에 보존한다
53
+ src/skills/tools/dev-harness.test.ts > dispatchRunDevHarness — P3 외부 repo 타깃 > target 실 git repo → repoRoot+elanousBinRoot 를 seam 으로
54
+ src/task-agent/mission.test.ts > shadow --mission → 미션 카드 1 ⊕ 조각 카드 4 · 같은 상태 파일 · 선행 없는 조각만 launch 수 · 나머지 wait after
55
+ src/task-orchestrator/surfaces/pod-pool-cli.test.ts > independent harness ask/say and self CLI dispatch run real kubectl apply only when lease permits
56
+ src/video-pipeline/recipes/reframe.test.ts > reframe — Affinity 가 없어도 «끝까지» 간다 > ⛔ 러너가 «없어도» 멈추지 않는다 (앱이 없는 고객 기계의 모습)
57
+ src/video-pipeline/recipes/vlog.test.ts > vlog 레시피 — 실제 ffmpeg > ⭐ build-layers — 덮는 층(스크림·자막)이 «투명»하다 (🩸 불투명 자막이 영상 전체를 덮었다)
58
+ src/webclone/archive-run.test.ts > 브라우저 재현 가능한 미러 계약 > 실제 wget은 POSIX ERE를 컴파일해 www 형제 자산만 받고 외부 호스트는 받지 않는다
59
+ test/acp-subagent-wire-meta.test.ts > AcpAgent.prompt · _meta forwarding > undefined meta → request omits _meta field
60
+ test/ad-production.test.ts > renders planned captions after assembly while preserving the uncaptained master and named failures
61
+ test/ad-qc-measure.test.ts > QC measurement adapter > uses distinct OCR artifacts for repeated and parallel video measurement plans
62
+ test/dashboard-acp-boot.test.ts > bootDashboardAcpSession — boot observability > records the selected branch and every successful boot outcome
63
+ test/dashboard-turn-typeahead-echo.test.ts > dashboard real user echo wiring > PTY screen preserves submitted Q2 → answer Q2 → submitted Q3 → answer Q3
64
+ test/finance-tools.test.ts > finance tool surface > SQL-injection guard on attractiveness args
65
+ test/finance-tools.test.ts > finance tool surface > finance_trend (A2.1/A4): rotation + country + guards + injection-safe
66
+ test/harness-worktree-add.test.ts > harness worktree add > 판정 신호: goal context records a leading H1 goal title instead of structural H2 headings
67
+ test/harness-worktree-add.test.ts > harness worktree add > 판정 신호: goal synthesis truncates generated output at 250 characters and falls back to title on empty or thrown model output
68
+ test/intake-plane-check-repo-axis.test.ts > frequent matches do not overflow the search buffer and disclose sampling
69
+ test/llm-openrouter-provider.test.ts > OpenRouter provider wire > ⛔ 교차 경로 — config 가 grok 이면 그 키·baseUrl 을 OpenRouter 로 «안» 보낸다
70
+ test/nexus-api-terminals.test.ts > handleTerminalsList > merges web preview PTYs into local and federated lists with their first registration time
71
+ test/oauth/codex-mirror-real-home-guard.test.ts > ① 가드 — 실홈이 대상이면 «던진다» (쓰기는 일어나지 않는다) > ⛔ «심볼릭 링크»로 우회해도 던진다 — 문자열 비교로는 통과했다(리뷰 must-fix)
72
+ test/ocr-tesseract.test.ts > OcrRegistry · Tesseract picker behaviour > strengths:["context-aware"] still picks LLM Vision (Tesseract loses)
73
+ test/persistent-grounding-runtime.test.ts > PersistentGrounding ToolRuntime > default registration alias dispatch runs the guarded search loop and records session observations
74
+ test/persistent-grounding-runtime.test.ts > PersistentGrounding ToolRuntime > generates one session ID for ambient observations and grounding when no session ID is supplied
75
+ test/plugin-hooks-shell.test.ts > shell-hook > array JSON → warn + {}
76
+ test/plugin-hooks-shell.test.ts > shell-hook > env propagated to shell
77
+ test/plugin-hooks-shell.test.ts > shell-hook > stdout JSON object → output
78
+ test/plugin-manifest-hooks.test.ts > plugin-host hook registration > end-to-end dispatch through registered manifest hook
79
+ test/plugin-missions-runtime.test.ts > PX-4 P3 — MissionRegistry > never policy: history grows + iteration advances each tick
80
+ test/plugin-missions-runtime.test.ts > PX-4 P3 — MissionRegistry > score_improvement: only strictly-better score advances
81
+ test/plugin-missions-runtime.test.ts > PX-4 P3 — runMissionEvaluator > parses JSON stdout into MissionResult
82
+ test/preview-terminal.test.ts > PreviewTerminal > resize reaches the kernel PTY — the shell sees the new size (stty size)
83
+ test/rules-contract.test.ts > 변경 ↔ 규칙 갱신 — sources 가 바뀌면 그 «규칙 파일»이 같은 diff 에 있다 > 이 검사가 무엇을 봤는지 «말한다»
84
+ test/self-dev-manual-goal-evidence.test.ts > hand-authored --file goal evidence contract > passes the attached requirement to the self-implement boundary for --file input
85
+ test/shell-audit-log.test.ts > shell-primitive audit-log: programmatic sink > run event includes truncated when output exceeds budget
86
+ test/shell-primitive.test.ts > shell-primitive: runShell (no approval) > maxOutputChars truncates and sets truncated=true
87
+ test/skill-tool-mermaid.test.ts > dispatchMermaidRender — happy path > renders a simple flowchart to Unicode boxes
88
+ test/voice-tts-providers.test.ts > TTS provider availability and unpaid default > falls back to edge-tts, not openai-tts, when nobody chose and no credential resolves
89
+ test/voice-tts-providers.test.ts > TTS provider availability and unpaid default > reports edge-tts and macos-say usable without credentials
90
+ test/workflow-templates-packaged.test.ts > the npm package carries every workflow template the repository has
91
+ test/plugin-missions-runtime.test.ts > [error]
@@ -0,0 +1,546 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * GATE-0226-REMAINING-90 — 0.2.26 gate 실패 ID 전수표의 무결성 검증 진입점.
4
+ *
5
+ * 판정: `docs/reports/gate-0226-failure-census.tsv`가 accepted 실패 ID 96건을 중복 없이 보존하고,
6
+ * 그중 `provider-intake` 6건(첫 감소 칸 GATE-0226-PROVIDER-INTAKE6)을 제외한 90건이 정확히 남으며,
7
+ * `Error: no ACP` 로그 사건(34회)은 실패 ID로 더해지지 않았음. 보고서 md의 96행 색인과 선언 카운트도 실측과 일치.
8
+ * intake 제외 90개 ID는 변경 전 `44fe14face` TSV에서 고정한 accepted 목록과 집합 비교한다.
9
+ *
10
+ * 사용: bun run scripts/gate-0226-failure-census.ts [--tsv <path>] [--report <path>] [--accepted <path|none>] [--json] [--write-repair-card]
11
+ *
12
+ * `--write-repair-card`: 표의 `repair_card` 칸을 묶음·주인에서 다시 계산해 되쓴다(검증은 그대로 이어진다).
13
+ */
14
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
15
+ import { homedir } from 'node:os';
16
+ import { join, resolve } from 'node:path';
17
+
18
+ export const CENSUS_TSV = 'docs/reports/gate-0226-failure-census.tsv';
19
+ export const CENSUS_REPORT = 'docs/reports/REPORT-gate-0226-failure-census.md';
20
+ export const DEFAULT_ACCEPTED = 'elanous-hq/seat-state/OP/tools/accepted-0226.json';
21
+ export const DEFAULT_REMAINING_BASELINE = 'scripts/gate-0226-accepted-remaining-90.txt';
22
+
23
+ export const EXPECTED_HEADER = [
24
+ 'no',
25
+ 'test_id',
26
+ 'source_file',
27
+ 'group',
28
+ 'classification',
29
+ 'root_cause',
30
+ 'repro_command',
31
+ 'evidence',
32
+ 'prescription',
33
+ 'owner',
34
+ 'replacement_contract_if_deleted',
35
+ 'status',
36
+ 'repair_card',
37
+ ] as const;
38
+
39
+ export const TOTAL_IDS = 96;
40
+ export const INTAKE_GROUP = 'provider-intake';
41
+ export const INTAKE_IDS = 6;
42
+ export const REMAINING_IDS = 90;
43
+
44
+ export const EXPECTED_STATUS: Record<string, number> = {
45
+ 'hypothesis-unverified': 68,
46
+ 'paired-reproduced-root-cause-candidate': 7,
47
+ 'untriaged': 21,
48
+ };
49
+
50
+ export const EXPECTED_GROUP: Record<string, number> = {
51
+ 'UX-gate-pair': 5,
52
+ 'blocked-draft': 7,
53
+ 'plugin-stdin-EPIPE-candidate': 7,
54
+ 'provider-intake': 6,
55
+ 'provider-self-implement': 2,
56
+ 'remaining-review': 61,
57
+ 'webclone-measure': 8,
58
+ };
59
+
60
+ export const REQUIRED_FIELDS = ['classification', 'root_cause', 'repro_command', 'evidence', 'prescription', 'owner'] as const;
61
+
62
+ export const NO_ACP_MARKER = 'Error: no ACP';
63
+ export const ACP_LOG_EVENTS = 34;
64
+ export const NO_DELETION_PROPOSAL = '시험 삭제 제안 없음';
65
+
66
+ /** 묶음 → 수리 칸. `remaining-review` 만 주인별로 다시 쪼갠다. */
67
+ export const REPAIR_CARDS_BY_GROUP: Record<string, string> = {
68
+ 'provider-intake': 'GATE-0226-PROVIDER-INTAKE6',
69
+ 'webclone-measure': 'GATE-0226-WEBCLONE-MEASURE',
70
+ 'blocked-draft': 'GATE-0226-BLOCKED-DRAFT',
71
+ 'plugin-stdin-EPIPE-candidate': 'GATE-0226-PLUGIN-STDIN-EPIPE',
72
+ 'UX-gate-pair': 'GATE-0226-UX-GATE-PAIR',
73
+ 'provider-self-implement': 'GATE-0226-PROVIDER-SELF-IMPLEMENT',
74
+ };
75
+
76
+ export const REMAINING_CARD_PREFIX = 'GATE-0226-REMAINING-';
77
+
78
+ /** 주인 표기(`TC/OP gate`·`UX/Android·OP gate`)에서 두 글자 이상 대문자 트랙 이름만 뽑아 칸 이름 꼬리를 만든다. */
79
+ export function ownerSlug(owner: string): string {
80
+ const tracks: string[] = [];
81
+ for (const token of owner.split(/[/·]/)) {
82
+ const match = /^[A-Z]{2,}/.exec(token.trim());
83
+ if (match && !tracks.includes(match[0])) tracks.push(match[0]);
84
+ }
85
+ return tracks.join('-');
86
+ }
87
+
88
+ /** 한 실패 ID를 어느 수리 칸이 이어받는지 정한다. 묶음 단위 칸 + `remaining-review` 는 주인 단위 칸. */
89
+ export function repairCardFor(group: string, owner: string): string {
90
+ const fixed = REPAIR_CARDS_BY_GROUP[group];
91
+ if (fixed) return fixed;
92
+ const slug = ownerSlug(owner);
93
+ return slug.length > 0 ? `${REMAINING_CARD_PREFIX}${slug}` : REMAINING_CARD_PREFIX;
94
+ }
95
+
96
+ export type CensusRow = Record<(typeof EXPECTED_HEADER)[number], string>;
97
+
98
+ export type CensusAudit = {
99
+ ok: boolean;
100
+ problems: string[];
101
+ counts: {
102
+ rows: number;
103
+ intake: number;
104
+ remaining: number;
105
+ status: Record<string, number>;
106
+ group: Record<string, number>;
107
+ repair: Record<string, number>;
108
+ };
109
+ intakeIds: string[];
110
+ remainingIds: string[];
111
+ acpLogEvents: number;
112
+ ledger: { path: string; status: 'compared' | 'skipped' | 'failed'; ids: number };
113
+ remainingBaseline: { path: string; status: 'compared' | 'failed'; ids: number };
114
+ };
115
+
116
+ /** RFC4180 형식의 탭 구분 표를 읽는다. 실패 ID 안의 따옴표·탭·개행을 보존한다. */
117
+ export function parseTsv(text: string): string[][] {
118
+ const rows: string[][] = [];
119
+ let row: string[] = [];
120
+ let field = '';
121
+ let quoted = false;
122
+ for (let i = 0; i < text.length; i += 1) {
123
+ const ch = text[i]!;
124
+ if (quoted) {
125
+ if (ch === '"') {
126
+ if (text[i + 1] === '"') {
127
+ field += '"';
128
+ i += 1;
129
+ } else {
130
+ quoted = false;
131
+ }
132
+ } else {
133
+ field += ch;
134
+ }
135
+ continue;
136
+ }
137
+ if (ch === '"') {
138
+ quoted = true;
139
+ continue;
140
+ }
141
+ if (ch === '\t') {
142
+ row.push(field);
143
+ field = '';
144
+ continue;
145
+ }
146
+ if (ch === '\r') continue;
147
+ if (ch === '\n') {
148
+ row.push(field);
149
+ rows.push(row);
150
+ row = [];
151
+ field = '';
152
+ continue;
153
+ }
154
+ field += ch;
155
+ }
156
+ if (field.length > 0 || row.length > 0) {
157
+ row.push(field);
158
+ rows.push(row);
159
+ }
160
+ return rows.filter((cells) => cells.some((cell) => cell.trim().length > 0));
161
+ }
162
+
163
+ function encodeCell(value: string): string {
164
+ return /[\t\n\r"]/.test(value) ? `"${value.replace(/"/g, '""')}"` : value;
165
+ }
166
+
167
+ /** `CensusRow`를 탭 구분 표로 되쓴다(따옴표는 필요할 때만, 줄바꿈은 `\n`). */
168
+ export function serializeTsv(rows: CensusRow[]): string {
169
+ const lines = [EXPECTED_HEADER.join('\t')];
170
+ for (const row of rows) lines.push(EXPECTED_HEADER.map((name) => encodeCell(row[name])).join('\t'));
171
+ return `${lines.join('\n')}\n`;
172
+ }
173
+
174
+ /**
175
+ * 표의 `repair_card` 칸을 묶음·주인에서 다시 계산해 파일에 되쓴다.
176
+ * 표에 정본 스키마 밖 칸이 있으면 자료를 잃지 않도록 거부한다.
177
+ */
178
+ export function writeRepairCards(path: string): number {
179
+ const rawRows = parseTsv(readFileSync(path, 'utf8'));
180
+ const header = rawRows[0] ?? [];
181
+ const unknown = header.filter((name) => !(EXPECTED_HEADER as readonly string[]).includes(name));
182
+ if (unknown.length > 0) throw new Error(`${path}: 정본 스키마 밖 칸 (${unknown.join(', ')})`);
183
+ const rows: CensusRow[] = rawRows.slice(1).map((cells) => {
184
+ const row = {} as CensusRow;
185
+ EXPECTED_HEADER.forEach((name) => {
186
+ const at = header.indexOf(name);
187
+ row[name] = at >= 0 ? (cells[at] ?? '') : '';
188
+ });
189
+ row.repair_card = repairCardFor(row.group, row.owner);
190
+ return row;
191
+ });
192
+ writeFileSync(path, serializeTsv(rows), 'utf8');
193
+ return rows.length;
194
+ }
195
+
196
+ function tally(values: string[]): Record<string, number> {
197
+ const out: Record<string, number> = {};
198
+ for (const value of values) out[value] = (out[value] ?? 0) + 1;
199
+ return out;
200
+ }
201
+
202
+ function sortedTally(values: string[]): Record<string, number> {
203
+ const counted = tally(values);
204
+ const out: Record<string, number> = {};
205
+ for (const key of Object.keys(counted).sort()) out[key] = counted[key]!;
206
+ return out;
207
+ }
208
+
209
+ function sameTally(actual: Record<string, number>, expected: Record<string, number>): boolean {
210
+ const keys = new Set([...Object.keys(actual), ...Object.keys(expected)]);
211
+ for (const key of keys) if ((actual[key] ?? 0) !== (expected[key] ?? 0)) return false;
212
+ return true;
213
+ }
214
+
215
+ /** 보고서 md의 `| 번호 | \`실패 ID\` | 묶음 | \`상태\` | 주인 |` 색인 행을 읽는다. */
216
+ export function parseReportIndex(report: string): Array<{ no: number; test_id: string; group: string; status: string; owner: string }> {
217
+ const out: Array<{ no: number; test_id: string; group: string; status: string; owner: string }> = [];
218
+ for (const line of report.split('\n')) {
219
+ const match = /^\| (\d+) \| `(.+?)` \| (.+?) \| `(.+?)` \| (.+?) \|$/.exec(line);
220
+ if (!match) continue;
221
+ out.push({
222
+ no: Number(match[1]),
223
+ test_id: match[2]!.replace(/\\\|/g, '|'),
224
+ group: match[3]!.trim(),
225
+ status: match[4]!,
226
+ owner: match[5]!.trim(),
227
+ });
228
+ }
229
+ return out;
230
+ }
231
+
232
+ /** 보고서 md가 선언한 `총 N건 = provider-intake M건 + 나머지 K건` 문면을 읽는다. */
233
+ export function parseReportCounts(report: string): { total: number; intake: number; remaining: number } | null {
234
+ const match = /총 (\d+)건 = provider-intake (\d+)건[^\n]*나머지 (\d+)건/.exec(report);
235
+ if (!match) return null;
236
+ return { total: Number(match[1]), intake: Number(match[2]), remaining: Number(match[3]) };
237
+ }
238
+
239
+ /** 보고서 md의 수리 칸 표 `| \`GATE-0226-…\` | N |` 행을 읽는다. */
240
+ export function parseReportRepairCards(report: string): Record<string, number> {
241
+ const out: Record<string, number> = {};
242
+ for (const line of report.split('\n')) {
243
+ const match = /^\| `(GATE-0226-[A-Z0-9-]+)` \| (\d+) \|/.exec(line);
244
+ if (match) out[match[1]!] = Number(match[2]);
245
+ }
246
+ return out;
247
+ }
248
+
249
+ function readAcceptedIds(path: string): string[] | null {
250
+ if (!existsSync(path)) return null;
251
+ const parsed: unknown = JSON.parse(readFileSync(path, 'utf8'));
252
+ if (!Array.isArray(parsed)) throw new Error(`${path}: accepted 원장이 배열이 아니다`);
253
+ return parsed.map((entry) => {
254
+ const id = (entry as { id?: unknown }).id;
255
+ if (typeof id !== 'string' || id.length === 0) throw new Error(`${path}: id 없는 항목`);
256
+ return id;
257
+ });
258
+ }
259
+
260
+ export type AuditInput = {
261
+ tsvText: string;
262
+ reportText: string;
263
+ /** accepted 원장 ID. null 이면 비교 불가(원장 부재)를 산출로 남긴다. */
264
+ acceptedIds: string[] | null;
265
+ /** 변경 전 독립 기준으로 고정한 remaining accepted ID 집합. */
266
+ remainingBaselineIds: string[] | null;
267
+ remainingBaselinePath: string;
268
+ ledgerPath: string;
269
+ ledgerRequired: boolean;
270
+ };
271
+
272
+ export function auditCensus(input: AuditInput): CensusAudit {
273
+ const problems: string[] = [];
274
+ const rawRows = parseTsv(input.tsvText);
275
+ const header = rawRows[0] ?? [];
276
+ const headerMatches = header.length === EXPECTED_HEADER.length && EXPECTED_HEADER.every((name, at) => header[at] === name);
277
+ if (!headerMatches) {
278
+ problems.push(`tsv-header: 기대 ${EXPECTED_HEADER.join(',')} / 실측 ${header.join(',')}`);
279
+ }
280
+ const rows: CensusRow[] = rawRows.slice(1).map((cells) => {
281
+ const row = {} as CensusRow;
282
+ EXPECTED_HEADER.forEach((name, at) => {
283
+ row[name] = cells[at] ?? '';
284
+ });
285
+ return row;
286
+ });
287
+
288
+ if (rows.length !== TOTAL_IDS) problems.push(`row-count: 기대 ${TOTAL_IDS}행 / 실측 ${rows.length}행`);
289
+
290
+ const numbering = rows.map((row) => Number(row.no));
291
+ const numbered = numbering.every((value, at) => value === at + 1);
292
+ if (!numbered) problems.push(`row-numbering: no 컬럼이 1..${rows.length} 순차가 아니다 (${numbering.slice(0, 5).join(',')}…)`);
293
+
294
+ const ids = rows.map((row) => row.test_id);
295
+ const uniqueIds = new Set(ids);
296
+ if (uniqueIds.size !== ids.length) {
297
+ const dupes = Object.entries(tally(ids))
298
+ .filter(([, count]) => count > 1)
299
+ .map(([id]) => id);
300
+ problems.push(`unique-ids: 중복 ${ids.length - uniqueIds.size}건 (${dupes.slice(0, 3).join(' | ')})`);
301
+ }
302
+
303
+ const intakeRows = rows.filter((row) => row.group === INTAKE_GROUP);
304
+ const otherRows = rows.filter((row) => row.group !== INTAKE_GROUP);
305
+ const intakeIds = intakeRows.map((row) => row.test_id);
306
+ const remainingIds = otherRows.map((row) => row.test_id);
307
+ if (intakeRows.length !== INTAKE_IDS) {
308
+ problems.push(`intake-split: ${INTAKE_GROUP} 기대 ${INTAKE_IDS}건 / 실측 ${intakeRows.length}건`);
309
+ }
310
+ if (otherRows.length !== REMAINING_IDS) {
311
+ problems.push(`intake-split: 제외 후 나머지 기대 ${REMAINING_IDS}건 / 실측 ${otherRows.length}건`);
312
+ }
313
+ const overlap = remainingIds.filter((id) => intakeIds.includes(id));
314
+ if (overlap.length > 0) problems.push(`intake-split: 제외 대상이 남은 묶음에도 있다 (${overlap.slice(0, 3).join(' | ')})`);
315
+ if (new Set(remainingIds).size !== remainingIds.length) {
316
+ problems.push(`intake-split: 제외 후 90건에 id 중복이 있다`);
317
+ }
318
+
319
+ const intakeCard = REPAIR_CARDS_BY_GROUP[INTAKE_GROUP]!;
320
+ const wrongCard = rows.filter((row) => row.repair_card !== repairCardFor(row.group, row.owner));
321
+ if (wrongCard.length > 0) {
322
+ problems.push(
323
+ `repair-card: 묶음·주인에서 유도한 칸 이름과 다른 행 ${wrongCard.length}건 (no ${wrongCard.slice(0, 4).map((row) => row.no).join(',')})`,
324
+ );
325
+ }
326
+ const repair = sortedTally(rows.map((row) => row.repair_card));
327
+ const onIntakeCard = rows.filter((row) => row.repair_card === intakeCard);
328
+ if (onIntakeCard.length !== INTAKE_IDS) {
329
+ problems.push(`repair-card: ${intakeCard} 기대 ${INTAKE_IDS}건 / 실측 ${onIntakeCard.length}건`);
330
+ }
331
+ const afterIntakeCard = rows.filter((row) => row.repair_card !== intakeCard);
332
+ if (afterIntakeCard.length !== REMAINING_IDS) {
333
+ problems.push(`repair-card: ${intakeCard} 제외 후 기대 ${REMAINING_IDS}건 / 실측 ${afterIntakeCard.length}건`);
334
+ }
335
+
336
+ const status = sortedTally(rows.map((row) => row.status));
337
+ if (!sameTally(status, EXPECTED_STATUS)) {
338
+ problems.push(`status-totals: 기대 ${JSON.stringify(EXPECTED_STATUS)} / 실측 ${JSON.stringify(status)}`);
339
+ }
340
+ const group = sortedTally(rows.map((row) => row.group));
341
+ if (!sameTally(group, EXPECTED_GROUP)) {
342
+ problems.push(`group-totals: 기대 ${JSON.stringify(EXPECTED_GROUP)} / 실측 ${JSON.stringify(group)}`);
343
+ }
344
+
345
+ const acpAttributed = rows.filter((row) => [row.evidence, row.root_cause, row.repro_command].some((cell) => cell.includes(NO_ACP_MARKER)));
346
+ if (acpAttributed.length > 0) {
347
+ problems.push(`no-acp-exclusion: \`${NO_ACP_MARKER}\` 로그 사건을 실패 ID로 센 행 ${acpAttributed.length}건 (${acpAttributed.map((row) => row.no).join(',')})`);
348
+ }
349
+
350
+ const blankCells: string[] = [];
351
+ const deletionProposals: string[] = [];
352
+ for (const row of rows) {
353
+ for (const field of REQUIRED_FIELDS) {
354
+ if (row[field].trim().length === 0) blankCells.push(`${row.no}.${field}`);
355
+ }
356
+ if (row.replacement_contract_if_deleted.trim().length === 0) blankCells.push(`${row.no}.replacement_contract_if_deleted`);
357
+ else if (!row.replacement_contract_if_deleted.includes(NO_DELETION_PROPOSAL)) deletionProposals.push(row.no);
358
+ }
359
+ if (blankCells.length > 0) problems.push(`evidence-completeness: 빈 칸 ${blankCells.length}개 (${blankCells.slice(0, 6).join(',')})`);
360
+ if (deletionProposals.length > 0) {
361
+ problems.push(`no-test-deletion-proposed: 근거 없이 시험 삭제를 제안한 행 ${deletionProposals.length}건 (${deletionProposals.slice(0, 6).join(',')})`);
362
+ }
363
+
364
+ if (!input.reportText.includes('## 90건 후속 조사와 남은 수리 칸')) {
365
+ problems.push('report-follow-up: 90건 후속 조사·상태·주인 근거 절이 없다');
366
+ }
367
+
368
+ const index = parseReportIndex(input.reportText);
369
+ if (index.length !== rows.length) {
370
+ problems.push(`report-index-parity: 보고서 색인 ${index.length}행 / TSV ${rows.length}행`);
371
+ } else {
372
+ const mismatched = rows.filter((row, at) => {
373
+ const entry = index[at]!;
374
+ return entry.no !== at + 1 || entry.test_id !== row.test_id || entry.group !== row.group || entry.status !== row.status || entry.owner !== row.owner;
375
+ });
376
+ if (mismatched.length > 0) {
377
+ problems.push(`report-index-parity: TSV와 어긋난 색인 행 ${mismatched.length}건 (no ${mismatched.slice(0, 4).map((row) => row.no).join(',')})`);
378
+ }
379
+ }
380
+
381
+ const declared = parseReportCounts(input.reportText);
382
+ if (!declared) {
383
+ problems.push('report-counts: 보고서에 `총 N건 = provider-intake M건 … 나머지 K건` 선언이 없다');
384
+ } else if (declared.total !== rows.length || declared.intake !== intakeRows.length || declared.remaining !== otherRows.length) {
385
+ problems.push(
386
+ `report-counts: 보고서 선언 ${declared.total}/${declared.intake}/${declared.remaining} / 실측 ${rows.length}/${intakeRows.length}/${otherRows.length}`,
387
+ );
388
+ }
389
+ const declaredRepair = parseReportRepairCards(input.reportText);
390
+ if (Object.keys(declaredRepair).length === 0) {
391
+ problems.push('report-repair-parity: 보고서에 수리 칸 표(`| `GATE-0226-…` | N |`)가 없다');
392
+ } else if (!sameTally(declaredRepair, repair)) {
393
+ problems.push(`report-repair-parity: 보고서 선언 ${JSON.stringify(declaredRepair)} / 실측 ${JSON.stringify(repair)}`);
394
+ }
395
+ if (!input.reportText.includes(NO_ACP_MARKER) || !input.reportText.includes(`${ACP_LOG_EVENTS}회`) || !input.reportText.includes('겹침은 0건')) {
396
+ problems.push(`report-counts: 보고서가 \`${NO_ACP_MARKER}\` ${ACP_LOG_EVENTS}회 · 겹침 0건 배제를 명시하지 않는다`);
397
+ }
398
+
399
+ let remainingBaseline: CensusAudit['remainingBaseline'];
400
+ if (input.remainingBaselineIds === null) {
401
+ problems.push(`remaining-baseline: 고정 기준 파일이 없다 (${input.remainingBaselinePath})`);
402
+ remainingBaseline = { path: input.remainingBaselinePath, status: 'failed', ids: 0 };
403
+ } else {
404
+ const baselineIds = input.remainingBaselineIds;
405
+ const baseline = new Set(baselineIds);
406
+ const actual = new Set(remainingIds);
407
+ const missing = [...baseline].filter((id) => !actual.has(id));
408
+ const extra = [...actual].filter((id) => !baseline.has(id));
409
+ if (baseline.size !== REMAINING_IDS || baseline.size !== baselineIds.length) {
410
+ problems.push(`remaining-baseline: 고정 기준은 중복 없이 ${REMAINING_IDS} ID여야 한다 (행 ${baselineIds.length} / 고유 ${baseline.size})`);
411
+ }
412
+ if (missing.length > 0 || extra.length > 0 || baseline.size !== actual.size) {
413
+ problems.push(`remaining-baseline: 기준 ${baseline.size}건 / TSV ${actual.size}건 · 누락 ${missing.length}${missing.length ? ` (${missing.slice(0, 3).join(' | ')})` : ''} · 추가 ${extra.length}${extra.length ? ` (${extra.slice(0, 3).join(' | ')})` : ''}`);
414
+ remainingBaseline = { path: input.remainingBaselinePath, status: 'failed', ids: baseline.size };
415
+ } else {
416
+ remainingBaseline = { path: input.remainingBaselinePath, status: 'compared', ids: baseline.size };
417
+ }
418
+ }
419
+
420
+ let ledger: CensusAudit['ledger'];
421
+ if (input.acceptedIds === null) {
422
+ if (input.ledgerRequired) {
423
+ problems.push(`accepted-ledger: 원장 파일이 없다 (${input.ledgerPath})`);
424
+ ledger = { path: input.ledgerPath, status: 'failed', ids: 0 };
425
+ } else {
426
+ ledger = { path: input.ledgerPath, status: 'skipped', ids: 0 };
427
+ }
428
+ } else {
429
+ const accepted = new Set(input.acceptedIds);
430
+ const missing = ids.filter((id) => !accepted.has(id));
431
+ const extra = [...accepted].filter((id) => !uniqueIds.has(id));
432
+ if (missing.length > 0 || extra.length > 0 || accepted.size !== rows.length) {
433
+ problems.push(`accepted-ledger: 원장 ${accepted.size}건 / TSV ${rows.length}건 · 누락 ${missing.length} · 여분 ${extra.length}`);
434
+ ledger = { path: input.ledgerPath, status: 'failed', ids: accepted.size };
435
+ } else {
436
+ ledger = { path: input.ledgerPath, status: 'compared', ids: accepted.size };
437
+ }
438
+ }
439
+
440
+ return {
441
+ ok: problems.length === 0,
442
+ problems,
443
+ counts: { rows: rows.length, intake: intakeRows.length, remaining: otherRows.length, status, group, repair },
444
+ intakeIds,
445
+ remainingIds,
446
+ acpLogEvents: acpAttributed.length,
447
+ ledger,
448
+ remainingBaseline,
449
+ };
450
+ }
451
+
452
+ export function renderText(audit: CensusAudit): string {
453
+ const lines: string[] = [];
454
+ lines.push(`rows: ${audit.counts.rows} (${INTAKE_GROUP} ${audit.counts.intake} excluded → ${audit.counts.remaining})`);
455
+ lines.push(`group: ${Object.entries(audit.counts.group).map(([key, value]) => `${key}=${value}`).join(' ')}`);
456
+ lines.push(`status: ${Object.entries(audit.counts.status).map(([key, value]) => `${key}=${value}`).join(' ')}`);
457
+ lines.push(`repair-cards: ${Object.entries(audit.counts.repair).map(([key, value]) => `${key}=${value}`).join(' ')}`);
458
+ lines.push(`no-acp: ${audit.acpLogEvents} (로그 ${ACP_LOG_EVENTS}회 사건은 실패 ID가 아니다)`);
459
+ lines.push(`accepted-ledger: ${audit.ledger.status} ${audit.ledger.path}${audit.ledger.status === 'skipped' ? ' (원장 부재 — 원장 대조 미실시)' : ''}`);
460
+ lines.push(`remaining-baseline: ${audit.remainingBaseline.status} ${audit.remainingBaseline.path} (${audit.remainingBaseline.ids})`);
461
+ for (const problem of audit.problems) lines.push(`FAIL ${problem}`);
462
+ lines.push(audit.ok ? 'census: PASS' : `census: FAIL (${audit.problems.length})`);
463
+ return lines.join('\n');
464
+ }
465
+
466
+ type CliOptions = {
467
+ tsv: string;
468
+ report: string;
469
+ accepted: string | null;
470
+ acceptedExplicit: boolean;
471
+ json: boolean;
472
+ writeRepairCard: boolean;
473
+ };
474
+
475
+ function parseArgs(argv: string[], cwd: string): CliOptions {
476
+ const options: CliOptions = {
477
+ tsv: resolve(cwd, CENSUS_TSV),
478
+ report: resolve(cwd, CENSUS_REPORT),
479
+ accepted: join(homedir(), DEFAULT_ACCEPTED),
480
+ acceptedExplicit: false,
481
+ json: false,
482
+ writeRepairCard: false,
483
+ };
484
+ for (let at = 0; at < argv.length; at += 1) {
485
+ const arg = argv[at]!;
486
+ const next = argv[at + 1];
487
+ if (arg === '--tsv' && next) {
488
+ options.tsv = resolve(cwd, next);
489
+ at += 1;
490
+ } else if (arg === '--report' && next) {
491
+ options.report = resolve(cwd, next);
492
+ at += 1;
493
+ } else if (arg === '--accepted' && next) {
494
+ options.acceptedExplicit = true;
495
+ options.accepted = next === 'none' ? null : resolve(cwd, next);
496
+ at += 1;
497
+ } else if (arg === '--json') {
498
+ options.json = true;
499
+ } else if (arg === '--write-repair-card') {
500
+ options.writeRepairCard = true;
501
+ } else {
502
+ throw new Error(`알 수 없는 인자: ${arg}`);
503
+ }
504
+ }
505
+ return options;
506
+ }
507
+
508
+ export function main(argv: string[] = process.argv.slice(2), cwd: string = process.cwd()): number {
509
+ let options: CliOptions;
510
+ try {
511
+ options = parseArgs(argv, cwd);
512
+ } catch (error) {
513
+ console.error(String(error instanceof Error ? error.message : error));
514
+ return 2;
515
+ }
516
+ for (const path of [options.tsv, options.report]) {
517
+ if (!existsSync(path)) {
518
+ console.error(`FAIL inputs: 필수 파일이 없다 — ${path}`);
519
+ return 2;
520
+ }
521
+ }
522
+ if (options.writeRepairCard) {
523
+ const rewritten = writeRepairCards(options.tsv);
524
+ process.stdout.write(`repair-card: ${rewritten}행 재계산 → ${options.tsv}\n`);
525
+ }
526
+ const acceptedIds = options.accepted ? readAcceptedIds(options.accepted) : null;
527
+ const remainingBaselinePath = resolve(cwd, DEFAULT_REMAINING_BASELINE);
528
+ const remainingBaselineIds = existsSync(remainingBaselinePath)
529
+ ? readFileSync(remainingBaselinePath, 'utf8').split(/\r?\n/).filter((line) => line.length > 0 && !line.startsWith('#'))
530
+ : null;
531
+ const audit = auditCensus({
532
+ tsvText: readFileSync(options.tsv, 'utf8'),
533
+ reportText: readFileSync(options.report, 'utf8'),
534
+ acceptedIds,
535
+ remainingBaselineIds,
536
+ remainingBaselinePath: DEFAULT_REMAINING_BASELINE,
537
+ ledgerPath: options.accepted ?? 'none',
538
+ ledgerRequired: options.acceptedExplicit && options.accepted !== null,
539
+ });
540
+ process.stdout.write(`${options.json ? JSON.stringify(audit, null, 2) : renderText(audit)}\n`);
541
+ return audit.ok ? 0 : 1;
542
+ }
543
+
544
+ if (import.meta.main) {
545
+ process.exit(main());
546
+ }