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
|
@@ -8,6 +8,8 @@ import { extractSlugSource, generateMissionSlug, slugify } from '../autopilot/mi
|
|
|
8
8
|
import { enhancePrompt, type EnhanceOpts, type EnhanceResult } from '../prompt-enhance/enhance.js';
|
|
9
9
|
import type { LLMUsage } from '../prompt-cache/types.js';
|
|
10
10
|
import { debug } from '../debug/log.js';
|
|
11
|
+
import { ensureDeviceFirstSteps, inspectDeviceFirstGoal } from './device-first.js';
|
|
12
|
+
import { COMPLETION_BOUNDARY_STEP_PREFIX, FOLDED_DEVICE_FIRST_ACTION_MARKER } from './goal-author-decompose.js';
|
|
11
13
|
|
|
12
14
|
function observeGoalAuthor(
|
|
13
15
|
category: 'goal-author' | 'goal-author.clarify',
|
|
@@ -48,6 +50,7 @@ import { resolveGoalDocumentsDir } from './goal-documents-dir.js';
|
|
|
48
50
|
import { REQUIRED_EVIDENCE_COMMAND_SEPARATOR } from './off-diff-evidence.js';
|
|
49
51
|
import { renderLaunchPreflight, siblingTestPath, type LaunchPreflightResult } from '../self-dev/launch-preflight-text.js';
|
|
50
52
|
import { quoteShellArg } from '../cli/logs-cli.js';
|
|
53
|
+
import { focusedEvidenceTestPath } from './evidence-command-budget.js';
|
|
51
54
|
import type { HarnessGroundingProvenance } from './context-capsule.js';
|
|
52
55
|
import { hasGoalStepCodeName } from './goal-step-code-name.js';
|
|
53
56
|
import { targetScopedGoalText } from './goal-text-path-scope.js';
|
|
@@ -116,6 +119,8 @@ export interface GoalAuthorDeps {
|
|
|
116
119
|
launchPreflight?: LaunchPreflightResult;
|
|
117
120
|
/** Optional in-process notification for each authored-goal phase transition. */
|
|
118
121
|
onProgress?: (phase: GoalAuthorPhase, event: 'start' | 'end') => void;
|
|
122
|
+
/** AUTHOR-TIMEBOX: budget for the `ground` phase. Omitted means `GOAL_AUTHOR_GROUND_TIMEBOX_MS`. */
|
|
123
|
+
groundTimeboxMs?: number;
|
|
119
124
|
}
|
|
120
125
|
|
|
121
126
|
export type GoalAuthorGroundingPath = 'groundMissionInCodebase';
|
|
@@ -161,10 +166,12 @@ export interface GoalAuthorPersistentGroundingDecision {
|
|
|
161
166
|
* ⛔ 경로 «배열»을 남기지 않는다: 이 저장소의 debug.log 는 배열을 6에서 잘라 `{_more:N}` 을
|
|
162
167
|
* 붙이므로 ***분모가 깨진다***. 히스토그램은 안 잘리고 「무슨 종류를 봤나」에 그대로 답한다. */
|
|
163
168
|
readonly fileKinds?: Readonly<Record<string, number>>;
|
|
169
|
+
/** AUTHOR-TIMEBOX: 접지가 «던진» 것이 아니라 «예산 초과»로 끊겼다 — `groundingError` 와 다른 축이다. */
|
|
170
|
+
readonly timeboxExceeded?: boolean;
|
|
164
171
|
}
|
|
165
172
|
|
|
166
173
|
type GoalAuthorPersistentGroundingMetrics = Pick<GoalAuthorPersistentGroundingDecision,
|
|
167
|
-
'authorRunId' | 'grounded' | 'groundingError' | 'fileCount' | 'persistentEvidenceCount' | 'contextChars' | 'persistentStopReason' | 'codeChannel' | 'fileKinds'
|
|
174
|
+
'authorRunId' | 'grounded' | 'groundingError' | 'fileCount' | 'persistentEvidenceCount' | 'contextChars' | 'persistentStopReason' | 'codeChannel' | 'fileKinds' | 'timeboxExceeded'
|
|
168
175
|
>;
|
|
169
176
|
|
|
170
177
|
type GoalAuthorPersistentGroundingConfigReader = () => boolean | undefined;
|
|
@@ -208,11 +215,13 @@ function goalAuthorPersistentGroundingMetrics(
|
|
|
208
215
|
facts: CodebaseGrounding | null,
|
|
209
216
|
groundingError: boolean,
|
|
210
217
|
authorRunId: string,
|
|
218
|
+
timeboxExceeded = false,
|
|
211
219
|
): GoalAuthorPersistentGroundingMetrics {
|
|
212
220
|
return {
|
|
213
221
|
authorRunId,
|
|
214
222
|
grounded: facts?.grounded ?? false,
|
|
215
223
|
groundingError,
|
|
224
|
+
...(timeboxExceeded ? { timeboxExceeded: true } : {}),
|
|
216
225
|
fileCount: facts?.files.length ?? 0,
|
|
217
226
|
fileKinds: summarizeGroundingFileKinds(facts?.files ?? []),
|
|
218
227
|
persistentEvidenceCount: facts?.persistentEvidence?.length ?? 0,
|
|
@@ -256,6 +265,14 @@ const MAX_COLLISION_RETRIES = 50;
|
|
|
256
265
|
const SUPERSESSION_LOCK_STALE_MS = 30_000;
|
|
257
266
|
const GOAL_AUTHOR_HELP_PROBE_TIMEOUT_MS = 3_000;
|
|
258
267
|
const GOAL_AUTHOR_HELP_PROBE_STDERR_MAX_CHARS = 4_000;
|
|
268
|
+
/**
|
|
269
|
+
* ⭐ AUTHOR-TIMEBOX — 접지(`ground`) 단계의 기본 시간 한도.
|
|
270
|
+
*
|
|
271
|
+
* 🩸 실측(2026-10-21): 접지 헛돌기(`grounding.search` 1,584행)가 저작 전체를 80분 붙잡았고,
|
|
272
|
+
* 그렇게 죽은 런은 «결과 줄»을 하나도 안 남겨 상위 디스패처가 성공으로도 실패로도 판정하지 못했다.
|
|
273
|
+
* ⇒ 한도를 넘기면 접지 결과를 «기다리지 않고» 끊고 NOT-GROUNDED 로 끝낸다 — 문서·관측·결과 줄 셋 다.
|
|
274
|
+
*/
|
|
275
|
+
export const GOAL_AUTHOR_GROUND_TIMEBOX_MS = 15 * 60_000;
|
|
259
276
|
export const EVIDENCE_LOCATION_REQUIREMENT = 'For every acceptance criterion, state where evidence that it was met appears in the diff or which line of the report shows it. Evidence visible only on an execution screen and left in neither the diff nor the report is not evidence.';
|
|
260
277
|
export const REQUIRED_BLOCKS = ['## PROBLEM', '## WHAT TO BUILD', '## ACCEPTANCE CRITERIA', '## REQUIRED EVIDENCE', '## TRACED PATHS', '## SCOPE BOUNDARY', '## 답하지 못하는 것', '## 불변식', '## 판정 신호'] as const;
|
|
261
278
|
export const ERROR_REQUIRED_BLOCKS = new Set<string>(['## PROBLEM', '## ACCEPTANCE CRITERIA', '## REQUIRED EVIDENCE']);
|
|
@@ -508,12 +525,51 @@ const GOAL_DONE_UNSUPPORTED_SHELL_OPERATOR = /&&|\|\||[;|><`]|\$\(/;
|
|
|
508
525
|
// Only the narrow, concrete file predicates are accepted for `test`; the
|
|
509
526
|
// predicate also needs its operand, so `test -f` cannot claim proof.
|
|
510
527
|
const GOAL_DONE_SHELL_TEST_ARGS = /^-(?:f|e)\s+\S+(?:\s|$)/;
|
|
528
|
+
const GOAL_DONE_EVIDENCE_OPERATOR_ERROR = '증거 명령에 셸 연산자 — 명령 한 줄만';
|
|
529
|
+
const GOAL_DONE_EVIDENCE_SYNTAX_ERROR = '증거 명령 형식이 아님 — 실행 파일과 인자 필요';
|
|
530
|
+
|
|
531
|
+
function firstGoalDoneShellOperator(value: string): { index: number; token: string } | 'unsafe' | undefined {
|
|
532
|
+
let quote: "'" | '"' | undefined;
|
|
533
|
+
for (let index = 0; index < value.length; index++) {
|
|
534
|
+
const char = value[index];
|
|
535
|
+
if (char === '\\' && quote !== "'") { index++; continue; }
|
|
536
|
+
if (quote === "'") { if (char === "'") quote = undefined; continue; }
|
|
537
|
+
if (quote === '"') {
|
|
538
|
+
if (char === '"') quote = undefined;
|
|
539
|
+
else if (char === '`' || (char === '$' && value[index + 1] === '(')) return 'unsafe';
|
|
540
|
+
continue;
|
|
541
|
+
}
|
|
542
|
+
if (char === "'" || char === '"') { quote = char; continue; }
|
|
543
|
+
if (char === '`' || (char === '$' && value[index + 1] === '(')) return 'unsafe';
|
|
544
|
+
const pair = value.slice(index, index + 2);
|
|
545
|
+
if (pair === '&&' || pair === '||') return { index, token: pair };
|
|
546
|
+
if (char === ';' || char === '&' || char === '|' || char === '>' || char === '<') return { index, token: char };
|
|
547
|
+
}
|
|
548
|
+
return quote ? 'unsafe' : undefined;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/** Prepare one command for future checklist/hand wiring. This slice does not change their current admission rules. */
|
|
552
|
+
export function validateGoalDoneEvidenceCommand(value: string): { command?: string; error?: string } {
|
|
553
|
+
const raw = value.trim();
|
|
554
|
+
// A quote at each end does not necessarily wrap the whole command:
|
|
555
|
+
// `"bun test" ; "x"` has an operator between two separately quoted words.
|
|
556
|
+
if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
|
|
557
|
+
if (firstGoalDoneShellOperator(raw) !== undefined) return { error: GOAL_DONE_EVIDENCE_OPERATOR_ERROR };
|
|
558
|
+
}
|
|
559
|
+
const text = unwrapGoalDoneValue(value);
|
|
560
|
+
const operator = firstGoalDoneShellOperator(text);
|
|
561
|
+
if (operator !== undefined || /[\r\n]/u.test(text)) return { error: GOAL_DONE_EVIDENCE_OPERATOR_ERROR };
|
|
562
|
+
const command = text.trim();
|
|
563
|
+
const match = GOAL_DONE_EVIDENCE_COMMAND.exec(command);
|
|
564
|
+
const args = match?.[2]?.trim() ?? '';
|
|
565
|
+
if (!match || !args || (match[1] === 'test' && !GOAL_DONE_SHELL_TEST_ARGS.test(args)))
|
|
566
|
+
return { error: GOAL_DONE_EVIDENCE_SYNTAX_ERROR };
|
|
567
|
+
return { command };
|
|
568
|
+
}
|
|
511
569
|
|
|
512
570
|
function isGoalDoneEvidenceCommand(value: string): boolean {
|
|
513
571
|
if (GOAL_DONE_UNSUPPORTED_SHELL_OPERATOR.test(value)) return false;
|
|
514
|
-
|
|
515
|
-
const args = match?.[2]?.trim() ?? '';
|
|
516
|
-
return !!match && args.length > 0 && (match[1] !== 'test' || GOAL_DONE_SHELL_TEST_ARGS.test(args));
|
|
572
|
+
return validateGoalDoneEvidenceCommand(value).command !== undefined;
|
|
517
573
|
}
|
|
518
574
|
|
|
519
575
|
function unwrapGoalDoneValue(value: string): string {
|
|
@@ -1435,6 +1491,57 @@ export function classifyGroundingFailure(input: GroundingFailureClassificationIn
|
|
|
1435
1491
|
return { root: 'undifferentiated', prescription: legacyPrescription };
|
|
1436
1492
|
}
|
|
1437
1493
|
|
|
1494
|
+
/**
|
|
1495
|
+
* ⭐ GROUNDING-PERSISTENT-EMPTY-REPAIR 4/7 — 빈 근거 분류. persistent 채널(Read-검증 근거)이 비어
|
|
1496
|
+
* 있을 때 그 사유를 구조화해 남긴다. 분기 우선순위: 선언된 대상 경로가 저장소 파일도 명시적 신설도
|
|
1497
|
+
* 아니면 `absent-path`, 그렇지 않으면서 접지가 저장소 파일을 Read 했으면 `read-mismatch`
|
|
1498
|
+
* (K-UX-15 — 근거 줄에 Read 하지 않은 경로가 섞이면 줄 전체가 기각된다), 둘 다 아니면 `undifferentiated`.
|
|
1499
|
+
* 채널이 비어 있지 않으면(≥1 항목) 분류가 아예 일어나지 않는다.
|
|
1500
|
+
*/
|
|
1501
|
+
export type GoalAuthorEmptyEvidenceReason = 'read-mismatch' | 'absent-path' | 'undifferentiated';
|
|
1502
|
+
|
|
1503
|
+
export interface GoalAuthorEmptyEvidenceClassificationInput {
|
|
1504
|
+
/** persistent 채널(Read-검증 근거)의 항목 수 — 0일 때만 분류가 일어난다. */
|
|
1505
|
+
readonly persistentEvidenceCount: number;
|
|
1506
|
+
/** 접지가 실제로 Read 한 저장소 파일 수. */
|
|
1507
|
+
readonly readFilesCount: number;
|
|
1508
|
+
/** TRACED PATHS 에서 저장소 파일·명시적 신설로 확인되지 않은 선언 대상 경로 수. */
|
|
1509
|
+
readonly unresolvedTargetCount: number;
|
|
1510
|
+
/** 문서에 조립된 TRACED PATHS 의 최종 추적 항목 수(미해석 행 제외). */
|
|
1511
|
+
readonly finalTracedCount: number;
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
export interface GoalAuthorEmptyEvidenceClassification {
|
|
1515
|
+
readonly reason: GoalAuthorEmptyEvidenceReason;
|
|
1516
|
+
readonly reasonLabel: string;
|
|
1517
|
+
readonly finalTracedCount: number;
|
|
1518
|
+
/** 채널이 비어 있으므로 최종 추적 항목은 오직 ask 선언 대상 경로에서 왔다; 없으면 'none'. */
|
|
1519
|
+
readonly source: 'ask-declared-targets' | 'none';
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
const EMPTY_EVIDENCE_REASON_LABELS: Record<GoalAuthorEmptyEvidenceReason, string> = {
|
|
1523
|
+
'read-mismatch': 'empty-evidence:read-mismatch — grounding Read repository files, yet the persistent channel is empty: every evidence line cited at least one path grounding did not Read, so the whole line was rejected (notRead).',
|
|
1524
|
+
'absent-path': 'empty-evidence:absent-path — the ask-declared target path is neither a repository file nor an explicitly declared new file, so the evidence it needs could not be Read at all.',
|
|
1525
|
+
'undifferentiated': 'empty-evidence:undifferentiated — the persistent channel is empty and no distinguishing read or absence signal was observed.',
|
|
1526
|
+
};
|
|
1527
|
+
|
|
1528
|
+
export function classifyEmptyPersistentEvidence(
|
|
1529
|
+
input: GoalAuthorEmptyEvidenceClassificationInput,
|
|
1530
|
+
): GoalAuthorEmptyEvidenceClassification | null {
|
|
1531
|
+
if (input.persistentEvidenceCount > 0) return null;
|
|
1532
|
+
const reason: GoalAuthorEmptyEvidenceReason = input.unresolvedTargetCount > 0
|
|
1533
|
+
? 'absent-path'
|
|
1534
|
+
: input.readFilesCount > 0
|
|
1535
|
+
? 'read-mismatch'
|
|
1536
|
+
: 'undifferentiated';
|
|
1537
|
+
return {
|
|
1538
|
+
reason,
|
|
1539
|
+
reasonLabel: EMPTY_EVIDENCE_REASON_LABELS[reason],
|
|
1540
|
+
finalTracedCount: input.finalTracedCount,
|
|
1541
|
+
source: input.finalTracedCount > 0 ? 'ask-declared-targets' : 'none',
|
|
1542
|
+
};
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1438
1545
|
function isTracedPathsEvidenceUnavailable(entry: string): boolean {
|
|
1439
1546
|
return entry === TRACED_PATHS_EVIDENCE_UNAVAILABLE || TRACED_PATHS_PERSISTENT_CHANNEL_UNAVAILABLE.test(entry);
|
|
1440
1547
|
}
|
|
@@ -2328,6 +2435,67 @@ export interface AuthoredGoal {
|
|
|
2328
2435
|
facts: CodebaseGrounding | null;
|
|
2329
2436
|
grounded: boolean;
|
|
2330
2437
|
authorRunId: string;
|
|
2438
|
+
/** AUTHOR-TIMEBOX: present only when the `ground` phase was short-circuited for exceeding its budget. */
|
|
2439
|
+
groundingTimebox?: GoalAuthorGroundingTimebox;
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
/** AUTHOR-TIMEBOX 산출 — 예산과 실제 경과. 둘 다 «잰 값»이고 지어낸 값이 아니다. */
|
|
2443
|
+
export interface GoalAuthorGroundingTimebox {
|
|
2444
|
+
readonly budgetMs: number;
|
|
2445
|
+
readonly elapsedMs: number;
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2448
|
+
type GoalAuthorGroundOutcome =
|
|
2449
|
+
| { readonly facts: CodebaseGrounding }
|
|
2450
|
+
| { readonly timebox: GoalAuthorGroundingTimebox };
|
|
2451
|
+
|
|
2452
|
+
/**
|
|
2453
|
+
* ⭐ AUTHOR-TIMEBOX — 주입된 접지 promise 는 «취소»할 수 없다(그것은 호출자의 seam 이다).
|
|
2454
|
+
* 그래서 여기서는 예산이 지나면 그 결과를 «안 쓰고» 끊는다 — 기다리지 않는 것이 요구다.
|
|
2455
|
+
* ⛔ 늦게 끝난 접지의 거절이 unhandled rejection 이 되어 런을 죽이면 안 된다 → 핸들러를 미리 붙인다.
|
|
2456
|
+
* ⛔ 시작 시각은 «이미 잰» 페이즈 시작값을 받는다 — 여기서 `Date.now()` 를 한 번 더 부르면
|
|
2457
|
+
* 고정 시계를 쓰는 기존 페이즈 시험의 호출 순서가 밀려 «보존 계약»이 깨진다(실측 2026-10-21).
|
|
2458
|
+
*/
|
|
2459
|
+
async function groundWithinTimebox(
|
|
2460
|
+
ground: () => Promise<CodebaseGrounding>,
|
|
2461
|
+
budgetMs: number,
|
|
2462
|
+
startedAt: number,
|
|
2463
|
+
): Promise<GoalAuthorGroundOutcome> {
|
|
2464
|
+
const expired = Symbol('goal-author-ground-timebox');
|
|
2465
|
+
const groundPromise = ground();
|
|
2466
|
+
groundPromise.catch(() => undefined);
|
|
2467
|
+
let handle: ReturnType<typeof setTimeout> | undefined;
|
|
2468
|
+
const timer = new Promise<typeof expired>((resolve) => {
|
|
2469
|
+
handle = setTimeout(() => resolve(expired), budgetMs);
|
|
2470
|
+
});
|
|
2471
|
+
try {
|
|
2472
|
+
const result = await Promise.race([groundPromise, timer]);
|
|
2473
|
+
return result === expired
|
|
2474
|
+
? { timebox: { budgetMs, elapsedMs: Date.now() - startedAt } }
|
|
2475
|
+
: { facts: result };
|
|
2476
|
+
} finally {
|
|
2477
|
+
clearTimeout(handle);
|
|
2478
|
+
}
|
|
2479
|
+
}
|
|
2480
|
+
|
|
2481
|
+
/** 접지 시간 한도가 걸렸다는 것을 골 문서 «안»에 남기는 줄 머리 — 발사 흐름이 이것으로 결과 줄을 쓴다. */
|
|
2482
|
+
export const GROUNDING_TIMEBOX_NOTICE_PREFIX = '- Grounding timebox:';
|
|
2483
|
+
|
|
2484
|
+
function groundingTimeboxNotice(timebox: GoalAuthorGroundingTimebox): string {
|
|
2485
|
+
return `${GROUNDING_TIMEBOX_NOTICE_PREFIX} the ${timebox.budgetMs}ms budget was exceeded after ${timebox.elapsedMs}ms — grounding was stopped and this goal is NOT-GROUNDED.`;
|
|
2486
|
+
}
|
|
2487
|
+
|
|
2488
|
+
/** 저작된 골 문서만 보고 «접지가 예산 초과로 끊겼나»를 읽는다 — 없으면 `null`(추정하지 않는다). */
|
|
2489
|
+
export function readGoalAuthorGroundingTimebox(document: string): GoalAuthorGroundingTimebox | null {
|
|
2490
|
+
const problem = markdownSection(document, 'PROBLEM');
|
|
2491
|
+
if (problem === null) return null;
|
|
2492
|
+
for (const line of problem.split(/\r?\n/)) {
|
|
2493
|
+
if (!line.startsWith(GROUNDING_TIMEBOX_NOTICE_PREFIX)) continue;
|
|
2494
|
+
const match = /(\d+)ms budget (?:was )?exceeded after (\d+)ms/.exec(line);
|
|
2495
|
+
if (!match) continue;
|
|
2496
|
+
return { budgetMs: Number(match[1]), elapsedMs: Number(match[2]) };
|
|
2497
|
+
}
|
|
2498
|
+
return null;
|
|
2331
2499
|
}
|
|
2332
2500
|
|
|
2333
2501
|
export interface GoalFileDeps {
|
|
@@ -2369,7 +2537,7 @@ const CONSTANT_DOCUMENT_INSTRUCTION_POLICY = [
|
|
|
2369
2537
|
] as const;
|
|
2370
2538
|
|
|
2371
2539
|
export const GOAL_RULES_POLICY = [
|
|
2372
|
-
'- Do not run the whole test suite. If tests apply, name the focused file(s) and read only each summary line; a full suite can exhaust the implementer context window.',
|
|
2540
|
+
'- Do not run the whole test suite. If tests apply, name the focused file(s) and read only each summary line; a full suite can exhaust the implementer context window. If the same evidence test times out twice, stop rerunning it and switch to a narrower direct-import test; report the timeout and replacement command.',
|
|
2373
2541
|
'- Do not infer a code path from a symbol grep. Trace a candidate before naming it as an implementation target.',
|
|
2374
2542
|
'- Do not create a planner, milestones, steps, task decomposition, worktree, PR, mission, daemon call, or dev-pipeline hand-off; this artifact is authoring only.',
|
|
2375
2543
|
'- Do not write an acceptance criterion that cannot hold at the same time as another one. Naming a field to add while demanding that same return value stay completely unchanged is a trap, not a contract: name the fields and values that must stay identical.',
|
|
@@ -2434,7 +2602,42 @@ function observePersistentEvidenceSourceKinds(facts: CodebaseGrounding | null, a
|
|
|
2434
2602
|
observeGoalAuthor('goal-author', 'persistent-grounding-evidence-source-count', { authorRunId, counts });
|
|
2435
2603
|
}
|
|
2436
2604
|
|
|
2437
|
-
|
|
2605
|
+
type TracedPathLedgerEvent = { event: string; data: Record<string, unknown> };
|
|
2606
|
+
|
|
2607
|
+
// ⭐ GROUNDING-PERSISTENT-EMPTY-REPAIR 4/7 — tracedPathsSection 이 내는 «선언 대상 미확인» 미해석 행의
|
|
2608
|
+
// 접미어(저장소 파일·명시적 신설 확인 불가) — 파싱 실패·경로 없는 근거 미해석 행과 구분하는 판별자다.
|
|
2609
|
+
const UNRESOLVED_DECLARED_TARGET_SUFFIX = ' — 요청에 선언된 대상 경로를 저장소 파일 또는 명시적 신설 파일로 확인하지 못함';
|
|
2610
|
+
|
|
2611
|
+
function isUnresolvedDeclaredTargetEntry(line: string): boolean {
|
|
2612
|
+
return line.includes('미해석: ') && line.endsWith(UNRESOLVED_DECLARED_TARGET_SUFFIX);
|
|
2613
|
+
}
|
|
2614
|
+
|
|
2615
|
+
function isTracedPathEntry(line: string): boolean {
|
|
2616
|
+
return /^\d+\. /.test(line) && !line.includes('미해석: ');
|
|
2617
|
+
}
|
|
2618
|
+
|
|
2619
|
+
/**
|
|
2620
|
+
* ⭐ GROUNDING-PERSISTENT-EMPTY-REPAIR 4/7 — 최종 TRACED PATHS 행이 확정된 뒤, persistent 채널이
|
|
2621
|
+
* 비어 있으면 구조화 사유·final traced count·출처를 관측 원장에 남긴다(launch-preflight 소비).
|
|
2622
|
+
* facts 가 없으면(lite 골) 기록하지 않고, 관측은 fail-soft 로 저작 자체를 멈추지 않는다.
|
|
2623
|
+
*/
|
|
2624
|
+
function observeEmptyPersistentEvidence(facts: CodebaseGrounding | null, tracedPathsLines: readonly string[], authorRunId: string): void {
|
|
2625
|
+
if (facts === null) return;
|
|
2626
|
+
const classification = classifyEmptyPersistentEvidence({
|
|
2627
|
+
persistentEvidenceCount: persistentEvidenceItems(facts).length,
|
|
2628
|
+
readFilesCount: facts.files.length,
|
|
2629
|
+
unresolvedTargetCount: tracedPathsLines.filter(isUnresolvedDeclaredTargetEntry).length,
|
|
2630
|
+
finalTracedCount: tracedPathsLines.filter(isTracedPathEntry).length,
|
|
2631
|
+
});
|
|
2632
|
+
if (classification === null) return;
|
|
2633
|
+
try {
|
|
2634
|
+
observeGoalAuthor('goal-author', 'persistent-grounding-empty-evidence', { authorRunId, ...classification });
|
|
2635
|
+
} catch {
|
|
2636
|
+
// 관측 채널 고장이 골 저작을 멈추게 하지 않는다(관측은 fail-soft).
|
|
2637
|
+
}
|
|
2638
|
+
}
|
|
2639
|
+
|
|
2640
|
+
function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, repositoryRoot: string | undefined, unavailableEvidence: string, authorRunId?: string, record?: (entry: TracedPathLedgerEvent) => void): string[] {
|
|
2438
2641
|
const evidence = persistentEvidenceItems(facts);
|
|
2439
2642
|
// Without a repository root we cannot verify paths. Keep the established
|
|
2440
2643
|
// rendering contract for callers that do not supply one.
|
|
@@ -2456,15 +2659,23 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
|
|
|
2456
2659
|
const targetLabels = linesOutsideFencedCode(ask)
|
|
2457
2660
|
.map(({ text }) => /^대상 경로:\s*(.*)$/.exec(text.trim())?.[1])
|
|
2458
2661
|
.filter((value): value is string => value !== undefined);
|
|
2662
|
+
const pathWithSpaces = (piece: string): string | null => {
|
|
2663
|
+
const path = piece.trim().replace(/^`|`$/g, '');
|
|
2664
|
+
if (!path.includes(' ') || !path.includes('/') || !/\.[a-z0-9]+$/i.test(path) || isAbsolute(path)
|
|
2665
|
+
|| path.split('/').some((part) => part === '.' || part === '..')) return null;
|
|
2666
|
+
if (path.split(/\s+/).slice(1).some((part) => part.includes('/'))) return null;
|
|
2667
|
+
return path;
|
|
2668
|
+
};
|
|
2459
2669
|
const unresolvedTargetPieces = targetLabels.flatMap((label) => label.split(/\s+[·,]\s*|[·,]\s+/))
|
|
2460
2670
|
.flatMap((piece) => {
|
|
2671
|
+
if (pathWithSpaces(piece)) return [];
|
|
2461
2672
|
const tokens = piece.trim().split(/\s+/).filter(Boolean);
|
|
2462
2673
|
return tokens.length === 0
|
|
2463
2674
|
? ['(빈 대상 경로)']
|
|
2464
2675
|
: tokens.filter((token) => targetPathsInLabelPiece(token).length === 0
|
|
2465
2676
|
&& classifyTracedPathToken(token, repositoryRoot).kind !== 'repository-root');
|
|
2466
2677
|
});
|
|
2467
|
-
const labeledTargets = declaredTargetPaths(ask);
|
|
2678
|
+
const labeledTargets = [...declaredTargetPaths(ask), ...targetLabels.flatMap((label) => label.split(/\s+[·,]\s*|[·,]\s+/).flatMap((piece) => pathWithSpaces(piece) ?? []))];
|
|
2468
2679
|
const labeledRootFiles = targetLabels.flatMap((label) => label.split(/\s+[·,]\s*|[·,]\s+/))
|
|
2469
2680
|
.flatMap((piece) => piece.trim().split(/\s+/).filter(Boolean))
|
|
2470
2681
|
.flatMap((token) => {
|
|
@@ -2494,10 +2705,75 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
|
|
|
2494
2705
|
return isSameOrNestedPath(real, root) && lstatSync(real).isFile();
|
|
2495
2706
|
} catch { return false; }
|
|
2496
2707
|
};
|
|
2708
|
+
const ambiguousPaths = new Set<string>();
|
|
2709
|
+
const correctedPaths = new Set<string>();
|
|
2710
|
+
const candidateFiles = new Map<string, string[]>();
|
|
2711
|
+
const filesIn = (directory: string): string[] => {
|
|
2712
|
+
const cached = candidateFiles.get(directory);
|
|
2713
|
+
if (cached) return cached;
|
|
2714
|
+
let entries: string[] = [];
|
|
2715
|
+
try {
|
|
2716
|
+
if (root !== null) {
|
|
2717
|
+
const realDirectory = realpathSync(resolve(root, directory));
|
|
2718
|
+
if (isSameOrNestedPath(realDirectory, root)) {
|
|
2719
|
+
entries = readdirSync(realDirectory, { withFileTypes: true })
|
|
2720
|
+
.filter((entry) => entry.isFile())
|
|
2721
|
+
.map((entry) => directory ? `${directory}/${entry.name}` : entry.name)
|
|
2722
|
+
.filter((candidate) => valid(candidate, false));
|
|
2723
|
+
}
|
|
2724
|
+
}
|
|
2725
|
+
} catch { /* Missing or outside-repository directories have no candidates. */ }
|
|
2726
|
+
candidateFiles.set(directory, entries);
|
|
2727
|
+
return entries;
|
|
2728
|
+
};
|
|
2729
|
+
const distance = (left: string, right: string): number => {
|
|
2730
|
+
let row = Array.from({ length: right.length + 1 }, (_, index) => index);
|
|
2731
|
+
for (let i = 1; i <= left.length; i += 1) {
|
|
2732
|
+
const next = [i];
|
|
2733
|
+
for (let j = 1; j <= right.length; j += 1) {
|
|
2734
|
+
next[j] = Math.min(next[j - 1]! + 1, row[j]! + 1, row[j - 1]! + Number(left[i - 1] !== right[j - 1]));
|
|
2735
|
+
}
|
|
2736
|
+
row = next;
|
|
2737
|
+
}
|
|
2738
|
+
return row[right.length]!;
|
|
2739
|
+
};
|
|
2740
|
+
const correct = (path: string): string | null => {
|
|
2741
|
+
if (!path.includes('/') || isAbsolute(path) || path.split('/').some((part) => part === '.' || part === '..')) return null;
|
|
2742
|
+
const directory = dirname(path);
|
|
2743
|
+
const name = path.slice(directory.length + 1);
|
|
2744
|
+
const candidates = [...new Set([...filesIn(directory), ...known.filter((candidate) => dirname(candidate) === directory && valid(candidate, false))])];
|
|
2745
|
+
const prefixName = name.includes('*') ? name.slice(0, name.indexOf('*')) : name;
|
|
2746
|
+
const prefix = prefixName.length >= 3
|
|
2747
|
+
? candidates.filter((candidate) => candidate.slice(directory.length + 1).startsWith(prefixName))
|
|
2748
|
+
: [];
|
|
2749
|
+
const near = [...new Set([...prefix, ...candidates.filter((candidate) => {
|
|
2750
|
+
const candidateName = candidate.slice(directory.length + 1);
|
|
2751
|
+
const limit = name.length >= 6 ? 2 : 1;
|
|
2752
|
+
return !name.includes('*') && candidateName.slice(candidateName.lastIndexOf('.')) === name.slice(name.lastIndexOf('.'))
|
|
2753
|
+
&& distance(name, candidateName) <= limit;
|
|
2754
|
+
})])];
|
|
2755
|
+
if (near.length === 1) return near[0]!;
|
|
2756
|
+
if (near.length > 1 && !ambiguousPaths.has(path)) {
|
|
2757
|
+
ambiguousPaths.add(path);
|
|
2758
|
+
const message = `[goal-author] traced path warning: ambiguous ${path} — ${near.join(', ')}; skipped`;
|
|
2759
|
+
process.stderr.write(`${message}\n`);
|
|
2760
|
+
try { observeGoalAuthor('goal-author', 'traced-path-warning', { authorRunId, path, candidates: near, action: 'skipped' }); } catch { /* observation is fail-soft */ }
|
|
2761
|
+
record?.({ event: 'traced-path-warning', data: { authorRunId, path, candidates: near, action: 'skipped' } });
|
|
2762
|
+
}
|
|
2763
|
+
return null;
|
|
2764
|
+
};
|
|
2497
2765
|
const resolvePath = (path: string, declaredTarget = false): string | null => {
|
|
2498
|
-
if (declaredTarget
|
|
2766
|
+
if (declaredTarget && valid(path, true)) return path;
|
|
2499
2767
|
if (path.includes('/') && valid(path, true)) return path;
|
|
2500
|
-
if (path.includes('/'))
|
|
2768
|
+
if (path.includes('/')) {
|
|
2769
|
+
const corrected = correct(path);
|
|
2770
|
+
if (corrected && !correctedPaths.has(path)) {
|
|
2771
|
+
correctedPaths.add(path);
|
|
2772
|
+
try { observeGoalAuthor('goal-author', 'traced-path-correction', { authorRunId, from: path, to: corrected }); } catch { /* observation is fail-soft */ }
|
|
2773
|
+
record?.({ event: 'traced-path-correction', data: { authorRunId, from: path, to: corrected } });
|
|
2774
|
+
}
|
|
2775
|
+
return corrected;
|
|
2776
|
+
}
|
|
2501
2777
|
const matches = known.filter((candidate) => candidate.endsWith(`/${path}`) && valid(candidate, false));
|
|
2502
2778
|
return matches.length === 1 ? matches[0]! : null;
|
|
2503
2779
|
};
|
|
@@ -2514,7 +2790,7 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
|
|
|
2514
2790
|
for (const path of requestedTargets) {
|
|
2515
2791
|
const resolved = resolvePath(path, true);
|
|
2516
2792
|
if (resolved) addPath(resolved);
|
|
2517
|
-
else paths.push(`${paths.length + 1}. 미해석: ${path} — 요청에 선언된 대상 경로를 저장소 파일 또는 명시적 신설 파일로 확인하지 못함`);
|
|
2793
|
+
else if (!ambiguousPaths.has(path)) paths.push(`${paths.length + 1}. 미해석: ${path} — 요청에 선언된 대상 경로를 저장소 파일 또는 명시적 신설 파일로 확인하지 못함`);
|
|
2518
2794
|
}
|
|
2519
2795
|
for (const piece of unresolvedTargetPieces) {
|
|
2520
2796
|
paths.push(`${paths.length + 1}. 미해석: ${piece} — 요청에 선언된 대상 경로를 파싱하지 못함`);
|
|
@@ -2529,7 +2805,7 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
|
|
|
2529
2805
|
referenced.forEach((path, index) => {
|
|
2530
2806
|
const resolved = resolvePath(path);
|
|
2531
2807
|
if (resolved) addPath(resolved, index === 0 ? renderPersistentEvidence(item) : undefined);
|
|
2532
|
-
else paths.push(`${paths.length + 1}. 미해석: ${path} — ${renderPersistentEvidence(item)}`);
|
|
2808
|
+
else if (!ambiguousPaths.has(path)) paths.push(`${paths.length + 1}. 미해석: ${path} — ${renderPersistentEvidence(item)}`);
|
|
2533
2809
|
});
|
|
2534
2810
|
}
|
|
2535
2811
|
if (evidence.length === 0) paths.push(`- ${unavailableEvidence}`);
|
|
@@ -2844,13 +3120,24 @@ export function verificationBehaviour(checklist: readonly string[], ask: string)
|
|
|
2844
3120
|
function observedVerificationPlan(input: Omit<VerificationPlanInput, 'menu' | 'catalog'>, repositoryRoot: string | undefined, authorRunId: string): string[] {
|
|
2845
3121
|
try {
|
|
2846
3122
|
const plan = authorVerificationPlan({ ...input, ...readVerificationMenuDocs(repositoryRoot) });
|
|
3123
|
+
const device = inspectDeviceFirstGoal(input.ask, repositoryRoot);
|
|
3124
|
+
if (device.required) {
|
|
3125
|
+
try { debug.log('goal-author.verify', 'device-check', {
|
|
3126
|
+
authorRunId, device: device.device, exists: device.exists, inventoryMeasured: device.inventoryMeasured,
|
|
3127
|
+
firstSlice: device.firstSliceKind,
|
|
3128
|
+
}); } catch { /* observation is fail-soft */ }
|
|
3129
|
+
}
|
|
2847
3130
|
try {
|
|
2848
3131
|
observeGoalAuthor('goal-author', 'verification-plan', {
|
|
2849
3132
|
authorRunId, source: plan.stage.source, stageId: plan.stage.id, level: plan.stage.level,
|
|
2850
3133
|
menuPresent: plan.menuPresent, catalogPresent: plan.catalogPresent,
|
|
2851
3134
|
});
|
|
2852
3135
|
} catch { /* observation is fail-soft */ }
|
|
2853
|
-
return
|
|
3136
|
+
return device.required
|
|
3137
|
+
? [...plan.lines.slice(0, 3), device.inventoryMeasured
|
|
3138
|
+
? `- 쓸 장치: ${device.device} · ${device.exists ? '기존 장치' : '필요한 장치 · 없음 — 첫 조각에서 개발'}`
|
|
3139
|
+
: `- 장치 재고: 미측정(대상 루트 미상) · 후보: ${device.device}`, ...plan.lines.slice(3)]
|
|
3140
|
+
: plan.lines;
|
|
2854
3141
|
} catch (error) {
|
|
2855
3142
|
try { observeGoalAuthor('goal-author', 'verification-plan-failed', { authorRunId, error: error instanceof Error ? error.message : String(error) }); } catch { /* fail-soft */ }
|
|
2856
3143
|
return [VERIFICATION_PLAN_HEADING, '- UNVERIFIABLE: 검증 계획 저작이 실패했다 — 사람이 다섯 줄(동작·무대·RED·GREEN·배선)을 채운다.'];
|
|
@@ -5228,15 +5515,18 @@ function requiredEvidenceInformation(criteria: readonly CheckableCriterion[]): s
|
|
|
5228
5515
|
return [`${REQUIRED_EVIDENCE_ANNOTATION_PREFIX} acceptance-criterion evidence kinds: ${[...counts.entries()].map(([type, count]) => `${type} ${count}`).join(', ')}.`];
|
|
5229
5516
|
}
|
|
5230
5517
|
|
|
5231
|
-
function requiredEvidence(criteria: readonly CheckableCriterion[], targetPaths: readonly string[], authorRunId: string): string[] {
|
|
5518
|
+
function requiredEvidence(criteria: readonly CheckableCriterion[], targetPaths: readonly string[], authorRunId: string, repositoryRoot?: string): string[] {
|
|
5232
5519
|
const lines = [
|
|
5233
5520
|
...collapseEvidenceKinds(criteria).map(({ tag, evidence }) => `- [${tag}] ${evidence}`),
|
|
5234
5521
|
...requiredEvidenceInformation(criteria),
|
|
5235
5522
|
];
|
|
5236
|
-
const
|
|
5237
|
-
|
|
5238
|
-
|
|
5239
|
-
|
|
5523
|
+
const choices = targetPaths.map((path) => ({ path, sibling: siblingTestPath(path), selected: focusedEvidenceTestPath(path, repositoryRoot) }));
|
|
5524
|
+
const siblingTests = [...new Set(choices.flatMap(({ selected }) => selected ? [selected] : []))];
|
|
5525
|
+
const budgetDecisions = choices.filter(({ sibling, selected }) => sibling && sibling !== selected);
|
|
5526
|
+
if (budgetDecisions.length) {
|
|
5527
|
+
try { observeGoalAuthor('goal-author', 'required-evidence-command-budget', { authorRunId, decisions: budgetDecisions }); }
|
|
5528
|
+
catch { /* observation is fail-soft */ }
|
|
5529
|
+
}
|
|
5240
5530
|
const firstEvidenceLine = lines.findIndex((line) => line.startsWith('- ['));
|
|
5241
5531
|
const appendedSiblingTestCount = siblingTests.length && firstEvidenceLine >= 0 ? siblingTests.length : 0;
|
|
5242
5532
|
if (appendedSiblingTestCount) {
|
|
@@ -5396,7 +5686,7 @@ export async function authorGoal(ask: string, deps: GoalAuthorDeps): Promise<Aut
|
|
|
5396
5686
|
/** Internal-only path: the locked superseded document is the authoritative RootIntent source. */
|
|
5397
5687
|
async function authorGoalWithSupersededRootIntent(
|
|
5398
5688
|
ask: string,
|
|
5399
|
-
deps: GoalAuthorDeps & { supersessionRootIntent?: string; mandatoryGoalContextEvidence?: readonly string[] },
|
|
5689
|
+
deps: GoalAuthorDeps & { supersessionRootIntent?: string; mandatoryGoalContextEvidence?: readonly string[]; recordTracedPath?: (entry: TracedPathLedgerEvent) => void },
|
|
5400
5690
|
): Promise<AuthoredGoal> {
|
|
5401
5691
|
try {
|
|
5402
5692
|
const markerWarnings = formatEarlyMarkerWarnings(ask);
|
|
@@ -5436,18 +5726,32 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5436
5726
|
};
|
|
5437
5727
|
let facts: CodebaseGrounding | null = null;
|
|
5438
5728
|
let groundingError = false;
|
|
5729
|
+
let groundingTimebox: GoalAuthorGroundingTimebox | undefined;
|
|
5439
5730
|
if (!lite) {
|
|
5440
5731
|
const persistentGrounding = resolveGoalAuthorPersistentGrounding('persistentGrounding' in deps ? deps.persistentGrounding : undefined);
|
|
5441
5732
|
const groundStartedAt = startGoalAuthorPhase('ground', authorRunId, deps.onProgress);
|
|
5733
|
+
const timeboxBudgetMs = deps.groundTimeboxMs ?? GOAL_AUTHOR_GROUND_TIMEBOX_MS;
|
|
5442
5734
|
try {
|
|
5443
|
-
|
|
5735
|
+
const groundOutcome = await groundWithinTimebox(() => deps.ground(ask, persistentGrounding.deps), timeboxBudgetMs, groundStartedAt);
|
|
5736
|
+
if ('timebox' in groundOutcome) {
|
|
5737
|
+
// ⛔ `groundingError` 를 «안» 쓴다 — 접지가 던진 것과 예산 초과로 끊긴 것은 다른 사건이고,
|
|
5738
|
+
// 처방도 다르다(앞은 채널 복구, 뒤는 더 좁은 ask/재시도). 두 값을 한 칸에 접으면 못 가른다.
|
|
5739
|
+
groundingTimebox = groundOutcome.timebox;
|
|
5740
|
+
observeGoalAuthor('goal-author', 'ground-timebox-exceeded', {
|
|
5741
|
+
authorRunId,
|
|
5742
|
+
budgetMs: groundOutcome.timebox.budgetMs,
|
|
5743
|
+
elapsedMs: groundOutcome.timebox.elapsedMs,
|
|
5744
|
+
});
|
|
5745
|
+
} else {
|
|
5746
|
+
facts = groundOutcome.facts;
|
|
5747
|
+
}
|
|
5444
5748
|
} catch {
|
|
5445
5749
|
groundingError = true;
|
|
5446
5750
|
} finally {
|
|
5447
5751
|
endGoalAuthorPhase('ground', groundStartedAt, authorRunId, deps.onProgress);
|
|
5448
5752
|
observeGoalAuthorPersistentGroundingResult(
|
|
5449
5753
|
persistentGrounding.decision,
|
|
5450
|
-
goalAuthorPersistentGroundingMetrics(facts, groundingError, authorRunId),
|
|
5754
|
+
goalAuthorPersistentGroundingMetrics(facts, groundingError, authorRunId, groundingTimebox !== undefined),
|
|
5451
5755
|
);
|
|
5452
5756
|
}
|
|
5453
5757
|
}
|
|
@@ -5577,7 +5881,12 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5577
5881
|
const goalType = deps.goalType ?? 'implement';
|
|
5578
5882
|
const evidenceProblem = hasEvidence
|
|
5579
5883
|
? groundedProblem(facts!, goalType === 'implement')
|
|
5580
|
-
: [
|
|
5884
|
+
: [
|
|
5885
|
+
groundingTimebox === undefined
|
|
5886
|
+
? `- Not grounded: grounding ${groundingError ? 'failed' : 'found no repository facts'}; the repository problem is unverified and no file path or symbol is asserted.`
|
|
5887
|
+
: `- Not grounded: grounding was stopped after exceeding its ${groundingTimebox.budgetMs}ms budget (elapsed ${groundingTimebox.elapsedMs}ms); the repository problem is unverified and no file path or symbol is asserted.`,
|
|
5888
|
+
...(groundingTimebox === undefined ? [] : [groundingTimeboxNotice(groundingTimebox)]),
|
|
5889
|
+
];
|
|
5581
5890
|
if (hasEvidence) {
|
|
5582
5891
|
observeProblemBackgroundEvidence(facts!, authorRunId);
|
|
5583
5892
|
observePersistentEvidenceSourceKinds(facts!, authorRunId);
|
|
@@ -5671,7 +5980,12 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5671
5980
|
const startedAt = Date.now();
|
|
5672
5981
|
let failed = false;
|
|
5673
5982
|
try {
|
|
5674
|
-
const
|
|
5983
|
+
const device = inspectDeviceFirstGoal(ask, deps.repositoryRoot);
|
|
5984
|
+
const deviceInventory = device.required && device.inventoryMeasured
|
|
5985
|
+
? [device.exists ? `existing: ${device.device}` : `missing: ${device.device}`] : undefined;
|
|
5986
|
+
const context = [facts?.context, deviceInventory?.length ? `Device inventory (measured at goal-author repository root): ${deviceInventory.join(', ')}` : undefined]
|
|
5987
|
+
.filter(Boolean).join('\n') || undefined;
|
|
5988
|
+
const decomposed = await deps.decomposeSteps(ask, { context, runId: process.env.ELANOUS_RUN_ID?.trim() || authorRunId });
|
|
5675
5989
|
if (decomposed.length > 0) resolvedSteps = decomposed;
|
|
5676
5990
|
} catch {
|
|
5677
5991
|
failed = true;
|
|
@@ -5688,6 +6002,14 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5688
6002
|
} catch { /* observation is fail-soft */ }
|
|
5689
6003
|
}
|
|
5690
6004
|
}
|
|
6005
|
+
if (goalType === 'implement' && resolvedSteps?.length) {
|
|
6006
|
+
// ⭐ must-fix — 경계 분기가 내준 «접힌» step 은 장치 RED 가 «같은 런의 첫 동작» 으로 이미 들어 있다.
|
|
6007
|
+
// 다시 staging 하면 «운영 코드 변경 0» 장치 조각이 step 앞에 이중으로 끼워져 모순 문면이 된다.
|
|
6008
|
+
const foldedBoundaryStep = resolvedSteps.length === 1
|
|
6009
|
+
&& resolvedSteps[0]!.includes(COMPLETION_BOUNDARY_STEP_PREFIX)
|
|
6010
|
+
&& resolvedSteps[0]!.includes(FOLDED_DEVICE_FIRST_ACTION_MARKER);
|
|
6011
|
+
if (!foldedBoundaryStep) resolvedSteps = ensureDeviceFirstSteps(ask, resolvedSteps, deps.repositoryRoot).steps;
|
|
6012
|
+
}
|
|
5691
6013
|
const explicitGoalTitle = deps.goalTitle === undefined ? undefined : validGoalSummary(deps.goalTitle);
|
|
5692
6014
|
if (deps.goalTitle !== undefined && !explicitGoalTitle) throw new Error('goalTitle must contain non-whitespace text');
|
|
5693
6015
|
endAssembleSubphase();
|
|
@@ -5936,6 +6258,14 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5936
6258
|
} catch { /* 관측은 fail-soft */ }
|
|
5937
6259
|
endAssembleSubphase();
|
|
5938
6260
|
startAssembleSubphase('assemble-document');
|
|
6261
|
+
// ⭐ GROUNDING-PERSISTENT-EMPTY-REPAIR 4/7 — TRACED PATHS 최종 행을 문서 조립 전에 한 번 확정해,
|
|
6262
|
+
// persistent 채널이 비어 있으면 구조화 사유·final traced count·출처를 관측 원장에 남긴다(launch-preflight 소비).
|
|
6263
|
+
// ⊕ `tracedPathsSection` 은 구현 골에서만 존재하므로 관측도 `goalType === 'implement'` 일 때만 한다는
|
|
6264
|
+
// 인과 서술(모든 근거 줄이 Read 안 한 경로 인용으로 기각됐다)을 비구현 골에 기록하지 않는다.
|
|
6265
|
+
const tracedPathsForDocument = goalType === 'implement'
|
|
6266
|
+
? tracedPathsSection(facts, ask, deps.repositoryRoot, narrative.tracedPathsUnavailableEvidence, authorRunId, deps.recordTracedPath)
|
|
6267
|
+
: [];
|
|
6268
|
+
if (goalType === 'implement') observeEmptyPersistentEvidence(facts, tracedPathsForDocument, authorRunId);
|
|
5939
6269
|
const document = [
|
|
5940
6270
|
explicitGoalTitle ?? goalSummary(enhancement.original),
|
|
5941
6271
|
`- GoalId: ${assignedGoalId}`,
|
|
@@ -5986,9 +6316,9 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5986
6316
|
...preservationAmbiguityClarification(clarificationQuestions, clarificationResponses),
|
|
5987
6317
|
'',
|
|
5988
6318
|
'## REQUIRED EVIDENCE',
|
|
5989
|
-
...requiredEvidence(criteria, facts ? implementationCandidates(facts) : [], authorRunId),
|
|
6319
|
+
...requiredEvidence(criteria, facts ? implementationCandidates(facts) : [], authorRunId, deps.repositoryRoot),
|
|
5990
6320
|
'',
|
|
5991
|
-
...(goalType === 'implement' ? ['## TRACED PATHS', ...
|
|
6321
|
+
...(goalType === 'implement' ? ['## TRACED PATHS', ...tracedPathsForDocument, ''] : []),
|
|
5992
6322
|
'## SCOPE BOUNDARY',
|
|
5993
6323
|
...scopeBoundarySection,
|
|
5994
6324
|
'',
|
|
@@ -6044,7 +6374,7 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6044
6374
|
} catch { /* observation is fail-soft */ }
|
|
6045
6375
|
}
|
|
6046
6376
|
}
|
|
6047
|
-
return { document, facts, grounded: !groundingError && hasEvidence, authorRunId };
|
|
6377
|
+
return { document, facts, grounded: !groundingError && hasEvidence, authorRunId, ...(groundingTimebox === undefined ? {} : { groundingTimebox }) };
|
|
6048
6378
|
} finally {
|
|
6049
6379
|
endAssembleSubphase();
|
|
6050
6380
|
if (!assembleCompleted) endGoalAuthorPhase('assemble', assembleStartedAt, authorRunId, deps.onProgress);
|
|
@@ -6256,11 +6586,14 @@ export async function writeAuthoredGoal(
|
|
|
6256
6586
|
if (backlinkCount > 1) throw new Error('superseded goal file has duplicate Superseded-By');
|
|
6257
6587
|
if (backlinkCount === 1) throw new Error('superseded goal file already has Superseded-By');
|
|
6258
6588
|
}
|
|
6589
|
+
const tracedPathEvents: TracedPathLedgerEvent[] = [];
|
|
6590
|
+
const recordTracedPath = (entry: TracedPathLedgerEvent): void => { tracedPathEvents.push(entry); };
|
|
6259
6591
|
const authored = await authorGoalWithSupersededRootIntent(ask, supersededDocument === undefined
|
|
6260
|
-
? { ...resolvedDeps, mandatoryGoalContextEvidence }
|
|
6592
|
+
? { ...resolvedDeps, mandatoryGoalContextEvidence, recordTracedPath }
|
|
6261
6593
|
: {
|
|
6262
6594
|
...resolvedDeps,
|
|
6263
6595
|
mandatoryGoalContextEvidence,
|
|
6596
|
+
recordTracedPath,
|
|
6264
6597
|
...(supersededGoalId && { goalId: supersededGoalId }),
|
|
6265
6598
|
...(supersededRootIntent !== null && { supersessionRootIntent: supersededRootIntent }),
|
|
6266
6599
|
});
|
|
@@ -6306,6 +6639,13 @@ export async function writeAuthoredGoal(
|
|
|
6306
6639
|
if (!path) throw new Error(`goal author could not find a free filename after ${MAX_COLLISION_RETRIES} attempts for ${base}`);
|
|
6307
6640
|
observeAuthoredConstraintMarkers(ask, authored.document, authored.authorRunId);
|
|
6308
6641
|
observeAuthoredGroundingPathSections(authored.document, authored.facts?.files ?? [], authored.authorRunId);
|
|
6642
|
+
if (tracedPathEvents.length > 0) {
|
|
6643
|
+
const { appendRunLedgerEntry, runLedgerDir } = await import('./run-ledger.js');
|
|
6644
|
+
const ledgerDir = runLedgerDir();
|
|
6645
|
+
const goalId = parseGoalId(authored.document) ?? undefined;
|
|
6646
|
+
for (const entry of tracedPathEvents) appendRunLedgerEntry({ runId: authored.authorRunId, goalId, ...entry }, ledgerDir);
|
|
6647
|
+
appendRunLedgerEntry({ runId: authored.authorRunId, goalId, event: 'traced-path-continued', data: { authorRunId: authored.authorRunId, goalFile: path, corrected: tracedPathEvents.filter((entry) => entry.event === 'traced-path-correction').length, skipped: tracedPathEvents.filter((entry) => entry.event === 'traced-path-warning').length } }, ledgerDir);
|
|
6648
|
+
}
|
|
6309
6649
|
if (!canonicalSupersededPath || !supersededDocument) return { path, authored };
|
|
6310
6650
|
|
|
6311
6651
|
const rewrite = fileDeps.rewrite ?? ((sourcePath: string, document: string) => atomicRewrite(sourcePath, document, fileDeps.rename));
|