elanous 0.2.29 → 0.2.31
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/{cIpv5nU9AycwYWZI9H589 → LSXfY0u9QtfDbejY0Ukf_}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{058a98ba.7eb28d5e6dc03565.js → 0bb0ff36.b8d418980951e5ba.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +62 -0
- package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6013-2f769370d8b4c2c6.js → 1335-6731f392c35216eb.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8332.6f0f49df772e163b.js → 1654.32de4b324981a188.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1834-50625904996a8fa8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{8795.32573a185af18c7b.js → 1913.7cc6fb6055b1ed3f.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{419.736c0d6f426249a7.js → 2001.6c7e0fd02190886c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.1fcfc9b8be83975f.js → 2213.2ccbada92c33ea0f.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4759.1f76713aefb87db5.js → 2871.0bca6137343b3f76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6776.06ff1e3b464cc607.js → 2898.fd781bc7cf01a7b7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1782-59db1b5aa06df38a.js → 2940-619bfd8ef337c611.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8471.8d2a8c74f09c36ff.js → 2985.39ccdecd36848b12.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +115 -0
- package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +64 -0
- package/apps/pwa/out/_next/static/chunks/{bc324b7c.02a09dd93f6a399b.js → 3267c0e6.d34854e7b3984a6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3278.2e5d15b53a4091c8.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{7725-4f83d5541fbdb81b.js → 3541-ce3a5424ed5ad7f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +34 -0
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{46bd8bea.2f4b4099172fcdb7.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1142.65d002789ab3af7d.js → 4174.92ed04922709ac9e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +36 -0
- package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +286 -0
- package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5173-233188df2f42c626.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +148 -0
- package/apps/pwa/out/_next/static/chunks/5307.60f2209e809bd627.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3396-97b97928c49190c9.js → 5458-16cd7a2b51b74c8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3403.7199205e65124486.js → 5525.86debf231e181813.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9143.ff14585db1d275ff.js → 5543.a438b8ab5a13ea47.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8398.73a19b39715eda04.js → 6092.a7f99e68b188ca66.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5591.a35e7a217734a8b9.js → 6157.0c9af021de4fb31b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7375.050ea0d72968e49f.js → 6433.fc573af22bbc9ab7.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1852.7f7b53991fcb99ef.js → 7502.ccd5b8065545edd0.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
- package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6534.1ab00f370db7b105.js → 7862.30a8d6482bb238eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{285adb1a.5654e605dddf86d2.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1516.dfaceff3fd2d0e0d.js → 9138.b6e80031afb1d973.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9907.49be0fcadaf214b5.js → 9221.7d22eaf353a2d4e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8767-2f6a634f5abeaa01.js → 9279-d28c5b7754d010ae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3160-95c96f4d2a21dd26.js → 9398-6aed28f0a96d0d6f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{328bb3ab-6628a1114fe3fb3b.js → 997ce8a5-2ad501927003b41b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6853.cc5174a9dee59593.js → 9989.3694300e5f000b14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-a5635eba0d73b84e.js → page-2ebb8fd59b9461f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0a07363b130182a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/{page-29900ed0011b2c83.js → page-521ee23ac8c0abfa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-9f92737b8766009a.js → page-149dc1caba411bb9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{425cfc4d.fb91158e3971c39f.js → b313b242.cb1265eea908db61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +122 -0
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +1 -0
- package/apps/pwa/out/_next/static/css/{72becfd42807b50d.css → 3f5fc6f96e2cf7b2.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/bin/elanous.mjs +7 -3
- package/graphs/context/nightly-condense.yaml +1 -0
- package/graphs/intake/intake-daily.yaml +8 -1
- package/graphs/intake/recipes.yaml +5 -0
- package/graphs/lecture/lecture-note.yaml +2 -2
- package/graphs/ops/harness-gc.yaml +1 -0
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +9 -5
- package/graphs/units/recipes.yaml +3 -0
- package/graphs/units/release-gate-recheck.yaml +15 -0
- package/package.json +2 -1
- package/scripts/check-native-tool-wiring.ts +3 -2
- package/scripts/ci-android-unit-tests.ts +16 -0
- package/scripts/ci-typecheck-changed.ts +37 -9
- package/scripts/coord-channel-watch.sh +22 -16
- package/scripts/coord-role-pack.ts +81 -2
- package/scripts/cron-run.ts +96 -3
- package/scripts/detect-test-interference.ts +38 -5
- package/scripts/gate-pr-cache.ts +65 -0
- package/scripts/gh-surface/capture.ts +126 -0
- package/scripts/gh-surface/gh +40 -0
- package/scripts/import-graph-scc.ts +38 -0
- package/scripts/install.ps1 +19 -0
- package/scripts/intake-social.ts +181 -0
- package/scripts/lecture-note/node.ts +71 -4
- package/scripts/lib/android-toolchain.ts +32 -0
- package/scripts/lib/deterministic-env.ts +62 -0
- package/scripts/lib/gate-test-env.ts +19 -0
- package/scripts/measure-goal-grounding-corpus.ts +2 -1
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +257 -0
- package/scripts/ratchets/test-interference-patterns.ts +367 -0
- package/scripts/release-loop/cut-branch.ts +4 -3
- package/scripts/release-loop/export-check-node.ts +0 -1
- package/scripts/release-loop/fixtures/warm-failure-assertion/sample.junit.xml +8 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.json +1 -0
- package/scripts/release-loop/fixtures/warm-job-029/sample.junit.xml +10 -0
- package/scripts/release-loop/gate-closure.ts +12 -8
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-host-mirror.ts +66 -0
- package/scripts/release-loop/gate-node.ts +523 -75
- package/scripts/release-loop/gate-partial.ts +106 -9
- package/scripts/release-loop/gate-pr-cache.ts +66 -0
- package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
- package/scripts/release-loop/gate-r2-verdict.ts +189 -0
- package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
- package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
- package/scripts/release-loop/import-graph-scc-run.ts +54 -0
- package/scripts/release-loop/import-graph-scc.ts +215 -0
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
- package/scripts/release-loop/resume-release.ts +33 -4
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/spawn-lane.ts +2 -19
- package/scripts/release-loop/tui-sim-node.ts +3 -2
- package/scripts/release-loop/unattended-release.ts +16 -0
- package/scripts/test-deterministic.ts +5 -61
- package/scripts/train-reach-grouping.ts +48 -0
- package/scripts/tsc-incremental-cache.ts +86 -0
- package/scripts/tsc-incremental-diagnostics.ts +76 -0
- package/scripts/tsc-main-safety-net.ts +2 -2
- package/src/acp/client.ts +4 -1
- package/src/acp/core-turn-bridge.ts +50 -5
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/runner.ts +169 -3
- package/src/agent/subagent-callable.ts +3 -2
- package/src/agent-mission/review-loop.ts +6 -3
- package/src/agent-substrate/acp-implementer.ts +14 -2
- package/src/agent-substrate/pr-reviewer.ts +12 -0
- package/src/agent-substrate/self-review-cli.ts +30 -4
- package/src/autopilot/pr-manager.ts +62 -7
- package/src/briefing/brief-items.ts +24 -22
- package/src/capture/tui-self-report.ts +15 -0
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +77 -11
- package/src/chat/input-control-key.ts +5 -3
- package/src/chat/tool-interrupt-behavior.ts +38 -0
- package/src/chat/tool-render/dispatch.ts +5 -1
- package/src/chat/turn-typeahead.ts +75 -20
- package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
- package/src/cli/agent-cli.ts +41 -13
- package/src/cli/config-audit.ts +123 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/log-event-names.ts +7 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +88 -0
- package/src/cli/pr-cli.ts +214 -57
- package/src/cli/pr-land-heavy-remote.ts +2 -2
- package/src/cli/pr-land-overlap-evidence.ts +63 -9
- package/src/cli/pr-land-pod-shadow-job.ts +83 -0
- package/src/cli/pr-land-pod-shadow.ts +16 -3
- package/src/cli/pr-land-virtual-rebase.ts +108 -0
- package/src/cli/release-cli.ts +80 -14
- package/src/cli/seat-cli.ts +138 -3
- package/src/cli/self-update.ts +5 -2
- package/src/cli/tasks-cli.ts +97 -19
- package/src/context-bus/context-first.ts +13 -0
- package/src/context-bus/context-now.ts +13 -2
- package/src/context-bus/ops-events.ts +75 -0
- package/src/control-plane/lease-holder.ts +12 -8
- package/src/control-plane/ledger.ts +163 -4
- package/src/control-plane/server.ts +91 -11
- package/src/core-turn/run-core-turn.ts +1 -0
- package/src/core-turn/run-goal-loop.ts +222 -3
- package/src/core-turn/seat-turn-cap.ts +79 -0
- package/src/core-turn/short-question.ts +38 -6
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/index.ts +224 -615
- package/src/dashboard/input/chat-main-entry-runtime.ts +1 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +4 -1
- package/src/dashboard/input/chat-main-session.ts +8 -1
- package/src/dashboard/input/chat-main-turn.ts +12 -3
- package/src/dashboard/input/compact-prepass-recovery.ts +33 -0
- package/src/dashboard/input/external-input-host.ts +26 -0
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +70 -0
- package/src/dashboard/loop-scheduler.ts +72 -0
- package/src/dashboard/seat-boot-preamble.ts +18 -0
- package/src/dashboard/skill-runtime.ts +2 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +126 -1181
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
- package/src/dashboard/slash-runtime/index.ts +13 -0
- package/src/dashboard/turn-busy-teardown.ts +50 -0
- package/src/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/domains/release-tool.ts +18 -1
- package/src/field-note/transcribe.ts +17 -0
- package/src/github/remote-call.ts +81 -0
- package/src/goals/registry.ts +46 -6
- package/src/goals/types.ts +7 -1
- package/src/graph-runner/runner.ts +1 -0
- package/src/grok/credential.ts +26 -0
- package/src/harness/harness-clean.ts +2 -1
- package/src/harness/harness-cli-command.ts +52 -5
- package/src/harness/harness-gc.ts +2 -1
- package/src/harness/harness-incidents.ts +57 -20
- package/src/harness/harness-pod-dispatch.ts +87 -10
- package/src/harness/harness-queue.ts +53 -4
- package/src/harness/harness-stop.ts +4 -3
- package/src/harness/harness-substrate-default.ts +78 -7
- package/src/harness/harness-worktree-auto.ts +2 -1
- package/src/harness/harness-worktrees.ts +3 -2
- package/src/hooks/dispatch.ts +2 -1
- package/src/index.ts +152 -25
- package/src/input/external-input-queue.ts +33 -1
- package/src/intake-plane/slash.ts +14 -3
- package/src/keybindings.ts +4 -1
- package/src/llm/tool-loop-steered-rejection.ts +33 -0
- package/src/llm.ts +138 -19
- package/src/loops/consensus.ts +348 -0
- package/src/loops/msg-wake.ts +206 -4
- package/src/loops/observe.ts +19 -3
- package/src/loops/orchestrator/tick.ts +64 -10
- package/src/loops/orchestrator/traffic.ts +64 -1
- package/src/loops/registry.ts +30 -0
- package/src/market/signed-index.ts +14 -0
- package/src/mcp/mcp-oauth.ts +54 -5
- package/src/models/prompts.ts +28 -0
- package/src/msg/msg-sse-client.ts +223 -0
- package/src/msg/msg-store.ts +86 -2
- package/src/mss/logging/log-store.ts +225 -1
- package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
- package/src/nexus/api/http-server.ts +54 -15
- package/src/nexus/api/loop-resources.ts +19 -3
- package/src/nexus/api/ops-api.ts +11 -0
- package/src/nexus/daemon-thin-inventory.md +37 -0
- package/src/nexus/index.ts +70 -0
- package/src/nexus/state/state.ts +1 -0
- package/src/oauth/store.ts +32 -7
- package/src/onboarding/first-run.ts +28 -3
- package/src/ops/overview-cache.ts +16 -4
- package/src/ops/resources.ts +82 -0
- package/src/plugins/maker/connector-maker.ts +41 -0
- package/src/plugins/maker/skill-maker.ts +42 -0
- package/src/pr-tool/census.ts +288 -0
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +10 -5
- package/src/release-loop/gate-host-reservation.ts +97 -0
- package/src/release-loop/landing-freeze.ts +5 -0
- package/src/release-loop/light-rc.ts +5 -2
- package/src/release-loop/placement.ts +92 -1
- package/src/release-loop/rehearsal-shard-plan.ts +149 -0
- package/src/release-loop/rehearsal.ts +73 -17
- package/src/repl/index.ts +20 -2
- package/src/seat-loop/seat-knowhow.ts +282 -0
- package/src/seat-loop/seat-loop.ts +41 -2
- package/src/seat-loop/traffic-signal.ts +3 -0
- package/src/self-dev/ask-launch-flow.ts +24 -3
- package/src/self-dev/decompose-compose-graph.ts +28 -27
- package/src/self-dev/decompose-proposal.ts +53 -38
- package/src/self-dev/decompose.ts +17 -0
- package/src/self-dev/dev-pipeline.ts +31 -2
- package/src/self-dev/draft-residue.ts +24 -9
- package/src/self-dev/draft-sweep.ts +59 -4
- package/src/self-dev/external-call-zero.ts +77 -0
- package/src/self-dev/launch-preflight-text.ts +6 -0
- package/src/self-dev/launch-preflight.ts +25 -3
- package/src/self-dev/local-supervisor-judge.ts +185 -0
- package/src/self-dev/run-supervisor.ts +229 -19
- package/src/self-dev/run-types.ts +20 -0
- package/src/self-dev/shard-aggregate.ts +13 -2
- package/src/self-dev/shard-plan.ts +47 -0
- package/src/self-dev/shard-run.ts +112 -10
- package/src/self-dev/spawn-lane-files.ts +19 -0
- package/src/self-implement/app-api-budget.ts +51 -11
- package/src/self-implement/config-gate.ts +2 -1
- package/src/self-implement/expose-gate.ts +2 -1
- package/src/self-implement/gate-artifacts.ts +405 -0
- package/src/self-implement/gate-cli.ts +201 -16
- package/src/self-implement/gate-remote.ts +110 -25
- package/src/self-implement/gate-scenario.ts +85 -0
- package/src/self-implement/goal-author.ts +160 -8
- package/src/self-implement/graph-authority.ts +38 -6
- package/src/self-implement/graph-overlay-condition.ts +92 -1
- package/src/self-implement/heal-triage.ts +79 -0
- package/src/self-implement/host-regate.ts +61 -3
- package/src/self-implement/orchestrator.ts +14 -123
- package/src/self-implement/pr-title.ts +123 -0
- package/src/self-implement/run-checkpoint.ts +235 -0
- package/src/self-implement/run-ledger.ts +155 -10
- package/src/self-implement/run-stop.ts +4 -3
- package/src/self-implement/run-ttl.ts +28 -4
- package/src/self-implement/seams.ts +2 -0
- package/src/self-implement/shadow-stage.ts +7 -6
- package/src/self-implement/stop-autoheal.ts +2 -1
- package/src/self-implement/train-gate-remote.ts +37 -8
- package/src/self-implement/train-reach-grouping.ts +157 -0
- package/src/self-implement/train-scenario-layers.ts +133 -0
- package/src/self-implement/uncommitted-work.ts +2 -0
- package/src/session/pending-input.ts +19 -0
- package/src/session/session-start.ts +224 -0
- package/src/session-runtime/parallel-dispatch.ts +22 -5
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/shell.ts +1 -1
- package/src/steward/resync-tick.ts +114 -23
- package/src/steward/ta-repair-event-collect.ts +158 -0
- package/src/task-agent/card-evidence.ts +25 -1
- package/src/task-agent/green-sweep.ts +8 -3
- package/src/task-agent/judge.ts +76 -0
- package/src/task-agent/land-queue.ts +79 -0
- package/src/task-agent/live-moves.ts +30 -9
- package/src/task-agent/postland-card.ts +5 -0
- package/src/task-agent/prelaunch-already-done.ts +98 -0
- package/src/task-agent/real-launch-guard.ts +37 -0
- package/src/task-agent/rejudge-on-head.ts +89 -12
- package/src/task-agent/remote-rejudge-bind.ts +28 -8
- package/src/task-agent/repair-cycle.ts +45 -7
- package/src/task-agent/repair-worker.ts +7 -0
- package/src/task-agent/run-identity.ts +200 -0
- package/src/task-agent/shadow.ts +50 -3
- package/src/task-agent/task-hand.ts +158 -5
- package/src/task-agent/train-landing.ts +77 -0
- package/src/task-agent/work-order.ts +104 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +88 -28
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
- package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-install-slots.ts +121 -9
- package/src/task-orchestrator/surfaces/pod-lease.ts +20 -6
- package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +27 -0
- package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +63 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +19 -3
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +141 -0
- package/src/task-orchestrator/surfaces/pod-warm-ta-shadow.ts +85 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +208 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +132 -15
- package/src/telegram.ts +2 -4
- package/src/tui/input/pickers.ts +732 -0
- package/src/tui/slash/mission.ts +492 -0
- package/src/tui/slash/term.ts +877 -0
- package/src/tui-client/dashboard-session.ts +9 -0
- package/src/tui.ts +48 -0
- package/src/user-config/gemini-server-tools.ts +9 -0
- package/src/user-config.ts +53 -16
- package/src/util/spawn-sync-output.ts +7 -0
- package/src/ux-sim/fake-bin.ts +154 -0
- package/src/ux-sim/fake-clock.ts +36 -0
- package/src/ux-sim/headless-tui.ts +72 -0
- package/src/ux-sim/in-process-cli.ts +2 -1
- package/src/ux-sim/temp-git-remote.ts +82 -0
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/vlog.ts +25 -7
- package/apps/pwa/out/_next/static/chunks/1015-9cba22a5a4554797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +0 -8
- package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +0 -34
- package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +0 -286
- package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +0 -36
- package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +0 -115
- package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +0 -1
- package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +0 -27
- package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +0 -104
- package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +0 -287
- package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +0 -74
- package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +0 -32
- package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/a435ad95.577add051b4facb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-8aaa6dedc4c10dfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-33bf667a5fb297bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +0 -1
- package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +0 -1
- /package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → LSXfY0u9QtfDbejY0Ukf_}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 로컬 슈퍼바이저 판정부(local supervisor judge) — 외부 호출 0.
|
|
3
|
+
*
|
|
4
|
+
* 외부 LLM/검색/크롤 없이, 슈퍼바이저가 이미 관측한 신호만으로 멈춤 사유를 고른다:
|
|
5
|
+
* - 후보(candidates): 호출자가 살아있다고 본 SupervisorStopReason 목록 — 배열 순서가 호출자의 우선순위다.
|
|
6
|
+
* - 화면 관측: PTY screen-buffer 의 screenTail · screenOutcome · screenSpace (run-types.ts SelfDevJobResult 와 같은 이름).
|
|
7
|
+
* - 진동 신호: ReviewRework 의 trend/signature 와 goal-loop 노드 재방문(walk).
|
|
8
|
+
*
|
|
9
|
+
* 순수 함수다 — I/O · 시계 · 난수 · 외부 호출 없다. 같은 입력은 항상 같은 판정을 낸다.
|
|
10
|
+
* 배선은 별도 샤드가 한다(decideNextRun/superviseRun 봉합); 이 모듈은 run-supervisor.ts 를 고치지 않는다.
|
|
11
|
+
*
|
|
12
|
+
* 판정 순위(슈퍼바이저 본 로직과 같은 순서다 — 수확/병합 판정이 진동 판정보다 앞선다):
|
|
13
|
+
* ① 명시적 화면 완료(outcome=complete) → 수렴 계열 후보 중 강한 순
|
|
14
|
+
* ② 측정된 리뷰 진동(trend=oscillating) → 진동 계열 후보 중 강한 순
|
|
15
|
+
* ③ 화면 미완료(outcome=incomplete) → 수렴 계열 후보 기각, 남은 후보가 없으면 판단 불가
|
|
16
|
+
* ④ 신호가 판단을 가르지 못하면 → 호출자 후보 순위의 첫 후보
|
|
17
|
+
*/
|
|
18
|
+
import { SUPERVISOR_STOP_REASONS, type SupervisorStopReason } from './run-types.js';
|
|
19
|
+
import type { SupervisorDecision } from './run-supervisor.js';
|
|
20
|
+
|
|
21
|
+
/** PTY 화면 관측 — run-types.ts SelfDevJobResult 의 screenTail · screenOutcome · screenSpace 와 같은 모양. */
|
|
22
|
+
export interface LocalJudgeScreenObservation {
|
|
23
|
+
screenTail?: string;
|
|
24
|
+
screenOutcome?: 'complete' | 'incomplete' | null;
|
|
25
|
+
screenSpace?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** goal-loop 노드 방문 기록(walk) — 같은 노드를 서로 다른 회차에 다시 방문하면 진동 신호다. */
|
|
29
|
+
export interface LocalJudgeWalkEntry {
|
|
30
|
+
node?: string;
|
|
31
|
+
round?: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** 리뷰 재작업 신호 — run-types.ts ReviewRework 의 관측 필드(구조 호환 — ReviewRework 를 그대로 줘도 된다). */
|
|
35
|
+
export interface LocalJudgeReworkSignal {
|
|
36
|
+
runs?: number;
|
|
37
|
+
trend?: 'oscillating' | 'improving' | 'worsening';
|
|
38
|
+
signature?: string;
|
|
39
|
+
lastReason?: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface LocalSupervisorJudgeInput {
|
|
43
|
+
/** 판정 후보 — 1개 이상 · SUPERVISOR_STOP_REASONS 원소만. 반드시 이 안에서 고른다. */
|
|
44
|
+
candidates: readonly SupervisorStopReason[];
|
|
45
|
+
screen?: LocalJudgeScreenObservation;
|
|
46
|
+
walk?: readonly LocalJudgeWalkEntry[];
|
|
47
|
+
rework?: LocalJudgeReworkSignal;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface LocalSupervisorJudgeVerdict {
|
|
51
|
+
/** False means the available candidates contradict the screen observation; caller must continue judging. */
|
|
52
|
+
determined: boolean;
|
|
53
|
+
stopReason?: SupervisorStopReason;
|
|
54
|
+
why: string;
|
|
55
|
+
/** 0..1 — 관측 신호가 이 판정을 받쳤는가(결정적 상수 · 임의성 없다). */
|
|
56
|
+
confidence: number;
|
|
57
|
+
/** 판정 근거 신호 목록(사람이 읽는다). */
|
|
58
|
+
signals: readonly string[];
|
|
59
|
+
/** 진동 신호를 봤는가 — 후보에 진동 사유가 없으면 신호만 남고 다른 사유를 고른다. */
|
|
60
|
+
oscillating: boolean;
|
|
61
|
+
/** SupervisorDecision 호환 stop 조각 — 호출자의 회차 base 와 합쳐 쓴다. */
|
|
62
|
+
decisionFragment: Pick<SupervisorDecision, 'action' | 'stopReason' | 'why'>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** 화면이 완료를 보일 때 먼저 고를 수렴 계열 사유(강한 순). */
|
|
66
|
+
export const LOCAL_JUDGE_CONVERGENCE_ORDER = [
|
|
67
|
+
'deliverable-merged',
|
|
68
|
+
'harvestable-awaiting-human',
|
|
69
|
+
'handed-off-to-salvage',
|
|
70
|
+
'converged',
|
|
71
|
+
] as const satisfies readonly SupervisorStopReason[];
|
|
72
|
+
|
|
73
|
+
/** 진동 신호가 보일 때 고를 진동 사유 — SupervisorStopReason 의 진동 계열은 review-oscillating 하나다. */
|
|
74
|
+
export const LOCAL_JUDGE_OSCILLATION_ORDER = [
|
|
75
|
+
'review-oscillating',
|
|
76
|
+
] as const satisfies readonly SupervisorStopReason[];
|
|
77
|
+
|
|
78
|
+
const COMPLETION_CONFIDENCE = 0.9;
|
|
79
|
+
const OSCILLATION_TREND_CONFIDENCE = 0.8;
|
|
80
|
+
const VETO_CONFIDENCE = 0.7;
|
|
81
|
+
const FALLBACK_CONFIDENCE = 0.5;
|
|
82
|
+
|
|
83
|
+
const isConvergence = (reason: SupervisorStopReason): boolean =>
|
|
84
|
+
(LOCAL_JUDGE_CONVERGENCE_ORDER as readonly string[]).includes(reason);
|
|
85
|
+
|
|
86
|
+
const firstPresent = (
|
|
87
|
+
order: readonly SupervisorStopReason[],
|
|
88
|
+
candidates: readonly SupervisorStopReason[],
|
|
89
|
+
): SupervisorStopReason | undefined => order.find((reason) => candidates.includes(reason));
|
|
90
|
+
|
|
91
|
+
/** 같은 노드를 서로 다른 회차에서 다시 방문했는가 — 회차 번호 없는 항목은 재방문 판정에 세지 않는다. */
|
|
92
|
+
const repeatedWalkNode = (walk: readonly LocalJudgeWalkEntry[]): { node: string; visits: number } | undefined => {
|
|
93
|
+
const byNode = new Map<string, Set<number>>();
|
|
94
|
+
for (const entry of walk) {
|
|
95
|
+
if (typeof entry?.node !== 'string' || entry.node.length === 0 || typeof entry?.round !== 'number') continue;
|
|
96
|
+
let rounds = byNode.get(entry.node);
|
|
97
|
+
if (!rounds) {
|
|
98
|
+
rounds = new Set<number>();
|
|
99
|
+
byNode.set(entry.node, rounds);
|
|
100
|
+
}
|
|
101
|
+
rounds.add(entry.round);
|
|
102
|
+
}
|
|
103
|
+
for (const [node, rounds] of byNode) {
|
|
104
|
+
if (rounds.size >= 2) return { node, visits: rounds.size };
|
|
105
|
+
}
|
|
106
|
+
return undefined;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export function localSupervisorJudge(input: LocalSupervisorJudgeInput): LocalSupervisorJudgeVerdict {
|
|
110
|
+
const { candidates, screen, walk, rework } = input;
|
|
111
|
+
if (candidates.length === 0) {
|
|
112
|
+
throw new Error('local-supervisor-judge: 판정 후보(candidates)가 비었다 — 후보 없이는 판정할 수 없다');
|
|
113
|
+
}
|
|
114
|
+
for (const candidate of candidates) {
|
|
115
|
+
if (!(SUPERVISOR_STOP_REASONS as readonly string[]).includes(candidate)) {
|
|
116
|
+
throw new Error(`local-supervisor-judge: 후보 '${String(candidate)}' 은(는) SupervisorStopReason 이 아니다`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const signals: string[] = [];
|
|
121
|
+
const outcome = screen?.screenOutcome ?? undefined;
|
|
122
|
+
signals.push(outcome === 'complete' ? 'screen:complete'
|
|
123
|
+
: outcome === 'incomplete' ? 'screen:incomplete'
|
|
124
|
+
: 'screen:absent');
|
|
125
|
+
if (screen?.screenSpace) signals.push(`screen-space:${screen.screenSpace}`);
|
|
126
|
+
const tail = typeof screen?.screenTail === 'string' ? screen.screenTail : '';
|
|
127
|
+
const tailSaysComplete = tail.includes('GOAL-COMPLETE');
|
|
128
|
+
if (tailSaysComplete) signals.push('screen-tail:GOAL-COMPLETE');
|
|
129
|
+
if (outcome === 'incomplete' && tailSaysComplete) signals.push('screen:conflict-incomplete-over-tail');
|
|
130
|
+
if (rework?.trend) signals.push(`rework:trend=${rework.trend}`);
|
|
131
|
+
if (rework?.signature) signals.push(`rework:signature=${rework.signature}`);
|
|
132
|
+
if (typeof rework?.runs === 'number' && rework.runs >= 2) signals.push(`rework:runs=${rework.runs}`);
|
|
133
|
+
if (rework?.lastReason) signals.push(`rework:last=${rework.lastReason}`);
|
|
134
|
+
const walkRepeat = repeatedWalkNode(walk ?? []);
|
|
135
|
+
if (walkRepeat) signals.push(`walk:repeat:${walkRepeat.node}x${walkRepeat.visits}`);
|
|
136
|
+
|
|
137
|
+
// Explicit incomplete outcome is stronger than a marker in buffered text, which may be stale.
|
|
138
|
+
// A marker in the PTY buffer has no round identity; only the explicit outcome authorizes completion.
|
|
139
|
+
const screenSaysComplete = outcome === 'complete';
|
|
140
|
+
// A repeated node and one current signature do not prove that the same finding recurred.
|
|
141
|
+
// Only the measured review trend can authorize an oscillation stop.
|
|
142
|
+
const oscillating = rework?.trend === 'oscillating';
|
|
143
|
+
if (screenSaysComplete) signals.push('signal:completion');
|
|
144
|
+
if (oscillating) signals.push('signal:oscillation');
|
|
145
|
+
|
|
146
|
+
const verdict = (reason: SupervisorStopReason, confidence: number, label: string): LocalSupervisorJudgeVerdict => {
|
|
147
|
+
const why = `로컬 판정(${label}) — ${reason} · 근거 ${signals.join(' · ')}`;
|
|
148
|
+
return {
|
|
149
|
+
stopReason: reason,
|
|
150
|
+
determined: true,
|
|
151
|
+
why,
|
|
152
|
+
confidence,
|
|
153
|
+
signals,
|
|
154
|
+
oscillating,
|
|
155
|
+
decisionFragment: { action: 'stop', stopReason: reason, why },
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// ① 화면 완료 — 수렴 계열 후보 중 강한 순.
|
|
160
|
+
if (screenSaysComplete) {
|
|
161
|
+
const picked = firstPresent(LOCAL_JUDGE_CONVERGENCE_ORDER, candidates);
|
|
162
|
+
if (picked !== undefined) return verdict(picked, COMPLETION_CONFIDENCE, 'completion-family');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ② 진동 — 측정된 재작업 추이(trend)만 종료 근거다. 노드 재방문은 진단 신호로 남긴다.
|
|
166
|
+
if (oscillating) {
|
|
167
|
+
const picked = firstPresent(LOCAL_JUDGE_OSCILLATION_ORDER, candidates);
|
|
168
|
+
if (picked !== undefined) {
|
|
169
|
+
return verdict(picked, OSCILLATION_TREND_CONFIDENCE, 'oscillation-family');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// ③ 화면 미완료 — 아직 끝나지 않았으므로 수렴 계열 후보를 기각한다.
|
|
174
|
+
if (outcome === 'incomplete') {
|
|
175
|
+
const survivor = candidates.find((candidate) => !isConvergence(candidate));
|
|
176
|
+
if (survivor !== undefined) return verdict(survivor, VETO_CONFIDENCE, 'incomplete-veto');
|
|
177
|
+
signals.push('signal:undetermined');
|
|
178
|
+
const why = `로컬 판정(undetermined) — incomplete 화면이 모든 수렴 후보를 기각 · 근거 ${signals.join(' · ')}`;
|
|
179
|
+
return { determined: false, why, confidence: 0, signals, oscillating,
|
|
180
|
+
decisionFragment: { action: 'relaunch', why } };
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// ④ 신호가 판단을 가르지 못한다 — 호출자 후보 순위의 첫 후보.
|
|
184
|
+
return verdict(candidates[0]!, FALLBACK_CONFIDENCE, 'fallback-order');
|
|
185
|
+
}
|
|
@@ -5,6 +5,7 @@ import type { DeployVerifyFinding } from '../harness/browser-verify.js';
|
|
|
5
5
|
import type { SelfDevJobResult, SupervisorStopReason, SupervisorNext, ReviewRework } from './run-types.js';
|
|
6
6
|
import { authorRepairGoal } from '../harness/helper-repair.js';
|
|
7
7
|
export type { SupervisorStopReason } from './run-types.js';
|
|
8
|
+
export { SUPERVISOR_STOP_REASONS } from './run-types.js';
|
|
8
9
|
import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
|
|
9
10
|
import { debug } from '../debug/log.js';
|
|
10
11
|
import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
|
|
@@ -49,6 +50,16 @@ export interface SupervisorRound {
|
|
|
49
50
|
noPrFeatureKeys?: string[];
|
|
50
51
|
/** REVIEW-MUSTFIX-CLASSIFY — that round's observed must-fix items; pairs the next round's classification. */
|
|
51
52
|
mustFix?: MustFixRoundObservation;
|
|
53
|
+
/**
|
|
54
|
+
* PATTERN-MINE LOST-TIME — ms that round's undelivered results spent, banked into the ledger when their
|
|
55
|
+
* generation is replaced by a rerun (failures and re-runs both count — «잃은 시간» is not only the last round).
|
|
56
|
+
* A task held for a human (`decision.oscillation.heldTaskIds`) survives into the next round as the same
|
|
57
|
+
* execution, so its time banks only when it leaves or at the terminal mine — never twice. Omitted when
|
|
58
|
+
* nothing banked, so older history and rounds without a measured duration stay comparable.
|
|
59
|
+
*/
|
|
60
|
+
lostTimeMsByTask?: Record<string, number>;
|
|
61
|
+
/** Tasks that left this round without a measured duration; a later measured rerun cannot make their total known. */
|
|
62
|
+
unknownTimeTaskIds?: string[];
|
|
52
63
|
}
|
|
53
64
|
|
|
54
65
|
/** Failed without a PR — a result that carries either a PR number or a PR URL has one (fixtures and older producers set only one). */
|
|
@@ -64,25 +75,6 @@ export function noPrStreakKey(feature: unknown): string {
|
|
|
64
75
|
return typeof feature === 'string' ? resumeKey(feature).replace(/[\s.,;:!?。…·]+$/u, '') : '';
|
|
65
76
|
}
|
|
66
77
|
|
|
67
|
-
export const SUPERVISOR_STOP_REASONS = [
|
|
68
|
-
'converged',
|
|
69
|
-
'human-stopped',
|
|
70
|
-
'parent-signals-red',
|
|
71
|
-
'needs-human',
|
|
72
|
-
'no-actionable-work',
|
|
73
|
-
'harvestable-awaiting-human',
|
|
74
|
-
'handed-off-to-salvage',
|
|
75
|
-
'max-rounds',
|
|
76
|
-
'no-progress',
|
|
77
|
-
'provider-exhausted',
|
|
78
|
-
'step-timeout',
|
|
79
|
-
'decomposable-no-progress',
|
|
80
|
-
'review-unobserved',
|
|
81
|
-
'review-oscillating',
|
|
82
|
-
'deliverable-unobserved',
|
|
83
|
-
'deliverable-merged',
|
|
84
|
-
] as const satisfies readonly SupervisorStopReason[];
|
|
85
|
-
|
|
86
78
|
export const SUPERVISOR_ACTIONS = ['relaunch', 'add-repair-task', 'stop'] as const;
|
|
87
79
|
|
|
88
80
|
export interface DecomposePromotionOutcome {
|
|
@@ -656,6 +648,17 @@ export function appendRound(
|
|
|
656
648
|
const noPrResults = results.filter(failedWithoutPr);
|
|
657
649
|
const noPrTaskIds = noPrResults.map((result) => result.taskId);
|
|
658
650
|
const noPrFeatureKeys = noPrResults.map((result) => noPrStreakKey(result.feature));
|
|
651
|
+
// PATTERN-MINE LOST-TIME — 이 회차의 배달 안 된 실행 시간을 원장에 은행한다(실패·재실행 모두).
|
|
652
|
+
// 진동 보류(held) 조각은 다음 회차로 «같은 실행»으로 살아 남으므로 여기서는 안 세고,
|
|
653
|
+
// 떠나는 회차나 종단에서 한 번만 센다. durationMs 를 안 잰 결과는 지어내지 않는다(모르는 시간은 0 이 아니다).
|
|
654
|
+
const heldTaskIds = new Set(decision?.oscillation?.heldTaskIds ?? []);
|
|
655
|
+
const lostTimeMsByTask: Record<string, number> = {};
|
|
656
|
+
const unknownTimeTaskIds = new Set<string>();
|
|
657
|
+
for (const result of results) {
|
|
658
|
+
if (heldTaskIds.has(result.taskId) || hasDelivered(result)) continue;
|
|
659
|
+
if (result.durationMs === undefined) { unknownTimeTaskIds.add(result.taskId); continue; }
|
|
660
|
+
lostTimeMsByTask[result.taskId] = (lostTimeMsByTask[result.taskId] ?? 0) + result.durationMs;
|
|
661
|
+
}
|
|
659
662
|
return [...history, {
|
|
660
663
|
round: history.length,
|
|
661
664
|
landed: countLanded(results),
|
|
@@ -663,6 +666,8 @@ export function appendRound(
|
|
|
663
666
|
actionable: countActionable(t),
|
|
664
667
|
...(reviewMustFixTrend === undefined ? {} : { reviewMustFixTrend }),
|
|
665
668
|
...((mustFix.items ?? []).length > 0 ? { mustFix } : {}),
|
|
669
|
+
...(Object.keys(lostTimeMsByTask).length > 0 ? { lostTimeMsByTask } : {}),
|
|
670
|
+
...(unknownTimeTaskIds.size > 0 ? { unknownTimeTaskIds: [...unknownTimeTaskIds] } : {}),
|
|
666
671
|
...(results.some((result) => result.rework?.signature)
|
|
667
672
|
? { signatures: Object.fromEntries(results.filter((result) => result.rework?.signature).map((result) => [result.taskId, result.rework!.signature])) } : {}),
|
|
668
673
|
...(decision && decision.action !== 'stop' && decision.relaunchOnMain.length > 0 ? {
|
|
@@ -687,6 +692,195 @@ export function appendRound(
|
|
|
687
692
|
}];
|
|
688
693
|
}
|
|
689
694
|
|
|
695
|
+
/** PATTERN-MINE — 생애 기록부 한 줄. `struggled`·`watch` 원문과 그 생애가 잃은 시간. */
|
|
696
|
+
export interface PatternMineLifeRecord {
|
|
697
|
+
readonly lifeId: string;
|
|
698
|
+
readonly struggled?: string;
|
|
699
|
+
readonly watch?: string;
|
|
700
|
+
readonly lostTimeMs?: number;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/** PATTERN-MINE — decideNextRun 종단 서명(멈춤 어휘 · 진동 서명 · 실패 분류 · must-fix). */
|
|
704
|
+
export interface PatternMineTerminalSignature {
|
|
705
|
+
readonly lifeId?: string;
|
|
706
|
+
readonly stopReason?: string;
|
|
707
|
+
readonly oscillationSignature?: string;
|
|
708
|
+
readonly classificationKind?: string;
|
|
709
|
+
readonly mustFix?: string;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
export interface MinedFailurePattern {
|
|
713
|
+
readonly pattern: string;
|
|
714
|
+
readonly frequency: number;
|
|
715
|
+
readonly lifeCount: number;
|
|
716
|
+
/** Known only when every life bound to this pattern carried a time; null preserves unknown — never a default 0. */
|
|
717
|
+
readonly lostTimeMs: number | null;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
export interface PatternMineAggregate {
|
|
721
|
+
readonly patterns: readonly MinedFailurePattern[];
|
|
722
|
+
readonly lifeCount: number;
|
|
723
|
+
/** Known only when every life carried a time; null preserves unknown — a missing input time is never summed as 0. */
|
|
724
|
+
readonly lostTimeMs: number | null;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
function patternMineLifePart(life: PatternMineLifeRecord): string {
|
|
728
|
+
return [life.struggled, life.watch].filter((part): part is string => !!part && part.length > 0).join(' · ');
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
function patternMineSignaturePart(signature: PatternMineTerminalSignature | undefined): string {
|
|
732
|
+
if (!signature) return '';
|
|
733
|
+
return [signature.stopReason, signature.oscillationSignature, signature.classificationKind, signature.mustFix]
|
|
734
|
+
.filter((part): part is string => !!part && part.length > 0).join(' · ');
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
/** Bind struggled/watch with a terminal signature. Empty both sides is not a pattern. */
|
|
738
|
+
export function bindPatternMineKey(life: PatternMineLifeRecord, signature?: PatternMineTerminalSignature): string {
|
|
739
|
+
const lifePart = patternMineLifePart(life);
|
|
740
|
+
const signaturePart = patternMineSignaturePart(signature);
|
|
741
|
+
if (!lifePart && !signaturePart) return '';
|
|
742
|
+
return signaturePart ? `${lifePart || '(기록 없음)'} ⊕ ${signaturePart}` : lifePart;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* PATTERN-MINE — 순수 집계. 생애 기록부 struggled·watch 를 종단 서명과 묶어
|
|
747
|
+
* 패턴 빈도·생애 수·잃은 시간을 낸다. 입력이 비면 전부 0 이고 지어내지 않는다.
|
|
748
|
+
* 잃은 시간을 모르는 생애가 하나라도 섞이면 그 합은 unknown(null)을 보존한다 — 0 으로 확정하지 않는다.
|
|
749
|
+
*/
|
|
750
|
+
export function mineFailurePatterns(input: {
|
|
751
|
+
readonly lives: readonly PatternMineLifeRecord[];
|
|
752
|
+
readonly signatures?: readonly PatternMineTerminalSignature[];
|
|
753
|
+
}): PatternMineAggregate {
|
|
754
|
+
const lives = input.lives;
|
|
755
|
+
const signatures = input.signatures ?? [];
|
|
756
|
+
const runLevel = signatures.find((signature) => !signature.lifeId);
|
|
757
|
+
const byLife = new Map(signatures.flatMap((signature) => signature.lifeId ? [[signature.lifeId, signature] as const] : []));
|
|
758
|
+
const groups = new Map<string, { lives: Set<string>; frequency: number; lostTimeMs: number | undefined }>();
|
|
759
|
+
|
|
760
|
+
const add = (pattern: string, lifeId: string | undefined, lostTimeMs: number | undefined): void => {
|
|
761
|
+
if (!pattern) return;
|
|
762
|
+
const group = groups.get(pattern) ?? { lives: new Set<string>(), frequency: 0, lostTimeMs: 0 };
|
|
763
|
+
group.frequency += 1;
|
|
764
|
+
if (lifeId) group.lives.add(lifeId);
|
|
765
|
+
// UNKNOWN 보존 — 모르는 시간(전달 안 됨)은 0 이 아니라 unknown 이고, 한 번 섞이면 그 합은 끝까지 unknown 이다.
|
|
766
|
+
if (lostTimeMs === undefined) group.lostTimeMs = undefined;
|
|
767
|
+
else if (group.lostTimeMs !== undefined) group.lostTimeMs += lostTimeMs;
|
|
768
|
+
groups.set(pattern, group);
|
|
769
|
+
};
|
|
770
|
+
|
|
771
|
+
for (const life of lives) {
|
|
772
|
+
add(bindPatternMineKey(life, (life.lifeId ? byLife.get(life.lifeId) : undefined) ?? runLevel), life.lifeId, life.lostTimeMs);
|
|
773
|
+
}
|
|
774
|
+
for (const signature of signatures) {
|
|
775
|
+
if (signature.lifeId ? lives.some((life) => life.lifeId === signature.lifeId) : lives.length > 0) continue;
|
|
776
|
+
add(bindPatternMineKey({ lifeId: signature.lifeId ?? '' }, signature), signature.lifeId, undefined);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
const lifeIds = new Set(lives.map((life) => life.lifeId));
|
|
780
|
+
for (const signature of signatures) if (signature.lifeId) lifeIds.add(signature.lifeId);
|
|
781
|
+
const signatureWithoutLife = signatures.some((signature) => signature.lifeId && !lives.some((life) => life.lifeId === signature.lifeId));
|
|
782
|
+
const patternWithoutLife = groups.size > 0 && lives.length === 0;
|
|
783
|
+
|
|
784
|
+
return {
|
|
785
|
+
patterns: [...groups].map(([pattern, group]) => ({
|
|
786
|
+
pattern, frequency: group.frequency, lifeCount: group.lives.size, lostTimeMs: group.lostTimeMs ?? null,
|
|
787
|
+
})).sort((a, b) => b.frequency - a.frequency || a.pattern.localeCompare(b.pattern)),
|
|
788
|
+
lifeCount: lifeIds.size,
|
|
789
|
+
lostTimeMs: !signatureWithoutLife && !patternWithoutLife && lives.every((life) => life.lostTimeMs !== undefined)
|
|
790
|
+
? lives.reduce((sum, life) => sum + (life.lostTimeMs ?? 0), 0)
|
|
791
|
+
: null,
|
|
792
|
+
};
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
interface PatternMineLifeAccumulator {
|
|
796
|
+
struggled: string[];
|
|
797
|
+
watch: string[];
|
|
798
|
+
lostTimeMs: number;
|
|
799
|
+
/** True once any duration-carrying fact touched this life — a delivered result counts as known 0. */
|
|
800
|
+
timeKnown: boolean;
|
|
801
|
+
/** True when a contributing execution's duration was not measured — unknown wins over any known sum. */
|
|
802
|
+
timeUnknown: boolean;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
function patternMineRow(byLife: Map<string, PatternMineLifeAccumulator>, lifeId: string): PatternMineLifeAccumulator {
|
|
806
|
+
const row = byLife.get(lifeId) ?? { struggled: [], watch: [], lostTimeMs: 0, timeKnown: false, timeUnknown: false };
|
|
807
|
+
if (!byLife.has(lifeId)) byLife.set(lifeId, row);
|
|
808
|
+
return row;
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
/** appendRound 회차 원장 ⊕ 이번 결과에서 struggled·watch 생애 기록부를 읽는다. */
|
|
812
|
+
export function patternMineLivesFromRounds(
|
|
813
|
+
rounds: readonly SupervisorRound[],
|
|
814
|
+
results: readonly SupervisorJobResult[],
|
|
815
|
+
): PatternMineLifeRecord[] {
|
|
816
|
+
const byLife = new Map<string, PatternMineLifeAccumulator>();
|
|
817
|
+
|
|
818
|
+
for (const result of results) {
|
|
819
|
+
const row = patternMineRow(byLife, result.taskId);
|
|
820
|
+
if (result.rework?.trend === 'oscillating' && result.rework.signature) {
|
|
821
|
+
row.struggled.push(`리뷰 진동 ${result.rework.signature}`);
|
|
822
|
+
}
|
|
823
|
+
for (const text of result.reviewMustFix ?? []) {
|
|
824
|
+
row.struggled.push(text);
|
|
825
|
+
row.watch.push(text);
|
|
826
|
+
}
|
|
827
|
+
// PATTERN-MINE LOST-TIME — 종단 세대의 실행 시간. 배달된 결과는 잃은 시간이 0(known)이고,
|
|
828
|
+
// durationMs 를 안 실은 실패는 unknown 을 보존한다(0 이 아니다).
|
|
829
|
+
if (hasDelivered(result)) row.timeKnown = true;
|
|
830
|
+
else if (result.durationMs === undefined) row.timeUnknown = true;
|
|
831
|
+
else {
|
|
832
|
+
row.lostTimeMs += result.durationMs;
|
|
833
|
+
row.timeKnown = true;
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
for (const round of rounds) {
|
|
838
|
+
for (const taskId of round.unknownTimeTaskIds ?? []) patternMineRow(byLife, taskId).timeUnknown = true;
|
|
839
|
+
for (const [taskId, signature] of Object.entries(round.signatures ?? {})) {
|
|
840
|
+
patternMineRow(byLife, taskId).struggled.push(`서명 ${signature}`);
|
|
841
|
+
}
|
|
842
|
+
for (const item of round.mustFix?.items ?? []) {
|
|
843
|
+
const row = patternMineRow(byLife, item.taskId ?? `round-${round.round}`);
|
|
844
|
+
row.struggled.push(item.text);
|
|
845
|
+
if (item.evidence) row.watch.push(item.evidence);
|
|
846
|
+
}
|
|
847
|
+
for (const taskId of round.noPrTaskIds ?? []) patternMineRow(byLife, taskId).struggled.push('PR 없이 실패');
|
|
848
|
+
// PATTERN-MINE LOST-TIME — 앞선 회차가 원장에 은행한 실패·재실행 시간을 생애에 합산한다.
|
|
849
|
+
for (const [taskId, lostTimeMs] of Object.entries(round.lostTimeMsByTask ?? {})) {
|
|
850
|
+
const row = patternMineRow(byLife, taskId);
|
|
851
|
+
row.lostTimeMs += lostTimeMs;
|
|
852
|
+
row.timeKnown = true;
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
return [...byLife].map(([lifeId, row]) => ({
|
|
857
|
+
lifeId,
|
|
858
|
+
...(row.struggled.length ? { struggled: [...new Set(row.struggled)].join(' · ') } : {}),
|
|
859
|
+
...(row.watch.length ? { watch: [...new Set(row.watch)].join(' · ') } : {}),
|
|
860
|
+
// 아는 입력에 대해서만 시간을 낸다 — unknown 이 섞였거나 아는 것이 없으면 칸 자체를 안 만든다(0 이 아니다).
|
|
861
|
+
...(row.timeUnknown || !row.timeKnown ? {} : { lostTimeMs: row.lostTimeMs }),
|
|
862
|
+
}));
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
/** decideNextRun 종단 결정에서 서명(실패 분류 · must-fix · 멈춤 어휘 · 진동 서명)을 읽는다. */
|
|
866
|
+
export function patternMineSignaturesFromDecision(decision: SupervisorDecision): PatternMineTerminalSignature[] {
|
|
867
|
+
const shared = {
|
|
868
|
+
...(decision.stopReason ? { stopReason: decision.stopReason } : {}),
|
|
869
|
+
...(decision.oscillation?.signature ? { oscillationSignature: decision.oscillation.signature } : {}),
|
|
870
|
+
};
|
|
871
|
+
const perTask = decision.classifications.map((classification) => {
|
|
872
|
+
const mustFix = decision.mustFixByTask?.[classification.taskId]?.class ?? decision.mustFix?.class;
|
|
873
|
+
return {
|
|
874
|
+
lifeId: classification.taskId,
|
|
875
|
+
...shared,
|
|
876
|
+
classificationKind: classification.kind,
|
|
877
|
+
...(mustFix ? { mustFix } : {}),
|
|
878
|
+
};
|
|
879
|
+
});
|
|
880
|
+
if (perTask.length > 0) return perTask;
|
|
881
|
+
return shared.stopReason || shared.oscillationSignature ? [{ ...shared }] : [];
|
|
882
|
+
}
|
|
883
|
+
|
|
690
884
|
export interface SuperviseRunOptions {
|
|
691
885
|
initial: readonly SupervisorJobResult[];
|
|
692
886
|
rerun: (previous: readonly SupervisorJobResult[], invocation: { relaunch: true; repairGoals?: Record<string, string> }) => Promise<readonly SupervisorJobResult[]>;
|
|
@@ -870,6 +1064,22 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
870
1064
|
const reason = decision.stopReason ?? 'unregistered-stop';
|
|
871
1065
|
const next = routeSupervisorVerdict(reason, results).next;
|
|
872
1066
|
try { debug.log('self-dev.supervisor', 'verdict-edge', { runId, reason, next }); } catch { /* observation must not interrupt supervision */ }
|
|
1067
|
+
// PATTERN-MINE — 종단에서만 채굴한다. 판정·원장 형식은 그대로이고 관측만 남긴다.
|
|
1068
|
+
const patternMine = mineFailurePatterns({
|
|
1069
|
+
lives: patternMineLivesFromRounds(history, results),
|
|
1070
|
+
signatures: patternMineSignaturesFromDecision(decision),
|
|
1071
|
+
});
|
|
1072
|
+
try {
|
|
1073
|
+
opts.observe?.('pattern-mine', {
|
|
1074
|
+
runId,
|
|
1075
|
+
stopReason: decision.stopReason ?? null,
|
|
1076
|
+
lifeCount: patternMine.lifeCount,
|
|
1077
|
+
lostTimeMs: patternMine.lostTimeMs,
|
|
1078
|
+
frequency: patternMine.patterns.reduce((sum, mined) => sum + mined.frequency, 0),
|
|
1079
|
+
patterns: patternMine.patterns,
|
|
1080
|
+
});
|
|
1081
|
+
} catch { /* fail-open */ }
|
|
1082
|
+
try { debug.log('self-dev.supervisor', 'pattern-mine', { runId, lifeCount: patternMine.lifeCount, lostTimeMs: patternMine.lostTimeMs, frequency: patternMine.patterns.reduce((sum, mined) => sum + mined.frequency, 0), patterns: patternMine.patterns }); } catch { /* fail-open */ }
|
|
873
1083
|
results = results.map((result) => ({ ...result, next }));
|
|
874
1084
|
if (runId && decision.stopReason) {
|
|
875
1085
|
const storage = resolveSupervisorStopStorage(opts.runStore);
|
|
@@ -188,4 +188,24 @@ export type SupervisorStopReason =
|
|
|
188
188
|
| 'deliverable-unobserved'
|
|
189
189
|
| 'deliverable-merged';
|
|
190
190
|
|
|
191
|
+
/** Lightweight runtime catalogue shared by the supervisor and pure local judge. */
|
|
192
|
+
export const SUPERVISOR_STOP_REASONS = [
|
|
193
|
+
'converged',
|
|
194
|
+
'human-stopped',
|
|
195
|
+
'parent-signals-red',
|
|
196
|
+
'needs-human',
|
|
197
|
+
'no-actionable-work',
|
|
198
|
+
'harvestable-awaiting-human',
|
|
199
|
+
'handed-off-to-salvage',
|
|
200
|
+
'max-rounds',
|
|
201
|
+
'no-progress',
|
|
202
|
+
'provider-exhausted',
|
|
203
|
+
'step-timeout',
|
|
204
|
+
'decomposable-no-progress',
|
|
205
|
+
'review-unobserved',
|
|
206
|
+
'review-oscillating',
|
|
207
|
+
'deliverable-unobserved',
|
|
208
|
+
'deliverable-merged',
|
|
209
|
+
] as const satisfies readonly SupervisorStopReason[];
|
|
210
|
+
|
|
191
211
|
export type SupervisorNext = 'harvest' | 'scope-decompose' | 'self-review' | 'human-gate' | 'proposal';
|
|
@@ -40,13 +40,13 @@ const decode = (text: string): string => text.replace(/&(#x[0-9a-f]+|#\d+|amp|lt
|
|
|
40
40
|
return ({ amp: '&', lt: '<', gt: '>', quot: '"', apos: "'" } as Record<string, string>)[key.toLowerCase()] ?? entity;
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
-
interface XmlElement { name: string; attrs: Record<string, string>; children: XmlElement[]; text: string }
|
|
43
|
+
export interface XmlElement { name: string; attrs: Record<string, string>; children: XmlElement[]; text: string }
|
|
44
44
|
|
|
45
45
|
/** Strict, dependency-free XML reader for JUnit reports: the whole document must be well formed
|
|
46
46
|
* (one root, balanced tags, nothing but whitespace/comments after the root). CDATA and comments are
|
|
47
47
|
* text, never elements — so a `<testcase>` inside a failure message is not a test case, and a report
|
|
48
48
|
* followed by a truncated tail is rejected as unmeasured rather than read as complete. */
|
|
49
|
-
function parseXml(xml: string): XmlElement | undefined {
|
|
49
|
+
export function parseXml(xml: string): XmlElement | undefined {
|
|
50
50
|
const stack: XmlElement[] = [];
|
|
51
51
|
let root: XmlElement | undefined;
|
|
52
52
|
let i = xml.charCodeAt(0) === 0xfeff ? 1 : 0;
|
|
@@ -193,6 +193,17 @@ function readJUnit(xml: string, files: readonly string[]): JUnitCase[] | undefin
|
|
|
193
193
|
return cases;
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
+
/** Reuse the gate XML count checks, then require zero skips for a one-file warm-worker artifact. */
|
|
197
|
+
export function isCompleteOneFileGateJunit(xml: string, file: string): boolean {
|
|
198
|
+
const root = parseXml(xml);
|
|
199
|
+
if (!root) return false;
|
|
200
|
+
const noDeclaredSkips = (element: XmlElement): boolean =>
|
|
201
|
+
(element.attrs.skipped === undefined || element.attrs.skipped === '0') && element.children.every(noDeclaredSkips);
|
|
202
|
+
if (!noDeclaredSkips(root)) return false;
|
|
203
|
+
const cases = readJUnit(xml, [file]);
|
|
204
|
+
return !!cases && cases.every(item => !item.skipped);
|
|
205
|
+
}
|
|
206
|
+
|
|
196
207
|
const SKIPPED_PASSED_AT_BASE = 'skipped now · passed at base — a skip must not hide a regression (LIGHT-RC-MEASURE ②)';
|
|
197
208
|
|
|
198
209
|
/** Cases that passed at the baseline but were skipped now are counted as `unknown` failures — never green. */
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isGateSpawnLaneFile } from './spawn-lane-files.js';
|
|
2
|
+
|
|
1
3
|
export interface GateTestShard {
|
|
2
4
|
id: string;
|
|
3
5
|
files: string[];
|
|
@@ -5,6 +7,27 @@ export interface GateTestShard {
|
|
|
5
7
|
plannedSeconds: number;
|
|
6
8
|
}
|
|
7
9
|
|
|
10
|
+
/** Keep real child/PTY tests out of ordinary self-gate shards, within the caller's shard budget. */
|
|
11
|
+
export function planSelfGateSpawnSeparatedShards(
|
|
12
|
+
files: readonly string[],
|
|
13
|
+
rssMb: ReadonlyMap<string, number>,
|
|
14
|
+
seconds: ReadonlyMap<string, number>,
|
|
15
|
+
budgetGiB: number,
|
|
16
|
+
shardCount: number,
|
|
17
|
+
): GateTestShard[] {
|
|
18
|
+
const unique = [...new Set(files)];
|
|
19
|
+
const spawn = unique.filter(isGateSpawnLaneFile);
|
|
20
|
+
const regular = unique.filter((file) => !isGateSpawnLaneFile(file));
|
|
21
|
+
if (!spawn.length || !regular.length) return planGateTestShards(unique, rssMb, seconds, budgetGiB, shardCount);
|
|
22
|
+
if (shardCount < 2) throw new Error('self gate spawn lane needs at least two shards when regular and spawn tests coexist');
|
|
23
|
+
const spawnCount = Math.min(3, spawn.length, shardCount - 1);
|
|
24
|
+
const planned = [
|
|
25
|
+
...planGateTestShards(regular, rssMb, seconds, budgetGiB, shardCount - spawnCount),
|
|
26
|
+
...planGateTestShards(spawn, rssMb, seconds, budgetGiB, spawnCount),
|
|
27
|
+
];
|
|
28
|
+
return planned.map((shard, index) => ({ ...shard, id: `shard-${index + 1}` }));
|
|
29
|
+
}
|
|
30
|
+
|
|
8
31
|
/** RSS values are the per-file rss_mb observations; the budget is in GiB (1 GiB = 1024 MB here). */
|
|
9
32
|
export function planGateTestShards(
|
|
10
33
|
files: readonly string[],
|
|
@@ -50,3 +73,27 @@ export function planGateTestShards(
|
|
|
50
73
|
}
|
|
51
74
|
return shards;
|
|
52
75
|
}
|
|
76
|
+
|
|
77
|
+
/** OP FU (LAND-TRAIN-LIVE side) — opt-in `--fixed-shard-distribution`: no RSS/seconds measurement. Files are deduplicated,
|
|
78
|
+
* sorted by code point (input-order independent) and dealt round-robin into at most `shardCount` shards; real child/PTY
|
|
79
|
+
* tests keep their own lane exactly like the measured planner. Not a memory-safety guarantee — an over-budget shard
|
|
80
|
+
* surfaces as its own run result (signal/exit/incomplete JUnit ⇒ unmeasured), never as a pass. No empty shards. */
|
|
81
|
+
export function planFixedGateTestShards(files: readonly string[], shardCount: number): GateTestShard[] {
|
|
82
|
+
if (!Number.isSafeInteger(shardCount) || shardCount < 1) throw new Error('invalid shard count');
|
|
83
|
+
const sorted = [...new Set(files)].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
84
|
+
const deal = (subset: readonly string[], count: number): string[][] => {
|
|
85
|
+
const buckets: string[][] = Array.from({ length: Math.min(count, subset.length) }, () => []);
|
|
86
|
+
subset.forEach((file, index) => buckets[index % buckets.length]!.push(file));
|
|
87
|
+
return buckets;
|
|
88
|
+
};
|
|
89
|
+
const spawn = sorted.filter(isGateSpawnLaneFile);
|
|
90
|
+
const regular = sorted.filter((file) => !isGateSpawnLaneFile(file));
|
|
91
|
+
let groups: string[][];
|
|
92
|
+
if (!spawn.length || !regular.length) groups = deal(sorted, shardCount);
|
|
93
|
+
else {
|
|
94
|
+
if (shardCount < 2) throw new Error('self gate spawn lane needs at least two shards when regular and spawn tests coexist');
|
|
95
|
+
const spawnCount = Math.min(3, spawn.length, shardCount - 1);
|
|
96
|
+
groups = [...deal(regular, shardCount - spawnCount), ...deal(spawn, spawnCount)];
|
|
97
|
+
}
|
|
98
|
+
return groups.map((group, index) => ({ id: `shard-${index + 1}`, files: group, plannedRssMb: 0, plannedSeconds: 0 }));
|
|
99
|
+
}
|