elanous 0.2.24 → 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-24282bf9f90031a5.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-dea4b795741126fd.js +1 -0
- 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-1d809a87139dd024.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-b92caddb5c715f30.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/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_buildManifest.js +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- 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/bench-report.ts +46 -1
- package/scripts/ci-typecheck-changed.ts +7 -5
- package/scripts/release-loop/auto-approve-node.ts +6 -0
- package/scripts/release-loop/gate-closure.ts +286 -0
- package/scripts/release-loop/gate-node.ts +73 -13
- 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 +37 -10
- package/scripts/release-loop/resume.ts +69 -4
- package/scripts/tsc-baseline-cache.ts +28 -3
- package/scripts/usage-rollup.ts +27 -13
- 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-substrate/acp-implementer.ts +14 -7
- package/src/agent-substrate/pr-reviewer.ts +30 -10
- package/src/agent-substrate/self-review-cli.ts +126 -10
- package/src/budget/cost-tier-advisor.ts +91 -0
- package/src/budget/shadow-arms.ts +77 -0
- package/src/budget/types.ts +5 -3
- package/src/budget/unified-usage.ts +172 -8
- package/src/cli/doctor-cli.ts +21 -0
- package/src/cli/friendly-errors.ts +113 -0
- package/src/cli/intake-cli.ts +3 -1
- package/src/cli/memory-cli.ts +182 -0
- package/src/cli/model-watch-cli.ts +4 -1
- package/src/cli/pr-land-pod-shadow.ts +54 -0
- package/src/cli/release-cli.ts +9 -7
- 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/seat-requests-cli.ts +25 -0
- package/src/cli/tasks-cli.ts +31 -7
- package/src/cli/usage-cli.ts +3 -1
- 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/dashboard/slash-runtime/dashboard-handlers.ts +4 -138
- package/src/dashboard/slash-runtime/shell-slash.ts +145 -0
- package/src/debug/log-diet.ts +16 -4
- package/src/domains/morning-essential.ts +18 -3
- package/src/domains/release-tool.ts +4 -0
- package/src/execution-loop/launch-gate.ts +158 -2
- package/src/fleet/host-doctor.ts +375 -0
- package/src/goals/judge.ts +20 -6
- package/src/graph-runner/runner.ts +9 -5
- package/src/graph-wizard/archetypes.ts +14 -8
- package/src/graph-wizard/generate.ts +77 -1
- package/src/grok.ts +13 -7
- package/src/harness/harness-cli-command.ts +56 -47
- package/src/harness/harness-stop.ts +82 -12
- package/src/index.ts +17 -175
- package/src/intake-plane/collect-github.ts +7 -2
- package/src/intake-plane/lens.ts +46 -4
- package/src/intake-plane/requirement-funnel.ts +53 -1
- package/src/intelligence-map/catalog-feed.ts +119 -0
- package/src/intelligence-map/model-watch-intake.ts +40 -0
- package/src/intelligence-map/model-watch-mission.ts +14 -1
- package/src/llm/open-weight-discipline.ts +21 -0
- package/src/llm.ts +4 -8
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/nexus/api/http-server.ts +22 -0
- package/src/oauth/codex-account-rotation.ts +4 -1
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-quota-policy.ts +33 -4
- package/src/preview/terminal.ts +15 -5
- package/src/project/project-store.ts +20 -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/rehearsal.ts +1 -1
- package/src/seat-loop/duty-ledger.ts +64 -0
- package/src/self-dev/decompose.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +32 -7
- package/src/self-dev/draft-residue.ts +16 -6
- package/src/self-dev/draft-sweep.ts +52 -4
- package/src/self-dev/fabric-decompose-adapter.ts +9 -2
- package/src/self-dev/run-supervisor.ts +37 -7
- package/src/self-implement/gate-cli.ts +29 -10
- package/src/self-implement/gate-remote.ts +4 -1
- package/src/self-implement/goal-author.ts +12 -2
- package/src/self-implement/goal-new-paths.ts +42 -0
- 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 +88 -19
- 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 +2 -2
- package/src/self-implement/scope-adjacency.ts +23 -0
- package/src/self-implement/seams.ts +42 -7
- 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/rejudge-tick.ts +142 -0
- package/src/task-agent/board.ts +92 -3
- package/src/task-agent/card-evidence.ts +88 -1
- package/src/task-agent/cover.ts +65 -0
- package/src/task-agent/parent-host.ts +27 -3
- package/src/task-agent/rejudge-on-head.ts +151 -7
- package/src/task-agent/review-result-capture.ts +3 -1
- package/src/task-agent/shadow.ts +12 -0
- package/src/task-agent/task-hand.ts +4 -1
- package/src/task-orchestrator/surfaces/pod-command-job.ts +14 -0
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +122 -0
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +23 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +53 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +235 -28
- package/src/user-config.ts +18 -4
- 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/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-0eed0fb0aab716b6.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-aaae04ed1d32622f.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-3b9fc39362473ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-c0ab229673a8b0eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.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-22725e2570f1126b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.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-901a1391b81053bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.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/{Q-7iofoxOEv1WX18S35of → dRS6lEhSRRBr1abbzp7fJ}/_ssgManifest.js +0 -0
|
@@ -26,6 +26,7 @@ import { createRepositoryReferencedFileReader, type ReferencedFileReader } from
|
|
|
26
26
|
import { parseGoalDocumentClarifications } from '../self-implement/goal-author-clarification.js';
|
|
27
27
|
import { requiredEvidenceFromGoal } from '../self-implement/off-diff-evidence.js';
|
|
28
28
|
import { debug } from '../debug/log.js';
|
|
29
|
+
import { REVIEW_DEFERRED_TO_HOST_ENV, reviewDeferredToHostFromEnv } from '../self-implement/review-deferred-to-host.js';
|
|
29
30
|
import { releasePathHold, releasePathHoldComment, RELEASE_PATH_LABEL } from './release-path-guard.js';
|
|
30
31
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
31
32
|
import type { GitRunResult } from '../git-fs/retry.js';
|
|
@@ -41,7 +42,7 @@ import type { IngestionEntry } from '../agent-substrate/execution/ingestion-poli
|
|
|
41
42
|
import type { ReviewerContextItem } from '../agent-substrate/pr-reviewer.js';
|
|
42
43
|
import { resolveRunIdentity, type RunIdSource } from '../harness/harness-space.js';
|
|
43
44
|
import { addSelfDevRunParticipant, processBirthId, saveSelfDevRun } from './run-store.js';
|
|
44
|
-
import { getUserConfig, resolveRoleLlm } from '../user-config.js';
|
|
45
|
+
import { getUserConfig, resolveRoleLlm, type RoleLlmSource } from '../user-config.js';
|
|
45
46
|
import { reviewReasoningEffort } from '../model-tier/review-effort.js';
|
|
46
47
|
import { getProvider, inferProviderFromModel } from '../llm.js';
|
|
47
48
|
import { buildReviewProviderAttempts, defaultReviewFallbackModel, runReviewWithFallback, reviewFallbackModelsFromConfig, runSubscriptionReviewer, type SubscriptionReviewerDeps } from './review-provider-fallback.js';
|
|
@@ -1051,16 +1052,29 @@ export function unmannedToolReviewerRateFromConfig(
|
|
|
1051
1052
|
return DEFAULT_UNMANNED_TOOL_REVIEWER_RATE;
|
|
1052
1053
|
}
|
|
1053
1054
|
|
|
1054
|
-
function observeUnmannedToolReviewerSelection(selection: UnmannedToolReviewerSelection): void {
|
|
1055
|
+
function observeUnmannedToolReviewerSelection(selection: UnmannedToolReviewerSelection, skipped?: { reason: 'role-pinned'; roleSource: RoleLlmSource }): void {
|
|
1055
1056
|
try {
|
|
1056
1057
|
debug.log('self-dev.reviewer', 'tool-reviewer.select', {
|
|
1057
1058
|
picked: selection.picked,
|
|
1058
1059
|
rate: selection.rate,
|
|
1059
1060
|
sample: selection.sample,
|
|
1061
|
+
...(skipped ? { skipped: skipped.reason, roleSource: skipped.roleSource } : {}),
|
|
1060
1062
|
});
|
|
1061
1063
|
} catch { /* fail-soft */ }
|
|
1062
1064
|
}
|
|
1063
1065
|
|
|
1066
|
+
/**
|
|
1067
|
+
* TOOL-REVIEWER-ROLE-PIN — a review role pinned for THIS launch (`--role-llm review=…` flag, or the Pod's
|
|
1068
|
+
* `ELANOUS_ROLE_LLM_REVIEW` env pin) is a declaration that every review in the run uses that model; the
|
|
1069
|
+
* unmanned tool-reviewer lottery must not swap it out (10-10 OR probe #25906: the draw picked the ACP
|
|
1070
|
+
* reviewer and skipped the glm-5.3 pin, so bench arms got different reviewers). `environment` also covers the
|
|
1071
|
+
* older `ELANOUS_PR_REVIEW_MODEL` env model pin. Config `roleLlm.review` is a standing default, not a per-launch
|
|
1072
|
+
* pin — it keeps the lottery.
|
|
1073
|
+
*/
|
|
1074
|
+
export function reviewRolePinnedForLaunch(source: RoleLlmSource): boolean {
|
|
1075
|
+
return source === 'flag' || source === 'environment';
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1064
1078
|
async function defaultMakeUnmannedToolReviewLLM(): Promise<UnmannedToolReviewLLM> {
|
|
1065
1079
|
const { makeLazyAcpReviewLLM } = await import('../agent-substrate/acp-reviewer.js');
|
|
1066
1080
|
return makeLazyAcpReviewLLM({ cwd: process.cwd() });
|
|
@@ -1085,6 +1099,8 @@ export async function buildDefaultSelfImplementSeams(
|
|
|
1085
1099
|
makeToolReviewLLM?: () => UnmannedToolReviewLLM | Promise<UnmannedToolReviewLLM>;
|
|
1086
1100
|
subscriptionReviewerDeps?: SubscriptionReviewerDeps;
|
|
1087
1101
|
makeSubscriptionReviewLLM?: (spawn: ReturnType<typeof import('./review-provider-fallback.js').subscriptionReviewerSpawn>) => (prompt: string) => Promise<string>;
|
|
1102
|
+
/** REVIEW-ACP-POD ②-b 시험 주입 — 기본은 env `ELANOUS_REVIEW_DEFERRED_TO_HOST=1`(발사 호스트가 싣는다). */
|
|
1103
|
+
reviewDeferredToHost?: boolean;
|
|
1088
1104
|
} = {},
|
|
1089
1105
|
): Promise<SelfImplementSeams> {
|
|
1090
1106
|
const { defaultSeams } = await import('../self-implement/seams.js');
|
|
@@ -1139,11 +1155,14 @@ export async function buildDefaultSelfImplementSeams(
|
|
|
1139
1155
|
let reviewerCanSelfRead: boolean | undefined;
|
|
1140
1156
|
if (reviewerIsDefaultApiCall) {
|
|
1141
1157
|
const rate = parseUnmannedToolReviewerRate(deps.toolReviewerRate) ?? unmannedToolReviewerRateFromConfig();
|
|
1142
|
-
const
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1158
|
+
const rolePinned = reviewRolePinnedForLaunch(reviewRole.source);
|
|
1159
|
+
const sample = rolePinned
|
|
1160
|
+
? 1
|
|
1161
|
+
: typeof deps.toolReviewerSample === 'number' && Number.isFinite(deps.toolReviewerSample)
|
|
1162
|
+
? deps.toolReviewerSample
|
|
1163
|
+
: (deps.toolReviewerRoll ?? Math.random)();
|
|
1164
|
+
const selection = rolePinned ? { picked: false, rate, sample } : selectUnmannedToolReviewer(rate, sample);
|
|
1165
|
+
observeUnmannedToolReviewerSelection(selection, rolePinned ? { reason: 'role-pinned', roleSource: reviewRole.source } : undefined);
|
|
1147
1166
|
if (selection.picked) {
|
|
1148
1167
|
llmReview = await (deps.makeToolReviewLLM ?? defaultMakeUnmannedToolReviewLLM)();
|
|
1149
1168
|
reviewerCanSelfRead = true;
|
|
@@ -1164,6 +1183,11 @@ export async function buildDefaultSelfImplementSeams(
|
|
|
1164
1183
|
reviewerCanSelfRead = undefined;
|
|
1165
1184
|
}
|
|
1166
1185
|
}
|
|
1186
|
+
// REVIEW-ACP-POD ②-b — 발사 호스트가 Claude ACP 로 리뷰할 때만 실린다. 리뷰 심이 api 리뷰어를 부르지 않는다(판정은 호스트).
|
|
1187
|
+
const reviewDeferredToHost = deps.reviewDeferredToHost ?? reviewDeferredToHostFromEnv(process.env);
|
|
1188
|
+
if (reviewDeferredToHost) {
|
|
1189
|
+
try { debug.log('self-dev.review-fallback', 'review-deferred-to-host', { env: REVIEW_DEFERRED_TO_HOST_ENV, source: deps.reviewDeferredToHost !== undefined ? 'option' : 'env' }); } catch { /* fail-soft */ }
|
|
1190
|
+
}
|
|
1167
1191
|
const opensPr = plan.completion !== 'worktree-only';
|
|
1168
1192
|
const target = plan.target === undefined ? undefined : revalidateHarnessTarget(plan.target);
|
|
1169
1193
|
if (target?.status === 'outside-home') {
|
|
@@ -1181,6 +1205,7 @@ export async function buildDefaultSelfImplementSeams(
|
|
|
1181
1205
|
...(plan.self?.activityGraceSec !== undefined ? { implementActivityGraceSec: plan.self.activityGraceSec } : {}),
|
|
1182
1206
|
llmReview,
|
|
1183
1207
|
...(subscriptionReviewLLM ? { subscriptionReviewLLM } : {}),
|
|
1208
|
+
...(reviewDeferredToHost ? { reviewDeferredToHost: true } : {}),
|
|
1184
1209
|
...(reviewerCanSelfRead !== undefined ? { reviewerCanSelfRead } : {}),
|
|
1185
1210
|
...(deps.reviewScopeDiff ? { reviewScopeDiff: deps.reviewScopeDiff } : {}),
|
|
1186
1211
|
onProgress: ({ stage, message }) => {
|
|
@@ -7,16 +7,19 @@ import { debug } from '../debug/log.js';
|
|
|
7
7
|
import { PR_LABELS } from '../github/pr-labels.js';
|
|
8
8
|
import { appendRunLedgerEntry, listRunLedgers, loadRunLedger, runLedgerDir, type RunLedgerEntry } from '../self-implement/run-ledger.js';
|
|
9
9
|
import { queryRunningRuns } from '../self-implement/running-runs.js';
|
|
10
|
+
import { clipRegateDetail, regateFailureFacts, type HostRegateFailure } from '../self-implement/regate-detail.js';
|
|
10
11
|
import { DRAFT_SWEEP_CLOSE_CAP } from './draft-sweep.js';
|
|
11
12
|
import { PROTECTED_LABELS, sameVerifiedGoal, type DraftTriagePr } from './draft-triage-rules.js';
|
|
12
13
|
|
|
13
|
-
export type PodTerminalClass = 'landed' | 'merge-ready-not-merged' | 'failed-with-pr' | 'failed-no-pr' | 'failed-pr-unobserved';
|
|
14
|
+
export type PodTerminalClass = 'landed' | 'merge-ready-not-merged' | 'failed-with-pr' | 'failed-no-pr' | 'failed-pr-unobserved' | 'timed-out-harvestable';
|
|
14
15
|
export interface PrTerminalRecord {
|
|
15
16
|
childRunId: string;
|
|
16
17
|
prNumber: number | null;
|
|
17
18
|
prUrl: string | null;
|
|
18
19
|
repository: string | null;
|
|
19
20
|
headSha: string | null;
|
|
21
|
+
/** Copied from disposition.branch when present; null when the child did not name a branch. */
|
|
22
|
+
branch?: string | null;
|
|
20
23
|
terminalClass: PodTerminalClass;
|
|
21
24
|
stage: string | null;
|
|
22
25
|
owner: string;
|
|
@@ -24,13 +27,16 @@ export interface PrTerminalRecord {
|
|
|
24
27
|
card: string | null;
|
|
25
28
|
at: string;
|
|
26
29
|
/** Which host-regate gate failed and why — null for every other terminal. */
|
|
27
|
-
|
|
30
|
+
/** HOST-REGATE-REASON-LOST: detail keeps a bounded head ⊕ tail (4KB); pr-head · merge steps add the expected/actual
|
|
31
|
+
* head, merge-conflict adds the conflicted files, merge adds the failure kind (race · moved head · conflict · policy). */
|
|
32
|
+
hostRegateFailure: (HostRegateFailure & { os: string }) | null;
|
|
28
33
|
}
|
|
29
34
|
export interface PodTerminalInput {
|
|
30
35
|
childRunId: string;
|
|
31
36
|
state: 'complete' | 'failed' | 'aborted';
|
|
32
37
|
disposition?: { prNumber?: number | null; prUrl?: string | null; checkedHeadCommit?: string | null; stage?: string; merged?: boolean; ok?: boolean;
|
|
33
|
-
|
|
38
|
+
branch?: string | null;
|
|
39
|
+
hostRegate?: { passed: boolean; failures: HostRegateFailure[]; os: string } | null } | null;
|
|
34
40
|
env?: Readonly<Record<string, string | undefined>>;
|
|
35
41
|
prBody?: string;
|
|
36
42
|
goalText?: string;
|
|
@@ -47,6 +53,7 @@ export function classifyPodTerminal(input: PodTerminalInput): PrTerminalRecord {
|
|
|
47
53
|
const prUrl = typeof d?.prUrl === 'string' ? d.prUrl : null;
|
|
48
54
|
const match = prUrl && /^https:\/\/github\.com\/([\w.-]+)\/([\w.-]+)\/pull\/(\d+)\/?$/.exec(prUrl);
|
|
49
55
|
const repository = match && Number(match[3]) === prNumber ? `${match[1]}/${match[2]}` : null;
|
|
56
|
+
const branch = typeof d?.branch === 'string' && d.branch.trim() ? d.branch.trim() : null;
|
|
50
57
|
const card = cardOf(input.prBody) ?? cardOf(input.goalText);
|
|
51
58
|
const seat = input.env?.ELANOUS_HARNESS_SEAT;
|
|
52
59
|
const ownerSource = seat === 'OP' || seat === 'TC' || seat === 'MK' || seat === 'UX' ? 'seat' : card ? 'card' : 'unknown';
|
|
@@ -55,14 +62,16 @@ export function classifyPodTerminal(input: PodTerminalInput): PrTerminalRecord {
|
|
|
55
62
|
const hostRegateFailure = d?.stage === 'host-regate-failed' && hostRegate?.passed === false
|
|
56
63
|
? { step: typeof firstFailure?.step === 'string' && firstFailure.step ? firstFailure.step : 'unknown',
|
|
57
64
|
detail: typeof firstFailure?.detail === 'string' && firstFailure.detail
|
|
58
|
-
? firstFailure.detail.split(/\s+/).filter(Boolean).join(' ')
|
|
65
|
+
? clipRegateDetail(firstFailure.detail.split(/\s+/).filter(Boolean).join(' '))
|
|
59
66
|
: 'failures empty',
|
|
67
|
+
...regateFailureFacts(firstFailure),
|
|
60
68
|
os: hostRegate.os }
|
|
61
69
|
: null;
|
|
62
70
|
return {
|
|
63
|
-
childRunId: input.childRunId, prNumber, prUrl, repository,
|
|
71
|
+
childRunId: input.childRunId, prNumber, prUrl, repository, branch,
|
|
64
72
|
headSha: typeof d?.checkedHeadCommit === 'string' && /^[a-f0-9]{40}$/i.test(d.checkedHeadCommit) ? d.checkedHeadCommit : null,
|
|
65
73
|
terminalClass: !d ? 'failed-pr-unobserved' : d.merged === true ? 'landed'
|
|
74
|
+
: prNumber === null && d.stage === 'timed-out' && branch ? 'timed-out-harvestable'
|
|
66
75
|
: prNumber === null ? 'failed-no-pr'
|
|
67
76
|
: input.state === 'complete' && d.ok !== false ? 'merge-ready-not-merged' : 'failed-with-pr',
|
|
68
77
|
stage: d?.stage ?? null, hostRegateFailure,
|
|
@@ -282,7 +291,7 @@ export async function replayPodTerminals(options: DraftResidueReplayOptions = {}
|
|
|
282
291
|
for (const terminal of terminals) {
|
|
283
292
|
const record = terminal.data as unknown as PrTerminalRecord;
|
|
284
293
|
if (typeof record.childRunId !== 'string' || typeof record.owner !== 'string'
|
|
285
|
-
|
|
294
|
+
|| !['landed', 'merge-ready-not-merged', 'failed-with-pr', 'failed-no-pr', 'failed-pr-unobserved', 'timed-out-harvestable'].includes(record.terminalClass)
|
|
286
295
|
|| (record.prNumber !== null && (!Number.isSafeInteger(record.prNumber) || record.prNumber <= 0))
|
|
287
296
|
|| (record.repository !== null && (typeof record.repository !== 'string' || !/^[\w.-]+\/[\w.-]+$/.test(record.repository)))) {
|
|
288
297
|
throw new Error(`Invalid terminal record: ${ledgerRunId}`);
|
|
@@ -338,6 +347,7 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
338
347
|
adapters.appendLedger({ runId: ctx.ledgerRunId, event: 'pr-terminal', data: { ...record } }, ctx.ledgerDir);
|
|
339
348
|
log('terminal-recorded');
|
|
340
349
|
}
|
|
350
|
+
// AUT-TIMEOUT-NO-HARVEST 첫 조각은 «분류만» — 그 branch 로 PR 을 여는 효과는 다음 조각(원격 가지 존재·기존 PR 확인 관문과 함께).
|
|
341
351
|
if (record.terminalClass === 'failed-no-pr' || record.terminalClass === 'failed-pr-unobserved' || record.prNumber === null) {
|
|
342
352
|
acknowledge('complete', 0);
|
|
343
353
|
return skipped(record.terminalClass);
|
|
@@ -121,9 +121,25 @@ export interface DraftSweepResult {
|
|
|
121
121
|
* harvestable (review PASS and gate pass), and blocked (must-fix remains).
|
|
122
122
|
*/
|
|
123
123
|
daily?: DraftSweepDaily;
|
|
124
|
+
/**
|
|
125
|
+
* Same-lineage rule outcomes this tick (DRAFT-SWEEP-LINEAGE-HARVESTABLE): closes it decided (harvestable among them)
|
|
126
|
+
* and every candidate it let fall through to the older rules, by reason.
|
|
127
|
+
*/
|
|
128
|
+
lineage?: DraftSweepLineageCounts;
|
|
124
129
|
error?: string;
|
|
125
130
|
}
|
|
126
131
|
|
|
132
|
+
export interface DraftSweepLineageCounts {
|
|
133
|
+
closed: number;
|
|
134
|
+
harvestableClosed: number;
|
|
135
|
+
fallThrough: Record<string, number>;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** A review counts as passed only on an observed PASS with no must-fix left. */
|
|
139
|
+
function reviewPassed(posture: SweepReviewGate | undefined): boolean {
|
|
140
|
+
return posture?.review === 'pass' && posture.mustFix !== true;
|
|
141
|
+
}
|
|
142
|
+
|
|
127
143
|
/** Daily old-draft census. `date` is the sweep clock's UTC calendar day. */
|
|
128
144
|
export interface DraftSweepDaily {
|
|
129
145
|
readonly date: string;
|
|
@@ -769,6 +785,13 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
769
785
|
let unobserved = 0;
|
|
770
786
|
let claimed = 0;
|
|
771
787
|
let claimExpired = 0;
|
|
788
|
+
const lineageCounts: DraftSweepLineageCounts = { closed: 0, harvestableClosed: 0, fallThrough: {} };
|
|
789
|
+
result.lineage = lineageCounts;
|
|
790
|
+
// Review posture for the harvestable lineage check, reusing the census lookups (one lookup per PR per tick).
|
|
791
|
+
const postureFor = async (pr: SweepDraft): Promise<SweepReviewGate | undefined> => {
|
|
792
|
+
if (!reviewGate.has(pr.number)) reviewGate.set(pr.number, await adapters.getReviewGate!(pr, repository));
|
|
793
|
+
return reviewGate.get(pr.number);
|
|
794
|
+
};
|
|
772
795
|
for (const listedDraft of drafts) {
|
|
773
796
|
const draft = { ...listedDraft, labels: [...listedDraft.labels], latestFileChanges: latestFileChanges.get(listedDraft.number) };
|
|
774
797
|
let releasedThisTick = false;
|
|
@@ -882,7 +905,10 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
882
905
|
? (now.getTime() - Date.parse(draft.updatedAt)) / 3_600_000 : NaN;
|
|
883
906
|
// A newer open draft of the same goal lineage (a rerun, e.g. a forced requeue) supersedes this one even when
|
|
884
907
|
// its running claim is fresh or its run is still live. Holds, merged twins and the title-based duplicate rule keep their priority.
|
|
885
|
-
|
|
908
|
+
// DRAFT-SWEEP-LINEAGE-HARVESTABLE (10-12): a harvestable draft is no longer skipped — the skip left 70+ harvestable
|
|
909
|
+
// reruns open until the 24h idle expiry. It is still protected when its own review passed and the newer one's did not.
|
|
910
|
+
const harvestable = draft.labels.includes(harvestableLabel);
|
|
911
|
+
const lineageNewer = contradiction ? undefined : newerLineageDraft(draft, drafts);
|
|
886
912
|
if (lineageNewer) {
|
|
887
913
|
const base = decideDraft({ draft, runStatus, mergedTwins: merged, openDrafts: drafts, liveBranches,
|
|
888
914
|
finalRunResult, ageHours: runStatus ? ageHours : idleHours });
|
|
@@ -895,9 +921,24 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
895
921
|
// Every lineage outcome that does not close falls through to the existing rules (preservation contract):
|
|
896
922
|
// a duplicate this rule cannot settle is decided exactly as it was before this rule existed.
|
|
897
923
|
const fallThrough = (why: string) => {
|
|
898
|
-
|
|
924
|
+
lineageCounts.fallThrough[why] = (lineageCounts.fallThrough[why] ?? 0) + 1;
|
|
925
|
+
try { debug.log('self-dev.draft-sweep', 'lineage-fall-through', { number: draft.number, newer: lineageNewer.number, lineageKey, why, harvestable }); } catch { /* fail-soft */ }
|
|
899
926
|
};
|
|
900
|
-
|
|
927
|
+
// A harvestable draft yields only to a newer draft at least as complete: an observed review PASS on the old one
|
|
928
|
+
// is kept unless the newer one passed review too. Unobservable review posture keeps the old draft (fail-closed).
|
|
929
|
+
let harvestProtection: string | undefined;
|
|
930
|
+
if (harvestable) {
|
|
931
|
+
if (!adapters.getReviewGate) harvestProtection = 'lineage-harvestable-review-unobserved';
|
|
932
|
+
else {
|
|
933
|
+
try {
|
|
934
|
+
const [oldPosture, newPosture] = [await postureFor(draft), await postureFor(lineageNewer)];
|
|
935
|
+
if (oldPosture === undefined) harvestProtection = 'lineage-harvestable-review-unobserved';
|
|
936
|
+
else if (reviewPassed(oldPosture) && !reviewPassed(newPosture)) harvestProtection = 'lineage-harvestable-review-pass-protected';
|
|
937
|
+
} catch { harvestProtection = 'lineage-harvestable-review-unobserved'; }
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
if (harvestProtection) fallThrough(harvestProtection);
|
|
941
|
+
else if (runLive && !adapters.supersedeRun) fallThrough('lineage-duplicate-run-live');
|
|
901
942
|
// Safety (OP 10-11): a live run is stopped only when the newer run of the same lineage is itself live —
|
|
902
943
|
// never trade a running attempt for one that already ended or was never observed running.
|
|
903
944
|
else if (runLive && !live(statuses.get(lineageNewer.number), lineageNewer.branch)) fallThrough('lineage-newer-run-not-live');
|
|
@@ -921,6 +962,8 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
921
962
|
else {
|
|
922
963
|
// A close is counted against the cap only once it is decided here; a failed write gives the slot back.
|
|
923
964
|
closes += 1;
|
|
965
|
+
lineageCounts.closed += 1;
|
|
966
|
+
if (harvestable) lineageCounts.harvestableClosed += 1;
|
|
924
967
|
const entry: DraftSweepEntry = { number: draft.number, action: 'close', reason, statusLabel: supersededLabel, applied: false };
|
|
925
968
|
record(entry);
|
|
926
969
|
if (!apply) continue;
|
|
@@ -937,7 +980,11 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
937
980
|
entry.applied = true;
|
|
938
981
|
} catch (error) {
|
|
939
982
|
if (labelsChanged) entry.partialApplied = true;
|
|
940
|
-
else
|
|
983
|
+
else {
|
|
984
|
+
closes -= 1;
|
|
985
|
+
lineageCounts.closed -= 1;
|
|
986
|
+
if (harvestable) lineageCounts.harvestableClosed -= 1;
|
|
987
|
+
}
|
|
941
988
|
entry.error = String(error);
|
|
942
989
|
}
|
|
943
990
|
continue;
|
|
@@ -1052,6 +1099,7 @@ export async function runDraftSweep({ repository, adapters, apply = false, now =
|
|
|
1052
1099
|
}
|
|
1053
1100
|
}
|
|
1054
1101
|
timing('decide', drafts.length);
|
|
1102
|
+
try { debug.log('self-dev.draft-sweep', 'lineage-summary', { ...lineageCounts, apply }); } catch { /* fail-soft */ }
|
|
1055
1103
|
try { debug.log('self-dev.draft-sweep', 'timing', { phase: 'total', ms: Date.now() - started, count: drafts.length, closed: closes, closeCap, closeCapSource }); } catch { /* fail-soft */ }
|
|
1056
1104
|
result.unobserved = unobserved;
|
|
1057
1105
|
// `closed` stays «closed by this sweep»; replay closes only consume the shared cap (alreadyClosed).
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { tierModel } from '../llm/model-defaults.js';
|
|
2
1
|
import { statSync } from 'node:fs';
|
|
3
2
|
import { resolve, sep } from 'node:path';
|
|
4
3
|
import {
|
|
@@ -9,6 +8,7 @@ import {
|
|
|
9
8
|
} from '../autopilot/mission-rfc-author.js';
|
|
10
9
|
import {
|
|
11
10
|
DEFAULT_MAX_TASKS,
|
|
11
|
+
decomposeModel,
|
|
12
12
|
decomposeSelfDevGoal,
|
|
13
13
|
type SelfDevDecomposeLlm,
|
|
14
14
|
type SelfDevDecomposeOptions,
|
|
@@ -70,9 +70,16 @@ export type FabricDecomposeRequestResult =
|
|
|
70
70
|
| { status: 'grounding-failed'; message: string; cause: unknown }
|
|
71
71
|
| { status: 'grounding-empty'; message: string; grounding: GoalAuthoringGroundingResult };
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* Default fabric resolve seam — lazy `streamLLM` wire. The model comes from the
|
|
75
|
+
* shared planning-role selector `decomposeModel` (src/self-dev/decompose.ts),
|
|
76
|
+
* so the review env `ELANOUS_PR_REVIEW_MODEL` cannot retarget fabric
|
|
77
|
+
* decomposition (ROLE-RELAY-SPLIT).
|
|
78
|
+
*/
|
|
73
79
|
async function defaultFabricResolve(prompt: string): Promise<string> {
|
|
74
80
|
const { streamLLM } = await import('../llm.js');
|
|
75
|
-
const model
|
|
81
|
+
const { model, source } = decomposeModel();
|
|
82
|
+
debug.log('self-dev.decompose', 'model', { model, source });
|
|
76
83
|
return streamLLM([{ role: 'user', content: prompt }], () => {}, { model, reasoningEffort: 'low' });
|
|
77
84
|
}
|
|
78
85
|
|
|
@@ -39,6 +39,25 @@ export interface SupervisorRound {
|
|
|
39
39
|
* history, which never measured it, so the no-PR streak guard reads it as «not measured» and stays off.
|
|
40
40
|
*/
|
|
41
41
|
noPrTaskIds?: string[];
|
|
42
|
+
/**
|
|
43
|
+
* Piece key (normalized feature — {@link noPrStreakKey}) of each `noPrTaskIds` entry, same index. A rework round mints a
|
|
44
|
+
* new taskId for the same piece (run-27b03878: task:1ded008a8aeb → task:f54a6e6fca25 → task:fade5a6931a4), so the no-PR
|
|
45
|
+
* streak pairs rounds by this key. Omitted on older history — the guard then pairs by taskId as before.
|
|
46
|
+
*/
|
|
47
|
+
noPrFeatureKeys?: string[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Failed without a PR — a result that carries either a PR number or a PR URL has one (fixtures and older producers set only one). */
|
|
51
|
+
function failedWithoutPr(result: SupervisorJobResult): boolean {
|
|
52
|
+
return result.status === 'failed' && result.prNumber === undefined && !result.prUrl;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* «Same piece» key for the no-PR streak guard: the feature text with whitespace collapsed, lower-cased and trailing
|
|
57
|
+
* punctuation dropped. Empty when the result carries no feature — the caller then falls back to the taskId.
|
|
58
|
+
*/
|
|
59
|
+
export function noPrStreakKey(feature: unknown): string {
|
|
60
|
+
return typeof feature === 'string' ? resumeKey(feature).replace(/[\s.,;:!?。…·]+$/u, '') : '';
|
|
42
61
|
}
|
|
43
62
|
|
|
44
63
|
export const SUPERVISOR_STOP_REASONS = [
|
|
@@ -458,17 +477,27 @@ export function decideNextRun(input: {
|
|
|
458
477
|
// AUT-NO-PROGRESS-RETRY-LOOP — 같은 후보가 PR 없이 두 라운드 연속 실패하면 세 번째 Pod 를 띄우지 않는다
|
|
459
478
|
// (부검 run-1166bcd1 · run-1bde4815 · run-427bd632 · run-46a02f42). 직전 라운드가 noPrTaskIds 를 안 쟀으면 서지 않는다.
|
|
460
479
|
// 호출자가 stallRounds 를 기본보다 늘렸으면(제자리 인내를 늘림) 서지 않는다 — 0.2.24 컷 회귀(orchestrate-cli.test 라운드 상한 둘).
|
|
480
|
+
// NO-PR-STREAK-FEATURE-KEY — 짝은 taskId 가 아니라 «같은 조각»(noPrFeatureKeys)으로 맞춘다: rework 가 라운드마다 taskId 를
|
|
481
|
+
// 새로 만들어 taskId 짝은 운영에서 한 번도 안 섰다(run-27b03878). 키를 안 잰 옛 원장·feature 없는 결과는 taskId 로(fail-open).
|
|
461
482
|
const previousNoPr = history.at(-1)?.noPrTaskIds;
|
|
483
|
+
const previousNoPrKeys = history.at(-1)?.noPrFeatureKeys;
|
|
462
484
|
if (previousNoPr !== undefined && retryIds.length > 0 && stallRounds <= DEFAULT_STALL_ROUNDS) {
|
|
463
|
-
const failedNoPr = (taskId: string) => activeResults.find((result) => result.taskId === taskId
|
|
464
|
-
|
|
465
|
-
const
|
|
485
|
+
const failedNoPr = (taskId: string) => activeResults.find((result) => result.taskId === taskId && failedWithoutPr(result));
|
|
486
|
+
const keyOf = (taskId: string): string => noPrStreakKey(activeResults.find((result) => result.taskId === taskId)?.feature);
|
|
487
|
+
const pairedBy = (taskId: string): 'feature-key' | 'task-id' =>
|
|
488
|
+
previousNoPrKeys !== undefined && keyOf(taskId) !== '' ? 'feature-key' : 'task-id';
|
|
489
|
+
const sameAsPrevious = (taskId: string): boolean => pairedBy(taskId) === 'feature-key'
|
|
490
|
+
? previousNoPrKeys!.includes(keyOf(taskId))
|
|
491
|
+
: previousNoPr.includes(taskId);
|
|
492
|
+
const streak = retryIds.every((taskId) => sameAsPrevious(taskId) && failedNoPr(taskId) !== undefined);
|
|
466
493
|
if (streak && !madeProgress(history.at(-1), thisRound)) {
|
|
467
494
|
const errors = retryIds.flatMap((taskId) => {
|
|
468
495
|
const message = failedNoPr(taskId)?.error?.message;
|
|
469
496
|
return message ? [message.slice(0, 200)] : [];
|
|
470
497
|
});
|
|
471
|
-
try { debug.log('self-dev.supervisor', 'no-pr-streak-stop', {
|
|
498
|
+
try { debug.log('self-dev.supervisor', 'no-pr-streak-stop', {
|
|
499
|
+
taskIds: retryIds, featureKeys: retryIds.map(keyOf), pairedBy: [...new Set(retryIds.map(pairedBy))], round, errors,
|
|
500
|
+
}); } catch { /* fail-open */ }
|
|
472
501
|
return {
|
|
473
502
|
...base,
|
|
474
503
|
action: 'stop',
|
|
@@ -558,8 +587,9 @@ export function appendRound(
|
|
|
558
587
|
const t = triageRun(results.filter((result) => result.salvage !== 'launched'), undefined, false, undefined, mainSyncRelaunchSpent(history));
|
|
559
588
|
const baseCompleted = countBaseCompleted(results);
|
|
560
589
|
const base = roundBase(results);
|
|
561
|
-
const
|
|
562
|
-
|
|
590
|
+
const noPrResults = results.filter(failedWithoutPr);
|
|
591
|
+
const noPrTaskIds = noPrResults.map((result) => result.taskId);
|
|
592
|
+
const noPrFeatureKeys = noPrResults.map((result) => noPrStreakKey(result.feature));
|
|
563
593
|
return [...history, {
|
|
564
594
|
round: history.length,
|
|
565
595
|
landed: countLanded(results),
|
|
@@ -586,7 +616,7 @@ export function appendRound(
|
|
|
586
616
|
return { oscillationRepairTaskIds: pairs.map(([id]) => id!), oscillationRepairFeatures: pairs.map(([, feature]) => feature!),
|
|
587
617
|
...(decision.oscillation.repairGoals ? { oscillationRepairGoals: decision.oscillation.repairGoals } : {}) };
|
|
588
618
|
})() : {}),
|
|
589
|
-
...(noPrTaskIds.length > 0 ? { noPrTaskIds } : {}),
|
|
619
|
+
...(noPrTaskIds.length > 0 ? { noPrTaskIds, noPrFeatureKeys } : {}),
|
|
590
620
|
}];
|
|
591
621
|
}
|
|
592
622
|
|
|
@@ -16,7 +16,7 @@ import { publicExposureFiles, runExposeGate } from './expose-gate.js';
|
|
|
16
16
|
import { getUserConfig } from '../user-config.js';
|
|
17
17
|
import { debug } from '../debug/log.js';
|
|
18
18
|
import { buildDocumentGuardianIndex, formatDocumentGuardians } from './document-guardian-index.js';
|
|
19
|
-
import { buildImporterTestIndex, isTestPath, type ImporterTestIndex } from './importer-test-index.js';
|
|
19
|
+
import { buildImporterTestIndex, importerTestsNotInRunSet, isTestPath, type ImporterTestIndex } from './importer-test-index.js';
|
|
20
20
|
import { buildRouteConsumerTestIndex } from './route-consumer-test-index.js';
|
|
21
21
|
import { gitChangedFiles, observeGateBaselineLocation } from './seams.js';
|
|
22
22
|
import {
|
|
@@ -33,6 +33,9 @@ export interface SelfGateCliOptions {
|
|
|
33
33
|
/** LIGHT-RC (0.2.19) — repository-relative test paths run on every call, whatever changed. Existing ones join the
|
|
34
34
|
* run (deduplicated, same introduced/preexisting baseline as the rest); missing ones go to `alwaysIncludeMissing`. */
|
|
35
35
|
alwaysInclude?: readonly string[];
|
|
36
|
+
/** RELEASE-DAILY-LIGHT-RC ② — run every tracked test that imports a changed (non-test) source, past the caller cap
|
|
37
|
+
* (importer index · reason=changed-source-importer). Off by default: the plain `self gate` scope is unchanged. */
|
|
38
|
+
includeImporterTests?: boolean;
|
|
36
39
|
}
|
|
37
40
|
|
|
38
41
|
interface ProcessResult {
|
|
@@ -115,6 +118,8 @@ export interface SelfGateCliResult {
|
|
|
115
118
|
documentsWithoutDerivedTests: readonly string[];
|
|
116
119
|
/** `alwaysInclude` paths that do not exist in the tree (empty when none were given). */
|
|
117
120
|
alwaysIncludeMissing: readonly string[];
|
|
121
|
+
/** RELEASE-DAILY-LIGHT-RC ② — importer tests added because `includeImporterTests` was set (empty otherwise). */
|
|
122
|
+
importerTestsAdded?: readonly string[];
|
|
118
123
|
/** New vs. already-present failures (unknown/preconditionUnmet = failures it could not classify). Absent = the test
|
|
119
124
|
* step did not produce a measurement (e.g. shards unmeasured). */
|
|
120
125
|
baseline?: { introduced: number; preexisting: number; unknown: number; preconditionUnmet: number };
|
|
@@ -605,9 +610,20 @@ export function runSelfGateCli(cwd: string, options: SelfGateCliOptions = {}, de
|
|
|
605
610
|
const alwaysIncludeMissing = alwaysInclude.filter((path) => !exists(path));
|
|
606
611
|
const scopedTests = scope.testArgs ?? [];
|
|
607
612
|
const alwaysIncludeExtra = alwaysInclude.filter((path) => exists(path) && !scopedTests.includes(path));
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
const
|
|
613
|
+
// RELEASE-DAILY-LIGHT-RC ② — the scope already runs importer tests as callers, but capped (GATE_CALLER_TEST_LIMIT);
|
|
614
|
+
// a day of landings overflows that cap and source-only regressions went unrun (0.2.24: 20). Opt-in: every importer.
|
|
615
|
+
const changedSources = selection.files.filter((path) => !isTestPath(path));
|
|
616
|
+
const importerTestsAdded = options.includeImporterTests && availableIndex
|
|
617
|
+
? [...new Set(changedSources.flatMap((source) => availableIndex.testsBySource.get(source) ?? []))]
|
|
618
|
+
.filter((path) => exists(path) && !scopedTests.includes(path) && !alwaysIncludeExtra.includes(path)).sort()
|
|
619
|
+
: [];
|
|
620
|
+
const testFiles = [...scopedTests, ...alwaysIncludeExtra, ...importerTestsAdded];
|
|
621
|
+
const skipTestStep = scope.skipTestStep && alwaysIncludeExtra.length === 0 && importerTestsAdded.length === 0;
|
|
622
|
+
const importerTestsNotRun = options.includeImporterTests && availableIndex
|
|
623
|
+
? importerTestsNotInRunSet(availableIndex, changedSources, testFiles) : scope.importerTestsNotRun;
|
|
624
|
+
const unrunImporterTotal = lookupFailed ? null : (importerTestsNotRun?.total ?? 0);
|
|
625
|
+
// Overflowed callers that ② ran anyway are not «not run».
|
|
626
|
+
const callerTestsOverflow = scope.callerTestsOverflow.filter(({ file }) => !importerTestsAdded.includes(file));
|
|
611
627
|
const importerLookupFailed = Boolean(lookupFailed);
|
|
612
628
|
const lines = [
|
|
613
629
|
// ⛔⭐ 「changed=0」을 «초록»으로 읽는 사고가 났다(2026-09-02 · 🅕 보고 · 🅣 재현).
|
|
@@ -630,15 +646,18 @@ export function runSelfGateCli(cwd: string, options: SelfGateCliOptions = {}, de
|
|
|
630
646
|
documentGuardianLine(cwd, scope.documentPaths, deps.runCommand),
|
|
631
647
|
// 🚨 러너 우주 «밖» — 형제들과 같은 정책으로 «말만» 한다(`OBS-T418`).
|
|
632
648
|
formatUnrunnableChangeKinds(selection.files),
|
|
633
|
-
formatUnrunImporterTests(
|
|
649
|
+
formatUnrunImporterTests(importerTestsNotRun, lookupFailed),
|
|
634
650
|
`caller tests: ${lookupFailed ? `lookup failed (${lookupFailed})` : scope.callerTests.map(({ file, reasons }) => `${file} (${reasons.join('+')})`).join(', ') || (routeIndex?.lookupFailures.length ? 'route lookup incomplete' : '(none)')}`,
|
|
635
651
|
...(routeIndex?.lookupFailures.length ? [`⚠️ caller route base lookup failed — unmeasured: ${routeIndex.lookupFailures.map(({ source, reason }) => `${source} (${reason})`).join(', ')}`] : []),
|
|
636
|
-
...(
|
|
652
|
+
...(callerTestsOverflow.length ? [`⚠️ caller test cap exceeded — not run: ${callerTestsOverflow.map(({ file, reasons }) => `${file} (${reasons.join('+')})`).join(', ')}`] : []),
|
|
637
653
|
changedTestCountNote(cwd, selection.files, selection.baseRef, deps.runCommand, deps.readFile),
|
|
638
654
|
// Only printed when the caller asked for always-include paths — the plain `self gate` output is unchanged.
|
|
639
655
|
...(options.alwaysInclude !== undefined
|
|
640
656
|
? [`always include: ${alwaysInclude.length - alwaysIncludeMissing.length}/${alwaysInclude.length} (added ${alwaysIncludeExtra.length}${alwaysIncludeMissing.length ? ` · missing: ${alwaysIncludeMissing.join(', ')}` : ''})`]
|
|
641
657
|
: []),
|
|
658
|
+
...(options.includeImporterTests
|
|
659
|
+
? [`importer tests added: ${lookupFailed ? `lookup failed (${lookupFailed})` : `${importerTestsAdded.length} (reason=changed-source-importer${importerTestsAdded.length ? ` · ${importerTestsAdded.join(', ')}` : ''})`}`]
|
|
660
|
+
: []),
|
|
642
661
|
];
|
|
643
662
|
if (expose.log) lines.push(expose.log);
|
|
644
663
|
if (options.pr) {
|
|
@@ -664,7 +683,7 @@ export function runSelfGateCli(cwd: string, options: SelfGateCliOptions = {}, de
|
|
|
664
683
|
if (skipTestStep) {
|
|
665
684
|
const policyPassed = runPolicyGates(selection.files, cwd, lines, deps);
|
|
666
685
|
logGateCliBaseline(cwd, { ...ZERO_GATE_BASELINE, unrunImporterTotal, lookupFailed: importerLookupFailed });
|
|
667
|
-
return { exitCode: androidPassed && iosPassed && pwaPassed && policyPassed && expose.passed ? 0 : 1, lines, changedFiles: selection.files, testFiles: [], unverified: scope.unverified, documentPaths: scope.documentPaths, documentsWithoutDerivedTests: scope.documentsWithoutDerivedTests, alwaysIncludeMissing, baseline: { introduced: 0, preexisting: 0, unknown: 0, preconditionUnmet: 0 } };
|
|
686
|
+
return { exitCode: androidPassed && iosPassed && pwaPassed && policyPassed && expose.passed ? 0 : 1, lines, changedFiles: selection.files, testFiles: [], unverified: scope.unverified, documentPaths: scope.documentPaths, documentsWithoutDerivedTests: scope.documentsWithoutDerivedTests, alwaysIncludeMissing, importerTestsAdded, baseline: { introduced: 0, preexisting: 0, unknown: 0, preconditionUnmet: 0 } };
|
|
668
687
|
}
|
|
669
688
|
|
|
670
689
|
if (options.shards !== undefined) {
|
|
@@ -700,7 +719,7 @@ export function runSelfGateCli(cwd: string, options: SelfGateCliOptions = {}, de
|
|
|
700
719
|
exitCode: aggregate.status !== 'passed' || !policyPassed || !androidPassed || !iosPassed || !pwaPassed || !expose.passed ? 1 : 0,
|
|
701
720
|
lines, changedFiles: selection.files, testFiles, unverified: scope.unverified,
|
|
702
721
|
documentPaths: scope.documentPaths, documentsWithoutDerivedTests: scope.documentsWithoutDerivedTests,
|
|
703
|
-
alwaysIncludeMissing, ...(shardBaseline ? { baseline: shardBaseline } : {}),
|
|
722
|
+
alwaysIncludeMissing, importerTestsAdded, ...(shardBaseline ? { baseline: shardBaseline } : {}),
|
|
704
723
|
...(unmeasuredReason !== undefined ? { unmeasuredReason } : {}),
|
|
705
724
|
};
|
|
706
725
|
}
|
|
@@ -711,7 +730,7 @@ export function runSelfGateCli(cwd: string, options: SelfGateCliOptions = {}, de
|
|
|
711
730
|
lines.push(formatPartialObservationNote(unrunImporterTotal ?? 0, `tests: pass (${testFiles.length} files)`));
|
|
712
731
|
const policyPassed = runPolicyGates(selection.files, cwd, lines, deps);
|
|
713
732
|
logGateCliBaseline(cwd, { ...ZERO_GATE_BASELINE, unrunImporterTotal, lookupFailed: importerLookupFailed });
|
|
714
|
-
return { exitCode: policyPassed && androidPassed && iosPassed && pwaPassed && expose.passed ? 0 : 1, lines, changedFiles: selection.files, testFiles, unverified: scope.unverified, documentPaths: scope.documentPaths, documentsWithoutDerivedTests: scope.documentsWithoutDerivedTests, alwaysIncludeMissing, baseline: { introduced: 0, preexisting: 0, unknown: 0, preconditionUnmet: 0 } };
|
|
733
|
+
return { exitCode: policyPassed && androidPassed && iosPassed && pwaPassed && expose.passed ? 0 : 1, lines, changedFiles: selection.files, testFiles, unverified: scope.unverified, documentPaths: scope.documentPaths, documentsWithoutDerivedTests: scope.documentsWithoutDerivedTests, alwaysIncludeMissing, importerTestsAdded, baseline: { introduced: 0, preexisting: 0, unknown: 0, preconditionUnmet: 0 } };
|
|
715
734
|
}
|
|
716
735
|
|
|
717
736
|
if (worktreeLog.includes('deterministic environment setup failed')) lines.push(worktreeLog);
|
|
@@ -733,5 +752,5 @@ export function runSelfGateCli(cwd: string, options: SelfGateCliOptions = {}, de
|
|
|
733
752
|
lines.push(formatPartialObservationNote(unrunImporterTotal ?? 0, formatGateBaselineNote(report, unrunImporterTotal ?? 0)));
|
|
734
753
|
const policyPassed = runPolicyGates(selection.files, cwd, lines, deps);
|
|
735
754
|
const exitCode = !androidPassed || !iosPassed || !pwaPassed || !policyPassed || !expose.passed || report.introduced > 0 || report.unknown > 0 || report.preconditionUnmet > 0 ? 1 : 0;
|
|
736
|
-
return { exitCode, lines, changedFiles: selection.files, testFiles, unverified: scope.unverified, documentPaths: scope.documentPaths, documentsWithoutDerivedTests: scope.documentsWithoutDerivedTests, alwaysIncludeMissing, baseline: { introduced: report.introduced, preexisting: report.preexisting, unknown: report.unknown, preconditionUnmet: report.preconditionUnmet } };
|
|
755
|
+
return { exitCode, lines, changedFiles: selection.files, testFiles, unverified: scope.unverified, documentPaths: scope.documentPaths, documentsWithoutDerivedTests: scope.documentsWithoutDerivedTests, alwaysIncludeMissing, importerTestsAdded, baseline: { introduced: report.introduced, preexisting: report.preexisting, unknown: report.unknown, preconditionUnmet: report.preconditionUnmet } };
|
|
737
756
|
}
|
|
@@ -365,6 +365,9 @@ export interface DispatchOptions {
|
|
|
365
365
|
/** argv for the remote run (the tool re-invoked with `--local` so it never recurses). */
|
|
366
366
|
remoteArgv: RemoteArgv;
|
|
367
367
|
refs?: string[];
|
|
368
|
+
/** Exact commit to run remotely instead of the repo's HEAD (RELEASE-DAILY-LIGHT-RC ① — light-rc measures origin/main,
|
|
369
|
+
* not the seat tree it was started from). */
|
|
370
|
+
commit?: string;
|
|
368
371
|
installPwa?: boolean;
|
|
369
372
|
payloadFiles?: PayloadFile[];
|
|
370
373
|
json?: boolean;
|
|
@@ -413,7 +416,7 @@ export async function dispatchHeavyCheck(opts: DispatchOptions, deps: DispatchDe
|
|
|
413
416
|
let outcome: RemoteRunOutcome;
|
|
414
417
|
for (;;) {
|
|
415
418
|
try {
|
|
416
|
-
outcome = runOnRemote({ repo: opts.repo, host, mirror: settings.mirror, argv: opts.remoteArgv, refs: opts.refs, installPwa: opts.installPwa, payloadFiles: opts.payloadFiles, hostCap: settings.hostCap }, deps.runner);
|
|
419
|
+
outcome = runOnRemote({ repo: opts.repo, host, mirror: settings.mirror, argv: opts.remoteArgv, refs: opts.refs, ...(opts.commit !== undefined ? { commit: opts.commit } : {}), installPwa: opts.installPwa, payloadFiles: opts.payloadFiles, hostCap: settings.hostCap }, deps.runner);
|
|
417
420
|
} catch (error) {
|
|
418
421
|
outcome = { kind: 'infra', reason: `exception: ${error instanceof Error ? error.message : String(error)}` };
|
|
419
422
|
}
|
|
@@ -50,6 +50,7 @@ import type { HarnessGroundingProvenance } from './context-capsule.js';
|
|
|
50
50
|
import { hasGoalStepCodeName } from './goal-step-code-name.js';
|
|
51
51
|
import { targetScopedGoalText } from './goal-text-path-scope.js';
|
|
52
52
|
import { parseReleaseNoteSection } from '../release-loop/release-note.js';
|
|
53
|
+
import { declaredNewFilePaths } from './goal-new-paths.js';
|
|
53
54
|
|
|
54
55
|
// ⭐ `situation`/`complication` 은 **선택**이다 — 안 오면 `scqaNarrative` 가 종전 문면을 쓴다.
|
|
55
56
|
// ⛔ 필수로 만들지 않는다: 그러면 인핸싱이 폴백으로 떨어진 저작(LLM 실패·`disabled`)이 전부 죽는다.
|
|
@@ -371,7 +372,7 @@ function endGoalAuthorPhase(phase: GoalAuthorTimedPhase, startedAt: number, auth
|
|
|
371
372
|
|
|
372
373
|
export type GoalFileLintLevel = 'ERROR' | 'WARN';
|
|
373
374
|
|
|
374
|
-
export type GoalFileLintTag = 'canonical-structure' | 'evidence-section' | 'boundary-size' | 'launch-branch' | 'unanswered-clarification' | 'shell-damage' | 'traced-path' | 'grounding-evidence' | 'empty-result-population' | 'decision-signal-numeric-source' | 'decision-signal-numeric-coverage' | 'decision-signal-proxy-expectation' | 'out-of-target-requirement' | 'heading-form-marker' | 'blanket-invariant' | 'self-question-subject' | 'artifact-launch-declaration' | 'all-negative-signals' | 'unreadable-signals' | 'alternative-signals' | 'count-observation' | 'identifier-name-observation' | 'self-reported-observation' | 'default-invocation-observation' | 'release-note';
|
|
375
|
+
export type GoalFileLintTag = 'canonical-structure' | 'evidence-section' | 'boundary-size' | 'launch-branch' | 'unanswered-clarification' | 'shell-damage' | 'traced-path' | 'traced-path-new' | 'grounding-evidence' | 'empty-result-population' | 'decision-signal-numeric-source' | 'decision-signal-numeric-coverage' | 'decision-signal-proxy-expectation' | 'out-of-target-requirement' | 'heading-form-marker' | 'blanket-invariant' | 'self-question-subject' | 'artifact-launch-declaration' | 'all-negative-signals' | 'unreadable-signals' | 'alternative-signals' | 'count-observation' | 'identifier-name-observation' | 'self-reported-observation' | 'default-invocation-observation' | 'release-note';
|
|
375
376
|
|
|
376
377
|
type GoalFileLintOrigin =
|
|
377
378
|
| { readonly kind: 'known-incident'; readonly incident: string; readonly reference: string }
|
|
@@ -389,6 +390,7 @@ export const GOAL_FILE_LINT_ORIGINS: Record<GoalFileLintTag, GoalFileLintOrigin>
|
|
|
389
390
|
'unanswered-clarification': { kind: 'known-incident', incident: 'deferred clarifications passed lint and later killed launch', reference: 'git:50dc445cc (#6703)' },
|
|
390
391
|
'shell-damage': { kind: 'known-incident', incident: 'code fences were read as empty inline code', reference: 'git:92937e8f3 (#6403)' },
|
|
391
392
|
'traced-path': { kind: 'known-incident', incident: 'missing files and lines escaped pre-launch validation', reference: 'git:777973f23 (#6423)' },
|
|
393
|
+
'traced-path-new': { kind: 'known-incident', incident: 'goals declaring a not-yet-existing file as new were still hit with the traced-path missing ERROR, so authors listed nonexistent paths as existing ones and the Pod ended no-result-line (MODEL-BENCH-SCORES twice plus four UX cells)', reference: 'goal cell AUTHOR-NEW-FILE-PATHS (0.2.24)' },
|
|
392
394
|
'grounding-evidence': { kind: 'unknown-origin', label: 'ORIGIN-UNKNOWN' },
|
|
393
395
|
'empty-result-population': { kind: 'unknown-origin', label: 'ORIGIN-UNKNOWN' },
|
|
394
396
|
'decision-signal-numeric-source': { kind: 'known-incident', incident: 'authored Expected result omitted numeric source and coverage', reference: 'git:7e6c02799 (#9847)' },
|
|
@@ -1722,13 +1724,21 @@ export function lintGoalFile(document: string, branch: string, deps: GoalFileLin
|
|
|
1722
1724
|
});
|
|
1723
1725
|
}
|
|
1724
1726
|
if (deps.readReferencedFile) {
|
|
1727
|
+
// AUTHOR-NEW-FILE-PATHS — 문서가 «새로 만들 파일»로 선언한 경로. 실행 쪽 범위 검사와 같은 줄을 읽는다.
|
|
1728
|
+
const declaredNew = new Set(declaredNewFilePaths(document));
|
|
1725
1729
|
for (const reference of tracedPathReferences(document)) {
|
|
1726
1730
|
const result = deps.readReferencedFile(reference.path);
|
|
1727
1731
|
const normalized = typeof result === 'string' ? { kind: 'ok' as const, contents: result }
|
|
1728
1732
|
: result === null ? { kind: 'missing' as const }
|
|
1729
1733
|
: result;
|
|
1730
1734
|
if (normalized.kind === 'missing') {
|
|
1731
|
-
|
|
1735
|
+
// AUTHOR-NEW-FILE-PATHS — 선언된 새 파일은 저작 시점에 없는 것이 정상이다: ERROR 가 아니라 WARN.
|
|
1736
|
+
if (declaredNew.has(reference.path)) {
|
|
1737
|
+
findings.push({ level: 'WARN', tag: 'traced-path-new', message: `traced path is declared new: ${reference.path}` });
|
|
1738
|
+
debug.log('self-implement.author', 'traced-path-new', { path: reference.path });
|
|
1739
|
+
} else {
|
|
1740
|
+
findings.push({ level: 'ERROR', tag: 'traced-path', message: `traced path does not exist: ${reference.path}` });
|
|
1741
|
+
}
|
|
1732
1742
|
} else if (normalized.kind === 'outside-repository') {
|
|
1733
1743
|
findings.push({ level: 'ERROR', tag: 'traced-path', message: `traced path is outside repository: ${reference.path}` });
|
|
1734
1744
|
} else if (normalized.kind === 'directory') {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ⭐ AUTHOR-NEW-FILE-PATHS — 저작 골 문서가 «새로 만들 파일»로 선언한 경로.
|
|
3
|
+
*
|
|
4
|
+
* 저작(TRACED PATHS 존재 검사)과 실행(orchestrator 범위 검사)이 **같은 줄**을 읽어야
|
|
5
|
+
* 저작 통과·실행 보류가 다시 갈리지 않는다(TC 13:50). 줄 인식은 실행 쪽
|
|
6
|
+
* src/self-implement/orchestrator.ts 의 DECLARED_NEW_FILES_LINE 와 같은 꼴을 쓴다.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// SCOPE-NEW-FILES-LINE — 칸 문면은 새로 만들 파일을 «신설:» 줄로 따로 적는다(OP D칸 규칙).
|
|
10
|
+
// orchestrator.ts 의 DECLARED_NEW_FILES_LINE 와 같은 정규식이다(한쪽만 읽으면 저작과 실행이 갈린다).
|
|
11
|
+
export const DECLARED_NEW_FILES_LINE = /^\s*(?:신설|new\s*files?)\s*[::]\s*(.*)$/i;
|
|
12
|
+
|
|
13
|
+
/** 목록 기호 «- »·굵게 «**» 는 장식이다 — 그것만 벗기고 같은 정규식으로 문는다. */
|
|
14
|
+
function bareDeclarationLine(line: string): string {
|
|
15
|
+
return line.replace(/^(?:\s*-\s+)+/, '').replace(/\*\*/g, '');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** 저장소 상대 파일 경로(확장자 있음)만 남긴다 — 디렉토리·절대 경로·「..」는 버린다. */
|
|
19
|
+
function isRepositoryFileCandidate(piece: string): boolean {
|
|
20
|
+
if (piece === '' || /\s/.test(piece)) return false;
|
|
21
|
+
if (piece.startsWith('/') || piece.startsWith('~') || /^[A-Za-z]:[\\/]/.test(piece)) return false;
|
|
22
|
+
if (piece.endsWith('/')) return false;
|
|
23
|
+
const segments = piece.split('/');
|
|
24
|
+
if (segments.some((segment) => segment === '' || segment === '.' || segment === '..')) return false;
|
|
25
|
+
return /\.[^./]+$/.test(segments[segments.length - 1]!);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** 문서 안 «신설:» 줄의 « · »·쉼표로 나뉜 경로를 모은다. «## NEW FILES» 같은 다른 형식은 읽지 않는다. */
|
|
29
|
+
export function declaredNewFilePaths(document: string): string[] {
|
|
30
|
+
const paths: string[] = [];
|
|
31
|
+
for (const rawLine of document.split(/\r?\n/)) {
|
|
32
|
+
const match = DECLARED_NEW_FILES_LINE.exec(bareDeclarationLine(rawLine));
|
|
33
|
+
if (!match) continue;
|
|
34
|
+
for (const fragment of match[1]!.split(/[·,]/)) {
|
|
35
|
+
// 실행 쪽 범위 검사(parseDeclaredTargetPathsFromAsk)와 같은 정규화 — 등 코드, ./ 접두.
|
|
36
|
+
const piece = fragment.trim().replace(/^`+|`+$/g, '').replace(/\\/g, '/').replace(/^\.\//, '');
|
|
37
|
+
if (!isRepositoryFileCandidate(piece)) continue;
|
|
38
|
+
paths.push(piece);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [...new Set(paths)];
|
|
42
|
+
}
|