elanous 0.2.21 → 0.2.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +7 -0
- package/README.md +32 -22
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/{119fc678.6f591cdb84ca5791.js → 0673cc54.8e2ef1c23e49e190.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{a9f2b54d-40c16bd0efdb04b8.js → 0a09e062-34f747a17d8d8c2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{f8626309.a4e5d362b1d55e59.js → 0e3acd34.d42b2ef87fdf4234.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{7175-350f4ce2873bc038.js → 1325-dc3f3c21eb181cb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +34 -0
- package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.8e6c5f6e744fcd9f.js → 1505.5826671109111e75.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7327-2d69fb321ba73389.js → 1669-da843ed73aa301f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +36 -0
- package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +122 -0
- package/apps/pwa/out/_next/static/chunks/2528.0af5c0e1fad88df6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/272-b23d2e92161d11fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7899.597af4a9996c907f.js → 2721.bc9a8f36bd85c07a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +149 -0
- package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3961-fbef064c213b2b18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +309 -0
- package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d70879db.c66c56a95a91efc6.js → 4c5e95ce.83e9b16add6fcd8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6158.566c890adc06a459.js → 5313.1697309c532b9856.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{79b78388.663188133449d707.js → 53746282.1be36038d1abd949.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5578.ac963634373b28c6.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5967-c0a80f8ffe5d4050.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1268.0840ff91e083fcbd.js → 5974.360f8441eb0ac1ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +74 -0
- package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6571-926ddf024a6ad5df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +64 -0
- package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9832.2ab2e818013574c7.js → 6702.ebbd165d5e4a4a14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6110.1297d4093fdfbb0d.js → 740.90b31555290236a9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{9070.067c106528ec1ae6.js → 7518.49161e8f5814abdb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +27 -0
- package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +115 -0
- package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7905.b230b9d06cb4ad5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8194.484f51e273d9abd2.js → 8264.00e434fbd02e9311.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{088d8e8a.8069543d082bec12.js → 83cfc5c8.349535543c1548b6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{1948.5f35b39eef222a94.js → 8438.ee7f0df3b3f6fcb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4588.ad3364cb7fb97ada.js → 8532.a86e99acf9b761cb.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/8569.b853a8daa8f31d12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8925-2abfb48af477fb7f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{88729267.9c6c000157c83f2f.js → 89849432.9eaa2f4c9c010965.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +90 -0
- package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +41 -0
- package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +287 -0
- package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +79 -0
- package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3522-1de1319d028ac89c.js → 9502-32c5dc22e8f120f5.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{7630.2b9a68659053ff4e.js → 9976.8f28864317639fe6.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d5341ac96203a983.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-0160ab83c8685a12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-55c631c032dcc47e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ad3bd8084048bee4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e6784759a2531031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5c5d0e370f495ef6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-c325e21543cd48a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-111cabe4d1fd69ae.js → page-6168a7c43e6ef8f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-31417d3604154a6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-e9606dc0bdec9305.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-a648bc464c9dc754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25bb425afdb27541.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-32d72fdef1afe11a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27b794c8ba76bbb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-2bd9ce9c020d02d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a34096245e63b9f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-22170f4f00a15496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-4cc66d22ca4ec502.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83b14c729fcea837.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-6e2781c523dad761.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-26dd415c8f13f341.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-ccdb83ed40c8d724.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-7ad3de8fa06fdea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-015c02c4fec4023e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-6b0ae5b5c42f6d2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-786111f30b6f0969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-48fb31810693c357.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e17cce5e2ed0fee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-cb154acadb025414.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-16258e956ea93fc2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-c2dd2b19c93f90ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-85f35dd1dd96ae87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-d3c007c8a0ddd7ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7837ce2aacb97b04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7350ee93f4fe1033.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-00723458575f2b19.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-745d9b6c015076f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-736d33c7414a8a1a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-119be9a0444d2482.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-fa806c018833e332.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-c782041b5f5199ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-d431fbdea6ad93dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-0c056abff82b9891.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-242d668e4fbf72c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-847c3de6ca8a4416.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-81dd0d8ae923ed72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-74e69ba2c8e970d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-70038f41ae7cf931.js +1 -0
- package/apps/pwa/out/_next/static/chunks/b4e12462-5fab4a813a63dadd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f6b7c9ba.64a895b8b2fedbdc.js → ce383d63.d2ede338788ed18e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{framework-5c169757551134ed.js → framework-b2763b10dc6b3836.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +1 -0
- package/apps/pwa/out/_next/static/css/5619d59e87eddf66.css +1 -0
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +1 -0
- package/apps/pwa/out/_next/static/{MObU8ujkMciAKr6ljAV05 → rfkMm4movqkqMebBrCXiR}/_buildManifest.js +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +24 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +24 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/catalog/models/anthropic/claude-haiku-5-5.yaml +32 -0
- package/catalog/models/anthropic/claude-opus-5-5.yaml +5 -0
- package/catalog/models/anthropic/claude-sonnet-5-5.yaml +31 -0
- package/catalog/models/anthropic/claude-sonnet-5.yaml +8 -2
- package/catalog/models/openai/gpt-6-astra.yaml +6 -0
- package/catalog/models/openai/gpt-6-luna.yaml +6 -0
- package/catalog/models/openai/gpt-6-sol.yaml +6 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/drafts/recipes.yaml +2 -2
- package/graphs/log-horizon/log-horizon-watch.yaml +25 -0
- package/graphs/log-horizon/recipes.yaml +3 -0
- package/graphs/release/recipes.yaml +1 -1
- package/graphs/release/release-loop.yaml +6 -2
- package/graphs/release-rehearsal/recipes.yaml +12 -0
- package/graphs/release-rehearsal/release-rehearsal.yaml +17 -0
- package/graphs/test-diet/recipes.yaml +3 -0
- package/graphs/test-diet/test-diet.yaml +3 -1
- package/package.json +4 -1
- package/scripts/bench-report.ts +82 -3
- package/scripts/ci-typecheck-changed.ts +10 -1
- package/scripts/f-session-monitor.ts +69 -0
- package/scripts/hq/hq-fence-wrapper.sh +148 -0
- package/scripts/hq/standby-snapshot.ts +7 -3
- package/scripts/knowledge-compress.ts +11 -0
- package/scripts/lib/typecheck-ratchet.ts +51 -0
- package/scripts/nightly-docops.ts +90 -3
- package/scripts/openai-relay-server.ts +5 -1
- package/scripts/release-loop/docs-node.ts +258 -43
- package/scripts/release-loop/gate-method.ts +59 -0
- package/scripts/release-loop/gate-node.ts +73 -7
- package/scripts/release-loop/gate-wall.ts +208 -0
- package/scripts/release-loop/known-issues-node.ts +53 -8
- package/scripts/release-loop/publish-at.ts +14 -0
- package/scripts/release-loop/publish-node.ts +17 -2
- package/scripts/release-loop/resume-release.ts +34 -4
- package/scripts/release-loop/resume.ts +53 -0
- package/scripts/release-loop/shard-plan.ts +3 -11
- package/scripts/release-loop/tui-node-checks.ts +22 -0
- package/scripts/release-loop/unattended-release.ts +8 -1
- package/scripts/research-coo-admin-dates.ts +39 -0
- package/scripts/rhythm/daily.ts +51 -2
- package/scripts/rhythm/weekly.ts +3 -2
- package/scripts/skills/public-check.ts +7 -2
- package/scripts/smart-merge/resync-shadow.ts +5 -3
- package/scripts/test-diet/lib.ts +81 -1
- package/scripts/test-diet/node.ts +48 -2
- package/scripts/tsc-main-safety-net.ts +189 -0
- package/scripts/usage-rollup.ts +8 -4
- package/scripts/verify-coo-admin-evidence.ts +83 -0
- package/src/acp/client.ts +4 -2
- package/src/acp/codex-plugins.ts +48 -6
- package/src/agent/monad-agent-turn.ts +67 -5
- package/src/agent/run-context.ts +14 -0
- package/src/agent/tool-profile.ts +28 -2
- package/src/agent-env/profile.ts +25 -5
- package/src/agent-mission/acp-judge.ts +8 -2
- package/src/agent-mission/capabilities-cli.ts +16 -1
- package/src/agent-mission/driver.ts +27 -13
- package/src/agent-mission/pr-review-watch.ts +6 -2
- package/src/agent-mission/review-loop.ts +33 -5
- package/src/agent-mission/supervisor-metrics.ts +17 -2
- package/src/agent-substrate/acp-reviewer.ts +25 -9
- package/src/agent-substrate/pr-reviewer.ts +175 -32
- package/src/agent-substrate/review-intent.ts +106 -5
- package/src/agent-substrate/self-review-cli.ts +111 -16
- package/src/agent-substrate/shard-boundary-intent.ts +92 -26
- package/src/ask-user-question/pending-questions.ts +8 -2
- package/src/autopilot/build/llm-conflict-merge.ts +238 -20
- package/src/autopilot/codebase-grounding.ts +44 -0
- package/src/autopilot/llm-control-brain.ts +13 -1
- package/src/autopilot/mission-codebase-gate.ts +8 -77
- package/src/autopilot/pr-manager.ts +30 -11
- package/src/away/release-watch.ts +47 -8
- package/src/boot/acp-server.ts +4 -7
- package/src/boot/acp-socket-path.ts +7 -0
- package/src/briefing/brief-items.ts +123 -22
- package/src/chat/index.ts +13 -3
- package/src/cli/agent-cli.ts +20 -0
- package/src/cli/brief-cli.ts +46 -22
- package/src/cli/cli-user-error.ts +9 -2
- package/src/cli/config-classify.ts +83 -0
- package/src/cli/control-cli.ts +14 -0
- package/src/cli/decisions-cli.ts +26 -16
- package/src/cli/log-event-names.ts +3 -0
- package/src/cli/logs-cli.ts +1 -0
- package/src/cli/logs-model-input.ts +1 -1
- 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 +94 -9
- package/src/cli/pr-land-overlap-evidence.ts +131 -0
- package/src/cli/release-cli.ts +74 -15
- package/src/cli/self-update.ts +173 -10
- package/src/cli/skills-cli.ts +12 -3
- package/src/cli/tasks-cli.ts +241 -28
- package/src/connectors/types.ts +6 -6
- package/src/context-bus/context-first.ts +51 -2
- package/src/context-bus/context-now-surfaces.ts +29 -0
- package/src/context-bus/coord-events.ts +32 -4
- package/src/context-bus/long-term-memory.ts +26 -7
- package/src/context-bus/nightly-condense.ts +170 -21
- package/src/control/control-status.ts +87 -0
- package/src/control-plane/light-member.ts +5 -3
- package/src/control-plane/member.ts +172 -7
- package/src/core-turn/run-goal-loop.ts +108 -3
- package/src/dashboard/chat-fold.ts +20 -0
- package/src/dashboard/first-screen-band.ts +151 -1
- package/src/dashboard/index.ts +27 -5
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +14 -3
- package/src/dashboard/stale-install-check.ts +13 -2
- package/src/dashboard/turn-stream-formatter.ts +25 -0
- package/src/debug/log-diet.ts +159 -0
- package/src/debug/log.ts +52 -17
- package/src/decisions/decision-cards.ts +20 -1
- package/src/decisions/decision-ledger.ts +11 -8
- package/src/decisions/web-push-decision-cards.ts +19 -3
- package/src/discord-self-message.ts +2 -2
- package/src/display/coordinator.ts +25 -2
- package/src/domains/coo-admin-dates.evidence.json +876 -0
- package/src/domains/coo-admin-tool.ts +75 -14
- package/src/domains/cron-match.ts +1 -0
- package/src/domains/ops-status.ts +53 -0
- package/src/domains/outbound-alert.ts +41 -7
- package/src/domains/release-tool.ts +119 -10
- package/src/domains/schedule-registry.ts +10 -7
- package/src/domains/schedule-runner.ts +1 -0
- package/src/elanous-config-dir.ts +2 -2
- package/src/elanous-daemon.ts +3 -3
- package/src/exec-requests/planner.ts +6 -0
- package/src/execution-loop/launch-gate.ts +1 -1
- package/src/expression/i18n/messages.en.ts +5 -0
- package/src/expression/i18n/messages.ja.ts +5 -0
- package/src/expression/i18n/messages.ko.ts +5 -0
- package/src/expression/i18n/messages.zh.ts +5 -0
- package/src/expression/i18n/types.ts +8 -0
- package/src/github/pr-labels.ts +1 -0
- package/src/graph-kinds/registry.ts +6 -6
- package/src/graph-runner/graph-cli.ts +34 -2
- package/src/graph-runner/graph-run-api.ts +7 -0
- package/src/graph-runner/graph-tick.ts +73 -12
- package/src/graph-runner/runner.ts +94 -13
- package/src/graph-unify/wf-to-graph.ts +79 -0
- package/src/graph-wizard/generate.ts +34 -2
- package/src/graph-wizard/steps.ts +13 -0
- package/src/harness/dispatch-backpressure.ts +259 -0
- package/src/harness/harness-cli-command.ts +227 -50
- package/src/harness/harness-queue.ts +58 -14
- package/src/harness/harness-seams.ts +2 -20
- package/src/harness/harness-substrate-default.ts +72 -1
- package/src/harness/launch-advice.ts +23 -0
- package/src/harness/nested-elanous-policy.ts +4 -2
- package/src/hq/fence-wrapper.ts +7 -0
- package/src/hq/hq.ts +33 -2
- package/src/hq/lease.ts +13 -0
- package/src/hq/seats.ts +114 -18
- package/src/index.ts +199 -71
- package/src/intake-plane/collect-github.ts +19 -1
- package/src/intake-plane/digest.ts +45 -20
- package/src/intake-plane/lens.ts +36 -8
- package/src/intelligence-map/model-alias.ts +6 -0
- package/src/intelligence-map/model-catalog.ts +41 -0
- package/src/knowledge/conclusion-compress.ts +93 -0
- package/src/knowledge/kgs/pack.ts +5 -2
- package/src/knowledge/kgs/sqlite-store.ts +15 -0
- package/src/knowledge/know-find.ts +9 -2
- package/src/knowledge/query.ts +20 -0
- package/src/knowledge/tools/knowledge-query.ts +20 -2
- package/src/knowledge/write.ts +234 -2
- package/src/llm/bedrock-provider.ts +175 -0
- package/src/llm/bedrock.ts +345 -0
- package/src/llm/provider-credentials.ts +3 -1
- package/src/llm.ts +332 -51
- package/src/loops/budget.ts +150 -0
- package/src/loops/neighbor-runtime.ts +88 -0
- package/src/loops/orchestrator/author-depth.ts +29 -11
- package/src/loops/orchestrator/overlap.ts +7 -1
- package/src/loops/orchestrator/resync-shadow.ts +1 -1
- package/src/loops/orchestrator/seat-share.ts +6 -49
- package/src/loops/orchestrator/tick.ts +35 -2
- package/src/loops/orchestrator/traffic.ts +6 -80
- package/src/loops/registry.ts +5 -0
- package/src/market/publish.ts +17 -1
- package/src/market/signed-index.ts +42 -0
- package/src/maturity/feature-maturity.ts +2 -1
- package/src/mcp/mcp-oauth.ts +136 -17
- package/src/model-tier/llm-tier-map.ts +48 -4
- package/src/models/prompts.ts +22 -1
- package/src/mss/logging/horizon-watch.ts +168 -0
- package/src/mss/logging/log-store.ts +204 -15
- package/src/mss/logging/redaction.ts +17 -0
- 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/draft-metrics.ts +22 -8
- package/src/nexus/api/error-reports.ts +30 -8
- package/src/nexus/api/graph-peer-edit.ts +77 -0
- package/src/nexus/api/graph-wizard-api.ts +9 -1
- package/src/nexus/api/graphs-api.ts +145 -7
- package/src/nexus/api/http-server.ts +101 -8
- package/src/nexus/api/loop-resources.ts +42 -0
- package/src/nexus/api/outbound-report.ts +8 -3
- package/src/nexus/api/plugins-market.ts +24 -0
- package/src/nexus/api/telegram-trigger-bot.ts +6 -3
- package/src/nexus/index.ts +13 -2
- package/src/nexus/outbound/format.ts +2 -0
- package/src/nexus/outbound/router.ts +198 -13
- package/src/oauth/claude-pty-maturity.ts +24 -0
- package/src/oauth/codex-account-rotation.ts +16 -18
- package/src/oauth/codex-account-store.ts +134 -5
- package/src/oauth/fallback-chain.ts +50 -15
- package/src/onboarding.ts +2 -1
- package/src/plugins/adapters/claude-package.ts +4 -12
- package/src/plugins/core/capability-policy.ts +141 -0
- package/src/plugins/core/host.ts +21 -8
- package/src/plugins/core/manifest.ts +19 -2
- package/src/plugins/core/trust-store.ts +15 -0
- package/src/plugins/core/types.ts +12 -0
- package/src/plugins/install/market-fetch.ts +68 -16
- package/src/plugins/install/plugin-install.ts +187 -16
- package/src/plugins/maker/market-bundle.ts +9 -0
- package/src/plugins/maker/plugin-maker.ts +32 -21
- package/src/plugins/maker/wizard-generate.ts +87 -9
- package/src/policy/llm-policy.ts +24 -6
- package/src/process/pid-liveness.ts +1 -1
- package/src/prompt-cache/openai.ts +10 -6
- package/src/prompt-cache/openrouter.ts +94 -0
- package/src/prompt-enhance/enhance.ts +46 -5
- package/src/prompt-library/family-prompt-coverage.ts +1 -0
- package/src/prompt-library/universal-preamble.ts +2 -2
- package/src/registry/discovery/openrouter-live-resolve.ts +122 -0
- package/src/registry/loader.ts +6 -1
- package/src/release-loop/checklist-board.ts +27 -0
- package/src/release-loop/checklist.ts +62 -9
- package/src/release-loop/feature-store.ts +3 -0
- package/src/release-loop/gate-shards.ts +48 -4
- package/src/release-loop/landed-to-green.ts +81 -0
- package/src/release-loop/light-rc.ts +11 -1
- package/src/release-loop/merged-pr-checklist.ts +10 -0
- package/src/release-loop/placement.ts +91 -22
- package/src/release-loop/rehearsal.ts +317 -0
- package/src/release-loop/release-schedule.ts +13 -1
- package/src/release-loop/rubric-types.ts +1 -0
- package/src/release-loop/rubric.ts +2 -2
- package/src/retro/daily.ts +23 -9
- package/src/seat-address/seat-address.ts +1 -0
- package/src/seat-loop/seat-loop.ts +208 -21
- package/src/seat-loop/seat-report.ts +29 -1
- package/src/seat-loop/traffic-signal.ts +44 -0
- package/src/self-dev/ask-launch-flow.ts +2 -2
- package/src/self-dev/dev-cli.ts +157 -11
- package/src/self-dev/dev-pipeline.ts +18 -1
- package/src/self-dev/draft-residue.ts +463 -0
- package/src/self-dev/draft-sweep.ts +195 -17
- package/src/self-dev/draft-triage-rules.ts +27 -1
- package/src/self-dev/launch-preflight-text.ts +549 -0
- package/src/self-dev/launch-preflight.ts +10 -545
- package/src/self-dev/orchestrate-cli.ts +57 -2
- package/src/self-dev/orchestrate-summary-line.ts +13 -0
- package/src/self-dev/orchestrate.ts +9 -133
- package/src/self-dev/review-provider-fallback.ts +179 -0
- package/src/self-dev/run-store.ts +1 -3
- package/src/self-dev/run-supervisor.ts +8 -23
- package/src/self-dev/run-types.ts +178 -0
- package/src/self-dev/shard-aggregate.ts +61 -13
- package/src/self-dev/shard-plan.ts +5 -1
- package/src/self-dev/shard-run.ts +23 -5
- package/src/self-dev/supervisor-verdict-edges.ts +2 -4
- package/src/self-implement/blocked-draft-policy.ts +3 -19
- package/src/self-implement/draft-on-stop-mode.ts +18 -0
- package/src/self-implement/follow-up-goals.ts +114 -38
- package/src/self-implement/gate-baseline-reap.ts +157 -0
- package/src/self-implement/gate-baseline.ts +78 -16
- package/src/self-implement/gate-cli.ts +12 -2
- package/src/self-implement/gate-remote.ts +17 -6
- package/src/self-implement/goal-author.ts +24 -4
- package/src/self-implement/goal-digest.ts +19 -0
- package/src/self-implement/graph-overlay-condition.ts +4 -0
- package/src/self-implement/harness-policy-gates.ts +7 -5
- package/src/self-implement/headless-elanous-driver.ts +11 -9
- package/src/self-implement/host-regate.ts +148 -43
- package/src/self-implement/l8-merge-queue.ts +147 -13
- 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 +201 -43
- package/src/self-implement/review-finding-recurrence.ts +28 -0
- package/src/self-implement/rework-policy.ts +2 -1
- package/src/self-implement/round-summary-card.ts +63 -0
- package/src/self-implement/run-ledger.ts +4 -3
- package/src/self-implement/run-step-projection.ts +147 -0
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/seams.ts +41 -6
- package/src/self-implement/self-implement-cli.ts +6 -0
- 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/shell-env-bootstrap.ts +19 -4
- package/src/skills/gift-install.ts +119 -0
- package/src/skills/runner.ts +59 -2
- package/src/skills/skill-feedback.ts +31 -1
- package/src/skills/skill-tier.ts +1 -0
- package/src/smart-wizard/capability-index.ts +231 -0
- package/src/smart-wizard/rung.ts +74 -0
- package/src/steward/launch.ts +20 -9
- package/src/steward/triage.ts +29 -10
- package/src/storage/file-lock.ts +40 -4
- package/src/task-agent/actions.ts +4 -0
- package/src/task-agent/card-evidence.ts +59 -13
- package/src/task-agent/completion-evidence.ts +31 -3
- package/src/task-agent/cover.ts +61 -0
- package/src/task-agent/judge.ts +4 -3
- package/src/task-agent/land-worktree.ts +201 -0
- package/src/task-agent/live-move-history.ts +133 -0
- package/src/task-agent/live-moves.ts +222 -12
- package/src/task-agent/parent-host.ts +117 -8
- package/src/task-agent/rejudge-on-head.ts +297 -0
- package/src/task-agent/review-result-capture.ts +218 -0
- package/src/task-agent/shadow.ts +118 -7
- package/src/task-agent/task-hand.ts +138 -11
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +29 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +6 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +16 -2
- package/src/task-orchestrator/surfaces/pod-image-source.ts +212 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +93 -12
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +25 -2
- package/src/task-orchestrator/surfaces/pod-pool.ts +203 -28
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +259 -36
- package/src/task-orchestrator/surfaces/self-implement.ts +11 -0
- package/src/telegram-commands.ts +8 -0
- package/src/telegram-project-command.ts +6 -0
- 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 +2 -1
- package/src/user-config.ts +167 -28
- 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/executor.ts +24 -2
- package/src/workflow-runtime/triggers/registry.ts +27 -0
- package/src/workflow-runtime/triggers/schedule-source.ts +30 -3
- package/src/workflow-runtime/triggers/scheduler.ts +1 -0
- package/apps/pwa/out/_next/static/chunks/1109.78a7a3288c0259d9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/115.1c6690b8604f81c4.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1262.76a3f08e67c5f816.js +0 -309
- package/apps/pwa/out/_next/static/chunks/1307-c97eba9fb72a9a5e.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-ff55a35b202c0f94.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-995ea9f5ef33d71e.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/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-59fedea50d13c762.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-f1762140ef9a96b1.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-7581825d511a64c0.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/9497-b0e758d1cd4ae8d7.js +0 -1
- 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-937c92292a4ab4f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-d781be3e3a9cfd74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b0a80997903852d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-2b1263165630d9c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea998f7f5d156bea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-33c328b64ca508f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e2d6bed48ac20120.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-544dd4bd4847eeb7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-3ee191319bf97d87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e4bcb2c503dab04b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-300897dcbbd5ed76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a449f1ed472b81c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-9045094d6d3b5cd0.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-c06673596849ef45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-103fa3191c1b2e08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-9f81233f29dcd409.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-be8b4615c919e36c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-c685b104e0dfa609.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-8d693331cfbb6add.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-cef4f30a4c22fae1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66ea1b54fc83fa15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-7a12f61be4a579d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-c85b0589591a99c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-725a4da02dd129eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8cc707bd09a497d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-90b55be1f15ce0e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cb16606e08be65db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-16dc64b74ed6a40a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-21bec4afeb2f0917.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-dc39ee7a36d26385.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-84ae759f76053672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-3db58ddb61fe2be9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c5315e30f3528dc4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-2fe368efb6de3b6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8d04132dd0ac5e10.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-f23484de467c9ea3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-c69762987b751174.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-5456692bda39aafb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d75f7cd65845ce98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-5603f5e568b25ce3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-d2cc0f4e89f42028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a6eb73b8a4840f1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-c0a3f4d10edb83fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6c0b88068c143f15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-7f8d7fcdf058a845.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-22163556cd38bc88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-141436fd26dd56fc.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/e81df11490b4413b.css +0 -1
- /package/apps/pwa/out/_next/static/{MObU8ujkMciAKr6ljAV05 → rfkMm4movqkqMebBrCXiR}/_ssgManifest.js +0 -0
|
@@ -59,6 +59,8 @@ export interface ReviewResult {
|
|
|
59
59
|
* ⚠️ 미주입(`llmReview` 없음)은 «실패가 아니라 미검토»라 이 칸을 안 채운다 — 둘을 구분한다.
|
|
60
60
|
*/
|
|
61
61
|
failureReason?: string;
|
|
62
|
+
/** Subscription reviewer unavailable: the default reviewer produced this verdict. */
|
|
63
|
+
reviewerFallback?: string;
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
/** 모든 리뷰 관측 생산자가 공유하는 diff 예산 필드 계약. 예산 부재는 빈 객체로 보존한다.
|
|
@@ -300,7 +302,7 @@ export function planReviewChunks(
|
|
|
300
302
|
*/
|
|
301
303
|
export function foldReviewResults(
|
|
302
304
|
results: readonly ReviewResult[],
|
|
303
|
-
): Pick<ReviewResult, 'verdict' | 'mustFix' | 'shouldFix' | 'requirements' | 'reviewed' | 'failureReason'> {
|
|
305
|
+
): Pick<ReviewResult, 'verdict' | 'mustFix' | 'shouldFix' | 'requirements' | 'reviewed' | 'failureReason' | 'reviewerFallback'> {
|
|
304
306
|
const dedupe = (values: readonly string[]): string[] => [...new Set(values)];
|
|
305
307
|
const collect = (pick: (r: ReviewResult) => readonly string[] | undefined): string[] =>
|
|
306
308
|
dedupe(results.flatMap((r) => [...(pick(r) ?? [])]));
|
|
@@ -311,6 +313,7 @@ export function foldReviewResults(
|
|
|
311
313
|
const shouldFix = collect((r) => r.shouldFix).slice(0, 6);
|
|
312
314
|
const requirements = collect((r) => r.requirements);
|
|
313
315
|
const failed = results.find((r) => r.reviewed !== true);
|
|
316
|
+
const reviewerFallback = results.find((r) => r.reviewerFallback)?.reviewerFallback;
|
|
314
317
|
return {
|
|
315
318
|
verdict,
|
|
316
319
|
mustFix,
|
|
@@ -318,6 +321,7 @@ export function foldReviewResults(
|
|
|
318
321
|
...(requirements.length ? { requirements } : {}),
|
|
319
322
|
reviewed: results.length > 0 && failed === undefined,
|
|
320
323
|
...(failed?.failureReason ? { failureReason: failed.failureReason } : {}),
|
|
324
|
+
...(reviewerFallback ? { reviewerFallback } : {}),
|
|
321
325
|
};
|
|
322
326
|
}
|
|
323
327
|
|
|
@@ -426,14 +430,38 @@ function referencedRepositoryPaths(prDiff: string): string[] {
|
|
|
426
430
|
|
|
427
431
|
const REVIEWER_CONTEXT_MAX_CHARS = 12_000;
|
|
428
432
|
|
|
433
|
+
/** Decode the a-side of a diff header, including Git's quoted UTF-8 octal paths. */
|
|
434
|
+
function reviewerContextDiffPath(chunk: string): string | undefined {
|
|
435
|
+
const header = /^diff --git ("(?:\\.|[^"\\])*"|a\/[^ \n]+) (?:"(?:\\.|[^"\\])*"|b\/[^ \n]+)(?:\r?\n|$)/.exec(chunk);
|
|
436
|
+
if (!header) return undefined;
|
|
437
|
+
const token = header[1]!;
|
|
438
|
+
if (!token.startsWith('"')) return token.slice(2);
|
|
439
|
+
const bytes: number[] = [];
|
|
440
|
+
const escapes: Record<string, number> = { a: 7, b: 8, t: 9, n: 10, v: 11, f: 12, r: 13, '"': 34, '\\': 92 };
|
|
441
|
+
const body = token.slice(1, -1);
|
|
442
|
+
for (let i = 0; i < body.length; i += 1) {
|
|
443
|
+
// Decode by code point so astral characters (emoji) keep both surrogate halves.
|
|
444
|
+
const codePoint = body.codePointAt(i)!;
|
|
445
|
+
const char = String.fromCodePoint(codePoint);
|
|
446
|
+
if (char !== '\\') { bytes.push(...Buffer.from(char, 'utf8')); if (codePoint > 0xffff) i += 1; continue; }
|
|
447
|
+
const octal = body.slice(i + 1, i + 4);
|
|
448
|
+
if (/^[0-7]{3}$/.test(octal)) { bytes.push(parseInt(octal, 8)); i += 3; continue; }
|
|
449
|
+
const next = body[++i]!;
|
|
450
|
+
if (escapes[next] !== undefined) bytes.push(escapes[next]);
|
|
451
|
+
else bytes.push(...Buffer.from(next, 'utf8'));
|
|
452
|
+
}
|
|
453
|
+
const path = Buffer.from(bytes).toString('utf8');
|
|
454
|
+
return path.startsWith('a/') ? path.slice(2) : undefined;
|
|
455
|
+
}
|
|
456
|
+
|
|
429
457
|
/** Bound each ordered human-supplied item independently so an early large item cannot evict later context. */
|
|
430
|
-
|
|
431
|
-
items: readonly ReviewerContextItem[]
|
|
432
|
-
maxChars
|
|
433
|
-
): ReviewerContextBudget {
|
|
458
|
+
function budgetReviewerContextWithParts(
|
|
459
|
+
items: readonly ReviewerContextItem[],
|
|
460
|
+
maxChars: number,
|
|
461
|
+
): { budget: ReviewerContextBudget; partsByItem: (string | undefined)[] } {
|
|
434
462
|
const fullText = items.map((item) => `### ${item.label}\n${item.body}`).join('\n\n');
|
|
435
463
|
if (items.length === 0) {
|
|
436
|
-
return { text: '', itemCount: 0, shownChars: 0, totalChars: 0, truncated: false, fullyIncludedItems: 0, truncatedItems: 0, omittedItems: 0 };
|
|
464
|
+
return { budget: { text: '', itemCount: 0, shownChars: 0, totalChars: 0, truncated: false, fullyIncludedItems: 0, truncatedItems: 0, omittedItems: 0 }, partsByItem: [] };
|
|
437
465
|
}
|
|
438
466
|
const separatorChars = (items.length - 1) * 2;
|
|
439
467
|
const itemBudget = Math.max(0, Math.floor((maxChars - separatorChars) / items.length));
|
|
@@ -485,17 +513,27 @@ export function budgetReviewerContext(
|
|
|
485
513
|
const omittedItems = items.length - parts.length;
|
|
486
514
|
const text = parts.join('\n\n');
|
|
487
515
|
return {
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
516
|
+
budget: {
|
|
517
|
+
text,
|
|
518
|
+
itemCount: items.length,
|
|
519
|
+
shownChars: text.length,
|
|
520
|
+
totalChars: fullText.length,
|
|
521
|
+
truncated: text.length < fullText.length,
|
|
522
|
+
fullyIncludedItems,
|
|
523
|
+
truncatedItems,
|
|
524
|
+
omittedItems,
|
|
525
|
+
},
|
|
526
|
+
partsByItem,
|
|
496
527
|
};
|
|
497
528
|
}
|
|
498
529
|
|
|
530
|
+
export function budgetReviewerContext(
|
|
531
|
+
items: readonly ReviewerContextItem[] = [],
|
|
532
|
+
maxChars = REVIEWER_CONTEXT_MAX_CHARS,
|
|
533
|
+
): ReviewerContextBudget {
|
|
534
|
+
return budgetReviewerContextWithParts(items, maxChars).budget;
|
|
535
|
+
}
|
|
536
|
+
|
|
499
537
|
function reviewerContextSection(
|
|
500
538
|
items: readonly ReviewerContextItem[] | undefined,
|
|
501
539
|
budget = items?.length ? budgetReviewerContext(items) : undefined,
|
|
@@ -560,6 +598,9 @@ export function buildReviewPrompt(
|
|
|
560
598
|
|
|
561
599
|
return [
|
|
562
600
|
'You are a strict staff-engineer reviewing an ALREADY-OPENED pull request from an autonomous coding agent.',
|
|
601
|
+
// ⚠️ 무표식 절단 금지(리뷰 must-fix) — 잘렸으면 **어느 절부터**인지 리뷰어가 알아야 한다.
|
|
602
|
+
phaseIntentHeading, phaseIntent,
|
|
603
|
+
...(input.acceptance ? ['## Acceptance criteria', input.acceptance.slice(0, 1000)] : []),
|
|
563
604
|
'This is a POST-PR review of the produced artifact. Judge whether the PR actually',
|
|
564
605
|
'delivers the phase intent CORRECTLY and soundly: (1) correctness/latent bugs, (2) does it meet the stated',
|
|
565
606
|
'acceptance criteria, (3) design/regression risk, (4) missing wiring (new code never called), (5) tests present',
|
|
@@ -584,9 +625,6 @@ export function buildReviewPrompt(
|
|
|
584
625
|
' and check that the error names that site; use values the real caller produces instead of synthetic input.',
|
|
585
626
|
'Do NOT rubber-stamp; an empty review is a failed review — always surface at least a watch item.',
|
|
586
627
|
'',
|
|
587
|
-
// ⚠️ 무표식 절단 금지(리뷰 must-fix) — 잘렸으면 **어느 절부터**인지 리뷰어가 알아야 한다.
|
|
588
|
-
phaseIntentHeading, phaseIntent,
|
|
589
|
-
...(input.acceptance ? ['## Acceptance criteria', input.acceptance.slice(0, 1000)] : []),
|
|
590
628
|
...(input.workingMemory ? ['## Prior decisions / reuse boundaries (working memory)', input.workingMemory.slice(0, 1200)] : []),
|
|
591
629
|
// ⭐ 증거가 무엇인지 먼저 말한다 — 규칙 (7) 이 "의도를 넘어선 변경" 을 판정하려면
|
|
592
630
|
// diff 에 담긴 것이 **이 PR 이 저작한 것인지**를 알아야 한다.
|
|
@@ -605,10 +643,38 @@ export function buildReviewPrompt(
|
|
|
605
643
|
].join('\n');
|
|
606
644
|
}
|
|
607
645
|
|
|
646
|
+
/** «지적 없음» 표지 — 일부 모델(GLM-5.3 실측)이 빈 섹션 대신 `- (없음 — …)` / `- none` 을 항목으로 쓴다.
|
|
647
|
+
* ⭐ 표지 «만»인 항목을 0건으로 접는다. 두 모양뿐이다:
|
|
648
|
+
* ① 낱말 하나(`none`·`없음`·`N/A`·`해당 없음` · 끝 마침표 허용)
|
|
649
|
+
* ② 항목 «전체»가 괄호에 싸인 표지 — 설명이 붙으면 그 설명이 «지적이 없다»는 말일 때만
|
|
650
|
+
* (`(없음 — 블로커 수준의 결함은 발견되지 않음)` · `(none — no blockers)`).
|
|
651
|
+
* ⛔ 그 밖은 «지적»으로 남긴다 — `없음 — 인증 검사가 없어 …` · `(none: the new export is never called)` ·
|
|
652
|
+
* `none of the tests …`. 표지 낱말로 시작하는 실제 블로커를 지우면 PASS/WARN 리뷰에서 블로커가 사라진다. */
|
|
653
|
+
const NONE_WORD = String.raw`(?:없음|해당\s*없음|n\/a|none|nothing)`;
|
|
654
|
+
const BARE_SENTINEL = new RegExp(String.raw`^${NONE_WORD}\s*[.。]?$`, 'i');
|
|
655
|
+
const BRACKETED_SENTINEL = new RegExp(String.raw`^[([(【]\s*${NONE_WORD}(?:\s*[—–\-:.,;]\s*([^)\])】]*))?\s*[)\])】]$`, 'i');
|
|
656
|
+
// ⭐ 설명 «전체»가 「지적 없음」 한 문장일 때만 — 일부만 맞아도 접으면 `(none: no blockers are checked because …)` 같은 지적이 사라진다.
|
|
657
|
+
const NO_FINDING_REMARK = new RegExp([
|
|
658
|
+
String.raw`^(?:(?:블로커|차단)\s*)?(?:수준의?\s*)?(?:결함|문제|이슈|지적|블로커)(?:은|는|이|가)?\s*(?:발견되지\s*않(?:음|았(?:다|습니다)?)|없(?:음|다|습니다))[.。]?$`,
|
|
659
|
+
String.raw`^(?:no|zero)\s+(?:blocking\s+)?(?:blockers?|issues?|problems?|findings?|must-?fix(?:es)?)(?:\s+found)?\.?$`,
|
|
660
|
+
String.raw`^nothing\s+(?:blocking|to\s+fix)\.?$`,
|
|
661
|
+
].join('|'), 'i');
|
|
662
|
+
function isNoneSentinelFinding(finding: string): boolean {
|
|
663
|
+
const text = finding.trim();
|
|
664
|
+
if (BARE_SENTINEL.test(text)) return true;
|
|
665
|
+
const bracketed = BRACKETED_SENTINEL.exec(text);
|
|
666
|
+
if (!bracketed) return false;
|
|
667
|
+
const remark = bracketed[1]?.trim();
|
|
668
|
+
return !remark || NO_FINDING_REMARK.test(remark);
|
|
669
|
+
}
|
|
670
|
+
|
|
608
671
|
/** critic 응답 파싱 → ReviewResult. 순수함수. VERDICT + MUST-FIX/SHOULD-FIX/REQUIREMENTS 섹션 분해.
|
|
609
672
|
* verdict=FAIL 인데 must-fix 미기재면 첫 finding 을 must 로 승격(블로커 근거 보존). */
|
|
673
|
+
/** ⭐ `VERDICT: PASS|WARN|FAIL` 판정 줄 — `parseReviewResult` 와 `reviewedResultFromRaw` 가 «같은» 정규식을 쓴다(존재 판정이 갈리면 안 된다). */
|
|
674
|
+
const VERDICT_LINE = /VERDICT:\s*(PASS|WARN|FAIL)/i;
|
|
675
|
+
|
|
610
676
|
export function parseReviewResult(text: string): ReviewResult {
|
|
611
|
-
const vm =
|
|
677
|
+
const vm = VERDICT_LINE.exec(text);
|
|
612
678
|
const verdict = (vm ? vm[1]!.toLowerCase() : 'pass') as ReviewVerdict;
|
|
613
679
|
const lines = text.split('\n').map((l) => l.trim());
|
|
614
680
|
const mustFix: string[] = [];
|
|
@@ -624,7 +690,7 @@ export function parseReviewResult(text: string): ReviewResult {
|
|
|
624
690
|
if (l.startsWith('- ')) {
|
|
625
691
|
const f = l.slice(2).trim();
|
|
626
692
|
if (!f) continue;
|
|
627
|
-
if (section === 'must') mustFix.push(f);
|
|
693
|
+
if (section === 'must') { if (!isNoneSentinelFinding(f)) mustFix.push(f); }
|
|
628
694
|
else if (section === 'should') shouldFix.push(f);
|
|
629
695
|
else if (section === 'requirements') requirements.push(f);
|
|
630
696
|
else fallbackFinding ??= f;
|
|
@@ -634,14 +700,44 @@ export function parseReviewResult(text: string): ReviewResult {
|
|
|
634
700
|
const first = shouldFix.shift() ?? fallbackFinding;
|
|
635
701
|
mustFix.push(first ?? 'PR 리뷰 FAIL — 재작업 필요(구체 지적 미파싱).');
|
|
636
702
|
}
|
|
703
|
+
const fallback = text.match(/\n\[reviewer fallback: ([^\r\n]+)\]$/);
|
|
637
704
|
return {
|
|
638
705
|
verdict,
|
|
639
706
|
mustFix: mustFix.slice(0, 6),
|
|
640
707
|
shouldFix: shouldFix.slice(0, 6),
|
|
708
|
+
...(fallback ? { reviewerFallback: fallback[1] } : {}),
|
|
641
709
|
...(requirements.length ? { requirements } : {}),
|
|
642
710
|
};
|
|
643
711
|
}
|
|
644
712
|
|
|
713
|
+
/** 판정 줄 없는 응답의 사유 값 — 기존 «리뷰 못 함» 경로(`reviewed:false` ⊕ `failureReason`)를 그대로 탄다. */
|
|
714
|
+
export const NO_VERDICT_LINE_REASON = 'no-verdict-line';
|
|
715
|
+
|
|
716
|
+
/**
|
|
717
|
+
* ⛔⭐⭐ REVIEW-NO-VERDICT-FAILCLOSED(2026-10-10) — 리뷰어 응답 «하나»를 결과로 접는다.
|
|
718
|
+
* `parseReviewResult` 는 `VERDICT:` 줄이 없으면 `pass` 로 기본값을 둔다. 종전 호출부는 거기에
|
|
719
|
+
* `reviewed: true` 를 붙여서, 자격 없는 리뷰어의 219자 오류 문구가 «지적 0 인 PASS» 로 접혔다
|
|
720
|
+
* (실물: run-dbe7b7df · PR #25906 · codex-app-server 17초).
|
|
721
|
+
* ⇒ 판정 줄이 없으면 «리뷰 못 함»(`reviewed:false` · `failureReason=no-verdict-line`)이다 —
|
|
722
|
+
* catch 경로와 «같은 모양»이라 소비처(orchestrator·seams·renderReview·fold)가 이미 «통과 판정 아님»으로 다룬다.
|
|
723
|
+
* ⭐ 판정 줄이 «있는» 응답은 `parseReviewResult(raw)` ⊕ `reviewed:true` 그대로 — 바이트 동일.
|
|
724
|
+
* ⛔ 계약: `reviewed:false` 일 때 `verdict` 는 «의미 없는 자리값»(`pass`)이다 — catch·미주입 경로와 같다.
|
|
725
|
+
* 소비처는 `reviewed` 를 «먼저» 본다(`renderReview`·`self-review-cli`·`review-adapter`·orchestrator).
|
|
726
|
+
*/
|
|
727
|
+
function reviewedResultFromRaw(raw: string, runId: string | undefined, pass?: { index: number; of: number }): ReviewResult {
|
|
728
|
+
if (VERDICT_LINE.test(raw)) return { ...parseReviewResult(raw), reviewed: true };
|
|
729
|
+
try {
|
|
730
|
+
debug.log('review.verdict', NO_VERDICT_LINE_REASON, {
|
|
731
|
+
chars: raw.length,
|
|
732
|
+
head: safeLogText(raw, 80),
|
|
733
|
+
...(pass ? { pass: pass.index + 1, passes: pass.of } : {}),
|
|
734
|
+
// ⛔ backend 는 안 남긴다 — 이 함수는 어느 백엔드로 불렸는지 «모른다»(catch 주석 `#7495` 와 같은 이유).
|
|
735
|
+
...(runId !== undefined ? { runId } : {}),
|
|
736
|
+
});
|
|
737
|
+
} catch { /* Observation must not prevent the review. */ }
|
|
738
|
+
return { verdict: 'pass', mustFix: [], shouldFix: [], reviewed: false, failureReason: NO_VERDICT_LINE_REASON };
|
|
739
|
+
}
|
|
740
|
+
|
|
645
741
|
function failureReasonText(error: unknown): string {
|
|
646
742
|
if (error instanceof Error) return safeLogText(error.message, 400);
|
|
647
743
|
if (typeof error === 'string') return safeLogText(error, 400);
|
|
@@ -669,7 +765,56 @@ export async function reviewPullRequest(
|
|
|
669
765
|
if (!llmReview) return { verdict: 'pass', mustFix: [], shouldFix: [], reviewed: false }; // 리뷰어 미주입=미검토.
|
|
670
766
|
try {
|
|
671
767
|
const diffBudget = budgetedDiff(input.prDiff);
|
|
672
|
-
|
|
768
|
+
// Existing caller: self-review-cli.ts runSelfReviewCliCommand → deps.reviewPullRequest(reviewInput, llmReview).
|
|
769
|
+
const plan = planReviewChunks(input.prDiff);
|
|
770
|
+
const chunked = plan.passes.length > 1;
|
|
771
|
+
const contextItems = input.reviewerContext ?? [];
|
|
772
|
+
const passPaths = chunked ? plan.passes.map((pass) => new Set(
|
|
773
|
+
splitDiffByFile(pass).flatMap((chunk) => {
|
|
774
|
+
// self-review-cli.ts runSelfReviewCliCommand → deps.reviewPullRequest(reviewInput, llmReview) → this pass.
|
|
775
|
+
const path = reviewerContextDiffPath(chunk);
|
|
776
|
+
return path === undefined ? [] : [path];
|
|
777
|
+
}),
|
|
778
|
+
)) : [];
|
|
779
|
+
const matchedLabels = new Set(passPaths.flatMap((paths) => [...paths]));
|
|
780
|
+
const passContext = chunked && contextItems.length ? passPaths.map((paths, passIndex) => {
|
|
781
|
+
const indices = contextItems.flatMap((item, index) =>
|
|
782
|
+
item.image ? (passIndex === 0 ? [index] : [])
|
|
783
|
+
: !matchedLabels.has(item.label) || paths.has(item.label) ? [index] : []);
|
|
784
|
+
const { budget, partsByItem } = budgetReviewerContextWithParts(indices.map((index) => contextItems[index]!), REVIEWER_CONTEXT_MAX_CHARS);
|
|
785
|
+
return { indices, budget, partsByItem };
|
|
786
|
+
}) : [];
|
|
787
|
+
const chunkContextBudget = passContext.length ? (() => {
|
|
788
|
+
const shownByItem: Array<number | undefined> = contextItems.map(() => undefined);
|
|
789
|
+
const status: Array<'omitted' | 'truncated' | 'full' | undefined> = contextItems.map(() => undefined);
|
|
790
|
+
for (const { indices, partsByItem } of passContext) {
|
|
791
|
+
indices.forEach((itemIndex, position) => {
|
|
792
|
+
const part = partsByItem[position];
|
|
793
|
+
// Count each item once at its narrowest pass: a loss in any pass must show in shownChars.
|
|
794
|
+
const shown = part?.length ?? 0;
|
|
795
|
+
shownByItem[itemIndex] = Math.min(shownByItem[itemIndex] ?? shown, shown);
|
|
796
|
+
const full = `### ${contextItems[itemIndex]!.label}\n${contextItems[itemIndex]!.body}`;
|
|
797
|
+
if (part !== full) status[itemIndex] = part === undefined && status[itemIndex] !== 'truncated' ? 'omitted' : 'truncated';
|
|
798
|
+
else if (status[itemIndex] === undefined) status[itemIndex] = 'full';
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
const shownCount = shownByItem.filter((length) => (length ?? 0) > 0).length;
|
|
802
|
+
const fullyIncludedItems = status.filter((value) => value === 'full').length;
|
|
803
|
+
const truncatedItems = status.filter((value) => value === 'truncated').length;
|
|
804
|
+
const omittedItems = contextItems.length - fullyIncludedItems - truncatedItems;
|
|
805
|
+
return {
|
|
806
|
+
itemCount: contextItems.length,
|
|
807
|
+
// Same scale as totalChars (items joined by "\n\n"): each item counts once at its narrowest
|
|
808
|
+
// shown part, so shownChars === totalChars exactly when no item lost anything in any pass.
|
|
809
|
+
// perPassShownChars in the budget log keeps the raw per-pass sizes.
|
|
810
|
+
shownChars: shownByItem.reduce<number>((sum, length) => sum + (length ?? 0), 0) + Math.max(0, shownCount - 1) * 2,
|
|
811
|
+
totalChars: contextItems.map((item) => `### ${item.label}\n${item.body}`).join('\n\n').length,
|
|
812
|
+
truncated: truncatedItems > 0 || omittedItems > 0,
|
|
813
|
+
fullyIncludedItems, truncatedItems, omittedItems,
|
|
814
|
+
};
|
|
815
|
+
})() : undefined;
|
|
816
|
+
const singleContextBudget = !chunked && contextItems.length ? budgetReviewerContext(contextItems) : undefined;
|
|
817
|
+
const reviewerContextBudget = chunkContextBudget ?? singleContextBudget;
|
|
673
818
|
if (reviewerContextBudget) {
|
|
674
819
|
try {
|
|
675
820
|
debug.log('review.images', 'reviewer-context-budget', {
|
|
@@ -680,6 +825,7 @@ export async function reviewPullRequest(
|
|
|
680
825
|
fullyIncludedItems: reviewerContextBudget.fullyIncludedItems,
|
|
681
826
|
truncatedItems: reviewerContextBudget.truncatedItems,
|
|
682
827
|
omittedItems: reviewerContextBudget.omittedItems,
|
|
828
|
+
...(chunked ? { passes: plan.passes.length, perPassShownChars: passContext.map(({ budget }) => budget.shownChars) } : {}),
|
|
683
829
|
...(input.reviewContext?.runId !== undefined ? { runId: input.reviewContext.runId } : {}),
|
|
684
830
|
...(input.reviewContext?.round !== undefined ? { round: input.reviewContext.round } : {}),
|
|
685
831
|
});
|
|
@@ -710,8 +856,7 @@ export async function reviewPullRequest(
|
|
|
710
856
|
// *"64,000자는 **분할 리뷰 도입을 전제로 한 조각별 고정 예산**"*. 부품(`splitDiffByFile`)도
|
|
711
857
|
// 서 있었다. 없던 것은 「조각들을 리뷰하고 결과를 «접는» 자」 하나였다.
|
|
712
858
|
// ⛔ 상한을 «올리는» 것이 아니다 — 조각마다 상한을 «지킨다».
|
|
713
|
-
|
|
714
|
-
if (plan.passes.length > 1) {
|
|
859
|
+
if (chunked) {
|
|
715
860
|
try {
|
|
716
861
|
debug.log('review.diff-plan', 'chunked', {
|
|
717
862
|
passes: plan.passes.length, files: plan.files, coversAll: plan.coversAll,
|
|
@@ -734,6 +879,7 @@ export async function reviewPullRequest(
|
|
|
734
879
|
const passInput: ReviewInput = {
|
|
735
880
|
...input,
|
|
736
881
|
prDiff: passDiff,
|
|
882
|
+
reviewerContext: passContext[index]?.indices.map((itemIndex) => contextItems[itemIndex]!),
|
|
737
883
|
// ⭐ 리뷰어에게 «자기가 몇 분의 몇을 보는지» 알린다 — 이것 없이는 조각 리뷰어가
|
|
738
884
|
// "다른 파일이 안 보인다"를 SCOPE/미배선 결함으로 오판한다(규칙 (7) 오작동).
|
|
739
885
|
evidenceNote: [
|
|
@@ -743,13 +889,10 @@ export async function reviewPullRequest(
|
|
|
743
889
|
+ ' 「여기 안 보인다」를 결함으로 판정하지 마십시오.',
|
|
744
890
|
].filter(Boolean).join('\n'),
|
|
745
891
|
};
|
|
746
|
-
passResults.push(
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
)),
|
|
751
|
-
reviewed: true,
|
|
752
|
-
});
|
|
892
|
+
passResults.push(reviewedResultFromRaw(await llmReview(
|
|
893
|
+
buildReviewPrompt(passInput, passBudget, '', passContext[index]?.budget),
|
|
894
|
+
reviewImages.length > 0 && index === 0 ? reviewImages : undefined,
|
|
895
|
+
), input.reviewContext?.runId, { index, of: plan.passes.length }));
|
|
753
896
|
}
|
|
754
897
|
return {
|
|
755
898
|
...foldReviewResults(passResults),
|
|
@@ -774,12 +917,11 @@ export async function reviewPullRequest(
|
|
|
774
917
|
};
|
|
775
918
|
}
|
|
776
919
|
const raw = await llmReview(
|
|
777
|
-
buildReviewPrompt(input, diffBudget, referencedContext.text,
|
|
920
|
+
buildReviewPrompt(input, diffBudget, referencedContext.text, singleContextBudget),
|
|
778
921
|
reviewImages.length > 0 ? reviewImages : undefined,
|
|
779
922
|
);
|
|
780
923
|
return {
|
|
781
|
-
...
|
|
782
|
-
reviewed: true,
|
|
924
|
+
...reviewedResultFromRaw(raw, input.reviewContext?.runId),
|
|
783
925
|
diffBudget: {
|
|
784
926
|
truncated: diffBudget.truncated,
|
|
785
927
|
shownChars: diffBudget.shownChars,
|
|
@@ -830,6 +972,7 @@ export function renderReview(r: ReviewResult): string {
|
|
|
830
972
|
const icon = r.verdict === 'pass' ? '✅' : r.verdict === 'warn' ? '⚠️' : '⛔';
|
|
831
973
|
const head = `${icon} 자율 PR 리뷰: ${r.verdict.toUpperCase()}`;
|
|
832
974
|
const parts = [head];
|
|
975
|
+
if (r.reviewerFallback) parts.push(`[reviewer fallback: ${r.reviewerFallback}]`);
|
|
833
976
|
if (r.mustFix.length) parts.push('**Must-fix (blockers)**', ...r.mustFix.map((f) => `- ${f}`));
|
|
834
977
|
if (r.shouldFix.length) parts.push('**Should-fix**', ...r.shouldFix.map((f) => `- ${f}`));
|
|
835
978
|
if (r.mustFix.length === 0 && r.shouldFix.length === 0) parts.push('— 리뷰 통과(블로커·비블로커 지적 없음).');
|
|
@@ -16,7 +16,7 @@ import { parseGoalType, type GoalType } from '../self-implement/goal-author.js';
|
|
|
16
16
|
import type { DesignCheckOutcome } from '../design/design-check.js';
|
|
17
17
|
import type { DesignGateResult } from '../design/design-gate.js';
|
|
18
18
|
import type { PriorDraftFinding } from '../self-implement/prior-draft-findings.js';
|
|
19
|
-
import { parseShardIdentity,
|
|
19
|
+
import { parseShardIdentity, shardReviewContractBlock, withoutShardIdentity } from './shard-boundary-intent.js';
|
|
20
20
|
|
|
21
21
|
export interface ReviewIntentInput {
|
|
22
22
|
/** 무엇을 왜 — 골 원문. */
|
|
@@ -525,6 +525,73 @@ function goalFileBlock(goalFile: string | undefined): Block | undefined {
|
|
|
525
525
|
: undefined;
|
|
526
526
|
}
|
|
527
527
|
|
|
528
|
+
function isLightweightGoal(goal: string): boolean {
|
|
529
|
+
try {
|
|
530
|
+
const tree = unified().use(remarkParse).use(remarkGfm).parse(goal) as MarkdownNode;
|
|
531
|
+
const nodes = tree.children ?? [];
|
|
532
|
+
const headings = new Set<string>();
|
|
533
|
+
const declarations = new Set<string>();
|
|
534
|
+
for (let index = 0; index < nodes.length; index += 1) {
|
|
535
|
+
const node = nodes[index]!;
|
|
536
|
+
if (node.type !== 'heading' || node.depth !== 2) continue;
|
|
537
|
+
const start = node.position?.start.offset;
|
|
538
|
+
const end = node.position?.end.offset;
|
|
539
|
+
if (start === undefined || end === undefined) return false;
|
|
540
|
+
const heading = goal.slice(start, end).trim();
|
|
541
|
+
headings.add(heading);
|
|
542
|
+
if (heading !== '## 답하지 못하는 것' && heading !== '## 불변식') continue;
|
|
543
|
+
const next = nodes[index + 1];
|
|
544
|
+
if (next?.type !== 'list' || next.children?.length !== 1) continue;
|
|
545
|
+
const item = next.children[0];
|
|
546
|
+
const itemStart = item?.position?.start.offset;
|
|
547
|
+
const itemEnd = item?.position?.end.offset;
|
|
548
|
+
if (itemStart === undefined || itemEnd === undefined) continue;
|
|
549
|
+
if (goal.slice(itemStart, itemEnd).trim() === '- No persistent grounding was performed in lite authoring.') {
|
|
550
|
+
declarations.add(heading);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return headings.has('## WHAT TO BUILD') && headings.has('## ACCEPTANCE CRITERIA')
|
|
554
|
+
&& declarations.has('## 답하지 못하는 것') && declarations.has('## 불변식');
|
|
555
|
+
} catch {
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
function lightweightGoalContext(goal: string, goalFile: string): Block {
|
|
561
|
+
const nodes = (unified().use(remarkParse).use(remarkGfm).parse(goal) as MarkdownNode).children ?? [];
|
|
562
|
+
const firstLine = (title: string): string | undefined => {
|
|
563
|
+
const headingIndex = nodes.findIndex((node) => {
|
|
564
|
+
if (node.type !== 'heading' || node.depth !== 2) return false;
|
|
565
|
+
const start = node.position?.start.offset;
|
|
566
|
+
const end = node.position?.end.offset;
|
|
567
|
+
return start !== undefined && end !== undefined && goal.slice(start, end).trim() === `## ${title}`;
|
|
568
|
+
});
|
|
569
|
+
if (headingIndex < 0) return undefined;
|
|
570
|
+
for (const node of nodes.slice(headingIndex + 1)) {
|
|
571
|
+
if (node.type === 'heading' && (node.depth ?? 0) <= 2) break;
|
|
572
|
+
if (node.type === 'code') continue;
|
|
573
|
+
const start = node.position?.start.offset;
|
|
574
|
+
const end = node.position?.end.offset;
|
|
575
|
+
if (start === undefined || end === undefined) continue;
|
|
576
|
+
const line = goal.slice(start, end).split('\n').find((item) => item.trim());
|
|
577
|
+
if (line) return line.replace(/^[-*]\s*/, '').replace(/^(?:무엇|왜):\s*/, '').trim();
|
|
578
|
+
}
|
|
579
|
+
return undefined;
|
|
580
|
+
};
|
|
581
|
+
const brief = (text: string): string => text.length > 350 ? `${text.slice(0, 350)}…[골 원문 참조]` : text;
|
|
582
|
+
const what = firstLine('WHAT TO BUILD');
|
|
583
|
+
const why = firstLine('PROBLEM');
|
|
584
|
+
return {
|
|
585
|
+
title: '무엇을 왜',
|
|
586
|
+
text: [
|
|
587
|
+
'무엇을 왜',
|
|
588
|
+
...(what ? [`무엇: ${brief(what)}`] : []),
|
|
589
|
+
...(why ? [`왜: ${brief(why)}`] : []),
|
|
590
|
+
`골 원문·긴 참조: ${goalFile}`,
|
|
591
|
+
].join('\n'),
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
|
|
528
595
|
export function buildReviewIntent(i: Readonly<ReviewIntentInput>): string {
|
|
529
596
|
// ① 조망 — 명시값이 없으면 **골 텍스트에서 추출**한다(생산자는 골 자체다·LLM 없음).
|
|
530
597
|
const mined = extractIntentBlocks(i.goal);
|
|
@@ -536,8 +603,12 @@ export function buildReviewIntent(i: Readonly<ReviewIntentInput>): string {
|
|
|
536
603
|
// 그 안의 수용기준을 다시 목록으로 붙이면 **같은 내용이 두 번** 들어가 4000자 예산을 먹고,
|
|
537
604
|
// 후순위 블록(스코프 경계)이 불필요하게 잘린다.
|
|
538
605
|
const identity = parseShardIdentity(i.goal);
|
|
539
|
-
|
|
540
|
-
|
|
606
|
+
// This is the phaseIntent consumed by defaultSeams.reviewDiff → reviewPullRequest;
|
|
607
|
+
// the same block is retained by the orchestrator's PR-body review-intent section.
|
|
608
|
+
const shardBoundary = identity ? { title: '샤드 계약 — 리뷰 범위', text: shardReviewContractBlock(i.goal, identity, boundaries, i.changedFiles) } : undefined;
|
|
609
|
+
const authoredLiteGoal = isLightweightGoal(i.goal);
|
|
610
|
+
const liteGoal = authoredLiteGoal && Boolean(i.goalFile?.trim());
|
|
611
|
+
const goalBody = liteGoal ? '' : stripExtractedSections(identity ? withoutShardIdentity(i.goal) : i.goal).trim();
|
|
541
612
|
const goal = goalBody ? { title: '목표', text: `목표\n${goalBody}` } : undefined;
|
|
542
613
|
// ⭐ **자식이 낸 증거**(diff 밖 이행 · base 적색 · 직전 반영분)를 한 묶음으로 잡아 둔다 — 아래 예산
|
|
543
614
|
// 배분에서 **목표 본문보다 먼저** 채우기 위해서다. 제목 문자열이 아니라 **동일성**으로 가른다.
|
|
@@ -553,6 +624,20 @@ export function buildReviewIntent(i: Readonly<ReviewIntentInput>): string {
|
|
|
553
624
|
const coverage = evidenceCoverageBlock(i.evidenceCoverage);
|
|
554
625
|
const goalFile = goalFileBlock(i.goalFile);
|
|
555
626
|
const runFacts = runFactsBlock(i);
|
|
627
|
+
// Lite authoring keeps its original ask in a fenced block under WHAT TO BUILD.
|
|
628
|
+
// Review the authored criteria and short context; the goal document is the pointer to the long source.
|
|
629
|
+
if (liteGoal) {
|
|
630
|
+
const acceptanceBlock = listBlock('수용기준', acceptance);
|
|
631
|
+
const context = lightweightGoalContext(i.goal, i.goalFile!.trim());
|
|
632
|
+
const boundaryBlock = listBlock('의도적 스코프 경계', boundaries);
|
|
633
|
+
const liteBlocks = [
|
|
634
|
+
acceptanceBlock, context, boundaryBlock, shardBoundary, priorFindings, applied,
|
|
635
|
+
runFacts, goalType, preexisting, importerTestsNotRun,
|
|
636
|
+
gateEvidence, designCheck, designGate, shardSiblings, coverage, claims,
|
|
637
|
+
listBlock('검증 못 한 경계 후보 (결정 아님 — 이것만으로 must-fix 를 면제하지도, 만들지도 말 것)', unverifiedBoundaryCandidates),
|
|
638
|
+
].filter((block): block is Block => Boolean(block));
|
|
639
|
+
return fitReviewIntentBlocks(liteBlocks, liteBlocks, liteBlocks);
|
|
640
|
+
}
|
|
556
641
|
// ⛔⭐⭐⭐ **런 사실이 «맨 앞»이다 — 라이브 실측으로 옮겼다**(2026-08-07).
|
|
557
642
|
// 📏 `#7556`(실물 하니스 PR · 본문 37,354자)을 프로덕션 `intentFromPr` 에 태우니
|
|
558
643
|
// ***`runId` 도 커밋도 변경 파일도 «하나도» 안 남았다***(4,000자 상한 · 살아남은 것은 `목표`·`수용기준`).
|
|
@@ -645,7 +730,7 @@ function sectionPriority(title: string): 0 | 1 | 2 {
|
|
|
645
730
|
const PREAMBLE_TITLE = '(머리말)';
|
|
646
731
|
|
|
647
732
|
type MarkdownPosition = { readonly start: { readonly offset?: number }; readonly end: { readonly offset?: number } };
|
|
648
|
-
type MarkdownNode = { readonly type: string; readonly position?: MarkdownPosition; readonly children?: readonly MarkdownNode[] };
|
|
733
|
+
type MarkdownNode = { readonly type: string; readonly depth?: number; readonly position?: MarkdownPosition; readonly children?: readonly MarkdownNode[] };
|
|
649
734
|
type MarkdownUnit = { readonly text: string; readonly start: number; readonly end: number };
|
|
650
735
|
|
|
651
736
|
/** 비교 가능한 CommonMark 단위와 그 원문 범위. 코드 펜스는 원문에 남기되 비교 후보에서는 제외한다. */
|
|
@@ -829,6 +914,18 @@ function isTableHeader(line: string, next: string | undefined): boolean {
|
|
|
829
914
|
return /^\s*\|(\s*:?-{2,}:?\s*\|)+\s*$/.test(next ?? '');
|
|
830
915
|
}
|
|
831
916
|
|
|
917
|
+
function topLevelCodeLines(goal: string): ReadonlySet<number> {
|
|
918
|
+
const lines = new Set<number>();
|
|
919
|
+
try {
|
|
920
|
+
const tree = unified().use(remarkParse).use(remarkGfm).parse(goal);
|
|
921
|
+
for (const node of tree.children) {
|
|
922
|
+
if (node.type !== 'code' || !node.position) continue;
|
|
923
|
+
for (let index = node.position.start.line - 1; index < node.position.end.line; index += 1) lines.add(index);
|
|
924
|
+
}
|
|
925
|
+
} catch { /* unknown syntax: keep existing extraction behavior */ }
|
|
926
|
+
return lines;
|
|
927
|
+
}
|
|
928
|
+
|
|
832
929
|
/** 골에서 **추출된 것만** 걷어낸 나머지(목표 서술). 추출 내용이 목표 블록에 중복되지 않게 한다.
|
|
833
930
|
*
|
|
834
931
|
* ⚠️ **산문은 남긴다**(리뷰 must-fix) — 초판은 인식된 절을 만나면 다음 헤더까지 **통째로** 버려,
|
|
@@ -839,7 +936,9 @@ export function stripExtractedSections(goal: string): string {
|
|
|
839
936
|
const mined = extractIntentBlocks(goal);
|
|
840
937
|
const out: string[] = [];
|
|
841
938
|
let extractedSection: 'acceptance' | 'boundary' | null = null;
|
|
842
|
-
|
|
939
|
+
const fencedLines = topLevelCodeLines(goal);
|
|
940
|
+
for (const [index, line] of goal.split('\n').entries()) {
|
|
941
|
+
if (fencedLines.has(index)) { out.push(line); continue; }
|
|
843
942
|
const kind = headKind(line);
|
|
844
943
|
if (kind === 'acceptance' || kind === 'boundary') { extractedSection = kind; continue; } // 헤더만 제거
|
|
845
944
|
if (kind === 'other') extractedSection = null;
|
|
@@ -921,6 +1020,7 @@ function isUnverifiedBoundaryCandidate(item: string): boolean {
|
|
|
921
1020
|
}
|
|
922
1021
|
|
|
923
1022
|
export function extractIntentBlocks(goal: string, includeSections = false): ExtractedIntentBlocks {
|
|
1023
|
+
const fencedLines = topLevelCodeLines(goal);
|
|
924
1024
|
const acceptanceItems: string[] = [];
|
|
925
1025
|
const scopeBoundaryItems: string[] = [];
|
|
926
1026
|
const unverifiedBoundaryCandidateItems: string[] = [];
|
|
@@ -945,6 +1045,7 @@ export function extractIntentBlocks(goal: string, includeSections = false): Extr
|
|
|
945
1045
|
push();
|
|
946
1046
|
}
|
|
947
1047
|
for (const [idx, line] of lines.entries()) {
|
|
1048
|
+
if (fencedLines.has(idx)) continue;
|
|
948
1049
|
const kind = headKind(line);
|
|
949
1050
|
if (kind === 'acceptance') { cur = 'acceptance'; continue; }
|
|
950
1051
|
if (kind === 'boundary') { cur = 'boundary'; continue; }
|