elanous 0.2.22 → 0.2.23
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.
- package/NOTICE +7 -0
- package/README.md +32 -22
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/{119fc678.6f591cdb84ca5791.js → 0673cc54.8e2ef1c23e49e190.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{a9f2b54d-40c16bd0efdb04b8.js → 0a09e062-34f747a17d8d8c2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{f8626309.a4e5d362b1d55e59.js → 0e3acd34.d42b2ef87fdf4234.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{7175-350f4ce2873bc038.js → 1325-dc3f3c21eb181cb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +34 -0
- package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.8e6c5f6e744fcd9f.js → 1505.5826671109111e75.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7327-2d69fb321ba73389.js → 1669-da843ed73aa301f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +36 -0
- package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +122 -0
- package/apps/pwa/out/_next/static/chunks/2528.0af5c0e1fad88df6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/272-b23d2e92161d11fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7899.597af4a9996c907f.js → 2721.bc9a8f36bd85c07a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +149 -0
- package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3961-fbef064c213b2b18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +309 -0
- package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d70879db.c66c56a95a91efc6.js → 4c5e95ce.83e9b16add6fcd8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6158.566c890adc06a459.js → 5313.1697309c532b9856.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{79b78388.663188133449d707.js → 53746282.1be36038d1abd949.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5578.ac963634373b28c6.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5967-c0a80f8ffe5d4050.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1268.0840ff91e083fcbd.js → 5974.360f8441eb0ac1ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +74 -0
- package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6571-926ddf024a6ad5df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +64 -0
- package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9832.2ab2e818013574c7.js → 6702.ebbd165d5e4a4a14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6110.1297d4093fdfbb0d.js → 740.90b31555290236a9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{9070.067c106528ec1ae6.js → 7518.49161e8f5814abdb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +27 -0
- package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +115 -0
- package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7905.b230b9d06cb4ad5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8194.484f51e273d9abd2.js → 8264.00e434fbd02e9311.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{088d8e8a.8069543d082bec12.js → 83cfc5c8.349535543c1548b6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{1948.5f35b39eef222a94.js → 8438.ee7f0df3b3f6fcb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4588.ad3364cb7fb97ada.js → 8532.a86e99acf9b761cb.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/8569.b853a8daa8f31d12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8925-2abfb48af477fb7f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{88729267.9c6c000157c83f2f.js → 89849432.9eaa2f4c9c010965.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +90 -0
- package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +41 -0
- package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +287 -0
- package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +79 -0
- package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3522-1de1319d028ac89c.js → 9502-32c5dc22e8f120f5.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{7630.2b9a68659053ff4e.js → 9976.8f28864317639fe6.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d5341ac96203a983.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-0160ab83c8685a12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-55c631c032dcc47e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ad3bd8084048bee4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e6784759a2531031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5c5d0e370f495ef6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-c325e21543cd48a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-80ed511e02c81412.js → page-6168a7c43e6ef8f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-31417d3604154a6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-e9606dc0bdec9305.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-a648bc464c9dc754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25bb425afdb27541.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-32d72fdef1afe11a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27b794c8ba76bbb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-2bd9ce9c020d02d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a34096245e63b9f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-22170f4f00a15496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-4cc66d22ca4ec502.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83b14c729fcea837.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-6e2781c523dad761.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-26dd415c8f13f341.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-ccdb83ed40c8d724.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-7ad3de8fa06fdea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-015c02c4fec4023e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-6b0ae5b5c42f6d2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-786111f30b6f0969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-48fb31810693c357.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e17cce5e2ed0fee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-cb154acadb025414.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-16258e956ea93fc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-c2dd2b19c93f90ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-85f35dd1dd96ae87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-d3c007c8a0ddd7ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7837ce2aacb97b04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7350ee93f4fe1033.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-00723458575f2b19.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-745d9b6c015076f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-736d33c7414a8a1a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-119be9a0444d2482.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-fa806c018833e332.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-c782041b5f5199ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-d431fbdea6ad93dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-0c056abff82b9891.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-242d668e4fbf72c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-847c3de6ca8a4416.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-81dd0d8ae923ed72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-74e69ba2c8e970d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-70038f41ae7cf931.js +1 -0
- package/apps/pwa/out/_next/static/chunks/b4e12462-5fab4a813a63dadd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f6b7c9ba.64a895b8b2fedbdc.js → ce383d63.d2ede338788ed18e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{framework-5c169757551134ed.js → framework-b2763b10dc6b3836.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +1 -0
- package/apps/pwa/out/_next/static/css/5619d59e87eddf66.css +1 -0
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +1 -0
- package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → rfkMm4movqkqMebBrCXiR}/_buildManifest.js +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +24 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +24 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/catalog/models/anthropic/claude-haiku-5-5.yaml +32 -0
- package/catalog/models/anthropic/claude-opus-5-5.yaml +5 -0
- package/catalog/models/anthropic/claude-sonnet-5-5.yaml +31 -0
- package/catalog/models/anthropic/claude-sonnet-5.yaml +8 -2
- package/catalog/models/openai/gpt-6-astra.yaml +6 -0
- package/catalog/models/openai/gpt-6-luna.yaml +6 -0
- package/catalog/models/openai/gpt-6-sol.yaml +6 -0
- package/graphs/log-horizon/log-horizon-watch.yaml +25 -0
- package/graphs/log-horizon/recipes.yaml +3 -0
- package/graphs/release/recipes.yaml +1 -1
- package/graphs/release/release-loop.yaml +6 -2
- package/graphs/release-rehearsal/recipes.yaml +12 -0
- package/graphs/release-rehearsal/release-rehearsal.yaml +17 -0
- package/package.json +4 -1
- package/scripts/bench-report.ts +82 -3
- package/scripts/ci-typecheck-changed.ts +10 -1
- package/scripts/hq/hq-fence-wrapper.sh +148 -0
- package/scripts/lib/typecheck-ratchet.ts +51 -0
- package/scripts/openai-relay-server.ts +5 -1
- package/scripts/release-loop/docs-node.ts +258 -43
- package/scripts/release-loop/gate-method.ts +59 -0
- package/scripts/release-loop/gate-node.ts +73 -7
- package/scripts/release-loop/gate-wall.ts +208 -0
- package/scripts/release-loop/known-issues-node.ts +53 -8
- package/scripts/release-loop/publish-at.ts +14 -0
- package/scripts/release-loop/publish-node.ts +17 -2
- package/scripts/release-loop/resume-release.ts +34 -4
- package/scripts/release-loop/resume.ts +53 -0
- package/scripts/release-loop/shard-plan.ts +3 -11
- package/scripts/release-loop/tui-node-checks.ts +22 -0
- package/scripts/release-loop/unattended-release.ts +8 -1
- package/scripts/rhythm/daily.ts +51 -2
- package/scripts/rhythm/weekly.ts +3 -2
- package/scripts/tsc-main-safety-net.ts +189 -0
- package/scripts/usage-rollup.ts +8 -4
- package/src/acp/codex-plugins.ts +48 -6
- package/src/agent/monad-agent-turn.ts +67 -5
- package/src/agent/run-context.ts +10 -0
- package/src/agent/tool-profile.ts +28 -2
- package/src/agent-mission/acp-judge.ts +8 -2
- package/src/agent-mission/capabilities-cli.ts +16 -1
- package/src/agent-mission/driver.ts +1 -1
- package/src/agent-mission/pr-review-watch.ts +6 -2
- package/src/agent-mission/review-loop.ts +33 -5
- package/src/agent-substrate/acp-reviewer.ts +17 -8
- package/src/agent-substrate/pr-reviewer.ts +164 -28
- package/src/agent-substrate/review-intent.ts +6 -4
- package/src/agent-substrate/self-review-cli.ts +111 -16
- package/src/agent-substrate/shard-boundary-intent.ts +92 -26
- package/src/ask-user-question/pending-questions.ts +8 -2
- package/src/autopilot/build/llm-conflict-merge.ts +216 -12
- package/src/autopilot/codebase-grounding.ts +44 -0
- package/src/autopilot/llm-control-brain.ts +13 -1
- package/src/autopilot/mission-codebase-gate.ts +8 -77
- package/src/autopilot/pr-manager.ts +12 -3
- package/src/boot/acp-server.ts +4 -7
- package/src/boot/acp-socket-path.ts +7 -0
- package/src/briefing/brief-items.ts +21 -13
- package/src/chat/index.ts +12 -3
- package/src/cli/agent-cli.ts +20 -0
- package/src/cli/brief-cli.ts +27 -21
- package/src/cli/cli-user-error.ts +9 -2
- package/src/cli/log-event-names.ts +3 -0
- package/src/cli/logs-cli.ts +1 -0
- package/src/cli/mcp-login.ts +111 -37
- package/src/cli/plugin-cli.ts +21 -1
- package/src/cli/pod-cli.ts +26 -0
- package/src/cli/pr-cli.ts +30 -2
- package/src/cli/pr-land-overlap-evidence.ts +131 -0
- package/src/cli/release-cli.ts +53 -11
- package/src/cli/self-update.ts +173 -10
- package/src/cli/skills-cli.ts +12 -3
- package/src/cli/tasks-cli.ts +133 -27
- package/src/context-bus/context-first.ts +51 -2
- package/src/context-bus/context-now-surfaces.ts +13 -2
- package/src/context-bus/long-term-memory.ts +3 -1
- package/src/context-bus/nightly-condense.ts +3 -2
- package/src/core-turn/run-goal-loop.ts +86 -2
- package/src/dashboard/chat-fold.ts +20 -0
- package/src/dashboard/first-screen-band.ts +151 -1
- package/src/dashboard/index.ts +27 -5
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -3
- package/src/dashboard/stale-install-check.ts +13 -2
- package/src/dashboard/turn-stream-formatter.ts +25 -0
- package/src/debug/log-diet.ts +159 -0
- package/src/debug/log.ts +52 -17
- package/src/display/coordinator.ts +25 -2
- package/src/domains/coo-admin-tool.ts +27 -0
- package/src/domains/cron-match.ts +1 -0
- package/src/domains/outbound-alert.ts +17 -6
- package/src/domains/release-tool.ts +119 -10
- package/src/domains/schedule-registry.ts +10 -7
- package/src/domains/schedule-runner.ts +1 -0
- package/src/elanous-config-dir.ts +2 -2
- package/src/elanous-daemon.ts +3 -3
- package/src/execution-loop/launch-gate.ts +1 -1
- package/src/expression/i18n/messages.en.ts +5 -0
- package/src/expression/i18n/messages.ja.ts +5 -0
- package/src/expression/i18n/messages.ko.ts +5 -0
- package/src/expression/i18n/messages.zh.ts +5 -0
- package/src/expression/i18n/types.ts +8 -0
- package/src/github/pr-labels.ts +1 -0
- package/src/graph-runner/runner.ts +54 -5
- package/src/harness/dispatch-backpressure.ts +259 -0
- package/src/harness/harness-cli-command.ts +107 -28
- package/src/harness/harness-seams.ts +2 -20
- package/src/harness/harness-substrate-default.ts +72 -1
- package/src/harness/nested-elanous-policy.ts +4 -2
- package/src/hq/fence-wrapper.ts +7 -0
- package/src/hq/hq.ts +33 -2
- package/src/hq/lease.ts +13 -0
- package/src/hq/seats.ts +114 -18
- package/src/index.ts +163 -64
- package/src/intake-plane/collect-github.ts +19 -1
- package/src/intake-plane/digest.ts +45 -20
- package/src/intake-plane/lens.ts +36 -8
- package/src/intelligence-map/model-alias.ts +6 -0
- package/src/intelligence-map/model-catalog.ts +41 -0
- package/src/knowledge/kgs/pack.ts +5 -2
- package/src/knowledge/kgs/sqlite-store.ts +15 -0
- package/src/knowledge/tools/knowledge-query.ts +20 -2
- package/src/knowledge/write.ts +234 -2
- package/src/llm/bedrock-provider.ts +175 -0
- package/src/llm/bedrock.ts +345 -0
- package/src/llm/provider-credentials.ts +3 -1
- package/src/llm.ts +306 -35
- package/src/loops/budget.ts +150 -0
- package/src/loops/orchestrator/seat-share.ts +6 -49
- package/src/loops/orchestrator/traffic.ts +5 -81
- package/src/market/signed-index.ts +42 -0
- package/src/mcp/mcp-oauth.ts +136 -17
- package/src/model-tier/llm-tier-map.ts +48 -4
- package/src/models/prompts.ts +22 -1
- package/src/mss/logging/horizon-watch.ts +168 -0
- package/src/mss/logging/log-store.ts +204 -15
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/consult-requests.ts +7 -10
- package/src/nexus/api/discord-trigger-bot.ts +6 -3
- package/src/nexus/api/error-reports.ts +30 -8
- package/src/nexus/api/http-server.ts +8 -0
- package/src/nexus/api/loop-resources.ts +42 -0
- package/src/nexus/api/outbound-report.ts +8 -3
- package/src/nexus/api/telegram-trigger-bot.ts +6 -3
- package/src/nexus/index.ts +10 -0
- package/src/nexus/outbound/format.ts +2 -0
- package/src/nexus/outbound/router.ts +198 -13
- package/src/oauth/codex-account-rotation.ts +16 -18
- package/src/oauth/codex-account-store.ts +134 -5
- package/src/oauth/fallback-chain.ts +28 -6
- package/src/onboarding.ts +2 -1
- package/src/plugins/adapters/claude-package.ts +4 -12
- package/src/plugins/core/capability-policy.ts +141 -0
- package/src/plugins/core/host.ts +21 -8
- package/src/plugins/core/manifest.ts +19 -2
- package/src/plugins/core/trust-store.ts +15 -0
- package/src/plugins/core/types.ts +12 -0
- package/src/plugins/install/market-fetch.ts +68 -16
- package/src/plugins/install/plugin-install.ts +187 -16
- package/src/plugins/maker/plugin-maker.ts +25 -20
- package/src/plugins/maker/wizard-generate.ts +16 -2
- package/src/policy/llm-policy.ts +14 -1
- package/src/process/pid-liveness.ts +1 -1
- package/src/prompt-cache/openai.ts +10 -6
- package/src/prompt-cache/openrouter.ts +94 -0
- package/src/prompt-enhance/enhance.ts +46 -5
- package/src/prompt-library/family-prompt-coverage.ts +1 -0
- package/src/prompt-library/universal-preamble.ts +2 -2
- package/src/registry/discovery/openrouter-live-resolve.ts +122 -0
- package/src/registry/loader.ts +6 -1
- package/src/release-loop/checklist.ts +24 -9
- package/src/release-loop/feature-store.ts +3 -0
- package/src/release-loop/gate-shards.ts +48 -4
- package/src/release-loop/landed-to-green.ts +81 -0
- package/src/release-loop/light-rc.ts +11 -1
- package/src/release-loop/merged-pr-checklist.ts +10 -0
- package/src/release-loop/placement.ts +91 -22
- package/src/release-loop/rehearsal.ts +317 -0
- package/src/release-loop/release-schedule.ts +13 -1
- package/src/release-loop/rubric-types.ts +1 -0
- package/src/release-loop/rubric.ts +2 -2
- package/src/retro/daily.ts +23 -9
- package/src/seat-loop/seat-loop.ts +34 -1
- package/src/seat-loop/traffic-signal.ts +44 -0
- package/src/self-dev/ask-launch-flow.ts +2 -2
- package/src/self-dev/dev-cli.ts +67 -3
- package/src/self-dev/dev-pipeline.ts +4 -6
- package/src/self-dev/draft-residue.ts +463 -0
- package/src/self-dev/draft-sweep.ts +151 -10
- package/src/self-dev/draft-triage-rules.ts +27 -1
- package/src/self-dev/launch-preflight-text.ts +549 -0
- package/src/self-dev/launch-preflight.ts +10 -545
- package/src/self-dev/orchestrate-cli.ts +57 -2
- package/src/self-dev/orchestrate-summary-line.ts +13 -0
- package/src/self-dev/orchestrate.ts +8 -135
- package/src/self-dev/review-provider-fallback.ts +115 -19
- package/src/self-dev/run-store.ts +1 -3
- package/src/self-dev/run-supervisor.ts +3 -22
- package/src/self-dev/run-types.ts +178 -0
- package/src/self-dev/shard-aggregate.ts +61 -13
- package/src/self-dev/shard-plan.ts +5 -1
- package/src/self-dev/shard-run.ts +23 -5
- package/src/self-dev/supervisor-verdict-edges.ts +2 -4
- package/src/self-implement/blocked-draft-policy.ts +3 -19
- package/src/self-implement/draft-on-stop-mode.ts +18 -0
- package/src/self-implement/follow-up-goals.ts +114 -38
- package/src/self-implement/gate-baseline-reap.ts +157 -0
- package/src/self-implement/gate-baseline.ts +78 -16
- package/src/self-implement/gate-cli.ts +12 -2
- package/src/self-implement/gate-remote.ts +17 -6
- package/src/self-implement/goal-author.ts +24 -4
- package/src/self-implement/goal-digest.ts +19 -0
- package/src/self-implement/graph-overlay-condition.ts +4 -0
- package/src/self-implement/headless-elanous-driver.ts +11 -9
- package/src/self-implement/host-regate.ts +120 -29
- package/src/self-implement/l8-merge-queue.ts +67 -5
- package/src/self-implement/merge-train.ts +131 -0
- package/src/self-implement/off-diff-evidence.ts +9 -0
- package/src/self-implement/orchestrator.ts +133 -16
- package/src/self-implement/review-finding-recurrence.ts +28 -0
- package/src/self-implement/rework-policy.ts +2 -1
- package/src/self-implement/round-summary-card.ts +63 -0
- package/src/self-implement/run-ledger.ts +4 -3
- package/src/self-implement/run-step-projection.ts +147 -0
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/seams.ts +36 -3
- package/src/self-implement/self-implement-cli.ts +3 -1
- package/src/self-implement/train-gate-remote.ts +158 -0
- package/src/session-runtime/index.ts +10 -1
- package/src/session-runtime/retry-api.ts +11 -1
- package/src/skills/gift-install.ts +119 -0
- package/src/skills/runner.ts +59 -2
- package/src/skills/skill-feedback.ts +31 -1
- package/src/skills/skill-tier.ts +1 -0
- package/src/smart-wizard/capability-index.ts +231 -0
- package/src/smart-wizard/rung.ts +74 -0
- package/src/steward/launch.ts +20 -9
- package/src/steward/triage.ts +4 -2
- package/src/storage/file-lock.ts +8 -1
- package/src/task-agent/actions.ts +4 -0
- package/src/task-agent/card-evidence.ts +59 -13
- package/src/task-agent/judge.ts +4 -3
- package/src/task-agent/land-worktree.ts +201 -0
- package/src/task-agent/live-move-history.ts +133 -0
- package/src/task-agent/live-moves.ts +106 -19
- package/src/task-agent/parent-host.ts +117 -8
- package/src/task-agent/rejudge-on-head.ts +297 -0
- package/src/task-agent/review-result-capture.ts +218 -0
- package/src/task-agent/shadow.ts +103 -7
- package/src/task-agent/task-hand.ts +136 -11
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +29 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +6 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +16 -2
- package/src/task-orchestrator/surfaces/pod-image-source.ts +212 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +93 -12
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +25 -2
- package/src/task-orchestrator/surfaces/pod-pool.ts +66 -14
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +259 -36
- package/src/task-orchestrator/surfaces/self-implement.ts +6 -2
- package/src/telegram-service.ts +5 -1
- package/src/telegram.ts +17 -4
- package/src/time/format.ts +13 -4
- package/src/tool-runtime/goal-author-runtime.ts +1 -0
- package/src/tool-runtime/self-cognition-catalog.ts +23 -0
- package/src/tool-runtime/self-cognition-runtimes.ts +2 -24
- package/src/user-config.ts +132 -24
- package/src/ux-sim/slash-menu-frames.ts +168 -0
- package/src/version/packed-revision.json +1 -1
- package/src/web-terminal/preview-tap-registry.ts +5 -2
- package/src/workflow-runtime/triggers/scheduler.ts +1 -0
- package/apps/pwa/out/_next/static/chunks/1109.78a7a3288c0259d9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/115.1c6690b8604f81c4.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1262.76a3f08e67c5f816.js +0 -309
- package/apps/pwa/out/_next/static/chunks/1307-08b716476f1d50af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1358d292.5c87f12cad6eaa91.js +0 -122
- package/apps/pwa/out/_next/static/chunks/1438.27a1a7b8f2308004.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1442.02d85cd88f4c1eac.js +0 -79
- package/apps/pwa/out/_next/static/chunks/1501-1aad662d82ba43f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1584.9e2dd53da6e6d4b1.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1586.b989b0614afb77e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1609.2ad355062870151f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612-f6df0fc0eed7157b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923.37f1d5fe7ebe3860.js +0 -27
- package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993.3fd074a2a246234e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/211-9c9090c59e2c5907.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2140.d2daf9ee96e295d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2212.0359851457473efc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/224.583e562365a52f74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2328.0f37465646bafa7d.js +0 -36
- package/apps/pwa/out/_next/static/chunks/2372.bf71372184991937.js +0 -286
- package/apps/pwa/out/_next/static/chunks/2489-d238d3e2eb5b2bf5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2549-a8515c86f9e8cb96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2655.72cc6a97276c5acc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2743-ef6e8c3ced74cce5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2840-5458ad50c49cac6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2856.f75d5baef7f49b74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3344.0de4b0ec5a454b7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/335.a13f339e97893437.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3394.646348f34b2500be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3443.6276909b53d72d53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3495.abd4254d808bf2dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3721.ba5b82db0d9a5572.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3857-5985236d9307f676.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3919.9ff7dc25afefee33.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3998.bd9a69d9b50e9bd2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4003.ab6db1dc266576c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4144-fad095b48a1862ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4216.e8ac94b9fe6b96ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.c44dc2b55cb43ee5.js +0 -34
- package/apps/pwa/out/_next/static/chunks/4401.94257d497b6d26bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4559.17ca2cdbaa8d414f.js +0 -115
- package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4706.97e734bd4c9816ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4982.6e44352f751b9a1b.js +0 -77
- package/apps/pwa/out/_next/static/chunks/5342.49c5c5a530e62b50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5360-08a80abdf3a4da99.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5431.66c58ab1327ee0b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5633-d6852385000738ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5717.bcfcb96e701b82e0.js +0 -90
- package/apps/pwa/out/_next/static/chunks/5755-30d102586789bf7f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5957.3f1a4012388dd962.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5977-5b9e8a45a5b0c823.js +0 -1
- package/apps/pwa/out/_next/static/chunks/602.9bf02ac8e9502598.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6020.3a1b347e2d2dfacc.js +0 -8
- package/apps/pwa/out/_next/static/chunks/6375.fce1d174ba6d0324.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6546.92a828aef441271f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/658.957fdb0a8c6c6c8e.js +0 -287
- package/apps/pwa/out/_next/static/chunks/6706.323590aabb8b1293.js +0 -226
- package/apps/pwa/out/_next/static/chunks/6747.b67947f293a4c02d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6868.000b24a3045c5574.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6946.bba74e9c96050f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7033.a558f1b2f6912a53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7065.46029c26c53eac50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7087.6fae577d09249bc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/722.de8d9801e0f6d414.js +0 -41
- package/apps/pwa/out/_next/static/chunks/726.83532d69452ee24b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7497.57981e9d7a75a52a.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7672.4af122ad892117c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/771.6ab889a233e7dae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8096.f7da0776cfde6300.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8401-35e94e9091f5eb8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8769.815ca69879f608b4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/8857-aa1cc4ac90af4d40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8f835b4f.048eeb02299e3e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9068.5f2764fccf86c1b2.js +0 -93
- package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9247-55bcfbb0e8057f59.js +0 -1
- package/apps/pwa/out/_next/static/chunks/935.4ddaa99fc1d1126c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9451.ebfb0dcc9c02250f.js +0 -23
- package/apps/pwa/out/_next/static/chunks/9559.e648369b1d57cf9a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-88459e0903da2803.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-d85c43f46f58716b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-4e645600579ae952.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-87edbfd19117823b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7f0c2b7801ac6a54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-bf1f030a9d1adffd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-cbaf66b1e1804adf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-9f5610caaa06178c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-ec8f3575e339de74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-86d753e460f1a989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-4166a7d51cf0a57d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-2a19c5cd3b562580.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-b6a09cde2e07521a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-f7eae1518ca0c353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-456a8573ad811381.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8462d6a543cbb2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-2974cdfb87c0f9c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f927ffa25f3c86d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-abd86cd832aaa011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-79daf68f6256adaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8c3f168fc3f91939.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-786fb4504d0f2fa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-75209f14597dcb8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-bf30affe3a85af7e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1187a44b7515434b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-3d0910185a66ed54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f401ee1dd5a26e25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5dfe7604fd842784.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-76cf838050a8d681.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7ec8e289b4c14df6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-8c8ac17d52be2a79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-d359ab048d63a9d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-b8b345c880bf78d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-f151cc10ad026940.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9875f103057da433.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-9789328af9a9aa62.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bf495a1e284f4e00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a263d94bca4be22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-3962eab8ec58d16e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9abcfac07e02a542.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-bee49f927c333abb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-bac2d56dcb02d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-937cbcc13176295c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d09495594f7f480d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-69cb93d1a2e57e0e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-72ec543928d67c3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-82906eeda0186a7b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f6231284-45726550aba08fca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-f2b4016b9b981bc8.js +0 -1
- package/apps/pwa/out/_next/static/css/f2bd5257e6af88d8.css +0 -1
- /package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → rfkMm4movqkqMebBrCXiR}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { getDefaultLogStore } from '../mss/logging/log-store.js';
|
|
3
|
+
|
|
4
|
+
export type TrainCandidate = { number: number; head: string; files?: string[]; filesUnmeasured?: boolean };
|
|
5
|
+
export type TrainDeferred = { number: number; reason: 'overlap' | 'files-unknown'; with?: number[] };
|
|
6
|
+
export type TrainConflict = { number: number; reason: 'conflict'; files: string[] };
|
|
7
|
+
export type TrainIntegration = { commitSha?: string; conflicts: TrainConflict[]; unmeasured?: boolean };
|
|
8
|
+
export type TrainVerdict = { number: number; verdict: 'pass' | 'fail' | 'conflict' | 'unmeasured' };
|
|
9
|
+
export type TrainObservation = {
|
|
10
|
+
batch: number[];
|
|
11
|
+
deferred: TrainDeferred[] | null;
|
|
12
|
+
gatesRun: number;
|
|
13
|
+
passed: number[];
|
|
14
|
+
culprits: number[];
|
|
15
|
+
unmeasured: number[];
|
|
16
|
+
gatesPerLanding: number;
|
|
17
|
+
};
|
|
18
|
+
export type TrainGit = (args: readonly string[], repo: string) => { status: number | null; stdout: string; stderr: string };
|
|
19
|
+
|
|
20
|
+
export function planTrain(candidates: readonly TrainCandidate[], { maxBatch }: { maxBatch: number }): { batch: TrainCandidate[]; deferred: TrainDeferred[] } {
|
|
21
|
+
if (!Number.isSafeInteger(maxBatch) || maxBatch < 1) throw new Error('maxBatch must be a positive integer');
|
|
22
|
+
const batch: TrainCandidate[] = [];
|
|
23
|
+
const deferred: TrainDeferred[] = [];
|
|
24
|
+
for (const candidate of candidates) {
|
|
25
|
+
const unknown = candidate.filesUnmeasured || !candidate.files;
|
|
26
|
+
if (batch.length === 0) {
|
|
27
|
+
batch.push(candidate);
|
|
28
|
+
} else if (unknown || batch.some((item) => item.filesUnmeasured || !item.files)) {
|
|
29
|
+
deferred.push({ number: candidate.number, reason: 'files-unknown' });
|
|
30
|
+
} else {
|
|
31
|
+
const overlapping = batch.filter((item) => item.files!.some((file) => candidate.files!.includes(file))).map((item) => item.number);
|
|
32
|
+
if (overlapping.length) deferred.push({ number: candidate.number, reason: 'overlap', with: overlapping });
|
|
33
|
+
else if (batch.length < maxBatch) batch.push(candidate);
|
|
34
|
+
// A full batch leaves later candidates untouched for the next selection.
|
|
35
|
+
}
|
|
36
|
+
if (batch.length === maxBatch) break;
|
|
37
|
+
}
|
|
38
|
+
return { batch, deferred };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const defaultGit: TrainGit = (args, repo) => {
|
|
42
|
+
const result = spawnSync('git', [...args], { cwd: repo, encoding: 'utf8', timeout: 60_000, maxBuffer: 32 * 1024 * 1024 });
|
|
43
|
+
return { status: result.status, stdout: result.stdout ?? '', stderr: (result.stderr ?? '') + (result.error?.message ?? '') };
|
|
44
|
+
};
|
|
45
|
+
const SHA = /^[0-9a-f]{40,64}$/i;
|
|
46
|
+
|
|
47
|
+
/** Create unreachable synthetic merge commits only; never update refs or check out a tree. */
|
|
48
|
+
export function integrateTrain(repo: string, baseSha: string, batch: readonly TrainCandidate[], git: TrainGit = defaultGit): TrainIntegration {
|
|
49
|
+
if (!SHA.test(baseSha) || batch.some((item) => !SHA.test(item.head))) throw new Error('invalid pinned commit SHA');
|
|
50
|
+
let current = baseSha;
|
|
51
|
+
const conflicts: TrainConflict[] = [];
|
|
52
|
+
const run = (args: string[]) => git(args, repo);
|
|
53
|
+
for (const item of batch) {
|
|
54
|
+
const merge = run(['merge-tree', '--write-tree', '--name-only', '-z', current, item.head]);
|
|
55
|
+
if (merge.status !== 0) {
|
|
56
|
+
if (/unknown option|unrecognized option|unrecognized argument|invalid option|unknown switch|usage: git merge-tree/i.test(merge.stderr)) {
|
|
57
|
+
return { conflicts, unmeasured: true };
|
|
58
|
+
}
|
|
59
|
+
if (merge.status !== 1) throw new Error(`git merge-tree: ${merge.stderr || merge.stdout}`);
|
|
60
|
+
// -z --name-only: tree OID, conflicted paths, empty separator, informational messages.
|
|
61
|
+
const parts = merge.stdout.split('\0');
|
|
62
|
+
if (!SHA.test(parts[0] ?? '') || !parts.includes('')) throw new Error(`git merge-tree conflict output unavailable: ${merge.stderr}`);
|
|
63
|
+
const files = parts.slice(1, parts.indexOf('')).filter(Boolean);
|
|
64
|
+
if (!files.length) throw new Error(`git merge-tree failed without conflict paths: ${merge.stderr}`);
|
|
65
|
+
conflicts.push({ number: item.number, reason: 'conflict', files });
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const tree = merge.stdout.split('\0', 1)[0]?.trim();
|
|
69
|
+
if (!tree || !SHA.test(tree)) throw new Error('git merge-tree did not return a tree');
|
|
70
|
+
const commit = run(['-c', 'user.name=elanous shadow', '-c', 'user.email=shadow@localhost', 'commit-tree', tree, '-p', current, '-p', item.head, '-m', 'Integrate PR for merge train shadow evaluation']);
|
|
71
|
+
if (commit.status !== 0 || !SHA.test(commit.stdout.trim())) throw new Error(`git commit-tree: ${commit.stderr || commit.stdout}`);
|
|
72
|
+
current = commit.stdout.trim();
|
|
73
|
+
}
|
|
74
|
+
return { commitSha: current, conflicts };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function runTrain(batch: readonly TrainCandidate[], deps: {
|
|
78
|
+
integrate: (batch: readonly TrainCandidate[]) => TrainIntegration | Promise<TrainIntegration>;
|
|
79
|
+
gate: (commitSha: string, prNumbers: number[]) => 'pass' | 'fail' | 'unmeasured' | Promise<'pass' | 'fail' | 'unmeasured'>;
|
|
80
|
+
deferred?: TrainDeferred[];
|
|
81
|
+
observe?: (data: TrainObservation) => void | Promise<void>;
|
|
82
|
+
}): Promise<{ verdicts: TrainVerdict[]; gatesRun: number; integrations: number }> {
|
|
83
|
+
const verdicts = new Map<number, TrainVerdict['verdict']>();
|
|
84
|
+
let gatesRun = 0;
|
|
85
|
+
let integrations = 0;
|
|
86
|
+
let stopped = false;
|
|
87
|
+
async function evaluate(group: readonly TrainCandidate[]): Promise<void> {
|
|
88
|
+
if (!group.length || stopped) return;
|
|
89
|
+
integrations++;
|
|
90
|
+
const integration = await deps.integrate(group);
|
|
91
|
+
if (integration.unmeasured || !integration.commitSha) {
|
|
92
|
+
stopped = true;
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const conflict of integration.conflicts) {
|
|
96
|
+
if (group.some((item) => item.number === conflict.number)) verdicts.set(conflict.number, 'conflict');
|
|
97
|
+
}
|
|
98
|
+
const remaining = group.filter((item) => !verdicts.has(item.number));
|
|
99
|
+
if (!remaining.length) return;
|
|
100
|
+
gatesRun++;
|
|
101
|
+
const result = await deps.gate(integration.commitSha, remaining.map((item) => item.number));
|
|
102
|
+
if (result === 'unmeasured') {
|
|
103
|
+
stopped = true;
|
|
104
|
+
} else if (result === 'pass' || remaining.length === 1) {
|
|
105
|
+
for (const item of remaining) verdicts.set(item.number, result);
|
|
106
|
+
} else {
|
|
107
|
+
const middle = Math.floor(remaining.length / 2);
|
|
108
|
+
await evaluate(remaining.slice(0, middle));
|
|
109
|
+
await evaluate(remaining.slice(middle));
|
|
110
|
+
// Neither half reproduces the failed combination: the combined train remains unresolved.
|
|
111
|
+
if (!stopped && remaining.every((item) => verdicts.get(item.number) === 'pass')) {
|
|
112
|
+
for (const item of remaining) verdicts.set(item.number, 'unmeasured');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
await evaluate(batch);
|
|
117
|
+
const ordered = batch.map((item): TrainVerdict => ({ number: item.number, verdict: verdicts.get(item.number) ?? 'unmeasured' }));
|
|
118
|
+
const passed = ordered.filter((item) => item.verdict === 'pass').map((item) => item.number);
|
|
119
|
+
const data: TrainObservation = {
|
|
120
|
+
batch: batch.map((item) => item.number), deferred: deps.deferred ?? null, gatesRun,
|
|
121
|
+
passed, culprits: ordered.filter((item) => item.verdict === 'fail' || item.verdict === 'conflict').map((item) => item.number),
|
|
122
|
+
unmeasured: ordered.filter((item) => item.verdict === 'unmeasured').map((item) => item.number),
|
|
123
|
+
gatesPerLanding: gatesRun / Math.max(passed.length, 1),
|
|
124
|
+
};
|
|
125
|
+
await (deps.observe ?? ((entry: TrainObservation) => {
|
|
126
|
+
const store = getDefaultLogStore();
|
|
127
|
+
if (!store) throw new Error('merge-queue observation store unavailable');
|
|
128
|
+
store.insertBatch([{ rec: { ts: new Date().toISOString(), category: 'merge-queue', event: 'train-verdict', data: entry }, surface: 'merge-queue' }]);
|
|
129
|
+
}))(data);
|
|
130
|
+
return { verdicts: ordered, gatesRun, integrations };
|
|
131
|
+
}
|
|
@@ -416,6 +416,15 @@ export function renderRequiredEvidencePrompt(items: readonly RequiredEvidenceIte
|
|
|
416
416
|
];
|
|
417
417
|
}
|
|
418
418
|
|
|
419
|
+
/** 안 덮인 필수 증거만 자식에게 재요청한다. 판정은 coverRequiredEvidence의 태그 동등 규칙을 따른다. */
|
|
420
|
+
export function formatUncoveredEvidenceFeedback(uncovered: readonly string[]): string {
|
|
421
|
+
return [
|
|
422
|
+
`필수 증거가 아직 안 덮였습니다: ${uncovered.map((tag) => `[${tag}]`).join(', ')}`,
|
|
423
|
+
...uncovered.map((tag) => `- [${tag}]에 쓸 줄 꼴:\n EVIDENCE: [${tag}] <확인한 내용> || <재현 명령>\n RESULT: <그 명령의 실제 결과>`),
|
|
424
|
+
'확인한 결과만 보고하고, git/PR 조작은 하지 마라.',
|
|
425
|
+
].join('\n');
|
|
426
|
+
}
|
|
427
|
+
|
|
419
428
|
/** 요구 ↔ 자식이 남긴 증거의 **태그 동등** 대조. ⛔ 문면 해석 금지.
|
|
420
429
|
* 선언 덮임은 별도 값이다. 기존 `covered`/`missing`은 실제 증거 태그 기준으로 보존한다. */
|
|
421
430
|
export function coverRequiredEvidence(
|
|
@@ -31,7 +31,7 @@ export {
|
|
|
31
31
|
type PrEvidenceInput,
|
|
32
32
|
} from './pr-evidence-artifact.js';
|
|
33
33
|
import { judgePredictionAccuracy } from './judge-prediction-accuracy.js';
|
|
34
|
-
import { measureReviewFindingRecurrence, type ReviewFindingRecurrence } from './review-finding-recurrence.js';
|
|
34
|
+
import { classifyPodReviewBudgetResidue, measureReviewFindingRecurrence, type ReviewFindingRecurrence } from './review-finding-recurrence.js';
|
|
35
35
|
import { createHash } from 'node:crypto';
|
|
36
36
|
import { appendFileSync, copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync } from 'node:fs';
|
|
37
37
|
import { writeGoalDocumentAtomic } from './goal-document-write.js';
|
|
@@ -64,7 +64,7 @@ import { GoalRunStore, insertGoalRunRecord, type GoalPriorRuns } from './goal-ru
|
|
|
64
64
|
import { writeGoalRunRecordFragment } from './goal-execution-records.js';
|
|
65
65
|
import { getUserConfig } from '../user-config.js';
|
|
66
66
|
import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
|
|
67
|
-
import { classifyMergeHoldStop, forgetRunStop, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
67
|
+
import { classifyMergeHoldStop, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
68
68
|
import { autohealFromStop, parseAutohealMode, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
|
|
69
69
|
import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
|
|
70
70
|
import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
|
|
@@ -108,7 +108,7 @@ import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
|
108
108
|
import { addNextMdReleaseNote, harnessReleaseNote, parseReleaseNoteSection, releaseNotesDir, renderReleaseNoteSection, writeReleaseNote, type ReleaseNoteFragment, type ReleaseNoteSection } from '../release-loop/release-note.js';
|
|
109
109
|
import { landingFreezeMessage } from '../release-loop/landing-freeze.js';
|
|
110
110
|
import { admitLandingMerge, owningRepoRoot } from './frozen-merges.js';
|
|
111
|
-
import { recordFollowUpOnMerge, type FollowUpMergeInput, type FollowUpSeams } from './follow-up-goals.js';
|
|
111
|
+
import { recordFollowUpOnBlocked, recordFollowUpOnMerge, type FollowUpBlockedInput, type FollowUpMergeInput, type FollowUpSeams } from './follow-up-goals.js';
|
|
112
112
|
|
|
113
113
|
/** Merge result and exit stay untouched: a draft failure is one debug line. */
|
|
114
114
|
async function draftFollowUpAfterMerge(input: FollowUpMergeInput, followUp: FollowUpSeams | undefined): Promise<void> {
|
|
@@ -128,10 +128,29 @@ async function draftFollowUpAfterMerge(input: FollowUpMergeInput, followUp: Foll
|
|
|
128
128
|
debug.log('self-implement.follow-up', 'draft-failed', { prNumber: input.prNumber, error: error instanceof Error ? error.message : String(error) });
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
|
+
|
|
132
|
+
async function draftFollowUpAfterBlocked(input: FollowUpBlockedInput, followUp: FollowUpSeams | undefined): Promise<void> {
|
|
133
|
+
try {
|
|
134
|
+
await recordFollowUpOnBlocked(input, {
|
|
135
|
+
...(followUp ? {
|
|
136
|
+
...(followUp.mode ? { mode: followUp.mode } : {}),
|
|
137
|
+
...(followUp.readDrafts ? { readDrafts: followUp.readDrafts } : {}),
|
|
138
|
+
...(followUp.appendDraft ? { appendDraft: followUp.appendDraft } : {}),
|
|
139
|
+
...(followUp.enqueue ? { enqueue: followUp.enqueue } : {}),
|
|
140
|
+
...(followUp.cellOwner ? { cellOwner: followUp.cellOwner } : {}),
|
|
141
|
+
...(followUp.stateRoot ? { stateRoot: followUp.stateRoot } : {}),
|
|
142
|
+
} : {}),
|
|
143
|
+
log: (category, event, data) => { debug.log(category, event, data); },
|
|
144
|
+
});
|
|
145
|
+
} catch (error) {
|
|
146
|
+
debug.log('self-implement.follow-up', 'draft-failed', { ending: 'blocked', runId: input.runId, prNumber: input.prNumber ?? 0, stage: input.stage, error: error instanceof Error ? error.message : String(error) });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
131
149
|
import { plannedSelfImplBranch } from '../harness/worktree-branch-prefix.js';
|
|
132
150
|
export { slugifyFeature } from '../harness/worktree-branch-prefix.js';
|
|
133
151
|
import { AUTO_REVIEW_LABEL, resolveAutoReviewLabels } from './context-capsule.js';
|
|
134
152
|
import { GOAL_TYPES, extractVerbatimOriginalAsk, leadingGoalMetadata, parseAskFile, parseGoalType, type GoalType } from './goal-author.js';
|
|
153
|
+
import { renderRoundSummaryCard, type RoundSummaryEntry } from './round-summary-card.js';
|
|
135
154
|
import { resolveAdaptiveMaxReworkDecision, resolveEscalateTier, resolveEscalateTarget, buildReworkFeature, failIndicator, isRepeatedUnverifiedOnlyGateFailure, unverifiedRepeatKey, appendReworkHistory, truncateReworkHistoryByItem, applyReworkBudgetDecision, parseContractConflictRelaxation, parseReworkBudgetDecision, resolveReworkBudgetCarry, stripReworkBudgetHeaders, countConsecutiveMustFixIds, mergeReworkNotes, resolveReworkKind, type ReworkPlanRevision, type ReworkNotePart } from './rework-policy.js';
|
|
136
155
|
import type { SupervisionReworkSource } from './supervision-vocabulary.js';
|
|
137
156
|
import { classifyReworkBudgetShadow } from './classify-shadow.js';
|
|
@@ -139,7 +158,7 @@ import { createReworkBudgetJudgment, REWORK_BUDGET_JUDGMENT, reworkBudgetEvidenc
|
|
|
139
158
|
import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
|
|
140
159
|
import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
|
|
141
160
|
import { resolveRunOutcome } from './run-outcome.js';
|
|
142
|
-
import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, runRequiredEvidenceChecks, coverRequiredEvidence, type OffDiffEvidenceParse } from './off-diff-evidence.js';
|
|
161
|
+
import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, runRequiredEvidenceChecks, coverRequiredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
|
|
143
162
|
import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
|
|
144
163
|
import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
|
|
145
164
|
|
|
@@ -817,6 +836,11 @@ function revertGuardTargetPaths(feature: string, goalDocument?: string): string[
|
|
|
817
836
|
return [...new Set([...declaredRevertGuardPaths(feature), ...(originalAsk ? declaredRevertGuardPaths(originalAsk) : [])])];
|
|
818
837
|
}
|
|
819
838
|
|
|
839
|
+
/** 하니스가 작업 트리에 잠깐 쓰는 임시물 — 범위 판정·결정 카드에서 뺀다. */
|
|
840
|
+
export function isHarnessTempArtifact(file: string): boolean {
|
|
841
|
+
return /(^|\/)\.elanous-typecheck-scope-[^/]+\.json$/.test(file);
|
|
842
|
+
}
|
|
843
|
+
|
|
820
844
|
export function detectDeclaredScopeDiff(input: {
|
|
821
845
|
goalDocument?: string | null;
|
|
822
846
|
changedFiles?: readonly string[] | null;
|
|
@@ -4868,6 +4892,7 @@ async function runSelfImplementInner(
|
|
|
4868
4892
|
// ⛔ 승격이 꺼져 있으면 «심지 않는다» — 그러면 예산 관측도 안 난다(운영 원장이 오늘과 같다).
|
|
4869
4893
|
if (graphAuthority.enabled) onGraphTemplateResolved(graphTemplate);
|
|
4870
4894
|
// ⛔ 선택을 «전부» 싣는다 — 얹힌 것만 실으면 「왜 안 얹혔나」를 사후에 못 묻는다.
|
|
4895
|
+
let reviewRepeat: number | undefined;
|
|
4871
4896
|
/** ⭐ ③ «다이나믹» — 라운드마다 runtime 오버레이를 다시 고른다.
|
|
4872
4897
|
* ⛔ **매번 «기준 선언»에서 다시 얹는다** — 이전 라운드 결과 위에 겹쳐 얹으면
|
|
4873
4898
|
* 「이 걸음을 무엇이 만들었나」가 «누적»이 되어 사후에 못 푼다.
|
|
@@ -4875,7 +4900,19 @@ async function runSelfImplementInner(
|
|
|
4875
4900
|
const applyRuntimeOverlays = (round: number): void => {
|
|
4876
4901
|
if (!graphAuthority.enabled) return;
|
|
4877
4902
|
// ⛔ 「지금 아는 것」만 준다 — 없는 값을 0 으로 지어내지 않는다(key-absent 가 그것을 말한다).
|
|
4878
|
-
|
|
4903
|
+
let stopClass: import('./run-stop.js').RunStopClass | undefined;
|
|
4904
|
+
try {
|
|
4905
|
+
const { runId } = identity ?? resolveRunIdentity({ explicit: opts.runId });
|
|
4906
|
+
const entries = loadRunLedger(runId);
|
|
4907
|
+
const lastStop = entries?.slice().reverse().find((entry) => entry.event === 'stop');
|
|
4908
|
+
if (lastStop && isRunStopClass(lastStop.data.class)) stopClass = readRunStopRecord(lastStop)?.class;
|
|
4909
|
+
} catch { /* Unreadable STOP-RECORD is unknown, not an invented class. */ }
|
|
4910
|
+
const runtimeOverlayState = {
|
|
4911
|
+
attempts: round,
|
|
4912
|
+
...(opts.goalId === undefined ? {} : { goal_id: opts.goalId }),
|
|
4913
|
+
...(stopClass === undefined ? {} : { stop_class: stopClass }),
|
|
4914
|
+
...(reviewRepeat === undefined ? {} : { review_repeat: reviewRepeat }),
|
|
4915
|
+
};
|
|
4879
4916
|
const decision = decideTemplate({
|
|
4880
4917
|
goalType: graphGoalType,
|
|
4881
4918
|
authority: graphAuthority,
|
|
@@ -5210,6 +5247,7 @@ async function runSelfImplementInner(
|
|
|
5210
5247
|
let offDiffEvidence: OffDiffEvidenceParse = { items: [], discardedMissingVerify: 0, discardedEmptyClaim: 0, missingResult: 0, orphanResult: 0, truncatedResult: 0, anchoredEvidence: 0 };
|
|
5211
5248
|
let evidenceSource: 'diff-added-lines' | 'harvested' | 'summary-tail' = 'summary-tail';
|
|
5212
5249
|
// ⛔⭐ 하니스가 센 증거 충족도 — **로그에만 남기면 판정자가 못 본다**(원장 `JDG-S4`·`JDG-S5`).
|
|
5250
|
+
let uncoveredFeedbackUsed = false;
|
|
5213
5251
|
let evidenceCoverage: {
|
|
5214
5252
|
required: number;
|
|
5215
5253
|
covered: number;
|
|
@@ -5337,6 +5375,7 @@ async function runSelfImplementInner(
|
|
|
5337
5375
|
// 직전 gate 실패 라운드의 미검증 집합(정렬 키). 통과하면 비운다 — «연속» 반복만 센다.
|
|
5338
5376
|
let lastGateUnverifiedKey: string | undefined;
|
|
5339
5377
|
const reworkHistory: string[] = [];
|
|
5378
|
+
const roundSummaryEntries: RoundSummaryEntry[] = [];
|
|
5340
5379
|
const supervisorDecisionHistory: Array<{ round: number; verdict: ReworkBudgetVerdict; reason: string }> = [];
|
|
5341
5380
|
let judgedEffectiveMax: number | undefined;
|
|
5342
5381
|
let lastReworkVerdict: ReworkBudgetVerdict | undefined;
|
|
@@ -6100,7 +6139,7 @@ async function runSelfImplementInner(
|
|
|
6100
6139
|
'missing-cited-path': refutations.filter(({ kind }) => kind === 'missing-cited-path').length,
|
|
6101
6140
|
'found-cited-path': refutations.filter(({ kind }) => kind === 'found-cited-path').length,
|
|
6102
6141
|
});
|
|
6103
|
-
const acceptReviewBudget = async (unresolvedMustFix: readonly string[], hasNonReviewResidualWork: boolean) => {
|
|
6142
|
+
const acceptReviewBudget = async (unresolvedMustFix: readonly string[], hasNonReviewResidualWork: boolean, repeatedPod = false) => {
|
|
6104
6143
|
const decision = decideReworkSalvage({
|
|
6105
6144
|
hardCapBlockedExtend: false,
|
|
6106
6145
|
reviewBudgetExhausted: true,
|
|
@@ -6120,7 +6159,7 @@ async function runSelfImplementInner(
|
|
|
6120
6159
|
}, { level: 'warn' });
|
|
6121
6160
|
return { decision };
|
|
6122
6161
|
}
|
|
6123
|
-
const followUpMustFix = `\n\n## Follow-up must-fix (${decision.unresolvedMustFix.length})\n${decision.unresolvedMustFix.map((finding) => `- ${finding}`).join('\n')}`;
|
|
6162
|
+
const followUpMustFix = `\n\n## Follow-up must-fix (${decision.unresolvedMustFix.length})\n${decision.unresolvedMustFix.map((finding) => `- ${repeatedPod ? '[repeated] ' : ''}${finding}`).join('\n')}`;
|
|
6124
6163
|
const releaseNote = releaseNoteForRun(opts.goalFile, opts.feature);
|
|
6125
6164
|
// openPr's default seam delegates to PrManager.upsertPr, which stages, commits,
|
|
6126
6165
|
// and pushes this worktree after the note is written and before creating the PR.
|
|
@@ -6366,6 +6405,7 @@ async function runSelfImplementInner(
|
|
|
6366
6405
|
}
|
|
6367
6406
|
}
|
|
6368
6407
|
const before = effectiveMax;
|
|
6408
|
+
const gateBaselineOnly = baselineOnlyGate();
|
|
6369
6409
|
const budgetDecision = applyReworkBudgetDecision(
|
|
6370
6410
|
effectiveMax,
|
|
6371
6411
|
parsedDecision,
|
|
@@ -6374,7 +6414,13 @@ async function runSelfImplementInner(
|
|
|
6374
6414
|
priorHistory.length,
|
|
6375
6415
|
consecutiveUnresolvedBudget >= 2 ? false : shadowStop,
|
|
6376
6416
|
supervisorDecisionHistory.at(-1)?.verdict,
|
|
6417
|
+
gateBaselineOnly,
|
|
6377
6418
|
);
|
|
6419
|
+
if (reworkKind === 'gate' && parsedDecision?.verdict === 'SUFFICIENT' && gateBaselineOnly && budgetDecision.exit === 'proceed') {
|
|
6420
|
+
debug.log('self-implement.rework-budget', 'gate-sufficient-proceed', {
|
|
6421
|
+
runId, round, preexisting: gate!.baselineFailures!.filter(({ attribution }) => attribution === 'preexisting').length, introduced: 0,
|
|
6422
|
+
});
|
|
6423
|
+
}
|
|
6378
6424
|
effectiveMax = budgetDecision.effectiveMax;
|
|
6379
6425
|
if (parsedDecision) {
|
|
6380
6426
|
if (diagnosisRefutations) {
|
|
@@ -6575,12 +6621,14 @@ async function runSelfImplementInner(
|
|
|
6575
6621
|
if (isReviewRework(reworkKind)) {
|
|
6576
6622
|
if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
|
|
6577
6623
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', verdict: parsedDecision.verdict, reason: parsedDecision.reason, gate, decomposition: terminalDecomposition, salvageStatusExpected: false });
|
|
6624
|
+
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked', unresolvedMustFix: review?.mustFix, decompositionPieces: terminalDecomposition?.pieces?.map((p) => p.feature), feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
6578
6625
|
const quotaExhaustionAssessment = quotaExhaustionAssessmentForRun();
|
|
6579
6626
|
return { ok: false, node: 'rework', ...terminal, ...supervisorOutcome, sessionId, worktreePath: wt.path, branch: wt.branch, gate, review, quotaExhaustionAssessment, ...(lastSupervisorReason ? { supervisorReason: lastSupervisorReason } : {}), ...reviewBlockedResult(pr), detail: `${blockedDraftPrFailure ? `${blockedDraftPrFailure}; ` : ''}rework judged unconvergeable after ${round} rework round(s): ${parsedDecision.reason}` };
|
|
6580
6627
|
}
|
|
6581
6628
|
const baselineStop = noRetryBaseline();
|
|
6582
6629
|
const reason = baselineStop.terminationReason ?? parsedDecision.reason;
|
|
6583
6630
|
const pr = await preserveBlockedArtifacts({ stage: 'gate-failed', verdict: parsedDecision.verdict, reason, gate, decomposition: terminalDecomposition, salvageStatusExpected: false });
|
|
6631
|
+
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'gate-failed', decompositionPieces: terminalDecomposition?.pieces?.map((p) => p.feature), feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
6584
6632
|
const quotaExhaustionAssessment = quotaExhaustionAssessmentForRun();
|
|
6585
6633
|
return { ok: false, stage: 'gate-failed', node: 'rework', ...terminal, ...supervisorOutcome, ...baselineStop, sessionId, worktreePath: wt.path, branch: wt.branch, gate, quotaExhaustionAssessment, ...(lastSupervisorReason ? { supervisorReason: lastSupervisorReason } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: baselineStop.terminationReason ?? `rework judged unconvergeable after ${round} rework round(s): ${parsedDecision.reason}` };
|
|
6586
6634
|
}
|
|
@@ -6604,10 +6652,12 @@ async function runSelfImplementInner(
|
|
|
6604
6652
|
if (isReviewRework(reworkKind)) {
|
|
6605
6653
|
if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
|
|
6606
6654
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', verdict: lastReworkVerdict, reason, gate, salvageStatusExpected: false });
|
|
6655
|
+
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked', unresolvedMustFix: review?.mustFix, feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
6607
6656
|
return { ok: false, node: 'rework', ...terminal, sessionId, worktreePath: wt.path, branch: wt.branch, gate, review, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(lastSupervisorVerdict === 'CONTRACT-CONFLICT' ? { supervisorVerdict: lastSupervisorVerdict } : {}), ...reviewBlockedResult(pr), detail: blockedDraftPrFailure ?? reason };
|
|
6608
6657
|
}
|
|
6609
6658
|
const baselineStop = noRetryBaseline();
|
|
6610
6659
|
const pr = await preserveBlockedArtifacts({ stage: 'gate-failed', verdict: lastReworkVerdict, reason: baselineStop.terminationReason ?? reason, gate, salvageStatusExpected: false });
|
|
6660
|
+
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'gate-failed', feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
6611
6661
|
return { ok: false, stage: 'gate-failed', node: 'rework', ...terminal, ...baselineStop, sessionId, worktreePath: wt.path, branch: wt.branch, gate, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(lastSupervisorVerdict === 'CONTRACT-CONFLICT' ? { supervisorVerdict: lastSupervisorVerdict } : {}), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: baselineStop.terminationReason ?? reason };
|
|
6612
6662
|
}
|
|
6613
6663
|
const terminal = resolveRunOutcome({ termination: 'budget-exhausted', ...(lastReworkVerdict ? { lastVerdict: lastReworkVerdict } : {}) });
|
|
@@ -6620,14 +6670,38 @@ async function runSelfImplementInner(
|
|
|
6620
6670
|
if (isReviewRework(reworkKind)) {
|
|
6621
6671
|
if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
|
|
6622
6672
|
const reason = `review must-fix unresolved after ${round - 1} rework round(s)`;
|
|
6623
|
-
|
|
6624
|
-
|
|
6625
|
-
|
|
6673
|
+
const podResidue = podReviewBlockedDraft
|
|
6674
|
+
? classifyPodReviewBudgetResidue(currentBlockingFindings, previousBlockingFindings)
|
|
6675
|
+
: undefined;
|
|
6676
|
+
// ⛔ 사양 v2(OP 18:1x (a)): Pod 는 «전부 내용 해시(id) 반복»일 때만 수락한다 — 키로만 반복된 지적은 draft.
|
|
6677
|
+
// 수락은 draft→non-draft ⊕ followUpMustFix 기록까지다. 병합 판단은 언제나 hitl(자동 병합 없음 · #25941
|
|
6678
|
+
// `review-warn-with-must-fix` 와 같은 방향 — must-fix 가 남은 런은 어느 출구로도 자동 병합하지 않는다).
|
|
6679
|
+
const podAcceptable = podResidue?.status === 'all-repeated' && podResidue.keyOnlyRepeatedIds.length === 0;
|
|
6680
|
+
const podDecision = (accepted: boolean) => {
|
|
6681
|
+
if (!podResidue) return;
|
|
6682
|
+
debug.log('self-implement.review-budget', 'pod-accept-decision', {
|
|
6683
|
+
runId, status: podResidue.status, repeatedCount: podResidue.repeatedIds.length,
|
|
6684
|
+
newCount: podResidue.newIds.length, keyOnlyRepeatedCount: podResidue.keyOnlyRepeatedIds.length,
|
|
6685
|
+
accepted, merge: 'hitl',
|
|
6686
|
+
});
|
|
6687
|
+
};
|
|
6688
|
+
if (!podReviewBlockedDraft || podAcceptable) {
|
|
6626
6689
|
const acceptance = await acceptReviewBudget(
|
|
6627
6690
|
review?.mustFix ?? [],
|
|
6628
6691
|
reworkParts.some((part) => part.source === 'supervisor'),
|
|
6692
|
+
podReviewBlockedDraft,
|
|
6629
6693
|
);
|
|
6694
|
+
podDecision(acceptance.decision.action === 'accept');
|
|
6630
6695
|
if (acceptance.decision.action === 'accept') {
|
|
6696
|
+
if (podReviewBlockedDraft) {
|
|
6697
|
+
observe('merge-decision', {
|
|
6698
|
+
autoMerge: autoMergeEnabled(opts), reviewed: review?.reviewed === true, verdict: review?.verdict ?? 'none',
|
|
6699
|
+
decision: 'hitl', reason: 'review-budget-follow-up-required',
|
|
6700
|
+
mustFixCount: acceptance.decision.unresolvedMustFix.length,
|
|
6701
|
+
followUpMustFix: acceptance.decision.unresolvedMustFix,
|
|
6702
|
+
...(acceptance.pr ? { prNumber: acceptance.pr.number } : {}),
|
|
6703
|
+
});
|
|
6704
|
+
}
|
|
6631
6705
|
if (acceptance.pr) {
|
|
6632
6706
|
await draftFollowUpAfterMerge({
|
|
6633
6707
|
prNumber: acceptance.pr.number,
|
|
@@ -6656,7 +6730,7 @@ async function runSelfImplementInner(
|
|
|
6656
6730
|
detail: `${reason}; accepted with ${acceptance.decision.unresolvedMustFix.length} follow-up must-fix item(s)`,
|
|
6657
6731
|
};
|
|
6658
6732
|
}
|
|
6659
|
-
}
|
|
6733
|
+
} else podDecision(false);
|
|
6660
6734
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', reason, gate, salvageStatusExpected: true });
|
|
6661
6735
|
const salvage = blockedDraftNoChanges || blockedDraftPrFailure ? 'parked' : await salvageHardCap(canSalvage, pr);
|
|
6662
6736
|
const disposition = { ...terminal, ...(salvage ? { salvage } : {}) };
|
|
@@ -6689,9 +6763,20 @@ async function runSelfImplementInner(
|
|
|
6689
6763
|
}, { level: 'warn' });
|
|
6690
6764
|
}
|
|
6691
6765
|
}
|
|
6692
|
-
const
|
|
6693
|
-
? round0Feature
|
|
6766
|
+
const reworkFeature = round === 0 ? ''
|
|
6694
6767
|
: buildReworkFeature(opts.feature, round, effectiveMax, reworkPromptNote, stripReworkBudgetHeaders(diagnosis), appliedLastRound, refutableFindings, pendingPlanRevision, reworkKind, buildRefutationGuidance(), escalationJudgement);
|
|
6768
|
+
const card = round === 0 ? '' : renderRoundSummaryCard(roundSummaryEntries);
|
|
6769
|
+
const feature = round === 0 ? round0Feature : reworkFeature + (card ? `\n\n${card}` : '');
|
|
6770
|
+
if (card) {
|
|
6771
|
+
const latest = roundSummaryEntries[roundSummaryEntries.length - 1]!;
|
|
6772
|
+
const lastKey = latest.failedIds?.length ? JSON.stringify([...new Set(latest.failedIds)].sort()) : undefined;
|
|
6773
|
+
const repeatedWithRound = lastKey === undefined ? undefined : roundSummaryEntries.slice(0, -1)
|
|
6774
|
+
.find((entry) => entry.failedIds?.length && JSON.stringify([...new Set(entry.failedIds)].sort()) === lastKey)?.round;
|
|
6775
|
+
const omittedRounds = Number(/…\(앞 라운드 (\d+)개 생략\)/.exec(card)?.[1] ?? 0);
|
|
6776
|
+
observe('round-card', { round, entries: roundSummaryEntries.length, chars: card.length,
|
|
6777
|
+
...(repeatedWithRound === undefined ? {} : { repeatedWithRound }), omittedRounds,
|
|
6778
|
+
}, { category: 'self-dev.rework' });
|
|
6779
|
+
}
|
|
6695
6780
|
const refutationGuidanceEligible = round > 0 && refutableFindings.length > 0;
|
|
6696
6781
|
const dispatchedRefutationGuidance = refutationGuidancePresented(feature, refutationGuidanceEligible);
|
|
6697
6782
|
pendingPlanRevision = undefined;
|
|
@@ -7011,7 +7096,9 @@ async function runSelfImplementInner(
|
|
|
7011
7096
|
if (opts.goalFile) {
|
|
7012
7097
|
let goalDocument: string | undefined;
|
|
7013
7098
|
try { goalDocument = readFileSync(opts.goalFile, 'utf8'); } catch { /* unknown scope */ }
|
|
7014
|
-
|
|
7099
|
+
// 🩸 10-09: 범위 타입검사 임시 tsconfig(.elanous-typecheck-scope-*.json · scoped-typecheck-config.ts)가 옛 가지에 커밋된 뒤 지워지면
|
|
7100
|
+
// «추적 파일 삭제» 라 impact=critical → 결정 카드가 «irreversible» 로 대표에게 갔다(D-20·35·43·80). 하니스 임시물은 범위 판정 밖이다.
|
|
7101
|
+
const scope = detectDeclaredScopeDiff({ goalDocument, changedFiles: gateRouteFiles?.filter(file => !harnessSeededPaths.includes(file) && !isHarnessTempArtifact(file)), nameCap: gateRouteFiles?.length });
|
|
7015
7102
|
if (scope.status === 'known' && scope.outsideCount !== null && scope.outsideCount > 0) {
|
|
7016
7103
|
const result: ExecutionClarificationResult = await (s.askExecutionClarification ?? askAtExecution)({
|
|
7017
7104
|
id: 'execution_scope', decision: 'Changing files outside the authored target paths',
|
|
@@ -7272,6 +7359,10 @@ async function runSelfImplementInner(
|
|
|
7272
7359
|
return { ok: false, stage: 'gate-failed', node: 'rework', ...resolveRunOutcome({ termination: 'abandoned' }), sessionId, worktreePath: wt.path, branch: wt.branch, gate, quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(), ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
|
|
7273
7360
|
}
|
|
7274
7361
|
lastGateUnverifiedKey = unverifiedRepeatKey(gate.unverified);
|
|
7362
|
+
roundSummaryEntries.push({ round, kind: 'gate', tried: impl.summary.replace(/\s+/g, ' ').trim().slice(0, 200),
|
|
7363
|
+
failedIds: gate.baselineFailures?.map(({ name, file, attribution }) => `${name}@${file ?? '?'} (${attribution})`),
|
|
7364
|
+
filesTouched: gateRouteFiles,
|
|
7365
|
+
});
|
|
7275
7366
|
round++;
|
|
7276
7367
|
continue;
|
|
7277
7368
|
}
|
|
@@ -7425,7 +7516,11 @@ async function runSelfImplementInner(
|
|
|
7425
7516
|
...(review.failureReason !== undefined ? { failureReason: review.failureReason } : {}),
|
|
7426
7517
|
...(reviewArtifactPath ? { artifactPath: reviewArtifactPath } : {}),
|
|
7427
7518
|
});
|
|
7428
|
-
if (review.reviewed)
|
|
7519
|
+
if (review.reviewed) {
|
|
7520
|
+
reviewMustFixCountHistory.push(review.mustFix.length);
|
|
7521
|
+
// The next runtime overlay sees completed review rounds, not consecutive repeats of one finding.
|
|
7522
|
+
reviewRepeat = reviewMustFixCountHistory.length - 1;
|
|
7523
|
+
}
|
|
7429
7524
|
progress('reviewed', review.reviewed
|
|
7430
7525
|
? `리뷰: ${review.verdict} (must-fix ${review.mustFix.length}·should-fix ${review.shouldFix.length}) · 추이 ${reviewMustFixCountHistory.join('→')} (${reviewMustFixTrend()})`
|
|
7431
7526
|
: `리뷰 미실행${review.failureReason !== undefined ? ` (${review.failureReason})` : ''}`);
|
|
@@ -7555,6 +7650,9 @@ async function runSelfImplementInner(
|
|
|
7555
7650
|
break;
|
|
7556
7651
|
}
|
|
7557
7652
|
appliedLastRound = [...effectiveMustFix];
|
|
7653
|
+
roundSummaryEntries.push({ round, kind: 'review', tried: impl.summary.replace(/\s+/g, ' ').trim().slice(0, 200),
|
|
7654
|
+
failedIds: effectiveMustFix.map(stableMustFixId), filesTouched: runFacts.changedFiles,
|
|
7655
|
+
});
|
|
7558
7656
|
refutableFindings = reviewMustFixFindings.filter(({ item }) => effectiveMustFix.includes(item));
|
|
7559
7657
|
const reviewFindingKeys = effectiveMustFix
|
|
7560
7658
|
.map(reviewFindingKey)
|
|
@@ -7604,6 +7702,18 @@ async function runSelfImplementInner(
|
|
|
7604
7702
|
continue;
|
|
7605
7703
|
}
|
|
7606
7704
|
}
|
|
7705
|
+
if (gate.passed && autoMergeEnabled(opts) && evidenceCoverage?.uncoveredCount && !uncoveredFeedbackUsed && round < effectiveMax) {
|
|
7706
|
+
const uncovered = [...evidenceCoverage.uncovered];
|
|
7707
|
+
const nextRound = round + 1;
|
|
7708
|
+
setReworkPart('review', formatUncoveredEvidenceFeedback(uncovered));
|
|
7709
|
+
uncoveredFeedbackUsed = true;
|
|
7710
|
+
debug.log('self-implement.evidence', 'uncovered-feedback', { uncovered, round: nextRound });
|
|
7711
|
+
bufferPrComment(round, 'author', `Round ${round}: child implementation completed.`, [
|
|
7712
|
+
`Child completion: ${impl.summary.trim() || '(summary unavailable)'}`,
|
|
7713
|
+
]);
|
|
7714
|
+
round = nextRound;
|
|
7715
|
+
continue;
|
|
7716
|
+
}
|
|
7607
7717
|
bufferPrComment(round, 'author', `Round ${round}: child implementation completed.`, [
|
|
7608
7718
|
`Child completion: ${impl.summary.trim() || '(summary unavailable)'}`,
|
|
7609
7719
|
]);
|
|
@@ -7636,7 +7746,12 @@ async function runSelfImplementInner(
|
|
|
7636
7746
|
const { latestSignalIncomplete } = signalIncompleteState(roundClassifications);
|
|
7637
7747
|
const autoMerge = autoMergeEnabled(opts);
|
|
7638
7748
|
const gateTimeoutUnmeasured = isTimeoutOnlyUnmeasuredGate(gate.reflectGateFacts);
|
|
7639
|
-
|
|
7749
|
+
// ⛔⭐ AUTOMERGE-WARN-MUSTFIX(0.2.24): 판정이 warn 이어도 must-fix 가 «남아» 있으면 자동 병합하지 않는다.
|
|
7750
|
+
// 루프 «안»은 `verdict === 'fail'` 일 때만 재작업하므로, warn ⊕ must-fix≥1 은 루프를 그대로 빠져나와
|
|
7751
|
+
// 종전 `verdict !== 'fail'` 만 보던 이 자리에서 auto 가 됐다(#25914 · #25934 · #25918 실물).
|
|
7752
|
+
// ⭐ 반사가 must-fix 를 «전부» 기각하면 위에서 `review.mustFix = []` 로 비우므로 그 길은 종전 그대로다.
|
|
7753
|
+
const reviewMustFixCount = review?.mustFix?.length ?? 0;
|
|
7754
|
+
let canAuto = !gateTimeoutUnmeasured && autoMerge && reviewReal && review!.verdict !== 'fail' && reviewMustFixCount === 0 && reviewDiffComplete && !requiredEvidenceMissing && !latestSignalIncomplete && !decisionSignalRed;
|
|
7640
7755
|
// ⭐⭐ 통과의 «이유»를 둘로 가른다 — ⛔ 막지는 «않는다»(대표 판단 2026-08-11: ⓐ 문면만).
|
|
7641
7756
|
// 📏 근거(`JDG-T36` · merge-decision 300건 전수): `verifyByBreaking` 이 실린 8건의 auto 중 ***5건***이
|
|
7642
7757
|
// ***ran=true 인데 distinguishes=0***(아무것도 안 가르는 자기검증)이었고, 그 다섯이 «전부»
|
|
@@ -7655,6 +7770,7 @@ async function runSelfImplementInner(
|
|
|
7655
7770
|
: latestSignalIncomplete ? 'signal-incomplete'
|
|
7656
7771
|
: !reviewReal ? 'no-real-review'
|
|
7657
7772
|
: review!.verdict === 'fail' ? 'review-must-fix'
|
|
7773
|
+
: reviewMustFixCount > 0 ? 'review-warn-with-must-fix'
|
|
7658
7774
|
: review!.diffTruncated === true ? 'review-diff-truncated'
|
|
7659
7775
|
: 'review-diff-budget-unknown';
|
|
7660
7776
|
let mergeSkipReason = canAuto ? undefined : mergeReason;
|
|
@@ -7662,6 +7778,7 @@ async function runSelfImplementInner(
|
|
|
7662
7778
|
const mergeDecisionObservation = {
|
|
7663
7779
|
autoMerge, reviewed: reviewReal, verdict: review?.verdict ?? 'none',
|
|
7664
7780
|
decision: canAuto ? 'auto' : 'hitl', reason: mergeReason,
|
|
7781
|
+
mustFixCount: reviewMustFixCount,
|
|
7665
7782
|
...mergeDecisionEvidenceCoverage(evidenceCoverage),
|
|
7666
7783
|
...(evidenceCoverage ? {
|
|
7667
7784
|
evidenceSource,
|
|
@@ -41,6 +41,34 @@ export interface RecurrenceFinding {
|
|
|
41
41
|
readonly item: string;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/** Pod 리뷰 예산 소진 잔여 분류(FLEX-POD-ACCEPT-1).
|
|
45
|
+
* `repeatedIds` = 앞 라운드와 id(내용 해시) 또는 비지 않은 `reviewFindingKey` 가 같은 지적.
|
|
46
|
+
* `keyOnlyRepeatedIds` = 그중 «키로만» 반복된 것(문면이 달라 내용 해시는 다르다).
|
|
47
|
+
* ⛔ 사양 v2(OP 18:1x (a)): Pod 수락은 «전부 내용 해시 반복»일 때만 — 키로만 반복된 지적은 관측만 하고 수락 근거로 쓰지 않는다. */
|
|
48
|
+
export function classifyPodReviewBudgetResidue(
|
|
49
|
+
current: readonly RecurrenceFinding[] | undefined,
|
|
50
|
+
previous: readonly RecurrenceFinding[] | undefined,
|
|
51
|
+
): { status: 'all-repeated' | 'has-new' | 'unmeasured'; repeatedIds: string[]; newIds: string[]; keyOnlyRepeatedIds: string[] } {
|
|
52
|
+
if (!previous?.length || !current?.length) return { status: 'unmeasured', repeatedIds: [], newIds: [], keyOnlyRepeatedIds: [] };
|
|
53
|
+
const previousIds = new Set(previous.map(({ id }) => id));
|
|
54
|
+
const previousKeys = new Set(previous.map(({ item }) => reviewFindingKey(item).key).filter(Boolean));
|
|
55
|
+
const repeatedIds: string[] = [];
|
|
56
|
+
const newIds: string[] = [];
|
|
57
|
+
const keyOnlyRepeatedIds: string[] = [];
|
|
58
|
+
for (const { id, item } of current) {
|
|
59
|
+
if (previousIds.has(id)) {
|
|
60
|
+
repeatedIds.push(id);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const key = reviewFindingKey(item).key;
|
|
64
|
+
if (key !== '' && previousKeys.has(key)) {
|
|
65
|
+
repeatedIds.push(id);
|
|
66
|
+
keyOnlyRepeatedIds.push(id);
|
|
67
|
+
} else newIds.push(id);
|
|
68
|
+
}
|
|
69
|
+
return { status: newIds.length ? 'has-new' : 'all-repeated', repeatedIds, newIds, keyOnlyRepeatedIds };
|
|
70
|
+
}
|
|
71
|
+
|
|
44
72
|
export interface AcceptedRefutationHistory {
|
|
45
73
|
/** 반박이 수용되어 앞 라운드에 기각된 stable must-fix ID. */
|
|
46
74
|
readonly acceptedRefutationFindingIds?: readonly string[];
|
|
@@ -459,6 +459,7 @@ export function applyReworkBudgetDecision(
|
|
|
459
459
|
priorRounds = Number.POSITIVE_INFINITY,
|
|
460
460
|
shadowStop = false,
|
|
461
461
|
previousVerdict?: ReworkBudgetVerdict,
|
|
462
|
+
gateBaselineOnly?: boolean,
|
|
462
463
|
): { effectiveMax: number; stop: boolean; exit: 'continue' | 'proceed' | 'blocked'; applied: boolean; shadowed?: boolean; wouldExit?: 'proceed' | 'blocked'; contractConflictDisposition?: ContractConflictDisposition } {
|
|
463
464
|
const cap = Math.max(0, hardCap);
|
|
464
465
|
const normalizedMax = Math.min(cap, Math.max(0, effectiveMax));
|
|
@@ -482,7 +483,7 @@ export function applyReworkBudgetDecision(
|
|
|
482
483
|
return { effectiveMax: extendedMax, stop: false, exit: 'continue', applied: extendedMax > normalizedMax };
|
|
483
484
|
}
|
|
484
485
|
if (decision.verdict === 'SUFFICIENT') {
|
|
485
|
-
if (kind !== 'review') return { effectiveMax: normalizedMax, stop: false, exit: 'continue', applied: false };
|
|
486
|
+
if (kind !== 'review' && !(kind === 'gate' && gateBaselineOnly === true)) return { effectiveMax: normalizedMax, stop: false, exit: 'continue', applied: false };
|
|
486
487
|
return shadowStop
|
|
487
488
|
? { effectiveMax: normalizedMax, stop: false, exit: 'continue', applied: false, shadowed: true, wouldExit: 'proceed' }
|
|
488
489
|
: { effectiveMax: normalizedMax, stop: true, exit: 'proceed', applied: true };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface RoundSummaryEntry {
|
|
2
|
+
/** The round whose result this entry records; zero is the first implementation. */
|
|
3
|
+
round: number;
|
|
4
|
+
kind: 'gate' | 'review';
|
|
5
|
+
tried?: string;
|
|
6
|
+
failedIds?: readonly string[];
|
|
7
|
+
filesTouched?: readonly string[];
|
|
8
|
+
rung?: string;
|
|
9
|
+
premiseFindings?: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const HEADER = '[라운드 요약 카드 — 이미 해 본 수와 결과]';
|
|
13
|
+
|
|
14
|
+
function singleLine(value: string): string {
|
|
15
|
+
return value.replace(/\s+/g, ' ').trim();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function list(items: readonly string[] | undefined): string {
|
|
19
|
+
return items === undefined ? '못 쟀다' : items.length === 0 ? '0건' : items.map(singleLine).join(', ');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function failureKey(entry: RoundSummaryEntry): string | undefined {
|
|
23
|
+
return entry.failedIds?.length ? JSON.stringify([...new Set(entry.failedIds)].sort()) : undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Only recorded results are rendered; no filesystem or runtime state is consulted. */
|
|
27
|
+
export function renderRoundSummaryCard(entries: readonly RoundSummaryEntry[], { maxChars = 1500 }: { maxChars?: number } = {}): string {
|
|
28
|
+
if (!entries.length) return '';
|
|
29
|
+
const lines = entries.map((entry) => `라운드 ${entry.round} · ${entry.kind} · 해 본 수: ${entry.tried === undefined ? '못 쟀다' : singleLine(entry.tried)} · 실패 id: ${list(entry.failedIds)} · 손댄 파일: ${list(entry.filesTouched)}`
|
|
30
|
+
+ (entry.rung === undefined ? '' : ` · rung: ${singleLine(entry.rung)}`)
|
|
31
|
+
+ (entry.premiseFindings === undefined ? '' : ` · premiseFindings: ${list(entry.premiseFindings)}`));
|
|
32
|
+
const lastKey = failureKey(entries[entries.length - 1]!);
|
|
33
|
+
const prior = lastKey === undefined ? undefined : entries.slice(0, -1).find((entry) => failureKey(entry) === lastKey);
|
|
34
|
+
const guidance = prior === undefined ? '' : [
|
|
35
|
+
`이 실패 집합은 라운드 ${prior.round} 에서도 같았다 — 같은 수 대신 다른 칸을 열 수 있다.`,
|
|
36
|
+
'이렇게 하라: (F1) base(origin/main)에서 같은 시험을 돌려 원래 깨진 것인지 보고, 호출자와 `git log -S <심볼>`로 선례를 보라.',
|
|
37
|
+
'(F2) docs/의 매뉴얼·FINDING에서 같은 증상을 찾아라. 원인이 이 골의 범위 밖이라면 근거(파일:줄·명령 출력)를 PR 본문 «남은 것»에 적어라.',
|
|
38
|
+
].join('\n');
|
|
39
|
+
const render = (omitted: number) => [HEADER, ...(omitted ? [`…(앞 라운드 ${omitted}개 생략)`] : []), ...lines.slice(omitted), ...(guidance ? [guidance] : [])].join('\n');
|
|
40
|
+
let omitted = 0;
|
|
41
|
+
while (omitted < lines.length - 1 && render(omitted).length > maxChars) omitted++;
|
|
42
|
+
const card = render(omitted);
|
|
43
|
+
if (card.length <= maxChars) return card;
|
|
44
|
+
// Reserve the repeated-failure actions before truncating the latest round's details.
|
|
45
|
+
const latestEntry = entries[entries.length - 1]!;
|
|
46
|
+
const latest = lines[lines.length - 1]!;
|
|
47
|
+
const identity = `라운드 ${latestEntry.round} · ${latestEntry.kind}`;
|
|
48
|
+
const marker = omitted ? `…(앞 라운드 ${omitted}개 생략)\n` : '';
|
|
49
|
+
const heading = `${HEADER}\n`;
|
|
50
|
+
const prefix = heading.length + marker.length + identity.length <= maxChars ? heading + marker
|
|
51
|
+
: heading.length + identity.length <= maxChars ? heading
|
|
52
|
+
: '';
|
|
53
|
+
const available = Math.max(0, maxChars - prefix.length);
|
|
54
|
+
if (available < identity.length) return identity.slice(0, available);
|
|
55
|
+
const fullAdvice = guidance ? `\n${guidance}` : '';
|
|
56
|
+
const shortAdvice = prior ? `\n라운드 ${prior.round} 실패 반복 — base 시험을 확인하고 다른 칸을 열어라.` : '';
|
|
57
|
+
const advice = identity.length + fullAdvice.length <= available ? fullAdvice
|
|
58
|
+
: identity.length + shortAdvice.length <= available ? shortAdvice : '';
|
|
59
|
+
const resultBudget = available - advice.length;
|
|
60
|
+
const visible = latest.length <= resultBudget ? latest
|
|
61
|
+
: resultBudget > identity.length ? `${latest.slice(0, resultBudget - 1)}…` : identity;
|
|
62
|
+
return prefix + visible + advice;
|
|
63
|
+
}
|