elanous 0.2.42 → 0.2.44
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/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/08334415.f0e80896acbef722.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1032-78ba4f6391258cab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1082-53f86a26e03d309d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1109-7d0e264f6f2edbc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1124-7c26330402481143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2160.a097e7b138ae1c55.js → 118.2a89982fe4276880.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1244.6c435dbf1bf21d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1252.9e665904d3aa3b1a.js +32 -0
- package/apps/pwa/out/_next/static/chunks/1266.a46cc33cb6a72d75.js +104 -0
- package/apps/pwa/out/_next/static/chunks/1306.967240ede9a0f757.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 1401.22dfe92640a2b1ac.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/1431-f7c78bd5be21e011.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1451-cdd35a8a0b31834b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 1694.18debfd77562e56d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1708-f03d587b7a7545c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1775-fa7152bdeff6c95f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/178-4da509cd7266672a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1850-522de4ee34957210.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1876-c6f6e0ddcc76c6a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1976.097066b072432242.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1978.eeb60a606dc5deac.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2043.e233e3b5a3e790f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2150.71b94e3348107c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2158.ebc6fc5a10280ab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2216.802962c04f40a26e.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2294.7890edcfa046c97d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/235.c89aaae4bcd6233a.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{5885.0a3e52c8faccec98.js → 239.de075467b5523469.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/249.ba7051590d603c8f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/2571.a6ac4e26c8618403.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2610.e149cd564a08913e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2705.9816f3c244f8b85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2801.afeb8a4dae22f85f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2954.bbefc95d6b20e0d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e0f720a.a0697c08e3806a60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3042.96ec235fe41c8d4e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3097-8e358f158acef46b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3205-93b1abe28b4fb16a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3273.b4434f0dcae7eb29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3311.9cbc43ea0c90d60c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 3349.b5f09ee474d9533e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3503.a47a9755fb4d97b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3843.bad404d008893291.js +77 -0
- package/apps/pwa/out/_next/static/chunks/3877-4b40e530b47e3bf9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/435-ce2958253cf7de61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4393.28fa5228d0eec217.js +149 -0
- package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 4415-b9d6a90960920a4a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/447-5b304de1fe098f43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 4502.bdcc877abd437a05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-f95790fc5c65b8df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 46.57c783fa4884714f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/463-b9114e411f33728e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4659.a57d1f0c5d754cd2.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4722-a847e7a28115035f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 4757.67c6d7473a038e78.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4874-c86f878ec4502ad3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6377.bc7df239edbff244.js → 4891.3f80ba517a3b2373.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4998.810ca8833084caa9.js +62 -0
- package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5052.7dbb12a55d4f18f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5166-ca73b3e361085a6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5180-039f4a18b07ad387.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5232.5a2ce4daf7a9e11d.js +115 -0
- package/apps/pwa/out/_next/static/chunks/5439.3fec6dbce29ecb36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5612-074d9a5e00dfac6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5675-01989d524a84c505.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5751.af641a1adf5ec697.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5758-c6cb98714d18ab0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/578eded8.b582637306e16964.js +122 -0
- package/apps/pwa/out/_next/static/chunks/5790.5eb06a653ebd8571.js +34 -0
- package/apps/pwa/out/_next/static/chunks/5853-4033e5bd5afbe06b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5904.97d70bb7f46b2db7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 5989.7ecd362c5c44b747.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 5a5078f8.2099200e5ea95e16.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6036-c302c34ff0b3d410.js +1 -0
- package/apps/pwa/out/_next/static/chunks/606.ef81c313381f4264.js +1 -0
- package/apps/pwa/out/_next/static/chunks/616.1af54a928b1ba704.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6201.bc936f71f613a8e9.js +41 -0
- package/apps/pwa/out/_next/static/chunks/6204-fdc86e0e64c4f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 6245.1182e007e9d230d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 63699a35.17262e162bc514b2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6420.494801a80030160c.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → 6549dad0.2740b25e51bf8f05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 6881.9e7955847640c7fe.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/6931.fcdfb94141e67b3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6991-8e081c6ce38c0ba1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7010.1bbd17a7f2b3e376.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7029.d1466acf55fae2ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7152-a123aa8e129c131f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7455.196168fffac3b9c4.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7638.6ca4770dd1129138.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7649-f37d76260e5e2a5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7679.32c40cdd14f20b4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7751.04bfbd16b4c6cd0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7864.b1ff31d4030b8994.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7869-c47bd2c075c1fefa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 8442.2f09ca969d631615.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8445.2738dbd59a78c78c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8447.5510c439f9938c6d.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{9415.69e4a21c60c7d2db.js → 8551.f762945c2cda2e95.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/86961958-4b0689a5048f756b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8709.3c6019bb18f8554f.js +8 -0
- package/apps/pwa/out/_next/static/chunks/8759.c999528a0a907bf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9a852a62-6192a6ea9346ced3.js → 87f498e5-0881de09f2e44707.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → 892fd990.456232f326cc39c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8965-135a2c9eaa2464cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8971-8d3b9c96f8a6c958.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9059.c8598d96f8e5e9cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9115.90447ae198b84eae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9147.d9b0a02e0babc9b4.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9204-83075f4b70c61cdc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9244-c32ef14b5dc72bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/930.2a9a30f964350c66.js +90 -0
- package/apps/pwa/out/_next/static/chunks/9398.1f56e3f17795f43f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9527.3e5ad31c891c5fcb.js +79 -0
- package/apps/pwa/out/_next/static/chunks/9571-4ac933e774d1225c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-0c9dace2db62bee8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f5e65c3dc9d89f2a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-2a9c19b9a140b7b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-61533ad92141adfb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-112004ced6fd0329.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f733318c237a49d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-51ea677d2d33bbc0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-428b41f2f9566e3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-1b29396ea90a61e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-cf83ec613ac904bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-3f4c0ecbc284bb5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-b63c322f54f70cc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-fe328c4ee9aac6b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-bfb855c584f0fb98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-47b1710c110eabd7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-42895214458bc6d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-d03de0ebd8366e23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-3ed6c47e4b1c61c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-ae653e9bf261c738.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-23f3f0a0209c0ac4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-88c691273aae66f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e187ac52a95538b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-6e45828daed1295e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-edb5d7287bb46186.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4a7eaacd93c3f6a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ca073d43d74cc84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1e9fee67b1199436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-df1283ea963c6816.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-19fcf8d8301ccd18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-5ab699e0303bbb40.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7cde0d29756984c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9d4c598e8ee22f7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-cc1609a71f44ec62.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7659a9a1345bfaa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0afef60ecc0c4af5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-a3553949f8f34f5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-9fc644de2d8edae3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-057a69702f3c67c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-c0f0e570f3f74c73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-1825071ae34e3b89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-6244e3e135d8ccfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-da787e8a10b8a82e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-1316d32498e2be42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-4df94572e343de2e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-708969f7475e88c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-c58add08c919a1dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-a24847f45e5d5bf9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-acfec65a3a60e22e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-3dfc598e6fbde245.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-c658a626118411b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-4c73685fd891445b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-6310f7e5de7dd01d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-51c326bf48610be1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-d0beadf754da59b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-acd243bfbf3f6732.js +1 -0
- package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +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/external-commands.yaml +5 -3
- package/catalog/meta/catalogVersion.yaml +2 -1
- package/catalog/signing/catalog-signing-public.pem +3 -0
- package/graphs/intake/intake-daily.yaml +16 -0
- package/graphs/intake/news-sources.yaml +1 -0
- package/graphs/intake/recipes.yaml +7 -0
- package/graphs/overlays/README.md +6 -0
- package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
- package/graphs/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -0
- package/graphs/release/release-loop.yaml +33 -17
- package/graphs/units/verbs/make-doc.yaml +1 -0
- package/package.json +6 -2
- package/plugins/demo-absorption-briefing/plugin.json +18 -0
- package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
- package/plugins/demo-browser-hand/plugin.json +13 -0
- package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
- package/plugins/demo-linear-secretary/plugin.json +15 -0
- package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
- package/plugins/demo-plugin-wizard/plugin.json +11 -0
- package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
- package/plugins/demo-research/plugin.json +16 -0
- package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
- package/plugins/demo-video-briefing/plugin.json +15 -0
- package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
- package/scripts/bench-metering-plan.ts +229 -0
- package/scripts/build-signed-catalog.ts +48 -0
- package/scripts/ci-typecheck-main-delta.sh +88 -0
- package/scripts/codex-fallback-live-probe.ts +1 -1
- package/scripts/demo/demo1104-parallel-host.ts +56 -0
- package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
- package/scripts/demo/demo1104-parallel.ts +72 -0
- package/scripts/demo/demo1104-stage.config.ts +21 -0
- package/scripts/demo/demo1104-stage.ts +316 -0
- package/scripts/goal-method-audit.ts +17 -1
- package/scripts/graph-units/land-enqueue.ts +90 -0
- package/scripts/hooks/codex-notify.sh +32 -0
- package/scripts/install.sh +10 -38
- package/scripts/landing-heal/land-plan.ts +57 -0
- package/scripts/public-leak-baseline.txt +0 -1
- package/scripts/release-loop/auto-approve-node.ts +1 -1
- package/scripts/release-loop/docs-node.ts +4 -2
- package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
- package/scripts/release-loop/gate-image-pin.ts +116 -2
- package/scripts/release-loop/gate-method.ts +139 -0
- package/scripts/release-loop/gate-node.ts +395 -43
- package/scripts/release-loop/gate-progress-sim.ts +73 -0
- package/scripts/release-loop/gate-traffic-mode.ts +151 -3
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/notes-repair.ts +18 -1
- package/scripts/release-loop/preflight.ts +544 -10
- package/scripts/release-loop/render-warm-control-manifest.ts +22 -0
- package/scripts/release-loop/resume-release.ts +9 -7
- package/scripts/release-loop/resume.ts +13 -4
- package/scripts/release-loop/unattended-release.ts +20 -9
- package/scripts/release-loop/warm-control-forward.ts +178 -0
- package/scripts/retro-cycle.ts +30 -8
- package/scripts/rhythm/daily.ts +39 -4
- package/scripts/rhythm/linear-progress-sync.ts +311 -0
- package/scripts/ux-sim.ts +7 -1
- package/scripts/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +35 -7
- package/src/acp/agent-manager.ts +1 -0
- package/src/acp/codex-app-server-agent.ts +33 -0
- package/src/acp/codex-app-server-client.ts +153 -16
- package/src/acp/core-turn-bridge.ts +17 -12
- package/src/acp/event-router.ts +20 -1
- package/src/acp/server.ts +6 -0
- package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
- package/src/agent-mission/claude-headless.ts +4 -1
- package/src/agent-mission/codex-exec.ts +105 -0
- package/src/agent-mission/driver.ts +192 -11
- package/src/agent-mission/grok-auth-status.ts +107 -0
- package/src/agent-mission/hand-hooks.ts +101 -0
- package/src/agent-mission/mission-cli.ts +56 -21
- package/src/agent-mission/mission-hand-reply.ts +118 -0
- package/src/agent-mission/mission-line.ts +180 -0
- package/src/agent-mission/mission-out.ts +256 -18
- package/src/agent-mission/tool-install.ts +122 -11
- package/src/agent-substrate/pr-reviewer.ts +147 -11
- package/src/agent-substrate/self-review-cli.ts +10 -2
- package/src/agents/general-purpose.md +1 -1
- package/src/auto-research/research-fanout.ts +221 -0
- package/src/auto-research/research-turn.ts +362 -31
- package/src/autopilot/mission-codebase-gate.ts +7 -3
- package/src/autopilot/pr-manager.ts +31 -3
- package/src/boot/daemon-tools/self-implement.ts +3 -1
- package/src/boot/daemon-tools/web-search.ts +1 -2
- package/src/briefing/brief-items.ts +55 -11
- package/src/cli/agent-cli.ts +2 -1
- package/src/cli/catalog-cli.ts +31 -0
- package/src/cli/connector-cli.ts +16 -0
- package/src/cli/control-cli.ts +15 -6
- package/src/cli/doctor-fix.ts +2 -2
- package/src/cli/intake-source-cli.ts +44 -8
- package/src/cli/log-event-names.ts +8 -0
- package/src/cli/msg-cli.ts +32 -3
- package/src/cli/pr-cli.ts +21 -1
- package/src/cli/pr-land-heavy-remote.ts +44 -6
- package/src/cli/pr-land-overlap-evidence.ts +13 -1
- package/src/cli/pr-land-pod-shadow-job.ts +143 -5
- package/src/cli/pr-land-pod-shadow.ts +9 -2
- package/src/cli/release-checklist-read-cli.ts +44 -16
- package/src/cli/release-cli.ts +23 -3
- package/src/cli/research-cli.ts +9 -0
- package/src/cli/setup-cli.ts +166 -6
- package/src/cli/setup-keys.ts +199 -0
- package/src/cli/task-plugin-wizard-host.ts +114 -0
- package/src/cli/tasks-cli.ts +54 -9
- package/src/cli/tui-test-cli.ts +190 -0
- package/src/config.ts +4 -2
- package/src/connectors/linear-daily-progress.ts +228 -0
- package/src/connectors/linear-projector.ts +34 -12
- package/src/connectors/linear.ts +151 -7
- package/src/control-plane/ledger.ts +42 -4
- package/src/control-plane/member-tokens.ts +25 -2
- package/src/control-plane/ports.ts +8 -3
- package/src/control-plane/server.ts +26 -5
- package/src/core-turn/deep-turn-bloom.ts +67 -0
- package/src/core-turn/research-policy.ts +43 -0
- package/src/core-turn/run-core-turn.ts +488 -51
- package/src/core-turn/types.ts +4 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +192 -0
- package/src/dashboard/classic-sidetab-mission-pair.ts +82 -0
- package/src/dashboard/classic-sidetab-mission-trio.ts +242 -0
- package/src/dashboard/classic-sidetab-mission.ts +169 -5
- package/src/dashboard/index.ts +387 -14
- package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
- package/src/dashboard/mission-cli-consumer.ts +20 -8
- package/src/dashboard/plugin-wizard-runtime.ts +50 -0
- package/src/dashboard/plugin-wizard-tool.ts +55 -0
- package/src/dashboard/sidetab-runtime.ts +3 -1
- package/src/dashboard/terminal-popup-runtime.ts +6 -3
- package/src/dashboard/visible-mission-diagnostics.ts +16 -0
- package/src/decisions/linear-progress-summary.ts +78 -0
- package/src/decisions/linear-progress-sync.ts +152 -0
- package/src/domains/outbound-alert.ts +49 -11
- package/src/domains/retro-cycle-observation.ts +43 -0
- package/src/domains/retro-cycle.ts +13 -2
- package/src/domains/retro-proposals.ts +92 -0
- package/src/domains/retro-report.ts +6 -1
- package/src/domains/telegram-kind-route.ts +16 -9
- package/src/graph-runner/arg-allowance.ts +13 -0
- package/src/graph-runner/graph-cli.ts +24 -1
- package/src/graph-runner/graph-grow-llm.ts +3 -1
- package/src/graph-runner/graph-run-api.ts +3 -1
- package/src/graph-runner/runner.ts +310 -46
- package/src/graph-wizard/mission-compose.ts +407 -12
- package/src/harness/dispatch-backpressure.ts +54 -1
- package/src/harness/dispatch-shadow-compare.ts +74 -0
- package/src/harness/harness-cli-command.ts +15 -3
- package/src/harness/harness-pod-dispatch.ts +3 -0
- package/src/harness/skill-exec.ts +21 -9
- package/src/harness/skill-select.ts +1 -1
- package/src/hooks/error-report-cloud.ts +101 -0
- package/src/hooks/receiver.ts +29 -2
- package/src/index.ts +129 -12
- package/src/intake-plane/actions.ts +354 -0
- package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
- package/src/intake-plane/intake-sources.ts +78 -8
- package/src/intake-plane/items.ts +14 -4
- package/src/intake-plane/linear-mission-sync.ts +80 -0
- package/src/intake-plane/linear-secretary-runtime.ts +178 -0
- package/src/intake-plane/linear-wish.ts +227 -1
- package/src/life/life-cli.ts +168 -0
- package/src/life/life-kinds.ts +160 -0
- package/src/live-supply/budget-consumer.ts +78 -0
- package/src/live-supply/read.ts +3 -0
- package/src/live-supply/snapshot.ts +45 -0
- package/src/llm/child-first-llm-observation.ts +112 -0
- package/src/llm/provider-credentials.ts +68 -6
- package/src/llm/provider-failure-evidence.ts +44 -0
- package/src/llm.ts +172 -12
- package/src/maturity/feature-maturity.ts +3 -3
- package/src/mcp/client.ts +7 -0
- package/src/mcp/proxy-runtime.ts +6 -1
- package/src/mcp/server.ts +54 -0
- package/src/msg/msg-sse-server.ts +3 -3
- package/src/msg/msg-store.ts +177 -19
- package/src/native-tool-catalog.ts +36 -2
- package/src/nexus/api/consult-requests.ts +18 -6
- package/src/nexus/api/discord-trigger-bot.ts +6 -6
- package/src/nexus/api/graphs-api.ts +4 -2
- package/src/nexus/api/grokbot-trigger-bot.ts +206 -0
- package/src/nexus/api/http-server.ts +37 -1
- package/src/nexus/api/mcp-public-allowlist.ts +2 -0
- package/src/nexus/api/telegram-trigger-bot.ts +6 -6
- package/src/nexus/boot/register-mcp-clients.ts +114 -8
- package/src/nexus/index.ts +22 -2
- package/src/nexus/outbound/format.ts +9 -0
- package/src/nexus/outbound/grokbot-adapter.ts +71 -0
- package/src/nexus/outbound/router.ts +121 -16
- package/src/nexus/setup-status.ts +9 -0
- package/src/nexus/state/state.ts +3 -0
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-owner-mirror.ts +81 -0
- package/src/oauth/codex.ts +17 -2
- package/src/oauth/fallback-chain.ts +47 -17
- package/src/onboarding/first-run-doctor.ts +8 -1
- package/src/onboarding/first-run.ts +126 -29
- package/src/onboarding/key-setup.ts +103 -0
- package/src/onboarding/menu-answer.ts +13 -0
- package/src/onboarding/secret-prompt.ts +37 -0
- package/src/plugins/install/plugin-install.ts +59 -0
- package/src/pr-tool/census.ts +130 -0
- package/src/preview/terminal.ts +22 -7
- package/src/prompt-enhance/enhance.ts +10 -0
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-write-provenance.ts +21 -3
- package/src/pty-shell/registry.ts +9 -2
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -2
- package/src/release-loop/proposal-auto-place.ts +83 -0
- package/src/research/axis-fanout.ts +79 -29
- package/src/research/lenses/second-order.ts +312 -0
- package/src/self-dev/ask-launch-flow.ts +72 -1
- package/src/self-dev/dev-cli.ts +7 -2
- package/src/self-dev/dev-pipeline.ts +5 -0
- package/src/self-dev/draft-residue.ts +64 -5
- package/src/self-dev/draft-sweep.ts +31 -10
- package/src/self-dev/draft-triage-rules.ts +60 -3
- package/src/self-dev/graph-front-nodes.ts +2 -1
- package/src/self-dev/graph-journey-route.ts +76 -21
- package/src/self-dev/launch-preflight.ts +58 -0
- package/src/self-dev/orchestrate.ts +1 -1
- package/src/self-dev/run-supervisor.ts +152 -2
- package/src/self-dev/shard-aggregate.ts +4 -0
- package/src/self-dev/shard-run.ts +36 -15
- package/src/self-implement/abandoned-classification.ts +12 -3
- package/src/self-implement/budget-gate.ts +7 -0
- package/src/self-implement/child-llm-preference.ts +10 -1
- package/src/self-implement/doctor-visit.ts +30 -8
- package/src/self-implement/elanous-tui-spawn.ts +3 -0
- package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
- package/src/self-implement/gate-artifacts.ts +2 -1
- package/src/self-implement/goal-author-cli.ts +4 -2
- package/src/self-implement/goal-author.ts +549 -10
- package/src/self-implement/graph-overlay-yaml.ts +181 -4
- package/src/self-implement/graph-overlay.ts +3 -1
- package/src/self-implement/graph-profile-yaml.ts +107 -0
- package/src/self-implement/graph-yaml.ts +94 -5
- package/src/self-implement/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +298 -26
- package/src/self-implement/run-chart.ts +6 -3
- package/src/self-implement/run-ledger.ts +51 -1
- package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
- package/src/self-implement/tdd-evidence-tags.ts +9 -0
- package/src/self-implement/test-scenario-request.ts +37 -6
- package/src/self-implement/train-gate-receipt.ts +166 -0
- package/src/self-implement/train-gate-remote.ts +62 -18
- package/src/session/chat.ts +6 -4
- package/src/session/session-fanout.ts +2 -0
- package/src/session/streaming/acp-stream-sink.ts +2 -1
- package/src/session/streaming/chunk-producer.ts +6 -0
- package/src/session/streaming/stream-compositor.ts +3 -2
- package/src/session-runtime/index.ts +74 -6
- package/src/session-runtime/retry-policy.ts +1 -1
- package/src/setup/llm-env-detect.ts +3 -0
- package/src/setup/service-key-catalog.ts +46 -0
- package/src/setup/service-keys.ts +241 -0
- package/src/sidetab-core/model.ts +205 -10
- package/src/sidetab-core/visible-agent-mission-pair.ts +51 -0
- package/src/sidetab-core/visible-agent-mission.ts +182 -48
- package/src/skills/tools/agent.ts +23 -4
- package/src/skills/tools/omni-search.ts +127 -27
- package/src/task-agent/parent-host.ts +29 -1
- package/src/task-agent/recall-inject.ts +98 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +46 -14
- package/src/task-orchestrator/dispatcher.ts +14 -1
- package/src/task-orchestrator/linear-capture-events.ts +55 -0
- package/src/task-orchestrator/store.ts +16 -5
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +23 -1
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +107 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +467 -77
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +210 -14
- package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
- package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
- package/src/task-orchestrator/types.ts +14 -0
- package/src/telegram.ts +14 -16
- package/src/terminal/coding-agent.ts +14 -5
- package/src/terminal/session-registry.ts +1 -1
- package/src/tool-hints/gate.ts +46 -14
- package/src/tool-hints/signals.ts +1 -1
- package/src/tool-hints/types.ts +2 -0
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/browser-hand-runtime.ts +391 -0
- package/src/tool-runtime/browser-runtime.ts +33 -19
- package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
- package/src/tool-runtime/elanous-linear-secretary-runtime.ts +173 -0
- package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
- package/src/tool-runtime/index.ts +6 -0
- package/src/tool-runtime/types.ts +5 -0
- package/src/tui/entry.ts +51 -8
- package/src/tui/sidetab/attach.ts +252 -11
- package/src/tui/sidetab/herdr-portal.ts +225 -0
- package/src/tui/sidetab/list.ts +3 -2
- package/src/tui-client/next-dashboard-runtime.ts +52 -0
- package/src/user-config.ts +34 -9
- package/src/user-intent/types.ts +4 -3
- package/src/ux-sim/browser-hand.ts +165 -0
- package/src/ux-sim/draft-inventory-builder.ts +199 -0
- package/src/ux-sim/fake-browser-page.ts +81 -0
- package/src/ux-sim/fake-linear-device.ts +31 -0
- package/src/ux-sim/graph-engine-sim.ts +47 -0
- package/src/ux-sim/linear-secretary.ts +208 -0
- package/src/ux-sim/mock-scenario-catalog.json +81 -26
- package/src/ux-sim/mock-scenario-catalog.ts +175 -5
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/release-sim-rig.ts +62 -18
- package/src/ux-sim/scenario.ts +70 -26
- package/src/ux-sim/service-key-setup.ts +113 -0
- package/src/ux-sim/term-slash-device.ts +74 -0
- package/src/ux-sim/turn-throw-sim.ts +31 -0
- package/src/version/packed-revision.json +1 -1
- package/src/web-search/exa.ts +77 -0
- package/src/web-search/index.ts +30 -9
- package/src/web-search/provider.ts +4 -1
- package/src/web-search/x-intent.ts +5 -0
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +0 -115
- package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3207.a756c95e9ec8c3c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
- package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
- package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9656-374232558fd528d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
- package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
- /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
|
@@ -8,7 +8,7 @@ export type { SupervisorStopReason } from './run-types.js';
|
|
|
8
8
|
export { SUPERVISOR_STOP_REASONS } from './run-types.js';
|
|
9
9
|
import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
|
|
10
10
|
import { readRunChart, recordRunChartDecision } from '../self-implement/run-chart.js';
|
|
11
|
-
import { runLedgerDir } from '../self-implement/run-ledger.js';
|
|
11
|
+
import { loadRunLedger, runLedgerDir } from '../self-implement/run-ledger.js';
|
|
12
12
|
import { debug } from '../debug/log.js';
|
|
13
13
|
import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
|
|
14
14
|
import { selectKnowhowPack } from '../self-implement/knowhow-pack.js';
|
|
@@ -105,6 +105,25 @@ interface DecomposePromotionObservation {
|
|
|
105
105
|
hotPathEdges?: number;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
export interface SupervisorReauthorObservation {
|
|
109
|
+
round: number;
|
|
110
|
+
classifications: Array<{ taskId: string; text: string; kind: 'code-defect' | 'authorship-defect'; action: 'must-fix' | 'scope-reduction-fu' }>;
|
|
111
|
+
prescription: {
|
|
112
|
+
outcome: '부분 착지 + FU';
|
|
113
|
+
narrowedProposal: string;
|
|
114
|
+
partialLanding: string;
|
|
115
|
+
followUp: {
|
|
116
|
+
lane: 'REVIEW-ROUND-REAUTHOR-FU';
|
|
117
|
+
goalId: string;
|
|
118
|
+
feature: string;
|
|
119
|
+
targetPaths: string[];
|
|
120
|
+
completionBoundary: string;
|
|
121
|
+
mockScenarioId: string;
|
|
122
|
+
mockScenario: { id: string; injection: string; observation: string };
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
108
127
|
export interface SupervisorDecision {
|
|
109
128
|
action: 'relaunch' | 'add-repair-task' | 'stop';
|
|
110
129
|
stopReason?: SupervisorStopReason;
|
|
@@ -130,6 +149,8 @@ export interface SupervisorDecision {
|
|
|
130
149
|
reviewMustFixTrend: ReviewRework['trend'];
|
|
131
150
|
/** REVIEW-MUSTFIX-CLASSIFY — this round's leading must-fix class (② › ③ observed › ①); omitted when unmeasured (지금 동작 그대로). */
|
|
132
151
|
mustFix?: MustFixRoundClassification;
|
|
152
|
+
/** REVIEW-ROUND-REAUTHOR — supervisory reauthoring decision, omitted for ordinary/legacy rounds. */
|
|
153
|
+
reauthor?: SupervisorReauthorObservation;
|
|
133
154
|
/** REVIEW-MUSTFIX-CLASSIFY — every oscillating task's measured class, so a mixed round keeps each task's decision. */
|
|
134
155
|
mustFixByTask?: Record<string, MustFixRoundClassification>;
|
|
135
156
|
/**
|
|
@@ -367,6 +388,70 @@ function mustFixFromResults(results: readonly SupervisorJobResult[]): MustFixRou
|
|
|
367
388
|
return items.length > 0 ? { items } : {};
|
|
368
389
|
}
|
|
369
390
|
|
|
391
|
+
function authoringDefect(text: string): boolean {
|
|
392
|
+
return /(?:불필요한\s*(?:경계|목표)|아직\s*없는\s*(?:부품|운영|배선)|미구현\s*(?:부품|운영|배선)|실물\s*전제|미래\s*가정|out[- ]of[- ]scope|not yet existing|future assumption)/iu.test(text);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
function repeatedMustFix(text: string, taskId: string, history: readonly SupervisorRound[]): boolean {
|
|
396
|
+
const normalized = text.trim().replace(/\s+/gu, ' ').toLowerCase();
|
|
397
|
+
return history.filter((round) => round.mustFix?.items?.some((item) => item.taskId === taskId
|
|
398
|
+
&& item.text.trim().replace(/\s+/gu, ' ').toLowerCase() === normalized)).length >= 1;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function reauthorObservation(results: readonly SupervisorJobResult[], history: readonly SupervisorRound[]): SupervisorReauthorObservation | undefined {
|
|
402
|
+
const reviewed = results.flatMap((result) => (result.reviewMustFix ?? []).map((text) => ({ result, text })));
|
|
403
|
+
if (!reviewed.length) return undefined;
|
|
404
|
+
const rounds = Math.max(...reviewed.map(({ result }) => result.rework?.rounds ?? 0));
|
|
405
|
+
const classified = reviewed.map(({ result, text }) => ({ result, text, authored: authoringDefect(text) }));
|
|
406
|
+
const triggered = classified.some(({ result, text }) => (result.rework?.rounds ?? 0) > 3
|
|
407
|
+
|| repeatedMustFix(text, result.taskId, history));
|
|
408
|
+
if (!triggered) return undefined;
|
|
409
|
+
const round = Math.max(rounds, history.length + 1);
|
|
410
|
+
const classifications = classified.map(({ result, text, authored }) => ({
|
|
411
|
+
taskId: result.taskId, text, kind: authored ? 'authorship-defect' as const : 'code-defect' as const,
|
|
412
|
+
action: authored ? 'scope-reduction-fu' as const : 'must-fix' as const,
|
|
413
|
+
}));
|
|
414
|
+
const authored = classified.filter((item) => item.authored);
|
|
415
|
+
const targetPaths = [...new Set(authored.flatMap(({ result }) => result.targetPaths ?? []))];
|
|
416
|
+
const narrowedProposal = authored.length
|
|
417
|
+
? `골·칸·시험에서 제거: ${authored.map(({ text }) => text).join(' · ')}`
|
|
418
|
+
: '현재 목표와 완료 경계에 한정하고 리뷰에서 확인된 코드 결함만 수정한다';
|
|
419
|
+
return {
|
|
420
|
+
round, classifications,
|
|
421
|
+
prescription: {
|
|
422
|
+
outcome: '부분 착지 + FU', narrowedProposal,
|
|
423
|
+
partialLanding: `현재 완결 가능한 범위만 착지한다${targetPaths.length ? ` — ${targetPaths.join(', ')}` : ''}`,
|
|
424
|
+
followUp: {
|
|
425
|
+
lane: 'REVIEW-ROUND-REAUTHOR-FU',
|
|
426
|
+
goalId: `reauthor-fu-${authored[0]?.result.prNumber ?? authored[0]?.result.taskId ?? 'unbound'}`,
|
|
427
|
+
feature: `저작 결함을 제외한 완결 범위를 구현하고 검증한다 — ${narrowedProposal}`,
|
|
428
|
+
targetPaths,
|
|
429
|
+
completionBoundary: targetPaths.length ? `대상 경로: ${targetPaths.join(', ')}; 완료 경계: 해당 경로 내 범위` : '대상 경로 및 완료 경계는 다음 저작에서 재접지한다',
|
|
430
|
+
mockScenarioId: 'MS-03',
|
|
431
|
+
mockScenario: {
|
|
432
|
+
id: 'MS-03',
|
|
433
|
+
injection: `기존 리뷰 결과 주입: ${authored.map(({ text }) => text).join(' · ') || '반복 must-fix 재검토'}`,
|
|
434
|
+
observation: '제외된 저작 결함이 must-fix 목록에 없고, 부분 착지 및 FU 완료 경계가 관측된다',
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
function reauthorMustFixes(results: readonly SupervisorJobResult[], observation: SupervisorReauthorObservation | undefined): SupervisorJobResult[] {
|
|
442
|
+
if (!observation) return [...results];
|
|
443
|
+
const excluded = new Map<string, Set<string>>();
|
|
444
|
+
for (const item of observation.classifications) {
|
|
445
|
+
if (item.kind !== 'authorship-defect') continue;
|
|
446
|
+
const texts = excluded.get(item.taskId) ?? new Set<string>();
|
|
447
|
+
texts.add(item.text);
|
|
448
|
+
excluded.set(item.taskId, texts);
|
|
449
|
+
}
|
|
450
|
+
return results.map((result) => ({ ...result,
|
|
451
|
+
reviewMustFix: (result.reviewMustFix ?? []).filter((text) => !excluded.get(result.taskId)?.has(text)),
|
|
452
|
+
}));
|
|
453
|
+
}
|
|
454
|
+
|
|
370
455
|
/**
|
|
371
456
|
* REVIEW-MUSTFIX-CLASSIFY — per-task class. `prev` is the preceding round's items of the same task or its repair
|
|
372
457
|
* lineage (`oscillationRepairOf`), and only when that preceding round authored a repair for it — «수리 뒤 같은 지적»
|
|
@@ -470,8 +555,9 @@ type DecideNextRunInput = {
|
|
|
470
555
|
};
|
|
471
556
|
|
|
472
557
|
function decideNextRunCore(input: DecideNextRunInput): SupervisorDecision {
|
|
473
|
-
const results = [...input.results];
|
|
474
558
|
const history = [...(input.history ?? [])];
|
|
559
|
+
const reauthor = reauthorObservation(input.results, history);
|
|
560
|
+
const results = reauthorMustFixes(input.results, reauthor);
|
|
475
561
|
const maxRounds = input.limits?.maxRounds ?? DEFAULT_MAX_ROUNDS;
|
|
476
562
|
const stallRounds = input.limits?.stallRounds ?? DEFAULT_STALL_ROUNDS;
|
|
477
563
|
const observation = input.deliverableObservation
|
|
@@ -537,6 +623,7 @@ function decideNextRunCore(input: DecideNextRunInput): SupervisorDecision {
|
|
|
537
623
|
deliverableUnmeasured: t.deliverableUnmeasured,
|
|
538
624
|
deliverableMergeCompleteness,
|
|
539
625
|
reviewMustFixTrend,
|
|
626
|
+
...(reauthor ? { reauthor } : {}),
|
|
540
627
|
rerunnable: t.rerunnable,
|
|
541
628
|
reworkable: t.reworkable,
|
|
542
629
|
decomposable: t.decomposable,
|
|
@@ -983,6 +1070,7 @@ export function appendRound(
|
|
|
983
1070
|
...(baseCompleted > 0 || base !== undefined ? { baseCompleted, ...(base === undefined ? {} : { base }) } : {}),
|
|
984
1071
|
actionable: countActionable(t),
|
|
985
1072
|
...(reviewMustFixTrend === undefined ? {} : { reviewMustFixTrend }),
|
|
1073
|
+
...(decision?.reauthor ? { reauthor: decision.reauthor } : {}),
|
|
986
1074
|
...((mustFix.items ?? []).length > 0 ? { mustFix } : {}),
|
|
987
1075
|
...(Object.keys(lostTimeMsByTask).length > 0 ? { lostTimeMsByTask } : {}),
|
|
988
1076
|
...(unknownTimeTaskIds.size > 0 ? { unknownTimeTaskIds: [...unknownTimeTaskIds] } : {}),
|
|
@@ -1250,6 +1338,55 @@ export interface SuperviseRunOptions {
|
|
|
1250
1338
|
}>;
|
|
1251
1339
|
}
|
|
1252
1340
|
|
|
1341
|
+
/** Adapt REVIEW-ROUND-REAUTHOR's decision into an observation without duplicating its classification logic. */
|
|
1342
|
+
export function supervisorReauthorRequestObservations(
|
|
1343
|
+
decision: SupervisorDecision,
|
|
1344
|
+
parentRunId: string | null,
|
|
1345
|
+
results: readonly SupervisorJobResult[],
|
|
1346
|
+
resolveAuthorRunId: (ledgerRunId: string) => string | null = (ledgerRunId) => {
|
|
1347
|
+
try {
|
|
1348
|
+
const entries = loadRunLedger(ledgerRunId);
|
|
1349
|
+
for (const entry of [...(entries ?? [])].reverse()) {
|
|
1350
|
+
const authorRunId = entry.event === 'goal-authored' ? entry.data.authorRunId : undefined;
|
|
1351
|
+
if (typeof authorRunId === 'string' && authorRunId.trim()) return authorRunId;
|
|
1352
|
+
}
|
|
1353
|
+
} catch { /* an absent or unreadable lineage ledger leaves this event unjoined */ }
|
|
1354
|
+
return null;
|
|
1355
|
+
},
|
|
1356
|
+
): Array<{ event: 'supervisor.reauthor-request' | 'supervisor.reauthor-unjoined'; data: Record<string, unknown> }> {
|
|
1357
|
+
const reauthor = decision.reauthor;
|
|
1358
|
+
if (!reauthor) return [];
|
|
1359
|
+
return reauthor.classifications.flatMap((classification): Array<{ event: 'supervisor.reauthor-request' | 'supervisor.reauthor-unjoined'; data: Record<string, unknown> }> => {
|
|
1360
|
+
if (classification.kind !== 'authorship-defect') return [];
|
|
1361
|
+
const result = results.find((candidate) => candidate.taskId === classification.taskId);
|
|
1362
|
+
const sourceReviewRunId = result?.runId;
|
|
1363
|
+
const authorRunId = (parentRunId ? resolveAuthorRunId(parentRunId) : null)
|
|
1364
|
+
?? (sourceReviewRunId ? resolveAuthorRunId(sourceReviewRunId) : null);
|
|
1365
|
+
if (!authorRunId) return [{
|
|
1366
|
+
event: 'supervisor.reauthor-unjoined',
|
|
1367
|
+
data: {
|
|
1368
|
+
...(parentRunId ? { parentRunId } : {}),
|
|
1369
|
+
...(sourceReviewRunId ? { sourceReviewRunId } : {}),
|
|
1370
|
+
taskId: classification.taskId,
|
|
1371
|
+
attempt: reauthor.round,
|
|
1372
|
+
classification: 'authorship-defect',
|
|
1373
|
+
reason: 'author-run-id-unresolved',
|
|
1374
|
+
},
|
|
1375
|
+
}];
|
|
1376
|
+
return [{
|
|
1377
|
+
event: 'supervisor.reauthor-request' as const,
|
|
1378
|
+
data: {
|
|
1379
|
+
conversationId: authorRunId,
|
|
1380
|
+
runId: authorRunId,
|
|
1381
|
+
...(parentRunId ? { parentRunId } : {}),
|
|
1382
|
+
...(sourceReviewRunId ? { sourceReviewRunId } : {}),
|
|
1383
|
+
attempt: reauthor.round,
|
|
1384
|
+
classification: 'authorship-defect',
|
|
1385
|
+
},
|
|
1386
|
+
}];
|
|
1387
|
+
});
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1253
1390
|
type SupervisorStopStorageSource = 'operator-dir' | 'run-store-dir' | 'process-default';
|
|
1254
1391
|
|
|
1255
1392
|
function resolveSupervisorStopStorage(runStore: SuperviseRunOptions['runStore']): {
|
|
@@ -1345,6 +1482,15 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1345
1482
|
...(allUnreviewedAreNoDiff ? { reviewReason: 'no-diff' } : {}),
|
|
1346
1483
|
} : {}),
|
|
1347
1484
|
});
|
|
1485
|
+
if (decision.reauthor) {
|
|
1486
|
+
try {
|
|
1487
|
+
opts.observe?.('review.reauthor', {
|
|
1488
|
+
round: decision.reauthor.round,
|
|
1489
|
+
classifications: decision.reauthor.classifications,
|
|
1490
|
+
prescription: decision.reauthor.prescription,
|
|
1491
|
+
});
|
|
1492
|
+
} catch { /* fail-open */ }
|
|
1493
|
+
}
|
|
1348
1494
|
if (chartRunId) {
|
|
1349
1495
|
recordRunChartDecision({ runId: chartRunId, device: 'outer-supervisor',
|
|
1350
1496
|
stopKey: `${chartRunId}:outer-supervisor:${history.length + 1}`, observed: `results=${results.length}`,
|
|
@@ -1382,6 +1528,10 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1382
1528
|
|
|
1383
1529
|
const runId = chartRunId;
|
|
1384
1530
|
|
|
1531
|
+
for (const request of supervisorReauthorRequestObservations(decision, runId, results)) {
|
|
1532
|
+
try { opts.observe?.(request.event, request.data); } catch { /* observation is fail-soft */ }
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1385
1535
|
let decomposePromotion: DecomposePromotionObservation = decision.decomposable.length === 0
|
|
1386
1536
|
? { attempted: false, reason: 'no-decomposable-decision' }
|
|
1387
1537
|
: decision.action === 'stop'
|
|
@@ -12,6 +12,10 @@ import type { GateTestShard } from './shard-plan.js';
|
|
|
12
12
|
export interface GateShardAttempt {
|
|
13
13
|
shardId: string;
|
|
14
14
|
attempt: number;
|
|
15
|
+
/** Wall time for this shard attempt across current and baseline processes. */
|
|
16
|
+
elapsedMs?: number;
|
|
17
|
+
currentUnmeasuredReason?: string;
|
|
18
|
+
baselineUnmeasuredReason?: string;
|
|
15
19
|
/** A process death, missing report, or incomplete XML is not a test failure. */
|
|
16
20
|
currentJUnit?: string;
|
|
17
21
|
baselineJUnit?: string;
|
|
@@ -130,6 +130,8 @@ export function maxAutomaticShardCount(requested: number, budgetGiB: number, res
|
|
|
130
130
|
export type ShardProcess = (cwd: string, files: readonly string[]) => {
|
|
131
131
|
exitCode: number | null;
|
|
132
132
|
signal?: string | null;
|
|
133
|
+
elapsedMs?: number;
|
|
134
|
+
unmeasuredReason?: string;
|
|
133
135
|
junit?: string;
|
|
134
136
|
rssMb?: number;
|
|
135
137
|
seconds?: number;
|
|
@@ -337,12 +339,16 @@ function runPlannedShards(
|
|
|
337
339
|
if (baselineFiles.length < shard.files.length) {
|
|
338
340
|
debug.log('self-dev.shard', 'baseline-files-absent', { shardId: shard.id, round, absent: shard.files.filter((file) => !baselineFiles.includes(file)) });
|
|
339
341
|
}
|
|
342
|
+
const shardStartedAt = performance.now();
|
|
340
343
|
const current = runSafely(cwd, shard.files);
|
|
341
344
|
const base = baselineFiles.length ? runSafely(dir, baselineFiles) : { exitCode: 0 };
|
|
342
345
|
keepFailure(shard.id, 'current', round, shard.files, current);
|
|
343
346
|
keepFailure(shard.id, 'baseline', round, baselineFiles, base);
|
|
344
347
|
attempts.push({
|
|
345
348
|
shardId: shard.id, attempt: round,
|
|
349
|
+
elapsedMs: Math.round(performance.now() - shardStartedAt),
|
|
350
|
+
currentUnmeasuredReason: current.unmeasuredReason,
|
|
351
|
+
baselineUnmeasuredReason: base.unmeasuredReason,
|
|
346
352
|
currentJUnit: current.junit, baselineJUnit: base.junit,
|
|
347
353
|
currentExitCode: current.exitCode, baselineExitCode: base.exitCode,
|
|
348
354
|
currentSignal: current.signal, baselineSignal: base.signal,
|
|
@@ -471,6 +477,8 @@ export async function runShardedGateTestsAsync(
|
|
|
471
477
|
if (concurrency > 1 && baselineFiles.length && base.exitCode === 0 && !base.signal && base.junit) baselinePassCache.set(shard.id, base);
|
|
472
478
|
roundAttempts[index] = {
|
|
473
479
|
shardId: shard.id, attempt: round, currentJUnit: current.junit, baselineJUnit: base.junit,
|
|
480
|
+
elapsedMs: Math.round(performance.now() - currentStartedAt),
|
|
481
|
+
currentUnmeasuredReason: current.unmeasuredReason, baselineUnmeasuredReason: base.unmeasuredReason,
|
|
474
482
|
currentExitCode: current.exitCode, baselineExitCode: base.exitCode,
|
|
475
483
|
currentSignal: current.signal, baselineSignal: base.signal,
|
|
476
484
|
currentDiagnostic: current.diagnostic, baselineDiagnostic: base.diagnostic,
|
|
@@ -523,23 +531,31 @@ function incompleteShardReasons(shardIds: readonly string[], attempts: readonly
|
|
|
523
531
|
return Object.fromEntries(shardIds.map((id) => {
|
|
524
532
|
const latest = attempts.filter((attempt) => attempt.shardId === id).at(-1);
|
|
525
533
|
if (!latest) return [id, 'no shard attempt recorded'];
|
|
526
|
-
const side = (name: string, rc: number | null, signal: string | null | undefined, junit: string | undefined, diagnostic: string | undefined): string => {
|
|
534
|
+
const side = (name: string, rc: number | null, signal: string | null | undefined, junit: string | undefined, diagnostic: string | undefined, unmeasuredReason?: string): string => {
|
|
535
|
+
if (unmeasuredReason) return `${name}: ${unmeasuredReason}`;
|
|
527
536
|
const safeDiagnostic = diagnostic ? redactSecretText(diagnostic).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').slice(0, 500) : undefined;
|
|
528
537
|
return `${name}: exit ${rc ?? 'unavailable'}, signal ${signal ?? 'none'}, JUnit ${junit === undefined ? 'missing' : 'present'}`
|
|
529
538
|
+ (safeDiagnostic ? `; ${safeDiagnostic}` : '');
|
|
530
539
|
};
|
|
531
540
|
const statuses = [
|
|
532
|
-
side('current', latest.currentExitCode, latest.currentSignal, latest.currentJUnit, latest.currentDiagnostic),
|
|
533
|
-
...(latest.baselineFiles?.length === 0 ? [] : [side('baseline', latest.baselineExitCode, latest.baselineSignal, latest.baselineJUnit, latest.baselineDiagnostic)]),
|
|
541
|
+
side('current', latest.currentExitCode, latest.currentSignal, latest.currentJUnit, latest.currentDiagnostic, latest.currentUnmeasuredReason),
|
|
542
|
+
...(latest.baselineFiles?.length === 0 ? [] : [side('baseline', latest.baselineExitCode, latest.baselineSignal, latest.baselineJUnit, latest.baselineDiagnostic, latest.baselineUnmeasuredReason)]),
|
|
534
543
|
];
|
|
535
544
|
return [id, `${statuses.join(' · ')} · aggregate rejected (incomplete, malformed JUnit, or exit/JUnit mismatch)`];
|
|
536
545
|
}));
|
|
537
546
|
}
|
|
538
547
|
|
|
539
|
-
export
|
|
548
|
+
export const DEFAULT_SELF_GATE_SHARD_TIMEOUT_MS = 900_000;
|
|
549
|
+
export const SELF_GATE_SHARD_TIMEOUT_ENV = 'ELANOUS_SELF_GATE_SHARD_TIMEOUT_MS';
|
|
550
|
+
|
|
551
|
+
export function selfGateShardTimeoutMs(files: readonly string[], env: NodeJS.ProcessEnv = process.env): number {
|
|
540
552
|
const spawnFiles = files.filter(isGateSpawnLaneFile);
|
|
541
553
|
if (spawnFiles.length && spawnFiles.length !== files.length) throw new Error('self gate spawn lane mixed with regular tests');
|
|
542
|
-
|
|
554
|
+
const configured = env[SELF_GATE_SHARD_TIMEOUT_ENV];
|
|
555
|
+
if (configured !== undefined && (!/^\d+$/.test(configured) || !Number.isSafeInteger(Number(configured)) || Number(configured) < 1)) {
|
|
556
|
+
throw new Error(`${SELF_GATE_SHARD_TIMEOUT_ENV} must be a positive integer number of milliseconds`);
|
|
557
|
+
}
|
|
558
|
+
return configured === undefined ? (spawnFiles.length ? 120_000 : DEFAULT_SELF_GATE_SHARD_TIMEOUT_MS) : Number(configured);
|
|
543
559
|
}
|
|
544
560
|
|
|
545
561
|
export function runBunShard(cwd: string, files: readonly string[]): ReturnType<ShardProcess> {
|
|
@@ -547,25 +563,29 @@ export function runBunShard(cwd: string, files: readonly string[]): ReturnType<S
|
|
|
547
563
|
}
|
|
548
564
|
|
|
549
565
|
/** Child launch seam for verifying the actual command and process timeout. */
|
|
550
|
-
export function runBunShardWithSpawn(cwd: string, files: readonly string[], spawn: typeof Bun.spawnSync): ReturnType<ShardProcess> {
|
|
551
|
-
const timeout = selfGateShardTimeoutMs(files);
|
|
552
|
-
const spawnLane =
|
|
566
|
+
export function runBunShardWithSpawn(cwd: string, files: readonly string[], spawn: typeof Bun.spawnSync, env: NodeJS.ProcessEnv = process.env): ReturnType<ShardProcess> {
|
|
567
|
+
const timeout = selfGateShardTimeoutMs(files, env);
|
|
568
|
+
const spawnLane = files.some(isGateSpawnLaneFile);
|
|
553
569
|
const dir = mkdtempSync(join(tmpdir(), 'elanous-shard-junit-'));
|
|
554
570
|
const report = join(dir, 'result.xml');
|
|
555
571
|
const isolated = prepareDeterministicChildEnvironment('elanous-shard-test-env-', { env: withGateTestEnv(process.env) });
|
|
556
572
|
try {
|
|
557
573
|
const measured = files.length === 1;
|
|
558
|
-
const args = ['test', ...(spawnLane ? [
|
|
574
|
+
const args = ['test', ...(spawnLane ? [`--timeout=${timeout}`] : []), '--reporter=junit', `--reporter-outfile=${report}`, ...files];
|
|
559
575
|
const started = performance.now();
|
|
560
576
|
const result = spawn(['bun', ...args], {
|
|
561
577
|
cwd, env: isolated.env, stdout: 'pipe', stderr: 'pipe', timeout,
|
|
562
578
|
});
|
|
563
579
|
const durationMs = performance.now() - started;
|
|
564
580
|
const junit = existsSync(report) ? readFileSync(report, 'utf8') : undefined;
|
|
581
|
+
const timedOut = (result as typeof result & { error?: { code?: string } }).error?.code === 'ETIMEDOUT'
|
|
582
|
+
|| (durationMs >= timeout && (result.exitCode !== 0 || !!result.signalCode));
|
|
565
583
|
const failed = result.exitCode !== 0 || !!result.signalCode || junit === undefined;
|
|
566
584
|
return {
|
|
567
585
|
exitCode: result.exitCode,
|
|
568
|
-
signal: result.signalCode ? String(result.signalCode) : undefined,
|
|
586
|
+
signal: timedOut ? undefined : result.signalCode ? String(result.signalCode) : undefined,
|
|
587
|
+
elapsedMs: Math.round(durationMs),
|
|
588
|
+
...(timedOut ? { unmeasuredReason: `timeout ${timeout / 1000}s 초과` } : {}),
|
|
569
589
|
junit,
|
|
570
590
|
...(junit === undefined && (result.exitCode !== 0 || result.signalCode)
|
|
571
591
|
? { diagnostic: boundedDiagnostic(result.stdout, result.stderr) } : {}),
|
|
@@ -580,9 +600,9 @@ export function runBunShardWithSpawn(cwd: string, files: readonly string[], spaw
|
|
|
580
600
|
}
|
|
581
601
|
|
|
582
602
|
/** Nonblocking child runner; each bundle still owns its own deterministic environment and JUnit path. */
|
|
583
|
-
export async function runBunShardAsync(cwd: string, files: readonly string[], drainTimeoutMs = 5_000): Promise<ReturnType<ShardProcess>> {
|
|
584
|
-
const timeout = selfGateShardTimeoutMs(files);
|
|
585
|
-
const spawnLane =
|
|
603
|
+
export async function runBunShardAsync(cwd: string, files: readonly string[], drainTimeoutMs = 5_000, env: NodeJS.ProcessEnv = process.env): Promise<ReturnType<ShardProcess>> {
|
|
604
|
+
const timeout = selfGateShardTimeoutMs(files, env);
|
|
605
|
+
const spawnLane = files.some(isGateSpawnLaneFile);
|
|
586
606
|
const dir = mkdtempSync(join(tmpdir(), 'elanous-shard-junit-'));
|
|
587
607
|
const report = join(dir, 'result.xml');
|
|
588
608
|
const isolated = prepareDeterministicChildEnvironment('elanous-shard-test-env-', { env: withGateTestEnv(process.env) });
|
|
@@ -590,7 +610,7 @@ export async function runBunShardAsync(cwd: string, files: readonly string[], dr
|
|
|
590
610
|
let drainTimer: ReturnType<typeof setTimeout> | undefined;
|
|
591
611
|
const drainAbort = new AbortController();
|
|
592
612
|
try {
|
|
593
|
-
const args = ['test', ...(spawnLane ? [
|
|
613
|
+
const args = ['test', ...(spawnLane ? [`--timeout=${timeout}`] : []), '--reporter=junit', `--reporter-outfile=${report}`, ...files];
|
|
594
614
|
const started = performance.now();
|
|
595
615
|
const child = Bun.spawn(['bun', ...args], { cwd, env: isolated.env, stdout: 'pipe', stderr: 'pipe' });
|
|
596
616
|
let timedOut = false;
|
|
@@ -624,7 +644,8 @@ export async function runBunShardAsync(cwd: string, files: readonly string[], dr
|
|
|
624
644
|
const signal = drainTimedOut ? 'DRAIN_TIMEOUT' : timedOut ? 'SIGKILL' : child.signalCode ? String(child.signalCode) : undefined;
|
|
625
645
|
const failed = exitCode !== 0 || !!signal || junit === undefined;
|
|
626
646
|
return {
|
|
627
|
-
exitCode, signal,
|
|
647
|
+
exitCode, signal: timedOut ? undefined : signal, elapsedMs: Math.round(durationMs),
|
|
648
|
+
...(timedOut ? { unmeasuredReason: `timeout ${timeout / 1000}s 초과` } : {}), junit,
|
|
628
649
|
...(files.length === 1 ? { rssMb: usage ? usage.maxRSS / (1024 * 1024) : undefined, seconds: durationMs / 1000 } : {}),
|
|
629
650
|
...(junit === undefined && (exitCode !== 0 || signal) ? { diagnostic: boundedDiagnostic(stdout, stderr) } : {}),
|
|
630
651
|
...(failed ? { failure: { durationMs: Math.round(durationMs), stdoutTail: outputTail(stdout), stderrTail: outputTail(stderr) } } : {}),
|
|
@@ -68,6 +68,7 @@ type AbandonedClassificationBasis =
|
|
|
68
68
|
| 'merge-approval-received'
|
|
69
69
|
// 기한 사망은 호스트가 읽은 Job 종료 이유다. 사후 쿼터 상관보다 앞선다.
|
|
70
70
|
| 'substrate-deadline-outranks-postmortem-quota'
|
|
71
|
+
| 'tdd-evidence-missing'
|
|
71
72
|
// 🩸 2026-09-20: 이 셋은 분류 «이름을 되풀이»했다 — 근거 칸이 동어반복이면 중재를 못 한다.
|
|
72
73
|
// 📏 실물(block 아티팩트)에서 네 칸이 2:2 로 갈렸다:
|
|
73
74
|
// reason·stage = 게이트 ↔ 중단원인·classification = 쿼타
|
|
@@ -115,6 +116,8 @@ interface AbandonedClassificationInput {
|
|
|
115
116
|
/** 호스트가 k8s Job 종료 reason `DeadlineExceeded` 를 읽었을 때만 참이다.
|
|
116
117
|
* ⛔ 사후 쿼터 상관(`quotaExhausted`)보다 앞선다 — 기한 사망을 할당량 소진으로 읽지 않는다. */
|
|
117
118
|
readonly substrateDeadlineExceeded?: boolean;
|
|
119
|
+
/** Structured child termination cause survives classification instead of being flattened into report-deficit. */
|
|
120
|
+
readonly terminationReason?: 'tdd-evidence-missing';
|
|
118
121
|
/** ⭐ provider 쿼터가 «찬 것으로 관측»되었을 때만 참이다.
|
|
119
122
|
* ⛔ 이 값은 «추론하지 않는다» — 호출자가 provider 응답(`rateLimitReachedType`)을 읽어 넘긴다.
|
|
120
123
|
* ⚠️ 그 읽기는 런이 죽은 «뒤»에 일어나므로 「죽은 원인」이 아니라 「죽을 무렵 쿼터가 찼다」는 상관이다.
|
|
@@ -151,6 +154,7 @@ export interface AbandonedClassificationResult {
|
|
|
151
154
|
readonly classification: AbandonedClassification;
|
|
152
155
|
/** The condition that selected `classification`, so consumers need not reconstruct the branch. */
|
|
153
156
|
readonly classificationBasis: AbandonedClassificationBasis;
|
|
157
|
+
readonly terminationReason?: 'tdd-evidence-missing';
|
|
154
158
|
readonly worktreeClean: boolean | undefined;
|
|
155
159
|
readonly completionDisposition?: SelfImplementCompletionDisposition;
|
|
156
160
|
readonly supervisorVerdict?: ReworkBudgetVerdict;
|
|
@@ -221,6 +225,8 @@ export function classifyAbandonedRun(input: AbandonedClassificationInput): Aband
|
|
|
221
225
|
? 'credential-failure'
|
|
222
226
|
: input.providerError === true
|
|
223
227
|
? 'provider-error'
|
|
228
|
+
: input.terminationReason === 'tdd-evidence-missing'
|
|
229
|
+
? 'implementation-deficit'
|
|
224
230
|
// A candidate is selected only from two structured observations. This deliberately does not prove a defect.
|
|
225
231
|
: input.supervisorVerdict === 'UNCONVERGEABLE' && input.goalCauseObserved === true
|
|
226
232
|
? 'goal-unconvergeable-candidate'
|
|
@@ -247,6 +253,11 @@ export function classifyAbandonedRun(input: AbandonedClassificationInput): Aband
|
|
|
247
253
|
case 'provider-error': return input.providerErrorCategory === 'request'
|
|
248
254
|
? 'provider-request-rejection-outranks-account-availability'
|
|
249
255
|
: 'environment-provider-error-outranks-run-stage-evidence';
|
|
256
|
+
case 'implementation-deficit': return input.terminationReason === 'tdd-evidence-missing'
|
|
257
|
+
? 'tdd-evidence-missing'
|
|
258
|
+
: mustFixReported
|
|
259
|
+
? 'must-fix-reported'
|
|
260
|
+
: 'no-must-fix-without-clean-worktree-or-completed-without-changes';
|
|
250
261
|
case 'already-satisfied': return 'cited-evidence-exists-without-changes';
|
|
251
262
|
case 'report-deficit': return input.reviewResultObserved === true
|
|
252
263
|
? input.citedEvidenceExists === false
|
|
@@ -259,9 +270,6 @@ export function classifyAbandonedRun(input: AbandonedClassificationInput): Aband
|
|
|
259
270
|
: input.reviewResultObserved === false
|
|
260
271
|
? 'terminal-state-not-reviewed'
|
|
261
272
|
: 'review-result-observation-unmeasured';
|
|
262
|
-
case 'implementation-deficit': return mustFixReported
|
|
263
|
-
? 'must-fix-reported'
|
|
264
|
-
: 'no-must-fix-without-clean-worktree-or-completed-without-changes';
|
|
265
273
|
}
|
|
266
274
|
})();
|
|
267
275
|
|
|
@@ -269,6 +277,7 @@ export function classifyAbandonedRun(input: AbandonedClassificationInput): Aband
|
|
|
269
277
|
return {
|
|
270
278
|
classification,
|
|
271
279
|
classificationBasis,
|
|
280
|
+
...(input.terminationReason ? { terminationReason: input.terminationReason } : {}),
|
|
272
281
|
worktreeClean,
|
|
273
282
|
...(input.completionDisposition ? { completionDisposition: input.completionDisposition } : {}),
|
|
274
283
|
...(input.supervisorVerdict ? { supervisorVerdict: input.supervisorVerdict } : {}),
|
|
@@ -71,6 +71,7 @@ function budgetCreditReserve(config: ChildLlmPreferenceInput): number {
|
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
const WEEKLY_WINDOW_MINUTES = 7 * 24 * 60;
|
|
74
|
+
const UNMEASURED_API_KEY_PROVIDERS = new Set(['glm', 'openrouter']);
|
|
74
75
|
|
|
75
76
|
function capFor(maxUsedPercent: BudgetGateMaxUsedPercent, provider: string): number | undefined {
|
|
76
77
|
if (!Object.prototype.hasOwnProperty.call(maxUsedPercent, provider)) {
|
|
@@ -179,6 +180,12 @@ function slotUsable(
|
|
|
179
180
|
...(unmeasured ? { unmeasured: true } : {}),
|
|
180
181
|
};
|
|
181
182
|
}
|
|
183
|
+
// The launch gate has no usage meter for API-key providers such as GLM/OpenRouter.
|
|
184
|
+
// A provider explicitly selected in the resolved child chain may launch, with the
|
|
185
|
+
// missing measurement surfaced; ordinary budget decisions remain fail-closed.
|
|
186
|
+
if (allowUnmeasured && UNMEASURED_API_KEY_PROVIDERS.has(provider)) {
|
|
187
|
+
return { usable: true, reason: `${provider}: 예산 미측정`, unmeasured: true };
|
|
188
|
+
}
|
|
182
189
|
return { usable: false, reason: `${provider}: 예산 판정 없음` };
|
|
183
190
|
}
|
|
184
191
|
|
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
} from '../user-config.js';
|
|
11
11
|
import { DEFAULT_BUDGET_GATE } from '../user-config.js';
|
|
12
12
|
import { debug } from '../debug/log.js';
|
|
13
|
+
import { fallbackChainForProvider, normalizeFallbackChain } from '../oauth/fallback-chain.js';
|
|
13
14
|
|
|
14
15
|
/** 체인 한 칸. `codexCredits` = `llm.fallbackChain` 의 `codex-credits` 칸(codex 를 선불 크레딧으로 · 마지막 수단). */
|
|
15
16
|
export type ChildLlmChainSlot = ChildLlmChainEntry & { readonly codexCredits?: true };
|
|
@@ -32,6 +33,8 @@ const FALLBACK_NAME_TO_PROVIDER: Readonly<Record<string, string>> = {
|
|
|
32
33
|
grok: 'grok',
|
|
33
34
|
// CODEX-CREDITS-STEP — provider 는 같은 codex 지만 «크레딧 칸»이라 따로 센다(아래 중복 판정).
|
|
34
35
|
'codex-credits': 'openai-codex',
|
|
36
|
+
zai: 'glm',
|
|
37
|
+
openrouter: 'openrouter',
|
|
35
38
|
};
|
|
36
39
|
|
|
37
40
|
function warnPreference(detail: string): void {
|
|
@@ -83,7 +86,13 @@ export function resolveChildLlmPreference(config: ChildLlmPreferenceInput): Reso
|
|
|
83
86
|
}));
|
|
84
87
|
chainSource = 'config';
|
|
85
88
|
} else {
|
|
86
|
-
|
|
89
|
+
const configuredFallback = config.llm.fallbackChain;
|
|
90
|
+
const derived = normalizeFallbackChain(configuredFallback, config.llm.provider);
|
|
91
|
+
// Preserve auto's empty preference: the launch gate applies its legacy code
|
|
92
|
+
// default there. An explicitly selected provider gets its own derived chain.
|
|
93
|
+
const steps = configuredFallback === undefined && !fallbackChainForProvider(config.llm.provider)
|
|
94
|
+
? [] : derived.chain;
|
|
95
|
+
chain = chainFromFallbackNames(steps);
|
|
87
96
|
chainSource = 'fallbackChain';
|
|
88
97
|
}
|
|
89
98
|
|
|
@@ -483,6 +483,26 @@ export interface DoctorComparisonRecord {
|
|
|
483
483
|
opResult: string;
|
|
484
484
|
}
|
|
485
485
|
|
|
486
|
+
/**
|
|
487
|
+
* 하류 계약: 비교 판정의 명명된 실패는 message 문자열이 아니라 typed identity(`reason`)로도 도착한다.
|
|
488
|
+
* 사람이 읽는 문면은 종전과 같은 문장 그대로다(문장 접두사 = reason). 실제로 없는 원장만
|
|
489
|
+
* `run-ledger-missing` 이고, 운영/시험 원장 쓰기 거부는 이 클래스가 아니라
|
|
490
|
+
* `DoctorComparisonLedgerWriteRefusedError` 다.
|
|
491
|
+
*/
|
|
492
|
+
export type DoctorComparisonFailureReason =
|
|
493
|
+
| 'run-ledger-missing'
|
|
494
|
+
| 'shadow-rx-missing'
|
|
495
|
+
| 'visit-missing'
|
|
496
|
+
| 'comparison-corrupt'
|
|
497
|
+
| 'comparison-conflict';
|
|
498
|
+
|
|
499
|
+
export class DoctorComparisonFailureError extends Error {
|
|
500
|
+
constructor(readonly reason: DoctorComparisonFailureReason, message: string) {
|
|
501
|
+
super(message);
|
|
502
|
+
this.name = 'DoctorComparisonFailureError';
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
486
506
|
/**
|
|
487
507
|
* 하류 계약: 운영/시험 원장 쓰기 거부는 message 문자열이 아니라 typed identity(`reason`·`runId`·
|
|
488
508
|
* `ledgerDir`)로 도착한다. 사람이 읽는 문면은 종전과 같은 문장 그대로다.
|
|
@@ -507,8 +527,10 @@ export class DoctorComparisonLedgerWriteRefusedError extends Error {
|
|
|
507
527
|
* 하류 계약(typed identity) — ① 원장 쓰기 거부는 DoctorComparisonLedgerWriteRefusedError
|
|
508
528
|
* (`reason='ledger-write-refused'`·`runId`·`ledgerDir`), ② runId 불일치는 원장 바이트와 checked
|
|
509
529
|
* append 양쪽 모두 RunLedgerCheckedAppendRunIdMismatchError(`reason='runId-mismatch'`·
|
|
510
|
-
* `decisionRunId`·`lockedRunId`)로
|
|
511
|
-
*
|
|
530
|
+
* `decisionRunId`·`lockedRunId`)로 도착한다, ③ 나머지 명명된 실패(run-ledger-missing·
|
|
531
|
+
* shadow-rx-missing·visit-missing·comparison-corrupt·comparison-conflict)는
|
|
532
|
+
* DoctorComparisonFailureError(`reason` = 그 이름, 사람 문면은 접두사 그대로)로 도착한다.
|
|
533
|
+
* 문자열 파싱 없이 분류하고, 실제로 없는 원장만 `run-ledger-missing` 이다.
|
|
512
534
|
*
|
|
513
535
|
* 배선 경계(의도적): 이 슬라이스의 호출자는 시험 경로뿐이다 — live dispatch·stall-watch retirement
|
|
514
536
|
* 은 후속 cross-judgment 증거 슬라이스에서 붙는다(현행 `eln doctor status --json` = total 0
|
|
@@ -531,7 +553,7 @@ export function recordDoctorComparison(input: RecordDoctorComparisonInput): Doct
|
|
|
531
553
|
// lock 안에서 appendRunLedgerEntry 를 다시 부르지 않는다(중첩 lock 시간초과).
|
|
532
554
|
const outcome: RunLedgerCheckedAppendOutcome<DoctorComparisonRecord> = appendRunLedgerEntryChecked<DoctorComparisonRecord>(runId, (entries) => {
|
|
533
555
|
if (entries === null) {
|
|
534
|
-
throw new
|
|
556
|
+
throw new DoctorComparisonFailureError('run-ledger-missing', `run-ledger-missing: 런 원장이 없습니다 (runId=${runId}) — 새 원장을 만들지 않습니다`);
|
|
535
557
|
}
|
|
536
558
|
let shadowRxIndex = -1;
|
|
537
559
|
for (let index = 0; index < entries.length; index++) {
|
|
@@ -539,7 +561,7 @@ export function recordDoctorComparison(input: RecordDoctorComparisonInput): Doct
|
|
|
539
561
|
if (entry.event === 'doctor-rx' && entry.data.shadow === true) shadowRxIndex = index;
|
|
540
562
|
}
|
|
541
563
|
if (shadowRxIndex < 0) {
|
|
542
|
-
throw new
|
|
564
|
+
throw new DoctorComparisonFailureError('shadow-rx-missing', `shadow-rx-missing: 이 runId 의 shadow doctor-rx 가 없습니다 (runId=${runId}) — shadow 결과를 지어내지 않습니다`);
|
|
543
565
|
}
|
|
544
566
|
const shadowRx = entries[shadowRxIndex]!;
|
|
545
567
|
const rx = typeof shadowRx.data.rx === 'string' ? shadowRx.data.rx : null;
|
|
@@ -547,17 +569,17 @@ export function recordDoctorComparison(input: RecordDoctorComparisonInput): Doct
|
|
|
547
569
|
const visitIndex = typeof shadowRx.data.visitIndex === 'number' ? shadowRx.data.visitIndex : -1;
|
|
548
570
|
const visit = visitIndex >= 0 && visitIndex < entries.length ? entries[visitIndex] : undefined;
|
|
549
571
|
if (visit === undefined || visit.event !== 'doctor-visit' || visit.runId !== runId) {
|
|
550
|
-
throw new
|
|
572
|
+
throw new DoctorComparisonFailureError('visit-missing', `visit-missing: shadow doctor-rx 가 가리키는 doctor-visit 행이 없습니다 (runId=${runId}, visitIndex=${visitIndex})`);
|
|
551
573
|
}
|
|
552
574
|
const existing = entries.find((entry) => entry.event === 'doctor-compare' && entry.data.shadowRxIndex === shadowRxIndex);
|
|
553
575
|
if (existing !== undefined) {
|
|
554
576
|
const stored = existing.data.opJudgment as { timestamp?: unknown; result?: unknown };
|
|
555
577
|
if (typeof stored?.timestamp !== 'string' || stored.timestamp.length === 0
|
|
556
578
|
|| typeof stored?.result !== 'string' || stored.result.length === 0) {
|
|
557
|
-
throw new
|
|
579
|
+
throw new DoctorComparisonFailureError('comparison-corrupt', `comparison-corrupt: 이미 기록된 doctor-compare 의 저장 판단이 손상됐습니다 (runId=${runId}, shadowRxIndex=${shadowRxIndex}, stored=${JSON.stringify(stored)}) — 거짓 already-recorded 를 승인하지 않습니다`);
|
|
558
580
|
}
|
|
559
581
|
if (stored.timestamp !== judgment.timestamp || stored.result !== judgment.result) {
|
|
560
|
-
throw new
|
|
582
|
+
throw new DoctorComparisonFailureError('comparison-conflict', `comparison-conflict: 이미 기록된 doctor-compare 와 손판정이 다릅니다 (runId=${runId}, shadowRxIndex=${shadowRxIndex}, stored=${JSON.stringify(stored)}, received=${JSON.stringify(judgment)}) — 기존 행을 유지합니다`);
|
|
561
583
|
}
|
|
562
584
|
return { append: false as const, result: { status: 'already-recorded' as const, visitIndex, shadowRxIndex, rx, outcome: shadowOutcome, opResult: judgment.result } };
|
|
563
585
|
}
|
|
@@ -579,7 +601,7 @@ export function recordDoctorComparison(input: RecordDoctorComparisonInput): Doct
|
|
|
579
601
|
return outcome.result;
|
|
580
602
|
}
|
|
581
603
|
if (holder.recorded === undefined) {
|
|
582
|
-
throw new
|
|
604
|
+
throw new DoctorComparisonFailureError('run-ledger-missing', `run-ledger-missing: 런 원장이 없습니다 (runId=${runId}) — 새 원장을 만들지 않습니다`);
|
|
583
605
|
}
|
|
584
606
|
const record = holder.recorded;
|
|
585
607
|
debug.log('run-doctor', 'compare', { runId, visitIndex: record.visitIndex, shadowRxIndex: record.shadowRxIndex, opResult: judgment.result, executed: false });
|
|
@@ -17,6 +17,9 @@ import { debug } from '../debug/log.js';
|
|
|
17
17
|
* 같은 값인지는 elanous-tui-spawn-identity.test.ts 가 잡는다. */
|
|
18
18
|
export const PREAMBLE_SYNC_BLOCK_ENV = 'ELANOUS_TEST_PREAMBLE_SYNC_BLOCK_MS';
|
|
19
19
|
|
|
20
|
+
/** Bare held TUI startup includes Nexus/test-universe initialization; 30s is below observed cold-start latency. */
|
|
21
|
+
export const DEFAULT_TUI_TEST_READY_TIMEOUT_MS = 180_000;
|
|
22
|
+
|
|
20
23
|
export interface ElanousTuiSpawnOptions {
|
|
21
24
|
readonly repoRoot: string;
|
|
22
25
|
readonly cwd: string;
|
|
@@ -52,6 +52,7 @@ export interface GateArtifactRun {
|
|
|
52
52
|
export interface GateArtifactShard {
|
|
53
53
|
shardId: string;
|
|
54
54
|
attempt: number;
|
|
55
|
+
elapsedMs?: number;
|
|
55
56
|
files: string[];
|
|
56
57
|
current: GateArtifactRun;
|
|
57
58
|
baseline: GateArtifactRun;
|
|
@@ -210,7 +211,7 @@ export function writeGateArtifacts(input: GateArtifactInput): { summaryPath: str
|
|
|
210
211
|
return run;
|
|
211
212
|
};
|
|
212
213
|
shardsDetail.push({
|
|
213
|
-
shardId: attempt.shardId, attempt: attempt.attempt, files, current: side('current'), baseline: side('baseline'),
|
|
214
|
+
shardId: attempt.shardId, attempt: attempt.attempt, ...(attempt.elapsedMs !== undefined ? { elapsedMs: attempt.elapsedMs } : {}), files, current: side('current'), baseline: side('baseline'),
|
|
214
215
|
...(input.sharded?.unmeasuredByShard?.[attempt.shardId] !== undefined
|
|
215
216
|
&& attempt === input.sharded.attempts.filter((item) => item.shardId === attempt.shardId).at(-1)
|
|
216
217
|
? { unmeasuredReason: input.sharded.unmeasuredByShard[attempt.shardId] } : {}),
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
type GoalAuthorDeps,
|
|
20
20
|
type GoalAuthorGradeSelection,
|
|
21
21
|
resolveGoalAuthorGrade,
|
|
22
|
+
resolveGoalAuthorReviewerPrecheckEnabled,
|
|
22
23
|
type GoalType,
|
|
23
24
|
type GoalFileLintFinding,
|
|
24
25
|
} from './goal-author.js';
|
|
@@ -292,9 +293,10 @@ export async function runGoalAuthorCli(
|
|
|
292
293
|
? { passed: false }
|
|
293
294
|
: { passed: true, titleChars: proseTitle.length });
|
|
294
295
|
const gradeDeps = authorGrade.grade === 'lite' || opts.authorGrade ? { authorGrade } : {};
|
|
296
|
+
const reviewerPrecheckDeps = { reviewerPrecheckEnabled: resolveGoalAuthorReviewerPrecheckEnabled() };
|
|
295
297
|
const authorDeps: Partial<GoalAuthorDeps> = parentGoalFile && parentQuestionId
|
|
296
|
-
? { parent: { goalFile: parentGoalFile, questionId: parentQuestionId }, parentDocument, clarificationAnswers, ...(decomposeSteps ? { decomposeSteps } : {}), ...gradeDeps, ...selfResolutionDeps, ...progressDeps, ...launchPreflightDeps, ...(opts.rootIntent !== undefined && { rootIntent: opts.rootIntent }), ...(goalType !== undefined && { goalType }), ...goalTitleDeps }
|
|
297
|
-
: { ...(clarificationAnswers && { clarificationAnswers }), ...(decomposeSteps ? { decomposeSteps } : {}), ...gradeDeps, ...selfResolutionDeps, ...progressDeps, ...launchPreflightDeps, ...(opts.rootIntent !== undefined && { rootIntent: opts.rootIntent }), ...(goalType !== undefined && { goalType }), ...goalTitleDeps };
|
|
298
|
+
? { parent: { goalFile: parentGoalFile, questionId: parentQuestionId }, parentDocument, clarificationAnswers, ...(decomposeSteps ? { decomposeSteps } : {}), ...gradeDeps, ...selfResolutionDeps, ...progressDeps, ...launchPreflightDeps, ...reviewerPrecheckDeps, ...(opts.rootIntent !== undefined && { rootIntent: opts.rootIntent }), ...(goalType !== undefined && { goalType }), ...goalTitleDeps }
|
|
299
|
+
: { ...(clarificationAnswers && { clarificationAnswers }), ...(decomposeSteps ? { decomposeSteps } : {}), ...gradeDeps, ...selfResolutionDeps, ...progressDeps, ...launchPreflightDeps, ...reviewerPrecheckDeps, ...(opts.rootIntent !== undefined && { rootIntent: opts.rootIntent }), ...(goalType !== undefined && { goalType }), ...goalTitleDeps };
|
|
298
300
|
const write = deps.write ?? writeAuthoredGoal;
|
|
299
301
|
const result = opts.groundingCwd === undefined
|
|
300
302
|
? await write(ask, opts.cwd, authorDeps, superseded ? { supersedes: superseded } : undefined)
|