elanous 0.2.37 → 0.2.40
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/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 1060.014f1f01a17aec26.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 1281.d81877e35b9068f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
- package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{3578.4e9f9948a9a6f2f4.js → 2047.8f23e210995d4548.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 2066.a77257c8c350770a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 2177.df8547f9d7215c4e.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 2226.2cf61ec781827219.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 2522.f2766b76d22c8bdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +226 -0
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2318-450e75d07605b8fe.js → 2774-719820e3f5b2a3eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4725-34bed25720cc326b.js → 2829-734fe8bf2eee7347.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3330.7443183b7e6fdbdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3746-f80a78f220bf37b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 409c787b.e48c5bec8ec10456.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 470.51a72a2348306455.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 4769.9fd582071301f382.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 5383.bdfa5d886e39a826.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5436.fdf6fa8ae3e9588d.js +64 -0
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 6051-0ae955eedb10adb9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 6257.c0037b8949239f5e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 6749.0744ce6eb08d40e9.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +148 -0
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 8272-025653884f9645d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 8357.1aaa713b052a78b1.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4313.76f232c304a15bde.js → 9175.2de5209a5ce6f68a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → 9189505a.980427ac048c8c60.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/{page-3337c6a1328c2674.js → page-4edb8df90f4537ce.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-1e5da297557d2354.js → page-fca2e59a81744d9e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-ac2c1e6169cfce57.js → page-139d722de1dcd6c1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-c1c80e345fa9d6f5.js → page-ccde99f07aaf71f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b84cad00.594027ebe0531fe2.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → ca3702f8.2913182e73889fa2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -0
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/graphs/video/explainer-line.yaml +4 -1
- package/package.json +1 -1
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/dead-code/report.ts +169 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +39 -0
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/morning-report.ts +5 -1
- package/scripts/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +77 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-node.ts +527 -60
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +317 -13
- package/scripts/release-loop/resume.ts +61 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +35 -5
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/tui-regress.ts +85 -10
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/core-turn-bridge.ts +14 -1
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/run-context.ts +1 -1
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +78 -7
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +419 -42
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +156 -0
- package/src/auto-research/research-turn.ts +467 -0
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +270 -2
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/bots/screen-probe.ts +1 -1
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +24 -2
- package/src/chat/index.ts +34 -7
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +70 -13
- package/src/cli/lesson-cli.ts +86 -10
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +125 -12
- package/src/cli/release-checklist-read-cli.ts +5 -2
- package/src/cli/release-cli.ts +99 -15
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +1 -1
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +98 -32
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/context-bus/context-now.ts +86 -2
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +51 -3
- package/src/core-turn/run-goal-loop.ts +152 -8
- package/src/core-turn/types.ts +12 -0
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +339 -44
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +22 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +18 -18
- package/src/dashboard/turn-preamble.ts +30 -4
- package/src/domains/guardian-tick.ts +9 -0
- package/src/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +6 -4
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/runner.ts +48 -11
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +112 -36
- package/src/grounding/ref-index.ts +11 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +2 -2
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +38 -9
- package/src/harness/harness-pod-dispatch.ts +7 -1
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +60 -16
- package/src/input/external-input-queue.ts +10 -0
- package/src/intake-plane/collect-telegram-saved.ts +90 -6
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm-tool-schema.ts +20 -0
- package/src/llm.ts +486 -61
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +14 -3
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/patents/ledger.ts +18 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +5 -0
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +75 -5
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +13 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +28 -1
- package/src/repl/index.ts +10 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +197 -0
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/output-router.ts +127 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +45 -7
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +34 -106
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-cli.ts +2 -0
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +29 -16
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +38 -7
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/run-supervisor.ts +41 -7
- package/src/self-dev/shard-run.ts +260 -3
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +100 -57
- package/src/self-implement/gate-artifacts.ts +5 -2
- package/src/self-implement/gate-baseline.ts +119 -13
- package/src/self-implement/gate-cli.ts +466 -93
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +147 -22
- package/src/self-implement/goal-author-clarification.ts +178 -24
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +82 -7
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +38 -4
- package/src/self-implement/host-regate.ts +120 -45
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +301 -9
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +147 -0
- package/src/self-implement/orchestrator.ts +137 -16
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/run-ledger.ts +304 -8
- package/src/self-implement/run-stop.ts +12 -0
- package/src/self-implement/seams.ts +39 -13
- package/src/self-implement/self-implement-cli.ts +30 -4
- package/src/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +92 -15
- package/src/session/index.ts +2 -0
- package/src/session-runtime/index.ts +9 -22
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +176 -0
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/schedule-wakeup.ts +24 -7
- package/src/skills/tools/shell.ts +51 -5
- package/src/status/bar.ts +3 -3
- package/src/steward/directive-audit.ts +354 -0
- package/src/storage/file-lock.ts +17 -4
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/parent-host.ts +59 -12
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +68 -9
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/task-hand.ts +226 -33
- package/src/task-agent/tier-split.ts +142 -24
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +57 -5
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +310 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/entry.ts +483 -32
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +2 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +3 -23
- package/src/tui/slash/term-next.ts +2 -1
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +7 -1
- package/src/tui-client/local-chat-turn.ts +29 -8
- package/src/user-config.ts +42 -3
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- package/src/ux-sim/fake-llm.ts +11 -5
- package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +61 -14
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +0 -62
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +0 -1
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
- package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
|
@@ -442,6 +442,24 @@ function isRawSubtask(value: unknown): value is RawSubtask {
|
|
|
442
442
|
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
443
443
|
}
|
|
444
444
|
|
|
445
|
+
function ensureSingleCompletionCriterion(feature: string, targetPaths: string[]): string {
|
|
446
|
+
const lines = feature.split(/\r?\n/);
|
|
447
|
+
const criteria = lines.filter((line) => /^\s*완료 기준\s*:/.test(line));
|
|
448
|
+
if (criteria.length === 0) {
|
|
449
|
+
return `${feature}\n완료 기준: ${targetPaths.join(' · ')}의 변경을 확인하고 관련 시험을 통과한다.`;
|
|
450
|
+
}
|
|
451
|
+
if (criteria.length === 1 && criteria[0]!.trim().length > '완료 기준:'.length) return feature;
|
|
452
|
+
const criterionText = criteria
|
|
453
|
+
.map((line) => line.replace(/^\s*완료 기준\s*:\s*/, '').trim())
|
|
454
|
+
.filter(Boolean)
|
|
455
|
+
.join(' · ');
|
|
456
|
+
const normalizedCriterion = criterionText || `${targetPaths.join(' · ')}의 변경을 확인하고 관련 시험을 통과한다.`;
|
|
457
|
+
const firstCriterionIndex = lines.findIndex((line) => /^\s*완료 기준\s*:/.test(line));
|
|
458
|
+
const withoutCriteria = lines.filter((line) => !/^\s*완료 기준\s*:/.test(line));
|
|
459
|
+
withoutCriteria.splice(Math.min(firstCriterionIndex, withoutCriteria.length), 0, `완료 기준: ${normalizedCriterion}`);
|
|
460
|
+
return withoutCriteria.join('\n');
|
|
461
|
+
}
|
|
462
|
+
|
|
445
463
|
/**
|
|
446
464
|
* G6 (1c) — 결정론적 hotPaths 추론. 분해된 sub-goal 의 feature 텍스트에서 repo 파일
|
|
447
465
|
* 경로(src/…·docs/…·scripts/… + 확장자)를 뽑는다. LLM 이 hotPaths 를 안 채워도 hot-file
|
|
@@ -476,7 +494,8 @@ export function inheritDecomposedTargetPaths(parentFeature: string, goals: SelfD
|
|
|
476
494
|
? own[index]!
|
|
477
495
|
: (goal.hotPaths ?? []).filter((path) => parentTargets.includes(path)));
|
|
478
496
|
const claimedOwners = parentTargets.map((path) => goals.flatMap((_, index) => claims[index]!.includes(path) ? [index] : []));
|
|
479
|
-
const
|
|
497
|
+
const sharedExplicitTarget = own.length === 2 && own[0]!.some((path) => own[1]!.includes(path));
|
|
498
|
+
const conflictingClaims = sharedExplicitTarget || claimedOwners.some((indices) => indices.length > 1);
|
|
480
499
|
const nameOwners = parentTargets.map((path) => {
|
|
481
500
|
const stemWords = path.split('/').at(-1)!.replace(/\.[^.]+$/, '').toLowerCase().match(/[a-z0-9]+/g) ?? [];
|
|
482
501
|
if (!stemWords.length || stemWords.join('').length < 4) return [];
|
|
@@ -507,24 +526,41 @@ export function inheritDecomposedTargetPaths(parentFeature: string, goals: SelfD
|
|
|
507
526
|
// A named path wins over model order; if every path points at one child,
|
|
508
527
|
// keep the old scope rather than inventing work for the other child.
|
|
509
528
|
const partitions = goals.map((_, index) => parentTargets.filter((_, pathIndex) => owners[pathIndex] === index));
|
|
510
|
-
const sharedOtherPaths = (goals[0]?.hotPaths ?? []).some((path) =>
|
|
511
|
-
!parentTargets.includes(path) && (goals[1]?.hotPaths ?? []).includes(path));
|
|
512
529
|
const conflictingParentReference = goals.some((goal, index) =>
|
|
513
530
|
own[index]!.length > 0 && (goal.hotPaths ?? []).some((path) =>
|
|
514
531
|
parentTargets.includes(path) && !own[index]!.includes(path)));
|
|
515
532
|
if (partitions.every((paths) => paths.length > 0)
|
|
516
533
|
&& !conflictingClaims && !ambiguousName && !conflictingNameClaim && !conflictingUnclaimedHint
|
|
517
|
-
&& !
|
|
534
|
+
&& !conflictingParentReference) return goals.map((goal, index) => {
|
|
518
535
|
const targets = partitions[index]!;
|
|
519
|
-
|
|
520
|
-
|
|
536
|
+
// A declared child target may add a helper outside the parent fence. Bare
|
|
537
|
+
// hotPaths outside that fence are references, so do not widen the write fence.
|
|
538
|
+
const explicitHelpers = own[index]!.filter((path) => !parentTargets.includes(path));
|
|
539
|
+
const feature = `${goal.feature}${own[index]!.length ? '' : `\n대상 경로: ${targets.join(' · ')}`}`;
|
|
540
|
+
return { ...goal, hotPaths: [...new Set([...targets, ...explicitHelpers])],
|
|
541
|
+
feature: ensureSingleCompletionCriterion(feature, targets) };
|
|
521
542
|
});
|
|
522
543
|
}
|
|
523
544
|
}
|
|
524
|
-
|
|
545
|
+
const explicitChildTargets = goals.map((goal) => declaredTargets(goal.feature ?? ''));
|
|
546
|
+
const explicitParentTargets = explicitChildTargets.map((paths) => paths.filter((path) => parentTargets.includes(path)));
|
|
547
|
+
const explicitTargetsArePartition = goals.length === 2
|
|
548
|
+
&& explicitParentTargets.every((paths) => paths.length > 0)
|
|
549
|
+
&& new Set(explicitChildTargets.flat()).size === explicitChildTargets.flat().length
|
|
550
|
+
&& explicitParentTargets[0]!.every((path) => !explicitParentTargets[1]!.includes(path))
|
|
551
|
+
&& new Set(explicitParentTargets.flat()).size === parentTargets.length
|
|
552
|
+
&& parentTargets.every((path) => explicitParentTargets.flat().includes(path))
|
|
553
|
+
&& goals.every((goal, index) => (goal.hotPaths ?? []).every((path) =>
|
|
554
|
+
!parentTargets.includes(path) || explicitChildTargets[index]!.includes(path)));
|
|
555
|
+
return goals.map((goal, index) => {
|
|
525
556
|
// hotPaths also contains inferred references; only an explicit target line establishes child scope.
|
|
526
|
-
const own =
|
|
527
|
-
if (own.length)
|
|
557
|
+
const own = explicitChildTargets[index]!;
|
|
558
|
+
if (own.length) {
|
|
559
|
+
if (explicitTargetsArePartition) {
|
|
560
|
+
return { ...goal, hotPaths: own, feature: ensureSingleCompletionCriterion(goal.feature ?? '', own) };
|
|
561
|
+
}
|
|
562
|
+
return goal;
|
|
563
|
+
}
|
|
528
564
|
return { ...goal, hotPaths: [...new Set([...(goal.hotPaths ?? []), ...parentTargets])],
|
|
529
565
|
feature: `${goal.feature}\n대상 경로: ${parentTargets.join(' · ')}` };
|
|
530
566
|
});
|
package/src/self-dev/dev-cli.ts
CHANGED
|
@@ -1113,6 +1113,8 @@ export async function executeDevSelfRun(
|
|
|
1113
1113
|
}
|
|
1114
1114
|
await superviseRun({
|
|
1115
1115
|
initial: [initialJob],
|
|
1116
|
+
// Pod worktree paths are not necessarily mounted in this parent process.
|
|
1117
|
+
knowhowRepo: process.cwd(),
|
|
1116
1118
|
// A review-oscillation repair goal runs through the existing piece executor (fragment re-execution with the
|
|
1117
1119
|
// authored goal as its feature). Without that executor the rerun could only replay the same goal — declare false.
|
|
1118
1120
|
repairGoalExecution: supervise.executePiece !== undefined,
|
|
@@ -709,16 +709,16 @@ export function buildAgentMissionDevSpec(o: {
|
|
|
709
709
|
export async function executeAgentMissionReroute(
|
|
710
710
|
spec: DevPipelineSpec,
|
|
711
711
|
agentBackend: AgentBackend,
|
|
712
|
-
deps?: { runDevPipeline?: typeof runDevPipeline },
|
|
712
|
+
deps?: { runDevPipeline?: typeof runDevPipeline; signal?: AbortSignal },
|
|
713
713
|
): Promise<{ result: AgentMissionResult; exitCode: number }> {
|
|
714
714
|
const run = deps?.runDevPipeline ?? runDevPipeline;
|
|
715
|
-
const r = await run(spec, { resolveBackend: () => agentBackend });
|
|
715
|
+
const r = await run(spec, { resolveBackend: () => agentBackend, ...(deps?.signal ? { signal: deps.signal } : {}) });
|
|
716
716
|
// ★ 잘못된 라우팅 즉시 표면화 — spec 이 external+pty 가 아니면 kind 불일치(무조건 캐스팅 금지).
|
|
717
717
|
if (r.kind !== 'agent-mission') {
|
|
718
718
|
throw new DevPipelineError(`executeAgentMissionReroute: 예상 밖 dispatch(kind=${r.kind}) — external+pty spec 이어야`);
|
|
719
719
|
}
|
|
720
720
|
const result = r.result;
|
|
721
|
-
return { result, exitCode: result.ok ? 0 : 2 };
|
|
721
|
+
return { result, exitCode: result.reason === 'aborted' ? 130 : result.ok ? 0 : 2 };
|
|
722
722
|
}
|
|
723
723
|
|
|
724
724
|
// ── U4b: self implement 재라우팅 seam(테스트 가능) ──
|
|
@@ -2234,6 +2234,7 @@ async function runDevPipelineDispatch(
|
|
|
2234
2234
|
const result = await run({
|
|
2235
2235
|
...toSelfImplementOptions(text, plan, seams),
|
|
2236
2236
|
...(spec.runId ? { runId: spec.runId } : {}),
|
|
2237
|
+
...(deps.signal ? { signal: deps.signal } : {}),
|
|
2237
2238
|
onNodeEntry: (node, round) => { walk.push({ node, round }); },
|
|
2238
2239
|
});
|
|
2239
2240
|
// ⛔ 「걸음이 비었다」와 「안 걸었다」를 가른다 — 빈 배열은 «싣지 않는다».
|
|
@@ -2252,5 +2253,8 @@ async function runDevPipelineDispatch(
|
|
|
2252
2253
|
// agent-mission-pty
|
|
2253
2254
|
const run = deps.runAgentMission ?? (await import('../agent-mission/driver.js')).runAgentMission;
|
|
2254
2255
|
const resolveBackend = deps.resolveBackend ?? (await import('../agent-mission/driver.js')).resolveBackend;
|
|
2255
|
-
return { plan, kind: 'agent-mission', result: await run(
|
|
2256
|
+
return { plan, kind: 'agent-mission', result: await run({
|
|
2257
|
+
...toAgentMissionSpec(text, plan, resolveBackend),
|
|
2258
|
+
...(deps.signal ? { signal: deps.signal } : {}),
|
|
2259
|
+
}) };
|
|
2256
2260
|
}
|
|
@@ -126,6 +126,8 @@ export interface DraftResidueAdapters {
|
|
|
126
126
|
setLabels(repository: string, number: number, change: { add: string; remove: readonly string[] }): Promise<void> | void;
|
|
127
127
|
comment(repository: string, number: number, body: string): Promise<void> | void;
|
|
128
128
|
closePr(repository: string, number: number): Promise<void> | void;
|
|
129
|
+
/** Persist the existing `수확보류: harvest-deferred` PR-body marker after a verified close. */
|
|
130
|
+
editBody(repository: string, number: number, body: string): Promise<void> | void;
|
|
129
131
|
/** Undefined means liveness could not be established, not that no branch is live. */
|
|
130
132
|
listLiveBranches(repository: string): Promise<ReadonlySet<string> | undefined> | ReadonlySet<string> | undefined;
|
|
131
133
|
/** Undefined means the prior run could not be identified as ended. */
|
|
@@ -133,11 +135,22 @@ export interface DraftResidueAdapters {
|
|
|
133
135
|
}
|
|
134
136
|
/** One close budget shared by every terminal replayed in a tick and the draft sweep that follows. */
|
|
135
137
|
export interface DraftCloseBudget { remaining: number }
|
|
138
|
+
export type HarvestExistingPr = { number: number; url?: string; labels?: readonly string[] };
|
|
139
|
+
/** Injectable remote-branch / same-branch-PR / draft-create seams for timed-out-harvestable. */
|
|
140
|
+
export interface HarvestableDraftAdapters {
|
|
141
|
+
/** Override host repository for harvest lookups and creates. */
|
|
142
|
+
repository?: string;
|
|
143
|
+
remoteBranchExists(repository: string, branch: string): Promise<boolean | undefined> | boolean | undefined;
|
|
144
|
+
findExistingPr(repository: string, branch: string): Promise<HarvestExistingPr | null | undefined> | HarvestExistingPr | null | undefined;
|
|
145
|
+
createDraftPr(repository: string, branch: string): Promise<HarvestExistingPr> | HarvestExistingPr;
|
|
146
|
+
addHarvestableLabel(repository: string, number: number): Promise<void> | void;
|
|
147
|
+
}
|
|
136
148
|
export interface DraftResidueContext {
|
|
137
149
|
ledgerRunId: string;
|
|
138
150
|
ledgerDir: string;
|
|
139
151
|
adapters?: DraftResidueAdapters;
|
|
140
152
|
closeBudget?: DraftCloseBudget;
|
|
153
|
+
harvest?: HarvestableDraftAdapters;
|
|
141
154
|
}
|
|
142
155
|
export type DraftResidueResult = { status: 'recorded' | 'skipped' | 'failed'; reason?: string; step?: string };
|
|
143
156
|
|
|
@@ -253,6 +266,7 @@ export function defaultAdapters(sources: ResidueRunStatusSources = defaultRunSta
|
|
|
253
266
|
},
|
|
254
267
|
comment: (repository, number, body) => { gh(['pr', 'comment', String(number), '-R', repository, '--body', body]); },
|
|
255
268
|
closePr: (repository, number) => { gh(['pr', 'close', String(number), '-R', repository]); },
|
|
269
|
+
editBody: (repository, number, body) => { gh(['pr', 'edit', String(number), '-R', repository, '--body', body]); },
|
|
256
270
|
listLiveBranches: (repository) => {
|
|
257
271
|
if (repository.toLowerCase() !== hostRepository()?.toLowerCase()) return undefined;
|
|
258
272
|
const root = findGitDir(process.cwd())?.root;
|
|
@@ -297,6 +311,117 @@ function hostRepository(): string | null {
|
|
|
297
311
|
return match?.[1] ?? null;
|
|
298
312
|
}
|
|
299
313
|
|
|
314
|
+
function harvestBranchOk(branch: string): boolean {
|
|
315
|
+
return /^[A-Za-z0-9._/-]+$/.test(branch) && !branch.includes('..');
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/** Production harvest seams: remote branch via `git ls-remote --exit-code`, same-branch PR via `gh pr list --head`, draft via `gh pr create --draft`. */
|
|
319
|
+
export function defaultHarvestAdapters(record?: PrTerminalRecord): HarvestableDraftAdapters {
|
|
320
|
+
return {
|
|
321
|
+
remoteBranchExists: (repository, branch) => {
|
|
322
|
+
if (!harvestBranchOk(branch) || !/^[\w.-]+\/[\w.-]+$/.test(repository)) return undefined;
|
|
323
|
+
const root = findGitDir(process.cwd())?.root;
|
|
324
|
+
const remote = `https://github.com/${repository}.git`;
|
|
325
|
+
const result = spawnSync('git', ['ls-remote', '--exit-code', remote, `refs/heads/${branch}`], {
|
|
326
|
+
cwd: root ?? process.cwd(), encoding: 'utf8', timeout: 10_000,
|
|
327
|
+
});
|
|
328
|
+
if (result.status === 0) return true;
|
|
329
|
+
if (result.status === 2) return false;
|
|
330
|
+
return undefined;
|
|
331
|
+
},
|
|
332
|
+
findExistingPr: (repository, branch) => {
|
|
333
|
+
if (!harvestBranchOk(branch) || !/^[\w.-]+\/[\w.-]+$/.test(repository)) return undefined;
|
|
334
|
+
try {
|
|
335
|
+
const rows: unknown = JSON.parse(gh(['pr', 'list', '-R', repository, '--state', 'open', '--head', branch,
|
|
336
|
+
'--json', 'number,url,labels,headRefName', '--limit', '100']));
|
|
337
|
+
if (!Array.isArray(rows)) return undefined;
|
|
338
|
+
const matching = rows.filter((row): row is { number: number; url?: string; headRefName: string; labels?: Array<{ name: string } | string> } =>
|
|
339
|
+
!!row && typeof row === 'object' && typeof (row as { headRefName?: unknown }).headRefName === 'string'
|
|
340
|
+
&& (row as { headRefName: string }).headRefName === branch
|
|
341
|
+
&& typeof (row as { number?: unknown }).number === 'number'
|
|
342
|
+
&& Number.isSafeInteger((row as { number: number }).number) && (row as { number: number }).number > 0);
|
|
343
|
+
if (matching.length === 0) return null;
|
|
344
|
+
if (matching.length !== 1) return undefined;
|
|
345
|
+
const row = matching[0]!;
|
|
346
|
+
const labels = (row.labels ?? []).map((label) => typeof label === 'string' ? label : label.name).filter((name): name is string => typeof name === 'string');
|
|
347
|
+
return { number: row.number, url: typeof row.url === 'string' ? row.url : undefined, labels };
|
|
348
|
+
} catch {
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
},
|
|
352
|
+
createDraftPr: (repository, branch) => {
|
|
353
|
+
const title = `Harvest timed-out ${record?.childRunId ?? branch}`;
|
|
354
|
+
const body = `Draft residue: timed-out-harvestable · owner=${record?.owner ?? 'unknown'}(${record?.ownerSource ?? 'unknown'}) · run=${record?.childRunId ?? 'unobserved'} · branch=${branch}`;
|
|
355
|
+
const out = gh(['pr', 'create', '-R', repository, '--head', branch, '--draft', '--title', title, '--body', body]);
|
|
356
|
+
const match = /https:\/\/github\.com\/([\w.-]+\/[\w.-]+)\/pull\/(\d+)/.exec(out);
|
|
357
|
+
if (!match || match[1]!.toLowerCase() !== repository.toLowerCase()) throw new Error('draft-create-unobserved');
|
|
358
|
+
return { number: Number(match[2]), url: match[0] };
|
|
359
|
+
},
|
|
360
|
+
addHarvestableLabel: (repository, number) => { gh(['pr', 'edit', String(number), '-R', repository, '--add-label', harvestable]); },
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/** Open one draft PR for a timed-out-harvestable terminal when the remote branch exists and no same-branch PR is open. */
|
|
365
|
+
export async function harvestHarvestableDrafts(record: PrTerminalRecord, ctx: DraftResidueContext): Promise<DraftResidueResult> {
|
|
366
|
+
const adapters = ctx.adapters ?? defaultAdapters();
|
|
367
|
+
const harvest = ctx.harvest ?? defaultHarvestAdapters(record);
|
|
368
|
+
const fields = { childRunId: record.childRunId, prNumber: record.prNumber, terminalClass: record.terminalClass, owner: record.owner, ownerSource: record.ownerSource };
|
|
369
|
+
const log = (event: string, data: Record<string, unknown> = {}) => debug.log('draft.residue', event, { ...fields, ...data });
|
|
370
|
+
const skipped = (reason: string): DraftResidueResult => { log('skipped', { reason }); return { status: 'skipped', reason }; };
|
|
371
|
+
let step = 'ledger';
|
|
372
|
+
try {
|
|
373
|
+
if (record.terminalClass !== 'timed-out-harvestable') return skipped(record.terminalClass);
|
|
374
|
+
const branch = typeof record.branch === 'string' && record.branch.trim() ? record.branch.trim() : null;
|
|
375
|
+
if (!branch) return skipped('missing-branch');
|
|
376
|
+
const repository = harvest.repository ?? record.repository ?? hostRepository();
|
|
377
|
+
if (!repository) return skipped('host-repository-unobserved');
|
|
378
|
+
const ledger = adapters.loadLedger(ctx.ledgerRunId, ctx.ledgerDir);
|
|
379
|
+
if (ledger === undefined) throw new Error('Terminal ledger unavailable');
|
|
380
|
+
const rows = (ledger ?? []).filter((entry) => entry.data.childRunId === record.childRunId);
|
|
381
|
+
const completed = (effect: string, number: number): boolean => rows.some((entry) => entry.event === 'pr-terminal-effect'
|
|
382
|
+
&& entry.data.effect === effect && entry.data.number === number);
|
|
383
|
+
const acknowledge = (effect: string, number: number): void => {
|
|
384
|
+
adapters.appendLedger({ runId: ctx.ledgerRunId, event: 'pr-terminal-effect', data: { childRunId: record.childRunId, effect, number } }, ctx.ledgerDir);
|
|
385
|
+
};
|
|
386
|
+
if (completed('complete', 0) || completed('complete', record.prNumber ?? 0)) return skipped('already-recorded');
|
|
387
|
+
step = 'remote-branch';
|
|
388
|
+
const exists = await harvest.remoteBranchExists(repository, branch);
|
|
389
|
+
if (exists === undefined) throw new Error('Remote branch lookup unavailable');
|
|
390
|
+
if (exists === false) {
|
|
391
|
+
acknowledge('complete', 0);
|
|
392
|
+
return skipped('missing-branch');
|
|
393
|
+
}
|
|
394
|
+
step = 'find-existing-pr';
|
|
395
|
+
const existing = await harvest.findExistingPr(repository, branch);
|
|
396
|
+
if (existing === undefined) throw new Error('Existing PR lookup unavailable');
|
|
397
|
+
let pr = existing;
|
|
398
|
+
if (!pr) {
|
|
399
|
+
step = 'create-draft-pr';
|
|
400
|
+
pr = await harvest.createDraftPr(repository, branch);
|
|
401
|
+
log('harvest-created', { number: pr?.number, branch, repository });
|
|
402
|
+
} else {
|
|
403
|
+
log('harvest-reused', { number: pr.number, branch, repository });
|
|
404
|
+
}
|
|
405
|
+
if (!pr || !Number.isSafeInteger(pr.number) || pr.number <= 0) throw new Error('draft-create-unobserved');
|
|
406
|
+
if (!completed('harvestable', pr.number)) {
|
|
407
|
+
if (!pr.labels?.includes(harvestable)) {
|
|
408
|
+
step = 'add-label';
|
|
409
|
+
await harvest.addHarvestableLabel(repository, pr.number);
|
|
410
|
+
log('harvestable-labeled', { prNumber: pr.number });
|
|
411
|
+
}
|
|
412
|
+
step = 'ledger';
|
|
413
|
+
acknowledge('harvestable', pr.number);
|
|
414
|
+
}
|
|
415
|
+
step = 'ledger';
|
|
416
|
+
acknowledge('complete', 0);
|
|
417
|
+
return { status: 'recorded' };
|
|
418
|
+
} catch (error) {
|
|
419
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
420
|
+
log('failed', { step, reason });
|
|
421
|
+
return { status: 'failed', step, reason };
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
300
425
|
export interface DraftResidueReplayOptions {
|
|
301
426
|
repository?: string;
|
|
302
427
|
ledgerDir?: string;
|
|
@@ -385,7 +510,11 @@ export async function replayPodTerminals(options: DraftResidueReplayOptions = {}
|
|
|
385
510
|
const outcome = await applyPodTerminal(record, { ledgerDir, ledgerRunId, adapters: replayAdapters, closeBudget });
|
|
386
511
|
if (outcome.status === 'recorded' || outcome.reason === 'already-recorded') recovered++;
|
|
387
512
|
else if (outcome.status === 'skipped' && outcome.reason === 'repository-unobserved') unresolved++;
|
|
388
|
-
else if (outcome.status === 'skipped' && ![
|
|
513
|
+
else if (outcome.status === 'skipped' && ![
|
|
514
|
+
'previous-run-unverified', 'previous-run-live', 'close-cap', 'host-repository-unobserved', 'restore-unverified',
|
|
515
|
+
'deferred-close-ownership-unverified', 'deferred-close-reopened', 'deferred-close-unverified',
|
|
516
|
+
'deferred-close-run-unverified', 'deferred-close-raced',
|
|
517
|
+
].includes(outcome.reason ?? '')) recovered++;
|
|
389
518
|
else pending++;
|
|
390
519
|
}
|
|
391
520
|
}
|
|
@@ -409,12 +538,34 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
409
538
|
const acknowledge = (effect: string, number: number): void => {
|
|
410
539
|
adapters.appendLedger({ runId: ctx.ledgerRunId, event: 'pr-terminal-effect', data: { childRunId: record.childRunId, effect, number } }, ctx.ledgerDir);
|
|
411
540
|
};
|
|
541
|
+
const markDeferredBody = async (number: number, expectedBranch: string): Promise<void> => {
|
|
542
|
+
if (record.terminalClass !== 'merge-ready-not-merged' || completed('harvest-deferred-body', number)) return;
|
|
543
|
+
const latest = await adapters.getPr(number);
|
|
544
|
+
if (!latest || latest.state !== 'CLOSED' || latest.headSha?.toLowerCase() !== record.headSha?.toLowerCase()
|
|
545
|
+
|| latest.branch !== expectedBranch || typeof latest.body !== 'string') {
|
|
546
|
+
throw new Error('harvest-deferred-body-unverified');
|
|
547
|
+
}
|
|
548
|
+
const marker = '수확보류: harvest-deferred';
|
|
549
|
+
if (!latest.body.split(/\r?\n/).includes(marker)) {
|
|
550
|
+
step = 'edit-body';
|
|
551
|
+
await adapters.editBody(record.repository!, number, `${latest.body.trimEnd()}\n${marker}\n`);
|
|
552
|
+
const verified = await adapters.getPr(number);
|
|
553
|
+
if (!verified || verified.state !== 'CLOSED' || verified.headSha?.toLowerCase() !== record.headSha?.toLowerCase()
|
|
554
|
+
|| verified.branch !== expectedBranch || !verified.body?.split(/\r?\n/).includes(marker)) {
|
|
555
|
+
throw new Error('harvest-deferred-body-unverified');
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
step = 'ledger';
|
|
559
|
+
acknowledge('harvest-deferred-body', number);
|
|
560
|
+
};
|
|
412
561
|
if (completed('complete', record.prNumber ?? 0) || completed('protected', record.prNumber ?? 0)) return skipped('already-recorded');
|
|
413
562
|
if (!rows.some((entry) => entry.event === 'pr-terminal')) {
|
|
414
563
|
adapters.appendLedger({ runId: ctx.ledgerRunId, event: 'pr-terminal', data: { ...record } }, ctx.ledgerDir);
|
|
415
564
|
log('terminal-recorded');
|
|
416
565
|
}
|
|
417
|
-
|
|
566
|
+
if (record.terminalClass === 'timed-out-harvestable') {
|
|
567
|
+
return harvestHarvestableDrafts(record, { ...ctx, adapters, harvest: ctx.harvest ?? defaultHarvestAdapters(record) });
|
|
568
|
+
}
|
|
418
569
|
if (record.terminalClass === 'failed-no-pr' || record.terminalClass === 'failed-pr-unobserved' || record.prNumber === null) {
|
|
419
570
|
acknowledge('complete', 0);
|
|
420
571
|
return skipped(record.terminalClass);
|
|
@@ -441,6 +592,21 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
441
592
|
step = 'get-pr';
|
|
442
593
|
const pr = await adapters.getPr(record.prNumber);
|
|
443
594
|
if (!pr || pr.number !== record.prNumber || !Array.isArray(pr.labels) || !pr.branch || !Number.isFinite(Date.parse(pr.createdAt))) throw new Error('PR lookup unavailable');
|
|
595
|
+
const deferredCloseTerminal = record.terminalClass === 'failed-with-pr' || record.terminalClass === 'merge-ready-not-merged';
|
|
596
|
+
if (deferredCloseTerminal && completed('deferred-close', pr.number)) {
|
|
597
|
+
if (pr.state !== 'CLOSED' || !record.headSha
|
|
598
|
+
|| pr.headSha?.toLowerCase() !== record.headSha.toLowerCase()
|
|
599
|
+
|| (record.branch && pr.branch !== record.branch)) return skipped('deferred-close-reopened');
|
|
600
|
+
await markDeferredBody(pr.number, pr.branch);
|
|
601
|
+
step = 'ledger';
|
|
602
|
+
acknowledge('complete', pr.number);
|
|
603
|
+
return { status: 'recorded' };
|
|
604
|
+
}
|
|
605
|
+
// After a close intent without its receipt, GitHub cannot prove whether our close was applied and
|
|
606
|
+
// subsequently reversed by another owner. Leave that ambiguity for a human instead of closing again.
|
|
607
|
+
if (deferredCloseTerminal && completed('deferred-close-intent', pr.number)) {
|
|
608
|
+
return skipped('deferred-close-ownership-unverified');
|
|
609
|
+
}
|
|
444
610
|
// Review r8: the PR may have merged or closed after this run's terminal — a failed terminal then writes nothing
|
|
445
611
|
// (no harvestable label, no owner comment) and settles once.
|
|
446
612
|
if (record.terminalClass !== 'landed' && pr.state !== undefined && pr.state !== 'OPEN') {
|
|
@@ -733,6 +899,59 @@ export async function applyPodTerminal(record: PrTerminalRecord, ctx: DraftResid
|
|
|
733
899
|
}
|
|
734
900
|
if (deferred) return skipped('previous-run-unverified');
|
|
735
901
|
if (capped) return skipped('close-cap');
|
|
902
|
+
if (deferredCloseTerminal) {
|
|
903
|
+
if (budget.remaining <= 0) return skipped('close-cap');
|
|
904
|
+
const restore = `Draft residue: harvest deferred · run=${record.childRunId} · head=${record.headSha} · branch=${pr.branch}. Close does not delete this ref; verify it before restore.${record.terminalClass === 'merge-ready-not-merged' ? ' 다시 여는 법: gh pr reopen + land-enqueue.' : ''}`;
|
|
905
|
+
step = 'get-pr';
|
|
906
|
+
const latest = await adapters.getPr(pr.number);
|
|
907
|
+
if (!latest || latest.state !== 'OPEN' || latest.isDraft !== true || !record.headSha
|
|
908
|
+
|| latest.headSha?.toLowerCase() !== record.headSha.toLowerCase()
|
|
909
|
+
|| latest.branch !== pr.branch || (record.branch && latest.branch !== record.branch)
|
|
910
|
+
|| !Array.isArray(latest.labels) || latest.labels.some((label) => PROTECTED_LABELS.has(label) || label.includes('harvest-claimed'))) {
|
|
911
|
+
return skipped('deferred-close-unverified');
|
|
912
|
+
}
|
|
913
|
+
step = 'list-live-branches';
|
|
914
|
+
const activeBranches = await adapters.listLiveBranches(record.repository);
|
|
915
|
+
step = 'get-run-status';
|
|
916
|
+
const runStatus = await adapters.getRunStatus(latest, record.repository);
|
|
917
|
+
if (!activeBranches || activeBranches.has(latest.branch)
|
|
918
|
+
|| !['completed', 'failed', 'cancelled', 'abandoned', 'self-implement.result final'].includes(runStatus ?? '')) {
|
|
919
|
+
return skipped('deferred-close-run-unverified');
|
|
920
|
+
}
|
|
921
|
+
step = 'list-comments';
|
|
922
|
+
const comments = await adapters.getAllComments?.(record.repository, pr.number);
|
|
923
|
+
if (!Array.isArray(comments) || comments.some((comment) => typeof comment !== 'string'
|
|
924
|
+
|| /landing-verified\s*:|land-enqueue\s*:/i.test(comment))) return skipped('deferred-close-unverified');
|
|
925
|
+
if (!comments.includes(restore)) { step = 'comment'; await adapters.comment(record.repository, pr.number, restore); }
|
|
926
|
+
step = 'get-pr';
|
|
927
|
+
const beforeClose = await adapters.getPr(pr.number);
|
|
928
|
+
step = 'list-comments';
|
|
929
|
+
const commentsBeforeClose = await adapters.getAllComments?.(record.repository, pr.number);
|
|
930
|
+
step = 'list-live-branches';
|
|
931
|
+
const liveBeforeClose = await adapters.listLiveBranches(record.repository);
|
|
932
|
+
step = 'get-run-status';
|
|
933
|
+
const statusBeforeClose = await adapters.getRunStatus(latest, record.repository);
|
|
934
|
+
if (!beforeClose || beforeClose.state !== 'OPEN' || beforeClose.isDraft !== true
|
|
935
|
+
|| beforeClose.headSha?.toLowerCase() !== record.headSha.toLowerCase()
|
|
936
|
+
|| beforeClose.branch !== latest.branch || !Array.isArray(beforeClose.labels)
|
|
937
|
+
|| beforeClose.labels.some((label) => PROTECTED_LABELS.has(label) || label.includes('harvest-claimed'))
|
|
938
|
+
|| !Array.isArray(commentsBeforeClose) || !commentsBeforeClose.includes(restore)
|
|
939
|
+
|| commentsBeforeClose.some((comment) => typeof comment !== 'string'
|
|
940
|
+
|| /landing-verified\s*:|land-enqueue\s*:/i.test(comment))
|
|
941
|
+
|| !liveBeforeClose || liveBeforeClose.has(latest.branch)
|
|
942
|
+
|| !['completed', 'failed', 'cancelled', 'abandoned', 'self-implement.result final'].includes(statusBeforeClose ?? '')) {
|
|
943
|
+
return skipped('deferred-close-raced');
|
|
944
|
+
}
|
|
945
|
+
step = 'ledger';
|
|
946
|
+
acknowledge('deferred-close-intent', pr.number);
|
|
947
|
+
step = 'close-pr';
|
|
948
|
+
await adapters.closePr(record.repository, pr.number);
|
|
949
|
+
budget.remaining--;
|
|
950
|
+
step = 'ledger';
|
|
951
|
+
acknowledge('deferred-close', pr.number);
|
|
952
|
+
log('deferred-closed', { branch: latest.branch, headSha: record.headSha });
|
|
953
|
+
await markDeferredBody(pr.number, latest.branch);
|
|
954
|
+
}
|
|
736
955
|
step = 'ledger';
|
|
737
956
|
acknowledge('complete', record.prNumber);
|
|
738
957
|
return { status: 'recorded' };
|
|
@@ -938,25 +938,38 @@ async function applyDraftSweepPlan(repository: string, adapters: DraftSweepAdapt
|
|
|
938
938
|
number, action, reason, ...(statusLabel ? { statusLabel } : {}), applied: false,
|
|
939
939
|
})), counts: {}, closeCap: plan.closeCap, closeCapSource: plan.closeCapSource };
|
|
940
940
|
const writable = plan.entries.filter((entry) => entry.action !== 'report' && (entry.action === 'close' || Boolean(entry.statusLabel)));
|
|
941
|
-
const
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
if (!newer) { result.error = `snapshot apply plan missing newer PR #${entry.supersedeNewer.number}`; return result; }
|
|
945
|
-
preflightEntries.set(newer.number, newer);
|
|
941
|
+
for (const entry of writable) if (entry.supersedeNewer && !plan.entries.some((candidate) => candidate.number === entry.supersedeNewer!.number)) {
|
|
942
|
+
result.error = `snapshot apply plan missing newer PR #${entry.supersedeNewer.number}`;
|
|
943
|
+
return result;
|
|
946
944
|
}
|
|
947
945
|
if (!adapters.getDraftSnapshot) { result.error = 'draft snapshot preflight unavailable'; return result; }
|
|
948
|
-
//
|
|
949
|
-
const snapshots = await mapBounded(
|
|
950
|
-
current: await adapters.getDraftSnapshot!(repository, entry.number) }
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
946
|
+
// The frozen classification is one transaction boundary: every plan row must still match before any write.
|
|
947
|
+
const snapshots = await mapBounded(plan.entries, DRAFT_SWEEP_CONCURRENCY, async (entry) => {
|
|
948
|
+
try { return { entry, current: await adapters.getDraftSnapshot!(repository, entry.number), lookupError: undefined as string | undefined }; }
|
|
949
|
+
catch (error) { return { entry, current: undefined, lookupError: sweepFailureReason(error) }; }
|
|
950
|
+
});
|
|
951
|
+
const drift = snapshots.flatMap(({ entry, current, lookupError }) => {
|
|
952
|
+
if (lookupError) return [{ number: entry.number, reason: `snapshot lookup failed: ${lookupError}` }];
|
|
953
|
+
if (!current) return [{ number: entry.number, reason: 'snapshot unavailable' }];
|
|
954
|
+
const reasons: string[] = [];
|
|
955
|
+
if (current.number !== entry.number) reasons.push('number drift');
|
|
956
|
+
if (current.state !== 'open' && current.state !== 'closed') reasons.push('invalid state');
|
|
957
|
+
else if (current.state !== 'open') reasons.push(`state drift: expected open, got ${current.state}`);
|
|
958
|
+
if (current.draft !== true) reasons.push('draft state drift');
|
|
959
|
+
if (typeof current.headSha !== 'string' || current.headSha !== entry.headSha) reasons.push('head SHA drift');
|
|
960
|
+
if (typeof current.branch !== 'string' || current.branch !== entry.branch) reasons.push('branch drift');
|
|
961
|
+
if (typeof current.updatedAt !== 'string' || current.updatedAt !== entry.updatedAt) reasons.push('updatedAt drift');
|
|
962
|
+
if (!Array.isArray(current.labels) || current.labels.some((name) => typeof name !== 'string')
|
|
963
|
+
|| current.labels.length !== entry.labels.length || [...current.labels].sort().join('\0') !== [...entry.labels].sort().join('\0')) reasons.push('labels drift');
|
|
964
|
+
return reasons.map((reason) => ({ number: entry.number, reason }));
|
|
965
|
+
});
|
|
966
|
+
if (drift.length) {
|
|
967
|
+
result.error = `draft snapshot drift at ${drift.map(({ number, reason }) => `#${number} (${reason})`).join(', ')}; no writes performed`;
|
|
968
|
+
for (const item of drift) result.entries.find((entry) => entry.number === item.number)!.error = item.reason;
|
|
958
969
|
return result;
|
|
959
970
|
}
|
|
971
|
+
const writableNumbers = new Set(writable.map((entry) => entry.number));
|
|
972
|
+
const snapshotsForApply = snapshots.filter(({ entry }) => writableNumbers.has(entry.number));
|
|
960
973
|
const stopPlans = writable.filter((entry) => entry.stopRunRequired === true);
|
|
961
974
|
const stoppedRuns = new Set<number>();
|
|
962
975
|
if (stopPlans.length) {
|
|
@@ -986,7 +999,7 @@ async function applyDraftSweepPlan(repository: string, adapters: DraftSweepAdapt
|
|
|
986
999
|
} catch (error) { result.error = `could not stop planned run at #${check.entry.number}: ${sweepFailureReason(error)}`; return result; }
|
|
987
1000
|
}
|
|
988
1001
|
}
|
|
989
|
-
for (const { entry } of
|
|
1002
|
+
for (const { entry } of snapshotsForApply) {
|
|
990
1003
|
const output = result.entries.find((item) => item.number === entry.number)!;
|
|
991
1004
|
let mutated = false;
|
|
992
1005
|
try {
|
|
@@ -122,6 +122,10 @@ export function readJourneyEdge(
|
|
|
122
122
|
* 그 밖의 칸은 그 간선에 결속할 근거(예: 착지 거부 원문·cardId · LAND-REFUSAL-EDGES) — 간선 칸(from·to·taken…)을 덮지 못한다. */
|
|
123
123
|
export interface JourneyEdgeFields {
|
|
124
124
|
readonly moveId?: string;
|
|
125
|
+
readonly runId?: string;
|
|
126
|
+
readonly card?: string;
|
|
127
|
+
readonly pr?: number;
|
|
128
|
+
readonly head?: string;
|
|
125
129
|
readonly [key: string]: unknown;
|
|
126
130
|
}
|
|
127
131
|
|
|
@@ -140,11 +144,15 @@ export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: s
|
|
|
140
144
|
graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
|
|
141
145
|
...journeyJoinFields(),
|
|
142
146
|
});
|
|
143
|
-
// Evidence never overrides an edge field: the later spread wins
|
|
144
|
-
const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch,
|
|
147
|
+
// Evidence never overrides an edge field: the later spread wins. Explicit repair join keys win over ambient context.
|
|
148
|
+
const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch,
|
|
149
|
+
runId, card, pr, head, moveId, ...evidence } = data ?? {};
|
|
145
150
|
debug.log('self-implement', 'graph-edge-taken', {
|
|
146
151
|
...evidence, graphId: 'self-implement', ...route, taken, honored: route.to === null || route.to === taken,
|
|
147
152
|
...(reason === undefined ? {} : { reason }), ...journeyJoinFields(),
|
|
153
|
+
...(runId === undefined ? {} : { runId }), ...(card === undefined ? {} : { card }),
|
|
154
|
+
...(pr === undefined ? {} : { pr }), ...(head === undefined ? {} : { head }),
|
|
155
|
+
...(moveId === undefined ? {} : { moveId }),
|
|
148
156
|
});
|
|
149
157
|
} catch { /* 관측은 fail-soft */ }
|
|
150
158
|
}
|
|
@@ -22,8 +22,8 @@ export interface LaunchPreflightBlocker {
|
|
|
22
22
|
readonly name: string;
|
|
23
23
|
/** 왜 막혔는지 한 줄 — 경로와 수를 포함한다. */
|
|
24
24
|
readonly detail: string;
|
|
25
|
-
/** 골 판독 실패(`goal-unreadable`)
|
|
26
|
-
readonly reasonCode?: 'goal-unreadable' | 'missing-traced-path';
|
|
25
|
+
/** 골 판독 실패(`goal-unreadable`) · 골 해석 실패(`goal-parse`) · traced-path 오류(`missing-traced-path`)를 가르는 사유 코드. */
|
|
26
|
+
readonly reasonCode?: 'goal-unreadable' | 'goal-parse' | 'missing-traced-path';
|
|
27
27
|
/** 어느 검사인지 — 경로를 접지 않은 검사 이름. */
|
|
28
28
|
readonly checkName?: string;
|
|
29
29
|
/** 잘리지 않은 대상 경로. 경로 없는 검사(빈 traced paths)는 생략한다. */
|
|
@@ -1112,14 +1112,31 @@ export function decideAskPreflight(
|
|
|
1112
1112
|
const inspectionRoot = goalDocument === null || !hasAuthoredGoal
|
|
1113
1113
|
? undefined
|
|
1114
1114
|
: opts.declaredPathsRoot?.trim() || process.cwd();
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1115
|
+
// ⛔ 골 «판독»(읽기) 실패와 골 «해석» 실패는 고칠 곳이 다르다 — 파서가 던진 예외를 사유 코드로 바꿔
|
|
1116
|
+
// 원장에 «어느 검사가» 막았는지 남긴다(AUT-PREFLIGHT-REASON-OPAQUE: 두 갈래가 한 문장으로 뭉개졌다).
|
|
1117
|
+
let goalParseFailure: { readonly checkName: string; readonly message: string } | undefined;
|
|
1118
|
+
const authoredTracedPaths = (() => {
|
|
1119
|
+
if (goalDocument === null) return [];
|
|
1120
|
+
try {
|
|
1121
|
+
return inspectableAuthoredTracedPaths(deps.tracedPaths(goalDocument), inspectionRoot);
|
|
1122
|
+
} catch (error) {
|
|
1123
|
+
goalParseFailure = { checkName: 'goal-parse', message: oneLineConfidenceFailureDetail(error) };
|
|
1124
|
+
return [];
|
|
1125
|
+
}
|
|
1126
|
+
})();
|
|
1118
1127
|
const tracedPathsRaw = opts.pathsOverride ?? authoredTracedPaths;
|
|
1119
1128
|
const tracedPaths = inspectionRoot && !opts.pathsOverride
|
|
1120
1129
|
? tracedPathsRaw.filter((path) => tracedPathExists(path, inspectionRoot) || isFileShapedTracedPath(path))
|
|
1121
1130
|
: tracedPathsRaw;
|
|
1122
|
-
const declaredNewPaths =
|
|
1131
|
+
const declaredNewPaths = (() => {
|
|
1132
|
+
if (goalDocument === null) return new Set<string>();
|
|
1133
|
+
try {
|
|
1134
|
+
return new Set(declaredNewFilePaths(goalDocument));
|
|
1135
|
+
} catch (error) {
|
|
1136
|
+
goalParseFailure ??= { checkName: 'goal-new-paths', message: oneLineConfidenceFailureDetail(error) };
|
|
1137
|
+
return new Set<string>();
|
|
1138
|
+
}
|
|
1139
|
+
})();
|
|
1123
1140
|
const invalidTracedPaths: Array<{ path: string; reason: 'occupied-new' | 'not-file' | 'missing' | 'inaccessible' }> = inspectionRoot
|
|
1124
1141
|
? authoredTracedPaths.flatMap<{ path: string; reason: 'occupied-new' | 'not-file' | 'missing' | 'inaccessible' }>((path) => {
|
|
1125
1142
|
const occupation = tracedPathOccupation(path, inspectionRoot);
|
|
@@ -1315,7 +1332,8 @@ export function decideAskPreflight(
|
|
|
1315
1332
|
...(recentChangesUnknownReason ? { recentChangesUnknownReason } : {}),
|
|
1316
1333
|
});
|
|
1317
1334
|
const missingTracedPathBlockers: LaunchPreflightBlocker[] = [
|
|
1318
|
-
|
|
1335
|
+
// ⛔ 해석 실패를 「traced path 0」으로 한 번 더 뭉개지 않는다 — 그건 다른 갈래다.
|
|
1336
|
+
...(hasAuthoredGoal && authoredTracedPaths.length === 0 && goalParseFailure === undefined ? [{
|
|
1319
1337
|
kind: 'missing-traced-path' as const,
|
|
1320
1338
|
name: '최종 골의 TRACED PATHS 경로 0',
|
|
1321
1339
|
detail: '정리 후 보존된 traced 경로가 없다 — 실제 파일 또는 유효한 신설: 파일 경로를 골에 선언해야 발사할 수 있다',
|
|
@@ -1347,16 +1365,29 @@ export function decideAskPreflight(
|
|
|
1347
1365
|
checkName: 'goal-read',
|
|
1348
1366
|
targetPath: resolvedGoalFile,
|
|
1349
1367
|
}] : [];
|
|
1368
|
+
const goalParseBlockers: LaunchPreflightBlocker[] = goalParseFailure ? [{
|
|
1369
|
+
kind: 'goal-unreadable',
|
|
1370
|
+
name: `골 문서 해석 실패: ${opts.goalFile}`,
|
|
1371
|
+
detail: `${goalParseFailure.checkName} 검사가 골 문서를 해석하지 못했다(${goalParseFailure.message}) — 골 판독 실패(goal-unreadable)도 traced path 오류(missing-traced-path)도 아닌 별개 갈래다 · 어느 검사가 막았는지는 checkName 이 가른다 — 골의 TRACED PATHS · 신설: 문면을 바로잡아야 한다`,
|
|
1372
|
+
reasonCode: 'goal-parse' as const,
|
|
1373
|
+
checkName: goalParseFailure.checkName,
|
|
1374
|
+
targetPath: resolvedGoalFile,
|
|
1375
|
+
}] : [];
|
|
1350
1376
|
const decisionResult = {
|
|
1351
1377
|
...result,
|
|
1352
|
-
|
|
1378
|
+
// ⛔ 해석 실패를 「대상 경로 0」 문면으로 덮지 않는다 — 사유 코드가 이미 그 자리를 말한다.
|
|
1379
|
+
blockers: [
|
|
1380
|
+
...result.blockers.filter((blocker) => goalParseFailure === undefined || blocker.kind !== 'no-target-paths'),
|
|
1381
|
+
...missingTracedPathBlockers, ...goalParseBlockers, ...goalReadBlockers,
|
|
1382
|
+
],
|
|
1353
1383
|
warnings: [...result.warnings, ...askMarkerWarnings],
|
|
1354
1384
|
runningRunsConfidenceAppendix: runningRunsConfidence.appendix,
|
|
1355
1385
|
};
|
|
1356
1386
|
emittedAskMarkerObservations.add(decisionResult);
|
|
1357
1387
|
return {
|
|
1358
1388
|
result: decisionResult,
|
|
1359
|
-
shouldLaunch: missingTracedPathBlockers.length === 0 &&
|
|
1389
|
+
shouldLaunch: missingTracedPathBlockers.length === 0 && goalParseBlockers.length === 0 && goalReadBlockers.length === 0
|
|
1390
|
+
&& (result.blockers.length === 0 || force),
|
|
1360
1391
|
plannedBranchResolution,
|
|
1361
1392
|
};
|
|
1362
1393
|
}
|
|
@@ -451,6 +451,7 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
451
451
|
await recordRoundPrs(results);
|
|
452
452
|
results = await superviseRun({
|
|
453
453
|
initial: results,
|
|
454
|
+
knowhowRepo: deps.repositoryRoot ?? process.cwd(),
|
|
454
455
|
// The add-repair-task branch below runs each authored review-oscillation repair goal as that goal's new
|
|
455
456
|
// feature (a fresh piece, same goal id) — the supervisor records the repair text, so a second oscillation stops.
|
|
456
457
|
repairGoalExecution: true,
|
|
@@ -1520,6 +1520,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1520
1520
|
...(disp?.ok !== undefined ? { ok: disp.ok } : {}),
|
|
1521
1521
|
...(disp?.prUrl ? { prUrl: disp.prUrl } : {}),
|
|
1522
1522
|
...(disp?.prNumber !== undefined ? { prNumber: disp.prNumber } : {}),
|
|
1523
|
+
...(disp?.goalPlanRevision ? { goalPlanRevision: disp.goalPlanRevision } : {}),
|
|
1523
1524
|
...(disp?.merged !== undefined ? { merged: disp.merged } : {}),
|
|
1524
1525
|
...(disp?.checkedHeadCommit ? { checkedHeadCommit: disp.checkedHeadCommit } : {}),
|
|
1525
1526
|
...(disp?.selfReview ? { selfReview: disp.selfReview } : {}),
|