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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawnSync } from 'node:child_process';
|
|
2
2
|
import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
|
|
3
3
|
import { debug } from '../debug/log.js';
|
|
4
|
+
import { selectKnowhowPack } from './knowhow-pack.js';
|
|
4
5
|
import { loadReviewRoundBrief, type ReviewRoundBrief } from './review-round-brief.js';
|
|
5
6
|
import { findIncidentPrecedents, type IncidentPrecedent } from '../harness/harness-incidents.js';
|
|
6
7
|
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
@@ -10,7 +11,7 @@ import {
|
|
|
10
11
|
listRunLedgers,
|
|
11
12
|
loadRunLedger,
|
|
12
13
|
lookupRunLedger,
|
|
13
|
-
|
|
14
|
+
runLedgerDir,
|
|
14
15
|
type RunLedgerCheckedAppendOutcome,
|
|
15
16
|
type RunLedgerLookupOptions,
|
|
16
17
|
} from './run-ledger.js';
|
|
@@ -319,6 +320,18 @@ export function recordShadowDoctorReevaluation(runId: string, dir?: string): {
|
|
|
319
320
|
const visit = entries[visitIndex]!;
|
|
320
321
|
|
|
321
322
|
const evidence = typeof visit.data.evidence === 'string' ? visit.data.evidence.trim() : '';
|
|
323
|
+
// The pack selected for this run was observed before the visit. Keep its actual slice ids;
|
|
324
|
+
// an absent or malformed observation must remain unknown, never imply an empty pack.
|
|
325
|
+
const pack = entries.slice(0, visitIndex).reverse().find((entry) => entry.event === 'knowhow-pack');
|
|
326
|
+
const packIds = Array.isArray(pack?.data?.ids) && pack.data.ids.length > 0
|
|
327
|
+
&& pack.data.ids.every((id: unknown) => typeof id === 'string' && id.length > 0)
|
|
328
|
+
? pack.data.ids as string[] : 'unknown';
|
|
329
|
+
// Pull the repository lesson at prescription time. A vanished worktree leaves the prior observed ids
|
|
330
|
+
// as provenance only; it must never manufacture a current remedy.
|
|
331
|
+
const sourceRepo = typeof pack?.data?.repoPath === 'string' ? pack.data.repoPath : null;
|
|
332
|
+
const sourceGoal = typeof pack?.data?.goal === 'string' ? pack.data.goal : null;
|
|
333
|
+
const pulled = sourceRepo && sourceGoal ? selectKnowhowPack(sourceRepo, sourceGoal) : null;
|
|
334
|
+
const currentIds = pulled?.ids.length ? pulled.ids : packIds;
|
|
322
335
|
const rx = evidence ? 're-evaluate-member' as const : null;
|
|
323
336
|
const outcome = evidence ? 'shadow-recorded' as const : 'needs-evidence' as const;
|
|
324
337
|
const data: Record<string, unknown> = {
|
|
@@ -326,17 +339,38 @@ export function recordShadowDoctorReevaluation(runId: string, dir?: string): {
|
|
|
326
339
|
visitIndex,
|
|
327
340
|
visit: { runId, from: visit.data.from, symptom: 'admit-starved', timestamp: visit.timestamp, evidence: evidence || null },
|
|
328
341
|
diagnosis: evidence ? 'admit-starved-reported' : 'evidence-unmeasured',
|
|
342
|
+
knowhowPackSliceIds: currentIds,
|
|
343
|
+
knowhowPackDecision: { source: pulled ? 'repository' : 'unavailable', ids: pulled?.ids ?? [], reason: pulled?.reason ?? 'source-unavailable',
|
|
344
|
+
reference: pulled?.text || null },
|
|
329
345
|
rx,
|
|
330
346
|
cost: { estimatedTokens: 0, usedTokens: 0 },
|
|
331
347
|
outcome,
|
|
332
348
|
execution: 'none',
|
|
333
|
-
handoff: evidence ?
|
|
349
|
+
handoff: evidence ? `parent-re-evaluate-member${pulled?.ids.length ? ` · 검토할 노하우 ${pulled.ids.join(',')}` : ''}` : 'visit-owner-provide-admission-evidence',
|
|
334
350
|
};
|
|
335
351
|
appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId, event: 'doctor-rx', data }, dir);
|
|
336
352
|
debug.log('run-doctor', 'rx', { runId, visitIndex, rx, outcome, shadow: true, executed: false });
|
|
337
353
|
return { status: 'recorded', ...(rx ? { rx } : {}), outcome, visitIndex };
|
|
338
354
|
}
|
|
339
355
|
|
|
356
|
+
/** Guardian shadow tick: prescribe only for ledgers with an admit-starved visit. Repeated ticks are idempotent. */
|
|
357
|
+
export function recordPendingShadowDoctorReevaluations(dir?: string): { recorded: number; alreadyRecorded: number } {
|
|
358
|
+
let recorded = 0;
|
|
359
|
+
let alreadyRecorded = 0;
|
|
360
|
+
for (const ledger of listRunLedgers(dir ? { dir } : {}).matches) {
|
|
361
|
+
const visits = ledger.entries.flatMap((entry, index) => entry.event === 'doctor-visit' && entry.data.symptom === 'admit-starved' ? [index] : []);
|
|
362
|
+
if (visits.length === 0) continue;
|
|
363
|
+
const prescribed = new Set(ledger.entries.flatMap(entry => entry.event === 'doctor-rx' && entry.data.shadow === true
|
|
364
|
+
&& typeof entry.data.visitIndex === 'number' ? [entry.data.visitIndex] : []));
|
|
365
|
+
if (visits.every(index => prescribed.has(index))) { alreadyRecorded++; continue; }
|
|
366
|
+
const result = recordShadowDoctorReevaluation(ledger.runId, ledger.ledgerDirectory);
|
|
367
|
+
if (result.status === 'recorded') recorded++;
|
|
368
|
+
else if (result.status === 'already-recorded') alreadyRecorded++;
|
|
369
|
+
}
|
|
370
|
+
debug.log('run-doctor', 'shadow-tick', { recorded, alreadyRecorded });
|
|
371
|
+
return { recorded, alreadyRecorded };
|
|
372
|
+
}
|
|
373
|
+
|
|
340
374
|
/** OP 손판정 한 건 — 시각과 결과만 받는다(그 밖의 입력은 받지 않는다). */
|
|
341
375
|
export interface DoctorOpJudgment {
|
|
342
376
|
/** 손판정 시각(ISO). */
|
|
@@ -361,6 +395,18 @@ export interface DoctorComparisonRecord {
|
|
|
361
395
|
opResult: string;
|
|
362
396
|
}
|
|
363
397
|
|
|
398
|
+
/**
|
|
399
|
+
* 하류 계약: 운영/시험 원장 쓰기 거부는 message 문자열이 아니라 typed identity(`reason`·`runId`·
|
|
400
|
+
* `ledgerDir`)로 도착한다. 사람이 읽는 문면은 종전과 같은 문장 그대로다.
|
|
401
|
+
*/
|
|
402
|
+
export class DoctorComparisonLedgerWriteRefusedError extends Error {
|
|
403
|
+
readonly reason = 'ledger-write-refused' as const;
|
|
404
|
+
constructor(readonly runId: string, readonly ledgerDir: string) {
|
|
405
|
+
super(`ledger-write-refused: 테스트 우주가 운영 원장 쓰기를 거부했습니다 (runId=${runId}) — 운영 원장에 쓰지 않았습니다`);
|
|
406
|
+
this.name = 'DoctorComparisonLedgerWriteRefusedError';
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
364
410
|
/**
|
|
365
411
|
* RUN-DOCTOR-LIVE 0.2.36 첫 비교 슬라이스 — 그 정확한 runId 의 OP 손판정 1건(timestamp·result)을
|
|
366
412
|
* 이미 기록된 shadow doctor-rx/visit 에 결속해 원장에 `doctor-compare` 한 행을 남긴다.
|
|
@@ -370,6 +416,11 @@ export interface DoctorComparisonRecord {
|
|
|
370
416
|
* 명명된 실패 — invalid-op-judgment · run-ledger-missing · shadow-rx-missing · runId-mismatch ·
|
|
371
417
|
* visit-missing. 어떤 경우도 shadow 결과를 지어내지 않는다. 같은 shadow rx 에 대한 재시도는
|
|
372
418
|
* already-recorded 로 원장에 한 행만 남긴다(멱등).
|
|
419
|
+
* 하류 계약(typed identity) — ① 원장 쓰기 거부는 DoctorComparisonLedgerWriteRefusedError
|
|
420
|
+
* (`reason='ledger-write-refused'`·`runId`·`ledgerDir`), ② runId 불일치는 원장 바이트와 checked
|
|
421
|
+
* append 양쪽 모두 RunLedgerCheckedAppendRunIdMismatchError(`reason='runId-mismatch'`·
|
|
422
|
+
* `decisionRunId`·`lockedRunId`)로 도착한다. 문자열 파싱 없이 분류하고, 실제로 없는 원장만
|
|
423
|
+
* `run-ledger-missing` 이다.
|
|
373
424
|
*
|
|
374
425
|
* 배선 경계(의도적): 이 슬라이스의 호출자는 시험 경로뿐이다 — live dispatch·stall-watch retirement
|
|
375
426
|
* 은 후속 cross-judgment 증거 슬라이스에서 붙는다(현행 `eln doctor status --json` = total 0
|
|
@@ -384,65 +435,57 @@ export function recordDoctorComparison(input: RecordDoctorComparisonInput): Doct
|
|
|
384
435
|
throw new Error(`invalid-op-judgment: OP 손판정은 timestamp·result 문자열이 필요합니다 (runId=${runId})`);
|
|
385
436
|
}
|
|
386
437
|
const holder: { recorded?: DoctorComparisonRecord } = {};
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
if (
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
438
|
+
// ⛔ typed identity 를 «문자열 하나»로 뭉개지 않는다 — checked append 가 던지는
|
|
439
|
+
// RunLedgerCheckedAppendRunIdMismatchError(원장 바이트 불일치는 같은 reason 의
|
|
440
|
+
// RunLedgerEntryRunIdMismatchError)의 reason·decisionRunId·lockedRunId 가 그대로 하류까지 간다.
|
|
441
|
+
// 그래서 이 호출을 try/catch 로 감싸 재발사하지 않는다(감싸면 identity 가 사라진다).
|
|
442
|
+
// 단일 per-run lock 안에서 비교 행 존재 판정과 단일 append를 원자적으로 수행한다(#30403 동시 중복 결함).
|
|
443
|
+
// lock 안에서 appendRunLedgerEntry 를 다시 부르지 않는다(중첩 lock 시간초과).
|
|
444
|
+
const outcome: RunLedgerCheckedAppendOutcome<DoctorComparisonRecord> = appendRunLedgerEntryChecked<DoctorComparisonRecord>(runId, (entries) => {
|
|
445
|
+
if (entries === null) {
|
|
446
|
+
throw new Error(`run-ledger-missing: 런 원장이 없습니다 (runId=${runId}) — 새 원장을 만들지 않습니다`);
|
|
447
|
+
}
|
|
448
|
+
let shadowRxIndex = -1;
|
|
449
|
+
for (let index = 0; index < entries.length; index++) {
|
|
450
|
+
const entry = entries[index]!;
|
|
451
|
+
if (entry.event === 'doctor-rx' && entry.data.shadow === true) shadowRxIndex = index;
|
|
452
|
+
}
|
|
453
|
+
if (shadowRxIndex < 0) {
|
|
454
|
+
throw new Error(`shadow-rx-missing: 이 runId 의 shadow doctor-rx 가 없습니다 (runId=${runId}) — shadow 결과를 지어내지 않습니다`);
|
|
455
|
+
}
|
|
456
|
+
const shadowRx = entries[shadowRxIndex]!;
|
|
457
|
+
const rx = typeof shadowRx.data.rx === 'string' ? shadowRx.data.rx : null;
|
|
458
|
+
const shadowOutcome = typeof shadowRx.data.outcome === 'string' ? shadowRx.data.outcome : null;
|
|
459
|
+
const visitIndex = typeof shadowRx.data.visitIndex === 'number' ? shadowRx.data.visitIndex : -1;
|
|
460
|
+
const visit = visitIndex >= 0 && visitIndex < entries.length ? entries[visitIndex] : undefined;
|
|
461
|
+
if (visit === undefined || visit.event !== 'doctor-visit' || visit.runId !== runId) {
|
|
462
|
+
throw new Error(`visit-missing: shadow doctor-rx 가 가리키는 doctor-visit 행이 없습니다 (runId=${runId}, visitIndex=${visitIndex})`);
|
|
463
|
+
}
|
|
464
|
+
const existing = entries.find((entry) => entry.event === 'doctor-compare' && entry.data.shadowRxIndex === shadowRxIndex);
|
|
465
|
+
if (existing !== undefined) {
|
|
466
|
+
const stored = existing.data.opJudgment as { timestamp?: unknown; result?: unknown };
|
|
467
|
+
if (typeof stored?.timestamp !== 'string' || stored.timestamp.length === 0
|
|
468
|
+
|| typeof stored?.result !== 'string' || stored.result.length === 0) {
|
|
469
|
+
throw new Error(`comparison-corrupt: 이미 기록된 doctor-compare 의 저장 판단이 손상됐습니다 (runId=${runId}, shadowRxIndex=${shadowRxIndex}, stored=${JSON.stringify(stored)}) — 거짓 already-recorded 를 승인하지 않습니다`);
|
|
410
470
|
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
const stored = existing.data.opJudgment as { timestamp?: unknown; result?: unknown };
|
|
414
|
-
if (typeof stored?.timestamp !== 'string' || stored.timestamp.length === 0
|
|
415
|
-
|| typeof stored?.result !== 'string' || stored.result.length === 0) {
|
|
416
|
-
throw new Error(`comparison-corrupt: 이미 기록된 doctor-compare 의 저장 판단이 손상됐습니다 (runId=${runId}, shadowRxIndex=${shadowRxIndex}, stored=${JSON.stringify(stored)}) — 거짓 already-recorded 를 승인하지 않습니다`);
|
|
417
|
-
}
|
|
418
|
-
if (stored.timestamp !== judgment.timestamp || stored.result !== judgment.result) {
|
|
419
|
-
throw new Error(`comparison-conflict: 이미 기록된 doctor-compare 와 손판정이 다릅니다 (runId=${runId}, shadowRxIndex=${shadowRxIndex}, stored=${JSON.stringify(stored)}, received=${JSON.stringify(judgment)}) — 기존 행을 유지합니다`);
|
|
420
|
-
}
|
|
421
|
-
return { append: false as const, result: { status: 'already-recorded' as const, visitIndex, shadowRxIndex, rx, outcome: shadowOutcome, opResult: judgment.result } };
|
|
471
|
+
if (stored.timestamp !== judgment.timestamp || stored.result !== judgment.result) {
|
|
472
|
+
throw new Error(`comparison-conflict: 이미 기록된 doctor-compare 와 손판정이 다릅니다 (runId=${runId}, shadowRxIndex=${shadowRxIndex}, stored=${JSON.stringify(stored)}, received=${JSON.stringify(judgment)}) — 기존 행을 유지합니다`);
|
|
422
473
|
}
|
|
423
|
-
const
|
|
424
|
-
shadow: true,
|
|
425
|
-
visitIndex,
|
|
426
|
-
shadowRxIndex,
|
|
427
|
-
visit: { runId, from: visit.data.from, symptom: visit.data.symptom, timestamp: visit.timestamp },
|
|
428
|
-
shadowRx: { timestamp: shadowRx.timestamp, rx, outcome: shadowOutcome },
|
|
429
|
-
opJudgment: { timestamp: judgment.timestamp, result: judgment.result },
|
|
430
|
-
};
|
|
431
|
-
holder.recorded = { status: 'recorded', visitIndex, shadowRxIndex, rx, outcome: shadowOutcome, opResult: judgment.result };
|
|
432
|
-
return { append: true as const, entry: { timestamp: new Date().toISOString(), runId, event: 'doctor-compare', data } };
|
|
433
|
-
}, input.dir);
|
|
434
|
-
} catch (error) {
|
|
435
|
-
if (error instanceof RunLedgerCheckedAppendRunIdMismatchError) {
|
|
436
|
-
throw new Error(`runId-mismatch: 원장 항목의 runId 가 요청 runId 와 다릅니다 (runId=${runId}) — ${error.message}`);
|
|
437
|
-
}
|
|
438
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
439
|
-
if (message.includes('runId does not match')) {
|
|
440
|
-
throw new Error(`runId-mismatch: 원장 항목의 runId 가 요청 runId 와 다릅니다 (runId=${runId}) — ${message}`);
|
|
474
|
+
return { append: false as const, result: { status: 'already-recorded' as const, visitIndex, shadowRxIndex, rx, outcome: shadowOutcome, opResult: judgment.result } };
|
|
441
475
|
}
|
|
442
|
-
|
|
443
|
-
|
|
476
|
+
const data: Record<string, unknown> = {
|
|
477
|
+
shadow: true,
|
|
478
|
+
visitIndex,
|
|
479
|
+
shadowRxIndex,
|
|
480
|
+
visit: { runId, from: visit.data.from, symptom: visit.data.symptom, timestamp: visit.timestamp },
|
|
481
|
+
shadowRx: { timestamp: shadowRx.timestamp, rx, outcome: shadowOutcome },
|
|
482
|
+
opJudgment: { timestamp: judgment.timestamp, result: judgment.result },
|
|
483
|
+
};
|
|
484
|
+
holder.recorded = { status: 'recorded', visitIndex, shadowRxIndex, rx, outcome: shadowOutcome, opResult: judgment.result };
|
|
485
|
+
return { append: true as const, entry: { timestamp: new Date().toISOString(), runId, event: 'doctor-compare', data } };
|
|
486
|
+
}, input.dir);
|
|
444
487
|
if (outcome.refusal === 'ledger-write-refused') {
|
|
445
|
-
throw new
|
|
488
|
+
throw new DoctorComparisonLedgerWriteRefusedError(runId, input.dir ?? runLedgerDir());
|
|
446
489
|
}
|
|
447
490
|
if (outcome.result !== null) {
|
|
448
491
|
return outcome.result;
|
|
@@ -85,7 +85,8 @@ export interface GateArtifactSummary extends GateArtifactCounts {
|
|
|
85
85
|
verdict: string | null;
|
|
86
86
|
/** 판정 줄(`tests: …` / `[gate-baseline] …` / `shards: unmeasured (…)`) 그대로. */
|
|
87
87
|
verdictLine?: string;
|
|
88
|
-
timeoutRechecks?: readonly { name: string; file: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
|
|
88
|
+
timeoutRechecks?: readonly { name: string; file: string; originalDiagnostic?: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
|
|
89
|
+
interferenceRechecks?: readonly { name: string; file: string; head: 'pass' | 'timeout' | 'failure' | 'unknown'; base: 'pass' | 'timeout' | 'failure' | 'unknown'; classification: 'interference' | 'unchanged' }[];
|
|
89
90
|
exitCode: number;
|
|
90
91
|
/** 정수 칸 중 하나라도 null 일 때만 — 왜 못 셌나(한 줄). */
|
|
91
92
|
countsUnavailableReason?: string;
|
|
@@ -130,7 +131,8 @@ export interface GateArtifactInput {
|
|
|
130
131
|
testFiles: readonly string[];
|
|
131
132
|
verdict: string | null;
|
|
132
133
|
verdictLine?: string;
|
|
133
|
-
timeoutRechecks?: readonly { name: string; file: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
|
|
134
|
+
timeoutRechecks?: readonly { name: string; file: string; originalDiagnostic: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
|
|
135
|
+
interferenceRechecks?: readonly { name: string; file: string; head: 'pass' | 'timeout' | 'failure' | 'unknown'; base: 'pass' | 'timeout' | 'failure' | 'unknown'; classification: 'interference' | 'unchanged' }[];
|
|
134
136
|
exitCode: number;
|
|
135
137
|
/** 판정 정수(못 센 칸은 null ⊕ countsUnavailableReason). 안 주면 다섯 다 null · 이유 'not recorded' — 칸은 «늘» 쓴다. */
|
|
136
138
|
counts?: GateArtifactCounts;
|
|
@@ -222,6 +224,7 @@ export function writeGateArtifacts(input: GateArtifactInput): { summaryPath: str
|
|
|
222
224
|
verdict: input.verdict,
|
|
223
225
|
...(input.verdictLine !== undefined ? { verdictLine: input.verdictLine } : {}),
|
|
224
226
|
...(input.timeoutRechecks ? { timeoutRechecks: input.timeoutRechecks } : {}),
|
|
227
|
+
...(input.interferenceRechecks ? { interferenceRechecks: input.interferenceRechecks } : {}),
|
|
225
228
|
exitCode: input.exitCode,
|
|
226
229
|
introduced: counts.introduced,
|
|
227
230
|
preexisting: counts.preexisting,
|
|
@@ -9,7 +9,7 @@ import type { GitRunResult } from '../git-fs/retry.js';
|
|
|
9
9
|
import { linkWorktreeDependencies, worktreeAddTimeoutForRepo } from '../git-fs/worktree.js';
|
|
10
10
|
import { reapStaleGateWorktrees } from './gate-baseline-reap.js';
|
|
11
11
|
|
|
12
|
-
export type GateFailureAttribution = 'introduced' | 'preexisting' | 'unknown' | 'precondition-unmet' | 'flaky-timeout' | 'flaky-rerun' | 'timeout
|
|
12
|
+
export type GateFailureAttribution = 'introduced' | 'preexisting' | 'unknown' | 'precondition-unmet' | 'flaky-timeout' | 'flaky-rerun' | 'load-timeout';
|
|
13
13
|
export type GateBaselinePresence = 'present' | 'missing' | 'unknown';
|
|
14
14
|
export type TimeoutVariability = 'may-vary' | 'same' | 'unknown';
|
|
15
15
|
|
|
@@ -30,11 +30,13 @@ export interface GateTestFailure {
|
|
|
30
30
|
attributedBy?: 'name-across-files' | 'copied-across-files';
|
|
31
31
|
precondition?: GateFailurePrecondition;
|
|
32
32
|
/** 귀속 불일치 등으로 `unknown` 판정을 내린 이유. 판정 enum 은 바꾸지 않는다. */
|
|
33
|
-
unknownReason?: '귀속 불일치';
|
|
33
|
+
unknownReason?: '귀속 불일치' | 'interference';
|
|
34
34
|
/** 같은 gate 실행 안에서 같은 시험의 통과 기록이 있으면 `may-vary`로 보존한다. 타임아웃은 재실행 결과 변동성도 함께 표현한다. */
|
|
35
35
|
timeoutVariability?: TimeoutVariability;
|
|
36
36
|
/** 시간 초과한 정확한 시험이 base 로그에서는 통과해 자식 회귀로 귀속됐는지 나타낸다. */
|
|
37
37
|
timeoutRegression?: 'passed-at-base';
|
|
38
|
+
/** Unrelated file passed alone on both the candidate and base; this remains a blocking unknown. */
|
|
39
|
+
interference?: true;
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
export interface GateBaselineSummary {
|
|
@@ -73,12 +75,22 @@ export interface GateBaselineReport extends GateBaselineSummary {
|
|
|
73
75
|
baselineStatus: BaselineProcessStatus;
|
|
74
76
|
log: string;
|
|
75
77
|
timeoutRechecks?: TimeoutRecheckRecord[];
|
|
76
|
-
|
|
78
|
+
loadTimeout?: number;
|
|
79
|
+
interferenceRechecks?: InterferenceRecheckRecord[];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface InterferenceRecheckRecord {
|
|
83
|
+
name: string;
|
|
84
|
+
file: string;
|
|
85
|
+
head: TimeoutRerunObservation | 'unknown';
|
|
86
|
+
base: TimeoutRerunObservation | 'unknown';
|
|
87
|
+
classification: 'interference' | 'unchanged';
|
|
77
88
|
}
|
|
78
89
|
|
|
79
90
|
export interface TimeoutRecheckRecord {
|
|
80
91
|
name: string;
|
|
81
92
|
file: string;
|
|
93
|
+
originalDiagnostic: string;
|
|
82
94
|
result: 'pass' | 'timeout' | 'failure' | 'unknown';
|
|
83
95
|
elapsedMs: number;
|
|
84
96
|
rawResultLine: string;
|
|
@@ -354,7 +366,7 @@ function stripAnsi(text: string): string {
|
|
|
354
366
|
return text.replace(/\u001B\[[0-9;]*[A-Za-z]/g, '');
|
|
355
367
|
}
|
|
356
368
|
|
|
357
|
-
export function extractGateTestFailures(log: string): Array<Omit<GateTestFailure, 'attribution' | 'baselinePresence'>> {
|
|
369
|
+
export function extractGateTestFailures(log: string, currentFileExists?: (file: string) => boolean): Array<Omit<GateTestFailure, 'attribution' | 'baselinePresence'>> {
|
|
358
370
|
const failures: Array<Omit<GateTestFailure, 'attribution' | 'baselinePresence'>> = [];
|
|
359
371
|
const lines = stripAnsi(log).split('\n');
|
|
360
372
|
let currentFile: string | undefined;
|
|
@@ -404,6 +416,13 @@ export function extractGateTestFailures(log: string): Array<Omit<GateTestFailure
|
|
|
404
416
|
const rawName = normalizeFailureName(match[1]!);
|
|
405
417
|
const inlineFile = rawName.match(TEST_FILE_RE)?.[1];
|
|
406
418
|
const file = inlineFile ?? currentFile;
|
|
419
|
+
// A failing test may print a nested Bun run from a temporary repository in its diagnostic.
|
|
420
|
+
// Its reporter-shaped lines are not tests in this checkout. The outer failure remains;
|
|
421
|
+
// if none remains, the caller reports an unparsed failure instead of accepting the gate.
|
|
422
|
+
if (file && currentFileExists && !currentFileExists(file)) {
|
|
423
|
+
lastBoundary = i;
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
407
426
|
const testName = inlineFile
|
|
408
427
|
? rawName.replace(new RegExp(`^${inlineFile.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*>?\\s*`), '')
|
|
409
428
|
: rawName;
|
|
@@ -539,6 +558,7 @@ export function classifyGateTestFailures(
|
|
|
539
558
|
missingAtBase: readonly string[] = [],
|
|
540
559
|
rerunObservations?: GateRerunObservations,
|
|
541
560
|
baselinePassedEvidence?: GatePassedTestEvidence,
|
|
561
|
+
currentFileExists?: (file: string) => boolean,
|
|
542
562
|
): GateTestFailure[] {
|
|
543
563
|
const missing = new Set(missingAtBase);
|
|
544
564
|
const observationsFor = (name: string): readonly TimeoutRerunObservation[] => {
|
|
@@ -546,7 +566,7 @@ export function classifyGateTestFailures(
|
|
|
546
566
|
if (rerunObservations instanceof Map) return rerunObservations.get(name) ?? [];
|
|
547
567
|
return (rerunObservations as Readonly<Record<string, readonly TimeoutRerunObservation[]>>)[name] ?? [];
|
|
548
568
|
};
|
|
549
|
-
const worktreeFailures = extractGateTestFailures(worktreeLog);
|
|
569
|
+
const worktreeFailures = extractGateTestFailures(worktreeLog, currentFileExists);
|
|
550
570
|
const baselineFailures = baselineLog === undefined ? [] : extractGateTestFailures(baselineLog);
|
|
551
571
|
const testPath = ({ file, name }: GateTestIdentitySource): string | undefined =>
|
|
552
572
|
file && name.startsWith(`${file} > `) ? name.slice(file.length + 3) : undefined;
|
|
@@ -707,7 +727,7 @@ function summarizeGateBaseline(failures: readonly GateTestFailure[]): GateBaseli
|
|
|
707
727
|
if (failure.attribution === 'flaky-rerun') {
|
|
708
728
|
return { ...withPresence, flakyRerun: withPresence.flakyRerun + 1 };
|
|
709
729
|
}
|
|
710
|
-
if (failure.attribution === 'timeout
|
|
730
|
+
if (failure.attribution === 'load-timeout') {
|
|
711
731
|
return withPresence;
|
|
712
732
|
}
|
|
713
733
|
const withTimeoutRegression = failure.timeoutRegression === 'passed-at-base'
|
|
@@ -735,16 +755,67 @@ export function rerunBunSingleTest(cwd: string, file: string, testName: string,
|
|
|
735
755
|
return classifyBunSingleTestRerun(result);
|
|
736
756
|
}
|
|
737
757
|
|
|
758
|
+
/** An unrelated failing test is interference only when the same host passes it alone on both trees.
|
|
759
|
+
* Interference is a blocking unknown, never an exemption or a green gate. */
|
|
760
|
+
export function recheckOutsideScopeFailures(
|
|
761
|
+
cwd: string,
|
|
762
|
+
report: GateBaselineReport,
|
|
763
|
+
baseRef: string,
|
|
764
|
+
relatedTestFiles: readonly string[],
|
|
765
|
+
runOne: (dir: string, file: string, name: string) => TimeoutRerunObservation | undefined =
|
|
766
|
+
(dir, file, name) => rerunBunSingleTest(dir, file, name, 60_000),
|
|
767
|
+
runBase: (dir: string, ref: string, cases: readonly { file: string; name: string }[], run: typeof runOne) =>
|
|
768
|
+
ReadonlyMap<string, TimeoutRerunObservation | undefined> | undefined = defaultInterferenceBaseRecheck,
|
|
769
|
+
): GateBaselineReport {
|
|
770
|
+
const related = new Set(relatedTestFiles);
|
|
771
|
+
const candidates = report.failures.filter((failure) => failure.attribution === 'introduced'
|
|
772
|
+
&& failure.file && !related.has(failure.file) && failure.baselinePresence === 'present')
|
|
773
|
+
.map((failure) => {
|
|
774
|
+
const file = failure.file!;
|
|
775
|
+
const prefix = `${file} > `;
|
|
776
|
+
return { failure, file, name: failure.name.startsWith(prefix) ? failure.name.slice(prefix.length) : failure.name };
|
|
777
|
+
});
|
|
778
|
+
if (!candidates.length) return report;
|
|
779
|
+
const head = candidates.map(({ file, name }) => runOne(cwd, file, name) ?? 'unknown');
|
|
780
|
+
const base = runBase(cwd, baseRef, candidates.map(({ file, name }) => ({ file, name })), runOne);
|
|
781
|
+
const records: InterferenceRecheckRecord[] = candidates.map(({ failure, file }, index) => {
|
|
782
|
+
const baseObservation = base?.get(`${file}\u0000${candidates[index]!.name}`) ?? 'unknown';
|
|
783
|
+
const classification = head[index] === 'pass' && baseObservation === 'pass' ? 'interference' : 'unchanged';
|
|
784
|
+
return { name: failure.name, file, head: head[index]!, base: baseObservation, classification };
|
|
785
|
+
});
|
|
786
|
+
const interference = new Set(records.filter((record) => record.classification === 'interference')
|
|
787
|
+
.map((record) => `${record.file}\u0000${record.name}`));
|
|
788
|
+
const failures = report.failures.map((failure) => failure.attribution === 'introduced'
|
|
789
|
+
&& interference.has(`${failure.file}\u0000${failure.name}`)
|
|
790
|
+
? { ...failure, attribution: 'unknown' as const, unknownReason: 'interference' as const, interference: true as const }
|
|
791
|
+
: failure);
|
|
792
|
+
return { ...report, ...summarizeGateBaseline(failures), failures, interferenceRechecks: records };
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
function defaultInterferenceBaseRecheck(
|
|
796
|
+
cwd: string, baseRef: string, cases: readonly { file: string; name: string }[],
|
|
797
|
+
runOne: (dir: string, file: string, name: string) => TimeoutRerunObservation | undefined,
|
|
798
|
+
): ReadonlyMap<string, TimeoutRerunObservation | undefined> | undefined {
|
|
799
|
+
const result = withBaselineWorktree(cwd, baseRef, (baseDir) => new Map(cases.map(({ file, name }) =>
|
|
800
|
+
[`${file}\u0000${name}`, runOne(baseDir, file, name)] as const)));
|
|
801
|
+
return result instanceof Map ? result : undefined;
|
|
802
|
+
}
|
|
803
|
+
|
|
738
804
|
/** A standalone timeout-only retry is allowed only when every introduced failure is explicitly a Bun timeout. */
|
|
739
805
|
export function recheckTimeoutOnlyIntroducedFailures(
|
|
740
806
|
cwd: string,
|
|
741
807
|
report: GateBaselineReport,
|
|
742
808
|
run: (cwd: string, file: string, name: string, timeoutMs: number) => { observation?: TimeoutRerunObservation; elapsedMs: number; output: string } = runTimeoutRecheck,
|
|
743
809
|
): GateBaselineReport {
|
|
810
|
+
const timeoutOnlyDiagnostic = (diagnostic: string | undefined): boolean => {
|
|
811
|
+
if (!diagnostic) return false;
|
|
812
|
+
const lines = diagnostic.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
813
|
+
return lines.length === 1 && /^\^ this test timed out after \d+ms\.?$/i.test(lines[0]!);
|
|
814
|
+
};
|
|
744
815
|
const eligible = report.failures.length > 0
|
|
745
816
|
&& report.introduced === report.failures.length
|
|
746
817
|
&& report.failures.every((failure) => failure.attribution === 'introduced' && !!failure.file
|
|
747
|
-
&&
|
|
818
|
+
&& timeoutOnlyDiagnostic(failure.diagnostic));
|
|
748
819
|
if (!eligible) return report;
|
|
749
820
|
const records: TimeoutRecheckRecord[] = [];
|
|
750
821
|
const failures = report.failures.map((failure) => {
|
|
@@ -754,19 +825,19 @@ export function recheckTimeoutOnlyIntroducedFailures(
|
|
|
754
825
|
const { observation, elapsedMs, output } = run(cwd, failure.file, name, 60_000);
|
|
755
826
|
const result = observation ?? 'unknown';
|
|
756
827
|
const record: TimeoutRecheckRecord = {
|
|
757
|
-
name: failure.name, file: failure.file, result, elapsedMs,
|
|
828
|
+
name: failure.name, file: failure.file, originalDiagnostic: failure.diagnostic ?? '', result, elapsedMs,
|
|
758
829
|
rawResultLine: flattenControlChars(redactSecretText(output)).slice(-500),
|
|
759
830
|
};
|
|
760
831
|
records.push(record);
|
|
761
832
|
debug.log('gate.baseline', 'timeout-recheck', record);
|
|
762
|
-
return result === 'pass' ? { ...failure, attribution: 'timeout
|
|
833
|
+
return result === 'pass' ? { ...failure, attribution: 'load-timeout' as const } : failure;
|
|
763
834
|
});
|
|
764
835
|
return {
|
|
765
836
|
...report,
|
|
766
837
|
...summarizeGateBaseline(failures),
|
|
767
838
|
failures,
|
|
768
839
|
timeoutRechecks: records,
|
|
769
|
-
|
|
840
|
+
loadTimeout: failures.filter((failure) => failure.attribution === 'load-timeout').length,
|
|
770
841
|
};
|
|
771
842
|
}
|
|
772
843
|
|
|
@@ -1077,6 +1148,35 @@ export function withBaselineWorktree<T>(cwd: string, baseRef: string, run: (base
|
|
|
1077
1148
|
}
|
|
1078
1149
|
}
|
|
1079
1150
|
|
|
1151
|
+
/** Keep the baseline checkout attached until every asynchronous shard has settled. */
|
|
1152
|
+
export async function withBaselineWorktreeAsync<T>(cwd: string, baseRef: string, run: (baselineDir: string) => Promise<T>): Promise<T | BaselineProcessResult> {
|
|
1153
|
+
reapBeforeGateAdd(cwd);
|
|
1154
|
+
const baselineDir = mkdtempSync(join(tmpdir(), 'elanous-gate-baseline-'));
|
|
1155
|
+
let attached = false;
|
|
1156
|
+
try {
|
|
1157
|
+
const started = Date.now();
|
|
1158
|
+
const addTimeout = worktreeAddTimeoutForRepo(cwd, undefined, baseRef);
|
|
1159
|
+
const add = runGitCommand(cwd, gateWorktreeAddArgs(baselineDir, baseRef), { encoding: 'utf8', timeout: addTimeout.ms, killSignal: 'SIGKILL' });
|
|
1160
|
+
const elapsedMs = Date.now() - started;
|
|
1161
|
+
debug.log('self-implement.gate-baseline', 'worktree-add-result', {
|
|
1162
|
+
phase: 'baseline', status: add.status, signal: add.signal ?? null, errorCode: add.errorCode ?? null,
|
|
1163
|
+
elapsedMs, timeoutMs: addTimeout.ms, trackedFileCount: addTimeout.trackedFileCount,
|
|
1164
|
+
timeoutSource: addTimeout.source, parentRssBytes: process.memoryUsage().rss,
|
|
1165
|
+
cgroupMemoryCurrentBytes: cgroupMemoryBytes('memory.current'), cgroupMemoryLimitBytes: cgroupMemoryBytes('memory.max'),
|
|
1166
|
+
});
|
|
1167
|
+
if (add.status !== 0) return classifyBaselineWorktreeAddFailure(add, elapsedMs, addTimeout.ms, worktreeAddFailureContext(cwd, baselineDir, baseRef));
|
|
1168
|
+
attached = true;
|
|
1169
|
+
linkDependencies(cwd, baselineDir);
|
|
1170
|
+
return await run(baselineDir);
|
|
1171
|
+
} catch (error) {
|
|
1172
|
+
return { status: 'unknown', unknownReason: 'infrastructure-failure', childResponsibility: 'none', log: `baseline setup failed: ${String(error)}` };
|
|
1173
|
+
} finally {
|
|
1174
|
+
removeGateWorktree(cwd, baselineDir, !attached);
|
|
1175
|
+
try { rmSync(baselineDir, { recursive: true, force: true }); }
|
|
1176
|
+
catch (error) { debug.log('self-implement', 'gate.baseline.cleanup', { stage: 'exception', dir: baselineDir, error: String(error) }); }
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1080
1180
|
function linkDependencies(cwd: string, dir: string): void {
|
|
1081
1181
|
const dependencyLinks = linkWorktreeDependencies(cwd, dir, ['node_modules']);
|
|
1082
1182
|
debug.log('self-implement', 'gate.baseline.dependencies', { cwd, dir, dependencyLinks });
|
|
@@ -1512,6 +1612,7 @@ export function buildGateBaselineReport(
|
|
|
1512
1612
|
baseline: BaselineProcessResult,
|
|
1513
1613
|
rerunObservations?: GateRerunObservations,
|
|
1514
1614
|
rerunNotRun = 0,
|
|
1615
|
+
currentFileExists?: (file: string) => boolean,
|
|
1515
1616
|
): GateBaselineReport {
|
|
1516
1617
|
let failures = classifyGateTestFailures(
|
|
1517
1618
|
worktreeLog,
|
|
@@ -1519,6 +1620,7 @@ export function buildGateBaselineReport(
|
|
|
1519
1620
|
baseline.missingAtBase ?? [],
|
|
1520
1621
|
rerunObservations,
|
|
1521
1622
|
baseline.passedTestEvidence,
|
|
1623
|
+
currentFileExists,
|
|
1522
1624
|
);
|
|
1523
1625
|
const worktreeFailuresParsed = failures.length > 0;
|
|
1524
1626
|
if (!worktreeFailuresParsed) {
|
|
@@ -1570,7 +1672,7 @@ export function formatGateBaselineNote(report: GateBaselineReport, unrunImporter
|
|
|
1570
1672
|
+ `, unknown=${report.unknown}, precondition-unmet=${report.preconditionUnmet}`
|
|
1571
1673
|
+ (report.timedOut > 0 ? `, timed-out=${report.timedOut}` : '')
|
|
1572
1674
|
+ (report.flakyRerun > 0 ? `, flaky-rerun=${report.flakyRerun}` : '')
|
|
1573
|
-
+ ((report.
|
|
1675
|
+
+ ((report.loadTimeout ?? 0) > 0 ? `, load-timeout=${report.loadTimeout}` : '')
|
|
1574
1676
|
+ (runId ? `, run=${runId}` : '')
|
|
1575
1677
|
+ (report.missingAtBase > 0 ? `, missing-at-base=${report.missingAtBase}` : '');
|
|
1576
1678
|
const lines = report.failures.map((failure) => `- ${failure.attribution}: ${failure.name}`
|
|
@@ -1592,13 +1694,17 @@ export function formatGateBaselineNote(report: GateBaselineReport, unrunImporter
|
|
|
1592
1694
|
? `\n[gate-baseline] rerun not-run=${report.rerunNotRun}`
|
|
1593
1695
|
: '';
|
|
1594
1696
|
const timeoutRecheckLines = report.timeoutRechecks?.length
|
|
1595
|
-
? `\n[gate.baseline.timeout-recheck] ${report.timeoutRechecks.map((item) => `${item.name}: ${item.result} elapsed=${item.elapsedMs}ms · ${item.rawResultLine}`).join('\n')}`
|
|
1697
|
+
? `\n[gate.baseline.timeout-recheck] ${report.timeoutRechecks.map((item) => `${item.name}: ${item.result} elapsed=${item.elapsedMs}ms · original=${flattenControlChars(item.originalDiagnostic).slice(-500)} · ${item.rawResultLine}`).join('\n')}`
|
|
1698
|
+
: '';
|
|
1699
|
+
const interferenceLines = report.interferenceRechecks?.length
|
|
1700
|
+
? `\n[gate.interference] ${report.interferenceRechecks.map((item) => `${item.classification}: ${item.name} head=${item.head} base=${item.base}`).join('\n')}`
|
|
1596
1701
|
: '';
|
|
1597
1702
|
return `${head}\n${lines.join('\n')}\n${report.log}`
|
|
1598
1703
|
+ timedOutLine
|
|
1599
1704
|
+ mayVaryNonTimeoutLine
|
|
1600
1705
|
+ rerunLine
|
|
1601
1706
|
+ timeoutRecheckLines
|
|
1707
|
+
+ interferenceLines
|
|
1602
1708
|
+ (report.preexisting > 0 ? '\n⚠️ preexisting 실패는 base에서도 재현됨 — 이 PR의 책임이 아니다.' : '');
|
|
1603
1709
|
}
|
|
1604
1710
|
|
|
@@ -1614,5 +1720,5 @@ export function formatVerifyByBreakingScopeSkipNote(reason: string, changedFiles
|
|
|
1614
1720
|
export function allowsBaselineOnlyFailure(report: GateBaselineReport): boolean {
|
|
1615
1721
|
if (report.baselineStatus === 'unknown') return false;
|
|
1616
1722
|
if (!report.worktreeFailuresParsed) return false;
|
|
1617
|
-
return report.introduced === 0 && report.preconditionUnmet === 0 && report.timedOut === 0 && report.flakyRerun === 0;
|
|
1723
|
+
return report.introduced === 0 && report.unknown === 0 && report.preconditionUnmet === 0 && report.timedOut === 0 && report.flakyRerun === 0;
|
|
1618
1724
|
}
|