elanous 0.2.28 → 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/{y1ltt7oCZxVpC6zVPhZ2O → LSXfY0u9QtfDbejY0Ukf_}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.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/{5492-e05e26a033ba80d2.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/1654.32de4b324981a188.js +23 -0
- 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/1913.7cc6fb6055b1ed3f.js +41 -0
- package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +1 -0
- 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/{8578.dff22d988cc2b106.js → 2213.2ccbada92c33ea0f.js} +3 -3
- 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/{5081.a240b63fad28663a.js → 2871.0bca6137343b3f76.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2898.fd781bc7cf01a7b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2940-619bfd8ef337c611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.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/{f4dfbfc0.a69fb12f854882aa.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/3541-ce3a5424ed5ad7f1.js +1 -0
- 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/{3143.257997a5f1ed79df.js → 3902.e1e71aaac850a045.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1146.80d15ea7c6e6ee95.js → 4111.2bfedbb233ad206b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.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/{9938.b23e4d4dfa0114cd.js → 4999.c064a4000c2a9e94.js} +2 -2
- 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/{1157.f08bf2b70915e176.js → 5304.04d24756f242a094.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{7752.5cbdd0b433c54af9.js → 5307.60f2209e809bd627.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 5458-16cd7a2b51b74c8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 5525.86debf231e181813.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.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/{7483.ba01c6c209b81bba.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/{9974.e77b4ff4884557b3.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/{3309.364573ceedbdfd5f.js → 6323.8672b4817a306928.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 6433.fc573af22bbc9ab7.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{949.1e7d45ccb71580aa.js → 6517.4147878ac06d584d.js} +2 -2
- 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/{2528.3868070ef1be69f9.js → 6767.ea607cf0c20a25af.js} +2 -2
- 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/{1743.563d3168e95825ef.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/{5408.377c8c543635b81f.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/{65ebff95.081daeff622d238e.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2697.76ca2ac3efef6f3b.js → 8018.a32663f04a6fc5f9.js} +1 -1
- 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/9138.b6e80031afb1d973.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.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/{5785-ea8d2c633b6688e3.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/9398-6aed28f0a96d0d6f.js +1 -0
- 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/997ce8a5-2ad501927003b41b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.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-fa46d4588e8442c2.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-ced0bcfc6542b3fc.js → page-349f2752d8cd37ad.js} +1 -1
- 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-cb249e81ed339318.js → page-0a07363b130182a1.js} +1 -1
- 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-521ee23ac8c0abfa.js +1 -0
- 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-149dc1caba411bb9.js +1 -0
- 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/{6def8a8e.c81f9ca41028eccf.js → b313b242.cb1265eea908db61.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{e87d89b9.2e71c0ae475d28a1.js → e5012ffe.f727e23c231f4342.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{e117f801.e92bf10242653497.js → ebc7d829.264a0bcb6c750b50.js} +1 -1
- 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 +15 -7
- package/graphs/units/recipes.yaml +3 -0
- package/graphs/units/release-gate-recheck.yaml +15 -0
- package/package.json +2 -1
- package/plugins/agent-team/agents/research.md +1 -0
- package/scripts/check-native-tool-wiring.ts +3 -2
- package/scripts/ci-android-unit-tests.ts +16 -0
- package/scripts/ci-typecheck-changed.ts +40 -11
- package/scripts/coord-channel-watch.sh +45 -19
- package/scripts/coord-role-pack.ts +222 -0
- 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/lib/morning-report-options.ts +41 -0
- package/scripts/measure-goal-grounding-corpus.ts +2 -1
- package/scripts/pr-land-extra-remote-gates.ts +49 -0
- 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-batch-safe.ts +23 -0
- package/scripts/release-loop/gate-closure.ts +12 -8
- package/scripts/release-loop/gate-diff.ts +1 -1
- package/scripts/release-loop/gate-history.ts +422 -0
- package/scripts/release-loop/gate-host-mirror.ts +66 -0
- package/scripts/release-loop/gate-node.ts +806 -94
- 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-triage-node.ts +190 -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 +51 -0
- package/scripts/release-loop/tui-node-checks.ts +23 -0
- package/scripts/release-loop/tui-sim-node.ts +3 -2
- package/scripts/release-loop/unattended-release.ts +16 -0
- package/scripts/release-loop/version-node.ts +62 -4
- package/scripts/test-deterministic.ts +46 -73
- 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/scripts/usage-rollup.ts +11 -3
- package/src/acp/client.ts +4 -1
- package/src/acp/core-turn-bridge.ts +145 -24
- package/src/acp/elanous-extensions.ts +2 -0
- package/src/acp/server.ts +2 -0
- package/src/ad-pipeline/run.ts +4 -2
- package/src/agent/ref-grounding.ts +18 -0
- 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 +41 -21
- 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/budget/pty-usage-reemit.ts +7 -0
- package/src/budget/run-usage-rollup.ts +9 -0
- package/src/budget/usage-daily-store.ts +98 -0
- package/src/capture/tui-self-report.ts +37 -4
- package/src/chat/chat-cli.ts +10 -2
- package/src/chat/index.ts +107 -20
- package/src/chat/input-control-key.ts +5 -3
- package/src/chat/pickers/modal-runtime.ts +1 -0
- package/src/chat/pickers/modals.ts +3 -1
- package/src/chat/tool-interrupt-behavior.ts +38 -0
- package/src/chat/tool-render/dispatch.ts +5 -1
- package/src/chat/turn-typeahead.ts +191 -29
- 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/dashboard-name-flag.ts +48 -0
- package/src/cli/decisions-cli.ts +80 -6
- package/src/cli/doctor-cli.ts +80 -0
- package/src/cli/log-event-names.ts +19 -0
- package/src/cli/mcp-login.ts +21 -5
- package/src/cli/msg-cli.ts +133 -2
- package/src/cli/pr-cli.ts +546 -112
- package/src/cli/pr-land-heavy-remote.ts +233 -0
- package/src/cli/pr-land-overlap-evidence.ts +167 -14
- 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/pty-takeover-cli.ts +125 -16
- package/src/cli/release-cli.ts +122 -14
- package/src/cli/remote-resolve.ts +2 -1
- package/src/cli/seat-cli.ts +164 -19
- package/src/cli/self-update.ts +5 -2
- package/src/cli/tasks-cli.ts +105 -21
- package/src/cli/usage-cli.ts +146 -12
- package/src/cli/usage-daily-cli.ts +84 -0
- package/src/context-bus/context-first.ts +13 -0
- package/src/context-bus/context-now.ts +95 -7
- 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/auth-rejected-notice.ts +41 -0
- package/src/core-turn/run-core-turn.ts +14 -2
- package/src/core-turn/run-goal-loop.ts +239 -4
- package/src/core-turn/seat-turn-cap.ts +79 -0
- package/src/core-turn/short-question.ts +78 -13
- package/src/core-turn/types.ts +10 -0
- package/src/dashboard/acp-active-model.ts +40 -0
- package/src/dashboard/acp-boot.ts +3 -0
- package/src/dashboard/auto-compact-runtime.ts +2 -0
- package/src/dashboard/boot-banner.ts +80 -0
- package/src/dashboard/dashboard-status-lines.ts +11 -0
- package/src/dashboard/detail-viewer-runtime.ts +15 -2
- package/src/dashboard/event-loop-stall-monitor.ts +4 -0
- package/src/dashboard/goal-loop-thinking.ts +16 -0
- package/src/dashboard/hitl-boot.ts +9 -4
- package/src/dashboard/index.ts +448 -998
- package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
- package/src/dashboard/input/chat-main-log-actions.ts +4 -0
- package/src/dashboard/input/chat-main-log-command.ts +12 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +176 -4
- package/src/dashboard/input/chat-main-session.ts +14 -3
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/chat-main-turn.ts +14 -4
- package/src/dashboard/input/compact-prepass-recovery.ts +130 -0
- package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
- package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
- package/src/dashboard/input/external-input-host.ts +71 -0
- package/src/dashboard/input/internal-turn.ts +261 -0
- package/src/dashboard/input/log-fold-binding.ts +18 -0
- package/src/dashboard/input/mouse-wiring.ts +17 -4
- package/src/dashboard/input/seat-autowake.ts +318 -0
- package/src/dashboard/input/turn-steer-bridge.ts +164 -0
- package/src/dashboard/log-click-runtime.ts +5 -3
- package/src/dashboard/loop-scheduler.ts +72 -0
- package/src/dashboard/running-build-status.ts +74 -0
- package/src/dashboard/seat-boot-preamble.ts +131 -0
- package/src/dashboard/seat-local-instructions.ts +305 -0
- package/src/dashboard/skill-runtime.ts +2 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +220 -1203
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
- package/src/dashboard/slash-runtime/index.ts +13 -0
- package/src/dashboard/slash-runtime/model-choices.ts +35 -0
- package/src/dashboard/term-slash-runtime.ts +15 -0
- package/src/dashboard/turn-busy-teardown.ts +50 -0
- package/src/dashboard/turn-preamble.ts +30 -2
- package/src/dashboard/turn-session-layers.ts +176 -0
- package/src/dashboard/turn-stream-formatter.ts +14 -6
- package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
- package/src/decisions/decision-ledger.ts +45 -4
- package/src/discord-self-message.ts +4 -4
- package/src/domains/release-tool.ts +26 -10
- package/src/domains/surface-events.ts +4 -1
- package/src/domains/watch-default-scheduler.ts +8 -9
- package/src/field-note/transcribe.ts +17 -0
- package/src/fold-stack.ts +24 -1
- package/src/git-fs/dirty.ts +32 -4
- package/src/git-fs/index.ts +43 -1
- 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 +2 -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 +34 -6
- 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 +166 -26
- package/src/input/external-input-queue.ts +251 -0
- package/src/intake-plane/slash.ts +14 -3
- package/src/interactive-terminal-modal.ts +13 -0
- package/src/keybindings.ts +4 -1
- package/src/llm/route-decision.ts +25 -0
- package/src/llm/tool-loop-steered-rejection.ts +33 -0
- package/src/llm-stream-retry-display.ts +59 -0
- package/src/llm.ts +391 -74
- package/src/log-entry.ts +3 -3
- package/src/log-pane/search.ts +29 -4
- package/src/loops/agent-reply.ts +256 -0
- package/src/loops/budget.ts +37 -7
- package/src/loops/consensus.ts +348 -0
- package/src/loops/loop-cli.ts +3 -2
- package/src/loops/msg-address.ts +57 -0
- package/src/loops/msg-wake.ts +484 -0
- package/src/loops/observe.ts +19 -3
- package/src/loops/orchestrator/inbox.ts +60 -3
- package/src/loops/orchestrator/tick.ts +80 -6
- package/src/loops/orchestrator/traffic.ts +64 -1
- package/src/loops/registry.ts +72 -4
- package/src/market/signed-index.ts +14 -0
- package/src/mcp/mcp-oauth.ts +54 -5
- package/src/memory.ts +20 -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/native-tool-catalog.ts +125 -0
- package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
- package/src/nexus/api/http-server.ts +59 -15
- package/src/nexus/api/loop-resources.ts +19 -3
- package/src/nexus/api/ops-api.ts +13 -0
- package/src/nexus/api/project-autopsy.ts +127 -0
- package/src/nexus/api/terminals.ts +3 -0
- package/src/nexus/api/workflow-approvals.ts +2 -0
- package/src/nexus/daemon-thin-inventory.md +37 -0
- package/src/nexus/index.ts +70 -0
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
- package/src/nexus/state/state.ts +1 -0
- package/src/oauth/codex-account-store.ts +15 -3
- package/src/oauth/codex-billing-route.ts +31 -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/overview-collect.ts +19 -2
- package/src/ops/resources.ts +82 -0
- package/src/panes/log-pane.ts +67 -8
- package/src/persona/presets.ts +44 -0
- package/src/plugins/maker/connector-maker.ts +41 -0
- package/src/plugins/maker/skill-maker.ts +42 -0
- package/src/plugins/maker/wizard-generate.ts +6 -4
- package/src/pr-tool/census.ts +288 -0
- package/src/preview/terminal.ts +14 -1
- package/src/prompt-cache/types.ts +2 -0
- package/src/prompt-enhance/enhance.ts +24 -8
- package/src/prompt-library/chat-conciseness.ts +13 -0
- package/src/prompt-library/universal-preamble.ts +283 -61
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/pty-manifest.ts +77 -5
- package/src/pty-shell/registry.ts +19 -2
- package/src/pty-shell/tui-run-state.ts +253 -0
- 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 +32 -4
- 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/render.ts +5 -1
- 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/seat-report.ts +42 -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 +300 -24
- package/src/self-dev/run-types.ts +20 -0
- package/src/self-dev/shard-aggregate.ts +15 -2
- package/src/self-dev/shard-plan.ts +47 -0
- package/src/self-dev/shard-run.ts +135 -12
- package/src/self-dev/spawn-lane-files.ts +19 -0
- package/src/self-health/signatures.ts +132 -0
- package/src/self-implement/app-api-budget.ts +51 -11
- package/src/self-implement/config-gate.ts +2 -1
- package/src/self-implement/doctor-visit.ts +118 -0
- 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 +212 -18
- package/src/self-implement/gate-remote.ts +110 -25
- package/src/self-implement/gate-scenario.ts +85 -0
- package/src/self-implement/goal-author-decompose.ts +80 -16
- package/src/self-implement/goal-author.ts +270 -76
- package/src/self-implement/goal-authoring-grounding.ts +1 -1
- package/src/self-implement/goal-file-name.ts +65 -0
- package/src/self-implement/graph-authority.ts +38 -6
- package/src/self-implement/graph-overlay-condition.ts +92 -1
- package/src/self-implement/ground-goal.ts +2 -1
- package/src/self-implement/heal-triage.ts +79 -0
- package/src/self-implement/host-regate.ts +74 -2
- package/src/self-implement/orchestrator.ts +14 -123
- package/src/self-implement/pr-title.ts +123 -0
- package/src/self-implement/review-mustfix-class.ts +115 -0
- package/src/self-implement/run-checkpoint.ts +235 -0
- package/src/self-implement/run-ledger.ts +266 -17
- package/src/self-implement/run-stop.ts +4 -3
- package/src/self-implement/run-ttl.ts +28 -4
- package/src/self-implement/running-runs.ts +10 -6
- package/src/self-implement/seams.ts +2 -0
- package/src/self-implement/self-implement-runtime.ts +32 -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 +81 -11
- package/src/session/session-start.ts +224 -0
- package/src/session-runtime/index.ts +7 -1
- package/src/session-runtime/parallel-dispatch.ts +22 -5
- package/src/skills/tools/dev-harness.ts +6 -4
- package/src/skills/tools/ops-ledger.ts +707 -0
- package/src/skills/tools/persistent-grounding.ts +47 -7
- package/src/skills/tools/shell.ts +117 -1
- package/src/status/bar.ts +32 -2
- package/src/status/status-provider-info.ts +58 -0
- 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 +93 -13
- package/src/task-agent/remote-rejudge-bind.ts +62 -13
- package/src/task-agent/repair-cycle.ts +58 -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/kubectl-transient-retry.ts +51 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +138 -22
- 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 +122 -15
- 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 +103 -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 +237 -46
- package/src/telegram.ts +2 -4
- package/src/terminal/session-registry.ts +6 -0
- package/src/thinking-line.ts +12 -3
- package/src/tool-runtime/index.ts +4 -0
- package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
- package/src/tool-runtime/ref-consult-runtime.ts +17 -2
- package/src/tool-runtime/run-shell-runtime.ts +4 -1
- package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
- 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 +53 -0
- package/src/user-config/gemini-server-tools.ts +9 -0
- package/src/user-config.ts +106 -21
- 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/fake-llm.ts +29 -0
- package/src/ux-sim/headless-tui.ts +72 -0
- package/src/ux-sim/in-process-cli.ts +176 -0
- 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/1027.a0f04663d24c2779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
- package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1454-29d1d773d5996a49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
- package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
- package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/599-56f2c0a5cc4a7295.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
- package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
- package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
- package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
- package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
- package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/973cbf1b.3bbcf2b41548eca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-5ab1e47978577c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-24453f6a302816b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-6c131d30bb1cf871.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-dc0772b11861af51.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-66ad46ed0279feb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-5159dc8752c6cd29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-c5a2478861c08b87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-f722a9dec084e08b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-256ffd365d32e100.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-e0de78ae7b99f01c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-cfbdc44b708d9801.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-4c741eb760f2f77c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-e9ba98f5f1440a21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-dafc901bb1b72b5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2f6f303fa114ec24.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-1634081c5272006c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-bb1f05cd51c38944.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-646b50f63b6fe732.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-db069b48a59c8c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-f736324afa2117c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-6f131b51193a36f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-435f5e2faf02bc01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-497e0eedf20e7890.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-a8d28fdf995e16ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8966452228753c5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fd5d18656cb432b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5663779cb1a37609.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-66a67eb19ebd976b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-3b492aa78cf3c4a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c71267e7681da982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a21d1e1797172692.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-781cfc5114e097da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-478157214db6a023.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-86141f12cf090b7f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-7256c73bb1c36751.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-5c738ca7adef3de5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-0138c8091ec17224.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-cc2f24f16d85e735.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-979d318a534e92da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-182d394f7e6e096b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-21050928a697ed7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-44b9d807005a9030.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-601fb77340e63c9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-75d3fb5d47af0edf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-11bf9e5725a72c22.js +0 -1
- package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
- package/src/dashboard/bench-slash-runtime.ts +0 -40
- package/src/dashboard/input/search-modal-router.ts +0 -9
- package/src/dashboard/modals/pane-key-router.ts +0 -27
- package/src/dashboard/view-slash-runtime.ts +0 -48
- /package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → 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,12 +5,14 @@ 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';
|
|
11
12
|
import { routeSupervisorVerdict } from './supervisor-verdict-edges.js';
|
|
12
13
|
import { recordTaskAgentShadowMove, runCardFor, type TaskAgentShadowInput } from '../task-agent/shadow.js';
|
|
13
14
|
import { cardPrNumber, taskAgentStatePath } from '../task-agent/task-hand.js';
|
|
15
|
+
import { classifyMustFixRound, inferMustFixEvidence, type MustFixRoundClassification, type MustFixRoundObservation } from '../self-implement/review-mustfix-class.js';
|
|
14
16
|
|
|
15
17
|
export interface SupervisorRound {
|
|
16
18
|
round: number;
|
|
@@ -46,6 +48,18 @@ export interface SupervisorRound {
|
|
|
46
48
|
* streak pairs rounds by this key. Omitted on older history — the guard then pairs by taskId as before.
|
|
47
49
|
*/
|
|
48
50
|
noPrFeatureKeys?: string[];
|
|
51
|
+
/** REVIEW-MUSTFIX-CLASSIFY — that round's observed must-fix items; pairs the next round's classification. */
|
|
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[];
|
|
49
63
|
}
|
|
50
64
|
|
|
51
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). */
|
|
@@ -61,25 +75,6 @@ export function noPrStreakKey(feature: unknown): string {
|
|
|
61
75
|
return typeof feature === 'string' ? resumeKey(feature).replace(/[\s.,;:!?。…·]+$/u, '') : '';
|
|
62
76
|
}
|
|
63
77
|
|
|
64
|
-
export const SUPERVISOR_STOP_REASONS = [
|
|
65
|
-
'converged',
|
|
66
|
-
'human-stopped',
|
|
67
|
-
'parent-signals-red',
|
|
68
|
-
'needs-human',
|
|
69
|
-
'no-actionable-work',
|
|
70
|
-
'harvestable-awaiting-human',
|
|
71
|
-
'handed-off-to-salvage',
|
|
72
|
-
'max-rounds',
|
|
73
|
-
'no-progress',
|
|
74
|
-
'provider-exhausted',
|
|
75
|
-
'step-timeout',
|
|
76
|
-
'decomposable-no-progress',
|
|
77
|
-
'review-unobserved',
|
|
78
|
-
'review-oscillating',
|
|
79
|
-
'deliverable-unobserved',
|
|
80
|
-
'deliverable-merged',
|
|
81
|
-
] as const satisfies readonly SupervisorStopReason[];
|
|
82
|
-
|
|
83
78
|
export const SUPERVISOR_ACTIONS = ['relaunch', 'add-repair-task', 'stop'] as const;
|
|
84
79
|
|
|
85
80
|
export interface DecomposePromotionOutcome {
|
|
@@ -116,6 +111,10 @@ export interface SupervisorDecision {
|
|
|
116
111
|
deliverableUnmeasured: boolean;
|
|
117
112
|
deliverableMergeCompleteness: 'unmeasured' | 'complete' | 'incomplete';
|
|
118
113
|
reviewMustFixTrend: ReviewRework['trend'];
|
|
114
|
+
/** REVIEW-MUSTFIX-CLASSIFY — this round's leading must-fix class (② › ③ observed › ①); omitted when unmeasured (지금 동작 그대로). */
|
|
115
|
+
mustFix?: MustFixRoundClassification;
|
|
116
|
+
/** REVIEW-MUSTFIX-CLASSIFY — every oscillating task's measured class, so a mixed round keeps each task's decision. */
|
|
117
|
+
mustFixByTask?: Record<string, MustFixRoundClassification>;
|
|
119
118
|
oscillation?: { taskIds: string[]; helper: 'review-oscillation'; signature: string; repairGoals?: Record<string, string>; heldTaskIds?: string[] };
|
|
120
119
|
pendingDecision?: 'attempt-care-escalation';
|
|
121
120
|
}
|
|
@@ -234,6 +233,41 @@ export function aggregateReviewTrend(results: readonly SelfDevJobResult[]): Revi
|
|
|
234
233
|
return severity[Math.max(...trends.map((trend) => severity.indexOf(trend)))];
|
|
235
234
|
}
|
|
236
235
|
|
|
236
|
+
/**
|
|
237
|
+
* REVIEW-MUSTFIX-CLASSIFY — this round's must-fix observation from the results' verbatim `reviewMustFix`.
|
|
238
|
+
* Each item carries its `taskId` so the next round pairs per task (one task's recurrence never holds another).
|
|
239
|
+
*/
|
|
240
|
+
function mustFixFromResults(results: readonly SupervisorJobResult[]): MustFixRoundObservation {
|
|
241
|
+
const items = results.flatMap((result) => (result.reviewMustFix ?? []).map((text) => {
|
|
242
|
+
const evidence = inferMustFixEvidence(text);
|
|
243
|
+
return { text, taskId: result.taskId, ...(evidence === undefined ? {} : { evidence }) };
|
|
244
|
+
}));
|
|
245
|
+
return items.length > 0 ? { items } : {};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* REVIEW-MUSTFIX-CLASSIFY — per-task class. `prev` is the preceding round's items of the same task or its repair
|
|
250
|
+
* lineage (`oscillationRepairOf`), and only when that preceding round authored a repair for it — «수리 뒤 같은 지적»
|
|
251
|
+
* means a repair ran between the last observation and this one, not «repaired at any time». Lineage items are
|
|
252
|
+
* re-scoped to this task so the pure pairing accepts them; unrelated tasks never pair.
|
|
253
|
+
*/
|
|
254
|
+
function classifyTaskMustFix(result: SupervisorJobResult, preceding: SupervisorRound | undefined): MustFixRoundClassification {
|
|
255
|
+
const pairIds = new Set([result.taskId, ...(result.oscillationRepairOf ? [result.oscillationRepairOf] : [])]);
|
|
256
|
+
const repairedSincePrev = (preceding?.oscillationRepairTaskIds ?? []).some((id) => pairIds.has(id));
|
|
257
|
+
const prevItems = repairedSincePrev
|
|
258
|
+
? (preceding?.mustFix?.items ?? []).filter((item) => item.taskId !== undefined && pairIds.has(item.taskId))
|
|
259
|
+
.map((item) => ({ ...item, taskId: result.taskId }))
|
|
260
|
+
: [];
|
|
261
|
+
return classifyMustFixRound(prevItems.length > 0 ? { items: prevItems } : undefined, mustFixFromResults([result]));
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Classes that hold a task out of this round's same-run repair. Only ② acts in this slice; ③ recurring is
|
|
266
|
+
* observed (decision `mustFix`/`mustFixByTask` · crossReview suggestion) but behaves as ① — acting on it is a
|
|
267
|
+
* follow-up cell (REVIEW-MUSTFIX-CLASSIFY partial landing).
|
|
268
|
+
*/
|
|
269
|
+
const MUST_FIX_HELD = new Set<MustFixRoundClassification['class']>(['post-land-evidence']);
|
|
270
|
+
|
|
237
271
|
export function decideNextRun(input: {
|
|
238
272
|
results: readonly SupervisorJobResult[];
|
|
239
273
|
history?: readonly SupervisorRound[];
|
|
@@ -520,8 +554,27 @@ export function decideNextRun(input: {
|
|
|
520
554
|
|| (entry.oscillationRepairFeatures?.[index] !== undefined && entry.oscillationRepairFeatures[index] === result.feature
|
|
521
555
|
&& Object.values(entry.oscillationRepairGoals ?? {}).includes(result.feature))));
|
|
522
556
|
// Per task: a task that already got its one oscillation repair is held for a human; a fresh one may get it.
|
|
523
|
-
|
|
524
|
-
|
|
557
|
+
// REVIEW-MUSTFIX-CLASSIFY — 슈퍼바이저는 추이 대신 회차 분류를 먼저 본다(대표 10-12 «노하우가 아니라 로직으로» · 임의 임계 없음).
|
|
558
|
+
// ① new-defect — 그대로 수렴(진동 수리 유지).
|
|
559
|
+
// ② post-land-evidence — 증거는 착지 뒤에만 난다 ⇒ 같은 런 재수리 0, «그림자 착지 → 관측 → live» 쪼개기 결정.
|
|
560
|
+
// ③ recurring — 수리 뒤 같은 지적 ⇒ 이 조각에선 관측만(교차 리뷰 제안을 결정에 싣고 동작은 ① 그대로 · 후속 칸).
|
|
561
|
+
// unmeasured — 분류 불가 ⇒ 지금 동작 그대로. 분류는 조각마다 — 한 조각의 분류가 다른 조각의 수리를 끊지 않는다.
|
|
562
|
+
const taskClasses = new Map(oscillating.map((result) => [result.taskId, classifyTaskMustFix(result, preceding)]));
|
|
563
|
+
const fresh = oscillating.filter((result) => !isRepaired(result) && !MUST_FIX_HELD.has(taskClasses.get(result.taskId)!.class));
|
|
564
|
+
const classes = [...taskClasses.values()];
|
|
565
|
+
// Decision-level class: ② (the only acting class) first, then observed ③, else ①.
|
|
566
|
+
const mustFixClass = classes.find((c) => c.class === 'post-land-evidence') ?? classes.find((c) => c.class === 'recurring')
|
|
567
|
+
?? classes.find((c) => c.class === 'new-defect');
|
|
568
|
+
// Held = already repaired once, or classified ② — either way it never rides this round's rerun.
|
|
569
|
+
const classHeld = [...new Set(oscillating.filter((result) => !isRepaired(result)
|
|
570
|
+
&& MUST_FIX_HELD.has(taskClasses.get(result.taskId)!.class)).map((result) => result.taskId))];
|
|
571
|
+
const held = [...new Set([...oscillating.filter(isRepaired).map((result) => result.taskId), ...classHeld])];
|
|
572
|
+
const repairedHeld = held.filter((id) => !classHeld.includes(id));
|
|
573
|
+
// Every task's measured class survives in the decision — a mixed round keeps ② split and the observed ③ cross-review suggestion both.
|
|
574
|
+
const mustFixByTask: Record<string, MustFixRoundClassification> = Object.fromEntries(
|
|
575
|
+
[...taskClasses].filter(([, c]) => c.class !== 'unmeasured'));
|
|
576
|
+
const heldReasons = [...new Set(classes.filter((c) => MUST_FIX_HELD.has(c.class)).map((c) => c.reason))];
|
|
577
|
+
const heldReasonSuffix = heldReasons.length ? ` · ${heldReasons.join(' · ')}` : '';
|
|
525
578
|
const repairGoals: Record<string, string> = Object.fromEntries(fresh.flatMap((result) => {
|
|
526
579
|
const goal = result.prNumber && result.reviewMustFix?.length
|
|
527
580
|
? authorRepairGoal({ pr: result.prNumber, category: 'review-oscillation', originalRequest: result.feature,
|
|
@@ -551,14 +604,16 @@ export function decideNextRun(input: {
|
|
|
551
604
|
} : {}),
|
|
552
605
|
action,
|
|
553
606
|
...(action === 'stop' ? { stopReason: 'review-oscillating' as const } : {}),
|
|
607
|
+
...(mustFixClass ? { mustFix: mustFixClass } : {}),
|
|
608
|
+
...(Object.keys(mustFixByTask).length ? { mustFixByTask } : {}),
|
|
554
609
|
oscillation: { taskIds, helper: 'review-oscillation', signature, ...(Object.keys(repairGoals).length ? { repairGoals } : {}),
|
|
555
610
|
...(action === 'add-repair-task' && held.length ? { heldTaskIds: held } : {}) },
|
|
556
611
|
pendingDecision: 'attempt-care-escalation',
|
|
557
612
|
why: fresh.length === 0
|
|
558
|
-
? `리뷰 진동 반복 — ${signatureOf(oscillating)} · 사람 결정 필요(같은 전략 재발사 금지)`
|
|
613
|
+
? `리뷰 진동 반복 — ${signatureOf(oscillating)} · 사람 결정 필요(같은 전략 재발사 금지)${heldReasonSuffix}`
|
|
559
614
|
: cannotRepair
|
|
560
|
-
? `리뷰 진동 — ${signatureOf(oscillating)} · ${input.repairGoalExecution === false ? '이 감독 경로가 수리 골 실행을 선언하지 않았다(미선언 또는 불가)' : '수리 원문/PR 관측 불가'} · 사람 결정 필요(같은 전략 재발사 금지)`
|
|
561
|
-
: `리뷰 진동 — ${signatureOf(fresh)} · review-oscillation 수리 조각을 한 번 붙인다${input.repairGoalExecution === true ? '' : '(실행 배선 미선언 — 결정 칸만)'}${
|
|
615
|
+
? `리뷰 진동 — ${signatureOf(oscillating)} · ${input.repairGoalExecution === false ? '이 감독 경로가 수리 골 실행을 선언하지 않았다(미선언 또는 불가)' : '수리 원문/PR 관측 불가'} · 사람 결정 필요(같은 전략 재발사 금지)${heldReasonSuffix}`
|
|
616
|
+
: `리뷰 진동 — ${signatureOf(fresh)} · review-oscillation 수리 조각을 한 번 붙인다${input.repairGoalExecution === true ? '' : '(실행 배선 미선언 — 결정 칸만)'}${repairedHeld.length ? ` · 이미 수리한 조각 ${repairedHeld.join(', ')} 은 사람 결정 대기` : ''}${classHeld.length ? ` · 분류로 보류한 조각 ${classHeld.join(', ')}` : ''}${heldReasonSuffix}`,
|
|
562
617
|
};
|
|
563
618
|
}
|
|
564
619
|
|
|
@@ -588,15 +643,31 @@ export function appendRound(
|
|
|
588
643
|
const t = triageRun(results.filter((result) => result.salvage !== 'launched'), undefined, false, undefined, mainSyncRelaunchSpent(history));
|
|
589
644
|
const baseCompleted = countBaseCompleted(results);
|
|
590
645
|
const base = roundBase(results);
|
|
646
|
+
// REVIEW-MUSTFIX-CLASSIFY — 회차 원장에 관측을 실어 다음 회차 짝으로 쓴다(관측 없는 옛 원장은 그대로).
|
|
647
|
+
const mustFix = mustFixFromResults(results.filter((result) => result.salvage !== 'launched'));
|
|
591
648
|
const noPrResults = results.filter(failedWithoutPr);
|
|
592
649
|
const noPrTaskIds = noPrResults.map((result) => result.taskId);
|
|
593
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
|
+
}
|
|
594
662
|
return [...history, {
|
|
595
663
|
round: history.length,
|
|
596
664
|
landed: countLanded(results),
|
|
597
665
|
...(baseCompleted > 0 || base !== undefined ? { baseCompleted, ...(base === undefined ? {} : { base }) } : {}),
|
|
598
666
|
actionable: countActionable(t),
|
|
599
667
|
...(reviewMustFixTrend === undefined ? {} : { reviewMustFixTrend }),
|
|
668
|
+
...((mustFix.items ?? []).length > 0 ? { mustFix } : {}),
|
|
669
|
+
...(Object.keys(lostTimeMsByTask).length > 0 ? { lostTimeMsByTask } : {}),
|
|
670
|
+
...(unknownTimeTaskIds.size > 0 ? { unknownTimeTaskIds: [...unknownTimeTaskIds] } : {}),
|
|
600
671
|
...(results.some((result) => result.rework?.signature)
|
|
601
672
|
? { signatures: Object.fromEntries(results.filter((result) => result.rework?.signature).map((result) => [result.taskId, result.rework!.signature])) } : {}),
|
|
602
673
|
...(decision && decision.action !== 'stop' && decision.relaunchOnMain.length > 0 ? {
|
|
@@ -621,6 +692,195 @@ export function appendRound(
|
|
|
621
692
|
}];
|
|
622
693
|
}
|
|
623
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
|
+
|
|
624
884
|
export interface SuperviseRunOptions {
|
|
625
885
|
initial: readonly SupervisorJobResult[];
|
|
626
886
|
rerun: (previous: readonly SupervisorJobResult[], invocation: { relaunch: true; repairGoals?: Record<string, string> }) => Promise<readonly SupervisorJobResult[]>;
|
|
@@ -804,6 +1064,22 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
804
1064
|
const reason = decision.stopReason ?? 'unregistered-stop';
|
|
805
1065
|
const next = routeSupervisorVerdict(reason, results).next;
|
|
806
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 */ }
|
|
807
1083
|
results = results.map((result) => ({ ...result, next }));
|
|
808
1084
|
if (runId && decision.stopReason) {
|
|
809
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';
|
|
@@ -16,6 +16,8 @@ export interface GateShardAttempt {
|
|
|
16
16
|
baselineExitCode: number | null;
|
|
17
17
|
currentSignal?: string | null;
|
|
18
18
|
baselineSignal?: string | null;
|
|
19
|
+
currentDiagnostic?: string;
|
|
20
|
+
baselineDiagnostic?: string;
|
|
19
21
|
/** LIGHT-RC-MEASURE — the shard files that exist in the baseline tree, i.e. what the baseline side actually ran.
|
|
20
22
|
* Absent = every shard file (the old shape). Empty = the baseline side was not run and contributes zero cases. */
|
|
21
23
|
baselineFiles?: readonly string[];
|
|
@@ -38,13 +40,13 @@ const decode = (text: string): string => text.replace(/&(#x[0-9a-f]+|#\d+|amp|lt
|
|
|
38
40
|
return ({ amp: '&', lt: '<', gt: '>', quot: '"', apos: "'" } as Record<string, string>)[key.toLowerCase()] ?? entity;
|
|
39
41
|
});
|
|
40
42
|
|
|
41
|
-
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 }
|
|
42
44
|
|
|
43
45
|
/** Strict, dependency-free XML reader for JUnit reports: the whole document must be well formed
|
|
44
46
|
* (one root, balanced tags, nothing but whitespace/comments after the root). CDATA and comments are
|
|
45
47
|
* text, never elements — so a `<testcase>` inside a failure message is not a test case, and a report
|
|
46
48
|
* followed by a truncated tail is rejected as unmeasured rather than read as complete. */
|
|
47
|
-
function parseXml(xml: string): XmlElement | undefined {
|
|
49
|
+
export function parseXml(xml: string): XmlElement | undefined {
|
|
48
50
|
const stack: XmlElement[] = [];
|
|
49
51
|
let root: XmlElement | undefined;
|
|
50
52
|
let i = xml.charCodeAt(0) === 0xfeff ? 1 : 0;
|
|
@@ -191,6 +193,17 @@ function readJUnit(xml: string, files: readonly string[]): JUnitCase[] | undefin
|
|
|
191
193
|
return cases;
|
|
192
194
|
}
|
|
193
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
|
+
|
|
194
207
|
const SKIPPED_PASSED_AT_BASE = 'skipped now · passed at base — a skip must not hide a regression (LIGHT-RC-MEASURE ②)';
|
|
195
208
|
|
|
196
209
|
/** Cases that passed at the baseline but were skipped now are counted as `unknown` failures — never green. */
|