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
|
@@ -10,6 +10,8 @@ import { releaseGitDiffPaths, releasePathHold, releasePathHoldShouldPost, releas
|
|
|
10
10
|
import { detectTestInterference, parseFailureCount, runBunTest } from '../../scripts/detect-test-interference.js';
|
|
11
11
|
import { MAX_INSPECTED_TEST_FILES, runTestInterferenceGate } from '../../scripts/ci-test-interference-gate.js';
|
|
12
12
|
import { pwaGraph, pwaReach } from '../../scripts/ci-pwa-build-gate.js';
|
|
13
|
+
import { classifyMergeFailure, clipRegateDetail, parseConflictFiles, type HostRegateFailure } from './regate-detail.js';
|
|
14
|
+
import { buildImporterTestIndex, isTestPath } from './importer-test-index.js';
|
|
13
15
|
|
|
14
16
|
/** Use pr-land's PWA reachability (including its undecidable-graph build fallback), not a blanket src/** trigger. */
|
|
15
17
|
export function needsPwaBuild(files: readonly string[], repoRoot: string, graph: (root: string) => ReturnType<typeof pwaGraph> = pwaGraph): boolean {
|
|
@@ -29,8 +31,8 @@ export function provideCheckoutDependencies(candidate: string, sourceRoot: strin
|
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
export interface HostRegateInput { prNumber: number; headCommit: string; repoRoot: string; goalFile?: string; verifyOnly?: boolean; /** TA-LIVE-LAND-2: run the full landing gates (release-path hold · neighbours · PR re-read) but stop before the freeze admission and `gh pr merge` — the task agent lands it later via `pr land --expected-head`. */ noMerge?: true; /** Called by a resume sweep that already holds this PR's claim. */ resumed?: true }
|
|
32
|
-
export interface HostRegateResult { passed: boolean; failures:
|
|
33
|
-
export type InterferenceVerdict = { passed: boolean; detail?: string; unmeasured?: boolean; /** neighbour tests left out so the selection fits the inspection cap */ neighborsTrimmed?: number };
|
|
34
|
+
export interface HostRegateResult { passed: boolean; failures: HostRegateFailure[]; os: string; status?: 'passed' | 'failed' | 'unmeasured' | 'frozen'; /** verifyOnly: 실제로 얹어 잰 base 끝 */ baseCommit?: string }
|
|
35
|
+
export type InterferenceVerdict = { passed: boolean; detail?: string; unmeasured?: boolean; /** neighbour tests left out so the selection fits the inspection cap */ neighborsTrimmed?: number; /** importer tests left out after changed tests and all selected neighbors take priority */ importerTrimmed?: number };
|
|
34
36
|
export type HostRegateDeps = {
|
|
35
37
|
command?: (bin: string, args: readonly string[], cwd: string, env?: NodeJS.ProcessEnv) => { status: number | null; stdout: string; stderr: string };
|
|
36
38
|
interference?: (files: readonly string[], cwd: string) => Promise<InterferenceVerdict>;
|
|
@@ -56,41 +58,91 @@ const defaultCommand: NonNullable<HostRegateDeps['command']> = (bin, args, cwd,
|
|
|
56
58
|
};
|
|
57
59
|
|
|
58
60
|
/** The informational pr-land gate always returns zero; enforce its measured report and the combined test result instead. */
|
|
59
|
-
export async function defaultInterference(files: readonly string[], cwd: string, opts: {
|
|
61
|
+
export async function defaultInterference(files: readonly string[], cwd: string, opts: {
|
|
62
|
+
neighbors?: boolean;
|
|
63
|
+
detect?: typeof detectTestInterference;
|
|
64
|
+
run?: (files: readonly string[], cwd: string) => ReturnType<typeof runBunTest>;
|
|
65
|
+
buildImporterTestIndex?: typeof buildImporterTestIndex;
|
|
66
|
+
} = {}): Promise<InterferenceVerdict> {
|
|
60
67
|
const tests = [...new Set(files.filter((file) => /\.test\.tsx?$/.test(file)))].sort();
|
|
61
68
|
const changed = new Set(tests);
|
|
69
|
+
const changedSources = [...new Set(files.filter((file) => /\.(?:[cm]?[jt]sx?)$/.test(file) && !isTestPath(file)))].sort();
|
|
70
|
+
const importers = new Set<string>();
|
|
62
71
|
const neighbors = new Set<string>();
|
|
63
|
-
|
|
64
|
-
|
|
72
|
+
let importerIndexFailed = false;
|
|
73
|
+
|
|
74
|
+
// verifyOnly measures changed tests only; it deliberately does not construct or add importer/folder tests.
|
|
75
|
+
if (opts.neighbors !== false && changedSources.length > 0) {
|
|
76
|
+
try {
|
|
77
|
+
const listed = spawnSync('git', ['ls-files', '--cached', '--others', '--exclude-standard', '-z'], { cwd, encoding: 'utf8', maxBuffer: 256 * 1024 * 1024 });
|
|
78
|
+
if (listed.status !== 0 || listed.error) importerIndexFailed = true;
|
|
79
|
+
else {
|
|
80
|
+
const paths = listed.stdout.split('\0').filter(Boolean);
|
|
81
|
+
const testPaths = paths.filter(isTestPath);
|
|
82
|
+
const sourcePaths = [...new Set([
|
|
83
|
+
...paths.filter((path) => /\.(?:[cm]?[jt]sx?)$/.test(path) && !isTestPath(path)),
|
|
84
|
+
...changedSources,
|
|
85
|
+
])];
|
|
86
|
+
const index = (opts.buildImporterTestIndex ?? buildImporterTestIndex)(cwd, testPaths, sourcePaths);
|
|
87
|
+
if (!index) importerIndexFailed = true;
|
|
88
|
+
else for (const source of changedSources) {
|
|
89
|
+
for (const test of index.testsBySource.get(source) ?? []) if (!changed.has(test)) importers.add(test);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
} catch {
|
|
93
|
+
importerIndexFailed = true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Existing folder neighbors remain the final, lowest-priority selection tier.
|
|
65
98
|
if (opts.neighbors !== false) for (const file of tests) {
|
|
66
99
|
for (const sibling of readdirSync(join(cwd, dirname(file)))) {
|
|
67
100
|
const path = join(dirname(file), sibling);
|
|
68
101
|
if (/\.test\.tsx?$/.test(sibling) && !changed.has(path)) neighbors.add(path);
|
|
69
102
|
}
|
|
70
103
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
104
|
+
for (const importer of importers) neighbors.delete(importer);
|
|
105
|
+
|
|
106
|
+
const sortedImporters = [...importers].sort();
|
|
74
107
|
const sortedNeighbors = [...neighbors].sort();
|
|
75
108
|
const room = Math.max(0, MAX_INSPECTED_TEST_FILES - tests.length);
|
|
76
|
-
const
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
const
|
|
109
|
+
const keptImporters = sortedImporters.slice(0, room);
|
|
110
|
+
const importerTrimmed = sortedImporters.length - keptImporters.length;
|
|
111
|
+
const neighborRoom = Math.max(0, room - keptImporters.length);
|
|
112
|
+
const keptNeighbors = sortedNeighbors.slice(0, neighborRoom);
|
|
113
|
+
const neighborsTrimmed = sortedNeighbors.length - keptNeighbors.length;
|
|
114
|
+
const trimmedCount = importerTrimmed + neighborsTrimmed;
|
|
115
|
+
const trimmed = {
|
|
116
|
+
...(neighborsTrimmed > 0 ? { neighborsTrimmed } : {}),
|
|
117
|
+
...(importerTrimmed > 0 ? { importerTrimmed } : {}),
|
|
118
|
+
};
|
|
119
|
+
const trimSummary = [
|
|
120
|
+
...(neighborsTrimmed > 0 ? [`neighbours trimmed ${neighborsTrimmed}`] : []),
|
|
121
|
+
...(importerTrimmed > 0 ? [`importer tests trimmed ${importerTrimmed}`] : []),
|
|
122
|
+
].join(', ');
|
|
123
|
+
const trimNote = trimmedCount > 0 ? ` · ${trimSummary} to fit inspection cap ${MAX_INSPECTED_TEST_FILES}` : '';
|
|
124
|
+
const selected = [...tests, ...keptImporters, ...keptNeighbors].sort();
|
|
125
|
+
debug.log('harness.host-regate', 'test-select', {
|
|
126
|
+
changed: tests.length,
|
|
127
|
+
importers: keptImporters.length,
|
|
128
|
+
neighbors: keptNeighbors.length,
|
|
129
|
+
trimmed: trimmedCount,
|
|
130
|
+
...(importerIndexFailed ? { observation: 'importer 못 셌다' } : {}),
|
|
131
|
+
...(importerTrimmed > 0 ? { importerTrimmed } : {}),
|
|
132
|
+
});
|
|
81
133
|
if (!selected.length) return { passed: true };
|
|
82
134
|
// 간섭 관문은 시험 파일이 둘 이상일 때만 잰다 — 하나면 간섭이라는 말이 없으니 그 파일을 한 번 돌려 실패 수로 본다.
|
|
83
135
|
if (selected.length === 1) {
|
|
84
|
-
const run = await runBunTest(
|
|
136
|
+
const run = await (opts.run ?? ((paths, dir) => runBunTest(paths, undefined, dir)))(selected, cwd);
|
|
85
137
|
const fail = run.signal || run.exitCode === null ? null : parseFailureCount(`${run.stdout}${run.stderr}`);
|
|
86
|
-
if (fail === null) return { passed: false, unmeasured: true, detail: `single test run unmeasured: ${selected[0]}` };
|
|
87
|
-
return fail === 0 ? { passed: true } : { passed: false, detail: `${selected[0]} — ${fail} fail` };
|
|
138
|
+
if (fail === null) return { passed: false, unmeasured: true, ...trimmed, detail: `single test run unmeasured: ${selected[0]}` };
|
|
139
|
+
return fail === 0 ? { passed: true, ...trimmed } : { passed: false, ...trimmed, detail: `${selected[0]} — ${fail} fail` };
|
|
88
140
|
}
|
|
89
141
|
// The informational pr-land gate always returns zero; its measured report is the verdict.
|
|
90
142
|
let report: Awaited<ReturnType<typeof detectTestInterference>> | undefined;
|
|
91
143
|
await runTestInterferenceGate({
|
|
92
144
|
args: ['--changed-files', ...selected], log: () => {},
|
|
93
|
-
detect: async (paths) => (report = await (opts.detect ?? detectTestInterference)(paths, (batch) => runBunTest(
|
|
145
|
+
detect: async (paths) => (report = await (opts.detect ?? detectTestInterference)(paths, (batch) => (opts.run ?? ((selectedPaths, dir) => runBunTest(selectedPaths, undefined, dir)))(batch, cwd))),
|
|
94
146
|
});
|
|
95
147
|
if (!report || report.status === 'unmeasurable' || selected.length > report.order.length) return { passed: false, unmeasured: true, ...trimmed, detail: `test interference measurement unavailable or truncated (selected ${selected.length}, changed tests ${tests.length}, cap ${MAX_INSPECTED_TEST_FILES})${trimNote}` };
|
|
96
148
|
if (report.isolatedFailures !== 0 || report.combinedFailures !== 0 || report.status === 'interference') {
|
|
@@ -186,14 +238,16 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
186
238
|
let landed = false;
|
|
187
239
|
let verifiedBase: string | undefined;
|
|
188
240
|
let interferenceNote: Record<string, unknown> = {};
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
241
|
+
// HOST-REGATE-REASON-LOST: `facts` carries the expected/actual head, conflict files and merge failure kind of the
|
|
242
|
+
// pr-head · merge-conflict · merge steps; the detail keeps a bounded head ⊕ tail instead of the first 300 characters.
|
|
243
|
+
const result = (event: 'passed' | 'failed' | 'unmeasured', step?: string, detail?: string, facts: Omit<HostRegateFailure, 'step' | 'detail'> = {}): HostRegateResult => {
|
|
244
|
+
if (step) failures.push({ step, detail: clipRegateDetail(detail ?? 'unknown'), ...facts });
|
|
245
|
+
log(event, { pr: input.prNumber, files, os: process.platform, ...interferenceNote, ...(step ? { failedStep: step, detail: clipRegateDetail(detail ?? 'unknown'), ...facts } : {}) });
|
|
192
246
|
return { passed: event === 'passed', failures, os: process.platform, ...(input.verifyOnly ? { status: event, ...(verifiedBase ? { baseCommit: verifiedBase } : {}) } : {}) };
|
|
193
247
|
};
|
|
194
248
|
const run = (bin: string, args: readonly string[], cwd: string, env?: NodeJS.ProcessEnv): string => {
|
|
195
249
|
const r = command(bin, args, cwd, env);
|
|
196
|
-
if (r.status !== 0) throw new Error((r.stderr || r.stdout || `${bin} exited ${r.status}`).trim()
|
|
250
|
+
if (r.status !== 0) throw new Error(clipRegateDetail((r.stderr || r.stdout || `${bin} exited ${r.status}`).trim()));
|
|
197
251
|
return r.stdout.trim();
|
|
198
252
|
};
|
|
199
253
|
try {
|
|
@@ -201,10 +255,13 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
201
255
|
release = await (deps.acquire ?? acquireSlot)(input.repoRoot);
|
|
202
256
|
type PrView = { headRefOid?: string; baseRefName?: string; baseRefOid?: string; state?: string; isDraft?: boolean };
|
|
203
257
|
const readPr = (): PrView => JSON.parse(run('gh', ['pr', 'view', String(input.prNumber), '--json', 'headRefOid,baseRefName,baseRefOid,state,isDraft'], input.repoRoot));
|
|
258
|
+
const prHeadFailure = (seen: PrView): HostRegateResult => result('unmeasured', 'pr-head',
|
|
259
|
+
`PR head, base commit, ready state or open state unavailable or changed (state=${seen.state ?? 'unknown'} · isDraft=${String(seen.isDraft)} · base=${seen.baseRefName ?? 'unknown'}@${seen.baseRefOid ?? 'unknown'})`,
|
|
260
|
+
{ expectedHead: input.headCommit, actualHead: typeof seen.headRefOid === 'string' ? seen.headRefOid : null });
|
|
204
261
|
let view: PrView;
|
|
205
262
|
try { view = readPr(); }
|
|
206
263
|
catch (e) { return result('unmeasured', 'pr-view', String(e)); }
|
|
207
|
-
if (view.headRefOid !== input.headCommit || view.state !== 'OPEN' || view.isDraft !== false || !view.baseRefName || !/^[0-9a-f]{40}$/i.test(view.baseRefOid ?? '')) return
|
|
264
|
+
if (view.headRefOid !== input.headCommit || view.state !== 'OPEN' || view.isDraft !== false || !view.baseRefName || !/^[0-9a-f]{40}$/i.test(view.baseRefOid ?? '')) return prHeadFailure(view);
|
|
208
265
|
const baseRefName = view.baseRefName;
|
|
209
266
|
// verifyOnly(승인 탭): PR 에 기록된 base(baseRefOid)는 main 의 «지금 끝»보다 늙을 수 있다 — 지금 끝에 얹어 잰다.
|
|
210
267
|
let baseCommit = view.baseRefOid!;
|
|
@@ -230,7 +287,7 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
230
287
|
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
231
288
|
view = readPr();
|
|
232
289
|
if (view.headRefOid !== input.headCommit || view.state !== 'OPEN' || view.isDraft !== false || view.baseRefName !== baseRefName || !/^[0-9a-f]{40}$/i.test(view.baseRefOid ?? '')) {
|
|
233
|
-
return
|
|
290
|
+
return prHeadFailure(view);
|
|
234
291
|
}
|
|
235
292
|
baseCommit = view.baseRefOid!;
|
|
236
293
|
run('git', ['fetch', 'origin', `refs/heads/${baseRefName}`], input.repoRoot);
|
|
@@ -285,8 +342,29 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
285
342
|
}
|
|
286
343
|
// Materialize the proposed merge of this exact PR head into the observed base.
|
|
287
344
|
// A clean head checkout cannot expose integration breaks introduced by the base.
|
|
288
|
-
|
|
289
|
-
|
|
345
|
+
// Parse the raw merge output before bounding the failure detail; a middle CONFLICT line can vanish from a 4KB head+tail clip.
|
|
346
|
+
let mergeOutput: string | undefined;
|
|
347
|
+
try {
|
|
348
|
+
const merge = command('git', ['merge', '--no-ff', '--no-commit', input.headCommit], worktree);
|
|
349
|
+
if (merge.status !== 0) {
|
|
350
|
+
mergeOutput = ([merge.stdout, merge.stderr].filter(Boolean).join('\n') || `git merge exited ${merge.status}`).trim();
|
|
351
|
+
throw new Error(mergeOutput);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch (e) {
|
|
355
|
+
// Read the unmerged paths before the finally block resets the slot; fall back to the CONFLICT lines.
|
|
356
|
+
let unmerged: string[] = [];
|
|
357
|
+
// -z keeps exact paths; bypass run() because its stdout.trim() would alter a leading/trailing space in a filename.
|
|
358
|
+
try {
|
|
359
|
+
const diff = command('git', ['diff', '--name-only', '-z', '--diff-filter=U'], worktree);
|
|
360
|
+
if (diff.status === 0) unmerged = diff.stdout.split('\0').filter(Boolean);
|
|
361
|
+
} catch { /* fall back below */ }
|
|
362
|
+
const detail = mergeOutput ?? String(e);
|
|
363
|
+
const conflictFiles = unmerged.length ? [...new Set(unmerged)].sort() : parseConflictFiles(detail);
|
|
364
|
+
// No unmerged path and no CONFLICT line (e.g. unrelated histories) is not called a conflict.
|
|
365
|
+
const kind = conflictFiles.length ? 'conflict' as const : classifyMergeFailure(detail);
|
|
366
|
+
return result('failed', 'merge-conflict', detail, { expectedHead: input.headCommit, conflictFiles, mergeFailureKind: kind });
|
|
367
|
+
}
|
|
290
368
|
run('git', ['-c', 'user.name=elanous host regate', '-c', 'user.email=regate@localhost', 'commit', '-m', 'host regate integration candidate'], worktree);
|
|
291
369
|
if (run('git', ['rev-parse', 'HEAD^1'], worktree) !== baseCommit || run('git', ['rev-parse', 'HEAD^2'], worktree) !== input.headCommit) throw new Error('integration parents do not match PR base and checked head');
|
|
292
370
|
if (!deps.command && !existsSync(join(worktree, 'scripts/ci-typecheck-changed.ts'))) throw new Error('typecheck gate unavailable in checked worktree');
|
|
@@ -300,8 +378,13 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
300
378
|
if (buildPwa && existsSync(join(worktree, 'apps/pwa'))) provide('apps/pwa', 'next');
|
|
301
379
|
} catch (e) { return result('unmeasured', 'worktree', String(e)); }
|
|
302
380
|
try {
|
|
303
|
-
const
|
|
304
|
-
|
|
381
|
+
const interferenceOptions = { neighbors: !input.verifyOnly };
|
|
382
|
+
const interference = await (deps.interference ?? ((f: readonly string[], c: string) => defaultInterference(f, c, interferenceOptions)))(files, worktree);
|
|
383
|
+
if (interference.neighborsTrimmed || interference.importerTrimmed) interferenceNote = {
|
|
384
|
+
...(interference.neighborsTrimmed ? { neighborsTrimmed: interference.neighborsTrimmed } : {}),
|
|
385
|
+
...(interference.importerTrimmed ? { importerTrimmed: interference.importerTrimmed } : {}),
|
|
386
|
+
interferenceDetail: (interference.detail ?? '').slice(0, 300),
|
|
387
|
+
};
|
|
305
388
|
if (!interference.passed) return result(interference.unmeasured ? 'unmeasured' : 'failed', 'test-interference', interference.detail);
|
|
306
389
|
} catch (e) { return result('unmeasured', 'test-interference', String(e)); }
|
|
307
390
|
// Landing can also be initiated by the host after the child gate; judge the checked PR here too.
|
|
@@ -344,7 +427,13 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
344
427
|
// The marker and claim are held through the merge «and» its confirmation; released in the outer finally.
|
|
345
428
|
endLanding = landing.end;
|
|
346
429
|
try { run('gh', ['pr', 'merge', String(input.prNumber), '--squash', '--match-head-commit', input.headCommit], input.repoRoot); }
|
|
347
|
-
catch (e) {
|
|
430
|
+
catch (e) {
|
|
431
|
+
// Tell a base race from a moved head from a conflict: re-read the PR head once (null = could not read).
|
|
432
|
+
let actualHead: string | null = null;
|
|
433
|
+
try { const after = readPr(); actualHead = typeof after.headRefOid === 'string' ? after.headRefOid : null; } catch { /* stays null */ }
|
|
434
|
+
const detail = String(e);
|
|
435
|
+
return result('failed', 'merge', detail, { expectedHead: input.headCommit, actualHead, mergeFailureKind: classifyMergeFailure(detail, input.headCommit, actualHead) });
|
|
436
|
+
}
|
|
348
437
|
type MergedView = { state?: string; mergeCommit?: { oid?: string } | null };
|
|
349
438
|
let merged: MergedView;
|
|
350
439
|
try { merged = JSON.parse(run('gh', ['pr', 'view', String(input.prNumber), '--json', 'state,mergeCommit'], input.repoRoot)); }
|
|
@@ -393,8 +482,13 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
393
482
|
try { release?.(); }
|
|
394
483
|
catch (e) { log('unmeasured', { pr: input.prNumber, files, os: process.platform, failedStep: 'lock', detail: String(e) }); }
|
|
395
484
|
if (failures.length && failures[0]?.step !== 'release-path-hold') {
|
|
396
|
-
const { step, detail } = failures[0]!;
|
|
397
|
-
const
|
|
485
|
+
const { step, detail, mergeFailureKind, conflictFiles, expectedHead, actualHead } = failures[0]!;
|
|
486
|
+
const facts = [mergeFailureKind ? `kind=${mergeFailureKind}` : '',
|
|
487
|
+
expectedHead ? `expectedHead=${expectedHead}` : '',
|
|
488
|
+
actualHead !== undefined ? `actualHead=${actualHead ?? 'unreadable'}` : '',
|
|
489
|
+
conflictFiles?.length ? `conflicts=${conflictFiles.slice(0, 5).join(',')}${conflictFiles.length > 5 ? ` +${conflictFiles.length - 5} more (total ${conflictFiles.length})` : ''}` : '',
|
|
490
|
+
].filter(Boolean).join(' · ');
|
|
491
|
+
const body = `호스트 재게이트 실패(${process.platform}): ${step}${facts ? ` [${facts}]` : ''} — ${clipRegateDetail(detail.replace(/\s+/g, ' '))}`;
|
|
398
492
|
try { run('gh', ['pr', 'comment', String(input.prNumber), '--body', body], input.repoRoot); }
|
|
399
493
|
catch (e) { log('unmeasured', { pr: input.prNumber, files, os: process.platform, failedStep: 'comment', detail: String(e) }); }
|
|
400
494
|
}
|
|
@@ -68,7 +68,9 @@ function stripModuleQuery(specifier: string): string {
|
|
|
68
68
|
return cut === -1 ? specifier : specifier.slice(0, cut);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
/** Candidate repo paths of a relative specifier from `testPath` (any importer works — GATE-REUSE-BY-DIFF reuses it for
|
|
72
|
+
* the release gate's import closure). */
|
|
73
|
+
export function sourceCandidates(testPath: string, specifier: string): readonly string[] {
|
|
72
74
|
const base = normalize(join(dirname(testPath), stripModuleQuery(specifier)));
|
|
73
75
|
const suffix = extname(base);
|
|
74
76
|
if (suffix) return (EMITTED_SOURCE_SUFFIXES[suffix] ?? [suffix]).map((extension) => `${base.slice(0, -suffix.length)}${extension}`);
|
|
@@ -5,6 +5,9 @@ import { join } from 'node:path';
|
|
|
5
5
|
import { NEXT_MD_PATH, resolveNextMdConflict } from '../release-loop/next-md-merge.js';
|
|
6
6
|
import { defaultLlmResolve, mergeMainWithLlmResolve, type MergeGitSeam } from '../autopilot/build/llm-conflict-merge.js';
|
|
7
7
|
import { getDefaultLogStore } from '../mss/logging/log-store.js';
|
|
8
|
+
import { debug } from '../debug/log.js';
|
|
9
|
+
import { integrateTrain, planTrain, runTrain, type TrainCandidate, type TrainDeferred, type TrainGit } from './merge-train.js';
|
|
10
|
+
import { trainGateOnHost, type TrainGate } from './train-gate-remote.js';
|
|
8
11
|
|
|
9
12
|
type Command = (bin: string, args: readonly string[], cwd: string) => { status: number | null; stdout: string; stderr: string };
|
|
10
13
|
export type L8MergeQueueInput = { number: number; cwd: string; matchHeadCommit: string };
|
|
@@ -29,7 +32,16 @@ export type L8MergeQueueDeps = {
|
|
|
29
32
|
acquire?: (cwd: string) => Promise<() => void>;
|
|
30
33
|
};
|
|
31
34
|
|
|
32
|
-
export type L8ShadowVerdict = {
|
|
35
|
+
export type L8ShadowVerdict = {
|
|
36
|
+
number: number;
|
|
37
|
+
head: string;
|
|
38
|
+
base?: string;
|
|
39
|
+
/** 'unmeasured' is written only by the shadow merge train (LAND-QUEUE): a gate that never ran is never a fail. */
|
|
40
|
+
verdict: 'pass' | 'conflict' | 'fail' | 'unmeasured';
|
|
41
|
+
detail?: string;
|
|
42
|
+
tests: string[];
|
|
43
|
+
at: string;
|
|
44
|
+
};
|
|
33
45
|
export type L8ShadowQueueItem = {
|
|
34
46
|
number: number;
|
|
35
47
|
head: string;
|
|
@@ -52,6 +64,12 @@ export type L8ShadowQueueDeps = L8MergeQueueDeps & {
|
|
|
52
64
|
observe?: (verdict: L8ShadowVerdict) => void | Promise<void>;
|
|
53
65
|
observeEnqueue?: (entry: L8ShadowEnqueueObservation) => void | Promise<void>;
|
|
54
66
|
resolveConflict?: (file: string, conflicted: string, target: string, worktree: string) => Promise<string>;
|
|
67
|
+
/** Shadow merge train gate seam (default: trainGateOnHost over the real gate-remote runner, host node-b). */
|
|
68
|
+
trainGate?: (repo: string, baseSha: string) => TrainGate;
|
|
69
|
+
/** Shadow merge train integration git seam (default: the queue's own command executor). */
|
|
70
|
+
trainGit?: TrainGit;
|
|
71
|
+
/** Maximum PRs per shadow train batch (default 2). */
|
|
72
|
+
trainMaxBatch?: number;
|
|
55
73
|
};
|
|
56
74
|
|
|
57
75
|
function shadowCommand(execute: Command, bin: string, args: string[], cwd: string): string {
|
|
@@ -162,13 +180,73 @@ export async function enqueueL8ShadowQueue(cwd: string, number: number, deps: L8
|
|
|
162
180
|
});
|
|
163
181
|
}
|
|
164
182
|
|
|
165
|
-
/**
|
|
183
|
+
/** LAND-QUEUE — shadow merge train: planTrain → integrateTrain → runTrain(trainGateOnHost) when the queue holds
|
|
184
|
+
* two or more measured, non-overlapping PRs. Per-PR verdicts (pass · culprit · unmeasured) land in the queue
|
|
185
|
+
* ledger and in debug.log ('self-implement.merge-train' · 'shadow-verdict'). Shadow only: no push, no merge API;
|
|
186
|
+
* the single-PR evaluation path in runL8ShadowQueue stays untouched for every queue this train cannot take. */
|
|
187
|
+
async function runShadowMergeTrain(
|
|
188
|
+
state: L8ShadowQueueState,
|
|
189
|
+
path: string,
|
|
190
|
+
cwd: string,
|
|
191
|
+
run: (bin: string, args: string[], where?: string) => string,
|
|
192
|
+
execute: Command,
|
|
193
|
+
plan: { batch: TrainCandidate[]; deferred: TrainDeferred[] },
|
|
194
|
+
deps: L8ShadowQueueDeps,
|
|
195
|
+
): Promise<L8ShadowVerdict | null> {
|
|
196
|
+
for (const item of plan.batch) {
|
|
197
|
+
const view = JSON.parse(run('gh', ['pr', 'view', String(item.number), '--json', 'headRefOid,baseRefName,state,isDraft,isCrossRepository'], cwd)) as {
|
|
198
|
+
headRefOid?: string; baseRefName?: string; state?: string; isDraft?: boolean; isCrossRepository?: boolean;
|
|
199
|
+
};
|
|
200
|
+
if (view.headRefOid !== item.head || view.baseRefName !== 'main' || view.state !== 'OPEN'
|
|
201
|
+
|| view.isDraft !== false || view.isCrossRepository !== false) throw new Error(`queued PR #${item.number} changed or is not ready`);
|
|
202
|
+
}
|
|
203
|
+
run('git', ['fetch', 'origin', 'refs/heads/main'], cwd);
|
|
204
|
+
const base = run('git', ['rev-parse', 'FETCH_HEAD'], cwd);
|
|
205
|
+
if (!/^[0-9a-f]{40}$/i.test(base)) throw new Error('main commit unavailable');
|
|
206
|
+
for (const item of plan.batch) {
|
|
207
|
+
run('git', ['fetch', 'origin', `refs/pull/${item.number}/head`], cwd);
|
|
208
|
+
if (run('git', ['rev-parse', 'FETCH_HEAD'], cwd) !== item.head) throw new Error(`fetched PR head changed: #${item.number}`);
|
|
209
|
+
}
|
|
210
|
+
const trainGit: TrainGit = deps.trainGit ?? ((args, repo) => execute('git', args, repo));
|
|
211
|
+
const gate = (deps.trainGate ?? ((repo: string, baseSha: string) => trainGateOnHost({ repo, baseSha })))(cwd, base);
|
|
212
|
+
const result = await runTrain(plan.batch, {
|
|
213
|
+
integrate: (batch) => integrateTrain(cwd, base, batch, trainGit),
|
|
214
|
+
gate,
|
|
215
|
+
deferred: plan.deferred,
|
|
216
|
+
// The train's observation channel is debug.log (LAND-QUEUE); the ledger below carries the authoritative state.
|
|
217
|
+
observe: (data) => { debug.log('self-implement.merge-train', 'shadow-verdict', data); },
|
|
218
|
+
});
|
|
219
|
+
const at = new Date().toISOString();
|
|
220
|
+
const batchNumbers = plan.batch.map((item) => item.number);
|
|
221
|
+
const verdicts: L8ShadowVerdict[] = result.verdicts.map((entry) => ({
|
|
222
|
+
number: entry.number,
|
|
223
|
+
head: plan.batch.find((item) => item.number === entry.number)!.head,
|
|
224
|
+
base,
|
|
225
|
+
verdict: entry.verdict,
|
|
226
|
+
detail: `merge train shadow · batch [${batchNumbers.join(',')}] · gatesRun ${result.gatesRun}`,
|
|
227
|
+
tests: [],
|
|
228
|
+
at,
|
|
229
|
+
}));
|
|
230
|
+
state.pending = state.pending.filter((item) => !batchNumbers.includes(item.number));
|
|
231
|
+
state.verdicts.push(...verdicts);
|
|
232
|
+
writeShadowQueue(path, state);
|
|
233
|
+
return verdicts[0] ?? null;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** Evaluate one pinned queue head against freshly fetched main — or, when the queue holds two or more measured,
|
|
237
|
+
* non-overlapping PRs, one shadow merge train. Never push or call a merge API. */
|
|
166
238
|
export async function runL8ShadowQueue(cwd: string, deps: L8ShadowQueueDeps = {}): Promise<L8ShadowVerdict | null> {
|
|
167
239
|
return withShadowQueue(cwd, deps, async (state, path) => {
|
|
168
240
|
const item = state.pending[0];
|
|
169
241
|
if (!item) return null;
|
|
170
242
|
const execute = deps.command ?? command;
|
|
171
243
|
const run = (bin: string, args: string[], where = cwd) => shadowCommand(execute, bin, args, where);
|
|
244
|
+
// LAND-QUEUE — two or more measured, non-overlapping queued PRs evaluate as one shadow merge train first.
|
|
245
|
+
const trainPlan = planTrain(
|
|
246
|
+
state.pending.map((pending) => ({ number: pending.number, head: pending.head, files: pending.files, filesUnmeasured: pending.filesUnmeasured })),
|
|
247
|
+
{ maxBatch: deps.trainMaxBatch ?? 2 },
|
|
248
|
+
);
|
|
249
|
+
if (trainPlan.batch.length >= 2) return runShadowMergeTrain(state, path, cwd, run, execute, trainPlan, deps);
|
|
172
250
|
const verdict: L8ShadowVerdict = { number: item.number, head: item.head, verdict: 'fail', tests: [], at: new Date().toISOString() };
|
|
173
251
|
const view = JSON.parse(run('gh', ['pr', 'view', String(item.number), '--json', 'headRefOid,baseRefName,state,isDraft,isCrossRepository'])) as {
|
|
174
252
|
headRefOid?: string; baseRefName?: string; state?: string; isDraft?: boolean; isCrossRepository?: boolean;
|
|
@@ -16,6 +16,25 @@ export type TrainObservation = {
|
|
|
16
16
|
gatesPerLanding: number;
|
|
17
17
|
};
|
|
18
18
|
export type TrainGit = (args: readonly string[], repo: string) => { status: number | null; stdout: string; stderr: string };
|
|
19
|
+
export type TangledPair = { first: number; then: number; failures: number };
|
|
20
|
+
|
|
21
|
+
export function tangledPairs(
|
|
22
|
+
failures: readonly { pr: number; with: number }[],
|
|
23
|
+
{ threshold = 2 }: { threshold?: number } = {},
|
|
24
|
+
): TangledPair[] {
|
|
25
|
+
const counts = new Map<string, TangledPair>();
|
|
26
|
+
for (const failure of failures) {
|
|
27
|
+
const first = Math.min(failure.pr, failure.with);
|
|
28
|
+
const then = Math.max(failure.pr, failure.with);
|
|
29
|
+
const key = `${first}:${then}`;
|
|
30
|
+
const pair = counts.get(key);
|
|
31
|
+
if (pair) pair.failures++;
|
|
32
|
+
else counts.set(key, { first, then, failures: 1 });
|
|
33
|
+
}
|
|
34
|
+
return [...counts.values()]
|
|
35
|
+
.filter((pair) => pair.failures >= threshold)
|
|
36
|
+
.sort((left, right) => left.first - right.first || left.then - right.then);
|
|
37
|
+
}
|
|
19
38
|
|
|
20
39
|
export function planTrain(candidates: readonly TrainCandidate[], { maxBatch }: { maxBatch: number }): { batch: TrainCandidate[]; deferred: TrainDeferred[] } {
|
|
21
40
|
if (!Number.isSafeInteger(maxBatch) || maxBatch < 1) throw new Error('maxBatch must be a positive integer');
|
|
@@ -323,6 +323,8 @@ interface RequiredEvidenceCheckRun {
|
|
|
323
323
|
readonly command: string;
|
|
324
324
|
readonly exitCode: number | null;
|
|
325
325
|
readonly stdout: string;
|
|
326
|
+
/** EVIDENCE-WIRING-EXEMPT — `bun test` writes its «N pass / 0 fail» summary to stderr. */
|
|
327
|
+
readonly stderr: string;
|
|
326
328
|
readonly durationMs: number;
|
|
327
329
|
}
|
|
328
330
|
|
|
@@ -368,7 +370,10 @@ export function requiredEvidenceFromGoal(goal: string): RequiredEvidenceItem[] {
|
|
|
368
370
|
// 들여쓰기는 한다(바이트 동일이 계약이면 렌더링을 못 한다 · 리뷰 2R 에 대한 내 정정).
|
|
369
371
|
items.push({ tag, raw: raw.trim(), ...(verifyCommand ? { verifyCommand } : {}) });
|
|
370
372
|
}
|
|
373
|
+
const noWiring = goalDeclaresNoWiring(goal);
|
|
371
374
|
return items.map((item) => {
|
|
375
|
+
// EVIDENCE-WIRING-EXEMPT — a goal whose boundary says «no wiring / pure function only» cannot show a caller in its diff.
|
|
376
|
+
if (item.tag === 'wiring' && noWiring) return { ...item, coveredByLimitation: NO_WIRING_LIMITATION };
|
|
372
377
|
const description = item.raw.replace(/^\s*[-*]\s*\[[^\]]+\]\s*/, '').split(REQUIRED_EVIDENCE_COMMAND_SEPARATOR, 1)[0]?.trim() ?? '';
|
|
373
378
|
const normalizedDescription = normalizeLimitationText(description);
|
|
374
379
|
const matchingRequirements = items.filter((candidate) => normalizeLimitationText(
|
|
@@ -380,7 +385,40 @@ export function requiredEvidenceFromGoal(goal: string): RequiredEvidenceItem[] {
|
|
|
380
385
|
});
|
|
381
386
|
}
|
|
382
387
|
|
|
383
|
-
/**
|
|
388
|
+
/** EVIDENCE-WIRING-EXEMPT — the goal itself rules wiring out: «배선 0», «배선·부작용 0», «순수 함수만», «no wiring», «pure function only». */
|
|
389
|
+
const NO_WIRING_MARKER = /배선\s*(?:[·⋅,/]\s*부작용\s*)?0(?![\d.])|배선\s*없음|순수\s*함수만|\bno wiring\b|\bpure functions? only\b/iu;
|
|
390
|
+
const NO_WIRING_LIMITATION = 'goal boundary declares no wiring (pure function only)';
|
|
391
|
+
export function goalDeclaresNoWiring(goal: string): boolean {
|
|
392
|
+
return NO_WIRING_MARKER.test(goal);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/** A `bun test` check that ran its tests and failed none: rc 0 ⊕ «N pass» (N ≥ 1) ⊕ «0 fail» in its output. */
|
|
396
|
+
function bunTestCheckPassed(run: RequiredEvidenceCheckRun): boolean {
|
|
397
|
+
if (run.exitCode !== 0 || !/(?:^|[\s;&|(])bun\s+(?:run\s+)?test\b/.test(run.command)) return false;
|
|
398
|
+
const output = `${run.stdout}\n${run.stderr}`;
|
|
399
|
+
return /(?:^|\n)\s*[1-9]\d*\s+pass\b/.test(output) && /(?:^|\n)\s*0\s+fail\b/.test(output);
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/** EVIDENCE-WIRING-EXEMPT — settle what the child's tags left uncovered with what the harness measured itself:
|
|
403
|
+
* a requirement whose own `|| bun test …` check passed (tests ran, 0 fail) is covered by that check; a commandless
|
|
404
|
+
* [preservation] is covered when the changed-file gate was measured and passed (the existing tests still hold).
|
|
405
|
+
* Anything else stays uncovered — no wording is interpreted. */
|
|
406
|
+
export function settleUncoveredEvidence(
|
|
407
|
+
uncovered: readonly string[],
|
|
408
|
+
measured: { checks?: readonly RequiredEvidenceCheckRun[]; required?: readonly RequiredEvidenceItem[]; gatePassed?: boolean },
|
|
409
|
+
): { uncovered: string[]; coveredByCheck: string[]; coveredByGate: string[] } {
|
|
410
|
+
const passedTags = new Set((measured.checks ?? []).filter(bunTestCheckPassed).map(({ tag }) => tag));
|
|
411
|
+
const withCommand = new Set((measured.required ?? []).filter(({ verifyCommand }) => verifyCommand).map(({ tag }) => tag));
|
|
412
|
+
const coveredByCheck = uncovered.filter((tag) => passedTags.has(tag));
|
|
413
|
+
const coveredByGate = measured.gatePassed === true
|
|
414
|
+
? uncovered.filter((tag) => tag === 'preservation' && !passedTags.has(tag) && !withCommand.has(tag))
|
|
415
|
+
: [];
|
|
416
|
+
const settled = new Set([...coveredByCheck, ...coveredByGate]);
|
|
417
|
+
return { uncovered: uncovered.filter((tag) => !settled.has(tag)), coveredByCheck, coveredByGate };
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/** 골 작성자가 요구 줄에 명시한 셸 체크를 하니스 worktree에서 관측한다. `bun test` 체크의 통과는
|
|
421
|
+
* settleUncoveredEvidence 가 그 요구의 덮임으로 받는다(EVIDENCE-WIRING-EXEMPT). */
|
|
384
422
|
export function runRequiredEvidenceChecks(goal: string, cwd: string, runId?: string): RequiredEvidenceCheckRun[] {
|
|
385
423
|
const identity = resolveRunIdentity({ explicit: runId });
|
|
386
424
|
const checks = requiredEvidenceFromGoal(goal).flatMap(({ tag, verifyCommand }) => verifyCommand ? [{ tag, command: verifyCommand }] : []);
|
|
@@ -392,6 +430,7 @@ export function runRequiredEvidenceChecks(goal: string, cwd: string, runId?: str
|
|
|
392
430
|
command,
|
|
393
431
|
exitCode: result.status,
|
|
394
432
|
stdout: tailWithOmissionMarker(result.stdout ?? '', MAX_OFF_DIFF_EVIDENCE_RESULT_CHARS),
|
|
433
|
+
stderr: tailWithOmissionMarker(result.stderr ?? '', MAX_OFF_DIFF_EVIDENCE_RESULT_CHARS),
|
|
395
434
|
durationMs: Date.now() - startedAt,
|
|
396
435
|
};
|
|
397
436
|
});
|