elanous 0.2.35 → 0.2.37
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/{T1mBQqmkwKDLGtyisDCOd → 8kITumG9GAZ1LwT9POrAR}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{9952.5daf5f94063a2b3e.js → 1262.a89bb27a5b2f844e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1746.3563617ea64023a3.js +115 -0
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1dc5a567.9b092bfae3d7099b.js → 1ed5e8af.cf424815c7c0efad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.js → 2002-a43a3f380df873ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{13.02a07436dec15f89.js → 210.90b2cbd64926cf34.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 2283.edd9627b7bdfb546.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{6866-79aa5b4e47cac6aa.js → 2318-450e75d07605b8fe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.js → 2375.bf364c85dbb6f085.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.js → 3578.4e9f9948a9a6f2f4.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +90 -0
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +287 -0
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2018.a741297bce759490.js → 4313.76f232c304a15bde.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1165.bad13fc9151a7288.js → 4324.c99ba3e83eb1b691.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3f7c4ee5.3dde54f01a816613.js → 4337e36d.f42c3b391b3d8f20.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.js → 4383.18e5c54db3a22c88.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8557-e7898769499cd56f.js → 4725-34bed25720cc326b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5483-dd5d7697f6bdb106.js → 4833-7934c592c5569f00.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{8444.4c26b379ca2b9596.js → 4931.95cc6dbd230774ca.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3408.21d1570602f4b6c0.js → 5046.7fd5cbd859299448.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +104 -0
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +1 -0
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/58edce7d.f1b0c72acf13b123.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.js → 5f6af561-f90b7a67f4f75d13.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +74 -0
- package/apps/pwa/out/_next/static/chunks/6252.240578f10952e091.js +34 -0
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 6680.6a693c28aae4cd19.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.js → 6745-5a63492933959dd9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{6236.e18cced2d5ba6afb.js → 6819.be5c9c4d67f22922.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2833-0fe47af99ed13c29.js → 6971-fb5f9dc0a2cb5d2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.js → 709a918c.4fd3b4e2a32cb4e3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +41 -0
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7424.c0fe2a595d4232b5.js +23 -0
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +1 -0
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7644.17e37ba6f1d4226e.js → 7867.e8725745ddd1d940.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.js → 7c5ed21f-f286708e57cf88f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{359-2250789a2d3499e7.js → 8080-40d781e7704d3671.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +77 -0
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +1 -0
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +286 -0
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +79 -0
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b2f6ba4d.fb56fdbbf798df33.js → 8c58d09b.e8724a299658d86f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1530.0e612369b6fd7ea0.js → 9151.a2c51e93f9156dae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4441-875b97f5821ed58a.js → 9175-7d383df15a82e2be.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +94 -0
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +64 -0
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-47c5d4db587266bd.js → page-1e5da297557d2354.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-1f5a60f70cb4dd0c.js → page-88a1edbff62eaf1d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-bac7dee94e5eae4a.js → page-443364c9e4a23b31.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-dc0a532f5b9196ec.js → page-ac2c1e6169cfce57.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d06f9160.a3d9062f95de8ad7.js → d9815f84.4918f682a45a8502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.js → de8446d3.31b73eb239fecd7b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +1 -0
- package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.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/docs/goal-context/05-authoring-lessons.jsonl +47 -0
- package/docs/goal-context/README.md +3 -0
- package/graphs/default-loop.yaml +6 -1
- package/graphs/drafts/recipes.yaml +27 -7
- package/graphs/implement-loop.yaml +24 -0
- package/graphs/release/recipes.yaml +6 -0
- package/graphs/release/release-loop.yaml +17 -4
- package/graphs/wizard/recipes.yaml +44 -0
- package/graphs/wizard/wizard-loop.yaml +44 -0
- package/graphs/work/draft-close.yaml +54 -0
- package/graphs/work/green-close.yaml +37 -0
- package/graphs/work/recipes.yaml +46 -1
- package/graphs/work/research-report.yaml +2 -0
- package/graphs/work/run-research.yaml +35 -0
- package/package.json +1 -1
- package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
- package/scripts/boundary-proof-mapping-audit.ts +88 -0
- package/scripts/ci-typecheck-changed.ts +139 -5
- package/scripts/codex-fallback-live-probe.ts +17 -15
- package/scripts/coord-role-pack.ts +1 -1
- package/scripts/first10-gate.ts +416 -0
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -0
- package/scripts/fleet/wsl-node-setup.sh +432 -0
- package/scripts/gate-0226-failure-census.ts +507 -0
- package/scripts/goals/authoring-metrics.ts +258 -0
- package/scripts/graph-units/draft-close-node.ts +222 -0
- package/scripts/hook-order-sweep.ts +7 -4
- package/scripts/land-global-checks.ts +69 -1
- package/scripts/measure-nl-routing-corpus.ts +207 -2
- package/scripts/release-loop/docs-node.ts +344 -8
- package/scripts/release-loop/gate-closure.ts +48 -0
- package/scripts/release-loop/gate-diff.ts +2 -1
- package/scripts/release-loop/gate-node.ts +249 -53
- package/scripts/release-loop/known-issues-node.ts +6 -4
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/notes-repair.ts +216 -0
- package/scripts/release-loop/prepare-node.ts +61 -5
- package/scripts/release-loop/resume-cap.ts +14 -34
- package/scripts/release-loop/resume-release.ts +151 -15
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/traffic-node.ts +59 -0
- package/scripts/release-loop/traffic-transition.ts +159 -0
- package/scripts/release-loop/version-node.ts +81 -12
- package/scripts/rhythm/daily.ts +137 -3
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +53 -0
- package/skills/README.md +1 -0
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +54 -6
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/delegate-hint.ts +16 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/runner.ts +82 -2
- package/src/agent/task-notification.ts +56 -10
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent/types.ts +4 -0
- package/src/agent-substrate/pr-reviewer.ts +64 -4
- package/src/agent-substrate/review-intent.ts +29 -2
- package/src/agent-substrate/review-observation.ts +3 -0
- package/src/agent-substrate/self-review-cli.ts +490 -26
- package/src/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/mission-codebase-gate.ts +141 -12
- package/src/autopilot/pr-manager.ts +89 -18
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/boot/daemon-tools/self-implement.ts +1 -0
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/budget/usage-outcomes.ts +8 -4
- package/src/capture/tui-self-report.ts +132 -1
- package/src/chat/goal-continue-verdict.ts +41 -0
- package/src/chat/index.ts +30 -4
- package/src/chat/internal-turn-origin.ts +1 -0
- package/src/chat/paste-fold.ts +86 -0
- package/src/chat/tool-render/block.ts +32 -0
- package/src/chat/tool-render/dispatch.ts +2 -20
- package/src/chat/tool-render/result-text.ts +98 -0
- package/src/chat/turn-typeahead.ts +70 -7
- package/src/cli/autopilot-cli.ts +24 -9
- package/src/cli/config-audit.ts +119 -0
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +137 -6
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/herdr-cli.ts +34 -0
- package/src/cli/light-entry-route.ts +6 -3
- package/src/cli/log-event-names.ts +2 -0
- package/src/cli/logs-cli.ts +357 -2
- package/src/cli/make-cli.ts +247 -11
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +132 -14
- package/src/cli/pr-cli.ts +29 -16
- package/src/cli/pr-granularity.ts +5 -3
- package/src/cli/pr-land-base-read.ts +11 -2
- package/src/cli/pr-land-heavy-remote.ts +6 -3
- package/src/cli/pr-land-overlap-evidence.ts +23 -4
- package/src/cli/pr-land-recovery.ts +117 -1
- package/src/cli/pty-takeover-cli.ts +8 -7
- package/src/cli/release-checklist-read-cli.ts +109 -4
- package/src/cli/release-cli.ts +64 -15
- package/src/cli/release-single-flight.ts +1 -1
- package/src/cli/self-update.ts +23 -5
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-card-show.ts +162 -0
- package/src/cli/tasks-cli.ts +868 -352
- package/src/cli/tasks-read-cli.ts +197 -0
- package/src/cli/usage-cli.ts +12 -10
- package/src/context-bus/claude-memory-import.ts +99 -0
- package/src/context-bus/long-term-memory.ts +125 -0
- package/src/core-turn/run-core-turn.ts +4 -2
- package/src/core-turn/run-goal-loop.ts +76 -16
- package/src/core-turn/types.ts +8 -1
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/context/keys.ts +8 -31
- package/src/dashboard/index.ts +299 -62
- package/src/dashboard/input/agent-wake.ts +50 -1
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
- package/src/dashboard/input/chat-main-slash-command.ts +4 -2
- package/src/dashboard/input/goal-continue.ts +210 -0
- package/src/dashboard/input/goal-interim.ts +2 -0
- package/src/dashboard/input/internal-turn.ts +2 -8
- package/src/dashboard/input/seat-autowake.ts +9 -7
- package/src/dashboard/input/turn-autoheal.ts +52 -0
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/seat-boot-preamble.ts +132 -5
- package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -10
- package/src/dashboard/slash-runtime/model-choices.ts +15 -0
- package/src/dashboard/stale-install-check.ts +3 -99
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- package/src/debug/batch-queue.ts +119 -0
- package/src/debug/tui-log-tag.ts +67 -0
- package/src/display/agent-surface.ts +7 -0
- package/src/display/coordinator.ts +45 -12
- package/src/display/resize-listener.ts +41 -20
- package/src/display/synchronized-output-region.ts +60 -0
- package/src/domains/standalone-log-sink.ts +15 -2
- package/src/domains/surface-events.ts +80 -1
- package/src/esc-abort-gate.ts +69 -0
- package/src/exec-requests/planner.ts +37 -2
- package/src/execution-loop/launch-gate.ts +4 -3
- package/src/git-fs/cli-stderr.ts +45 -0
- package/src/git-fs/gh-cli.ts +6 -3
- package/src/git-fs/git-cli.ts +11 -5
- package/src/git-fs/worktree.ts +95 -1
- package/src/graph-runner/graph-cli.ts +44 -2
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +37 -16
- package/src/graph-wizard/generate.ts +131 -4
- package/src/graph-wizard/steps.ts +15 -0
- package/src/grounding/proactive-ground.ts +86 -0
- package/src/harness/control-inbox.ts +49 -1
- package/src/harness/harness-cli-command.ts +230 -40
- package/src/harness/harness-incidents.ts +52 -1
- package/src/harness/pod-control-send.ts +33 -5
- package/src/harness/review-adapter.ts +26 -6
- package/src/harness/self-send-remote.ts +69 -0
- package/src/harness/self-send-routing-guard.ts +6 -0
- package/src/harness/self-send-target.ts +4 -3
- package/src/index.ts +443 -25
- package/src/input-core/context-key-runtime.ts +21 -0
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- package/src/light-cli.ts +6 -1
- package/src/llm/route-decision.ts +13 -0
- package/src/llm-tool-name.ts +37 -0
- package/src/llm-tool-schema.ts +35 -0
- package/src/llm-wellformed.ts +70 -0
- package/src/llm.ts +158 -15
- package/src/loops/checker.ts +100 -0
- package/src/loops/consensus.ts +26 -2
- package/src/loops/loop-cli.ts +9 -4
- package/src/loops/msg-wake.ts +35 -39
- package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/inbox.ts +59 -11
- package/src/loops/orchestrator/knowhow-pack.ts +364 -0
- package/src/loops/orchestrator/tick.ts +54 -5
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/models/prompts.ts +17 -2
- package/src/msg/msg-post-office.ts +116 -0
- package/src/msg/msg-store.ts +17 -0
- package/src/mss/logging/log-store.ts +79 -22
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/decisions-route.ts +38 -18
- package/src/nexus/api/graph-wizard-api.ts +46 -3
- package/src/nexus/api/grid.ts +24 -4
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +14 -6
- package/src/nexus/boot/register-mcp-clients.ts +263 -38
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
- package/src/nexus/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/onboarding/first-run.ts +37 -6
- package/src/onboarding/web-first.ts +43 -11
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview-collect.ts +12 -6
- package/src/ops/overview.ts +44 -8
- package/src/persona/loader.ts +11 -0
- package/src/persona/types.ts +8 -0
- package/src/policy/llm-policy.ts +3 -1
- package/src/prompt-enhance/enhance.ts +4 -4
- package/src/prompt-library/session-guidance.ts +14 -0
- package/src/provider-summary.ts +8 -0
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +155 -37
- package/src/pty-shell/herdr-prompt.ts +266 -0
- package/src/pty-shell/herdr-prune-stale.ts +17 -0
- package/src/pty-shell/herdr-sequence-lease.ts +60 -0
- package/src/pty-shell/pty-control-ipc.ts +327 -15
- package/src/pty-shell/pty-special-keys.ts +42 -2
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/stale-install-check.ts +99 -0
- package/src/pty-shell/tui-run-state.ts +249 -3
- package/src/release-loop/auto-start.ts +20 -2
- package/src/release-loop/checklist.ts +126 -9
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/release-loop/rehearsal.ts +36 -20
- package/src/repl/index.ts +27 -1
- package/src/seat-loop/knowhow-lint.ts +1 -1
- package/src/seat-loop/seat-report.ts +1 -0
- package/src/self-dev/ask-launch-flow.ts +86 -10
- package/src/self-dev/decompose-proposal.ts +183 -20
- package/src/self-dev/decompose.ts +61 -0
- package/src/self-dev/dev-cli.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +37 -9
- package/src/self-dev/draft-sweep.ts +241 -16
- package/src/self-dev/draft-triage-rules.ts +50 -5
- package/src/self-dev/glm-credential-guard.ts +77 -0
- package/src/self-dev/graph-journey-nodes.ts +1 -0
- package/src/self-dev/graph-journey-route.ts +12 -2
- package/src/self-dev/orchestrate-cli.ts +68 -3
- package/src/self-dev/orchestrate.ts +116 -17
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/run-supervisor.ts +55 -2
- package/src/self-dev/run-types.ts +1 -1
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +50 -3
- package/src/self-health/autoheal.ts +153 -0
- package/src/self-health/signatures.ts +6 -0
- package/src/self-implement/device-first.ts +116 -0
- package/src/self-implement/doctor-visit.ts +322 -1
- package/src/self-implement/evidence-command-budget.ts +80 -0
- package/src/self-implement/gate-artifacts.ts +6 -2
- package/src/self-implement/gate-baseline.ts +64 -1
- package/src/self-implement/gate-cli.ts +93 -9
- package/src/self-implement/gate-remote.ts +28 -4
- package/src/self-implement/gate-scope.ts +13 -1
- package/src/self-implement/goal-author-cli.ts +1 -0
- package/src/self-implement/goal-author-decompose.ts +265 -4
- package/src/self-implement/goal-author.ts +366 -26
- package/src/self-implement/goal-elaborate.ts +176 -22
- package/src/self-implement/goal-refine.ts +3 -0
- package/src/self-implement/goal-supervisor-fill.ts +75 -26
- package/src/self-implement/graph-variant.ts +40 -6
- package/src/self-implement/headless-elanous-driver.ts +19 -3
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +5 -5
- package/src/self-implement/off-diff-evidence.ts +58 -6
- package/src/self-implement/orchestrator.ts +536 -42
- package/src/self-implement/pod-warm-pool-profile.ts +1 -0
- package/src/self-implement/pwa-import-graph.ts +1 -1
- package/src/self-implement/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +44 -0
- package/src/self-implement/run-ledger.ts +278 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/run-ttl.ts +38 -24
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/scope-adjacency.ts +3 -1
- package/src/self-implement/seams.ts +72 -10
- package/src/self-implement/stop-autoheal.ts +1 -0
- package/src/self-implement/test-seams.ts +13 -1
- package/src/self-implement/train-reach-grouping.ts +8 -2
- package/src/self-implement/wiring-check.ts +358 -0
- package/src/session/chat.ts +7 -1
- package/src/session/id-prefix.ts +60 -0
- package/src/session/index.ts +4 -0
- package/src/session-runtime/index.ts +9 -1
- package/src/shell-env-bootstrap.ts +11 -4
- package/src/skills/runner.ts +4 -2
- package/src/skills/tools/agent.ts +290 -48
- package/src/skills/tools/pty.ts +5 -0
- package/src/skills/tools/schedule-wakeup.ts +23 -4
- package/src/skills/tools/shell.ts +61 -6
- package/src/skills/tools/terminal-modal-inject.ts +1 -2
- package/src/skills/tools/terminal-modal.ts +10 -8
- package/src/skills/url-router.ts +41 -1
- package/src/smart-wizard/run.ts +66 -0
- package/src/status/bar.ts +34 -6
- package/src/status/metrics.ts +12 -1
- package/src/status/status-provider-info.ts +37 -6
- package/src/steward/rejudge-tick.ts +22 -7
- package/src/steward/resync-tick.ts +31 -4
- package/src/steward/ta-repair-event-collect.ts +17 -6
- package/src/task-agent/actions.ts +202 -5
- package/src/task-agent/boundary-proof-mapping.ts +12 -0
- package/src/task-agent/boundary-proof-producer.ts +147 -0
- package/src/task-agent/completion-evidence.ts +2 -1
- package/src/task-agent/green-close-recipe.ts +239 -0
- package/src/task-agent/green-sweep.ts +64 -10
- package/src/task-agent/land-queue.ts +21 -8
- package/src/task-agent/live-moves.ts +70 -9
- package/src/task-agent/map-host-adapter.ts +134 -0
- package/src/task-agent/map-reduce.ts +158 -0
- package/src/task-agent/map-run-ledger.ts +226 -0
- package/src/task-agent/mission.ts +30 -0
- package/src/task-agent/parent-host.ts +21 -11
- package/src/task-agent/rejudge-on-head.ts +87 -5
- package/src/task-agent/repair-cycle.ts +179 -32
- package/src/task-agent/repair-next-move.ts +42 -4
- package/src/task-agent/repair-outcomes.ts +29 -0
- package/src/task-agent/repair-worker.ts +14 -4
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +229 -8
- package/src/task-agent/task-card-prefix.ts +2 -0
- package/src/task-agent/task-hand.ts +630 -30
- package/src/task-agent/task-parent-role-llm.ts +45 -0
- package/src/task-agent/tier-split.ts +80 -10
- package/src/task-agent/work-order.ts +53 -2
- package/src/task-orchestrator/dispatcher.ts +46 -1
- package/src/task-orchestrator/generator-prompt.ts +6 -0
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
- package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
- package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +126 -8
- package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
- package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +491 -36
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +612 -54
- package/src/task-orchestrator/surfaces/self-implement.ts +46 -2
- package/src/testing/linux-env.ts +177 -0
- package/src/tool-runtime/index.ts +15 -2
- package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
- package/src/tty-foreground.ts +155 -0
- package/src/tui/chat/goal-interim.ts +177 -0
- package/src/tui/chat/log-view.ts +205 -18
- package/src/tui/chat/self-health-status.ts +232 -0
- package/src/tui/entry.ts +623 -80
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/input/composer.ts +8 -1
- package/src/tui/slash/compact-command.ts +7 -0
- package/src/tui/slash/compact.ts +1 -7
- package/src/tui/slash/resume.ts +98 -0
- package/src/tui/slash/signals.ts +114 -0
- package/src/tui/slash/term-next.ts +71 -0
- package/src/tui-client/local-chat-turn.ts +49 -5
- package/src/tui-client/next-dashboard-runtime.ts +8 -0
- package/src/tui-client/next-loop-command.ts +70 -0
- package/src/tui-client/next-wakeup.ts +191 -0
- package/src/tui.ts +37 -0
- package/src/ui/modal-adapter.ts +2 -2
- package/src/user-config.ts +19 -1
- package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
- package/src/ux-sim/classic-tui-seat-scenarios.ts +670 -0
- package/src/ux-sim/cli-config-audit-device.ts +121 -0
- package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
- package/src/ux-sim/event-monkey.ts +3 -2
- package/src/ux-sim/fake-bin.ts +45 -0
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-herdr.ts +238 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +116 -6
- package/src/ux-sim/fault-glm-no-credential.ts +116 -0
- package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
- package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
- package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
- package/src/ux-sim/goal-device.ts +619 -0
- package/src/ux-sim/in-process-cli.ts +22 -5
- package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
- package/src/ux-sim/mock-authoring-first-run.ts +97 -0
- package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
- package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
- package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
- package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +749 -0
- package/src/ux-sim/onboarding-first-run-device.ts +269 -0
- package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
- package/src/ux-sim/resume-picker-device.ts +173 -0
- package/src/ux-sim/session-id-seed.ts +60 -0
- package/src/ux-sim/skills-tools-shell-device.ts +156 -0
- package/src/ux-sim/subagent-tools-device.ts +81 -0
- package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
- package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
- package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
- package/apps/pwa/out/_next/static/chunks/1674.2a65fd5668e1cc5f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
- package/apps/pwa/out/_next/static/chunks/3103.0df8da390948bb84.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3589.5444a06bcf6e775c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3677-4215f826f6aa68e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4346.8601952e73bf5803.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5637.281e5dec4ea6ecf1.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/56d372f2.681ab4ec4c998fae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
- package/apps/pwa/out/_next/static/chunks/630.fe5a46428d63b013.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8637.47f5b35afcae5e6b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8714.ff0b7ce3ec3e3ae2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
- /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
|
@@ -117,8 +117,16 @@ export function readJourneyEdge(
|
|
|
117
117
|
return route;
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
/** 간선 행에 덧붙이는 조인·근거 칸.
|
|
121
|
+
* `moveId` 는 next-move 결정 순간 한 번 만든 값(HARNESS-FULL-GRAPH-NEXTMOVE · 여기서 만들지 않는다).
|
|
122
|
+
* 그 밖의 칸은 그 간선에 결속할 근거(예: 착지 거부 원문·cardId · LAND-REFUSAL-EDGES) — 간선 칸(from·to·taken…)을 덮지 못한다. */
|
|
123
|
+
export interface JourneyEdgeFields {
|
|
124
|
+
readonly moveId?: string;
|
|
125
|
+
readonly [key: string]: unknown;
|
|
126
|
+
}
|
|
127
|
+
|
|
120
128
|
/** 실제로 탄 간선을 남긴다 — `taken` 은 실제 다음 노드(그래프 답과 다르면 `honored: false` · 그 이유를 `reason` 에). */
|
|
121
|
-
export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: string): void {
|
|
129
|
+
export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: string, data: JourneyEdgeFields = {}): void {
|
|
122
130
|
try {
|
|
123
131
|
if (route.ambiguousConditions?.length) debug.log('self-implement', 'edge-ambiguous', {
|
|
124
132
|
graphId: 'self-implement', from: route.from, conditions: route.ambiguousConditions,
|
|
@@ -132,8 +140,10 @@ export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: s
|
|
|
132
140
|
graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
|
|
133
141
|
...journeyJoinFields(),
|
|
134
142
|
});
|
|
143
|
+
// Evidence never overrides an edge field: the later spread wins, and `reason`/join keys are reserved.
|
|
144
|
+
const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch, ...evidence } = data ?? {};
|
|
135
145
|
debug.log('self-implement', 'graph-edge-taken', {
|
|
136
|
-
graphId: 'self-implement', ...route, taken, honored: route.to === null || route.to === taken,
|
|
146
|
+
...evidence, graphId: 'self-implement', ...route, taken, honored: route.to === null || route.to === taken,
|
|
137
147
|
...(reason === undefined ? {} : { reason }), ...journeyJoinFields(),
|
|
138
148
|
});
|
|
139
149
|
} catch { /* 관측은 fail-soft */ }
|
|
@@ -342,9 +342,15 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
342
342
|
try {
|
|
343
343
|
// ⭐ goals·spec 이 «라운드마다 바뀔 수 있다» — 분해 제안이 조각을 쪼개면 연합으로 승격된다.
|
|
344
344
|
let currentGoals = input.goals;
|
|
345
|
+
// A supervised split starts from an ordinary single goal, so the CLI did not
|
|
346
|
+
// receive --decompose/parentRequest. Preserve that goal as the boundary source
|
|
347
|
+
// when its children replace it in a later round.
|
|
348
|
+
let supervisedParentRequest = input.parentRequest;
|
|
345
349
|
let spec = buildSelfOrchestrateDevSpec(currentGoals, input.concurrency);
|
|
346
350
|
/** 이미 쪼갠 goal — ⛔ 같은 것을 두 번 쪼개면 조각이 무한히 불어난다. */
|
|
347
351
|
const decomposedFeatures = new Set<string>();
|
|
352
|
+
/** 거부된 제안의 feature — ⛔ 다음 라운드가 같은 제안을 다시 쓰고 다시 조용히 거부하는 것을 막는다. */
|
|
353
|
+
const rejectedFeatures = new Set<string>();
|
|
348
354
|
const repairFingerprints = new Map<string, number>();
|
|
349
355
|
const repairAppend: RepairAppendObservation[] = [];
|
|
350
356
|
let repairFragmentsAdded = 0;
|
|
@@ -383,7 +389,7 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
383
389
|
};
|
|
384
390
|
const runtimeWithParentRequest = (): OrchestrateRuntime => {
|
|
385
391
|
const runtime = runtimeForObservationCycle();
|
|
386
|
-
return
|
|
392
|
+
return supervisedParentRequest === undefined ? runtime : { ...runtime, parentRequest: supervisedParentRequest };
|
|
387
393
|
};
|
|
388
394
|
const exec = deps.executeReroute ?? executeOrchestrateReroute;
|
|
389
395
|
const pipelineDeps = deps.pipelineDeps ? { pipelineDeps: deps.pipelineDeps } : undefined;
|
|
@@ -391,11 +397,35 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
391
397
|
let baseRuntime = runtimeWithParentRequest();
|
|
392
398
|
let { results, exitCode } = await exec(spec, baseRuntime, pipelineDeps);
|
|
393
399
|
|
|
400
|
+
// ⭐⭐⭐ SUPERVISOR-SOFTSTOP-HONOR — 사람이 child 를 멈췄다는 신호(stage 'soft-stopped')는
|
|
401
|
+
// «라운드 경계»에서 존중된다(재현 원장 run-8cf691c5: ccaf Pod 가 soft-stopped 로 끝났는데
|
|
402
|
+
// 5초 뒤 fa fa Pod 가 발사됐다). 근거는 «이번 invocation 에서 막 끝난 결과»뿐이다 —
|
|
403
|
+
// 과거 checkpoint 의 soft-stopped 항목을 읽지 않으므로 새 호출의 무관한 작업을 막지 않는다.
|
|
404
|
+
const childSoftStop = (rs: readonly SelfDevJobResult[]): SelfDevJobResult | undefined =>
|
|
405
|
+
rs.find((r) => r.stage === 'soft-stopped');
|
|
406
|
+
// ⭐ 원샷 래치 — 이번 invocation 이 «같은 정지된 조각»을 두 번 계상하지 않는다: rerun 재진입
|
|
407
|
+
// 방어가 pair 를 이미 냈으면 종착 관측(stoppedAfter)이 같은 taskId 로 재발행하지 않는다.
|
|
408
|
+
// #30606 리뷰: 방어가 여러 번 재진입돼도(결과 불변 감독 루프) pair 는 정확히 1회.
|
|
409
|
+
const honoredStops = new Set<string>();
|
|
410
|
+
const observeSoftStopHonored = (stopped: SelfDevJobResult, round: number): void => {
|
|
411
|
+
if (honoredStops.has(stopped.taskId)) return;
|
|
412
|
+
honoredStops.add(stopped.taskId);
|
|
413
|
+
try {
|
|
414
|
+
debug.log('self-dev.supervisor', 'human-stopped', { stage: 'soft-stopped', taskId: stopped.taskId, round });
|
|
415
|
+
debug.log('self-dev.supervisor', 'soft-stop-honored', { stage: 'soft-stopped', taskId: stopped.taskId, round });
|
|
416
|
+
} catch { /* observation must not interrupt execution */ }
|
|
417
|
+
};
|
|
418
|
+
|
|
394
419
|
// ⭐⭐⭐ 런 슈퍼바이저 — 스위치가 켜졌으면 «여기»서 끝까지 돈다.
|
|
395
420
|
// ⛔ 프로세스를 다시 띄우지 않는다: resumeFrom 심으로 같은 프로세스 안에서 라운드를 돌아야
|
|
396
421
|
// runId·체크포인트·관측이 한 줄로 이어진다.
|
|
397
422
|
// ⛔ 판정은 순수 모듈(run-supervisor)이 하고, 이 심은 그 답을 «집행»만 한다.
|
|
398
423
|
if (input.supervise) {
|
|
424
|
+
const stoppedFirst = childSoftStop(results);
|
|
425
|
+
// 첫 라운드가 사람 정지로 끝났으면 재발사를 «시작하지 않는다» — 총 exec 1 · 다음 Pod 0.
|
|
426
|
+
// 라운드 표기는 strategy.launch 와 같은 1-기반(첫 exec = round 1)을 쓴다.
|
|
427
|
+
if (stoppedFirst) observeSoftStopHonored(stoppedFirst, 1);
|
|
428
|
+
if (!stoppedFirst) {
|
|
399
429
|
const limits = {
|
|
400
430
|
...(input.supervise.rounds === undefined ? {} : { maxRounds: input.supervise.rounds }),
|
|
401
431
|
...(input.supervise.stallRounds === undefined ? {} : { stallRounds: input.supervise.stallRounds }),
|
|
@@ -435,6 +465,14 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
435
465
|
// ⭐ 방금 끝난 결과를 넘긴다 — orchestrateSelfDev 가 classifyResumeDisposition 으로
|
|
436
466
|
// skip/rerun 을 갈라준다(재발명 0 · 착지한 조각은 다시 안 돈다).
|
|
437
467
|
rerun: async (previous, invocation) => {
|
|
468
|
+
// ⭐⭐⭐ SUPERVISOR-SOFTSTOP-HONOR — 직전 라운드가 사람 정지(stage 'soft-stopped')로
|
|
469
|
+
// 끝났으면 다음 exec(spec, resumeFrom…) 직전에 멈춘다. 근거는 «이번 invocation 에서
|
|
470
|
+
// 막 끝난 previous» 하나뿐 — 과거 checkpoint 를 읽지 않으므로 새 호출을 막지 않는다.
|
|
471
|
+
const stoppedPrevious = childSoftStop(previous);
|
|
472
|
+
if (stoppedPrevious) {
|
|
473
|
+
observeSoftStopHonored(stoppedPrevious, supervisedRound + 1);
|
|
474
|
+
return previous;
|
|
475
|
+
}
|
|
438
476
|
let addedRepairIds: string[] = [];
|
|
439
477
|
// A requested repair that cannot be bound to exactly one goal is held (not relaunched with the old strategy).
|
|
440
478
|
const unrepairedHold: string[] = [];
|
|
@@ -485,15 +523,37 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
485
523
|
// ⛔ 의존성은 조각이 «들고 온 그대로» 물려준다 ⇒ dependsOn 이 없는 조각은
|
|
486
524
|
// orchestrateSelfDev 의 위상 병렬로 «자동으로 동시에» 돈다(대표 2026-08-19 기본 동작).
|
|
487
525
|
const goalsBeforeDecompose = new Set(currentGoals);
|
|
488
|
-
const applied = applyDecomposeProposals(currentGoals, previous, {
|
|
526
|
+
const applied = applyDecomposeProposals(currentGoals, previous, {
|
|
527
|
+
// ⛔⭐ 거부된 feature 도 «다시 제안되지 않게» 한다 — 이미 쪼갠 것과 같은 상태로 센다.
|
|
528
|
+
// 이렇게 하지 않으면 다음 라운드가 같은 제안을 다시 읽고 다시 조용히 거부한다.
|
|
529
|
+
alreadyDecomposed: new Set([...decomposedFeatures, ...rejectedFeatures]),
|
|
530
|
+
});
|
|
531
|
+
// ⛔⭐ 거부된 제안을 «상태로» 남긴다 — applyDecomposeProposals 안의 관측과 함께
|
|
532
|
+
// 「쪼개지 않았다」는 사실과 그 사유가 로그와 라운드 간 상태에 다 남는다.
|
|
533
|
+
if (applied.rejected.length > 0) {
|
|
534
|
+
for (const rejection of applied.rejected) rejectedFeatures.add(rejection.feature);
|
|
535
|
+
try {
|
|
536
|
+
debug.log('self-dev.supervisor', 'decompose-rejected.applied', {
|
|
537
|
+
rejected: applied.rejected.map((rejection) => ({
|
|
538
|
+
feature: rejection.feature.slice(0, 120),
|
|
539
|
+
reason: rejection.reason,
|
|
540
|
+
danglingIds: [...rejection.detail],
|
|
541
|
+
})),
|
|
542
|
+
});
|
|
543
|
+
} catch { /* fail-open */ }
|
|
544
|
+
}
|
|
489
545
|
if (applied.decomposed.length > 0) {
|
|
546
|
+
if (supervisedParentRequest === undefined && applied.decomposed.length === 1
|
|
547
|
+
&& currentGoals.length === 1 && currentGoals[0]?.feature === applied.decomposed[0]) {
|
|
548
|
+
supervisedParentRequest = applied.decomposed[0];
|
|
549
|
+
}
|
|
490
550
|
for (const f of applied.decomposed) decomposedFeatures.add(f);
|
|
491
551
|
currentGoals = applied.goals;
|
|
492
552
|
spec = buildSelfOrchestrateDevSpec(currentGoals, input.concurrency);
|
|
493
553
|
try {
|
|
494
554
|
// ⛔⭐ 「원본 ↔ 조각」을 «이름»으로 남긴다 — 수만 남기면 그 연결이 «영영» 안 남는다.
|
|
495
555
|
// 📏 2026-08-19 자수: 초판이 decomposed.length 만 실었다. 그러면 나중에
|
|
496
|
-
// 「이 런이 어느 원본에서
|
|
556
|
+
// 「이 런이 어느 원본에서 쪼개졌나»를 «아무 데서도» 못 가린다.
|
|
497
557
|
// ⚠️ 그리고 이 값은 «로그»라 보존이 짧다(~2.5시간 실측 · 원장은 15일) —
|
|
498
558
|
// 원장에 싣는 것이 다음 칸이다(🅣 축 · E0).
|
|
499
559
|
debug.log('self-dev.supervisor', 'decompose-and-retry.applied', {
|
|
@@ -569,6 +629,11 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
569
629
|
return next.results;
|
|
570
630
|
},
|
|
571
631
|
});
|
|
632
|
+
// 감독 루프가 사람 정지 라운드 뒤 rerun 없이 스스로 멈출 수도 있다 — 그 종결도
|
|
633
|
+
// 이번 invocation 의 «막 끝난» 결과만 근거로 이름 있는 관측으로 남긴다.
|
|
634
|
+
const stoppedAfter = childSoftStop(results);
|
|
635
|
+
if (stoppedAfter) observeSoftStopHonored(stoppedAfter, supervisedRound + 1);
|
|
636
|
+
} // (!stoppedFirst — 사람 정지면 superviseRun 자체를 시작하지 않는다)
|
|
572
637
|
}
|
|
573
638
|
|
|
574
639
|
return { ok: true, results, exitCode, ...(repairAppend.length ? { repairAppend } : {}) };
|
|
@@ -204,7 +204,7 @@ interface SelfDevTerminalOutcome {
|
|
|
204
204
|
stage: string | null;
|
|
205
205
|
merged: boolean | null;
|
|
206
206
|
prUrl: string | null;
|
|
207
|
-
blockReason?: 'parent-unlanded' | 'dependency-needs-human';
|
|
207
|
+
blockReason?: 'parent-unlanded' | 'dependency-needs-human' | 'dependency-deferred';
|
|
208
208
|
parentPrNumber?: number | null;
|
|
209
209
|
parentNoPr?: true;
|
|
210
210
|
}
|
|
@@ -270,7 +270,8 @@ export function hasDelivered(result: SelfDevJobResult): boolean {
|
|
|
270
270
|
|
|
271
271
|
/** 열린 PR 을 사람에게 보여줄 때 분류 칸에 싣는 문면. 없는 mergeReason 은 「사유 모름」— 값을 짓지 않는다. */
|
|
272
272
|
export function openPrAwaitingHumanMessage(result: Pick<SelfDevJobResult, 'prNumber' | 'prUrl' | 'mergeReason'>): string {
|
|
273
|
-
const pointer = result.prNumber
|
|
273
|
+
const pointer = typeof result.prNumber === 'number' && Number.isSafeInteger(result.prNumber) && result.prNumber > 0
|
|
274
|
+
? `#${result.prNumber}` : (result.prUrl ?? '');
|
|
274
275
|
const reason = result.mergeReason && result.mergeReason.length > 0 ? result.mergeReason : '사유 모름';
|
|
275
276
|
return `열린 PR ${pointer} · ${reason}`;
|
|
276
277
|
}
|
|
@@ -488,17 +489,42 @@ export function queryPreflightWarning(
|
|
|
488
489
|
}
|
|
489
490
|
}
|
|
490
491
|
|
|
492
|
+
function hasConcretePrEvidence(result: Pick<SelfDevJobResult, 'prNumber' | 'prUrl'>): boolean {
|
|
493
|
+
const number = result.prNumber;
|
|
494
|
+
if (typeof number === 'number' && Number.isSafeInteger(number) && number > 0) return true;
|
|
495
|
+
if (typeof result.prUrl !== 'string') return false;
|
|
496
|
+
// Match the raw URL. WHATWG URL normalizes dot segments before exposing
|
|
497
|
+
// pathname, which would turn a noncanonical pointer into apparent evidence.
|
|
498
|
+
const match = /^https:\/\/github\.com\/[A-Za-z0-9][A-Za-z0-9_.-]*\/[A-Za-z0-9][A-Za-z0-9_.-]*\/pull\/([1-9]\d*)$/.exec(result.prUrl);
|
|
499
|
+
return match !== null && Number.isSafeInteger(Number(match[1]));
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function hasOpenedPrPointer(result: Pick<SelfDevJobResult, 'prNumber' | 'prUrl'>): boolean {
|
|
503
|
+
const number = result.prNumber;
|
|
504
|
+
if (typeof number === 'number' && Number.isSafeInteger(number) && number > 0) return true;
|
|
505
|
+
if (typeof result.prUrl !== 'string') return false;
|
|
506
|
+
// `stage=pr-opened` is a separate observation and may come from a non-GitHub
|
|
507
|
+
// host. Keep its host-neutral pull pointer contract, with no null or issue URL.
|
|
508
|
+
const match = /^https:\/\/[A-Za-z0-9][A-Za-z0-9.-]*\/(?:[A-Za-z0-9][A-Za-z0-9_.-]*\/)*pull\/([1-9]\d*)$/.exec(result.prUrl);
|
|
509
|
+
return match !== null && Number.isSafeInteger(Number(match[1]));
|
|
510
|
+
}
|
|
511
|
+
|
|
491
512
|
export function classifyFailure(
|
|
492
513
|
result: SelfDevJobResult,
|
|
493
514
|
preflightWarning: PreflightWarningObservation = 'unknown',
|
|
494
515
|
): FailureKind | null {
|
|
495
516
|
if (result.blockReason === 'parent-unlanded') return 'parent-unlanded';
|
|
517
|
+
// A child may claim no changes after committing and opening its draft. The
|
|
518
|
+
// parent must retain the PR for review instead of reworking the same goal.
|
|
519
|
+
if (result.status === 'failed' && result.completionDisposition === 'completed-without-changes'
|
|
520
|
+
&& hasConcretePrEvidence(result)) return 'awaiting-human';
|
|
521
|
+
if (result.blockReason === 'dependency-deferred' || result.error?.code === 'DEP_BLOCKED_REBASE_READY') return 'blocked-upstream';
|
|
496
522
|
if (result.blockReason === 'dependency-needs-human' || result.error?.code === 'GOAL_DONE_BOUNDARY_MISSING') return 'awaiting-human';
|
|
497
523
|
const ledgerKind = result.failureClassification === undefined
|
|
498
524
|
? undefined
|
|
499
525
|
: result.failureClassification === 'run-deadline-exceeded'
|
|
500
526
|
// 기한 사망은 transient 가 아니다. 브랜치/PR 이 있으면 수확(false-failure), 없으면 재분해.
|
|
501
|
-
? (result.branch || result
|
|
527
|
+
? (result.branch || hasOpenedPrPointer(result) ? 'false-failure' : 'unconverged-decomposable')
|
|
502
528
|
: LEDGER_FAILURE_KIND[result.failureClassification];
|
|
503
529
|
|
|
504
530
|
// ⭐ 수렴 실패인데 하니스가 «쪼개는 법»을 이미 냈으면 그것은 다른 처방이다.
|
|
@@ -518,7 +544,7 @@ export function classifyFailure(
|
|
|
518
544
|
result.status === 'done'
|
|
519
545
|
&& result.stage === 'pr-opened'
|
|
520
546
|
&& !hasLanded(result)
|
|
521
|
-
&& (
|
|
547
|
+
&& hasOpenedPrPointer(result)
|
|
522
548
|
) {
|
|
523
549
|
return 'awaiting-human';
|
|
524
550
|
}
|
|
@@ -616,8 +642,15 @@ export function classifyFailures(
|
|
|
616
642
|
const kind = classifyFailure(result, queryPreflightWarning(preflightIdentifiers, queryPreflight));
|
|
617
643
|
if (kind === null) return [];
|
|
618
644
|
const error = result.error;
|
|
619
|
-
const
|
|
620
|
-
|
|
645
|
+
const prChangeConflict = kind === 'awaiting-human' && result.status === 'failed'
|
|
646
|
+
&& result.completionDisposition === 'completed-without-changes'
|
|
647
|
+
&& hasConcretePrEvidence(result);
|
|
648
|
+
const prPointer = typeof result.prNumber === 'number' && Number.isSafeInteger(result.prNumber) && result.prNumber > 0
|
|
649
|
+
? `#${result.prNumber}` : result.prUrl;
|
|
650
|
+
const awaitingHuman = prChangeConflict
|
|
651
|
+
? failureObservationFields('PR_CHANGE_CONFLICT', `PR ${prPointer} exists while child reported completed-without-changes`)
|
|
652
|
+
: kind === 'awaiting-human'
|
|
653
|
+
? failureObservationFields('AWAITING_HUMAN', openPrAwaitingHumanMessage(result))
|
|
621
654
|
: kind === 'parent-unlanded'
|
|
622
655
|
? failureObservationFields('PARENT_UNLANDED', parentUnlandedProgressLine(result.feature.split('\n')[0]!, result.parentPrNumber, result.parentNoPr === true))
|
|
623
656
|
: undefined;
|
|
@@ -1009,13 +1042,16 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1009
1042
|
taskId: `boundary:${taskCardId}:blocked:${index + 1}`,
|
|
1010
1043
|
feature: goal.feature,
|
|
1011
1044
|
status: 'blocked',
|
|
1012
|
-
blockReason: 'dependency-
|
|
1013
|
-
stopReason: '
|
|
1014
|
-
error: { code: '
|
|
1045
|
+
blockReason: 'dependency-deferred',
|
|
1046
|
+
stopReason: 'rebase-ready',
|
|
1047
|
+
error: { code: 'DEP_BLOCKED_REBASE_READY', message: `선행 조각 ${predecessor} 재수복 뒤 다음 런 이월` },
|
|
1015
1048
|
});
|
|
1049
|
+
try { debug.log('self-dev.slice', 'dep-blocked', { slice: goal.id ?? String(index), blockedBy: predecessor,
|
|
1050
|
+
reason: 'GOAL_DONE_BOUNDARY_MISSING', disposition: 'rebase-ready' }); } catch { /* observation is fail-soft */ }
|
|
1016
1051
|
}
|
|
1017
1052
|
const withheld = [...blockedGoalIndexes].map((index) => index + 1);
|
|
1018
|
-
try { debug.log('self-dev.orchestrate', 'done-boundary-missing', { taskCardId, boundaryMissing, withheld,
|
|
1053
|
+
try { debug.log('self-dev.orchestrate', 'done-boundary-missing', { taskCardId, boundaryMissing, withheld,
|
|
1054
|
+
action: 'partial-needs-human', dependentDisposition: 'rebase-ready', eligibleToLaunch: opts.goals.length - blockedGoalIndexes.size }); } catch { /* fail-soft */ }
|
|
1019
1055
|
opts = { ...opts, goals: opts.goals.flatMap((goal, index) => blockedGoalIndexes.has(index)
|
|
1020
1056
|
? []
|
|
1021
1057
|
: [{ ...goal, id: goal.id ?? String(index) }]) };
|
|
@@ -1290,6 +1326,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1290
1326
|
const taskIdByLocal = new Map<string, string>(); // goal-local id → live taskId
|
|
1291
1327
|
const taskIdByGoal = new Map<SelfDevGoal, string>(); // original shard → current or resumed taskId
|
|
1292
1328
|
const created: Array<{ task: ReturnType<typeof createTask>; goal: SelfDevGoal }> = [];
|
|
1329
|
+
const repairedGoals = new Set<SelfDevGoal>();
|
|
1293
1330
|
opts.goals.forEach((g, i) => {
|
|
1294
1331
|
const prior = resumedByGoal.get(g);
|
|
1295
1332
|
if (prior) {
|
|
@@ -1762,8 +1799,38 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1762
1799
|
dispStage: fDisp?.stage ?? 'none', screenSpace: fScreen.screenSpace,
|
|
1763
1800
|
});
|
|
1764
1801
|
}
|
|
1802
|
+
const failedGoal = taskByGoal.get(ev.taskId);
|
|
1803
|
+
const failedTask = graph.getTask(ev.taskId);
|
|
1765
1804
|
const failedResult = results.get(ev.taskId)!;
|
|
1766
1805
|
const stopReason = opts.stopAfterFailure?.(failedResult) ?? null;
|
|
1806
|
+
// A child without a PR gets one supervised, narrower attempt. Keep the original
|
|
1807
|
+
// failure in the checkpoint; redirect only its actual dependents to the replacement.
|
|
1808
|
+
if (stopReason === null && taskCardId?.trim() && failedGoal && failedTask?.surface.kind === 'self-implement' && !repairedGoals.has(failedGoal)
|
|
1809
|
+
&& !fDisp?.prUrl && fDisp?.merged !== true && fDisp?.harvestable !== true) {
|
|
1810
|
+
repairedGoals.add(failedGoal);
|
|
1811
|
+
const reason = `${ev.errorCode}: ${ev.errorMessage}`.slice(0, FAILURE_MESSAGE_MAX_LENGTH);
|
|
1812
|
+
const repairFeature = `${failedGoal.feature.trimEnd()}\n\n## 자동 수복 1회\n앞선 조각 실패: ${reason}\n실패 범위만 좁혀 재시도하고 원래 완료 경계를 보존한다.`;
|
|
1813
|
+
const replacement = createTask({
|
|
1814
|
+
title: goalTitle(failedGoal),
|
|
1815
|
+
description: repairFeature.slice(0, TASK_DEFAULTS.descriptionMaxLen),
|
|
1816
|
+
surface: failedTask.surface.kind === 'self-implement'
|
|
1817
|
+
? { ...failedTask.surface, feature: repairFeature }
|
|
1818
|
+
: failedTask.surface,
|
|
1819
|
+
isolation: failedTask.isolation,
|
|
1820
|
+
}, { now: now() });
|
|
1821
|
+
graph.addTask(replacement);
|
|
1822
|
+
graph.updateTask(replacement.id, { dependsOn: [...failedTask.dependsOn] }, { now: now() });
|
|
1823
|
+
taskByGoal.set(replacement.id, failedGoal);
|
|
1824
|
+
spaceIdByTask.set(replacement.id, spaceIdForTask(replacement));
|
|
1825
|
+
taskIdByGoal.set(failedGoal, replacement.id);
|
|
1826
|
+
created.push({ task: replacement, goal: failedGoal });
|
|
1827
|
+
graph.supersede(ev.taskId, [replacement.id], { now: now() });
|
|
1828
|
+
results.set(ev.taskId, { ...results.get(ev.taskId)!, status: 'superseded' });
|
|
1829
|
+
try { debug.log('self-dev.slice', 'repair-retry', { slice: failedGoal.id ?? ev.taskId, failedTaskId: ev.taskId,
|
|
1830
|
+
replacementTaskId: replacement.id, reason, attempt: 1 }); } catch { /* observation is fail-soft */ }
|
|
1831
|
+
scheduleTick();
|
|
1832
|
+
break;
|
|
1833
|
+
}
|
|
1767
1834
|
if (stopReason !== null) {
|
|
1768
1835
|
let remainingGoals = 0;
|
|
1769
1836
|
for (const task of created.map(({ task }) => graph.getTask(task.id)).filter((task): task is NonNullable<typeof task> => task !== undefined)) {
|
|
@@ -1781,24 +1848,56 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1781
1848
|
}
|
|
1782
1849
|
if (remainingGoals > 0) opts.onStopAfterFailure?.({ reason: stopReason, remainingGoals });
|
|
1783
1850
|
}
|
|
1784
|
-
//
|
|
1785
|
-
//
|
|
1786
|
-
//
|
|
1787
|
-
|
|
1851
|
+
// A hot-file edge only serializes execution. It does not make the later
|
|
1852
|
+
// slice depend on the earlier slice's result. Cancel only the explicit
|
|
1853
|
+
// dependency closure; release hot-only edges so independent PRs proceed.
|
|
1854
|
+
const localGoalId = (goal: SelfDevGoal): string => goal.id ?? String(opts.goals.indexOf(goal));
|
|
1855
|
+
const blockedGoalIds = new Set<string>(failedGoal ? [localGoalId(failedGoal)] : []);
|
|
1856
|
+
let expanded = true;
|
|
1857
|
+
while (expanded) {
|
|
1858
|
+
expanded = false;
|
|
1859
|
+
for (const { goal } of created) {
|
|
1860
|
+
const localId = localGoalId(goal);
|
|
1861
|
+
if (blockedGoalIds.has(localId)) continue;
|
|
1862
|
+
if ((goal.dependsOn ?? []).some((id) => blockedGoalIds.has(id))) {
|
|
1863
|
+
blockedGoalIds.add(localId);
|
|
1864
|
+
expanded = true;
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
}
|
|
1788
1868
|
let cascaded = 0;
|
|
1789
|
-
for (const
|
|
1790
|
-
|
|
1869
|
+
for (const { task, goal } of created) {
|
|
1870
|
+
const t = graph.getTask(task.id);
|
|
1871
|
+
if (!t || t.id === ev.taskId || isTerminalStatus(t.status)) continue;
|
|
1872
|
+
const localId = localGoalId(goal);
|
|
1873
|
+
if (!blockedGoalIds.has(localId)) continue;
|
|
1791
1874
|
try {
|
|
1792
1875
|
graph.updateTask(t.id, { status: 'cancelled' }, { now: now() });
|
|
1793
1876
|
results.set(t.id, {
|
|
1794
1877
|
taskId: t.id,
|
|
1795
1878
|
feature: taskByGoal.get(t.id)?.feature ?? '',
|
|
1796
1879
|
status: 'cancelled',
|
|
1797
|
-
error:
|
|
1880
|
+
error: taskCardId?.trim()
|
|
1881
|
+
? { code: 'DEP_BLOCKED_REBASE_READY', message: `dependency ${ev.taskId} failed; rebase-ready next run` }
|
|
1882
|
+
: { code: 'DEP_FAILED', message: `dependency ${ev.taskId} failed` },
|
|
1798
1883
|
});
|
|
1884
|
+
try { debug.log('self-dev.slice', 'dep-blocked', { slice: localId, blockedBy: failedGoal?.id ?? ev.taskId,
|
|
1885
|
+
reason: ev.errorCode, disposition: 'rebase-ready' }); } catch { /* observation is fail-soft */ }
|
|
1799
1886
|
cascaded++;
|
|
1800
1887
|
} catch { /* best-effort */ }
|
|
1801
1888
|
}
|
|
1889
|
+
for (const { task, goal } of created) {
|
|
1890
|
+
const current = graph.getTask(task.id);
|
|
1891
|
+
if (!current || isTerminalStatus(current.status)) continue;
|
|
1892
|
+
const independent = current.dependsOn.filter((id) => {
|
|
1893
|
+
const parent = graph.getTask(id);
|
|
1894
|
+
return parent && (parent.status === 'failed' || parent.status === 'cancelled' || parent.status === 'superseded')
|
|
1895
|
+
&& !(goal.dependsOn ?? []).includes(taskByGoal.has(id) ? localGoalId(taskByGoal.get(id)!) : '');
|
|
1896
|
+
});
|
|
1897
|
+
if (independent.length) graph.updateTask(task.id, {
|
|
1898
|
+
dependsOn: current.dependsOn.filter((id) => !independent.includes(id)),
|
|
1899
|
+
}, { now: now() });
|
|
1900
|
+
}
|
|
1802
1901
|
debug.log('self-dev.orchestrate', 'job.failed', {
|
|
1803
1902
|
taskId: ev.taskId,
|
|
1804
1903
|
feature: shortFeature(ev.taskId),
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
// 📏 실측이 그 분리를 뒷받침한다: 폴백 판정 전수 493 중 `action=grok` ***0건*** —
|
|
19
19
|
// 쿼터 축은 과부하에 «반응하지 않는다».
|
|
20
20
|
import { resolveModelAlias } from '../intelligence-map/model-alias.js';
|
|
21
|
-
import type
|
|
21
|
+
import { getProvider, inferProviderFromModel, resolveReviewModelAlias, type LLMProvider } from '../llm.js';
|
|
22
22
|
import { spawnSync } from 'node:child_process';
|
|
23
23
|
import { claudeBackend, resolveBackendSpawn } from '../agent-mission/driver.js';
|
|
24
24
|
import { checkClaudeSubscription } from '../agent-mission/claude-subscription.js';
|
|
@@ -279,19 +279,57 @@ export function buildReviewProviderAttempts(
|
|
|
279
279
|
primary: ReviewProviderAttempt,
|
|
280
280
|
fallbacks: readonly ReviewProviderAttempt[],
|
|
281
281
|
): ReviewProviderAttempt[] {
|
|
282
|
-
const
|
|
283
|
-
const
|
|
282
|
+
const model = resolveReviewModelAlias(primary.model);
|
|
283
|
+
const inferred = inferProviderFromModel(model);
|
|
284
|
+
const supported = Boolean(inferred && (inferred !== 'local' || model.startsWith('local:') || model.startsWith('local-llm:')));
|
|
285
|
+
let selectedProvider: LLMProvider | undefined;
|
|
286
|
+
if (supported) {
|
|
287
|
+
const provider = getProvider(model);
|
|
288
|
+
if (!primary.provider || primary.provider.name === provider.name) selectedProvider = primary.provider ?? provider;
|
|
289
|
+
}
|
|
290
|
+
if (!selectedProvider) {
|
|
291
|
+
// A malformed/ambiguous configured primary is diagnostic, not fatal: the configured/default
|
|
292
|
+
// fallback attempts below still provide the review. Preserve an unresolved attempt so the
|
|
293
|
+
// runner records its reason, and expose a stable event for operational diagnosis.
|
|
294
|
+
try {
|
|
295
|
+
debug.log('review.fallback', 'primary-unresolved', {
|
|
296
|
+
model: primary.model,
|
|
297
|
+
configuredProvider: primary.provider?.name ?? null,
|
|
298
|
+
}, { level: 'warn' });
|
|
299
|
+
} catch { /* fail-soft */ }
|
|
300
|
+
}
|
|
301
|
+
const normalizedPrimary: ReviewProviderAttempt = {
|
|
302
|
+
...primary,
|
|
303
|
+
model,
|
|
304
|
+
...(selectedProvider ? { provider: selectedProvider } : { provider: undefined }),
|
|
305
|
+
};
|
|
306
|
+
const out: ReviewProviderAttempt[] = [normalizedPrimary];
|
|
307
|
+
const seen = new Set(selectedProvider ? [model] : []);
|
|
284
308
|
for (const f of fallbacks) {
|
|
285
|
-
if (!f.model.trim()
|
|
286
|
-
|
|
287
|
-
|
|
309
|
+
if (!f.model.trim()) continue;
|
|
310
|
+
const fallbackModel = resolveReviewModelAlias(f.model);
|
|
311
|
+
if (seen.has(fallbackModel)) continue;
|
|
312
|
+
const fallbackInference = inferProviderFromModel(fallbackModel);
|
|
313
|
+
if (!fallbackInference || (fallbackInference === 'local' && !fallbackModel.startsWith('local:') && !fallbackModel.startsWith('local-llm:'))) {
|
|
314
|
+
throw new Error(`review fallback: ambiguous or unsupported fallback model "${f.model}"`);
|
|
315
|
+
}
|
|
316
|
+
const fallbackProvider = getProvider(fallbackModel);
|
|
317
|
+
if (f.provider && f.provider.name !== fallbackProvider.name) {
|
|
318
|
+
throw new Error(`review fallback: unsupported provider "${f.provider.name}" for model "${fallbackModel}"`);
|
|
319
|
+
}
|
|
320
|
+
if (normalizedPrimary.provider && (f.provider ?? fallbackProvider).name === normalizedPrimary.provider.name) continue;
|
|
321
|
+
seen.add(fallbackModel);
|
|
322
|
+
const selectedFallbackProvider = f.provider ?? fallbackProvider;
|
|
323
|
+
out.push(f.model === fallbackModel && f.provider === selectedFallbackProvider
|
|
324
|
+
? f : { ...f, model: fallbackModel, provider: selectedFallbackProvider });
|
|
288
325
|
}
|
|
289
326
|
return out;
|
|
290
327
|
}
|
|
291
328
|
|
|
292
329
|
/** A distinct provider is available even when the optional config list is empty. */
|
|
293
330
|
export function defaultReviewFallbackModel(primaryProvider?: string): string {
|
|
294
|
-
|
|
331
|
+
// `claude` is a family label, not a model alias; use the canonical Opus alias for the Claude lane.
|
|
332
|
+
return resolveModelAlias(primaryProvider === 'grok' ? 'opus' : 'grok')!;
|
|
295
333
|
}
|
|
296
334
|
|
|
297
335
|
export interface ReviewFallbackObservation {
|
|
@@ -10,7 +10,7 @@ import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
|
|
|
10
10
|
import { debug } from '../debug/log.js';
|
|
11
11
|
import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
|
|
12
12
|
import { routeSupervisorVerdict } from './supervisor-verdict-edges.js';
|
|
13
|
-
import {
|
|
13
|
+
import type { TaskAgentShadowInput } from '../task-agent/shadow.js';
|
|
14
14
|
import { cardPrNumber, taskAgentStatePath } from '../task-agent/task-hand.js';
|
|
15
15
|
import {
|
|
16
16
|
classifyMustFixRound, inferMustFixEvidence, judgeMustFixScope, proposeMustFixSplit,
|
|
@@ -40,6 +40,8 @@ export interface SupervisorRound {
|
|
|
40
40
|
mainSyncRelaunchTaskIds?: string[];
|
|
41
41
|
/** Original feature and relaunch goal text of those tasks — a rerun may mint a new taskId, so the piece is also found by goal. */
|
|
42
42
|
mainSyncRelaunchFeatures?: string[];
|
|
43
|
+
/** PR 없는 미분류 실패에 대해 실제 분해 실행기로 수복한 원래 골. 새 taskId에도 한 번 상한을 지킨다. */
|
|
44
|
+
selfHealDecomposeFeatures?: string[];
|
|
43
45
|
/**
|
|
44
46
|
* Tasks of this round that ended `status=failed` without a PR. Omitted when there are none — and on older
|
|
45
47
|
* history, which never measured it, so the no-PR streak guard reads it as «not measured» and stays off.
|
|
@@ -130,6 +132,7 @@ export interface SupervisorDecision {
|
|
|
130
132
|
};
|
|
131
133
|
oscillation?: { taskIds: string[]; helper: 'review-oscillation'; signature: string; repairGoals?: Record<string, string>; heldTaskIds?: string[] };
|
|
132
134
|
pendingDecision?: 'attempt-care-escalation';
|
|
135
|
+
selfHeal?: { reason: 'supervisor-unclassified-decompose'; attempt: 1; taskIds: string[] };
|
|
133
136
|
}
|
|
134
137
|
|
|
135
138
|
export interface SupervisorLimits {
|
|
@@ -352,6 +355,8 @@ export function decideNextRun(input: {
|
|
|
352
355
|
reviewMustFixTrend?: ReviewRework['trend'];
|
|
353
356
|
/** True: the rerun consumes the authored goal. False: it cannot, so oscillation stops for a human. Undefined: pure decision. */
|
|
354
357
|
repairGoalExecution?: boolean;
|
|
358
|
+
/** 분해 제안을 실제 조각 실행으로 승격할 수 있는 supervisor 경로에만 true. */
|
|
359
|
+
decompositionExecution?: boolean;
|
|
355
360
|
}): SupervisorDecision {
|
|
356
361
|
const results = [...input.results];
|
|
357
362
|
const history = [...(input.history ?? [])];
|
|
@@ -502,6 +507,29 @@ export function decideNextRun(input: {
|
|
|
502
507
|
}
|
|
503
508
|
|
|
504
509
|
if (!t.actionable) {
|
|
510
|
+
const spent = new Set(history.flatMap((entry) => entry.selfHealDecomposeFeatures ?? []).map(resumeKey));
|
|
511
|
+
const candidates = input.decompositionExecution === true && round + 1 <= maxRounds
|
|
512
|
+
? activeResults.filter((result) => result.status === 'failed' && result.prNumber === undefined && !result.prUrl
|
|
513
|
+
&& !result.providerErrors && !result.blockReason
|
|
514
|
+
&& (result.decomposeProposal?.pieces.length ?? 0) >= 2
|
|
515
|
+
&& t.needsHuman.includes(result.taskId)
|
|
516
|
+
&& t.classifications.some((classification) => classification.taskId === result.taskId && classification.kind === 'unclassified')
|
|
517
|
+
&& !spent.has(resumeKey(result.feature)))
|
|
518
|
+
: [];
|
|
519
|
+
// rerun은 라운드 전체를 받는다. 다른 needs-human 조각을 함께 다시 띄우지 않도록 첫 조각은 단독 후보로만 허용한다.
|
|
520
|
+
const candidate = candidates.length === 1 && t.needsHuman.every((id) => id === candidates[0]!.taskId)
|
|
521
|
+
? candidates[0] : undefined;
|
|
522
|
+
if (candidate) {
|
|
523
|
+
const taskIds = [candidate.taskId];
|
|
524
|
+
return { ...base, action: 'relaunch',
|
|
525
|
+
decomposable: taskIds,
|
|
526
|
+
needsHuman: t.needsHuman.filter((id) => !taskIds.includes(id)),
|
|
527
|
+
classifications: t.classifications.map((classification) => taskIds.includes(classification.taskId)
|
|
528
|
+
? { ...classification, action: 'decompose-and-retry' as const } : classification),
|
|
529
|
+
selfHeal: { reason: 'supervisor-unclassified-decompose', attempt: 1, taskIds },
|
|
530
|
+
why: `supervisor-unclassified-decompose (attempt: 1/1) — PR 없는 미분류 조각 ${taskIds.length}개를 실증된 분해 제안으로 한 번 재걸기`,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
505
533
|
if (t.needsHuman.length > 0) {
|
|
506
534
|
return {
|
|
507
535
|
...base,
|
|
@@ -772,6 +800,12 @@ export function appendRound(
|
|
|
772
800
|
decision.relaunchGoals?.[id],
|
|
773
801
|
].filter((feature): feature is string => feature !== undefined)),
|
|
774
802
|
} : {}),
|
|
803
|
+
...(decision?.action !== 'stop' && decision?.selfHeal ? {
|
|
804
|
+
selfHealDecomposeFeatures: decision.selfHeal.taskIds.flatMap((id) => {
|
|
805
|
+
const feature = results.find((result) => result.taskId === id)?.feature;
|
|
806
|
+
return feature === undefined ? [] : [feature];
|
|
807
|
+
}),
|
|
808
|
+
} : {}),
|
|
775
809
|
...(decision?.action === 'add-repair-task' && decision.oscillation ? (() => {
|
|
776
810
|
// Each repaired task is recorded under its original goal feature and, when a rerun runs the authored goal as
|
|
777
811
|
// the piece's new feature (orchestrate), under that repair text too — so the repair's own oscillation stops.
|
|
@@ -1028,6 +1062,7 @@ export async function rejudgeTerminalTaskCard(runId: string | null, deps: {
|
|
|
1028
1062
|
external?: Parameters<typeof import('../task-agent/rejudge-on-head.js').rejudgeAsyncResultCard>[2];
|
|
1029
1063
|
} = {}): Promise<void> {
|
|
1030
1064
|
const statePath = deps.statePath ?? taskAgentStatePath();
|
|
1065
|
+
const { runCardFor } = await import('../task-agent/shadow.js');
|
|
1031
1066
|
const card = runCardFor(runId, { statePath, ...(deps.env ? { env: deps.env } : {}) });
|
|
1032
1067
|
if (!card || card.status !== 'launched' || card.taLand !== true || cardPrNumber(card) === undefined) return;
|
|
1033
1068
|
const { rejudgeAsyncResultCard } = await import('../task-agent/rejudge-on-head.js');
|
|
@@ -1081,9 +1116,10 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1081
1116
|
const allUnreviewedAreNoDiff = unreviewed.length > 0
|
|
1082
1117
|
&& unreviewed.every((result) => result.reviewReason === 'no-diff');
|
|
1083
1118
|
|
|
1084
|
-
|
|
1119
|
+
let decision = decideNextRun({
|
|
1085
1120
|
results,
|
|
1086
1121
|
history,
|
|
1122
|
+
decompositionExecution: opts.promoteDecomposition !== undefined,
|
|
1087
1123
|
// Undeclared = cannot run the repair goal: an add-repair-task would otherwise be a same-strategy relaunch.
|
|
1088
1124
|
repairGoalExecution: opts.repairGoalExecution === true,
|
|
1089
1125
|
...(aggregateReviewTrend(results) ? { reviewMustFixTrend: aggregateReviewTrend(results) } : {}),
|
|
@@ -1118,6 +1154,20 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1118
1154
|
decomposePromotion = { attempted: true, reason: `shim-failed: ${String(error)}` };
|
|
1119
1155
|
}
|
|
1120
1156
|
}
|
|
1157
|
+
if (decision.selfHeal) {
|
|
1158
|
+
const promoted = decomposePromotion.attempted && (decomposePromotion.pieceCount ?? 0) >= 2;
|
|
1159
|
+
try { opts.observe?.('supervisor-self-heal', { runId, reason: decision.selfHeal.reason,
|
|
1160
|
+
attempt: decision.selfHeal.attempt, taskIds: decision.selfHeal.taskIds,
|
|
1161
|
+
outcome: promoted ? 'promoted' : 'needs-human', promotionReason: decomposePromotion.reason }); } catch { /* fail-open */ }
|
|
1162
|
+
if (!promoted) {
|
|
1163
|
+
decision = { ...decision, action: 'stop', stopReason: 'needs-human',
|
|
1164
|
+
decomposable: decision.decomposable.filter((id) => !decision.selfHeal!.taskIds.includes(id)),
|
|
1165
|
+
needsHuman: [...new Set([...decision.needsHuman, ...decision.selfHeal.taskIds])],
|
|
1166
|
+
classifications: decision.classifications.map((classification) => decision.selfHeal!.taskIds.includes(classification.taskId)
|
|
1167
|
+
? { ...classification, action: 'needs-human' as const } : classification),
|
|
1168
|
+
why: `${decision.selfHeal.reason} (attempt: 1/1) — 분해 승격 실패(${decomposePromotion.reason}); 자동 재실행 없이 사람 확인` };
|
|
1169
|
+
}
|
|
1170
|
+
}
|
|
1121
1171
|
|
|
1122
1172
|
try {
|
|
1123
1173
|
const walkSummary = results.some((r) => r.walk !== undefined)
|
|
@@ -1145,6 +1195,7 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1145
1195
|
kinds: decision.classifications.map((c) => `${c.kind}:${c.action}`),
|
|
1146
1196
|
decomposePromotionAttempted: decomposePromotion.attempted,
|
|
1147
1197
|
decomposePromotionReason: decomposePromotion.reason,
|
|
1198
|
+
...(decision.selfHeal ? { selfHealReason: decision.selfHeal.reason, selfHealAttempt: decision.selfHeal.attempt } : {}),
|
|
1148
1199
|
...(decomposePromotion.pieceCount === undefined ? {} : { decomposePieceCount: decomposePromotion.pieceCount }),
|
|
1149
1200
|
...(decomposePromotion.dependsOnEdges === undefined ? {} : { decomposeDependsOnEdges: decomposePromotion.dependsOnEdges }),
|
|
1150
1201
|
...(decomposePromotion.hotPathEdges === undefined ? {} : { decomposeHotPathEdges: decomposePromotion.hotPathEdges }),
|
|
@@ -1188,6 +1239,7 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1188
1239
|
runId,
|
|
1189
1240
|
reason: decision.stopReason,
|
|
1190
1241
|
outcome: persistence.outcome,
|
|
1242
|
+
...(decision.selfHeal ? { selfHealReason: decision.selfHeal.reason, selfHealAttempt: decision.selfHeal.attempt } : {}),
|
|
1191
1243
|
...storageObservation,
|
|
1192
1244
|
});
|
|
1193
1245
|
} catch { /* fail-open */ }
|
|
@@ -1195,6 +1247,7 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1195
1247
|
if (decision.stopReason && opts.taskAgentShadow !== false) {
|
|
1196
1248
|
// TASK-AGENT-SHADOW — 판단부를 그림자로 부른다(실행 0). 어떤 오류도 런의 결말을 바꾸지 않는다.
|
|
1197
1249
|
try {
|
|
1250
|
+
const { recordTaskAgentShadowMove } = await import('../task-agent/shadow.js');
|
|
1198
1251
|
const pr = results.find((result) => typeof result.prNumber === 'number' && result.prNumber > 0)?.prNumber;
|
|
1199
1252
|
const reviewed = results.filter((result) => result.prNumber === pr && result.selfReview && result.merged !== true);
|
|
1200
1253
|
const selfReview = pr && reviewed.length === 1 ? reviewed[0]!.selfReview : undefined;
|
|
@@ -98,7 +98,7 @@ export interface SelfDevJobResult {
|
|
|
98
98
|
/** Commits this child added against its own `--base`. 0 is not completion progress. */
|
|
99
99
|
commitsAheadOfBase?: number;
|
|
100
100
|
/** A dependency is done but its result is not on main; no child was launched. */
|
|
101
|
-
blockReason?: 'parent-unlanded' | 'dependency-needs-human';
|
|
101
|
+
blockReason?: 'parent-unlanded' | 'dependency-needs-human' | 'dependency-deferred';
|
|
102
102
|
parentPrNumber?: number;
|
|
103
103
|
/** The upstream completed in a worktree without opening a PR. */
|
|
104
104
|
parentNoPr?: true;
|