elanous 0.2.22 → 0.2.24
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/{aBi6EyMtLsrl7J8eH4kF7 → Q-7iofoxOEv1WX18S35of}/_buildManifest.js +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-0eed0fb0aab716b6.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-aaae04ed1d32622f.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-3b9fc39362473ae7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-24282bf9f90031a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-80ed511e02c81412.js → page-c0ab229673a8b0eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.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-22725e2570f1126b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1d809a87139dd024.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b92caddb5c715f30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.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-901a1391b81053bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.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/72becfd42807b50d.css +1 -0
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +1 -0
- 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/catalog/models/openrouter/deepseek-v4-pro-0813.yaml +39 -0
- package/catalog/models/openrouter/deepseek-v4.1-flash.yaml +38 -0
- package/catalog/models/openrouter/glm-5.3-flash.yaml +35 -0
- package/catalog/providers/openrouter.yaml +2 -0
- package/graphs/implement-loop.yaml +31 -0
- package/graphs/log-horizon/log-horizon-watch.yaml +25 -0
- package/graphs/log-horizon/recipes.yaml +3 -0
- package/graphs/ops/harness-gc.yaml +17 -0
- package/graphs/ops/recipes.yaml +3 -0
- package/graphs/overlays/README.md +1 -1
- package/graphs/overlays/stop-heal-ladder.yaml +105 -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/add-api-key.sh +1 -1
- package/scripts/bench-report.ts +82 -3
- package/scripts/ci-typecheck-changed.ts +80 -14
- package/scripts/fleet/bedrock-pod-secret.ts +122 -0
- package/scripts/fleet/node-setup-linux.sh +97 -0
- package/scripts/fleet/node-setup.sh +11 -0
- package/scripts/fleet/zai-pod-secret.ts +86 -0
- package/scripts/hq/hq-fence-wrapper.sh +148 -0
- package/scripts/land-global-checks.ts +3 -0
- package/scripts/lib/typecheck-ratchet.ts +51 -0
- package/scripts/measure-log-diet-2.ts +213 -0
- package/scripts/measure-tsc-affected-roots.ts +289 -0
- package/scripts/openai-relay-server.ts +5 -1
- package/scripts/release-loop/docs-node.ts +258 -43
- package/scripts/release-loop/gate-executor.ts +28 -0
- package/scripts/release-loop/gate-method.ts +59 -0
- package/scripts/release-loop/gate-node.ts +335 -33
- 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 +40 -4
- package/scripts/release-loop/resume.ts +94 -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 +29 -7
- package/scripts/rhythm/daily.ts +51 -2
- package/scripts/rhythm/weekly.ts +3 -2
- package/scripts/tsc-baseline-cache.ts +147 -0
- package/scripts/tsc-main-safety-net.ts +189 -0
- package/scripts/usage-rollup.ts +64 -8
- package/src/acp/codex-plugins.ts +48 -6
- package/src/agent/monad-agent-turn.ts +67 -5
- package/src/agent/run-context.ts +20 -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 +19 -4
- package/src/agent-mission/pr-review-watch.ts +6 -2
- package/src/agent-mission/resource-ladder.ts +8 -3
- package/src/agent-mission/review-loop.ts +41 -7
- package/src/agent-substrate/acp-implementer.ts +139 -0
- package/src/agent-substrate/acp-reviewer.ts +17 -8
- package/src/agent-substrate/pr-reviewer.ts +191 -28
- package/src/agent-substrate/review-intent.ts +6 -4
- package/src/agent-substrate/self-review-cli.ts +155 -21
- 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/mission-critique.ts +18 -5
- package/src/autopilot/mission-feasibility-negotiate.ts +11 -10
- package/src/autopilot/mission-trace.ts +12 -1
- package/src/autopilot/pr-manager.ts +12 -3
- package/src/autopilot/system-lookback-run.ts +16 -10
- package/src/bench/bench.ts +183 -0
- 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/budget/fetchers/grok.ts +15 -5
- package/src/budget/llm-cost.ts +37 -5
- package/src/budget/types.ts +8 -2
- package/src/budget/unified-usage.ts +88 -6
- package/src/chat/index.ts +12 -3
- package/src/cli/agent-cli.ts +20 -0
- package/src/cli/bench-cli.ts +34 -0
- package/src/cli/brief-cli.ts +27 -21
- package/src/cli/cli-user-error.ts +9 -2
- package/src/cli/guardian-cli.ts +26 -1
- package/src/cli/image-cli.ts +101 -0
- package/src/cli/log-event-names.ts +7 -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 +90 -5
- package/src/cli/pr-land-overlap-evidence.ts +279 -0
- package/src/cli/release-cli.ts +63 -12
- package/src/cli/rfc-status.ts +52 -2
- package/src/cli/self-update.ts +277 -10
- package/src/cli/skills-cli.ts +12 -3
- package/src/cli/tasks-cli.ts +241 -30
- package/src/cli/usage-cli.ts +91 -8
- 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 +87 -2
- package/src/dashboard/ad-run-setup-bindings.ts +279 -0
- package/src/dashboard/chat-fold.ts +20 -0
- package/src/dashboard/first-screen-band.ts +151 -1
- package/src/dashboard/index.ts +45 -281
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -3
- package/src/dashboard/stale-install-check.ts +24 -2
- package/src/dashboard/turn-stream-formatter.ts +25 -0
- package/src/debug/log-diet.ts +190 -0
- package/src/debug/log.ts +70 -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 +158 -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/error-report/report.ts +21 -4
- 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 +2 -0
- package/src/graph-runner/graph-cli.ts +42 -1
- package/src/graph-runner/runner.ts +218 -8
- package/src/grok/usage.ts +23 -2
- package/src/grounding/ref-index.ts +253 -0
- package/src/harness/dispatch-backpressure.ts +267 -0
- package/src/harness/harness-clean.ts +199 -78
- package/src/harness/harness-cli-command.ts +229 -35
- package/src/harness/harness-gc.ts +331 -0
- package/src/harness/harness-seams.ts +2 -20
- package/src/harness/harness-stop.ts +4 -2
- package/src/harness/harness-substrate-default.ts +214 -8
- package/src/harness/launch-registry.ts +6 -0
- package/src/harness/nested-elanous-policy.ts +4 -2
- package/src/harness/worktree-branch-prefix.ts +9 -0
- package/src/hq/fence-wrapper.ts +7 -0
- package/src/hq/fence.ts +187 -0
- package/src/hq/hq.ts +33 -2
- package/src/hq/lease.ts +13 -0
- package/src/hq/seats.ts +133 -21
- package/src/images/image-ledger.ts +179 -0
- package/src/index.ts +250 -69
- package/src/instance/child-scope.ts +32 -1
- package/src/instance/dev-project.ts +133 -0
- package/src/instance/resolve.ts +24 -0
- package/src/instance/spawn-elanous.ts +45 -0
- 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/intake-plane/ref-prefetch.ts +110 -0
- package/src/intelligence-map/model-alias.ts +6 -0
- package/src/intelligence-map/model-catalog.ts +113 -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-eventstream.ts +215 -0
- package/src/llm/bedrock-provider.ts +248 -0
- package/src/llm/bedrock.ts +491 -0
- package/src/llm/openrouter-byok-cost.ts +96 -0
- package/src/llm/openrouter-deepseek.ts +151 -0
- package/src/llm/openrouter-upstream-pins.config.ts +25 -0
- package/src/llm/provider-credentials.ts +3 -1
- package/src/llm/zai-coding-plan.ts +700 -0
- package/src/llm.ts +383 -41
- package/src/loops/budget.ts +150 -0
- package/src/loops/checker.ts +148 -9
- package/src/loops/orchestrator/resync-shadow.ts +34 -7
- 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/maturity/feature-maturity.ts +2 -2
- package/src/mcp/mcp-oauth.ts +136 -17
- package/src/model-tier/llm-tier-map.ts +52 -4
- package/src/models/prompts.ts +23 -1
- package/src/mss/logging/horizon-watch.ts +168 -0
- package/src/mss/logging/log-store.ts +262 -26
- 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/missions.ts +73 -2
- package/src/nexus/api/ops-api.ts +18 -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 +17 -75
- package/src/nexus/outbound/format.ts +2 -0
- package/src/nexus/outbound/router.ts +198 -13
- package/src/nexus/tools-kind.ts +78 -0
- package/src/oauth/codex-account-rotation.ts +55 -20
- package/src/oauth/codex-account-store.ts +451 -23
- package/src/oauth/fallback-chain.ts +75 -15
- package/src/onboarding/first-run.ts +37 -18
- package/src/onboarding/web-first.ts +20 -2
- package/src/onboarding.ts +2 -1
- package/src/ops/machine-heartbeat.ts +185 -0
- package/src/ops/overview-cache.ts +175 -0
- package/src/ops/overview.ts +8 -0
- 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 +13 -6
- package/src/prompt-cache/openrouter.ts +94 -0
- package/src/prompt-cache/types.ts +5 -0
- package/src/prompt-enhance/enhance.ts +69 -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 +107 -23
- 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/requirements/requirement-ledger.ts +536 -0
- package/src/retro/daily.ts +26 -12
- package/src/seat-loop/seat-loop.ts +66 -11
- 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 +109 -11
- package/src/self-dev/dev-pipeline.ts +11 -8
- package/src/self-dev/draft-residue.ts +475 -0
- package/src/self-dev/draft-sweep.ts +254 -10
- package/src/self-dev/draft-triage-rules.ts +27 -1
- package/src/self-dev/graph-journey-route.ts +6 -0
- 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 +82 -5
- package/src/self-dev/orchestrate-summary-line.ts +13 -0
- package/src/self-dev/orchestrate.ts +49 -141
- 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 +190 -36
- package/src/self-dev/run-types.ts +191 -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 +3 -4
- package/src/self-implement/blocked-draft-policy.ts +3 -19
- package/src/self-implement/budget-gate.ts +53 -13
- package/src/self-implement/child-context-composition.ts +139 -0
- package/src/self-implement/child-llm-preference.ts +13 -5
- package/src/self-implement/claude-acp-implement.ts +67 -0
- package/src/self-implement/draft-on-stop-mode.ts +18 -0
- package/src/self-implement/flex-signals.ts +59 -0
- package/src/self-implement/follow-up-goals.ts +114 -38
- package/src/self-implement/frozen-merges.ts +8 -3
- 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-decompose.ts +10 -2
- package/src/self-implement/goal-author.ts +48 -13
- package/src/self-implement/goal-digest.ts +19 -0
- package/src/self-implement/graph-overlay-condition.ts +32 -0
- package/src/self-implement/graph-overlay-yaml.ts +41 -7
- package/src/self-implement/graph-templates.ts +33 -1
- package/src/self-implement/graph-yaml.ts +56 -0
- package/src/self-implement/headless-elanous-driver.ts +11 -9
- package/src/self-implement/heal-intake.ts +5 -1
- 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 +271 -25
- 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/running-runs.ts +75 -5
- package/src/self-implement/seams.ts +83 -4
- package/src/self-implement/self-implement-cli.ts +12 -5
- package/src/self-implement/stop-autoheal.ts +69 -2
- 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/session-runtime/retry-policy.ts +2 -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 +22 -10
- package/src/steward/triage-budget.ts +62 -0
- package/src/steward/triage.ts +87 -24
- package/src/storage/file-lock.ts +8 -1
- package/src/task-agent/actions.ts +66 -5
- package/src/task-agent/card-evidence.ts +59 -13
- package/src/task-agent/completion-evidence.ts +5 -0
- package/src/task-agent/cover.ts +101 -3
- package/src/task-agent/judge.ts +20 -3
- package/src/task-agent/land-order-ledger.ts +95 -0
- package/src/task-agent/land-worktree.ts +201 -0
- package/src/task-agent/live-move-history.ts +219 -0
- package/src/task-agent/live-moves.ts +451 -34
- package/src/task-agent/parent-host.ts +117 -8
- package/src/task-agent/rejudge-on-head.ts +352 -0
- package/src/task-agent/review-prior-fix.ts +146 -0
- package/src/task-agent/review-result-capture.ts +218 -0
- package/src/task-agent/run-adopt.ts +136 -0
- package/src/task-agent/shadow.ts +154 -14
- package/src/task-agent/task-hand.ts +186 -14
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +38 -5
- package/src/task-orchestrator/surfaces/pod-bedrock-child.ts +74 -0
- package/src/task-orchestrator/surfaces/pod-child-default.ts +50 -0
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +42 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +6 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +94 -7
- package/src/task-orchestrator/surfaces/pod-image-source.ts +212 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +110 -17
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +32 -3
- package/src/task-orchestrator/surfaces/pod-pool.ts +86 -18
- package/src/task-orchestrator/surfaces/pod-zai-child.ts +101 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +463 -50
- package/src/task-orchestrator/surfaces/self-implement.ts +25 -3
- 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/typecheck-ratchet.ts +1 -0
- package/src/user-config.ts +180 -32
- 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/registry.ts +59 -0
- package/src/workflow-runtime/triggers/scheduler.ts +1 -0
- package/src/workflow-runtime/triggers/webhook-source.ts +35 -5
- 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 → Q-7iofoxOEv1WX18S35of}/_ssgManifest.js +0 -0
|
@@ -31,7 +31,8 @@ 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, type RecurrenceFinding } from './review-finding-recurrence.js';
|
|
35
|
+
import type { ReviewRework } from '../self-dev/run-types.js';
|
|
35
36
|
import { createHash } from 'node:crypto';
|
|
36
37
|
import { appendFileSync, copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync } from 'node:fs';
|
|
37
38
|
import { writeGoalDocumentAtomic } from './goal-document-write.js';
|
|
@@ -64,7 +65,7 @@ import { GoalRunStore, insertGoalRunRecord, type GoalPriorRuns } from './goal-ru
|
|
|
64
65
|
import { writeGoalRunRecordFragment } from './goal-execution-records.js';
|
|
65
66
|
import { getUserConfig } from '../user-config.js';
|
|
66
67
|
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';
|
|
68
|
+
import { classifyMergeHoldStop, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
68
69
|
import { autohealFromStop, parseAutohealMode, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
|
|
69
70
|
import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
|
|
70
71
|
import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
|
|
@@ -80,7 +81,7 @@ import { releasePathHold, releasePathHoldComment, RELEASE_PATH_LABEL } from '../
|
|
|
80
81
|
import { emitDecision } from '../live/detail-switch.js';
|
|
81
82
|
import { reworkDecision } from './decision-events.js';
|
|
82
83
|
import type { LogSink } from '../mss/logging/sink.js';
|
|
83
|
-
import type
|
|
84
|
+
import { LogStore, logsDbPath, type LogQuery, type LogStoreRow } from '../mss/logging/log-store.js';
|
|
84
85
|
import { refreshCodexQuotaSignals } from '../budget/codex-quota-refresh.js';
|
|
85
86
|
import { inspectActiveProvider, type ActiveProviderInfo } from '../provider-summary.js';
|
|
86
87
|
import { recordHitlEvent } from '../self-dev/hitl-log.js';
|
|
@@ -108,7 +109,7 @@ import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
|
108
109
|
import { addNextMdReleaseNote, harnessReleaseNote, parseReleaseNoteSection, releaseNotesDir, renderReleaseNoteSection, writeReleaseNote, type ReleaseNoteFragment, type ReleaseNoteSection } from '../release-loop/release-note.js';
|
|
109
110
|
import { landingFreezeMessage } from '../release-loop/landing-freeze.js';
|
|
110
111
|
import { admitLandingMerge, owningRepoRoot } from './frozen-merges.js';
|
|
111
|
-
import { recordFollowUpOnMerge, type FollowUpMergeInput, type FollowUpSeams } from './follow-up-goals.js';
|
|
112
|
+
import { recordFollowUpOnBlocked, recordFollowUpOnMerge, type FollowUpBlockedInput, type FollowUpMergeInput, type FollowUpSeams } from './follow-up-goals.js';
|
|
112
113
|
|
|
113
114
|
/** Merge result and exit stay untouched: a draft failure is one debug line. */
|
|
114
115
|
async function draftFollowUpAfterMerge(input: FollowUpMergeInput, followUp: FollowUpSeams | undefined): Promise<void> {
|
|
@@ -128,10 +129,30 @@ async function draftFollowUpAfterMerge(input: FollowUpMergeInput, followUp: Foll
|
|
|
128
129
|
debug.log('self-implement.follow-up', 'draft-failed', { prNumber: input.prNumber, error: error instanceof Error ? error.message : String(error) });
|
|
129
130
|
}
|
|
130
131
|
}
|
|
132
|
+
|
|
133
|
+
async function draftFollowUpAfterBlocked(input: FollowUpBlockedInput, followUp: FollowUpSeams | undefined): Promise<void> {
|
|
134
|
+
try {
|
|
135
|
+
await recordFollowUpOnBlocked(input, {
|
|
136
|
+
...(followUp ? {
|
|
137
|
+
...(followUp.mode ? { mode: followUp.mode } : {}),
|
|
138
|
+
...(followUp.readDrafts ? { readDrafts: followUp.readDrafts } : {}),
|
|
139
|
+
...(followUp.appendDraft ? { appendDraft: followUp.appendDraft } : {}),
|
|
140
|
+
...(followUp.enqueue ? { enqueue: followUp.enqueue } : {}),
|
|
141
|
+
...(followUp.cellOwner ? { cellOwner: followUp.cellOwner } : {}),
|
|
142
|
+
...(followUp.stateRoot ? { stateRoot: followUp.stateRoot } : {}),
|
|
143
|
+
} : {}),
|
|
144
|
+
log: (category, event, data) => { debug.log(category, event, data); },
|
|
145
|
+
});
|
|
146
|
+
} catch (error) {
|
|
147
|
+
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) });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
131
150
|
import { plannedSelfImplBranch } from '../harness/worktree-branch-prefix.js';
|
|
132
151
|
export { slugifyFeature } from '../harness/worktree-branch-prefix.js';
|
|
133
152
|
import { AUTO_REVIEW_LABEL, resolveAutoReviewLabels } from './context-capsule.js';
|
|
134
153
|
import { GOAL_TYPES, extractVerbatimOriginalAsk, leadingGoalMetadata, parseAskFile, parseGoalType, type GoalType } from './goal-author.js';
|
|
154
|
+
import { renderRoundSummaryCard, type RoundSummaryEntry } from './round-summary-card.js';
|
|
155
|
+
import { computeFlexSignals } from './flex-signals.js';
|
|
135
156
|
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
157
|
import type { SupervisionReworkSource } from './supervision-vocabulary.js';
|
|
137
158
|
import { classifyReworkBudgetShadow } from './classify-shadow.js';
|
|
@@ -139,7 +160,7 @@ import { createReworkBudgetJudgment, REWORK_BUDGET_JUDGMENT, reworkBudgetEvidenc
|
|
|
139
160
|
import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
|
|
140
161
|
import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
|
|
141
162
|
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';
|
|
163
|
+
import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, runRequiredEvidenceChecks, coverRequiredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
|
|
143
164
|
import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
|
|
144
165
|
import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
|
|
145
166
|
|
|
@@ -227,11 +248,12 @@ import { persistReviewArtifact, type ReviewArtifactWriter } from '../agent-subst
|
|
|
227
248
|
import { createArtifactStore } from '../artifact/index.js';
|
|
228
249
|
import { mapStageToRunStatus, type SelfImplementStage } from './run-status-mapping.js';
|
|
229
250
|
import type { LifecycleScreenComparison } from './lifecycle-screen-scoreboard.js';
|
|
251
|
+
import { buildRuntimeOverlayState } from './graph-overlay-condition.js';
|
|
230
252
|
import { activeTemplate, decideTemplate, graphAuthorityFields, nodeNameForStage, overlayDecisionObservation, resolveGraphAuthorityForUserConfig, routeGate, visitBudgetOf } from './graph-authority.js';
|
|
231
253
|
import type { GraphTemplate } from './graph-templates.js';
|
|
232
254
|
import { defaultOverlaysDir, loadGraphOverlays, type GraphOverlaySpec } from './graph-overlay-yaml.js';
|
|
233
|
-
import { graphIdentityOf, pipelineNodeEntryPayload } from './graph-templates.js';
|
|
234
|
-
import { AMBIGUOUS_STAGES, checkPipelineTraversal, nodesForStage, pipelineGraphIdentity, type PipelineNodeId, type PipelineTraversalCheck } from './pipeline-shape.js';
|
|
255
|
+
import { graphIdentityOf, measureL0Coverage, pipelineNodeEntryPayload } from './graph-templates.js';
|
|
256
|
+
import { AMBIGUOUS_STAGES, checkPipelineTraversal, nodesForStage, pipelineGraphIdentity, TERMINAL_STAGES_BY_NODE, type PipelineNodeId, type PipelineTraversalCheck } from './pipeline-shape.js';
|
|
235
257
|
import { appendGateWorktreeFreshnessEvidence, gateEvidenceNote } from '../harness/review-adapter.js';
|
|
236
258
|
import { diffHeaderPaths } from '../agent-substrate/self-review-cli.js';
|
|
237
259
|
import { format as formatPrComment, type PrCommentRole } from '../agent-substrate/pr-comment-meta.js';
|
|
@@ -767,7 +789,9 @@ function changedFileIsInsideDeclaredTarget(changedFile: string, declaredPath: st
|
|
|
767
789
|
const target = normalizeDeclaredScopePath(declaredPath);
|
|
768
790
|
if (!file || !target) return false;
|
|
769
791
|
return file === target || file.startsWith(`${target}/`)
|
|
770
|
-
|| (target.endsWith('.ts') && !target.endsWith('.test.ts') && file === `${target.slice(0, -3)}.test.ts`)
|
|
792
|
+
|| (target.endsWith('.ts') && !target.endsWith('.test.ts') && file === `${target.slice(0, -3)}.test.ts`)
|
|
793
|
+
// SCOPE-LOCKFILE-PAIR — 선언한 package.json 을 고치면 같은 폴더의 bun.lock 이 따라 바뀐다(10-11 TSGO-TRIAL 이 bun.lock 하나로 보류).
|
|
794
|
+
|| ((target === 'package.json' || target.endsWith('/package.json')) && file === `${target.slice(0, -'package.json'.length)}bun.lock`);
|
|
771
795
|
}
|
|
772
796
|
|
|
773
797
|
function parseDeclaredTargetPathsFromAsk(askText: string): { readable: boolean; paths: readonly string[] } {
|
|
@@ -784,10 +808,20 @@ function parseDeclaredTargetPathsFromAsk(askText: string): { readable: boolean;
|
|
|
784
808
|
return { readable: true, paths: [...new Set(paths.filter(Boolean))] };
|
|
785
809
|
}
|
|
786
810
|
|
|
811
|
+
// SCOPE-NEW-FILES-LINE — 칸 문면은 새로 만들 파일을 «신설:» 줄로 따로 적는다(OP D칸 규칙). 그 줄도 선언 범위다.
|
|
812
|
+
// 10-11 FLEX-SIGNALS run-95799887: 칸이 적은 신설 파일 둘을 «범위 밖»으로 세어 구현을 보류했다.
|
|
813
|
+
const DECLARED_NEW_FILES_LINE = /^\s*(?:신설|new\s*files?)\s*[::]\s*(.*)$/i;
|
|
814
|
+
|
|
787
815
|
function declaredPathsFromGoalDocumentText(document: string): { readable: boolean; paths: readonly string[] } {
|
|
788
816
|
const originalAsk = extractVerbatimOriginalAsk(document)?.ask ?? null;
|
|
789
817
|
if (originalAsk === null) return { readable: false, paths: [] };
|
|
790
|
-
|
|
818
|
+
const declared = parseDeclaredTargetPathsFromAsk(originalAsk);
|
|
819
|
+
if (!declared.readable) return declared;
|
|
820
|
+
const newFiles = originalAsk.split(/\r?\n/).flatMap((line) => {
|
|
821
|
+
const match = DECLARED_NEW_FILES_LINE.exec(line);
|
|
822
|
+
return match ? parseDeclaredTargetPathsFromAsk(`대상 경로: ${match[1]}`).paths : [];
|
|
823
|
+
});
|
|
824
|
+
return newFiles.length > 0 ? { readable: true, paths: [...new Set([...declared.paths, ...newFiles])] } : declared;
|
|
791
825
|
}
|
|
792
826
|
|
|
793
827
|
/** Only paths explicitly designated as targets in the ask or piece text protect an intentional revert. */
|
|
@@ -817,6 +851,11 @@ function revertGuardTargetPaths(feature: string, goalDocument?: string): string[
|
|
|
817
851
|
return [...new Set([...declaredRevertGuardPaths(feature), ...(originalAsk ? declaredRevertGuardPaths(originalAsk) : [])])];
|
|
818
852
|
}
|
|
819
853
|
|
|
854
|
+
/** 하니스가 작업 트리에 잠깐 쓰는 임시물 — 범위 판정·결정 카드에서 뺀다. */
|
|
855
|
+
export function isHarnessTempArtifact(file: string): boolean {
|
|
856
|
+
return /(^|\/)\.elanous-typecheck-scope-[^/]+\.json$/.test(file);
|
|
857
|
+
}
|
|
858
|
+
|
|
820
859
|
export function detectDeclaredScopeDiff(input: {
|
|
821
860
|
goalDocument?: string | null;
|
|
822
861
|
changedFiles?: readonly string[] | null;
|
|
@@ -2256,6 +2295,7 @@ export interface SelfImplementResult {
|
|
|
2256
2295
|
branch?: string;
|
|
2257
2296
|
gate?: SelfImplementGateResult;
|
|
2258
2297
|
review?: SelfImplementReview;
|
|
2298
|
+
rework?: ReviewRework;
|
|
2259
2299
|
/** Worktree commit observed while this review ran; not inferred from the later PR head. */
|
|
2260
2300
|
reviewedHeadCommit?: string;
|
|
2261
2301
|
completionDisposition?: SelfImplementCompletionDisposition;
|
|
@@ -3545,6 +3585,29 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
|
|
|
3545
3585
|
}
|
|
3546
3586
|
}
|
|
3547
3587
|
|
|
3588
|
+
export function measureReviewRework(counts: readonly number[], findings: readonly (readonly RecurrenceFinding[])[]): ReviewRework {
|
|
3589
|
+
const deltas = counts.slice(1).map((count, index) => Math.sign(count - counts[index]!));
|
|
3590
|
+
const directions = deltas.filter((delta) => delta !== 0);
|
|
3591
|
+
const seen = new Set<string>();
|
|
3592
|
+
let resurfaced = false;
|
|
3593
|
+
for (let index = 0; index < findings.length; index++) {
|
|
3594
|
+
const ids = new Set(findings[index]!.map((finding) => finding.id));
|
|
3595
|
+
if (index > 0 && [...ids].some((id) => seen.has(id) && !findings[index - 1]!.some((finding) => finding.id === id))) {
|
|
3596
|
+
const prior = findings.slice(0, index - 1).reverse().find((round) => round.some((finding) => ids.has(finding.id)));
|
|
3597
|
+
if (prior && measureReviewFindingRecurrence(findings[index], prior)?.normalizedRepeatedReviewFindingCount) resurfaced = true;
|
|
3598
|
+
}
|
|
3599
|
+
for (const id of ids) seen.add(id);
|
|
3600
|
+
}
|
|
3601
|
+
const trend: ReviewRework['trend'] = resurfaced || directions.some((delta) => delta !== directions[0])
|
|
3602
|
+
? 'oscillating'
|
|
3603
|
+
: counts.length < 2 ? 'unmeasured'
|
|
3604
|
+
: deltas.every((delta) => delta < 0) ? 'improving'
|
|
3605
|
+
: deltas.every((delta) => delta === 0) ? 'stable'
|
|
3606
|
+
: counts.at(-1)! > counts[0]! && deltas.every((delta) => delta >= 0) ? 'worsening'
|
|
3607
|
+
: 'stable';
|
|
3608
|
+
return { trend, signature: [...new Set((findings.at(-1) ?? []).map((finding) => finding.id))].sort().join(','), rounds: counts.length };
|
|
3609
|
+
}
|
|
3610
|
+
|
|
3548
3611
|
export async function runSelfImplement(opts: SelfImplementOptions): Promise<SelfImplementResult> {
|
|
3549
3612
|
if (opts.childLlm && (typeof opts.childLlm.provider !== 'string' || !opts.childLlm.provider.trim() || typeof opts.childLlm.model !== 'string' || !opts.childLlm.model.trim())) {
|
|
3550
3613
|
throw new Error('childLlm.provider and childLlm.model must both be non-empty');
|
|
@@ -3609,6 +3672,13 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3609
3672
|
let roundCount = 0;
|
|
3610
3673
|
let lastTier: EscalateTier | undefined;
|
|
3611
3674
|
let lastReviewFindings: string[] | undefined;
|
|
3675
|
+
let measuredRework: ReviewRework | undefined;
|
|
3676
|
+
const withMeasuredRework = (result: SelfImplementResult): SelfImplementResult => {
|
|
3677
|
+
if (!measuredRework) return result;
|
|
3678
|
+
const classification = result.abandonedClassification?.classification;
|
|
3679
|
+
// An empty must-fix set stays an empty signature: a bare classification prefix would make two clean reviews «match».
|
|
3680
|
+
return { ...result, rework: { ...measuredRework, signature: `${classification && measuredRework.signature ? `${classification}:` : ''}${measuredRework.signature}` } };
|
|
3681
|
+
};
|
|
3612
3682
|
let reviewFindingRoundCount = 0;
|
|
3613
3683
|
const verbatimReviewFindingOccurrences = new Map<string, number>();
|
|
3614
3684
|
const normalizedReviewFindingFirstSeenRounds = new Map<string, number>();
|
|
@@ -3958,6 +4028,62 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3958
4028
|
const finalizeTraversal = (): void => {
|
|
3959
4029
|
if (traversalFinalized) return;
|
|
3960
4030
|
traversalFinalized = true;
|
|
4031
|
+
if (terminalResult?.ok && runGraphTemplate?.graphId === 'self-implement') {
|
|
4032
|
+
const entered = new Set<string>(traversedNodes);
|
|
4033
|
+
let journeyRowsRead = false;
|
|
4034
|
+
const path = logsDbPath();
|
|
4035
|
+
if (existsSync(path)) {
|
|
4036
|
+
let store: LogStore | undefined;
|
|
4037
|
+
try {
|
|
4038
|
+
store = LogStore.openReadOnly(path);
|
|
4039
|
+
const join = journeyJoinFields();
|
|
4040
|
+
const rows = [
|
|
4041
|
+
...store.queryByDataKeys({ exactCategories: ['self-implement'], runIds: [runId] }),
|
|
4042
|
+
...(join.journeyKey ? store.queryAll({ exactCategories: ['self-implement'], events: ['pipeline-node-entry'], grep: join.journeyKey }) : []),
|
|
4043
|
+
...(join.queueLaunchId ? store.queryAll({ exactCategories: ['self-implement'], events: ['pipeline-node-entry'], grep: join.queueLaunchId }) : []),
|
|
4044
|
+
];
|
|
4045
|
+
for (const row of rows) {
|
|
4046
|
+
if (row.event !== 'pipeline-node-entry' || !row.data) continue;
|
|
4047
|
+
let data: { runId?: string; journeyKey?: string; queueLaunchId?: string; graphId?: string; graphVersion?: string; node?: string; phase?: string };
|
|
4048
|
+
try { data = JSON.parse(row.data); } catch { continue; }
|
|
4049
|
+
const sameRun = data.runId === runId || (data.runId === undefined && (
|
|
4050
|
+
(join.journeyKey !== undefined && data.journeyKey === join.journeyKey)
|
|
4051
|
+
|| (join.queueLaunchId !== undefined && data.queueLaunchId === join.queueLaunchId)
|
|
4052
|
+
));
|
|
4053
|
+
if (sameRun && data.phase === 'journey' && data.graphId === runGraphTemplate.graphId && data.graphVersion === runGraphTemplate.version && typeof data.node === 'string') {
|
|
4054
|
+
entered.add(data.node);
|
|
4055
|
+
journeyRowsRead = true;
|
|
4056
|
+
}
|
|
4057
|
+
}
|
|
4058
|
+
} catch { /* observation failure must not fail the run */ }
|
|
4059
|
+
finally { store?.close(); }
|
|
4060
|
+
}
|
|
4061
|
+
// Only nodes this process runs (TERMINAL_STAGES_BY_NODE) can be «skipped» with certainty:
|
|
4062
|
+
// their non-entry here means the condition was false. Nodes run by other processes
|
|
4063
|
+
// (author · intake · dispatch · pod …) that were not joined stay «unjoined» — not
|
|
4064
|
+
// skipped and not accounted — so the walk ratio can fall below 1.0.
|
|
4065
|
+
const skipped = new Set<string>();
|
|
4066
|
+
const unjoined: string[] = [];
|
|
4067
|
+
for (const node of runGraphTemplate.nodes) {
|
|
4068
|
+
if (entered.has(node.nodeId)) continue;
|
|
4069
|
+
if (!Object.hasOwn(TERMINAL_STAGES_BY_NODE, node.nodeId)) { unjoined.push(node.nodeId); continue; }
|
|
4070
|
+
const condition = node.nodeId === 'rework' ? 'gate/review passed'
|
|
4071
|
+
: node.nodeId === 'main-sync' || node.nodeId === 'regate' ? 'mergeMain && commitWork'
|
|
4072
|
+
: 'completion disposition';
|
|
4073
|
+
observeOuter('node-skipped', {
|
|
4074
|
+
...graphIdentityOf(runGraphTemplate), ...journeyJoinFields(),
|
|
4075
|
+
node: node.nodeId, reason: 'condition', condition,
|
|
4076
|
+
}, { category: 'graph.path' });
|
|
4077
|
+
skipped.add(node.nodeId);
|
|
4078
|
+
}
|
|
4079
|
+
const coverage = measureL0Coverage(runGraphTemplate, entered, skipped);
|
|
4080
|
+
observeOuter('l0-coverage', {
|
|
4081
|
+
...graphIdentityOf(runGraphTemplate), ...journeyJoinFields(),
|
|
4082
|
+
...coverage,
|
|
4083
|
+
journeyRowsRead,
|
|
4084
|
+
unjoinedNodes: unjoined,
|
|
4085
|
+
}, { category: 'graph.path' });
|
|
4086
|
+
}
|
|
3961
4087
|
try {
|
|
3962
4088
|
const checked = terminalNode
|
|
3963
4089
|
? (opts.seams.checkPipelineTraversal ?? checkPipelineTraversal)(traversedNodes, terminalNode)
|
|
@@ -4123,6 +4249,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4123
4249
|
},
|
|
4124
4250
|
observeRoundExecution,
|
|
4125
4251
|
observeReviewFindings,
|
|
4252
|
+
(rework) => { measuredRework = rework; },
|
|
4126
4253
|
setRunGraphIdentity,
|
|
4127
4254
|
(template) => { runGraphTemplate = template; },
|
|
4128
4255
|
// ⭐ 「요구 증거 충족」을 받아 결과에 실어 원장까지 나른다(`JDG-T60`)
|
|
@@ -4176,7 +4303,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4176
4303
|
if (lastCredentialFailure) {
|
|
4177
4304
|
observeOuter('credential-failure-observed', { count: credentialFailureCount, ...lastCredentialFailure });
|
|
4178
4305
|
}
|
|
4179
|
-
terminalResult = withEvidenceCoverage(addressedResult);
|
|
4306
|
+
terminalResult = withEvidenceCoverage(withMeasuredRework(addressedResult));
|
|
4180
4307
|
// runSelfImplement is the terminal caller: retain every existing PR/ledger/log observation and append one stop fact.
|
|
4181
4308
|
if ((addressedResult.stage === 'aborted' || (addressedResult.mergeReason && addressedResult.mergeReason !== 'auto')) && !runStopRecorded(runId)) {
|
|
4182
4309
|
const reason = addressedResult.mergeReason;
|
|
@@ -4239,7 +4366,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4239
4366
|
});
|
|
4240
4367
|
observeRunRollup(observeOuter, addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
|
|
4241
4368
|
observeProgressDelivery();
|
|
4242
|
-
return
|
|
4369
|
+
return terminalResult;
|
|
4243
4370
|
} catch (e) {
|
|
4244
4371
|
if (e instanceof StepTimeoutError) {
|
|
4245
4372
|
observeOuter('step-timeout', { step: e.step, ms: e.ms, branch, feature: opts.feature.slice(0, 80) }, { level: 'warn' });
|
|
@@ -4272,7 +4399,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4272
4399
|
if (lastCredentialFailure) {
|
|
4273
4400
|
observeOuter('credential-failure-observed', { count: credentialFailureCount, ...lastCredentialFailure });
|
|
4274
4401
|
}
|
|
4275
|
-
terminalResult = addressedResult; // ⛔ 이 분기(StepTimeoutError)는 스코프가 달라
|
|
4402
|
+
terminalResult = withMeasuredRework(addressedResult); // ⛔ 이 분기(StepTimeoutError)는 스코프가 달라 달성 근사값은 «없다»(0 으로 채우지 않는다)
|
|
4276
4403
|
observeDeclaredScopeDiff(observeOuter, {
|
|
4277
4404
|
goalFile: opts.goalFile,
|
|
4278
4405
|
changedFiles: opts.goalFile && addressedResult.worktreePath
|
|
@@ -4314,7 +4441,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4314
4441
|
});
|
|
4315
4442
|
observeRunRollup(observeOuter, addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
|
|
4316
4443
|
observeProgressDelivery();
|
|
4317
|
-
return
|
|
4444
|
+
return terminalResult;
|
|
4318
4445
|
}
|
|
4319
4446
|
recordHitlEvent({
|
|
4320
4447
|
kind: 'escalation',
|
|
@@ -4743,6 +4870,7 @@ async function runSelfImplementInner(
|
|
|
4743
4870
|
onWorktreeCreated: (path: string) => void = () => {},
|
|
4744
4871
|
onRoundExecution: (tier: EscalateTier) => void = () => {},
|
|
4745
4872
|
onReviewFindings: (round: number, mustFix: readonly string[]) => void = () => {},
|
|
4873
|
+
onReworkMeasured: (rework: ReviewRework) => void = () => {},
|
|
4746
4874
|
/** ⭐ 이 런이 «따르는» 그래프 신원 — 맥락이 정해진 «직후» 한 번 불린다.
|
|
4747
4875
|
* ⛔ 이것이 없으면 걸음은 YAML 을 따르고 «신원은 옛 TS 상수»를 따라 둘이 갈린다. */
|
|
4748
4876
|
onGraphResolved: (identity: { graphId: string; graphVersion: string }) => void = () => {},
|
|
@@ -4834,9 +4962,11 @@ async function runSelfImplementInner(
|
|
|
4834
4962
|
writeFileSync(graphFile, stringify({
|
|
4835
4963
|
graph_id: variantSpec.graphId, version: variantSpec.version,
|
|
4836
4964
|
entry_node: variantSpec.entryNode, terminal_nodes: variantSpec.terminalNodes,
|
|
4965
|
+
...(variantSpec.journeyStages ? { journey_stages: variantSpec.journeyStages } : {}),
|
|
4837
4966
|
...(variantSpec.runContract ? { run_contract: variantSpec.runContract } : {}),
|
|
4838
4967
|
nodes: variantSpec.nodes.map(n => ({
|
|
4839
4968
|
node_id: n.nodeId, kind: n.kind, recipe: n.recipe, max_visits: n.maxVisits,
|
|
4969
|
+
...(n.journeyStage ? { journey_stage: n.journeyStage } : {}),
|
|
4840
4970
|
...(n.progress ? { progress: n.progress } : {}), ...(n.phases ? { phases: n.phases } : {}),
|
|
4841
4971
|
...(n.terminalStages ? { terminal_stages: n.terminalStages } : {}),
|
|
4842
4972
|
...(n.fanOut ? { fan_out: n.fanOut } : {}), ...(n.contract ? { contract: n.contract } : {}),
|
|
@@ -4868,6 +4998,7 @@ async function runSelfImplementInner(
|
|
|
4868
4998
|
// ⛔ 승격이 꺼져 있으면 «심지 않는다» — 그러면 예산 관측도 안 난다(운영 원장이 오늘과 같다).
|
|
4869
4999
|
if (graphAuthority.enabled) onGraphTemplateResolved(graphTemplate);
|
|
4870
5000
|
// ⛔ 선택을 «전부» 싣는다 — 얹힌 것만 실으면 「왜 안 얹혔나」를 사후에 못 묻는다.
|
|
5001
|
+
let reviewRepeat: number | undefined;
|
|
4871
5002
|
/** ⭐ ③ «다이나믹» — 라운드마다 runtime 오버레이를 다시 고른다.
|
|
4872
5003
|
* ⛔ **매번 «기준 선언»에서 다시 얹는다** — 이전 라운드 결과 위에 겹쳐 얹으면
|
|
4873
5004
|
* 「이 걸음을 무엇이 만들었나」가 «누적»이 되어 사후에 못 푼다.
|
|
@@ -4875,7 +5006,19 @@ async function runSelfImplementInner(
|
|
|
4875
5006
|
const applyRuntimeOverlays = (round: number): void => {
|
|
4876
5007
|
if (!graphAuthority.enabled) return;
|
|
4877
5008
|
// ⛔ 「지금 아는 것」만 준다 — 없는 값을 0 으로 지어내지 않는다(key-absent 가 그것을 말한다).
|
|
4878
|
-
|
|
5009
|
+
let stopClass: import('./run-stop.js').RunStopClass | undefined;
|
|
5010
|
+
try {
|
|
5011
|
+
const { runId } = identity ?? resolveRunIdentity({ explicit: opts.runId });
|
|
5012
|
+
const entries = loadRunLedger(runId);
|
|
5013
|
+
const lastStop = entries?.slice().reverse().find((entry) => entry.event === 'stop');
|
|
5014
|
+
if (lastStop && isRunStopClass(lastStop.data.class)) stopClass = readRunStopRecord(lastStop)?.class;
|
|
5015
|
+
} catch { /* Unreadable STOP-RECORD is unknown, not an invented class. */ }
|
|
5016
|
+
const runtimeOverlayState = buildRuntimeOverlayState({
|
|
5017
|
+
attempts: round,
|
|
5018
|
+
...(opts.goalId === undefined ? {} : { goalId: opts.goalId }),
|
|
5019
|
+
...(stopClass === undefined ? {} : { stopClass }),
|
|
5020
|
+
...(reviewRepeat === undefined ? {} : { reviewRepeat }),
|
|
5021
|
+
});
|
|
4879
5022
|
const decision = decideTemplate({
|
|
4880
5023
|
goalType: graphGoalType,
|
|
4881
5024
|
authority: graphAuthority,
|
|
@@ -5210,6 +5353,7 @@ async function runSelfImplementInner(
|
|
|
5210
5353
|
let offDiffEvidence: OffDiffEvidenceParse = { items: [], discardedMissingVerify: 0, discardedEmptyClaim: 0, missingResult: 0, orphanResult: 0, truncatedResult: 0, anchoredEvidence: 0 };
|
|
5211
5354
|
let evidenceSource: 'diff-added-lines' | 'harvested' | 'summary-tail' = 'summary-tail';
|
|
5212
5355
|
// ⛔⭐ 하니스가 센 증거 충족도 — **로그에만 남기면 판정자가 못 본다**(원장 `JDG-S4`·`JDG-S5`).
|
|
5356
|
+
let uncoveredFeedbackUsed = false;
|
|
5213
5357
|
let evidenceCoverage: {
|
|
5214
5358
|
required: number;
|
|
5215
5359
|
covered: number;
|
|
@@ -5228,6 +5372,8 @@ async function runSelfImplementInner(
|
|
|
5228
5372
|
/** Review-budget leftovers and the body that carried them, so a later merge drafts from the same text. */
|
|
5229
5373
|
let preparedReviewBudgetPrBody: string | undefined;
|
|
5230
5374
|
const reviewMustFixCountHistory: number[] = [];
|
|
5375
|
+
const reviewedFindings: RecurrenceFinding[][] = [];
|
|
5376
|
+
const structuredRework = (): ReviewRework => measureReviewRework(reviewMustFixCountHistory, reviewedFindings);
|
|
5231
5377
|
const reviewMustFixTrend = (): string => {
|
|
5232
5378
|
if (reviewMustFixCountHistory.length < 2) return '아직 못 잰다';
|
|
5233
5379
|
return reviewMustFixCountHistory.every((count, index) => index === 0 || count < reviewMustFixCountHistory[index - 1]!)
|
|
@@ -5337,6 +5483,7 @@ async function runSelfImplementInner(
|
|
|
5337
5483
|
// 직전 gate 실패 라운드의 미검증 집합(정렬 키). 통과하면 비운다 — «연속» 반복만 센다.
|
|
5338
5484
|
let lastGateUnverifiedKey: string | undefined;
|
|
5339
5485
|
const reworkHistory: string[] = [];
|
|
5486
|
+
const roundSummaryEntries: RoundSummaryEntry[] = [];
|
|
5340
5487
|
const supervisorDecisionHistory: Array<{ round: number; verdict: ReworkBudgetVerdict; reason: string }> = [];
|
|
5341
5488
|
let judgedEffectiveMax: number | undefined;
|
|
5342
5489
|
let lastReworkVerdict: ReworkBudgetVerdict | undefined;
|
|
@@ -6100,7 +6247,7 @@ async function runSelfImplementInner(
|
|
|
6100
6247
|
'missing-cited-path': refutations.filter(({ kind }) => kind === 'missing-cited-path').length,
|
|
6101
6248
|
'found-cited-path': refutations.filter(({ kind }) => kind === 'found-cited-path').length,
|
|
6102
6249
|
});
|
|
6103
|
-
const acceptReviewBudget = async (unresolvedMustFix: readonly string[], hasNonReviewResidualWork: boolean) => {
|
|
6250
|
+
const acceptReviewBudget = async (unresolvedMustFix: readonly string[], hasNonReviewResidualWork: boolean, repeatedPod = false) => {
|
|
6104
6251
|
const decision = decideReworkSalvage({
|
|
6105
6252
|
hardCapBlockedExtend: false,
|
|
6106
6253
|
reviewBudgetExhausted: true,
|
|
@@ -6120,7 +6267,7 @@ async function runSelfImplementInner(
|
|
|
6120
6267
|
}, { level: 'warn' });
|
|
6121
6268
|
return { decision };
|
|
6122
6269
|
}
|
|
6123
|
-
const followUpMustFix = `\n\n## Follow-up must-fix (${decision.unresolvedMustFix.length})\n${decision.unresolvedMustFix.map((finding) => `- ${finding}`).join('\n')}`;
|
|
6270
|
+
const followUpMustFix = `\n\n## Follow-up must-fix (${decision.unresolvedMustFix.length})\n${decision.unresolvedMustFix.map((finding) => `- ${repeatedPod ? '[repeated] ' : ''}${finding}`).join('\n')}`;
|
|
6124
6271
|
const releaseNote = releaseNoteForRun(opts.goalFile, opts.feature);
|
|
6125
6272
|
// openPr's default seam delegates to PrManager.upsertPr, which stages, commits,
|
|
6126
6273
|
// and pushes this worktree after the note is written and before creating the PR.
|
|
@@ -6366,6 +6513,7 @@ async function runSelfImplementInner(
|
|
|
6366
6513
|
}
|
|
6367
6514
|
}
|
|
6368
6515
|
const before = effectiveMax;
|
|
6516
|
+
const gateBaselineOnly = baselineOnlyGate();
|
|
6369
6517
|
const budgetDecision = applyReworkBudgetDecision(
|
|
6370
6518
|
effectiveMax,
|
|
6371
6519
|
parsedDecision,
|
|
@@ -6374,7 +6522,13 @@ async function runSelfImplementInner(
|
|
|
6374
6522
|
priorHistory.length,
|
|
6375
6523
|
consecutiveUnresolvedBudget >= 2 ? false : shadowStop,
|
|
6376
6524
|
supervisorDecisionHistory.at(-1)?.verdict,
|
|
6525
|
+
gateBaselineOnly,
|
|
6377
6526
|
);
|
|
6527
|
+
if (reworkKind === 'gate' && parsedDecision?.verdict === 'SUFFICIENT' && gateBaselineOnly && budgetDecision.exit === 'proceed') {
|
|
6528
|
+
debug.log('self-implement.rework-budget', 'gate-sufficient-proceed', {
|
|
6529
|
+
runId, round, preexisting: gate!.baselineFailures!.filter(({ attribution }) => attribution === 'preexisting').length, introduced: 0,
|
|
6530
|
+
});
|
|
6531
|
+
}
|
|
6378
6532
|
effectiveMax = budgetDecision.effectiveMax;
|
|
6379
6533
|
if (parsedDecision) {
|
|
6380
6534
|
if (diagnosisRefutations) {
|
|
@@ -6575,12 +6729,14 @@ async function runSelfImplementInner(
|
|
|
6575
6729
|
if (isReviewRework(reworkKind)) {
|
|
6576
6730
|
if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
|
|
6577
6731
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', verdict: parsedDecision.verdict, reason: parsedDecision.reason, gate, decomposition: terminalDecomposition, salvageStatusExpected: false });
|
|
6732
|
+
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
6733
|
const quotaExhaustionAssessment = quotaExhaustionAssessmentForRun();
|
|
6579
6734
|
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
6735
|
}
|
|
6581
6736
|
const baselineStop = noRetryBaseline();
|
|
6582
6737
|
const reason = baselineStop.terminationReason ?? parsedDecision.reason;
|
|
6583
6738
|
const pr = await preserveBlockedArtifacts({ stage: 'gate-failed', verdict: parsedDecision.verdict, reason, gate, decomposition: terminalDecomposition, salvageStatusExpected: false });
|
|
6739
|
+
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
6740
|
const quotaExhaustionAssessment = quotaExhaustionAssessmentForRun();
|
|
6585
6741
|
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
6742
|
}
|
|
@@ -6604,10 +6760,12 @@ async function runSelfImplementInner(
|
|
|
6604
6760
|
if (isReviewRework(reworkKind)) {
|
|
6605
6761
|
if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
|
|
6606
6762
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', verdict: lastReworkVerdict, reason, gate, salvageStatusExpected: false });
|
|
6763
|
+
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked', unresolvedMustFix: review?.mustFix, feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
6607
6764
|
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
6765
|
}
|
|
6609
6766
|
const baselineStop = noRetryBaseline();
|
|
6610
6767
|
const pr = await preserveBlockedArtifacts({ stage: 'gate-failed', verdict: lastReworkVerdict, reason: baselineStop.terminationReason ?? reason, gate, salvageStatusExpected: false });
|
|
6768
|
+
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'gate-failed', feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
6611
6769
|
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
6770
|
}
|
|
6613
6771
|
const terminal = resolveRunOutcome({ termination: 'budget-exhausted', ...(lastReworkVerdict ? { lastVerdict: lastReworkVerdict } : {}) });
|
|
@@ -6620,14 +6778,38 @@ async function runSelfImplementInner(
|
|
|
6620
6778
|
if (isReviewRework(reworkKind)) {
|
|
6621
6779
|
if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
|
|
6622
6780
|
const reason = `review must-fix unresolved after ${round - 1} rework round(s)`;
|
|
6623
|
-
|
|
6624
|
-
|
|
6625
|
-
|
|
6781
|
+
const podResidue = podReviewBlockedDraft
|
|
6782
|
+
? classifyPodReviewBudgetResidue(currentBlockingFindings, previousBlockingFindings)
|
|
6783
|
+
: undefined;
|
|
6784
|
+
// ⛔ 사양 v2(OP 18:1x (a)): Pod 는 «전부 내용 해시(id) 반복»일 때만 수락한다 — 키로만 반복된 지적은 draft.
|
|
6785
|
+
// 수락은 draft→non-draft ⊕ followUpMustFix 기록까지다. 병합 판단은 언제나 hitl(자동 병합 없음 · #25941
|
|
6786
|
+
// `review-warn-with-must-fix` 와 같은 방향 — must-fix 가 남은 런은 어느 출구로도 자동 병합하지 않는다).
|
|
6787
|
+
const podAcceptable = podResidue?.status === 'all-repeated' && podResidue.keyOnlyRepeatedIds.length === 0;
|
|
6788
|
+
const podDecision = (accepted: boolean) => {
|
|
6789
|
+
if (!podResidue) return;
|
|
6790
|
+
debug.log('self-implement.review-budget', 'pod-accept-decision', {
|
|
6791
|
+
runId, status: podResidue.status, repeatedCount: podResidue.repeatedIds.length,
|
|
6792
|
+
newCount: podResidue.newIds.length, keyOnlyRepeatedCount: podResidue.keyOnlyRepeatedIds.length,
|
|
6793
|
+
accepted, merge: 'hitl',
|
|
6794
|
+
});
|
|
6795
|
+
};
|
|
6796
|
+
if (!podReviewBlockedDraft || podAcceptable) {
|
|
6626
6797
|
const acceptance = await acceptReviewBudget(
|
|
6627
6798
|
review?.mustFix ?? [],
|
|
6628
6799
|
reworkParts.some((part) => part.source === 'supervisor'),
|
|
6800
|
+
podReviewBlockedDraft,
|
|
6629
6801
|
);
|
|
6802
|
+
podDecision(acceptance.decision.action === 'accept');
|
|
6630
6803
|
if (acceptance.decision.action === 'accept') {
|
|
6804
|
+
if (podReviewBlockedDraft) {
|
|
6805
|
+
observe('merge-decision', {
|
|
6806
|
+
autoMerge: autoMergeEnabled(opts), reviewed: review?.reviewed === true, verdict: review?.verdict ?? 'none',
|
|
6807
|
+
decision: 'hitl', reason: 'review-budget-follow-up-required',
|
|
6808
|
+
mustFixCount: acceptance.decision.unresolvedMustFix.length,
|
|
6809
|
+
followUpMustFix: acceptance.decision.unresolvedMustFix,
|
|
6810
|
+
...(acceptance.pr ? { prNumber: acceptance.pr.number } : {}),
|
|
6811
|
+
});
|
|
6812
|
+
}
|
|
6631
6813
|
if (acceptance.pr) {
|
|
6632
6814
|
await draftFollowUpAfterMerge({
|
|
6633
6815
|
prNumber: acceptance.pr.number,
|
|
@@ -6656,7 +6838,7 @@ async function runSelfImplementInner(
|
|
|
6656
6838
|
detail: `${reason}; accepted with ${acceptance.decision.unresolvedMustFix.length} follow-up must-fix item(s)`,
|
|
6657
6839
|
};
|
|
6658
6840
|
}
|
|
6659
|
-
}
|
|
6841
|
+
} else podDecision(false);
|
|
6660
6842
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', reason, gate, salvageStatusExpected: true });
|
|
6661
6843
|
const salvage = blockedDraftNoChanges || blockedDraftPrFailure ? 'parked' : await salvageHardCap(canSalvage, pr);
|
|
6662
6844
|
const disposition = { ...terminal, ...(salvage ? { salvage } : {}) };
|
|
@@ -6689,9 +6871,39 @@ async function runSelfImplementInner(
|
|
|
6689
6871
|
}, { level: 'warn' });
|
|
6690
6872
|
}
|
|
6691
6873
|
}
|
|
6692
|
-
const
|
|
6693
|
-
? round0Feature
|
|
6874
|
+
const reworkFeature = round === 0 ? ''
|
|
6694
6875
|
: buildReworkFeature(opts.feature, round, effectiveMax, reworkPromptNote, stripReworkBudgetHeaders(diagnosis), appliedLastRound, refutableFindings, pendingPlanRevision, reworkKind, buildRefutationGuidance(), escalationJudgement);
|
|
6876
|
+
const card = round === 0 ? '' : renderRoundSummaryCard(roundSummaryEntries);
|
|
6877
|
+
const feature = round === 0 ? round0Feature : reworkFeature + (card ? `\n\n${card}` : '');
|
|
6878
|
+
if (card) {
|
|
6879
|
+
const latest = roundSummaryEntries[roundSummaryEntries.length - 1]!;
|
|
6880
|
+
const lastKey = latest.failedIds?.length ? JSON.stringify([...new Set(latest.failedIds)].sort()) : undefined;
|
|
6881
|
+
const repeatedWithRound = lastKey === undefined ? undefined : roundSummaryEntries.slice(0, -1)
|
|
6882
|
+
.find((entry) => entry.failedIds?.length && JSON.stringify([...new Set(entry.failedIds)].sort()) === lastKey)?.round;
|
|
6883
|
+
const omittedRounds = Number(/…\(앞 라운드 (\d+)개 생략\)/.exec(card)?.[1] ?? 0);
|
|
6884
|
+
observe('round-card', { round, entries: roundSummaryEntries.length, chars: card.length,
|
|
6885
|
+
...(repeatedWithRound === undefined ? {} : { repeatedWithRound }), omittedRounds,
|
|
6886
|
+
}, { category: 'self-dev.rework' });
|
|
6887
|
+
}
|
|
6888
|
+
if (round > 0) {
|
|
6889
|
+
// ⛔ 관측 전용 — 계산은 순수 함수가, 기록은 `observe`(= 런 원장)가 한다. 판정·분기·오버레이 상태는 건드리지 않는다.
|
|
6890
|
+
try {
|
|
6891
|
+
const latestEntry = roundSummaryEntries[roundSummaryEntries.length - 1];
|
|
6892
|
+
const gateRoundIds = latestEntry?.kind === 'gate'
|
|
6893
|
+
? roundSummaryEntries.filter((entry) => entry.kind === 'gate').map((entry) => entry.failedIds)
|
|
6894
|
+
: [];
|
|
6895
|
+
observe('flex-signals', {
|
|
6896
|
+
round,
|
|
6897
|
+
...computeFlexSignals({
|
|
6898
|
+
gateFailedIdsByRound: gateRoundIds,
|
|
6899
|
+
failureAttributions: reworkKind === 'gate' ? gate.baselineFailures?.map(({ attribution }) => attribution) : undefined,
|
|
6900
|
+
reviewRepeat,
|
|
6901
|
+
round,
|
|
6902
|
+
plannedRounds: effectiveMax,
|
|
6903
|
+
}),
|
|
6904
|
+
});
|
|
6905
|
+
} catch { /* observation must not interrupt rework */ }
|
|
6906
|
+
}
|
|
6695
6907
|
const refutationGuidanceEligible = round > 0 && refutableFindings.length > 0;
|
|
6696
6908
|
const dispatchedRefutationGuidance = refutationGuidancePresented(feature, refutationGuidanceEligible);
|
|
6697
6909
|
pendingPlanRevision = undefined;
|
|
@@ -7011,7 +7223,9 @@ async function runSelfImplementInner(
|
|
|
7011
7223
|
if (opts.goalFile) {
|
|
7012
7224
|
let goalDocument: string | undefined;
|
|
7013
7225
|
try { goalDocument = readFileSync(opts.goalFile, 'utf8'); } catch { /* unknown scope */ }
|
|
7014
|
-
|
|
7226
|
+
// 🩸 10-09: 범위 타입검사 임시 tsconfig(.elanous-typecheck-scope-*.json · scoped-typecheck-config.ts)가 옛 가지에 커밋된 뒤 지워지면
|
|
7227
|
+
// «추적 파일 삭제» 라 impact=critical → 결정 카드가 «irreversible» 로 대표에게 갔다(D-20·35·43·80). 하니스 임시물은 범위 판정 밖이다.
|
|
7228
|
+
const scope = detectDeclaredScopeDiff({ goalDocument, changedFiles: gateRouteFiles?.filter(file => !harnessSeededPaths.includes(file) && !isHarnessTempArtifact(file)), nameCap: gateRouteFiles?.length });
|
|
7015
7229
|
if (scope.status === 'known' && scope.outsideCount !== null && scope.outsideCount > 0) {
|
|
7016
7230
|
const result: ExecutionClarificationResult = await (s.askExecutionClarification ?? askAtExecution)({
|
|
7017
7231
|
id: 'execution_scope', decision: 'Changing files outside the authored target paths',
|
|
@@ -7272,6 +7486,10 @@ async function runSelfImplementInner(
|
|
|
7272
7486
|
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
7487
|
}
|
|
7274
7488
|
lastGateUnverifiedKey = unverifiedRepeatKey(gate.unverified);
|
|
7489
|
+
roundSummaryEntries.push({ round, kind: 'gate', tried: impl.summary.replace(/\s+/g, ' ').trim().slice(0, 200),
|
|
7490
|
+
failedIds: gate.baselineFailures?.map(({ name, file, attribution }) => `${name}@${file ?? '?'} (${attribution})`),
|
|
7491
|
+
filesTouched: gateRouteFiles,
|
|
7492
|
+
});
|
|
7275
7493
|
round++;
|
|
7276
7494
|
continue;
|
|
7277
7495
|
}
|
|
@@ -7425,7 +7643,13 @@ async function runSelfImplementInner(
|
|
|
7425
7643
|
...(review.failureReason !== undefined ? { failureReason: review.failureReason } : {}),
|
|
7426
7644
|
...(reviewArtifactPath ? { artifactPath: reviewArtifactPath } : {}),
|
|
7427
7645
|
});
|
|
7428
|
-
if (review.reviewed)
|
|
7646
|
+
if (review.reviewed) {
|
|
7647
|
+
reviewMustFixCountHistory.push(review.mustFix.length);
|
|
7648
|
+
reviewedFindings.push(review.mustFix.map((item) => ({ id: stableMustFixId(item), item })));
|
|
7649
|
+
onReworkMeasured(structuredRework());
|
|
7650
|
+
// The next runtime overlay sees completed review rounds, not consecutive repeats of one finding.
|
|
7651
|
+
reviewRepeat = reviewMustFixCountHistory.length - 1;
|
|
7652
|
+
}
|
|
7429
7653
|
progress('reviewed', review.reviewed
|
|
7430
7654
|
? `리뷰: ${review.verdict} (must-fix ${review.mustFix.length}·should-fix ${review.shouldFix.length}) · 추이 ${reviewMustFixCountHistory.join('→')} (${reviewMustFixTrend()})`
|
|
7431
7655
|
: `리뷰 미실행${review.failureReason !== undefined ? ` (${review.failureReason})` : ''}`);
|
|
@@ -7555,6 +7779,9 @@ async function runSelfImplementInner(
|
|
|
7555
7779
|
break;
|
|
7556
7780
|
}
|
|
7557
7781
|
appliedLastRound = [...effectiveMustFix];
|
|
7782
|
+
roundSummaryEntries.push({ round, kind: 'review', tried: impl.summary.replace(/\s+/g, ' ').trim().slice(0, 200),
|
|
7783
|
+
failedIds: effectiveMustFix.map(stableMustFixId), filesTouched: runFacts.changedFiles,
|
|
7784
|
+
});
|
|
7558
7785
|
refutableFindings = reviewMustFixFindings.filter(({ item }) => effectiveMustFix.includes(item));
|
|
7559
7786
|
const reviewFindingKeys = effectiveMustFix
|
|
7560
7787
|
.map(reviewFindingKey)
|
|
@@ -7604,6 +7831,18 @@ async function runSelfImplementInner(
|
|
|
7604
7831
|
continue;
|
|
7605
7832
|
}
|
|
7606
7833
|
}
|
|
7834
|
+
if (gate.passed && autoMergeEnabled(opts) && evidenceCoverage?.uncoveredCount && !uncoveredFeedbackUsed && round < effectiveMax) {
|
|
7835
|
+
const uncovered = [...evidenceCoverage.uncovered];
|
|
7836
|
+
const nextRound = round + 1;
|
|
7837
|
+
setReworkPart('review', formatUncoveredEvidenceFeedback(uncovered));
|
|
7838
|
+
uncoveredFeedbackUsed = true;
|
|
7839
|
+
debug.log('self-implement.evidence', 'uncovered-feedback', { uncovered, round: nextRound });
|
|
7840
|
+
bufferPrComment(round, 'author', `Round ${round}: child implementation completed.`, [
|
|
7841
|
+
`Child completion: ${impl.summary.trim() || '(summary unavailable)'}`,
|
|
7842
|
+
]);
|
|
7843
|
+
round = nextRound;
|
|
7844
|
+
continue;
|
|
7845
|
+
}
|
|
7607
7846
|
bufferPrComment(round, 'author', `Round ${round}: child implementation completed.`, [
|
|
7608
7847
|
`Child completion: ${impl.summary.trim() || '(summary unavailable)'}`,
|
|
7609
7848
|
]);
|
|
@@ -7636,7 +7875,12 @@ async function runSelfImplementInner(
|
|
|
7636
7875
|
const { latestSignalIncomplete } = signalIncompleteState(roundClassifications);
|
|
7637
7876
|
const autoMerge = autoMergeEnabled(opts);
|
|
7638
7877
|
const gateTimeoutUnmeasured = isTimeoutOnlyUnmeasuredGate(gate.reflectGateFacts);
|
|
7639
|
-
|
|
7878
|
+
// ⛔⭐ AUTOMERGE-WARN-MUSTFIX(0.2.24): 판정이 warn 이어도 must-fix 가 «남아» 있으면 자동 병합하지 않는다.
|
|
7879
|
+
// 루프 «안»은 `verdict === 'fail'` 일 때만 재작업하므로, warn ⊕ must-fix≥1 은 루프를 그대로 빠져나와
|
|
7880
|
+
// 종전 `verdict !== 'fail'` 만 보던 이 자리에서 auto 가 됐다(#25914 · #25934 · #25918 실물).
|
|
7881
|
+
// ⭐ 반사가 must-fix 를 «전부» 기각하면 위에서 `review.mustFix = []` 로 비우므로 그 길은 종전 그대로다.
|
|
7882
|
+
const reviewMustFixCount = review?.mustFix?.length ?? 0;
|
|
7883
|
+
let canAuto = !gateTimeoutUnmeasured && autoMerge && reviewReal && review!.verdict !== 'fail' && reviewMustFixCount === 0 && reviewDiffComplete && !requiredEvidenceMissing && !latestSignalIncomplete && !decisionSignalRed;
|
|
7640
7884
|
// ⭐⭐ 통과의 «이유»를 둘로 가른다 — ⛔ 막지는 «않는다»(대표 판단 2026-08-11: ⓐ 문면만).
|
|
7641
7885
|
// 📏 근거(`JDG-T36` · merge-decision 300건 전수): `verifyByBreaking` 이 실린 8건의 auto 중 ***5건***이
|
|
7642
7886
|
// ***ran=true 인데 distinguishes=0***(아무것도 안 가르는 자기검증)이었고, 그 다섯이 «전부»
|
|
@@ -7655,6 +7899,7 @@ async function runSelfImplementInner(
|
|
|
7655
7899
|
: latestSignalIncomplete ? 'signal-incomplete'
|
|
7656
7900
|
: !reviewReal ? 'no-real-review'
|
|
7657
7901
|
: review!.verdict === 'fail' ? 'review-must-fix'
|
|
7902
|
+
: reviewMustFixCount > 0 ? 'review-warn-with-must-fix'
|
|
7658
7903
|
: review!.diffTruncated === true ? 'review-diff-truncated'
|
|
7659
7904
|
: 'review-diff-budget-unknown';
|
|
7660
7905
|
let mergeSkipReason = canAuto ? undefined : mergeReason;
|
|
@@ -7662,6 +7907,7 @@ async function runSelfImplementInner(
|
|
|
7662
7907
|
const mergeDecisionObservation = {
|
|
7663
7908
|
autoMerge, reviewed: reviewReal, verdict: review?.verdict ?? 'none',
|
|
7664
7909
|
decision: canAuto ? 'auto' : 'hitl', reason: mergeReason,
|
|
7910
|
+
mustFixCount: reviewMustFixCount,
|
|
7665
7911
|
...mergeDecisionEvidenceCoverage(evidenceCoverage),
|
|
7666
7912
|
...(evidenceCoverage ? {
|
|
7667
7913
|
evidenceSource,
|