elanous 0.2.31 → 0.2.34
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/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +79 -0
- package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 1644.35dd25240ae24e4b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 1895-60ed0e341c658bd4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 2124.ed5bf480cea7f85b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +115 -0
- package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +8 -0
- package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 2547.dd27303624cb4da8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 2554.3b5e200f5f5cfcd6.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 2987-30cf9c2eb7b8bdd5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3541-ce3a5424ed5ad7f1.js → 3001-5a52788c813b6113.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3103.84470c8445962f04.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 3110.0a7065f25c841818.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3121.779fafe3e44612c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3411-f87314c6c66ebc73.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 3414.172ad4ca2d9b08e8.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4745.67d6f99c245af3f7.js → 3498.cf2a15a8a9e5b926.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{5543.a438b8ab5a13ea47.js → 3837.722e053fb9f321ad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +149 -0
- package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +64 -0
- package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +74 -0
- package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → 4fa33ebd.21c1bd5b294496e6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 5014f970-22bef0b5210f7d60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2112-e4efc21a6505d5bc.js → 5028-f0722e6114c313e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2898.fd781bc7cf01a7b7.js → 5249.96a848656b582a93.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{9407.e49124dedf0f5e72.js → 5446.edf141cff9ef647d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9002.e5658224e3dc1b6f.js → 5489.ec2dd1b5272a19dc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 5576-82d3703636d5c4b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 6086.913a69e6fa3e4a8b.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +1 -0
- package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 6740.43de73fc427c9fe2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7005.1623d2aea78eb85f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +287 -0
- package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 7431.3051e9b8a4372d2d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3583.a05e88cc8d594628.js → 7448.478958ffbbba0ac0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +41 -0
- package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{9989.3694300e5f000b14.js → 7952.b192c31b6a0e00cc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +36 -0
- package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +1 -0
- package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 8368.014caa8de2f5af34.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 8548.036c344973968847.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8817.61bb7ffbba502ecb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 9131-fce7256c4180c4a5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9550.d5f76828f972058c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{2534.e85ae21ad0dac829.js → 9739.8d5f36ac67a3b236.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → 9a8cb466.cc9fc9e6e46038aa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → 9b48c871.204d5d13e7809bd0.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → abb4b98b.163e0f56e84ae35d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4fb31eb476dcbad3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0a07363b130182a1.js → page-398c0faa173203f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-df3445b207ceceab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +122 -0
- package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{ebc7d829.264a0bcb6c750b50.js → ffdc3a04.b9c23c1b28dd4a96.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +1 -0
- package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.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 +26 -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/bin/elanous.mjs +9 -2
- package/docs/goal-context/README.md +1 -0
- package/graphs/default-loop.yaml +20 -3
- package/graphs/document-loop.yaml +21 -2
- package/graphs/implement-loop.yaml +11 -0
- package/graphs/journey/SCENARIOS.md +33 -0
- package/graphs/journey/recipes.yaml +1 -0
- package/graphs/journey/ta-journey.yaml +84 -0
- package/graphs/journey/units/author/author.yaml +20 -0
- package/graphs/journey/units/author/recipes.yaml +2 -0
- package/graphs/journey/units/green/green.yaml +20 -0
- package/graphs/journey/units/green/recipes.yaml +2 -0
- package/graphs/journey/units/pr/pr.yaml +20 -0
- package/graphs/journey/units/pr/recipes.yaml +2 -0
- package/graphs/journey/units/remember/recipes.yaml +2 -0
- package/graphs/journey/units/remember/remember.yaml +20 -0
- package/graphs/operate-loop.yaml +21 -2
- package/graphs/overlays/stop-heal-ladder.yaml +1 -1
- package/graphs/release-rehearsal/recipes.yaml +1 -1
- package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
- package/graphs/research-loop.yaml +23 -2
- package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
- package/graphs/units/dispatch-pod/recipes.yaml +14 -0
- package/graphs/units/entry/entry.yaml +50 -0
- package/graphs/units/entry/recipes.yaml +14 -0
- package/graphs/units/harvest/harvest.yaml +25 -0
- package/graphs/units/harvest/recipes.yaml +4 -0
- package/graphs/units/land/land.yaml +45 -0
- package/graphs/units/land/recipes.yaml +3 -0
- package/graphs/units/recipes.yaml +7 -0
- package/graphs/units/recover.yaml +39 -0
- package/graphs/units/reflect/recipes.yaml +3 -0
- package/graphs/units/reflect/reflect.yaml +15 -0
- package/graphs/units/task-agent-recover-review.yaml +17 -0
- package/graphs/units/task-agent-recover-wait.yaml +17 -0
- package/graphs/units/verbs/make-doc.yaml +34 -0
- package/graphs/units/verbs/recipes.yaml +33 -0
- package/graphs/units/verbs/verify.yaml +55 -0
- package/graphs/work/recipes.yaml +2 -0
- package/graphs/work/research-report.yaml +28 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +95 -17
- package/scripts/docs/generate-graph-anatomy.ts +19 -2
- package/scripts/graph-harvest-unit.ts +22 -0
- package/scripts/graph-units/journey-stub.ts +6 -0
- package/scripts/graph-units/land-enqueue.ts +78 -0
- package/scripts/graph-units/recover-plan.ts +15 -0
- package/scripts/graph-units/reflect-node.ts +88 -0
- package/scripts/graph-units/ta-journey-observe.ts +109 -0
- package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
- package/scripts/graph-units/verbs/verify-stage.ts +75 -0
- package/scripts/graph-units/verbs-envelope.ts +139 -0
- package/scripts/hq/standby-snapshot.ts +25 -0
- package/scripts/measure-si-task-cpu.ts +143 -0
- package/scripts/public-export.ts +43 -1
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +0 -2
- package/scripts/ratchets/train-side-invariants.sh +45 -0
- package/scripts/release-loop/auto-approve-node.ts +30 -16
- package/scripts/release-loop/gate-closure.ts +5 -1
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-node.ts +498 -31
- package/scripts/release-loop/gate-partial.ts +3 -3
- package/scripts/release-loop/gate-radius-shadow.ts +138 -0
- package/scripts/release-loop/gate-traffic-mode.ts +128 -0
- package/scripts/release-loop/gate-triage-node.ts +5 -2
- package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
- package/scripts/release-loop/known-issues-node.ts +77 -8
- package/scripts/release-loop/preflight.ts +93 -7
- package/scripts/release-loop/prepare-node.ts +102 -4
- package/scripts/release-loop/publish-node.ts +60 -9
- package/scripts/release-loop/resume-cap.ts +56 -0
- package/scripts/release-loop/resume-release.ts +114 -15
- package/scripts/release-loop/resume.ts +24 -1
- package/scripts/release-loop/tui-sim-node.ts +8 -2
- package/scripts/release-loop/unattended-release.ts +8 -2
- package/src/acp/core-turn-bridge.ts +36 -9
- package/src/acp/elanous-extensions.ts +3 -0
- package/src/acp/reasoning-thought-buffer.ts +45 -0
- package/src/acp/server.ts +3 -0
- package/src/acp/tool-trace.ts +186 -11
- package/src/agent/self-ambient-cache.ts +156 -0
- package/src/agent/self-ambient.ts +8 -1
- package/src/agent/task-notification.ts +5 -0
- package/src/agent-substrate/acp-reviewer.ts +52 -12
- package/src/agent-substrate/pr-reviewer.ts +3 -1
- package/src/agent-substrate/review-finding-key.ts +53 -0
- package/src/agent-substrate/self-review-cli.ts +126 -5
- package/src/ask-user-question/pending-questions.ts +1 -1
- package/src/ask-user-question/tool.ts +22 -0
- package/src/autopilot/build/llm-conflict-merge.ts +56 -10
- package/src/autopilot/pr-manager.ts +213 -46
- package/src/capture/frame-state-detect.ts +39 -0
- package/src/capture/tui-self-report.ts +134 -6
- package/src/chat/index.ts +61 -15
- package/src/chat/pickers/modal-runtime.ts +6 -0
- package/src/chat/pickers/modals.ts +8 -2
- package/src/chat/tool-render/dispatch.ts +62 -10
- package/src/cli/ask-bare.ts +1 -0
- package/src/cli/control-cli.ts +24 -7
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/import-cli.ts +12 -0
- package/src/cli/light-entry-route.ts +35 -0
- package/src/cli/llm-detect-cli.ts +23 -1
- package/src/cli/log-event-names.ts +10 -0
- package/src/cli/msg-cli.ts +1 -0
- package/src/cli/pod-cli.ts +14 -3
- package/src/cli/pr-cli.ts +140 -41
- package/src/cli/pr-land-base-read.ts +36 -0
- package/src/cli/pr-land-heavy-remote.ts +81 -25
- package/src/cli/pr-land-overlap-evidence.ts +200 -18
- package/src/cli/pr-land-pod-shadow-job.ts +26 -3
- package/src/cli/pr-land-recovery.ts +64 -0
- package/src/cli/pr-land-refusal.ts +20 -5
- package/src/cli/pty-takeover-cli.ts +94 -19
- package/src/cli/release-cli.ts +120 -33
- package/src/cli/release-run-if-ready.ts +29 -28
- package/src/cli/release-single-flight.ts +178 -0
- package/src/cli/seat-cli.ts +37 -0
- package/src/cli/setup-cli.ts +40 -1
- package/src/cli/sim-cli.ts +18 -0
- package/src/cli/tasks-cli.ts +149 -5
- package/src/context-bus/ops-events.ts +6 -2
- package/src/control/control-status.ts +8 -3
- package/src/control-plane/ledger.ts +5 -3
- package/src/control-plane/server.ts +5 -3
- package/src/core-turn/run-core-turn.ts +1 -0
- package/src/core-turn/run-goal-loop.ts +21 -0
- package/src/core-turn/short-question.ts +5 -1
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/acp-active-model.ts +42 -1
- package/src/dashboard/background-jobs-status.ts +66 -0
- package/src/dashboard/index.ts +153 -111
- package/src/dashboard/input/agent-wake.ts +242 -0
- package/src/dashboard/input/chat-main-entry-runtime.ts +5 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/external-input-host.ts +23 -9
- package/src/dashboard/input/mouse-wiring.ts +108 -11
- package/src/dashboard/input/seat-autowake.ts +56 -3
- package/src/dashboard/log-click-runtime.ts +118 -2
- package/src/dashboard/seat-boot-preamble.ts +1 -1
- package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
- package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
- package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
- package/src/dashboard/turn-preamble.ts +163 -41
- package/src/dashboard/turn-session-layers.ts +4 -2
- package/src/dashboard/turn-start-segments.ts +222 -0
- package/src/dashboard/turn-stream-formatter.ts +34 -1
- package/src/dashboard/turn-stream-runtime.ts +2 -0
- package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
- package/src/display/prompt-row-owner.ts +146 -0
- package/src/display/resize-listener.ts +33 -2
- package/src/domains/guardian-tick.ts +54 -2
- package/src/domains/outbound-alert.ts +3 -2
- package/src/extractors.ts +3 -1
- package/src/fold-stack.ts +4 -2
- package/src/git-fs/index.ts +263 -36
- package/src/git-fs/retry.ts +4 -0
- package/src/git-fs/runner.ts +2 -0
- package/src/graph-runner/runner.ts +114 -44
- package/src/grok/credential.ts +5 -0
- package/src/harness/gate-reserve.ts +87 -0
- package/src/harness/harness-cli-command.ts +39 -10
- package/src/harness/harness-incidents.ts +17 -0
- package/src/harness/harness-pod-dispatch.ts +38 -1
- package/src/harness/harness-queue.ts +15 -0
- package/src/harness/harness-salvage-cli.ts +14 -2
- package/src/index.ts +198 -12
- package/src/input/external-input-queue.ts +34 -9
- package/src/intake-plane/already-built-hint.ts +89 -0
- package/src/knowhow/pack.ts +199 -0
- package/src/light-cli.ts +95 -0
- package/src/llm/route-decision.ts +36 -0
- package/src/llm/tool-loop-steered-rejection.ts +8 -0
- package/src/llm-request-shape.ts +209 -0
- package/src/llm.ts +221 -276
- package/src/loops/budget.ts +95 -0
- package/src/loops/msg-wake.ts +8 -2
- package/src/loops/orchestrator/tick.ts +24 -2
- package/src/loops/orchestrator/traffic.ts +132 -1
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mss/logging/log-store.ts +4 -5
- package/src/mss/logging/render-categories.ts +5 -0
- package/src/nexus/api/graphs-api.ts +22 -3
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +12 -0
- package/src/oauth/claude-pty-maturity.ts +66 -0
- package/src/oauth/codex-access-mirror.ts +55 -0
- package/src/oauth/fallback-chain.ts +1 -1
- package/src/onboarding/first-run.ts +5 -3
- package/src/onboarding/non-interactive.ts +64 -13
- package/src/onboarding.ts +10 -2
- package/src/ops/overview-collect.ts +36 -1
- package/src/ops/overview.ts +70 -2
- package/src/pr-tool/census.ts +41 -8
- package/src/pr-tool/inflight-registry.ts +296 -0
- package/src/prompt-library/gpt6-family-addendum.ts +14 -1
- package/src/pty-shell/herdr-agent-report.ts +442 -0
- package/src/pty-shell/pty-control-ipc.ts +5 -5
- package/src/pty-shell/pty-manifest.ts +12 -3
- package/src/pty-shell/pty-write-outcome.ts +24 -6
- package/src/pty-shell/tui-run-state.ts +151 -6
- package/src/release-loop/checklist.ts +79 -5
- package/src/release-loop/feature-store.ts +19 -2
- package/src/release-loop/placement.ts +10 -3
- package/src/release-loop/rehearsal.ts +205 -25
- package/src/release-loop/rubric.ts +16 -2
- package/src/seat-loop/traffic-signal.ts +2 -1
- package/src/self-dev/ask-launch-flow.ts +13 -0
- package/src/self-dev/draft-residue.ts +243 -24
- package/src/self-dev/draft-sweep.ts +52 -3
- package/src/self-dev/graph-journey-nodes.ts +10 -6
- package/src/self-dev/graph-journey-route.ts +60 -6
- package/src/self-dev/orchestrate.ts +79 -3
- package/src/self-dev/run-supervisor.ts +107 -12
- package/src/self-dev/run-types.ts +5 -1
- package/src/self-dev/shard-plan.ts +11 -3
- package/src/self-dev/shard-run.ts +103 -10
- package/src/self-implement/elanous-tui-spawn.ts +14 -0
- package/src/self-implement/follow-up-placement.ts +79 -0
- package/src/self-implement/gate-artifacts.ts +15 -4
- package/src/self-implement/gate-baseline.ts +145 -10
- package/src/self-implement/gate-cli.ts +7 -2
- package/src/self-implement/gate-remote.ts +35 -6
- package/src/self-implement/goal-author-identity.ts +66 -0
- package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
- package/src/self-implement/goal-author.ts +4 -120
- package/src/self-implement/graph-overlay-yaml.ts +17 -2
- package/src/self-implement/graph-unit-flatten.ts +103 -0
- package/src/self-implement/graph-unit-resolver.ts +107 -0
- package/src/self-implement/graph-yaml.ts +151 -1
- package/src/self-implement/headless-elanous-driver.ts +1 -0
- package/src/self-implement/host-regate.ts +36 -4
- package/src/self-implement/knowhow-pack.ts +103 -0
- package/src/self-implement/orchestrator.ts +109 -11
- package/src/self-implement/pod-warm-pool-profile.ts +45 -0
- package/src/self-implement/review-mustfix-class.ts +203 -0
- package/src/self-implement/run-ledger.ts +16 -14
- package/src/self-implement/run-stop.ts +8 -2
- package/src/self-implement/seams.ts +32 -1
- package/src/self-implement/stop-autoheal.ts +25 -1
- package/src/session/chat.ts +27 -0
- package/src/session-runtime/index.ts +22 -267
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/shell-runner/background-surface.ts +15 -5
- package/src/skills/tools/agent.ts +39 -6
- package/src/skills/tools/list-dir.ts +11 -0
- package/src/skills/tools/schedule-wakeup.ts +457 -0
- package/src/skills/tools/shell.ts +245 -3
- package/src/status/bar.ts +26 -0
- package/src/steward/digest-delivery.ts +118 -0
- package/src/steward/hold-hygiene.ts +120 -0
- package/src/steward/release-day.ts +7 -3
- package/src/steward/triage.ts +47 -4
- package/src/surface/shell-runner-boot.ts +5 -2
- package/src/task-agent/harvest-unit.ts +141 -0
- package/src/task-agent/live-moves.ts +98 -12
- package/src/task-agent/parent-host.ts +93 -3
- package/src/task-agent/postland-card.ts +80 -1
- package/src/task-agent/rejudge-on-head.ts +112 -26
- package/src/task-agent/repair-branch-cas.ts +4 -1
- package/src/task-agent/repair-cycle.ts +16 -3
- package/src/task-agent/run-identity.ts +4 -3
- package/src/task-agent/shadow.ts +12 -2
- package/src/task-agent/task-hand.ts +76 -5
- package/src/task-agent/work-order-build.ts +22 -0
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +39 -3
- package/src/task-orchestrator/surfaces/pod-command-job.ts +67 -12
- package/src/task-orchestrator/surfaces/pod-lease.ts +98 -0
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -18
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +10 -6
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +54 -4
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +548 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +389 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +158 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +230 -43
- package/src/task-orchestrator/surfaces/self-implement.ts +83 -2
- package/src/tool-runtime/truncation-store.ts +4 -0
- package/src/tui/chat/execution-badge.ts +5 -1
- package/src/tui/input-lag-probe.ts +230 -0
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/tui.ts +4 -0
- package/src/user-config/coercion.ts +36 -0
- package/src/user-config.ts +18 -41
- package/src/ux-sim/scenario.ts +314 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
- package/apps/pwa/out/_next/static/chunks/1834-50625904996a8fa8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
- package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3267c0e6.d34854e7b3984a6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +0 -34
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-2ebb8fd59b9461f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-521ee23ac8c0abfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +0 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
- package/apps/pwa/out/_next/static/css/3f5fc6f96e2cf7b2.css +0 -1
- package/src/cli/g6a-registration-probe.ts +0 -16
- /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → L04y73dlwKeTW-GetaTF3}/_ssgManifest.js +0 -0
|
@@ -13,6 +13,10 @@ import { selfDevRunsDir } from '../self-dev/run-store.js';
|
|
|
13
13
|
import { syncTestConfig } from '../cli/config-test-sync.js';
|
|
14
14
|
import { debug } from '../debug/log.js';
|
|
15
15
|
|
|
16
|
+
/** = `PREAMBLE_SYNC_BLOCK_ENV`(dashboard/turn-preamble.ts). 그 모듈을 끌어오지 않으려 이름만 둔다 —
|
|
17
|
+
* 같은 값인지는 elanous-tui-spawn-identity.test.ts 가 잡는다. */
|
|
18
|
+
export const PREAMBLE_SYNC_BLOCK_ENV = 'ELANOUS_TEST_PREAMBLE_SYNC_BLOCK_MS';
|
|
19
|
+
|
|
16
20
|
export interface ElanousTuiSpawnOptions {
|
|
17
21
|
readonly repoRoot: string;
|
|
18
22
|
readonly cwd: string;
|
|
@@ -138,6 +142,13 @@ export function elanousTuiSpawnOptions(opts: ElanousTuiSpawnOptions): StartOpts
|
|
|
138
142
|
}
|
|
139
143
|
const { runId } = resolveRunIdentity({ explicit: opts.runId, inherited: opts.space.runId });
|
|
140
144
|
const debugLevel = process.env.ELANOUS_DEBUG_LEVEL;
|
|
145
|
+
// ⭐ PTY 는 기동 때 잡은 로그인 셸 env 위에 «여기 적은 키만» 얹는다(registry `buildPtyEnv`) —
|
|
146
|
+
// 부모에 건 시험 seam env 는 적어 주지 않으면 자식에 안 닿는다(run-fbe85b7c · 자식 env 실측).
|
|
147
|
+
// 격리 자식에만 넘긴다. 자식도 운영 우주면 무시한다(`preambleSyncBlockMs`).
|
|
148
|
+
const preambleSyncBlock = isolated ? process.env[PREAMBLE_SYNC_BLOCK_ENV]?.trim() : undefined;
|
|
149
|
+
if (preambleSyncBlock) {
|
|
150
|
+
debug.log('self-implement.elanous-tui-spawn', 'test-seam-env', { name: PREAMBLE_SYNC_BLOCK_ENV, value: preambleSyncBlock });
|
|
151
|
+
}
|
|
141
152
|
const controller = opts.controller ?? deriveChildController(process.env, process.pid);
|
|
142
153
|
const channels = 'pty,inbox';
|
|
143
154
|
debug.log('self-implement.elanous-tui-spawn', 'controller', { controller, channels });
|
|
@@ -149,6 +160,8 @@ export function elanousTuiSpawnOptions(opts: ElanousTuiSpawnOptions): StartOpts
|
|
|
149
160
|
],
|
|
150
161
|
accessMode: 'auto',
|
|
151
162
|
transitionPolicy: 'open',
|
|
163
|
+
// 안 넘길 때는 로그인 셸 캡처본에 그 변수가 있어도 지운다 — 비격리 자식에 seam 이 새지 않게.
|
|
164
|
+
...(preambleSyncBlock ? {} : { unsetEnv: [PREAMBLE_SYNC_BLOCK_ENV] }),
|
|
152
165
|
// ⭐ 대표 2026-08-02 — 자식 화면 기본 **160×40**. 가상 PTY라 사람 터미널과 무관하고,
|
|
153
166
|
// 좁으면 렌더 블록이 화면을 넘어 **관측이 잘린다**(그 실측이 `--cols/--rows` 를 열게 했다).
|
|
154
167
|
cols: opts.cols ?? 160,
|
|
@@ -164,6 +177,7 @@ export function elanousTuiSpawnOptions(opts: ElanousTuiSpawnOptions): StartOpts
|
|
|
164
177
|
ELANOUS_CONTROL_CHANNELS: channels,
|
|
165
178
|
...observeOnlyFlagEnv(opts.observeOnly),
|
|
166
179
|
...(debugLevel === undefined ? {} : { ELANOUS_DEBUG_LEVEL: debugLevel }),
|
|
180
|
+
...(preambleSyncBlock ? { [PREAMBLE_SYNC_BLOCK_ENV]: preambleSyncBlock } : {}),
|
|
167
181
|
...childRunContextEnv('self-build'),
|
|
168
182
|
...childNestEnv(),
|
|
169
183
|
...harnessSpaceEnv(opts.space.kind, opts.space.id, runId),
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// FLEX-COORD-FU-PLACE — 후속 골 초안(FollowUpDraftRecord)에 판 배치·우선순위를 «제안»한다.
|
|
2
|
+
// FLEX-RFC §A-⑧ L-d 조율자: 후속 골 칸의 판 배치·우선순위를 정하고 작업 지시서에
|
|
3
|
+
// 자율 폭·조망 예산을 싣는다. 지금 초안은 판·우선순위 없이 shadow 로만 남는다.
|
|
4
|
+
// 이 모듈은 순수 계산만 한다 — 쓰기 없음(제안만). 제안을 초안 기록에 싣고 live 일 때
|
|
5
|
+
// placeCell 로 실제 판에 놓는 이어주기는 다음 조각이 recordFollowUpOnMerge·
|
|
6
|
+
// recordFollowUpOnBlocked(follow-up-goals.ts)에서 한다.
|
|
7
|
+
|
|
8
|
+
import type { PlacementPriority } from '../release-loop/placement.js';
|
|
9
|
+
|
|
10
|
+
/** 배치 제안에 필요한 초안 칸 — FollowUpDraftRecord 의 구조 부분집합이라 그대로 건넬 수 있다. */
|
|
11
|
+
export interface FollowUpPlacementRecord {
|
|
12
|
+
cellId: string;
|
|
13
|
+
depth: number;
|
|
14
|
+
ending?: 'blocked';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** 원래 칸(제안의 기준) — 판은 `x.y.z` 체크리스트 판, 우선순위는 배치 우선순위다. */
|
|
18
|
+
export interface FollowUpParentCell {
|
|
19
|
+
version: string;
|
|
20
|
+
priority: PlacementPriority;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** 배치 제안 — 초안 기록에 실렸다가 live 배치(placeCell)의 입력이 된다. */
|
|
24
|
+
export interface FollowUpPlacementProposal {
|
|
25
|
+
cellId: string;
|
|
26
|
+
version: string;
|
|
27
|
+
priority: PlacementPriority;
|
|
28
|
+
reason: string;
|
|
29
|
+
autonomyWidth: number;
|
|
30
|
+
groundingBudget: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** 깊이 1 후속의 자율 폭(단계). 링크가 깊어질수록 1씩 좁히고 1 미만으로는 내려가지 않는다. */
|
|
34
|
+
export const FOLLOW_UP_AUTONOMY_WIDTH_BASE = 3;
|
|
35
|
+
/** 깊이 1 후속의 조망(그라운딩) 예산(근거 수). 깊이마다 절반씩 좁히고 2 미만으로는 내려가지 않는다. */
|
|
36
|
+
export const FOLLOW_UP_GROUNDING_BUDGET_BASE = 8;
|
|
37
|
+
|
|
38
|
+
const PRIORITY_STEPS: readonly PlacementPriority[] = ['P0', 'P1', 'P2'];
|
|
39
|
+
|
|
40
|
+
/** 원래 칸의 다음 판 — 마지막 칸을 하나 올린다(release-tool 의 nextVersion 와 같은 계산). */
|
|
41
|
+
export function nextReleaseVersion(version: string): string {
|
|
42
|
+
const [major, minor, patch] = version.split('.').map(Number);
|
|
43
|
+
return `${major}.${minor}.${patch! + 1}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** 깊이 2 이상이면 원래 우선순위에서 한 단 낮춘다 — P2 밑으로는 내려가지 않는다. */
|
|
47
|
+
function priorityForDepth(parent: PlacementPriority, depth: number): PlacementPriority {
|
|
48
|
+
const index = PRIORITY_STEPS.indexOf(parent);
|
|
49
|
+
if (index < 0 || depth < 2) return parent;
|
|
50
|
+
return PRIORITY_STEPS[Math.min(index + 1, PRIORITY_STEPS.length - 1)]!;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** 후속이 반복될수록 자율은 줄고 조망은 좁힌다 — 같은 칸을 도는 사슬이 제자리 걸음으로 늙지 않게. */
|
|
54
|
+
function budgetsForDepth(depth: number): { autonomyWidth: number; groundingBudget: number } {
|
|
55
|
+
const d = Math.max(1, depth);
|
|
56
|
+
return {
|
|
57
|
+
autonomyWidth: Math.max(1, FOLLOW_UP_AUTONOMY_WIDTH_BASE - (d - 1)),
|
|
58
|
+
groundingBudget: Math.max(2, Math.floor(FOLLOW_UP_GROUNDING_BUDGET_BASE / d)),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 후속 초안 한 건의 판 배치 제안 — 순수 함수, 아무것도 쓰지 않는다.
|
|
64
|
+
* 기본 = 원래 칸의 다음 판 ⊕ 같은 우선순위 · 깊이 2 이상이면 한 단 낮춤(P2 하한) ·
|
|
65
|
+
* ending 이 blocked 면 같은 판. 자율 폭·조망 예산은 깊이로 좁힌다.
|
|
66
|
+
*/
|
|
67
|
+
export function proposeFollowUpPlacement(record: FollowUpPlacementRecord, parent: FollowUpParentCell): FollowUpPlacementProposal {
|
|
68
|
+
const depth = Math.max(1, record.depth);
|
|
69
|
+
const blocked = record.ending === 'blocked';
|
|
70
|
+
const version = blocked ? parent.version : nextReleaseVersion(parent.version);
|
|
71
|
+
const priority = priorityForDepth(parent.priority, depth);
|
|
72
|
+
const { autonomyWidth, groundingBudget } = budgetsForDepth(depth);
|
|
73
|
+
const reason = `후속 깊이 ${depth} — ${blocked
|
|
74
|
+
? `막힌 런의 후속은 원래 칸과 같은 판 ${version}`
|
|
75
|
+
: `원래 칸 ${parent.version} 의 다음 판 ${version}`} · ${depth >= 2
|
|
76
|
+
? `우선순위 한 단 낮춤 ${parent.priority}→${priority}(하한 P2)`
|
|
77
|
+
: `같은 우선순위 ${priority}`} · 자율 폭 ${autonomyWidth} · 조망 예산 ${groundingBudget}`;
|
|
78
|
+
return { cellId: record.cellId, version, priority, reason, autonomyWidth, groundingBudget };
|
|
79
|
+
}
|
|
@@ -55,6 +55,8 @@ export interface GateArtifactShard {
|
|
|
55
55
|
files: string[];
|
|
56
56
|
current: GateArtifactRun;
|
|
57
57
|
baseline: GateArtifactRun;
|
|
58
|
+
/** Latest incomplete attempt only; the verdict remains unmeasured. */
|
|
59
|
+
unmeasuredReason?: string;
|
|
58
60
|
}
|
|
59
61
|
|
|
60
62
|
/** SIDE-VERIFY ③ — 판정 «정수»(OPT 열차 영수증 재료). 이름은 게이트 집계(`SelfGateCliResult.baseline` ·
|
|
@@ -87,6 +89,8 @@ export interface GateArtifactSummary extends GateArtifactCounts {
|
|
|
87
89
|
/** 정수 칸 중 하나라도 null 일 때만 — 왜 못 셌나(한 줄). */
|
|
88
90
|
countsUnavailableReason?: string;
|
|
89
91
|
unmeasuredReason?: string;
|
|
92
|
+
/** Per-shard cause even when no process attempt was recorded. */
|
|
93
|
+
unmeasuredByShard?: Record<string, string>;
|
|
90
94
|
/** 분할 없는 경로의 지금 쪽 `bun test` 종료 코드(그 경로엔 JUnit 이 없어 shardsDetail 이 비다). */
|
|
91
95
|
unshardedRc?: number | null;
|
|
92
96
|
artifactsUnavailable?: GateArtifactsUnavailable;
|
|
@@ -198,7 +202,12 @@ export function writeGateArtifacts(input: GateArtifactInput): { summaryPath: str
|
|
|
198
202
|
writeFileSync(run.resultPath, runResultBody(run));
|
|
199
203
|
return run;
|
|
200
204
|
};
|
|
201
|
-
shardsDetail.push({
|
|
205
|
+
shardsDetail.push({
|
|
206
|
+
shardId: attempt.shardId, attempt: attempt.attempt, files, current: side('current'), baseline: side('baseline'),
|
|
207
|
+
...(input.sharded?.unmeasuredByShard?.[attempt.shardId] !== undefined
|
|
208
|
+
&& attempt === input.sharded.attempts.filter((item) => item.shardId === attempt.shardId).at(-1)
|
|
209
|
+
? { unmeasuredReason: input.sharded.unmeasuredByShard[attempt.shardId] } : {}),
|
|
210
|
+
});
|
|
202
211
|
}
|
|
203
212
|
const counts = input.counts ?? NULL_GATE_ARTIFACT_COUNTS;
|
|
204
213
|
const summary: GateArtifactSummary = {
|
|
@@ -219,6 +228,7 @@ export function writeGateArtifacts(input: GateArtifactInput): { summaryPath: str
|
|
|
219
228
|
...(Object.values(counts).some((value) => value === null)
|
|
220
229
|
? { countsUnavailableReason: input.countsUnavailableReason ?? 'not recorded' } : {}),
|
|
221
230
|
...(input.unmeasuredReason !== undefined ? { unmeasuredReason: input.unmeasuredReason } : {}),
|
|
231
|
+
...(input.sharded?.unmeasuredByShard !== undefined ? { unmeasuredByShard: input.sharded.unmeasuredByShard } : {}),
|
|
222
232
|
...(input.unshardedRc !== undefined ? { unshardedRc: input.unshardedRc } : {}),
|
|
223
233
|
...(input.artifactsUnavailable !== undefined ? { artifactsUnavailable: input.artifactsUnavailable } : {}),
|
|
224
234
|
};
|
|
@@ -252,16 +262,17 @@ export function writeRemoteUnavailableGateArtifacts(
|
|
|
252
262
|
|
|
253
263
|
// ── 원격 산출 회수 (SIDE-VERIFY-GATE-SHARDS ②) ──────────────────────────────
|
|
254
264
|
// 원격 run 은 `$W` 임시 트리에서 돌고 끝나면 trap 이 `$W` 를 지운다(gate-remote.ts remoteScript). 그래서 원격 쪽
|
|
255
|
-
// `--artifact-dir` 는 `$W` «밖»의
|
|
265
|
+
// `--artifact-dir` 는 `$W` «밖»의 호스트 디스크 경로(/var/tmp/elanous-gate-artifacts-<nonce>)로 준다 — run 이 끝나도 남고, 회수
|
|
256
266
|
// ssh 가 읽은 뒤 지운다. 회수 프로토콜은 tar 없이 «이름 줄 · base64 한 줄» 쌍 ⊕ 끝 표지(잘림 판별).
|
|
257
267
|
|
|
258
|
-
export const REMOTE_ARTIFACT_PREFIX = '/tmp/elanous-gate-artifacts-';
|
|
268
|
+
export const REMOTE_ARTIFACT_PREFIX = '/var/tmp/elanous-gate-artifacts-';
|
|
259
269
|
const FETCH_END = '__GATE_ARTIFACTS_END__';
|
|
260
270
|
/** 다 보냈지만 원격 dir 을 못 지웠다 — 회수는 성공, 잔여는 경고로 드러낸다(조용히 남기지 않는다). */
|
|
261
271
|
const FETCH_END_KEPT = '__GATE_ARTIFACTS_END_KEPT__';
|
|
262
272
|
const FETCH_MISSING = '__GATE_ARTIFACTS_MISSING__';
|
|
263
273
|
const FETCH_READ_FAILED = '__GATE_ARTIFACTS_READ_FAILED__';
|
|
264
|
-
|
|
274
|
+
// Legacy `/tmp` receipts remain readable for in-flight runs; new paths use host disk `/var/tmp`.
|
|
275
|
+
const remoteDirPattern = /^\/(?:var\/)?tmp\/elanous-gate-artifacts-[0-9a-f]{8,64}$/;
|
|
265
276
|
const artifactNamePattern = /^[A-Za-z0-9._-]+$/;
|
|
266
277
|
export const REMOTE_ARTIFACT_FETCH_TIMEOUT_MS = 5 * 60_000;
|
|
267
278
|
|
|
@@ -5,6 +5,7 @@ import { dirname, join } from 'node:path';
|
|
|
5
5
|
import { prepareDeterministicChildEnvironment } from '../../scripts/lib/deterministic-env.js';
|
|
6
6
|
import { debug } from '../debug/log.js';
|
|
7
7
|
import { runGitCommand } from '../git-fs/runner.js';
|
|
8
|
+
import type { GitRunResult } from '../git-fs/retry.js';
|
|
8
9
|
import { linkWorktreeDependencies } from '../git-fs/worktree.js';
|
|
9
10
|
import { reapStaleGateWorktrees } from './gate-baseline-reap.js';
|
|
10
11
|
|
|
@@ -28,6 +29,8 @@ export interface GateTestFailure {
|
|
|
28
29
|
baselinePresence: GateBaselinePresence;
|
|
29
30
|
attributedBy?: 'name-across-files' | 'copied-across-files';
|
|
30
31
|
precondition?: GateFailurePrecondition;
|
|
32
|
+
/** 귀속 불일치 등으로 `unknown` 판정을 내린 이유. 판정 enum 은 바꾸지 않는다. */
|
|
33
|
+
unknownReason?: '귀속 불일치';
|
|
31
34
|
/** 같은 gate 실행 안에서 같은 시험의 통과 기록이 있으면 `may-vary`로 보존한다. 타임아웃은 재실행 결과 변동성도 함께 표현한다. */
|
|
32
35
|
timeoutVariability?: TimeoutVariability;
|
|
33
36
|
/** 시간 초과한 정확한 시험이 base 로그에서는 통과해 자식 회귀로 귀속됐는지 나타낸다. */
|
|
@@ -189,6 +192,7 @@ type BaselineUnknownReason = 'module-load-error' | 'infrastructure-failure' | 't
|
|
|
189
192
|
|
|
190
193
|
const BASELINE_TIMEOUT_PER_FILE_MS = 300_000;
|
|
191
194
|
const BASELINE_TIMEOUT_TOTAL_CAP_MS = 600_000;
|
|
195
|
+
const BASELINE_WORKTREE_ADD_TIMEOUT_MS = 180_000;
|
|
192
196
|
|
|
193
197
|
export function baselineTimeoutForFiles(fileCount: number): number {
|
|
194
198
|
return Math.min(Math.max(1, fileCount) * BASELINE_TIMEOUT_PER_FILE_MS, BASELINE_TIMEOUT_TOTAL_CAP_MS);
|
|
@@ -197,6 +201,8 @@ export function baselineTimeoutForFiles(fileCount: number): number {
|
|
|
197
201
|
export interface GatePassedTestEvidence {
|
|
198
202
|
status: 'available' | 'unavailable';
|
|
199
203
|
tests?: readonly Pick<GateTestFailure, 'file' | 'name'>[];
|
|
204
|
+
/** 기준선 JUnit 의 전체 testcase 목록(통과·실패·스킵 포함). 귀속 일치 확인에 쓴다. */
|
|
205
|
+
testCases?: readonly Pick<GateTestFailure, 'file' | 'name'>[];
|
|
200
206
|
reason?: string;
|
|
201
207
|
}
|
|
202
208
|
|
|
@@ -399,11 +405,15 @@ export function extractGateTestFailures(log: string): Array<Omit<GateTestFailure
|
|
|
399
405
|
|
|
400
406
|
type GateTestIdentitySource = Pick<GateTestFailure, 'file' | 'name'>;
|
|
401
407
|
|
|
402
|
-
function
|
|
408
|
+
function gateTestName({ file, name }: GateTestIdentitySource): string | undefined {
|
|
403
409
|
if (!file) return undefined;
|
|
404
410
|
const prefix = `${file} > `;
|
|
405
|
-
|
|
406
|
-
|
|
411
|
+
return name.startsWith(prefix) ? name.slice(prefix.length) : name;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function gateTestIdentity(source: GateTestIdentitySource): string | undefined {
|
|
415
|
+
const testName = gateTestName(source);
|
|
416
|
+
return testName === undefined ? undefined : `${source.file}\u0000${testName}`;
|
|
407
417
|
}
|
|
408
418
|
|
|
409
419
|
function extractGatePassedTests(log: string): Array<Pick<GateTestFailure, 'file' | 'name'>> {
|
|
@@ -438,6 +448,44 @@ function decodeXmlEntities(value: string): string {
|
|
|
438
448
|
})[entity]!);
|
|
439
449
|
}
|
|
440
450
|
|
|
451
|
+
/**
|
|
452
|
+
* 기준선 JUnit 의 전체 testcase(통과·실패·스킵 무관)를 gate identity 형태로 만든다.
|
|
453
|
+
* 귀속 일치 확인(#27844)에 쓴다 — 콘솔 실패 헤더의 파일 귀속이 JUnit 과 어긋나는지는 통과 목록만으로는 못 본다.
|
|
454
|
+
* 파일 = 감싼 testsuite 의 `file=`(바깥으로 상속) → 없으면 testcase `file=`(Bun 산출에선 둘이 같다). `classname` 은 describe 이름일 수 있어
|
|
455
|
+
* 파일로 쓰지 않는다 — 파일을 못 정하면 그 testcase 는 빼고(귀속 불일치 «양성 신호» 없음 = 기존 판정 유지).
|
|
456
|
+
* 이름 = 콘솔 `(fail)` 줄과 같은 꼴로 describe 경로를 앞에 붙인다 — 중첩 testsuite 이름들(파일 수준 제외),
|
|
457
|
+
* 중첩이 없는 평면 JUnit 이면 testcase `classname`(파일과 다를 때).
|
|
458
|
+
*/
|
|
459
|
+
export function extractJUnitTestCases(xml: string): Array<Pick<GateTestFailure, 'file' | 'name'>> {
|
|
460
|
+
const tests: Array<Pick<GateTestFailure, 'file' | 'name'>> = [];
|
|
461
|
+
const attribute = (attributes: string, key: string): string | undefined => {
|
|
462
|
+
const raw = attributes.match(new RegExp(`\\b${key}=(?:"([^"]*)"|'([^']*)')`))?.slice(1).find((value) => value !== undefined);
|
|
463
|
+
return raw === undefined ? undefined : decodeXmlEntities(raw);
|
|
464
|
+
};
|
|
465
|
+
const suites: Array<{ file: string | undefined; name: string | undefined }> = [];
|
|
466
|
+
const tokenRe = /<testsuite\b([^>]*?)(\/?)>|<\/testsuite\s*>|<testcase\b([^>]*?)(?:\/>|>[\s\S]*?<\/testcase>)/g;
|
|
467
|
+
for (const match of xml.matchAll(tokenRe)) {
|
|
468
|
+
const token = match[0];
|
|
469
|
+
if (token.startsWith('</testsuite')) { suites.pop(); continue; }
|
|
470
|
+
if (token.startsWith('<testsuite')) {
|
|
471
|
+
if (match[2] === '/') continue;
|
|
472
|
+
const attributes = match[1] ?? '';
|
|
473
|
+
suites.push({ file: attribute(attributes, 'file') ?? suites.at(-1)?.file, name: attribute(attributes, 'name') });
|
|
474
|
+
continue;
|
|
475
|
+
}
|
|
476
|
+
const attributes = match[3] ?? '';
|
|
477
|
+
const testName = attribute(attributes, 'name');
|
|
478
|
+
const file = suites.at(-1)?.file ?? attribute(attributes, 'file');
|
|
479
|
+
if (!testName || !file) continue;
|
|
480
|
+
const nested = suites.flatMap((suite) => suite.name && suite.name !== file && suite.name !== suite.file ? [suite.name] : []);
|
|
481
|
+
// 평면 JUnit(describe 가 testsuite 로 중첩되지 않음)은 classname 이 describe 이름이다 — 이름 복원에만 쓴다.
|
|
482
|
+
const classname = attribute(attributes, 'classname');
|
|
483
|
+
const describePath = nested.length > 0 ? nested : classname && classname !== file ? [classname] : [];
|
|
484
|
+
tests.push({ file, name: [file, ...describePath, testName].join(' > ') });
|
|
485
|
+
}
|
|
486
|
+
return tests;
|
|
487
|
+
}
|
|
488
|
+
|
|
441
489
|
export function extractJUnitPassedTests(xml: string): Array<Pick<GateTestFailure, 'file' | 'name'>> {
|
|
442
490
|
const tests: Array<Pick<GateTestFailure, 'file' | 'name'>> = [];
|
|
443
491
|
const testcaseRe = /<testcase\b([^>]*?)(?:\/>|>([\s\S]*?)<\/testcase>)/g;
|
|
@@ -461,6 +509,19 @@ function passedIdentities(tests: readonly Pick<GateTestFailure, 'file' | 'name'>
|
|
|
461
509
|
}));
|
|
462
510
|
}
|
|
463
511
|
|
|
512
|
+
/** 기준선 JUnit 전체 testcase 를 시험명 → 파일 집합으로 묶는다. 귀속 불일치 양성 신호 확인에 쓴다. */
|
|
513
|
+
function junitFilesByTestName(testCases: readonly Pick<GateTestFailure, 'file' | 'name'>[]): Map<string, Set<string>> {
|
|
514
|
+
const filesByTestName = new Map<string, Set<string>>();
|
|
515
|
+
for (const testCase of testCases) {
|
|
516
|
+
const testName = gateTestName(testCase);
|
|
517
|
+
if (testName === undefined || !testCase.file) continue;
|
|
518
|
+
const files = filesByTestName.get(testName) ?? new Set<string>();
|
|
519
|
+
files.add(testCase.file);
|
|
520
|
+
filesByTestName.set(testName, files);
|
|
521
|
+
}
|
|
522
|
+
return filesByTestName;
|
|
523
|
+
}
|
|
524
|
+
|
|
464
525
|
export function classifyGateTestFailures(
|
|
465
526
|
worktreeLog: string,
|
|
466
527
|
baselineLog: string | undefined,
|
|
@@ -505,6 +566,21 @@ export function classifyGateTestFailures(
|
|
|
505
566
|
const identity = gateTestIdentity(failure);
|
|
506
567
|
return identity ? [identity] : [];
|
|
507
568
|
}));
|
|
569
|
+
// #27844: Bun 콘솔의 실패 헤더 귀속은 신뢰할 수 없다 — introduced 로 단정하기 전에
|
|
570
|
+
// 기준선 JUnit(testsuite file= · classname)으로 귀속을 확인한다. 기준선은 base worktree 라
|
|
571
|
+
// worktree 에서 새로 추가한 시험명을 담을 수 없어서 «이름이 없다»만으로는 귀속 불일치라 못
|
|
572
|
+
// 한다. 시험명이 «다른 파일»에 존재한다는 양성 신호가 있을 때만 귀속 불일치로 판정하고,
|
|
573
|
+
// 시험명이 귀속 파일의 JUnit 에 있으면, 또는 어디에도 없으면(신규 시험) 기존 판정을 유지한다.
|
|
574
|
+
const baselineJUnitFilesByTestName = baselinePassedEvidence?.status === 'available' && baselinePassedEvidence.testCases !== undefined
|
|
575
|
+
? junitFilesByTestName(baselinePassedEvidence.testCases)
|
|
576
|
+
: undefined;
|
|
577
|
+
const junitAttributionMismatch = (failure: GateTestIdentitySource): boolean => {
|
|
578
|
+
if (!baselineJUnitFilesByTestName) return false;
|
|
579
|
+
const testName = gateTestName(failure);
|
|
580
|
+
if (testName === undefined || !failure.file) return false;
|
|
581
|
+
const files = baselineJUnitFilesByTestName.get(testName);
|
|
582
|
+
return files !== undefined && !files.has(failure.file);
|
|
583
|
+
};
|
|
508
584
|
const comparable = worktreeFailures.filter((failure) => !isTimeoutDiagnostic(failure.diagnostic) && !matchedGatePrecondition(failure.diagnostic ?? '') && !(failure.file && missing.has(failure.file)) && baselineLog !== undefined && Boolean(failure.file));
|
|
509
585
|
const comparison = classifyAgainstBaseline(baselineFailures, comparable, (failure) => failure.name);
|
|
510
586
|
const preexisting = new Set(comparison.preexisting);
|
|
@@ -585,10 +661,18 @@ export function classifyGateTestFailures(
|
|
|
585
661
|
debug.log('self-implement.gate', 'attributed-copy-across-files', { name: path, file: failure.file, baselineFile: original.file });
|
|
586
662
|
return { ...failure, attribution: 'preexisting' as const, attributedBy: 'copied-across-files' as const, baselinePresence };
|
|
587
663
|
}
|
|
664
|
+
if (junitAttributionMismatch(failure)) {
|
|
665
|
+
debug.log('self-implement.gate', 'attribution-mismatch', { name: failure.name, file: failure.file });
|
|
666
|
+
return { ...failure, attribution: 'unknown' as const, baselinePresence, unknownReason: '귀속 불일치' as const };
|
|
667
|
+
}
|
|
588
668
|
return { ...failure, attribution: 'introduced' as const, baselinePresence };
|
|
589
669
|
}
|
|
590
670
|
if (baselineLog === undefined || !failure.file) return { ...failure, attribution: 'unknown' as const, baselinePresence };
|
|
591
671
|
const attribution = preexisting.has(failure) ? 'preexisting' as const : 'introduced' as const;
|
|
672
|
+
if (attribution === 'introduced' && junitAttributionMismatch(failure)) {
|
|
673
|
+
debug.log('self-implement.gate', 'attribution-mismatch', { name: failure.name, file: failure.file });
|
|
674
|
+
return { ...failure, attribution: 'unknown' as const, baselinePresence, unknownReason: '귀속 불일치' as const };
|
|
675
|
+
}
|
|
592
676
|
// 재실행 관측이 `pass`일 때만 흔들림으로 강등한다. 관측이 없거나 실패면 원래 귀속을 유지한다.
|
|
593
677
|
if (attribution === 'introduced' && observationsFor(failure.name).includes('pass')) {
|
|
594
678
|
return { ...failure, attribution: 'flaky-rerun' as const, baselinePresence };
|
|
@@ -705,12 +789,38 @@ function runIsolatedBunTest(cwd: string, args: string[], timeout: number): Proce
|
|
|
705
789
|
try {
|
|
706
790
|
// SIGKILL — a test that traps SIGTERM while blocked in a native wait never runs its handler, so spawnSync
|
|
707
791
|
// waited forever and its drive grandchildren lived on as ppid=1 orphans (09-30 O1: 19 processes, up to 11h).
|
|
708
|
-
|
|
792
|
+
const started = Date.now();
|
|
793
|
+
const result = spawnSync('bun', ['test', ...args], { cwd, env: isolated.env, encoding: 'utf8', timeout, killSignal: 'SIGKILL', maxBuffer: 32 * 1024 * 1024 });
|
|
794
|
+
debug.log('self-implement.gate-baseline', 'test-process-result', {
|
|
795
|
+
status: result.status, signal: result.signal, errorCode: (result.error as NodeJS.ErrnoException | undefined)?.code ?? null,
|
|
796
|
+
elapsedMs: Date.now() - started, timeoutMs: timeout, parentRssBytes: process.memoryUsage().rss,
|
|
797
|
+
cgroupMemoryCurrentBytes: cgroupMemoryBytes('memory.current'), cgroupMemoryLimitBytes: cgroupMemoryBytes('memory.max'),
|
|
798
|
+
});
|
|
799
|
+
return result;
|
|
709
800
|
} finally {
|
|
710
801
|
isolated.cleanup();
|
|
711
802
|
}
|
|
712
803
|
}
|
|
713
804
|
|
|
805
|
+
function cgroupMemoryBytes(name: 'memory.current' | 'memory.max'): number | null {
|
|
806
|
+
try {
|
|
807
|
+
const raw = readFileSync(`/sys/fs/cgroup/${name}`, 'utf8').trim();
|
|
808
|
+
const value = Number(raw);
|
|
809
|
+
return Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
810
|
+
} catch { return null; }
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/** A failed checkout never proves that a baseline test ran. Preserve the Git failure's signal and timeout. */
|
|
814
|
+
export function classifyBaselineWorktreeAddFailure(add: GitRunResult, elapsedMs: number): BaselineProcessResult {
|
|
815
|
+
const reason = add.errorCode === 'ETIMEDOUT' ? 'worktree-add-timeout'
|
|
816
|
+
: add.signal ? `worktree-add-signal-${add.signal}` : 'worktree-add-failed';
|
|
817
|
+
return {
|
|
818
|
+
status: 'unknown', unknownReason: 'infrastructure-failure', childResponsibility: 'none',
|
|
819
|
+
log: `baseline ${reason} (code ${String(add.status)}, elapsed ${elapsedMs}ms, limit ${BASELINE_WORKTREE_ADD_TIMEOUT_MS}ms)`,
|
|
820
|
+
output: `${add.stdout}\n${add.stderr}`,
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
|
|
714
824
|
function junitReportTemporaryDirectory(): string {
|
|
715
825
|
return process.env.ELANOUS_GATE_JUNIT_TMPDIR || tmpdir();
|
|
716
826
|
}
|
|
@@ -730,7 +840,15 @@ function runBaselineBunTest(cwd: string, args: string[], timeout: number): Proce
|
|
|
730
840
|
if (!existsSync(reportPath)) {
|
|
731
841
|
return { ...process, passedTestEvidence: { status: 'unavailable', reason: 'JUnit passed-test evidence unavailable: reporter outfile was not created' } };
|
|
732
842
|
}
|
|
733
|
-
|
|
843
|
+
const junitXml = readFileSync(reportPath, 'utf8');
|
|
844
|
+
return {
|
|
845
|
+
...process,
|
|
846
|
+
passedTestEvidence: {
|
|
847
|
+
status: 'available',
|
|
848
|
+
tests: extractJUnitPassedTests(junitXml),
|
|
849
|
+
testCases: extractJUnitTestCases(junitXml),
|
|
850
|
+
},
|
|
851
|
+
};
|
|
734
852
|
} catch (error) {
|
|
735
853
|
return { ...process, passedTestEvidence: { status: 'unavailable', reason: `JUnit passed-test evidence unreadable: ${String(error)}` } };
|
|
736
854
|
}
|
|
@@ -830,8 +948,16 @@ export function withBaselineWorktree<T>(cwd: string, baseRef: string, run: (base
|
|
|
830
948
|
const baselineDir = mkdtempSync(join(tmpdir(), 'elanous-gate-baseline-'));
|
|
831
949
|
let attached = false;
|
|
832
950
|
try {
|
|
833
|
-
const
|
|
834
|
-
|
|
951
|
+
const started = Date.now();
|
|
952
|
+
const add = runGitCommand(cwd, gateWorktreeAddArgs(baselineDir, baseRef), { encoding: 'utf8', timeout: BASELINE_WORKTREE_ADD_TIMEOUT_MS, killSignal: 'SIGKILL' });
|
|
953
|
+
const elapsedMs = Date.now() - started;
|
|
954
|
+
debug.log('self-implement.gate-baseline', 'worktree-add-result', {
|
|
955
|
+
phase: 'baseline',
|
|
956
|
+
status: add.status, signal: add.signal ?? null, errorCode: add.errorCode ?? null,
|
|
957
|
+
elapsedMs, timeoutMs: BASELINE_WORKTREE_ADD_TIMEOUT_MS, parentRssBytes: process.memoryUsage().rss,
|
|
958
|
+
cgroupMemoryCurrentBytes: cgroupMemoryBytes('memory.current'), cgroupMemoryLimitBytes: cgroupMemoryBytes('memory.max'),
|
|
959
|
+
});
|
|
960
|
+
if (add.status !== 0) return classifyBaselineWorktreeAddFailure(add, elapsedMs);
|
|
835
961
|
attached = true;
|
|
836
962
|
linkDependencies(cwd, baselineDir);
|
|
837
963
|
return run(baselineDir);
|
|
@@ -863,8 +989,16 @@ function withVerifyWorktree<T>(cwd: string, baseRef: string, run: (dir: string)
|
|
|
863
989
|
let attached = false;
|
|
864
990
|
try {
|
|
865
991
|
dir = mkdtempSync(join(tmpdir(), 'elanous-gate-baseline-'));
|
|
866
|
-
const
|
|
867
|
-
|
|
992
|
+
const started = Date.now();
|
|
993
|
+
const add = runGitCommand(cwd, gateWorktreeAddArgs(dir, baseRef), { encoding: 'utf8', timeout: BASELINE_WORKTREE_ADD_TIMEOUT_MS, killSignal: 'SIGKILL' });
|
|
994
|
+
const elapsedMs = Date.now() - started;
|
|
995
|
+
debug.log('self-implement.gate-baseline', 'worktree-add-result', {
|
|
996
|
+
phase: 'verify',
|
|
997
|
+
status: add.status, signal: add.signal ?? null, errorCode: add.errorCode ?? null,
|
|
998
|
+
elapsedMs, timeoutMs: BASELINE_WORKTREE_ADD_TIMEOUT_MS, parentRssBytes: process.memoryUsage().rss,
|
|
999
|
+
cgroupMemoryCurrentBytes: cgroupMemoryBytes('memory.current'), cgroupMemoryLimitBytes: cgroupMemoryBytes('memory.max'),
|
|
1000
|
+
});
|
|
1001
|
+
if (add.status !== 0) return classifyBaselineWorktreeAddFailure(add, elapsedMs);
|
|
868
1002
|
attached = true;
|
|
869
1003
|
linkDependencies(cwd, dir);
|
|
870
1004
|
return run(dir);
|
|
@@ -1343,7 +1477,8 @@ export function formatGateBaselineNote(report: GateBaselineReport, unrunImporter
|
|
|
1343
1477
|
+ (report.missingAtBase > 0 ? `, missing-at-base=${report.missingAtBase}` : '');
|
|
1344
1478
|
const lines = report.failures.map((failure) => `- ${failure.attribution}: ${failure.name}`
|
|
1345
1479
|
+ (includesBaselinePresence ? ` [baseline=${failure.baselinePresence}]` : '')
|
|
1346
|
-
+ (failure.precondition ? ` (${failure.precondition.name}; ${failure.precondition.remediation})` : '')
|
|
1480
|
+
+ (failure.precondition ? ` (${failure.precondition.name}; ${failure.precondition.remediation})` : '')
|
|
1481
|
+
+ (failure.unknownReason ? ` (${failure.unknownReason})` : ''));
|
|
1347
1482
|
const timedOutFailures = report.failures.filter((failure) => failure.attribution === 'flaky-timeout');
|
|
1348
1483
|
const { mayVary, same, unknown } = report.timeoutVariabilityCounts;
|
|
1349
1484
|
const timedOutLine = timedOutFailures.length > 0
|
|
@@ -859,7 +859,7 @@ function runSelfGateCliCore(cwd: string, options: SelfGateCliOptions, deps: Self
|
|
|
859
859
|
: runShards(cwd, testFiles, selection.baseRef, shardCount);
|
|
860
860
|
capture.sharded = sharded;
|
|
861
861
|
capture.verdict = sharded.aggregate.status;
|
|
862
|
-
lines.push(`shards: ${sharded.shards.length} (${sharded.shards.map((shard) => `${shard.id}=${shard.files.join(',')}`).join('; ')})${sharded.measurementFailures ? ` · 측정 실패 ${sharded.measurementFailures}` : ''}${options.fixedShardDistribution ? ' · 고정 분배(사전 측정 없음)' : ''}`);
|
|
862
|
+
lines.push(`shards: ${sharded.shards.length} (${sharded.shards.map((shard) => `${shard.id}=${shard.files.join(',')}`).join('; ')})${sharded.expandedFrom !== undefined ? ` · RSS 예산상 ${sharded.expandedFrom}→${sharded.shards.length} 자동 확장` : ''}${sharded.measurementFailures ? ` · 측정 실패 ${sharded.measurementFailures}` : ''}${options.fixedShardDistribution ? ' · 고정 분배(사전 측정 없음)' : ''}${sharded.distribution === 'fixed-cap-fallback' ? ` · 호스트 상한 자동 고정 분배(${sharded.fallbackReason})` : ''}`);
|
|
863
863
|
// 조각이 «못 쟀다»일 때 이유가 줄에 없으면 자리·시간 초과·죽음을 가를 수 없다(OP 10-09 light RC) — 종료 코드·신호를 같이 싣는다.
|
|
864
864
|
const side = (code: number | null, signal: string | null | undefined, junit: string | undefined) => signal ? `signal ${signal}` : code === null ? 'exit ?' : `exit ${code}${junit === undefined ? ' · junit 없음' : ''}`;
|
|
865
865
|
for (const attempt of sharded.attempts) {
|
|
@@ -886,7 +886,12 @@ function runSelfGateCliCore(cwd: string, options: SelfGateCliOptions, deps: Self
|
|
|
886
886
|
let shardBaseline: SelfGateCliResult['baseline'];
|
|
887
887
|
let unmeasuredReason: string | undefined;
|
|
888
888
|
if (aggregate.status === 'unmeasured') {
|
|
889
|
-
unmeasuredReason =
|
|
889
|
+
unmeasuredReason = sharded.reason
|
|
890
|
+
? redactSecretText(sharded.reason).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').slice(0, 500)
|
|
891
|
+
: aggregate.retryShardIds.join(', ') || 'no complete JUnit';
|
|
892
|
+
for (const shardId of aggregate.retryShardIds) {
|
|
893
|
+
lines.push(`shard unmeasured: ${shardId} · ${sharded.unmeasuredByShard?.[shardId] ?? sharded.reason ?? 'cause unavailable'}`);
|
|
894
|
+
}
|
|
890
895
|
lines.push(`shards: unmeasured (${unmeasuredReason})`);
|
|
891
896
|
capture.unmeasuredReason = unmeasuredReason;
|
|
892
897
|
}
|
|
@@ -88,6 +88,25 @@ export function extractGateRemoteFlags(argv: readonly string[]): GateRemoteFlags
|
|
|
88
88
|
return out;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
/** A remote importer sweep must not silently become one large test process. The measured planner may grow this
|
|
92
|
+
* starting count further when the observed RSS needs more memory-bounded bundles. */
|
|
93
|
+
export function remoteSelfGateArgv(input: {
|
|
94
|
+
changed?: boolean;
|
|
95
|
+
base?: string;
|
|
96
|
+
shards?: number;
|
|
97
|
+
fixedShardDistribution?: boolean;
|
|
98
|
+
includeImporters?: boolean;
|
|
99
|
+
artifactDir?: string;
|
|
100
|
+
}, sha: (ref: string) => string): string[] {
|
|
101
|
+
const shards = input.shards ?? (input.includeImporters ? 2 : undefined);
|
|
102
|
+
return ['bun', 'bin/elanous.mjs', 'self', 'gate', '--local', ...(input.changed ? ['--changed'] : []),
|
|
103
|
+
...(input.base ? ['--base', input.base === 'origin/main' ? input.base : sha(input.base)] : []),
|
|
104
|
+
...(shards !== undefined ? ['--shards', String(shards)] : []),
|
|
105
|
+
...(input.fixedShardDistribution ? ['--fixed-shard-distribution'] : []),
|
|
106
|
+
...(input.includeImporters ? ['--include-importers'] : []),
|
|
107
|
+
...(input.artifactDir ? ['--artifact-dir', input.artifactDir] : [])];
|
|
108
|
+
}
|
|
109
|
+
|
|
91
110
|
export interface GateDispatchDecision { mode: 'local' | 'remote'; host?: string; reason: string; load1: number }
|
|
92
111
|
|
|
93
112
|
export function decideGateDispatch(input: { flags: Pick<GateRemoteFlags, 'remote' | 'local'>; settings: GateRemoteSettings; load1: number; env?: NodeJS.ProcessEnv }): GateDispatchDecision {
|
|
@@ -249,7 +268,13 @@ export function remoteScript(input: { mirror: string; commit: string; fetchShas:
|
|
|
249
268
|
'umask 077',
|
|
250
269
|
'PATH="$HOME/.bun/bin:/opt/homebrew/bin:$PATH"; export PATH',
|
|
251
270
|
`infra() { echo "${INFRA}$1" >&2; exit 97; }`,
|
|
252
|
-
|
|
271
|
+
// `/tmp` is a 20 GiB tmpfs on WSL. One baseline checkout can exhaust it before any shard starts.
|
|
272
|
+
// Keep the entire child temp tree on the host disk; a low-space host yields infra fallback.
|
|
273
|
+
'TMPDIR=/var/tmp; export TMPDIR',
|
|
274
|
+
'free_kib=$(df -Pk "$TMPDIR" 2>/dev/null | awk \'NR==2 {print $4}\')',
|
|
275
|
+
'case "$free_kib" in ""|*[!0-9]*) infra disk-unmeasured;; esac',
|
|
276
|
+
'if [ "$free_kib" -lt 8388608 ]; then infra "disk-low:${free_kib}KiB"; fi',
|
|
277
|
+
'W=$(mktemp -d /var/tmp/elanous-gate-remote-XXXXXXXX) || infra mktemp',
|
|
253
278
|
'export W',
|
|
254
279
|
'trap \'rm -rf "$W"\' EXIT',
|
|
255
280
|
...payloadLines,
|
|
@@ -412,11 +437,13 @@ export interface DispatchOptions {
|
|
|
412
437
|
/** Set when this invocation cannot be reproduced remotely (e.g. self gate without --base): automatic placement
|
|
413
438
|
* falls back with this reason; an explicit self gate --remote reports an unmeasured check instead. */
|
|
414
439
|
localOnlyReason?: string;
|
|
415
|
-
/**
|
|
440
|
+
/** Explicit or caller-required remote measurement must never become a local fallback. */
|
|
416
441
|
explicitRemoteOnly?: boolean;
|
|
442
|
+
/** Keep the remote checkout and TypeScript cache per host slot across repeated checks. */
|
|
443
|
+
stableCheckout?: boolean;
|
|
417
444
|
/** Self gate CLI only: name the host for both automatic and explicit remote execution. */
|
|
418
445
|
reportRemoteHost?: boolean;
|
|
419
|
-
/**
|
|
446
|
+
/** Release gate host reservations shared by self gate and changed typecheck. */
|
|
420
447
|
reservationRoot?: string;
|
|
421
448
|
runLocal: () => number | Promise<number>;
|
|
422
449
|
/** Called once with the final remote outcome (never on a local decision), before its output passes through or the
|
|
@@ -457,12 +484,14 @@ export async function dispatchHeavyCheck(opts: DispatchOptions, deps: DispatchDe
|
|
|
457
484
|
return opts.runLocal();
|
|
458
485
|
}
|
|
459
486
|
let host = decision.host!;
|
|
460
|
-
const reservationRoot = opts.tool === 'self-gate'
|
|
487
|
+
const reservationRoot = opts.tool === 'self-gate' || opts.tool === 'ci-typecheck-changed'
|
|
488
|
+
? opts.reservationRoot ?? (deps.runner ? undefined : gateHostReservationRoot()) : undefined;
|
|
461
489
|
if (reservationRoot) {
|
|
462
490
|
const reservationHost = host.split('@').at(-1)!;
|
|
463
491
|
const first = inspectReleaseGateHost(reservationRoot, reservationHost);
|
|
464
492
|
if (first.status !== 'free') {
|
|
465
|
-
|
|
493
|
+
// Changed typecheck has a fixed node-b placement; a release reservation makes it unmeasured.
|
|
494
|
+
const alternate = opts.tool === 'self-gate' && reservationHost === 'node-b' ? 'node-c' : null;
|
|
466
495
|
const other = alternate ? inspectReleaseGateHost(reservationRoot, alternate) : null;
|
|
467
496
|
if (alternate && other?.status === 'free') {
|
|
468
497
|
debug.log('gate.remote', 'host-reserved-reroute', { from: host, to: alternate, reason: first.reason, status: first.status });
|
|
@@ -495,7 +524,7 @@ export async function dispatchHeavyCheck(opts: DispatchOptions, deps: DispatchDe
|
|
|
495
524
|
let outcome: RemoteRunOutcome;
|
|
496
525
|
for (;;) {
|
|
497
526
|
try {
|
|
498
|
-
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 }, deps.runner);
|
|
527
|
+
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, stableCheckout: opts.stableCheckout, hostCap }, deps.runner);
|
|
499
528
|
} catch (error) {
|
|
500
529
|
outcome = { kind: 'infra', reason: `exception: ${error instanceof Error ? error.message : String(error)}` };
|
|
501
530
|
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const IDENTITY_LINE = /^(agent|track|session|submitted):\s*(.*?)\s*$/i;
|
|
2
|
+
|
|
3
|
+
export function repositoryIdentifiers(ask: string): string[] {
|
|
4
|
+
const lines = ask.split(/\r?\n/);
|
|
5
|
+
const metadata = leadingIdentityMetadata(ask);
|
|
6
|
+
const body = metadata.size
|
|
7
|
+
? (lines[0]?.trim() === '---' ? lines.slice(lines.slice(1).findIndex((line) => line.trim() === '---') + 2) : lines.slice(lines.findIndex((line) => !IDENTITY_LINE.test(line))))
|
|
8
|
+
: lines;
|
|
9
|
+
return body
|
|
10
|
+
.filter((line) => !line.startsWith('Checkable requested criterion:'))
|
|
11
|
+
.join('\n')
|
|
12
|
+
.match(/[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*/g) ?? [];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function leadingIdentityMetadata(ask: string): Map<string, string> {
|
|
16
|
+
const lines = ask.split(/\r?\n/);
|
|
17
|
+
let candidates: string[] = [];
|
|
18
|
+
if (lines[0]?.trim() === '---') {
|
|
19
|
+
const end = lines.slice(1).findIndex((line) => line.trim() === '---');
|
|
20
|
+
if (end < 0) return new Map();
|
|
21
|
+
candidates = lines.slice(1, end + 1);
|
|
22
|
+
} else if (IDENTITY_LINE.test(lines[0] ?? '')) {
|
|
23
|
+
candidates = lines.slice(0, lines.findIndex((line) => !IDENTITY_LINE.test(line)) === -1
|
|
24
|
+
? lines.length
|
|
25
|
+
: lines.findIndex((line) => !IDENTITY_LINE.test(line)));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const metadata = new Map<string, string>();
|
|
29
|
+
for (const line of candidates) {
|
|
30
|
+
const match = IDENTITY_LINE.exec(line);
|
|
31
|
+
const value = match?.[2].trim();
|
|
32
|
+
if (match && value && !metadata.has(match[1].toLowerCase())) metadata.set(match[1].toLowerCase(), value);
|
|
33
|
+
}
|
|
34
|
+
return metadata;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** `submitted` 는 KST 로 적는다 — 두 트랙이 같은 벽시계를 인용해야 이력이 정렬된다. */
|
|
38
|
+
export function formatSubmittedAt(at: Date): string {
|
|
39
|
+
const parts = new Intl.DateTimeFormat('sv-SE', {
|
|
40
|
+
timeZone: 'Asia/Seoul', year: 'numeric', month: '2-digit', day: '2-digit',
|
|
41
|
+
hour: '2-digit', minute: '2-digit', hour12: false,
|
|
42
|
+
}).format(at);
|
|
43
|
+
return `${parts.replace(' ', ' ')} KST`;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 신원 머리말 — **값이 있는 줄만** 낸다.
|
|
48
|
+
*
|
|
49
|
+
* ⛔ 빈 값·`unknown` 을 찍지 않는다: 부재와 미지가 같은 값이 되면 조회가 거짓을 생산한다.
|
|
50
|
+
* *"모르면 비워라"* 가 아니라 **"없으면 줄을 쓰지 마라"** 다.
|
|
51
|
+
* ⭐ 우선순위는 **ask 에 이미 적힌 값 > 환경/시계 유도**다(호출자가 명시한 것이 이긴다).
|
|
52
|
+
*/
|
|
53
|
+
export function identityLines(ask: string, cwd: string, env: NodeJS.ProcessEnv, at: Date): string[] {
|
|
54
|
+
const metadata = leadingIdentityMetadata(ask);
|
|
55
|
+
const tree = /[/\\](pilot|axon)[/\\]/i.exec(cwd)?.[1]?.toLowerCase();
|
|
56
|
+
const track = metadata.get('track') ?? (tree === 'pilot' ? 'S' : tree === 'axon' ? 'T' : undefined);
|
|
57
|
+
const agent = metadata.get('agent') ?? env.AI_AGENT?.trim();
|
|
58
|
+
const session = metadata.get('session') ?? env.CLAUDE_CODE_SESSION_ID?.trim();
|
|
59
|
+
const submitted = metadata.get('submitted') ?? formatSubmittedAt(at);
|
|
60
|
+
return [
|
|
61
|
+
agent && `agent: ${agent}`,
|
|
62
|
+
track && `track: ${track}`,
|
|
63
|
+
session && `session: ${session}`,
|
|
64
|
+
submitted && `submitted: ${submitted}`,
|
|
65
|
+
].filter((line): line is string => Boolean(line));
|
|
66
|
+
}
|