elanous 0.2.23 → 0.2.25
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/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +1 -0
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +148 -0
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1454-37fd16f479f5554a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8532.a86e99acf9b761cb.js → 1516.83dd2c1b86b4e507.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{89849432.9eaa2f4c9c010965.js → 16e57f67.3ea19e893461e611.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1505.5826671109111e75.js → 1743.563d3168e95825ef.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +32 -0
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2846.d6a433b8663819a5.js +309 -0
- package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{5967-c0a80f8ffe5d4050.js → 3259-86f3be56e43eaf6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5578.ac963634373b28c6.js → 4084.15ecaf4240bd9e77.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8438.ee7f0df3b3f6fcb4.js → 4204.a409ab6250c0f6a8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +8 -0
- package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7905.b230b9d06cb4ad5d.js → 4593.10f5b9bd702d4a6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{8569.b853a8daa8f31d12.js → 5081.a240b63fad28663a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2528.0af5c0e1fad88df6.js → 5408.377c8c543635b81f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9502-32c5dc22e8f120f5.js → 5492-e05e26a033ba80d2.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/5785-ea8d2c633b6688e3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +23 -0
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5974.360f8441eb0ac1ec.js → 6196.34d6b229079e9e28.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{ce383d63.d2ede338788ed18e.js → 65ebff95.081daeff622d238e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +2 -0
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{83cfc5c8.349535543c1548b6.js → 6def8a8e.c81f9ca41028eccf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2721.bc9a8f36bd85c07a.js → 7483.ba01c6c209b81bba.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{6702.ebbd165d5e4a4a14.js → 7752.5cbdd0b433c54af9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8925-2abfb48af477fb7f.js → 8085-1e5fce59500a2cc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{b4e12462-5fab4a813a63dadd.js → 83a80514-b897b64df43ce108.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +93 -0
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{8264.00e434fbd02e9311.js → 8578.dff22d988cc2b106.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +115 -0
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +74 -0
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7518.49161e8f5814abdb.js → 9311.24c8f5ea793253dd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9976.8f28864317639fe6.js → 94.4cfed21c0b781a06.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +90 -0
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{0e3acd34.d42b2ef87fdf4234.js → 973cbf1b.3bbcf2b41548eca7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6571-926ddf024a6ad5df.js → 9917-9e26abc5f7772735.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +79 -0
- package/apps/pwa/out/_next/static/chunks/{740.90b31555290236a9.js → 9974.e77b4ff4884557b3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{4c5e95ce.83e9b16add6fcd8c.js → ab4d57c2.e90bc2cb31949045.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-9360b1285b2a346e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f08f6529d09ffae1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-f000d54d258f9ef6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-ad3bd8084048bee4.js → page-b12149c51f7d04b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-22f674e7e4c2c9d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8888733e40cea6d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-9717ec6964b92276.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-44eaad486bc98a45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-97fa6cf3d34c7eb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-305cd294e754906e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-a648bc464c9dc754.js → page-dea4b795741126fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-35e05d7450461a67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-45889e7070d11126.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-16a2e893f83ae4d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2638013c0bf7dfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-56888bc744e08dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-c44f93a41167536f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-952c6ceec6d9de38.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-6d0202af568f4c63.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-1b810474507f3702.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-74366ae2693a7d95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-4fb6fc34e20c07b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-e9502921f4f01b1f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-b6169ea2f09cf287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-6a14333d1b1b3967.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-8c91a9a66c9ec90a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-48fb31810693c357.js → page-4e634c5b98fd4e93.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ed3070d637850548.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-cb154acadb025414.js → page-b9cc8a10bc6078b4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-3d3fc73dd187ed52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-128458c8d86fbb5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9c04dac0831c2bbb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-cf0c2b0183991d09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-04de9ca6d52a3893.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-62527677bbc2fdc4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9a2e09c4a311764c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-bfeb35d69e8b24bb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-89cb33bced824e4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b008aff96be56654.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-814394dcbae789b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-6a87325c87f09dd2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-6445ac4cbb8dd869.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-852170303c6cd755.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-087ceeb975ef272b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-97c7361cc2a19319.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-20162174b77f96cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8c6901833f897496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-05a4b2c9b91034aa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{53746282.1be36038d1abd949.js → e117f801.e92bf10242653497.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{0673cc54.8e2ef1c23e49e190.js → f4dfbfc0.a69fb12f854882aa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +1 -0
- package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +1 -0
- package/apps/pwa/out/_next/static/{rfkMm4movqkqMebBrCXiR → dRS6lEhSRRBr1abbzp7fJ}/_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 +23 -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 +23 -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/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/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/release-loop.yaml +5 -5
- package/graphs/steward/recipes.yaml +4 -0
- package/graphs/steward/steward.yaml +10 -1
- package/package.json +1 -1
- package/scripts/add-api-key.sh +1 -1
- package/scripts/bench-report.ts +46 -1
- package/scripts/ci-typecheck-changed.ts +73 -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/land-global-checks.ts +3 -0
- package/scripts/measure-log-diet-2.ts +213 -0
- package/scripts/measure-tsc-affected-roots.ts +289 -0
- package/scripts/release-loop/auto-approve-node.ts +6 -0
- package/scripts/release-loop/gate-closure.ts +286 -0
- package/scripts/release-loop/gate-executor.ts +28 -0
- package/scripts/release-loop/gate-node.ts +333 -37
- package/scripts/release-loop/gate-partial.ts +34 -6
- package/scripts/release-loop/ops-upgrade-node.ts +63 -42
- package/scripts/release-loop/publish-node.ts +6 -0
- package/scripts/release-loop/resume-release.ts +46 -13
- package/scripts/release-loop/resume.ts +110 -4
- package/scripts/release-loop/unattended-release.ts +22 -7
- package/scripts/tsc-baseline-cache.ts +172 -0
- package/scripts/usage-rollup.ts +72 -6
- package/scripts/ux-sim.ts +30 -1
- package/skills/youtube-master/scripts/main.ts +4 -1
- package/skills/youtube-master/src/obsidian.ts +9 -0
- package/src/agent/run-context.ts +10 -0
- package/src/agent-mission/driver.ts +18 -3
- package/src/agent-mission/resource-ladder.ts +8 -3
- package/src/agent-mission/review-loop.ts +8 -2
- package/src/agent-substrate/acp-implementer.ts +146 -0
- package/src/agent-substrate/pr-reviewer.ts +60 -13
- package/src/agent-substrate/self-review-cli.ts +170 -15
- 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/system-lookback-run.ts +16 -10
- package/src/bench/bench.ts +183 -0
- package/src/budget/cost-tier-advisor.ts +91 -0
- package/src/budget/fetchers/grok.ts +15 -5
- package/src/budget/llm-cost.ts +37 -5
- package/src/budget/shadow-arms.ts +77 -0
- package/src/budget/types.ts +10 -2
- package/src/budget/unified-usage.ts +256 -10
- package/src/cli/bench-cli.ts +34 -0
- package/src/cli/doctor-cli.ts +21 -0
- package/src/cli/friendly-errors.ts +113 -0
- package/src/cli/guardian-cli.ts +26 -1
- package/src/cli/image-cli.ts +101 -0
- package/src/cli/intake-cli.ts +3 -1
- package/src/cli/log-event-names.ts +4 -0
- package/src/cli/memory-cli.ts +182 -0
- package/src/cli/model-watch-cli.ts +4 -1
- package/src/cli/pr-cli.ts +62 -5
- package/src/cli/pr-land-overlap-evidence.ts +160 -12
- package/src/cli/pr-land-pod-shadow.ts +54 -0
- package/src/cli/release-cli.ts +27 -16
- package/src/cli/release-run-if-ready.ts +11 -0
- package/src/cli/resource-cli.ts +48 -0
- package/src/cli/retro-cli.ts +12 -3
- package/src/cli/rfc-status.ts +52 -2
- package/src/cli/seat-requests-cli.ts +25 -0
- package/src/cli/self-update.ts +104 -0
- package/src/cli/tasks-cli.ts +139 -10
- package/src/cli/usage-cli.ts +93 -8
- package/src/compact/verify-probe.ts +23 -3
- package/src/context-card/index.ts +50 -0
- package/src/control/control-status.ts +30 -1
- package/src/core-turn/run-goal-loop.ts +5 -4
- package/src/dashboard/ad-run-setup-bindings.ts +279 -0
- package/src/dashboard/index.ts +18 -276
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +4 -138
- package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
- package/src/dashboard/stale-install-check.ts +11 -0
- package/src/debug/log-diet.ts +53 -10
- package/src/debug/log.ts +19 -1
- package/src/domains/morning-essential.ts +18 -3
- package/src/domains/release-tool.ts +43 -0
- package/src/error-report/report.ts +21 -4
- package/src/execution-loop/launch-gate.ts +158 -2
- package/src/fleet/host-doctor.ts +375 -0
- package/src/github/pr-labels.ts +1 -0
- package/src/goals/judge.ts +20 -6
- package/src/graph-runner/graph-cli.ts +42 -1
- package/src/graph-runner/runner.ts +176 -11
- package/src/graph-wizard/archetypes.ts +14 -8
- package/src/graph-wizard/generate.ts +77 -1
- package/src/grok/usage.ts +23 -2
- package/src/grok.ts +13 -7
- package/src/grounding/ref-index.ts +253 -0
- package/src/harness/dispatch-backpressure.ts +10 -2
- package/src/harness/harness-clean.ts +199 -78
- package/src/harness/harness-cli-command.ts +176 -52
- package/src/harness/harness-gc.ts +331 -0
- package/src/harness/harness-stop.ts +82 -10
- package/src/harness/harness-substrate-default.ts +142 -7
- package/src/harness/launch-registry.ts +6 -0
- package/src/harness/worktree-branch-prefix.ts +9 -0
- package/src/hq/fence.ts +187 -0
- package/src/hq/seats.ts +38 -22
- package/src/images/image-ledger.ts +179 -0
- package/src/index.ts +110 -186
- 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 +7 -2
- package/src/intake-plane/lens.ts +46 -4
- package/src/intake-plane/ref-prefetch.ts +110 -0
- package/src/intake-plane/requirement-funnel.ts +53 -1
- package/src/intelligence-map/catalog-feed.ts +119 -0
- package/src/intelligence-map/model-catalog.ts +72 -0
- package/src/intelligence-map/model-watch-intake.ts +40 -0
- package/src/intelligence-map/model-watch-mission.ts +14 -1
- package/src/llm/bedrock-eventstream.ts +215 -0
- package/src/llm/bedrock-provider.ts +114 -41
- package/src/llm/bedrock.ts +174 -28
- package/src/llm/open-weight-discipline.ts +21 -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/zai-coding-plan.ts +700 -0
- package/src/llm.ts +91 -24
- package/src/loops/checker.ts +148 -9
- package/src/loops/orchestrator/resync-shadow.ts +34 -7
- package/src/maturity/feature-maturity.ts +3 -3
- package/src/model-tier/llm-tier-map.ts +9 -5
- package/src/models/prompts.ts +2 -1
- package/src/mss/logging/log-store.ts +58 -11
- package/src/nexus/api/http-server.ts +22 -0
- package/src/nexus/api/missions.ts +73 -2
- package/src/nexus/api/ops-api.ts +18 -0
- package/src/nexus/index.ts +7 -75
- package/src/nexus/tools-kind.ts +78 -0
- package/src/oauth/codex-account-rotation.ts +43 -3
- package/src/oauth/codex-account-store.ts +339 -27
- package/src/oauth/codex-quota-policy.ts +33 -4
- package/src/oauth/fallback-chain.ts +53 -15
- package/src/onboarding/first-run.ts +37 -18
- package/src/onboarding/web-first.ts +20 -2
- 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/preview/terminal.ts +15 -5
- package/src/project/project-store.ts +20 -0
- package/src/prompt-cache/openai.ts +3 -0
- package/src/prompt-cache/types.ts +5 -0
- package/src/prompt-enhance/enhance.ts +23 -0
- package/src/release-loop/auto-start.ts +7 -5
- package/src/release-loop/checklist.ts +11 -1
- package/src/release-loop/gate-shards.ts +4 -0
- package/src/release-loop/light-rc.ts +84 -13
- package/src/release-loop/merged-pr-checklist.ts +35 -5
- package/src/release-loop/placement.ts +16 -1
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/requirements/requirement-ledger.ts +536 -0
- package/src/retro/daily.ts +5 -5
- package/src/seat-loop/duty-ledger.ts +64 -0
- package/src/seat-loop/seat-loop.ts +32 -10
- package/src/self-dev/decompose.ts +37 -3
- package/src/self-dev/dev-cli.ts +44 -10
- package/src/self-dev/dev-pipeline.ts +39 -9
- package/src/self-dev/draft-residue.ts +27 -5
- package/src/self-dev/draft-sweep.ts +151 -0
- package/src/self-dev/fabric-decompose-adapter.ts +9 -2
- package/src/self-dev/graph-journey-route.ts +6 -0
- package/src/self-dev/orchestrate-cli.ts +25 -3
- package/src/self-dev/orchestrate.ts +41 -6
- package/src/self-dev/run-supervisor.ts +218 -15
- package/src/self-dev/run-types.ts +13 -0
- package/src/self-dev/supervisor-verdict-edges.ts +1 -0
- 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/flex-signals.ts +59 -0
- package/src/self-implement/frozen-merges.ts +8 -3
- package/src/self-implement/gate-cli.ts +29 -10
- package/src/self-implement/gate-remote.ts +4 -1
- package/src/self-implement/goal-author-decompose.ts +10 -2
- package/src/self-implement/goal-author.ts +36 -11
- package/src/self-implement/goal-new-paths.ts +42 -0
- package/src/self-implement/graph-overlay-condition.ts +28 -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/heal-intake.ts +5 -1
- package/src/self-implement/host-regate.ts +124 -30
- package/src/self-implement/importer-test-index.ts +3 -1
- package/src/self-implement/l8-merge-queue.ts +80 -2
- package/src/self-implement/merge-train.ts +19 -0
- package/src/self-implement/off-diff-evidence.ts +40 -1
- package/src/self-implement/orchestrator.ts +230 -32
- package/src/self-implement/premise-review.ts +159 -0
- package/src/self-implement/regate-detail.ts +79 -0
- package/src/self-implement/review-deferred-to-host.ts +21 -0
- package/src/self-implement/rework-budget-judgment.ts +23 -3
- package/src/self-implement/running-runs.ts +75 -5
- package/src/self-implement/scope-adjacency.ts +23 -0
- package/src/self-implement/seams.ts +89 -8
- package/src/self-implement/self-implement-cli.ts +9 -4
- package/src/self-implement/stop-autoheal.ts +69 -2
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/skills/tools/agent.ts +16 -1
- package/src/skills/tools/persistent-grounding.ts +11 -1
- package/src/skills/tools/shell.ts +33 -1
- package/src/steward/launch.ts +5 -4
- package/src/steward/rejudge-tick.ts +142 -0
- package/src/steward/triage-budget.ts +62 -0
- package/src/steward/triage.ts +83 -22
- package/src/task-agent/actions.ts +62 -5
- package/src/task-agent/board.ts +92 -3
- package/src/task-agent/card-evidence.ts +88 -1
- package/src/task-agent/completion-evidence.ts +5 -0
- package/src/task-agent/cover.ts +166 -3
- package/src/task-agent/judge.ts +16 -0
- package/src/task-agent/land-order-ledger.ts +95 -0
- package/src/task-agent/live-move-history.ts +87 -1
- package/src/task-agent/live-moves.ts +350 -20
- package/src/task-agent/parent-host.ts +27 -3
- package/src/task-agent/rejudge-on-head.ts +223 -24
- package/src/task-agent/review-prior-fix.ts +146 -0
- package/src/task-agent/review-result-capture.ts +3 -1
- package/src/task-agent/run-adopt.ts +136 -0
- package/src/task-agent/shadow.ts +65 -9
- package/src/task-agent/task-hand.ts +57 -7
- 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 +14 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +79 -6
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +122 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +17 -5
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +11 -5
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +23 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +73 -4
- package/src/task-orchestrator/surfaces/pod-zai-child.ts +101 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +432 -35
- package/src/task-orchestrator/surfaces/self-implement.ts +19 -1
- package/src/typecheck-ratchet.ts +1 -0
- package/src/user-config.ts +69 -15
- package/src/ux-sim/fault-cred-expiry.ts +100 -0
- package/src/ux-sim/fault-pod-death.ts +74 -0
- package/src/ux-sim/fault-pool-cap.ts +81 -0
- package/src/version/packed-revision.json +1 -1
- package/src/webclone/qa-table.ts +22 -0
- package/src/workflow-runtime/triggers/registry.ts +59 -0
- package/src/workflow-runtime/triggers/webhook-source.ts +35 -5
- package/apps/pwa/out/_next/static/chunks/0a09e062-34f747a17d8d8c2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +0 -77
- package/apps/pwa/out/_next/static/chunks/1325-dc3f3c21eb181cb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +0 -34
- package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1669-da843ed73aa301f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +0 -36
- package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +0 -122
- package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/272-b23d2e92161d11fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +0 -149
- package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3961-fbef064c213b2b18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +0 -309
- package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5313.1697309c532b9856.js +0 -2
- package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +0 -64
- package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +0 -93
- package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +0 -148
- package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +0 -226
- package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +0 -27
- package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +0 -115
- package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +0 -23
- package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +0 -90
- package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +0 -41
- package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +0 -287
- package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +0 -79
- package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d5341ac96203a983.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-0160ab83c8685a12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-55c631c032dcc47e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e6784759a2531031.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5c5d0e370f495ef6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-c325e21543cd48a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-6168a7c43e6ef8f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-31417d3604154a6d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-e9606dc0bdec9305.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25bb425afdb27541.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-32d72fdef1afe11a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27b794c8ba76bbb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-2bd9ce9c020d02d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a34096245e63b9f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-22170f4f00a15496.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-4cc66d22ca4ec502.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83b14c729fcea837.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-6e2781c523dad761.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-26dd415c8f13f341.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-ccdb83ed40c8d724.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-7ad3de8fa06fdea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-015c02c4fec4023e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-6b0ae5b5c42f6d2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-786111f30b6f0969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e17cce5e2ed0fee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-16258e956ea93fc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-c2dd2b19c93f90ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-85f35dd1dd96ae87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-d3c007c8a0ddd7ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7837ce2aacb97b04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7350ee93f4fe1033.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-00723458575f2b19.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-745d9b6c015076f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-736d33c7414a8a1a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-119be9a0444d2482.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-fa806c018833e332.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-c782041b5f5199ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-d431fbdea6ad93dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-0c056abff82b9891.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-242d668e4fbf72c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-847c3de6ca8a4416.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-81dd0d8ae923ed72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-74e69ba2c8e970d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-70038f41ae7cf931.js +0 -1
- package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-b2763b10dc6b3836.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +0 -1
- package/apps/pwa/out/_next/static/css/5619d59e87eddf66.css +0 -1
- /package/apps/pwa/out/_next/static/{rfkMm4movqkqMebBrCXiR → dRS6lEhSRRBr1abbzp7fJ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 전제 다섯 되짚기 — premise-review 카드 순수 계산(FLEX-RFC §A-③).
|
|
3
|
+
*
|
|
4
|
+
* P1 골 · P2 자(판정 시험) · P3 범위(대상 경로) · P4 쪼갬 · P5 환경.
|
|
5
|
+
* ⛔ LLM 없이 잴 수 있는 둘만 판정한다 — P3(범위) · P2(preexisting 자).
|
|
6
|
+
* ⛔ unknown 은 «맞다(ok)»가 아니다 — 못 잰 전제는 ok 로 지어내지 않는다.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { FlexSignalsInput } from './flex-signals.js';
|
|
10
|
+
|
|
11
|
+
/** 못 잰 근거의 표기 — P1·P4·P5 는 이 값으로 unknown 으로만 나간다. */
|
|
12
|
+
const UNMEASURED = '못 잼';
|
|
13
|
+
|
|
14
|
+
export type PremiseKey = 'P1' | 'P2' | 'P3' | 'P4' | 'P5';
|
|
15
|
+
export type PremiseVerdict = 'ok' | 'wrong' | 'unknown';
|
|
16
|
+
|
|
17
|
+
export interface PremiseFinding {
|
|
18
|
+
premise: PremiseKey;
|
|
19
|
+
verdict: PremiseVerdict;
|
|
20
|
+
evidence: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** `computeFlexSignals` 와 같은 꼴의 값 객체 + 카드가 가리킬 run 식별자와 P3 판정의 경계. */
|
|
24
|
+
export interface PremiseReviewInput extends FlexSignalsInput {
|
|
25
|
+
runId: string;
|
|
26
|
+
/** 이 골이 선언한 대상 경로 — 없으면 P3 는 unknown(경계를 못 잼). */
|
|
27
|
+
targetPaths?: readonly string[] | undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface PremiseReviewCard {
|
|
31
|
+
runId: string;
|
|
32
|
+
findings: PremiseFinding[];
|
|
33
|
+
/** wrong 이 있을 때만 «가장 좁은 것» 하나 — wrong 이 없으면 undefined. */
|
|
34
|
+
proposal: PremiseFinding | undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** 최신 라운드의 실패 id 목록 — `gateFailedIdsByRound` 의 마지막 칸이 최신(`computeFlexSignals` 와 같은 순서). */
|
|
38
|
+
function latestFailingIds(input: FlexSignalsInput): readonly string[] | undefined {
|
|
39
|
+
const latest = input.gateFailedIdsByRound.length === 0
|
|
40
|
+
? undefined
|
|
41
|
+
: input.gateFailedIdsByRound[input.gateFailedIdsByRound.length - 1];
|
|
42
|
+
return latest !== undefined && latest.length > 0 ? latest : undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 게이트 실패 id — 생산자(orchestrator 의 roundSummaryEntries.failedIds)와 P3 파서가 «같은 꼴»을 쓰도록
|
|
47
|
+
* 둘 다 이 함수 짝을 거친다. 꼴: `${name}@${file ?? '?'} (${attribution})`.
|
|
48
|
+
*/
|
|
49
|
+
export function formatGateFailedId(failure: { name: string; file?: string | undefined; attribution: string }): string {
|
|
50
|
+
return `${failure.name}@${failure.file ?? '?'} (${failure.attribution})`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* 실패 id 에서 시험 파일을 뽑는다 — `name@` 접두와 ` (귀속)` 접미를 뗀다. 이름에 `@` 가 섞여도
|
|
55
|
+
* (`user@example.com`·`@scope/pkg`)·경로에 `@`(`src/@scope/x.ts`)가 있어도 가른다: 경로 안의 `@` 는
|
|
56
|
+
* 세그먼트 머리(맨 앞 또는 `/` 바로 뒤)에만 온다. 그래서 «공백 없고 · 확장자로 끝나고 · 안의 `@` 가 전부
|
|
57
|
+
* 세그먼트 머리인» 후보를 처음 주는 `@` 가 구분자다. 그런 `@` 가 없거나 파일이 `?`·빈 값이면 undefined
|
|
58
|
+
* (못 잼) — fail-closed. 남는 모호함: 이름이 `/` 로 끝나면(`a/@src/x.ts`) 구분자를 경로로 읽는다.
|
|
59
|
+
*/
|
|
60
|
+
export function gateFailedIdFile(id: string): string | undefined {
|
|
61
|
+
const withoutAttribution = id.replace(/\s*\([^)]*\)\s*$/, '');
|
|
62
|
+
for (let at = withoutAttribution.indexOf('@'); at >= 0; at = withoutAttribution.indexOf('@', at + 1)) {
|
|
63
|
+
const file = withoutAttribution.slice(at + 1);
|
|
64
|
+
if (file === '' || file === '?' || /\s/.test(file)) continue;
|
|
65
|
+
if (!/\.[A-Za-z0-9]+$/.test(file)) continue;
|
|
66
|
+
if (/[^/]@/.test(file)) continue;
|
|
67
|
+
return file;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 시험 파일 → 짝 소스. `dir/x.test.ts` → `dir/x.ts`(같은 폴더). 시험 전용 폴더(`test/`·`__tests__/`)의 시험은
|
|
74
|
+
* 짝을 추측하지 않는다(undefined · fail-closed). 시험 꼴이 아닌 파일은 그 자신이 소스다.
|
|
75
|
+
*/
|
|
76
|
+
export function pairedSourceOf(file: string): string | undefined {
|
|
77
|
+
const normalized = file.replace(/^\.\//, '');
|
|
78
|
+
const testMatch = /^(.*)\.test\.([cm]?[jt]sx?)$/.exec(normalized);
|
|
79
|
+
if (!testMatch) return normalized;
|
|
80
|
+
if (/(^|\/)(test|tests|__tests__)\//.test(normalized)) return undefined;
|
|
81
|
+
return `${testMatch[1]}.${testMatch[2]}`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function insideTargets(path: string, targets: readonly string[]): boolean {
|
|
85
|
+
return targets.some((target) => {
|
|
86
|
+
const t = target.replace(/^\.\//, '').replace(/\/+$/, '');
|
|
87
|
+
return path === t || path.startsWith(`${t}/`);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** P2 자 — 판정 시험이 base 에서도 실패(preexisting)면 wrong. 귀속을 못 잼·하나라도 unknown 이면 unknown. */
|
|
92
|
+
function judgeP2(input: PremiseReviewInput): PremiseFinding {
|
|
93
|
+
const attributions = input.failureAttributions;
|
|
94
|
+
if (attributions === undefined || attributions.length === 0) {
|
|
95
|
+
return { premise: 'P2', verdict: 'unknown', evidence: UNMEASURED };
|
|
96
|
+
}
|
|
97
|
+
const preexistingIndex = attributions.indexOf('preexisting');
|
|
98
|
+
if (preexistingIndex >= 0) {
|
|
99
|
+
const latest = latestFailingIds(input);
|
|
100
|
+
const evidence = latest !== undefined && preexistingIndex < latest.length
|
|
101
|
+
? latest[preexistingIndex]!
|
|
102
|
+
: 'preexisting';
|
|
103
|
+
return { premise: 'P2', verdict: 'wrong', evidence };
|
|
104
|
+
}
|
|
105
|
+
if (attributions.includes('unknown')) {
|
|
106
|
+
return { premise: 'P2', verdict: 'unknown', evidence: UNMEASURED };
|
|
107
|
+
}
|
|
108
|
+
return { premise: 'P2', verdict: 'ok', evidence: `preexisting 0/${attributions.length}` };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* P3 범위 — 실패 시험 파일을 짝 소스로 옮겨 대상 경로와 견준다. 짝지은 소스(또는 시험 파일 자체)가
|
|
113
|
+
* 대상 경로 안이면 in · 짝은 지었는데 밖이면 wrong(그 시험 파일을 근거로). 파일을 못 읽거나 짝을 못 지은
|
|
114
|
+
* 실패가 하나라도 있고 wrong 이 없으면 unknown — 추측으로 ok 를 만들지 않는다.
|
|
115
|
+
*/
|
|
116
|
+
function judgeP3(input: PremiseReviewInput): PremiseFinding {
|
|
117
|
+
const latest = latestFailingIds(input);
|
|
118
|
+
const targets = input.targetPaths;
|
|
119
|
+
if (latest === undefined) return { premise: 'P3', verdict: 'unknown', evidence: UNMEASURED };
|
|
120
|
+
if (targets === undefined || targets.length === 0) return { premise: 'P3', verdict: 'unknown', evidence: UNMEASURED };
|
|
121
|
+
let unmeasured: string | undefined;
|
|
122
|
+
for (const id of latest) {
|
|
123
|
+
const file = gateFailedIdFile(id);
|
|
124
|
+
if (file === undefined) { unmeasured ??= `${UNMEASURED}: 실패 파일 없음 (${id})`; continue; }
|
|
125
|
+
if (insideTargets(file, targets)) continue;
|
|
126
|
+
const source = pairedSourceOf(file);
|
|
127
|
+
if (source === undefined) { unmeasured ??= `${UNMEASURED}: 짝 소스 없음 (${file})`; continue; }
|
|
128
|
+
if (!insideTargets(source, targets)) return { premise: 'P3', verdict: 'wrong', evidence: file };
|
|
129
|
+
}
|
|
130
|
+
if (unmeasured !== undefined) return { premise: 'P3', verdict: 'unknown', evidence: unmeasured };
|
|
131
|
+
return { premise: 'P3', verdict: 'ok', evidence: `failing files all inside target paths (${latest.length})` };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* wrong 이 여럿이면 «가장 좁은 것» 하나만 제안한다(RFC §A-③ — F6 카드 → F7 조치). 좁음 = 수정 폭:
|
|
136
|
+
* P2 자가 가장 좁다(판정 자만 고친다 · 골을 안 건드린다) → P5 환경(재무대) → P4 쪼갬 → P3 범위(경계를 넓힌다)
|
|
137
|
+
* → P1 골(요구 자체를 바꾼다)이 가장 넓다. findings 배열 순서에 우연히 맡기지 않고 이 rank 로 고른다.
|
|
138
|
+
*/
|
|
139
|
+
const NARROWEST_FIRST: readonly PremiseKey[] = ['P2', 'P5', 'P4', 'P3', 'P1'];
|
|
140
|
+
|
|
141
|
+
export function narrowestWrong(findings: readonly PremiseFinding[]): PremiseFinding | undefined {
|
|
142
|
+
for (const premise of NARROWEST_FIRST) {
|
|
143
|
+
const wrong = findings.find((finding) => finding.premise === premise && finding.verdict === 'wrong');
|
|
144
|
+
if (wrong !== undefined) return wrong;
|
|
145
|
+
}
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** 전제 다섯을 되짚어 카드를 세운다 — 순수 계산, LLM 을 부르지 않는다. */
|
|
150
|
+
export function buildPremiseCard(input: PremiseReviewInput): PremiseReviewCard {
|
|
151
|
+
const findings: PremiseFinding[] = [
|
|
152
|
+
{ premise: 'P1', verdict: 'unknown', evidence: UNMEASURED },
|
|
153
|
+
judgeP2(input),
|
|
154
|
+
judgeP3(input),
|
|
155
|
+
{ premise: 'P4', verdict: 'unknown', evidence: UNMEASURED },
|
|
156
|
+
{ premise: 'P5', verdict: 'unknown', evidence: UNMEASURED },
|
|
157
|
+
];
|
|
158
|
+
return { runId: input.runId, findings, proposal: narrowestWrong(findings) };
|
|
159
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HOST-REGATE-REASON-LOST (2nd · 2026-10-12): a host-regate failure must say «why» on the ledger.
|
|
3
|
+
*
|
|
4
|
+
* The first repair (#26215) put `hostRegateFailure` on the pr-terminal row but kept only the first 300 characters,
|
|
5
|
+
* and the gate's own `run()` cut every git/gh error to its first 300 characters as well. A git merge lists one
|
|
6
|
+
* `CONFLICT` line per file and gh puts the GraphQL reason at the end, so a head cut loses exactly the cause
|
|
7
|
+
* (run-caaf045f · PR #26472: the autopsy could not tell a conflict from a gate failure).
|
|
8
|
+
*
|
|
9
|
+
* The detail is bounded (ledger rows are append-only and replayed) but keeps both ends.
|
|
10
|
+
*/
|
|
11
|
+
export const HOST_REGATE_DETAIL_MAX = 4096;
|
|
12
|
+
|
|
13
|
+
/** Keep `text` within `max` characters, preserving its head (an eighth) and its tail (the rest). */
|
|
14
|
+
export function clipRegateDetail(text: string, max = HOST_REGATE_DETAIL_MAX): string {
|
|
15
|
+
if (text.length <= max) return text;
|
|
16
|
+
const marker = ` …[${text.length - max} chars elided]… `;
|
|
17
|
+
const head = Math.floor(max / 8);
|
|
18
|
+
const tail = Math.max(0, max - head - marker.length);
|
|
19
|
+
return text.slice(0, head) + marker + text.slice(text.length - tail);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Files named by `git merge` CONFLICT lines (`CONFLICT (content): Merge conflict in <path>` and the rename/delete forms). */
|
|
23
|
+
export function parseConflictFiles(text: string): string[] {
|
|
24
|
+
const files = new Set<string>();
|
|
25
|
+
for (const raw of text.split('\n')) {
|
|
26
|
+
const line = /^CONFLICT \(([^)]*)\): (.*)$/.exec(raw);
|
|
27
|
+
if (!line) continue;
|
|
28
|
+
const rest = line[2]!;
|
|
29
|
+
const inPath = /Merge conflict in (.+)$/.exec(rest);
|
|
30
|
+
// modify/delete · rename/delete · file/directory name the path first; other free text is not a path.
|
|
31
|
+
const path = inPath ? inPath[1] : /^(?:modify\/delete|rename\/delete)$/.test(line[1]!)
|
|
32
|
+
? /^(.+?) (?:deleted|renamed) in /.exec(rest)?.[1]
|
|
33
|
+
: undefined;
|
|
34
|
+
if (path) files.add(path);
|
|
35
|
+
}
|
|
36
|
+
return [...files].sort();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type MergeFailureKind = 'base-modified' | 'head-moved' | 'conflict' | 'branch-policy' | 'other';
|
|
40
|
+
|
|
41
|
+
/** Classify a `gh pr merge` failure so a reader can tell a race from a conflict from a policy block without the raw text. */
|
|
42
|
+
export function classifyMergeFailure(detail: string, expectedHead?: string, actualHead?: string | null): MergeFailureKind {
|
|
43
|
+
if (/base branch was modified/i.test(detail)) return 'base-modified';
|
|
44
|
+
if (/head branch was modified/i.test(detail)) return 'head-moved';
|
|
45
|
+
if (expectedHead && actualHead && expectedHead !== actualHead) return 'head-moved';
|
|
46
|
+
if (/required status|review is required|protected branch|branch policy|not authorized|merge queue/i.test(detail)) return 'branch-policy';
|
|
47
|
+
if (/\bconflicts?\b/i.test(detail) && !/\bno conflicts?\b/i.test(detail)) return 'conflict';
|
|
48
|
+
return 'other';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** One host-regate failure. The optional facts are filled for the pr-head, merge-conflict and merge steps. */
|
|
52
|
+
export interface HostRegateFailure {
|
|
53
|
+
step: string;
|
|
54
|
+
detail: string;
|
|
55
|
+
expectedHead?: string;
|
|
56
|
+
actualHead?: string | null;
|
|
57
|
+
conflictFiles?: string[];
|
|
58
|
+
/** Number omitted from conflictFiles when the ledger's 200-path bound is reached. */
|
|
59
|
+
conflictFilesOmitted?: number;
|
|
60
|
+
mergeFailureKind?: MergeFailureKind;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** The optional facts of a failure, copied only when well-formed (ledger rows come back from disk). */
|
|
64
|
+
export function regateFailureFacts(failure: unknown): Omit<HostRegateFailure, 'step' | 'detail'> {
|
|
65
|
+
if (!failure || typeof failure !== 'object') return {};
|
|
66
|
+
const f = failure as Record<string, unknown>;
|
|
67
|
+
const sha = (value: unknown): value is string => typeof value === 'string' && /^[0-9a-f]{40}$/i.test(value);
|
|
68
|
+
const kinds: readonly MergeFailureKind[] = ['base-modified', 'head-moved', 'conflict', 'branch-policy', 'other'];
|
|
69
|
+
const conflictFiles = Array.isArray(f.conflictFiles) ? f.conflictFiles.filter((p): p is string => typeof p === 'string') : undefined;
|
|
70
|
+
const priorOmitted = Number.isSafeInteger(f.conflictFilesOmitted) && (f.conflictFilesOmitted as number) > 0 ? f.conflictFilesOmitted as number : 0;
|
|
71
|
+
const conflictFilesOmitted = Math.max(0, (conflictFiles?.length ?? 0) - 200) + priorOmitted;
|
|
72
|
+
return {
|
|
73
|
+
...(sha(f.expectedHead) ? { expectedHead: f.expectedHead } : {}),
|
|
74
|
+
...(sha(f.actualHead) || f.actualHead === null ? { actualHead: f.actualHead as string | null } : {}),
|
|
75
|
+
...(conflictFiles ? { conflictFiles: conflictFiles.slice(0, 200) } : {}),
|
|
76
|
+
...(conflictFilesOmitted > 0 ? { conflictFilesOmitted } : {}),
|
|
77
|
+
...(typeof f.mergeFailureKind === 'string' && kinds.includes(f.mergeFailureKind as MergeFailureKind) ? { mergeFailureKind: f.mergeFailureKind as MergeFailureKind } : {}),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// REVIEW-ACP-POD ②-b — Pod 안 리뷰를 «호스트 리뷰로 미룸».
|
|
2
|
+
//
|
|
3
|
+
// S ②-a(#26457)로 호스트가 Pod merge-ready PR 을 Claude ACP 로 리뷰한다. 그런데 Pod 안 하니스 리뷰는 그대로 api 로 돌아
|
|
4
|
+
// 켜면 리뷰가 «둘»(돈 두 번)이다.
|
|
5
|
+
// C 오케스트레이터는 «실제 리뷰»(`reviewed=true`)가 있어야 merge-ready 를 낸다 — 그냥 끄면 `no-real-review` 로 멎는다.
|
|
6
|
+
// Q Pod 안 리뷰를 어떻게 «정직하게» 비우나?
|
|
7
|
+
// A 발사 호스트가 ACP 리뷰를 맡을 때만 자식 env 에 표지를 싣는다. 자식은 api 리뷰를 부르지 않고
|
|
8
|
+
// `reviewed=false` ⊕ `failureReason=deferred-to-host` 를 낸다(⛔ verdict 를 clean 으로 꾸미지 않는다).
|
|
9
|
+
// 오케스트레이터는 «호스트 병합(mergeByHost)» 런에서만 그 상태를 merge-ready 로 받고 `mergeReason` 에 적어 호스트로 돌려보낸다.
|
|
10
|
+
// 호스트는 그 표지를 보면 ACP 리뷰를 «반드시» 하고, 못 하면(refused) 병합하지 않는다(fail-closed).
|
|
11
|
+
|
|
12
|
+
/** 발사 호스트 → Pod 자식: 「리뷰는 호스트가 Claude ACP 로 한다 — Pod 안 api 리뷰를 부르지 마라」. 값 `1` 만 켠다. */
|
|
13
|
+
export const REVIEW_DEFERRED_TO_HOST_ENV = 'ELANOUS_REVIEW_DEFERRED_TO_HOST';
|
|
14
|
+
/** 미룬 리뷰의 `failureReason`(`reviewed=false` 의 «왜»). */
|
|
15
|
+
export const REVIEW_DEFERRED_TO_HOST_FAILURE = 'deferred-to-host';
|
|
16
|
+
/** 자식 merge-ready 결과의 `mergeReason` — 호스트가 이 값으로 «Pod 리뷰 없음»을 안다. */
|
|
17
|
+
export const REVIEW_DEFERRED_TO_HOST_MERGE_REASON = 'review-deferred-to-host';
|
|
18
|
+
|
|
19
|
+
export function reviewDeferredToHostFromEnv(env: Readonly<Record<string, string | undefined>>): boolean {
|
|
20
|
+
return env[REVIEW_DEFERRED_TO_HOST_ENV]?.trim() === '1';
|
|
21
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { executeClassifyNode } from '../workflow-runtime/nodes/classify.js';
|
|
2
|
+
import { buildPremiseCard, type PremiseReviewCard, type PremiseReviewInput } from './premise-review.js';
|
|
2
3
|
import { SUPERVISION_REWORK_SOURCES, type SupervisionReworkSource } from './supervision-vocabulary.js';
|
|
3
4
|
import type { ClassifyNode, JudgmentContext, JudgmentResult, NodeExecContext, WorkflowDefinition, WorkflowDeps } from '../workflow-runtime/types.js';
|
|
4
5
|
|
|
@@ -22,6 +23,8 @@ interface ObservedValue {
|
|
|
22
23
|
interface ReworkBudgetEvidence {
|
|
23
24
|
observations: Record<'goal' | 'outcome' | 'history' | 'kind', ObservedValue>;
|
|
24
25
|
modelReasoning: string;
|
|
26
|
+
/** UNCONVERGEABLE 직전에 세운 premise-review 카드(FLEX-RFC §A-③). 카드를 안 만든 판정에는 키가 없다. */
|
|
27
|
+
premiseReview?: PremiseReviewCard | undefined;
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
type EvidencedJudgmentResult = JudgmentResult & { evidence: ReworkBudgetEvidence };
|
|
@@ -108,7 +111,13 @@ export function reworkBudgetEvidenceForObservation(readEvidence: () => unknown):
|
|
|
108
111
|
}
|
|
109
112
|
}
|
|
110
113
|
|
|
111
|
-
|
|
114
|
+
/** `createReworkBudgetJudgment` 의 선택 인자 — 주지 않으면 카드 없이 지금 동작 그대로. */
|
|
115
|
+
export interface ReworkBudgetJudgmentOpts {
|
|
116
|
+
/** UNCONVERGEABLE 판정 직전에 세울 premise-review 카드의 입력(값 객체). */
|
|
117
|
+
premiseInput?: PremiseReviewInput | undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM'], opts: ReworkBudgetJudgmentOpts = {}) {
|
|
112
121
|
let latestEvidence: ReworkBudgetEvidence | undefined;
|
|
113
122
|
const provider = async (contractId: string, ctx: JudgmentContext): Promise<JudgmentResult> => {
|
|
114
123
|
if (contractId !== REWORK_BUDGET_JUDGMENT) {
|
|
@@ -145,6 +154,7 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
|
|
|
145
154
|
toolPolicy: {},
|
|
146
155
|
};
|
|
147
156
|
let modelReasoning = '';
|
|
157
|
+
let premiseReview: PremiseReviewCard | undefined;
|
|
148
158
|
const result = await executeClassifyNode(node, execContext, {
|
|
149
159
|
callLLM: async (args) => {
|
|
150
160
|
modelReasoning = await callLLM(args);
|
|
@@ -152,7 +162,11 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
|
|
|
152
162
|
},
|
|
153
163
|
runBash: async () => ({ stdout: '', stderr: '', exitCode: 0 }),
|
|
154
164
|
});
|
|
155
|
-
const evidence = (): ReworkBudgetEvidence => ({
|
|
165
|
+
const evidence = (): ReworkBudgetEvidence => ({
|
|
166
|
+
observations,
|
|
167
|
+
modelReasoning,
|
|
168
|
+
...(premiseReview === undefined ? {} : { premiseReview }),
|
|
169
|
+
});
|
|
156
170
|
const evidenced = (judgment: JudgmentResult): EvidencedJudgmentResult => {
|
|
157
171
|
const resultWithEvidence = withEvidence(judgment, evidence());
|
|
158
172
|
latestEvidence = resultWithEvidence.evidence;
|
|
@@ -172,7 +186,13 @@ export function createReworkBudgetJudgment(callLLM: WorkflowDeps['callLLM']) {
|
|
|
172
186
|
+ ` expected one of EXTEND|SUFFICIENT|UNCONVERGEABLE`,
|
|
173
187
|
});
|
|
174
188
|
}
|
|
175
|
-
|
|
189
|
+
const verdict = mapReworkBudgetVerdict(picked, kind);
|
|
190
|
+
// FLEX-RFC §A-③ — UNCONVERGEABLE 을 «내기 전에» 전제를 되짚는다. 카드는 기존 증거 관측에 실려
|
|
191
|
+
// 원장('rework-budget' 사건)으로 나간다 — 사건 형식은 그대로, 카드는 증거 안의 추가 칸이다.
|
|
192
|
+
if (picked === 'UNCONVERGEABLE' && opts.premiseInput !== undefined) {
|
|
193
|
+
premiseReview = buildPremiseCard(opts.premiseInput);
|
|
194
|
+
}
|
|
195
|
+
return evidenced({ ok: true, output: picked, verdict });
|
|
176
196
|
};
|
|
177
197
|
return Object.assign(provider, { evidenceForObservation: () => latestEvidence });
|
|
178
198
|
}
|
|
@@ -566,13 +566,83 @@ export function queryRunningRuns(options: { includeTest?: boolean; runIds?: read
|
|
|
566
566
|
}
|
|
567
567
|
}
|
|
568
568
|
|
|
569
|
-
export function
|
|
570
|
-
|
|
571
|
-
const partial = (result.count !== undefined && typeof result.count !== 'number' && result.count.count === null)
|
|
569
|
+
export function isPartialRunningRuns(result: RunningRunsResult): boolean {
|
|
570
|
+
return (result.count !== undefined && typeof result.count !== 'number' && result.count.count === null)
|
|
572
571
|
|| result.completeness === 'partial' || hasUnreadableLedgerObservation(result.ledger) || (result.unreadable?.length ?? 0) > 0;
|
|
573
|
-
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
function runningRunsLowerBound(result: RunningRunsResult): number {
|
|
575
|
+
return result.count !== undefined && typeof result.count !== 'number'
|
|
574
576
|
? result.count.lowerBound : result.counts.running + result.counts['probable-running'];
|
|
575
|
-
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
function runningRunsUnreadable(result: RunningRunsResult): readonly UnreadableRunningRunsLedger[] {
|
|
580
|
+
return result.unreadable ?? (result.count !== undefined && typeof result.count !== 'number' ? result.count.unreadable : []);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
export interface RunProgressRow {
|
|
584
|
+
readonly runId: string;
|
|
585
|
+
readonly status: RunningRunStatus;
|
|
586
|
+
/** null = no phase observed; never rendered as «none». */
|
|
587
|
+
readonly lastPhase: string | null;
|
|
588
|
+
readonly lastPhaseObservedAt: string | null;
|
|
589
|
+
readonly lastActivityTimestamp: string | null;
|
|
590
|
+
/** Milliseconds since lastActivityTimestamp; null when the timestamp is absent or unparseable. */
|
|
591
|
+
readonly elapsedMs: number | null;
|
|
592
|
+
readonly ptyRefs: readonly string[];
|
|
593
|
+
readonly phaseObservation: RunningRunPhaseObservation;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
export function buildRunProgressRows(result: RunningRunsResult, nowMs: number = Date.now()): RunProgressRow[] {
|
|
597
|
+
return result.entries.map((entry) => {
|
|
598
|
+
const activityMs = entry.lastActivityTimestamp === null ? Number.NaN : Date.parse(entry.lastActivityTimestamp);
|
|
599
|
+
return {
|
|
600
|
+
runId: entry.runId,
|
|
601
|
+
status: entry.status,
|
|
602
|
+
lastPhase: entry.lastPhase ?? null,
|
|
603
|
+
lastPhaseObservedAt: entry.lastPhaseObservedAt ?? null,
|
|
604
|
+
lastActivityTimestamp: entry.lastActivityTimestamp,
|
|
605
|
+
elapsedMs: Number.isFinite(activityMs) ? Math.max(0, nowMs - activityMs) : null,
|
|
606
|
+
ptyRefs: entry.ptyRefs.map((ref) => `${ref.instance}:${ref.id}`),
|
|
607
|
+
phaseObservation: entry.phaseObservation ?? 'not-observed',
|
|
608
|
+
};
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
function formatElapsed(ms: number): string {
|
|
613
|
+
const totalSeconds = Math.floor(ms / 1000);
|
|
614
|
+
const days = Math.floor(totalSeconds / 86_400);
|
|
615
|
+
const hours = Math.floor((totalSeconds % 86_400) / 3_600);
|
|
616
|
+
const minutes = Math.floor((totalSeconds % 3_600) / 60);
|
|
617
|
+
const seconds = totalSeconds % 60;
|
|
618
|
+
if (days > 0) return `${days}d${hours}h`;
|
|
619
|
+
if (hours > 0) return `${hours}h${minutes}m`;
|
|
620
|
+
if (minutes > 0) return `${minutes}m${seconds}s`;
|
|
621
|
+
return `${seconds}s`;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
export function renderRunProgressTable(result: RunningRunsResult, nowMs: number = Date.now()): string {
|
|
625
|
+
const partial = isPartialRunningRuns(result);
|
|
626
|
+
const header = partial
|
|
627
|
+
? `부분 관측 — 최소 ${runningRunsLowerBound(result)} (읽지 못한 원장: ${runningRunsUnreadable(result).map((item) => `${item.dir}:${item.reason}`).join(',') || '목록 미관측'})`
|
|
628
|
+
: `도는 런 ${result.counts.running + result.counts['probable-running']} (확인 ${result.counts.running} · 추정 ${result.counts['probable-running']})`;
|
|
629
|
+
const rows = buildRunProgressRows(result, nowMs).map((row) => {
|
|
630
|
+
const phaseUnreadable = row.phaseObservation === 'unreadable' || row.phaseObservation === 'partially-unreadable';
|
|
631
|
+
const phase = row.lastPhase ?? (phaseUnreadable ? '미관측 (단계 저장소 읽기 실패)' : '미관측');
|
|
632
|
+
const phaseAt = row.lastPhaseObservedAt ?? '미관측';
|
|
633
|
+
const progress = row.lastActivityTimestamp === null
|
|
634
|
+
? '미관측'
|
|
635
|
+
: `${row.lastActivityTimestamp} (경과 ${row.elapsedMs === null ? '알 수 없음' : formatElapsed(row.elapsedMs)})`;
|
|
636
|
+
return `${row.runId} · ${row.status} · 단계 ${phase} · 진입 ${phaseAt} · 마지막 진전 ${progress} · pty ${row.ptyRefs.join(',') || '없음'}`;
|
|
637
|
+
});
|
|
638
|
+
return [header, ...rows].join('\n');
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
export function renderRunningRuns(result: RunningRunsResult): string {
|
|
642
|
+
const lingeringLaunchParents = result.lingeringLaunchParents ?? { observation: 'indeterminate' } as const;
|
|
643
|
+
const partial = isPartialRunningRuns(result);
|
|
644
|
+
const lowerBound = runningRunsLowerBound(result);
|
|
645
|
+
const unreadable = runningRunsUnreadable(result);
|
|
576
646
|
return [
|
|
577
647
|
partial
|
|
578
648
|
? `running runs: unknown (at least ${lowerBound}) unreadable: ${unreadable.map((item) => `${item.dir}:${item.reason}`).join(',')}`
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// SCOPE-HELD-DELIVER (0.2.25) — which out-of-scope edits sit right next to a declared target.
|
|
2
|
+
// 10-11~12: 34 scope-held runs auto-answered «Stay in scope» after 30 unanswered minutes and threw away finished work;
|
|
3
|
+
// the outside files were a declared file's same-folder neighbours (its other tests, a sibling helper, the folder's
|
|
4
|
+
// plugin.json). Those are adjacent: the run goes on to its gate instead of parking on a question nobody answers.
|
|
5
|
+
|
|
6
|
+
const normalize = (path: string): string => path.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
|
|
7
|
+
const dirOf = (path: string): string => { const at = path.lastIndexOf('/'); return at < 0 ? '' : path.slice(0, at); };
|
|
8
|
+
|
|
9
|
+
/** Split out-of-scope files into those adjacent to a declared target and the rest. A file is adjacent when it sits in
|
|
10
|
+
* the same folder as a declared file. A declared folder adds nothing (its contents are already in scope), and a
|
|
11
|
+
* declared repo-root file adds nothing (the root holds the whole repo's config). */
|
|
12
|
+
export function classifyOutOfScope(outsideFiles: readonly string[], declaredPaths: readonly string[]): { adjacent: string[]; other: string[] } {
|
|
13
|
+
const folders = new Set<string>();
|
|
14
|
+
for (const declared of declaredPaths.map(normalize)) {
|
|
15
|
+
const dir = dirOf(declared);
|
|
16
|
+
// A path with an extension names a file; without one it names a folder.
|
|
17
|
+
if (dir && /\.[A-Za-z0-9]+$/.test(declared.slice(dir.length + 1))) folders.add(dir);
|
|
18
|
+
}
|
|
19
|
+
const adjacent: string[] = [];
|
|
20
|
+
const other: string[] = [];
|
|
21
|
+
for (const file of outsideFiles) (folders.has(dirOf(normalize(file))) ? adjacent : other).push(file);
|
|
22
|
+
return { adjacent, other };
|
|
23
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
import { fileURLToPath } from 'node:url';
|
|
16
16
|
import { judgePredictionAccuracy, mustFixTrendFromHistory, renderJudgeOwnSignals, renderJudgePredictionAccuracy } from './judge-prediction-accuracy.js';
|
|
17
17
|
import { isElanousRuntimeArtifactPath } from './gate-scope.js';
|
|
18
|
+
import { buildPrConclusionCard, firstParagraphOf, prConclusionCardHeader } from '../context-card/index.js';
|
|
18
19
|
import { spawn, spawnSync, execFile } from 'node:child_process';
|
|
19
20
|
import { randomUUID, timingSafeEqual } from 'node:crypto';
|
|
20
21
|
import { existsSync, lstatSync, mkdtempSync, readFileSync, realpathSync, rmSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
@@ -34,6 +35,7 @@ import { isWorktreeInUse, listActiveTerminalDirectories } from '../harness/harne
|
|
|
34
35
|
import { readWorktreePorcelain } from './abandoned-classification.js';
|
|
35
36
|
import { recordHarnessWorktreeGoalMetadata, recordHarnessWorktreeProvenance, type HarnessWorktreeGoalMetadata } from '../harness/harness-worktree-add.js';
|
|
36
37
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
38
|
+
import { BENCH_LABEL, BENCH_LOG_CATEGORY, benchIdFromBase, parseBenchArmBranch } from '../bench/bench.js';
|
|
37
39
|
import { provisionDerivedUniverse } from '../instance/provision.js';
|
|
38
40
|
import { DEFAULT_GATE_STEPS, runIntegrityGate, type GateResult, type GateStepName } from '../autopilot/build/integrity-gate.js';
|
|
39
41
|
import { androidFilesIn, runAndroidUnitTestGate } from '../../scripts/ci-android-unit-tests.js';
|
|
@@ -70,6 +72,7 @@ import { ghAutomationEnv, makePrManager, type PrManager } from '../autopilot/pr-
|
|
|
70
72
|
import { defaultSpawnGh, lookupOpenDraftPrs } from '../cli/logs-abandoned-draft-prs.js';
|
|
71
73
|
import { loadRunLedger, runLedgerDir } from './run-ledger.js';
|
|
72
74
|
import { readdirSync } from 'node:fs';
|
|
75
|
+
import { REVIEW_DEFERRED_TO_HOST_FAILURE } from './review-deferred-to-host.js';
|
|
73
76
|
import { budgetReviewerContext, reviewDiffBudgetObservation, reviewPullRequest, renderReview, type ReviewerContextItem } from '../agent-substrate/pr-reviewer.js';
|
|
74
77
|
import { buildReviewIntent, type ReviewIntentInput } from '../agent-substrate/review-intent.js';
|
|
75
78
|
import { OFF_DIFF_EVIDENCE_PROMPT, requiredEvidenceFromGoal, renderRequiredEvidencePrompt, tailWithOmissionMarker } from './off-diff-evidence.js';
|
|
@@ -94,6 +97,7 @@ import { isSupervisorDecisionSection, splitGoalSections, supervisorGoalDigest }
|
|
|
94
97
|
import type { SupervisionReworkSource } from './supervision-vocabulary.js';
|
|
95
98
|
import type { ReworkBudgetVerdict } from './run-outcome.js';
|
|
96
99
|
import { pickImplementRoleForGoal, runHeadlessGoalLoopPty } from './headless-elanous-driver.js';
|
|
100
|
+
import { isClaudeAcpChild, runClaudeAcpImplement } from './claude-acp-implement.js';
|
|
97
101
|
import { childLlmSelectionEnv } from '../agent/run-context.js';
|
|
98
102
|
import { observeExternalEvent } from '../context-bus/external-events.js';
|
|
99
103
|
import { buildLlmHitlRelay, SIDE_EFFECT_RE } from '../harness/llm-hitl-relay.js';
|
|
@@ -847,16 +851,34 @@ export function changedFileTypecheck(
|
|
|
847
851
|
}
|
|
848
852
|
}
|
|
849
853
|
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
+
export interface PrBodyConclusionInput {
|
|
855
|
+
/** 결론줄 «포인터:» 에 붙일 원본 위치(원문 전문을 가리키는 참조). */
|
|
856
|
+
readonly pointers?: readonly string[];
|
|
857
|
+
/** 원문 본문을 읽지 못한 경우 — «결론: 확인 불가» 로 떨어진다. */
|
|
858
|
+
readonly unreadable?: boolean;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
/** RFC context-diet §3a — PR 본문 첫 단락을 «결론: <한 줄> · 포인터: <원본>» 결론줄로 앞세우고
|
|
862
|
+
* 원문 본문은 결론줄 아래 그대로 둔다(지우지 않는다). 결론이 없으면 «결론: 없음(원문에 결론 없음)». */
|
|
863
|
+
export function buildPrBody(cwd: string, body: string, conclusion?: PrBodyConclusionInput): string {
|
|
864
|
+
const card = buildPrConclusionCard({
|
|
865
|
+
id: 'pr-body-conclusion',
|
|
866
|
+
firstParagraph: firstParagraphOf(body),
|
|
867
|
+
...(conclusion?.unreadable ? { unreadable: true } : {}),
|
|
868
|
+
pointers: [...(conclusion?.pointers ?? [])],
|
|
869
|
+
source: 'pr-body',
|
|
870
|
+
updatedAt: new Date().toISOString(),
|
|
871
|
+
});
|
|
872
|
+
const header = prConclusionCardHeader(card);
|
|
854
873
|
const templatePath = join(cwd, '.github', 'pull_request_template.md');
|
|
855
|
-
|
|
856
|
-
const
|
|
857
|
-
return template ? `${template}\n\n${
|
|
874
|
+
const template = existsSync(templatePath) ? readFileSync(templatePath, 'utf8').trim() : '';
|
|
875
|
+
const withConclusion = `${header}\n\n${body}`;
|
|
876
|
+
return template ? `${template}\n\n${withConclusion}` : withConclusion;
|
|
858
877
|
}
|
|
859
878
|
|
|
879
|
+
/** 헤드리스 elanous 가 이 feature 를 구현하도록 주입하는 프롬프트. goal-loop 계약 + 검증된 클린-빌드
|
|
880
|
+
* 앵커(측정→운영·[[REPORT-gemma-goalloop-lever-2026-07-20]])를 명시. 앵커가 gemma 를 99 로 끌어올렸고
|
|
881
|
+
* 강한 모델엔 무해 — self-run 어느 provider 든 동일 규율. */
|
|
860
882
|
export function featurePrompt(feature: string, cwd?: string, reviewerContext?: readonly ReviewerContextItem[]): string {
|
|
861
883
|
const worktreeNotice = cwd?.trim()
|
|
862
884
|
? `작업 디렉토리는 \`${cwd}\`다. 이 트리 안에서만 편집하고, 경로가 필요하면 추측하지 말고 이 경로를 기준으로 삼아라.`
|
|
@@ -1061,12 +1083,17 @@ export interface DefaultSeamsOptions {
|
|
|
1061
1083
|
* ⛔ llmReview 시그니처는 그대로(prompt-in/text-out · 도구 채널 없음).
|
|
1062
1084
|
*/
|
|
1063
1085
|
reviewerCanSelfRead?: boolean;
|
|
1086
|
+
/** REVIEW-ACP-POD ②-b — 참이면 reviewDiff 가 리뷰어를 부르지 않고 `reviewed=false` ⊕ `failureReason=deferred-to-host` 를 낸다
|
|
1087
|
+
* (발사 호스트가 Claude ACP 로 리뷰한다). 기본 거짓 = 종전. */
|
|
1088
|
+
reviewDeferredToHost?: boolean;
|
|
1064
1089
|
/** CLI가 적재한 리뷰어 컨텍스트. 비어 있으면 기존 ReviewInput 형태를 유지한다. */
|
|
1065
1090
|
reviewerContext?: ReviewerContextItem[];
|
|
1066
1091
|
/** 기존 LLM HITL relay builder의 테스트 seam. 생성 실패 시 기본 dispatch를 그대로 유지한다. */
|
|
1067
1092
|
buildLlmHitlRelay?: typeof buildLlmHitlRelay;
|
|
1068
1093
|
/** 테스트용 PTY executor 주입. */
|
|
1069
1094
|
runHeadlessGoalLoopPty?: typeof runHeadlessGoalLoopPty;
|
|
1095
|
+
/** CLAUDE-IMPL-LANE 시험 주입 — claude-acp 자식의 구독 ACP 구현 실행. */
|
|
1096
|
+
runClaudeAcpImplement?: typeof runClaudeAcpImplement;
|
|
1070
1097
|
/** 테스트용 PTY 가용성 주입. */
|
|
1071
1098
|
ptyAvailable?: () => boolean;
|
|
1072
1099
|
/** Tests may inject the shared provenance writer to exercise the self-implement failure contract. */
|
|
@@ -1367,6 +1394,8 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1367
1394
|
const removeCleanupWorktree = o.removeWorktree ?? removeWorktree;
|
|
1368
1395
|
const runCleanupGitCommand = o.runGitCommand ?? runGitCommand;
|
|
1369
1396
|
const baselineRefs = new Map<string, string>();
|
|
1397
|
+
// BENCH-ISOLATED-ARMS — 벤치 base(`bench/<id>/base`) 위에서 만든 작업 트리 → bench id.
|
|
1398
|
+
const benchWorktrees = new Map<string, string>();
|
|
1370
1399
|
const gateVerifyOrdinals = new Map<string, number>();
|
|
1371
1400
|
const gateVerifyIdentity = (runId: string | undefined) => {
|
|
1372
1401
|
if (!runId?.trim()) return { runId: runId === undefined ? null : runId, ordinal: null };
|
|
@@ -1535,6 +1564,18 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1535
1564
|
defaultBranchRef,
|
|
1536
1565
|
// ★ G2(2026-07-21) — 호출부가 해석한 대상만 PR 직전에 정합한다.
|
|
1537
1566
|
mergeMain: async (worktreePath, mergeTarget) => {
|
|
1567
|
+
// BENCH-ISOLATED-ARMS ③ — 벤치 팔은 main 에 정합하지 않는다: 판정은 고정 base 위 게이트·시험·리뷰.
|
|
1568
|
+
// ⭐ 표지는 둘 중 하나 — 이 프로세스가 벤치 base 로 만든 트리이거나, 트리 가지가 `bench/<id>/<arm>` 이다
|
|
1569
|
+
// (재개 프로세스는 앞의 Map 이 비어 있으므로 가지 이름으로 다시 안다).
|
|
1570
|
+
const benchArm = benchWorktrees.has(worktreePath) ? undefined : (() => {
|
|
1571
|
+
const head = runGitCommand(worktreePath, ['rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf8', timeout: GIT_TIMEOUT });
|
|
1572
|
+
return head.status === 0 ? parseBenchArmBranch(String(head.stdout).trim()) : null;
|
|
1573
|
+
})();
|
|
1574
|
+
const benchId = benchWorktrees.get(worktreePath) ?? benchArm?.id;
|
|
1575
|
+
if (benchId) {
|
|
1576
|
+
debug.log(BENCH_LOG_CATEGORY, 'main-sync-skipped', { benchId, worktreePath, mergeTarget, source: benchWorktrees.has(worktreePath) ? 'base' : 'branch' });
|
|
1577
|
+
return { status: 'up-to-date' as const };
|
|
1578
|
+
}
|
|
1538
1579
|
const { mergeMainIntoWorktreeWithLlm } = await import('../autopilot/build/llm-conflict-merge.js');
|
|
1539
1580
|
return mergeMainIntoWorktreeWithLlm(worktreePath, mergeTarget);
|
|
1540
1581
|
},
|
|
@@ -1586,6 +1627,8 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1586
1627
|
...(runId ? { currentOwner: `dev:${runId}` } : {}),
|
|
1587
1628
|
});
|
|
1588
1629
|
if (r.resolvedBase) baselineRefs.set(r.path, r.resolvedBase);
|
|
1630
|
+
const benchId = benchIdFromBase(base);
|
|
1631
|
+
if (benchId) benchWorktrees.set(r.path, benchId);
|
|
1589
1632
|
const provenance = runId ? {
|
|
1590
1633
|
owner: `dev:${runId}`,
|
|
1591
1634
|
command: 'elanous dev',
|
|
@@ -1686,6 +1729,28 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
1686
1729
|
...(runId ? { runId } : {}),
|
|
1687
1730
|
});
|
|
1688
1731
|
const prompt = featurePrompt(feature, cwd, o.reviewerContext);
|
|
1732
|
+
// CLAUDE-IMPL-LANE — claude-acp 는 PTY 자식(`elanous chat` → getProvider)으로 보내지 않는다:
|
|
1733
|
+
// 거기서는 모델 이름(claude-…)이 anthropic(API 키 provider)으로 풀려 «구독» 런이 API 로 과금된다(#26277 보류 판독).
|
|
1734
|
+
// 구독 ACP 구현기만 쓰고, 구독 확인이 안 되면 실패로 끝낸다(다른 공급자로 조용히 새지 않는다).
|
|
1735
|
+
if (isClaudeAcpChild(childLlm)) {
|
|
1736
|
+
const outcome = await (o.runClaudeAcpImplement ?? runClaudeAcpImplement)({
|
|
1737
|
+
cwd, prompt, ...(childLlm?.model ? { model: childLlm.model } : {}), ...(runId ? { runId } : {}),
|
|
1738
|
+
});
|
|
1739
|
+
if (outcome.kind === 'refused') {
|
|
1740
|
+
debug.log('self-implement', 'implement.result', { reached: false, changed: false, transport: 'claude-acp', refused: outcome.reason, ...(runId ? { runId } : {}) });
|
|
1741
|
+
return { ok: false, summary: `claude-acp 구현 레인 거부: ${outcome.reason}` };
|
|
1742
|
+
}
|
|
1743
|
+
const changed = worktreeHasChanges(cwd, harnessSeededPaths ?? []);
|
|
1744
|
+
// 도구 호출 수 = 허가를 요청한 호출(허가 ⊕ 거부) — ACP 는 읽기 전용 호출 일부를 묻지 않으니 하한이다.
|
|
1745
|
+
const toolCalls = outcome.result.allowed + outcome.result.denied;
|
|
1746
|
+
debug.log('self-implement', 'implement.result', { reached: true, changed, toolCalls, transport: 'claude-acp', allowed: outcome.result.allowed, denied: outcome.result.denied, ...(runId ? { runId } : {}) });
|
|
1747
|
+
return {
|
|
1748
|
+
ok: changed,
|
|
1749
|
+
...buildImplementReport(outcome.result.text, { changed, toolCalls, reached: true, timedOut: false }),
|
|
1750
|
+
toolCalls,
|
|
1751
|
+
terminalStatus: { reached: true, changed, toolCalls, timedOut: false },
|
|
1752
|
+
};
|
|
1753
|
+
}
|
|
1689
1754
|
// S4 P2b/P3: input은 관측만 하며, done만 config와 stall 확증을 모두 만족할 때 부모 대기를 끝낸다.
|
|
1690
1755
|
// 이 종료-보고 규칙은 self-implement child에만 적용한다. 범용 brain의 기본 프롬프트를 바꾸지 않는다.
|
|
1691
1756
|
const brain = createSelfImplementControlBrain({ goal: feature });
|
|
@@ -2436,7 +2501,11 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2436
2501
|
commitMessage: title,
|
|
2437
2502
|
...(resolvedBase ? { base: resolvedBase } : {}),
|
|
2438
2503
|
...(draft !== undefined ? { draft } : {}),
|
|
2439
|
-
|
|
2504
|
+
// BENCH-ISOLATED-ARMS ② — base 가 `bench/<id>/base` 면 라벨 `elanous:bench` 를 더한다.
|
|
2505
|
+
...(() => {
|
|
2506
|
+
const all = benchIdFromBase(resolvedBase) && !labels?.includes(BENCH_LABEL) ? [...(labels ?? []), BENCH_LABEL] : labels;
|
|
2507
|
+
return all?.length ? { labels: all } : {};
|
|
2508
|
+
})(),
|
|
2440
2509
|
});
|
|
2441
2510
|
if (!outcome.ok) throw new Error(`self-implement PR ${outcome.reason} 실패: ${outcome.detail}`);
|
|
2442
2511
|
const number = Number.parseInt(outcome.url.match(/\/pull\/(\d+)/)?.[1] ?? '', 10);
|
|
@@ -2541,6 +2610,18 @@ export function defaultSeams(o: DefaultSeamsOptions = {}): SelfImplementSeams {
|
|
|
2541
2610
|
...(o.reviewerCanSelfRead !== undefined ? { canSelfRead: o.reviewerCanSelfRead } : {}),
|
|
2542
2611
|
};
|
|
2543
2612
|
}
|
|
2613
|
+
if (o.reviewDeferredToHost) {
|
|
2614
|
+
// REVIEW-ACP-POD ②-b — 리뷰어 호출 0. ⛔ 통과로 꾸미지 않는다(reviewed=false) — 판정은 호스트 ACP 리뷰가 맡는다.
|
|
2615
|
+
debug.log('self-implement', 'review.done', {
|
|
2616
|
+
verdict: 'warn', reviewed: false, reason: REVIEW_DEFERRED_TO_HOST_FAILURE,
|
|
2617
|
+
...(ctx?.round !== undefined ? { round: ctx.round } : {}),
|
|
2618
|
+
});
|
|
2619
|
+
try { emitDecision(reviewDecision({ runId: ctx?.runId, verdict: 'warn', reviewed: false, reason: REVIEW_DEFERRED_TO_HOST_FAILURE })); } catch { /* observation must not change the review result */ }
|
|
2620
|
+
return {
|
|
2621
|
+
verdict: 'warn' as const, mustFix: [], shouldFix: [], summary: '(리뷰를 호스트 Claude ACP 리뷰로 미뤘다)', reviewed: false,
|
|
2622
|
+
failureReason: REVIEW_DEFERRED_TO_HOST_FAILURE, deferredToHost: true as const,
|
|
2623
|
+
};
|
|
2624
|
+
}
|
|
2544
2625
|
const intentInput = toReviewIntentInput(ctx);
|
|
2545
2626
|
const phaseIntent = intentInput ? buildReviewIntent(intentInput) : 'self-implement 변경 리뷰';
|
|
2546
2627
|
const evidenceNote = [
|