elanous 0.2.38 → 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/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{7954.4f7a8832663ee979.js → 1060.014f1f01a17aec26.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 1281.d81877e35b9068f4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2104.70e086d5174a4736.js → 1350.59f40e39e02d91b1.js} +1 -1
- 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/2047.8f23e210995d4548.js +2 -0
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.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/{8019.21ca554a821dad01.js → 2177.df8547f9d7215c4e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.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/{6493.27ad77de7aac7966.js → 2499.02fbfd18126c10c0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7628.6b16863ac3972333.js → 2522.f2766b76d22c8bdf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9299.24e2a7d9b6d1f91b.js → 261.0d471e8aded799f3.js} +3 -3
- 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/2774-719820e3f5b2a3eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +1 -0
- 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/{7524.ce973525d30b3d52.js → 3330.7443183b7e6fdbdf.js} +1 -1
- 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/{3124-561f7f037943cde2.js → 3746-f80a78f220bf37b5.js} +1 -1
- 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/{bb6987f9.3647e1a23b0e3217.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/{8994d93e.33ba491f95345fc2.js → 409c787b.e48c5bec8ec10456.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5041-5aada92ca215ffdd.js → 413-24c8284bda08241d.js} +1 -1
- 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/{5638.107314dc479e2f37.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/{8487.291666583bebe640.js → 4769.9fd582071301f382.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8509.3a54d4e61893d7cb.js → 483.725e4a61be922788.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.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/{8879.ac06755bcf3e44a1.js → 5383.bdfa5d886e39a826.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 5436.fdf6fa8ae3e9588d.js} +1 -1
- 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/{7161-8f22db3ec5ed005e.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/{3291.f6c1005387d514bd.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/{5203.51e5d8b5f1dcfe53.js → 6749.0744ce6eb08d40e9.js} +3 -3
- 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/{1938.0e6c60ee91c4d7f5.js → 6908.06008c67f6380ea9.js} +2 -2
- 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/{de8b930d.d94c0f42acf807fc.js → 6cc1d1d6.9a98dd4622f1afc6.js} +1 -1
- 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/{1026-44010f405704050c.js → 8272-025653884f9645d2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.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/{4199-f7c6eb40cd0322f8.js → 8639-92c11d069792429e.js} +1 -1
- 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/9175.2de5209a5ce6f68a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.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-866aac5ff226a7f3.js → page-ba957ff875a026a0.js} +1 -1
- 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-4edb8df90f4537ce.js +1 -0
- 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-fca2e59a81744d9e.js +1 -0
- 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-139d722de1dcd6c1.js +1 -0
- 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-ccde99f07aaf71f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → b84cad00.594027ebe0531fe2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → ca3702f8.2913182e73889fa2.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{3f0de3de-2340c532c00395db.js → d5d3cefc-373c4eb722ed848b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{framework-4b12a946f352cee2.js → framework-002b472a66935d31.js} +1 -1
- 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/video/explainer-line.yaml +4 -1
- package/package.json +1 -1
- package/scripts/dead-code/report.ts +169 -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/public-export.ts +15 -7
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-node.ts +379 -48
- 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-release.ts +20 -5
- package/scripts/release-loop/resume.ts +48 -0
- package/scripts/release-loop/version-node.ts +7 -2
- 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/src/acp/core-turn-bridge.ts +8 -0
- 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/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 +75 -6
- 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/self-review-cli.ts +226 -17
- 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 +22 -3
- package/src/auto-research/research-turn.ts +350 -17
- package/src/autopilot/agent-loop.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/budget/llm-cost.ts +44 -5
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +14 -0
- package/src/chat/index.ts +33 -7
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/intake-cli.ts +22 -1
- package/src/cli/lesson-cli.ts +19 -3
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pty-takeover-cli.ts +67 -7
- package/src/cli/release-cli.ts +52 -6
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/tasks-cli.ts +36 -9
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +44 -3
- package/src/core-turn/run-goal-loop.ts +152 -8
- package/src/core-turn/types.ts +9 -0
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +321 -27
- 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/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +16 -18
- package/src/dashboard/turn-preamble.ts +2 -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/graph-runner/graph-cli.ts +6 -4
- package/src/graph-runner/runner.ts +31 -9
- 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 +5 -0
- 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/index.ts +18 -4
- package/src/input/external-input-queue.ts +10 -0
- package/src/intake-plane/collect-telegram-saved.ts +36 -1
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- 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.ts +431 -76
- package/src/loops/orchestrator/tick.ts +8 -0
- package/src/nexus/api/harness-api.ts +2 -1
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +59 -3
- 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/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +27 -0
- package/src/research/edge-decision.ts +124 -15
- 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/plugin-discovery.ts +242 -0
- package/src/research-bridge/invoke.ts +4 -2
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +34 -106
- package/src/self-dev/dev-cli.ts +2 -0
- package/src/self-dev/dev-pipeline.ts +8 -4
- 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/run-supervisor.ts +19 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +76 -58
- package/src/self-implement/gate-artifacts.ts +3 -0
- package/src/self-implement/gate-baseline.ts +75 -4
- package/src/self-implement/gate-cli.ts +317 -9
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +145 -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 +9 -5
- 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 +189 -10
- package/src/self-implement/off-diff-evidence.ts +124 -0
- package/src/self-implement/orchestrator.ts +85 -7
- package/src/self-implement/run-ledger.ts +46 -8
- package/src/self-implement/run-stop.ts +12 -0
- package/src/self-implement/seams.ts +6 -3
- package/src/self-implement/self-implement-cli.ts +4 -2
- package/src/session/chat.ts +89 -15
- 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/tools/schedule-wakeup.ts +23 -1
- package/src/skills/tools/shell.ts +51 -5
- package/src/steward/directive-audit.ts +354 -0
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/judge.ts +56 -0
- 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 +1 -1
- package/src/task-agent/task-hand.ts +129 -24
- package/src/task-agent/tier-split.ts +105 -21
- 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 +27 -2
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- 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 +186 -33
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/entry.ts +15 -2
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/list.ts +2 -176
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +7 -1
- package/src/user-config.ts +34 -4
- 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/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 +8 -13
- 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/1118.a8a74ea29aac3e46.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2415.738b777642a02233.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +0 -77
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
- /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
|
@@ -471,6 +471,7 @@ export function createGoalAuthorDecomposeSteps(
|
|
|
471
471
|
config: {
|
|
472
472
|
adversarialReview?: boolean;
|
|
473
473
|
adversarialReviewSource?: 'cli' | 'default' | 'unknown';
|
|
474
|
+
goalId?: string;
|
|
474
475
|
recentStepCounts?: readonly number[];
|
|
475
476
|
onSizedSlices?: (slices: SizedSlice[], redecomposed: number) => void;
|
|
476
477
|
repositoryRoot?: string;
|
|
@@ -589,38 +590,46 @@ export function createGoalAuthorDecomposeSteps(
|
|
|
589
590
|
return parsed ? { sizes: parsed, sizeSource: 'planner-estimate' as const }
|
|
590
591
|
: { sizes: deriveGoalSliceSizes(slices), sizeSource: 'derived' as const };
|
|
591
592
|
};
|
|
592
|
-
const observe = (event: 'slice-sized' | 'slice-oversize', sizeSource: 'planner-estimate' | 'derived', data: Record<string, unknown>) => {
|
|
593
|
+
const observe = (event: 'slice-sized' | 'slice-oversize' | 'resplit' | 'slice-oversize-unavoidable', sizeSource: 'planner-estimate' | 'derived', data: Record<string, unknown>) => {
|
|
593
594
|
try { debug.log('goal-author.decompose', event, { surface: 'goal-author', sizeSource, ...data,
|
|
594
595
|
...(options?.runId === undefined ? {} : { runId: options.runId }) }); } catch { /* observation is fail-soft */ }
|
|
595
596
|
};
|
|
596
597
|
let redecomposed = 0;
|
|
597
598
|
let measured = await measure(candidate);
|
|
598
599
|
let sizes = measured.sizes;
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
600
|
+
for (let retry = 0; ; retry++) {
|
|
601
|
+
if (sizes) observe('slice-sized', measured.sizeSource, { retry, slices: sizes });
|
|
602
|
+
const oversized = sizes?.flatMap((size, index) => size.tier === 'high' ? [index] : []) ?? [];
|
|
603
|
+
if (sizes && oversized.length === 0) break;
|
|
604
|
+
observe('slice-oversize', measured.sizeSource, { retry, indexes: oversized,
|
|
603
605
|
reasons: sizes ? oversized.map((index) => sizes![index]!.unavoidableReason) : [],
|
|
604
606
|
...(sizes ? {} : { error: 'size metadata missing or inconsistent' }) });
|
|
607
|
+
if (retry === 2) {
|
|
608
|
+
if (!sizes) throw new Error('goal-author slice sizing: size metadata missing after 2 resplits');
|
|
609
|
+
const unavoidableReason = 'auto';
|
|
610
|
+
for (const index of oversized) sizes[index] = { ...sizes[index]!,
|
|
611
|
+
unavoidableReason: sizes[index]!.unavoidableReason ?? unavoidableReason };
|
|
612
|
+
observe('slice-oversize-unavoidable', measured.sizeSource, {
|
|
613
|
+
goalId: options?.goalId ?? config.goalId ?? null,
|
|
614
|
+
resplitCount: redecomposed,
|
|
615
|
+
slices: oversized.map((index) => ({ index, ...sizes![index]! })),
|
|
616
|
+
});
|
|
617
|
+
break;
|
|
618
|
+
}
|
|
619
|
+
observe('resplit', measured.sizeSource, { retry: retry + 1, indexes: oversized,
|
|
620
|
+
...(sizes ? {} : { reason: 'size metadata missing or inconsistent' }) });
|
|
605
621
|
const retryAsk = [objective, '', 'The previous goal-author proposal had missing size metadata or oversized slices.',
|
|
606
622
|
`PREVIOUS_STEPS_JSON: ${JSON.stringify(candidate)}`,
|
|
607
623
|
`OVERSIZED_INDEXES_JSON: ${JSON.stringify(oversized)}`,
|
|
608
|
-
|
|
609
|
-
'If an oversized slice truly cannot split, leave it high and state a concrete unavoidable reason.'].join('\n');
|
|
624
|
+
`RESPLIT_ATTEMPT: ${retry + 1} of 2. Regenerate the full plan; preserve fitting slices and split every oversized slice into dependent low/medium slices. If any oversized slice remains after the second resplit, keep it as high tier; a concrete unavoidable reason is optional because the system marks it unavoidable=auto.`].join('\n');
|
|
610
625
|
const regenerated = await decompose(retryAsk);
|
|
611
626
|
if (!regenerated.length) throw new Error('goal-author slice sizing: regeneration produced no slices');
|
|
612
|
-
redecomposed
|
|
627
|
+
redecomposed++;
|
|
613
628
|
candidate = ensureDeviceFirstSteps(objective, regenerated, config.repositoryRoot).steps;
|
|
614
629
|
rationale = decompositionRationale;
|
|
615
630
|
measured = await measure(candidate);
|
|
616
631
|
sizes = measured.sizes;
|
|
617
|
-
if (!sizes) throw new Error('goal-author slice sizing: size metadata missing after
|
|
618
|
-
observe('slice-sized', measured.sizeSource, { retry: 1, slices: sizes });
|
|
619
|
-
const remaining = sizes.flatMap((size, index) => size.tier === 'high' ? [index] : []);
|
|
620
|
-
if (remaining.length) observe('slice-oversize', measured.sizeSource, { retry: 1, indexes: remaining,
|
|
621
|
-
reasons: remaining.map((index) => sizes![index]!.unavoidableReason) });
|
|
622
|
-
if (remaining.some((index) => !sizes![index]!.unavoidableReason))
|
|
623
|
-
throw new Error('goal-author slice sizing: high slice lacks unavoidable reason after one retry');
|
|
632
|
+
if (!sizes && retry === 1) throw new Error('goal-author slice sizing: size metadata missing after 2 resplits');
|
|
624
633
|
}
|
|
625
634
|
config.onSizedSlices?.(restoreSlicePaths(publicSizedSlices(candidate, sizes), objective), redecomposed);
|
|
626
635
|
return finalize(candidate, rationale);
|
|
@@ -39,7 +39,7 @@ export function resolveGoalAuthorGrade(flag?: GoalAuthorGrade, configured?: unkn
|
|
|
39
39
|
import type { ObserveOnlySource } from './observe-only.js';
|
|
40
40
|
import type { Question } from '../ask-user-question/types.js';
|
|
41
41
|
import { requestTestScenario as defaultRequestTestScenario, type TestScenarioRequestInput, type TestScenarioRequestResult } from './test-scenario-request.js';
|
|
42
|
-
import { resolveGoalAuthorClarification, parseGoalDocumentClarifications, serializeGoalAuthorParent, type GoalAuthorClarificationResponse, type GoalAuthorParent, type GoalAuthorSelfResolution } from './goal-author-clarification.js';
|
|
42
|
+
import { defaultGoalAuthorSelfResolve, resolveGoalAuthorClarification, parseGoalDocumentClarifications, serializeGoalAuthorParent, type GoalAuthorClarificationResponse, type GoalAuthorParent, type GoalAuthorSelfResolution } from './goal-author-clarification.js';
|
|
43
43
|
import { acquireLockSync } from '../storage/file-lock.js';
|
|
44
44
|
import { createRepositoryReferencedFileReader, type ReferencedFileReadResult } from './goal-file-reader.js';
|
|
45
45
|
import { extractGoalDocSections, type GoalDocSourceLine } from './goal-doc/section.js';
|
|
@@ -59,6 +59,7 @@ import { declaredNewFilePaths } from './goal-new-paths.js';
|
|
|
59
59
|
import { classifyGoalCommandExecution, type GoalCommandExecutionResult } from './goal-command-execution.js';
|
|
60
60
|
import { identityLines, repositoryIdentifiers } from './goal-author-identity.js';
|
|
61
61
|
import { selectRelevantAuthoringLessons } from './knowhow-pack.js';
|
|
62
|
+
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
62
63
|
export { selectRelevantAuthoringLessons } from './knowhow-pack.js';
|
|
63
64
|
export { formatSubmittedAt } from './goal-author-identity.js';
|
|
64
65
|
import { hasUnmetRequirementOutsidePreservationClause } from './goal-author-preservation-obligation.js';
|
|
@@ -116,7 +117,7 @@ export interface GoalAuthorDeps {
|
|
|
116
117
|
/** Optional externally decomposed plan steps rendered verbatim into the authored goal; the author never generates them. */
|
|
117
118
|
steps?: readonly string[];
|
|
118
119
|
/** Optional injected decomposition seam; omitted means authoring never invokes an LLM or decomposition. */
|
|
119
|
-
decomposeSteps?: (objective: string, opts?: { context?: string; runId?: string }) => Promise<readonly string[]>;
|
|
120
|
+
decomposeSteps?: (objective: string, opts?: { context?: string; runId?: string; goalId?: string }) => Promise<readonly string[]>;
|
|
120
121
|
/** Optional launch preflight result supplied by the caller; authoring never reads the ledger or logs itself. */
|
|
121
122
|
launchPreflight?: LaunchPreflightResult;
|
|
122
123
|
/** Optional in-process notification for each authored-goal phase transition. */
|
|
@@ -3907,6 +3908,8 @@ function renderClarification(
|
|
|
3907
3908
|
` - includeOther: ${question.includeOther !== false}`,
|
|
3908
3909
|
` - answer: ${answerValue}`,
|
|
3909
3910
|
...(provenance ? [` - provenance.source: ${provenance.source}`] : []),
|
|
3911
|
+
...(provenance?.assumption ? [` - provenance.assumption: ${renderClarificationValue(provenance.assumption)}`] : []),
|
|
3912
|
+
...(provenance?.assumptionSource ? [` - provenance.assumption-source: ${provenance.assumptionSource}`] : []),
|
|
3910
3913
|
...(provenance?.evidence ?? []).map((evidence) => ` - evidence: ${renderClarificationValue(evidence)}`),
|
|
3911
3914
|
];
|
|
3912
3915
|
}
|
|
@@ -6031,6 +6034,7 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6031
6034
|
throw new Error('legacy parent document has no RootIntent; rootIntent is required');
|
|
6032
6035
|
}
|
|
6033
6036
|
const rootIntent = validateRootIntent(supersessionRootIntent ?? inheritedRootIntent ?? requestedRootIntent ?? goalSummary(enhancement.original));
|
|
6037
|
+
const assignedGoalId = deps.goalId ?? generateGoalId();
|
|
6034
6038
|
let resolvedSteps = deps.steps;
|
|
6035
6039
|
if (resolvedSteps === undefined && goalType === 'implement' && deps.decomposeSteps) {
|
|
6036
6040
|
const startedAt = Date.now();
|
|
@@ -6041,7 +6045,7 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6041
6045
|
? [device.exists ? `existing: ${device.device}` : `missing: ${device.device}`] : undefined;
|
|
6042
6046
|
const context = [facts?.context, deviceInventory?.length ? `Device inventory (measured at goal-author repository root): ${deviceInventory.join(', ')}` : undefined]
|
|
6043
6047
|
.filter(Boolean).join('\n') || undefined;
|
|
6044
|
-
const decomposed = await deps.decomposeSteps(ask, { context, runId: process.env.ELANOUS_RUN_ID?.trim() || authorRunId });
|
|
6048
|
+
const decomposed = await deps.decomposeSteps(ask, { context, runId: process.env.ELANOUS_RUN_ID?.trim() || authorRunId, goalId: assignedGoalId });
|
|
6045
6049
|
if (decomposed.length > 0) resolvedSteps = decomposed;
|
|
6046
6050
|
} catch {
|
|
6047
6051
|
failed = true;
|
|
@@ -6270,7 +6274,6 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6270
6274
|
// ⚠️⭐ 계약 — 이 줄은 조립·린트가 «끝나기 전»에 난다(goalId 가 여기서 정해지므로 더 늦출 수 없다).
|
|
6271
6275
|
// ⇒ 저작이 그 «뒤»에 실패하면 이 조인 행만 남는다(dangling). 그러므로 ***집계는 「착지한 골」과의
|
|
6272
6276
|
// inner join 으로만 한다*** — 이 행 자체를 「골이 하나 생겼다」로 세면 «실패분까지» 센다(무인 리뷰 지적).
|
|
6273
|
-
const assignedGoalId = deps.goalId ?? generateGoalId();
|
|
6274
6277
|
const askFile = deps.askFile === undefined ? undefined : validateAskFile(deps.askFile);
|
|
6275
6278
|
try { observeGoalAuthor('goal-author', 'goal-id-assigned', { authorRunId, goalId: assignedGoalId, superseded: Boolean(deps.goalId) }); }
|
|
6276
6279
|
catch { /* 관측은 fail-soft */ }
|
|
@@ -6565,6 +6568,7 @@ export function defaultGoalAuthorDeps(cwd: string): GoalAuthorDeps {
|
|
|
6565
6568
|
},
|
|
6566
6569
|
readSourceFile: createRepositoryReferencedFileReader(cwd),
|
|
6567
6570
|
runHelpProbe: (argv) => runDefaultHelpProbe(cwd, argv),
|
|
6571
|
+
selfResolveClarification: defaultGoalAuthorSelfResolve,
|
|
6568
6572
|
};
|
|
6569
6573
|
}
|
|
6570
6574
|
|
|
@@ -6613,7 +6617,7 @@ export async function writeAuthoredGoal(
|
|
|
6613
6617
|
repositoryRoot: deps.repositoryRoot ?? groundingRoot,
|
|
6614
6618
|
};
|
|
6615
6619
|
const mandatoryGoalContextEvidence = goalContextEvidence(cwd);
|
|
6616
|
-
const authoringLessons = selectRelevantAuthoringLessons(cwd, ask);
|
|
6620
|
+
const authoringLessons = selectRelevantAuthoringLessons(cwd, ask, elanousStateRoot());
|
|
6617
6621
|
observeGoalAuthor('goal-author', 'authoring-lessons', {
|
|
6618
6622
|
status: authoringLessons.status,
|
|
6619
6623
|
invalidRows: authoringLessons.invalidRows,
|
|
@@ -14,6 +14,7 @@ import { pwaGraph, pwaReach } from '../../scripts/ci-pwa-build-gate.js';
|
|
|
14
14
|
import { changedPathPairs, changedTsFiles, readGitFile, requiredExportFieldsInChanges } from '../../scripts/ci-typecheck-changed.js';
|
|
15
15
|
import { classifyMergeFailure, clipRegateDetail, parseConflictFiles, type HostRegateFailure } from './regate-detail.js';
|
|
16
16
|
import { buildImporterTestIndex, isTestPath } from './importer-test-index.js';
|
|
17
|
+
import type { GateReceipt, GateReceiptIdentity } from './gate-receipt-registry.js';
|
|
17
18
|
|
|
18
19
|
/** Use pr-land's PWA reachability (including its undecidable-graph build fallback), not a blanket src/** trigger. */
|
|
19
20
|
export function needsPwaBuild(files: readonly string[], repoRoot: string, graph: (root: string) => ReturnType<typeof pwaGraph> = pwaGraph): boolean {
|
|
@@ -86,6 +87,10 @@ export type HostRegateDeps = {
|
|
|
86
87
|
prodFreezeRoot?: string;
|
|
87
88
|
runExposeGate?: typeof runExposeGate;
|
|
88
89
|
syncMergedChecklist?: typeof import('../release-loop/merged-pr-checklist.js').syncMergedPrChecklist;
|
|
90
|
+
/** GATE-ONCE-PER-HEAD (OP 10-27 23:0x): persistent passed-receipt registry file. Default: <git-common-dir>/elanous-host-regate/gate-receipts.json. */
|
|
91
|
+
gateReceiptPath?: string;
|
|
92
|
+
/** Environment the receipt fingerprint reads; production uses the host process env. */
|
|
93
|
+
gateReceiptEnv?: NodeJS.ProcessEnv;
|
|
89
94
|
};
|
|
90
95
|
|
|
91
96
|
/**
|
|
@@ -308,6 +313,20 @@ function removeBrokenSlotRegistration(repoRoot: string, worktree: string): void
|
|
|
308
313
|
}
|
|
309
314
|
}
|
|
310
315
|
|
|
316
|
+
/** GATE-ONCE-PER-HEAD: 생산 등록부는 host-regate 슬롯과 같은 Git common directory 에 산다. 못 찾으면 승계 없이 원래 검사로 연다. */
|
|
317
|
+
function defaultGateReceiptPath(repoRoot: string, command: NonNullable<HostRegateDeps['command']>): string | undefined {
|
|
318
|
+
const r = command('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], repoRoot);
|
|
319
|
+
const dir = r.status === 0 ? r.stdout.trim() : '';
|
|
320
|
+
return dir ? join(dir, 'elanous-host-regate', 'gate-receipts.json') : undefined;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/** 영수증의 Bun 식별값 — 검사를 실제로 돌릴 그 Bun. 못 재면 null 로 승계를 닫는다(빈 값으로 흐리지 않는다). */
|
|
324
|
+
function commandBunVersion(command: NonNullable<HostRegateDeps['command']>, cwd: string): string | null {
|
|
325
|
+
const r = command('bun', ['--version'], cwd);
|
|
326
|
+
const version = r.status === 0 ? r.stdout.trim() : '';
|
|
327
|
+
return version || null;
|
|
328
|
+
}
|
|
329
|
+
|
|
311
330
|
/** Callers: podSelfImplementSpawn in src/task-orchestrator/surfaces/self-implement-pod.ts calls
|
|
312
331
|
* (options.hostRegate ?? runHostRegate)({ prNumber, headCommit, repoRoot: hostRoot, ... });
|
|
313
332
|
* sweepFrozenMerges in frozen-merges.ts also calls runHostRegate(entry); landing queue serialization stays there. */
|
|
@@ -383,6 +402,7 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
383
402
|
let stalePrBase: string | undefined;
|
|
384
403
|
const initialPrBase = baseCommit;
|
|
385
404
|
let buildPwa = false;
|
|
405
|
+
let typecheckBase = '';
|
|
386
406
|
// REGATE-PWA-DEPS-FOR-TSC (#26698 → #27484 must-fix): the typecheck gate picks its own changed set and its own
|
|
387
407
|
// whole-repository promotion triggers — TSC_BASE_REF..HEAD — which can carry apps/pwa files that landed on
|
|
388
408
|
// main after this PR branched, and root-file export changes that widen the inspection to the whole repository.
|
|
@@ -494,54 +514,109 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
494
514
|
// apps/pwa/ OR any of its whole-repository promotion triggers (필수 export 필드 추가 · exported 심볼 삭제 ·
|
|
495
515
|
// exported 함수 매개변수 증가, in ANY changed file), even when buildPwa never turns on: without app deps
|
|
496
516
|
// the gate fails such runs as «의존성 없음» for environment reasons, not code defects.
|
|
497
|
-
|
|
517
|
+
typecheckBase = input.verifyOnly ? baseCommit : base;
|
|
498
518
|
typecheckTouchesPwa = typecheckGateTouchesPwa(worktree, typecheckBase, command);
|
|
499
519
|
if ((buildPwa || typecheckTouchesPwa) && existsSync(join(worktree, 'apps/pwa'))) provide('apps/pwa', 'next');
|
|
500
520
|
} catch (e) { return result('unmeasured', 'worktree', String(e)); }
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
521
|
+
// GATE-ONCE-PER-HEAD (0.2.40 첫 조각 · OP 10-27 23:0x 지시): 입장 검사(PR open/ready·head/base 재검증)와
|
|
522
|
+
// 통합 후보 구성이 끝난 뒤, 지속 등록부에서 이 측정의 key 로 통과 영수증을 찾는다. 정확히 같은
|
|
523
|
+
// head·측정 base·Bun/lockfile·radius·검사 범위·환경의 통과 영수증만 아래 비용 큰 검사를 승계하고,
|
|
524
|
+
// 불일치·결손·불완전·실패/측정불가 영수증은 원래 검사를 그대로 실행한다 — 영수증이 커버하지 않는
|
|
525
|
+
// 검사는 승계하지 않는다. 등록부를 못 쓰는 경우도 검사 쪽으로 실패 열린다.
|
|
526
|
+
const gateReceiptPath = deps.gateReceiptPath ?? defaultGateReceiptPath(input.repoRoot, command);
|
|
527
|
+
// Gate receipt support is optional for this host path. Keep its registry and test-env helpers
|
|
528
|
+
// outside the Next TUI's static startup closure, loading them only when receipt lookup is enabled.
|
|
529
|
+
const gateReceiptRegistry = gateReceiptPath ? await import('./gate-receipt-registry.js') : null;
|
|
530
|
+
const gateChecks = [
|
|
531
|
+
`test-interference:${input.verifyOnly ? 'changed-only' : 'with-neighbours'}`,
|
|
532
|
+
...(publicExposureFiles(files).length > 0 ? ['expose'] : []),
|
|
533
|
+
`typecheck@${typecheckBase}`,
|
|
534
|
+
...((deps.command || existsSync(join(worktree, 'scripts/ci-isolation-hardcode-gate.ts'))) ? ['isolation-gate'] : []),
|
|
535
|
+
...(buildPwa ? ['nexus-build'] : []),
|
|
536
|
+
];
|
|
537
|
+
let gateReceiptIdentity: GateReceiptIdentity | undefined;
|
|
538
|
+
let gateReceiptKey = '';
|
|
539
|
+
let gateReceiptReused = false;
|
|
540
|
+
let gateReceiptDecline = 'gate receipt registry unavailable';
|
|
541
|
+
if (gateReceiptPath) {
|
|
522
542
|
try {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
543
|
+
const bunVersion = commandBunVersion(command, worktree);
|
|
544
|
+
if (bunVersion === null) gateReceiptDecline = 'bun version unavailable';
|
|
545
|
+
else {
|
|
546
|
+
gateReceiptIdentity = {
|
|
547
|
+
headCommit: input.headCommit,
|
|
548
|
+
baseCommit,
|
|
549
|
+
bunVersion,
|
|
550
|
+
lockfileHash: gateReceiptRegistry!.gateLockfileHash(worktree),
|
|
551
|
+
radiusFiles: [...new Set(files)].sort(),
|
|
552
|
+
checks: gateChecks,
|
|
553
|
+
envFingerprint: gateReceiptRegistry!.gateEnvFingerprint(deps.gateReceiptEnv ?? process.env),
|
|
554
|
+
};
|
|
555
|
+
gateReceiptKey = gateReceiptRegistry!.computeReceiptKey(gateReceiptIdentity, 'passed');
|
|
556
|
+
const registry = gateReceiptRegistry!.loadGateReceipts(gateReceiptPath);
|
|
557
|
+
const stored = registry[gateReceiptKey];
|
|
558
|
+
if (stored && gateReceiptRegistry!.gateReceiptSelfKey(stored) === gateReceiptKey) gateReceiptReused = true;
|
|
559
|
+
else gateReceiptDecline = stored ? 'stored receipt does not recompute to its own key' : gateReceiptRegistry!.describeGateReceiptDecline(gateReceiptIdentity, registry);
|
|
560
|
+
}
|
|
561
|
+
} catch (e) { gateReceiptDecline = `gate receipt lookup failed: ${String(e).slice(0, 200)}`; }
|
|
541
562
|
}
|
|
542
|
-
if (
|
|
543
|
-
|
|
544
|
-
|
|
563
|
+
if (gateReceiptReused) debug.log('harness.host-regate', 'gate-receipt-reuse', { pr: input.prNumber, key: gateReceiptKey, checks: gateChecks });
|
|
564
|
+
else debug.log('harness.host-regate', 'gate-receipt-decline', { pr: input.prNumber, ...(gateReceiptKey ? { key: gateReceiptKey } : {}), reason: gateReceiptDecline });
|
|
565
|
+
if (!gateReceiptReused) {
|
|
566
|
+
try {
|
|
567
|
+
const interferenceOptions = { neighbors: !input.verifyOnly };
|
|
568
|
+
const interference = await (deps.interference ?? ((f: readonly string[], c: string) => defaultInterference(f, c, interferenceOptions)))(files, worktree);
|
|
569
|
+
if (interference.neighborsTrimmed || interference.importerTrimmed) interferenceNote = {
|
|
570
|
+
...(interference.neighborsTrimmed ? { neighborsTrimmed: interference.neighborsTrimmed } : {}),
|
|
571
|
+
...(interference.importerTrimmed ? { importerTrimmed: interference.importerTrimmed } : {}),
|
|
572
|
+
interferenceDetail: (interference.detail ?? '').slice(0, 300),
|
|
573
|
+
};
|
|
574
|
+
if (!interference.passed) return result(interference.unmeasured ? 'unmeasured' : 'failed', 'test-interference', interference.detail);
|
|
575
|
+
} catch (e) { return result('unmeasured', 'test-interference', String(e)); }
|
|
576
|
+
// Landing can also be initiated by the host after the child gate; judge the checked PR here too.
|
|
577
|
+
if (publicExposureFiles(files).length > 0) {
|
|
578
|
+
const exposure = (deps.runExposeGate ?? runExposeGate)(worktree, files,
|
|
579
|
+
getUserConfig().harness?.exposeGate === 'strict' ? 'strict' : 'warn',
|
|
580
|
+
(bin, args, dir) => command(bin, args, dir));
|
|
581
|
+
if (!exposure.passed) return result('failed', 'expose', exposure.log);
|
|
582
|
+
}
|
|
583
|
+
// The checked checkout is shared with interference/exposure gates. Verify dependencies at the
|
|
584
|
+
// typecheck boundary as well: a missing PWA link here made #27414 fail as an unmeasured host regate.
|
|
585
|
+
if ((buildPwa || typecheckTouchesPwa) && !existsSync(join(worktree, 'apps/pwa/node_modules'))) {
|
|
586
|
+
let failure: string | null = null;
|
|
587
|
+
try {
|
|
588
|
+
if (existsSync(join(worktree, 'apps/pwa'))) {
|
|
589
|
+
provideCheckoutDependencies(worktree, input.repoRoot, 'apps/pwa', 'next', (cwd) => { run('bun', ['install', '--frozen-lockfile'], cwd); });
|
|
590
|
+
} else failure = 'apps/pwa absent before typecheck';
|
|
591
|
+
} catch (e) { failure = String(e); }
|
|
592
|
+
const ready = existsSync(join(worktree, 'apps/pwa/node_modules'));
|
|
593
|
+
if (!ready && !failure) failure = 'apps/pwa/node_modules absent after provision before typecheck';
|
|
594
|
+
try { debug.log('harness.host-regate', 'pwa-dependencies-before-typecheck', { pr: input.prNumber, restored: ready, failure }); } catch { /* observation must not block regate */ }
|
|
595
|
+
if (!ready) return result('unmeasured', 'dependencies', failure!);
|
|
596
|
+
}
|
|
597
|
+
// verifyOnly: 통합 후보는 «지금 main 끝»(baseCommit)에 얹은 것이다 — 옛 merge-base 로 비교하면 그사이 main 착지분
|
|
598
|
+
// 수백 파일이 «이 PR 의 변경»으로 잡혀 저장소 전체 검사로 승격된다(2026-09-28 #21239 실측: 456파일 · PWA 636건).
|
|
599
|
+
try { run('bun', ['scripts/ci-typecheck-changed.ts'], worktree, { ...process.env, TSC_BASE_REF: typecheckBase }); }
|
|
600
|
+
catch (e) { return result(String(e).includes('error TS') ? 'failed' : 'unmeasured', 'typecheck', String(e)); }
|
|
601
|
+
// ⛔ 2026-09-28: a Pod landing brought `join(home, '.elanous', …)` into main without this gate, and every human
|
|
602
|
+
// `pr land` after it failed the isolation gate regardless of its own files (#21336 → #21343).
|
|
603
|
+
if (deps.command || existsSync(join(worktree, 'scripts/ci-isolation-hardcode-gate.ts'))) {
|
|
604
|
+
try { run('bun', ['scripts/ci-isolation-hardcode-gate.ts', '--changed-files', ...files], worktree); }
|
|
605
|
+
catch (e) { return result(/\[isolation-gate\] FAIL/.test(String(e)) ? 'failed' : 'unmeasured', 'isolation-gate', String(e)); }
|
|
606
|
+
}
|
|
607
|
+
if (buildPwa) {
|
|
608
|
+
try { run('bun', ['bin/elanous.mjs', '--test', 'nexus', 'build'], worktree); }
|
|
609
|
+
catch (e) { return result(String(e).includes('command unavailable') ? 'unmeasured' : 'failed', 'nexus-build', String(e)); }
|
|
610
|
+
}
|
|
611
|
+
// 원래 검사가 모두 통과했다 — 이 측정의 통과 영수증을 지속 등록부에 원자적으로 남긴다.
|
|
612
|
+
// 저장 실패는 영수증 최적화의 실패일 뿐 게이트 판정이 아니므로 관측만 남긴다.
|
|
613
|
+
if (gateReceiptPath && gateReceiptIdentity && gateReceiptRegistry) {
|
|
614
|
+
try {
|
|
615
|
+
const receipt: GateReceipt = { ...gateReceiptIdentity, schema: gateReceiptRegistry.GATE_RECEIPT_SCHEMA, key: gateReceiptRegistry.computeReceiptKey(gateReceiptIdentity, 'passed'), verdict: 'passed', savedAt: new Date().toISOString() };
|
|
616
|
+
gateReceiptRegistry.saveGateReceipt(gateReceiptPath, receipt);
|
|
617
|
+
debug.log('harness.host-regate', 'gate-receipt-saved', { pr: input.prNumber, key: receipt.key, checks: gateChecks });
|
|
618
|
+
} catch (e) { debug.log('harness.host-regate', 'gate-receipt-save-failed', { pr: input.prNumber, error: String(e).slice(0, 200) }); }
|
|
619
|
+
}
|
|
545
620
|
}
|
|
546
621
|
let current: PrView;
|
|
547
622
|
try { current = readPr(); }
|
|
@@ -576,8 +651,8 @@ export async function runHostRegate(input: HostRegateInput, deps: HostRegateDeps
|
|
|
576
651
|
if (merged.state !== 'MERGED') return result('unmeasured', 'merge-confirm', `PR state after merge is ${merged.state ?? 'unknown'}`);
|
|
577
652
|
landed = true;
|
|
578
653
|
try {
|
|
579
|
-
const sync = deps.syncMergedChecklist ?? (await import('../release-loop/merged-pr-checklist.js')).
|
|
580
|
-
sync(input.prNumber, input.repoRoot, input.goalFile);
|
|
654
|
+
const sync = deps.syncMergedChecklist ?? (await import('../release-loop/merged-pr-checklist.js')).syncMergedPrChecklistWithFeedback;
|
|
655
|
+
await sync(input.prNumber, input.repoRoot, input.goalFile);
|
|
581
656
|
} catch (error) {
|
|
582
657
|
debug.log('release.checklist', 'merged-pr-sync-failed', { pr: input.prNumber, error: String(error) });
|
|
583
658
|
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IMPL-FINDINGS-FEEDBACK — 병합 PR 본문의 «구현이 밝힌 요구사항»·«새 범위»·«남은 것» 절을
|
|
3
|
+
* idempotent 원장(`appendRunLedgerEntryChecked`)에 1회 기록하고, 관련 기록만 다음 저작
|
|
4
|
+
* (goal-author) 입력에 주입하며, 남은 것에서 후속 초안을 만든다(자동 발사 없음 — shadow 기본).
|
|
5
|
+
*
|
|
6
|
+
* 절 파싱은 `markdownSection`(goal-author)과 `remainingPiecesFromPrBody`(follow-up-goals)을
|
|
7
|
+
* 재사용하고, 관련 교훈 선택은 `selectRelevantAuthoringLessons`(knowhow-pack)을 재사용한다.
|
|
8
|
+
* 모든 관측은 `self-implement.impl-findings-feedback` 범주로 `debug.log` 에 남는다.
|
|
9
|
+
*/
|
|
10
|
+
import { debug } from '../debug/log.js';
|
|
11
|
+
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
12
|
+
import { markdownSection } from './goal-author.js';
|
|
13
|
+
import { selectRelevantAuthoringLessons, type SelectedAuthoringLessons } from './knowhow-pack.js';
|
|
14
|
+
import { appendRunLedgerEntryChecked, type RunLedgerCheckedAppendDecision, type RunLedgerEntry } from './run-ledger.js';
|
|
15
|
+
import { recordFollowUpOnMerge, remainingPiecesFromPrBody, type FollowUpDraftRecord, type FollowUpMergeInput, type FollowUpSeams } from './follow-up-goals.js';
|
|
16
|
+
|
|
17
|
+
/** 원장 이벤트 이름 — 같은 PR 의 되먹임 기록은 이 이벤트로 정확히 한 번만 남는다. */
|
|
18
|
+
export const IMPL_FINDINGS_LEDGER_EVENT = 'impl-findings-feedback';
|
|
19
|
+
export const IMPL_FINDINGS_REQUIREMENTS_SECTION = '구현이 밝힌 요구사항';
|
|
20
|
+
export const IMPL_FINDINGS_NEW_SCOPE_SECTION = '새 범위';
|
|
21
|
+
export const IMPL_FINDINGS_REMAINING_SECTION = '남은 것';
|
|
22
|
+
|
|
23
|
+
/** 병합 PR 본문에서 파싱한 세 절. */
|
|
24
|
+
export interface ImplFindings {
|
|
25
|
+
/** «구현이 밝힌 요구사항» 절 본문(verbatim trim). */
|
|
26
|
+
requirements: string;
|
|
27
|
+
/** «새 범위» 절 본문(verbatim trim). */
|
|
28
|
+
newScope: string;
|
|
29
|
+
/** «남은 것» 절(⊕ follow-up-goals 의 «남은 조각» 절)의 항목 — 순서 보존·중복 제거. */
|
|
30
|
+
remaining: string[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function sectionBullets(body: string): string[] {
|
|
34
|
+
return body
|
|
35
|
+
.split(/\r?\n/)
|
|
36
|
+
.map((line) => line.match(/^\s*[-*]\s+(.+?)\s*$/)?.[1] ?? '')
|
|
37
|
+
.map((item) => item.trim())
|
|
38
|
+
.filter(Boolean);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** 병합 PR 본문의 세 절을 exact-trimmed `## ` 제목으로 파싱한다 — 펜스 안 본문은 건너뛴다. */
|
|
42
|
+
export function parseImplFindings(prBody: string): ImplFindings {
|
|
43
|
+
const requirements = (markdownSection(prBody, IMPL_FINDINGS_REQUIREMENTS_SECTION) ?? '').trim();
|
|
44
|
+
const newScope = (markdownSection(prBody, IMPL_FINDINGS_NEW_SCOPE_SECTION) ?? '').trim();
|
|
45
|
+
const remainingSection = (markdownSection(prBody, IMPL_FINDINGS_REMAINING_SECTION) ?? '');
|
|
46
|
+
const remaining = [...sectionBullets(remainingSection), ...remainingPiecesFromPrBody(prBody)]
|
|
47
|
+
.map((item) => item.trim())
|
|
48
|
+
.filter(Boolean);
|
|
49
|
+
return { requirements, newScope, remaining: [...new Set(remaining)] };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface ImplFindingsFeedbackInput {
|
|
53
|
+
runId: string;
|
|
54
|
+
prNumber: number;
|
|
55
|
+
/** 병합 PR 본문 원문 — 세 절을 여기서 파싱한다. */
|
|
56
|
+
prBody: string;
|
|
57
|
+
/** 다음 저작 입력의 원문 ask — 관련 교훈 선택의 경로 힌트로 쓴다. */
|
|
58
|
+
ask: string;
|
|
59
|
+
goalId?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type ImplFindingsLog = (category: string, event: string, data?: unknown) => void;
|
|
63
|
+
|
|
64
|
+
export interface ImplFindingsFeedbackSeams {
|
|
65
|
+
/** 원장 디렉터리 — 생략하면 정본 run ledger dir. */
|
|
66
|
+
dir?: string;
|
|
67
|
+
log?: ImplFindingsLog;
|
|
68
|
+
/** 관련 교훈 선택 심 — 생략하면 정본 `selectRelevantAuthoringLessons`. */
|
|
69
|
+
selectLessons?: (root: string, ask: string) => SelectedAuthoringLessons;
|
|
70
|
+
/** 후속 초안 기록 심 — 생략하면 정본 `recordFollowUpOnMerge`(shadow 기본, 자동 발사 없음). */
|
|
71
|
+
followUp?: (input: FollowUpMergeInput, seams?: FollowUpSeams) => Promise<FollowUpDraftRecord | null>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface ImplFindingsFeedbackResult {
|
|
75
|
+
findings: ImplFindings;
|
|
76
|
+
/** 이 호출로 원장에 새 기록을 남겼는가 — 같은 PR 재주입이면 false(중복 억제). */
|
|
77
|
+
appended: boolean;
|
|
78
|
+
refusal: 'ledger-write-refused' | null;
|
|
79
|
+
/** 다음 저작(goal-author `authoringLessons`) 입력에 싣는 프롬프트 — 관련 기록만 담는다. */
|
|
80
|
+
authoringInjection: string;
|
|
81
|
+
lessonIds: readonly string[];
|
|
82
|
+
/** 주입한 절 이름(비어 있지 않은 것만). */
|
|
83
|
+
injectedSections: readonly string[];
|
|
84
|
+
/** 생략한 절 이름(비어 있어 주입하지 않은 것). */
|
|
85
|
+
skippedSections: readonly string[];
|
|
86
|
+
/** 후속 초안 기록 — 자동 발사는 하지 않는다(`queued:false`). */
|
|
87
|
+
followUp: FollowUpDraftRecord | null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* 병합 PR 착지(postland) 때 구현이 밝힌 절을 되먹임한다:
|
|
92
|
+
* ① 세 절을 idempotent 원장에 1회 기록(같은 PR 재주입은 중복 억제),
|
|
93
|
+
* ② 비어 있지 않은 절(관련 기록)만 다음 저작 입력 프롬프트에 주입하고 선택·생략 수를 로그에 남긴다,
|
|
94
|
+
* ③ 남은 것에서 후속 초안을 만든다 — 자동 발사는 하지 않는다(`recordFollowUpOnMerge` shadow 기본).
|
|
95
|
+
*/
|
|
96
|
+
export async function recordImplFindingsFeedback(
|
|
97
|
+
input: ImplFindingsFeedbackInput,
|
|
98
|
+
seams: ImplFindingsFeedbackSeams = {},
|
|
99
|
+
): Promise<ImplFindingsFeedbackResult> {
|
|
100
|
+
const log = seams.log ?? ((category, event, data) => { debug.log(category, event, data); });
|
|
101
|
+
const findings = parseImplFindings(input.prBody);
|
|
102
|
+
|
|
103
|
+
// ① idempotent 원장 1회 기록 — 같은 PR 번호의 되먹임 기록이 이미 있으면 append 하지 않는다.
|
|
104
|
+
const decide = (entries: RunLedgerEntry[] | null): RunLedgerCheckedAppendDecision<'duplicate'> => {
|
|
105
|
+
const duplicate = (entries ?? []).some((entry) => entry.event === IMPL_FINDINGS_LEDGER_EVENT
|
|
106
|
+
&& entry.data.prNumber === input.prNumber);
|
|
107
|
+
if (duplicate) return { append: false, result: 'duplicate' as const };
|
|
108
|
+
return {
|
|
109
|
+
append: true,
|
|
110
|
+
entry: {
|
|
111
|
+
timestamp: new Date().toISOString(),
|
|
112
|
+
runId: input.runId,
|
|
113
|
+
event: IMPL_FINDINGS_LEDGER_EVENT,
|
|
114
|
+
data: {
|
|
115
|
+
prNumber: input.prNumber,
|
|
116
|
+
paths: [...new Set(input.ask.match(/(?<![\w./~-])([\w.-]+(?:\/[\w.-]+)+\.[\w-]+)/gu)?.map((match) => match.replace(/[.,;:!?]+$/u, '')) ?? [])],
|
|
117
|
+
requirements: findings.requirements,
|
|
118
|
+
newScope: findings.newScope,
|
|
119
|
+
remaining: findings.remaining,
|
|
120
|
+
},
|
|
121
|
+
...(input.goalId ? { goalId: input.goalId } : {}),
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
const outcome = appendRunLedgerEntryChecked(input.runId, decide, seams.dir);
|
|
126
|
+
log('self-implement.impl-findings-feedback', outcome.refusal ? 'ledger-write-refused' : outcome.appended ? 'recorded' : 'duplicate-suppressed', {
|
|
127
|
+
prNumber: input.prNumber,
|
|
128
|
+
appended: outcome.appended,
|
|
129
|
+
remainingCount: findings.remaining.length,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// ② 관련 기록만 다음 저작 입력에 주입 — 비어 있지 않은 절 ⊕ 관련 교훈 프롬프트.
|
|
133
|
+
const injectedSections: string[] = [];
|
|
134
|
+
const skippedSections: string[] = [];
|
|
135
|
+
const sectionTexts: string[] = [];
|
|
136
|
+
const sections: readonly (readonly [string, string])[] = [
|
|
137
|
+
[IMPL_FINDINGS_REQUIREMENTS_SECTION, findings.requirements],
|
|
138
|
+
[IMPL_FINDINGS_NEW_SCOPE_SECTION, findings.newScope],
|
|
139
|
+
];
|
|
140
|
+
for (const [name, text] of sections) {
|
|
141
|
+
if (!text) { skippedSections.push(name); continue; }
|
|
142
|
+
injectedSections.push(name);
|
|
143
|
+
sectionTexts.push(`### ${name}\n${text}`);
|
|
144
|
+
}
|
|
145
|
+
const lessons = (seams.selectLessons ?? selectRelevantAuthoringLessons)(process.cwd(), input.ask, elanousStateRoot());
|
|
146
|
+
const authoringInjection = [
|
|
147
|
+
`## 구현이 밝힌 요구사항·새 범위(착지 PR #${input.prNumber})`,
|
|
148
|
+
...sectionTexts,
|
|
149
|
+
...(lessons.prompt ? [lessons.prompt] : []),
|
|
150
|
+
].join('\n\n');
|
|
151
|
+
log('self-implement.impl-findings-feedback', 'authoring-injection', {
|
|
152
|
+
prNumber: input.prNumber,
|
|
153
|
+
injectedSections,
|
|
154
|
+
skippedSections,
|
|
155
|
+
selected: lessons.ids.length,
|
|
156
|
+
status: lessons.status,
|
|
157
|
+
invalidRows: lessons.invalidRows,
|
|
158
|
+
lessonIds: lessons.ids,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// ③ 남은 것에서 후속 초안 — 자동 발사 없음(shadow 기본, `queued:false`).
|
|
162
|
+
const followUpInput = {
|
|
163
|
+
prNumber: input.prNumber,
|
|
164
|
+
prBody: input.prBody,
|
|
165
|
+
feature: input.ask,
|
|
166
|
+
followUpMustFix: findings.remaining,
|
|
167
|
+
...(input.goalId ? { cellId: input.goalId } : {}),
|
|
168
|
+
};
|
|
169
|
+
const followUp = await (seams.followUp
|
|
170
|
+
? seams.followUp(followUpInput)
|
|
171
|
+
: recordFollowUpOnMerge(followUpInput, { mode: 'shadow' }));
|
|
172
|
+
log('self-implement.impl-findings-feedback', followUp ? 'follow-up-drafted' : 'follow-up-none', {
|
|
173
|
+
prNumber: input.prNumber,
|
|
174
|
+
remainingCount: findings.remaining.length,
|
|
175
|
+
queued: followUp?.queued ?? null,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
findings,
|
|
180
|
+
appended: outcome.appended,
|
|
181
|
+
refusal: outcome.refusal,
|
|
182
|
+
authoringInjection,
|
|
183
|
+
lessonIds: lessons.ids,
|
|
184
|
+
injectedSections,
|
|
185
|
+
skippedSections,
|
|
186
|
+
followUp,
|
|
187
|
+
};
|
|
188
|
+
}
|