elanous 0.2.37 → 0.2.38
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 → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 1026-44010f405704050c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 1632.7d87f998e714bede.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4937-28d437999b77c9dd.js → 1923-5c1695332240246a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +1 -0
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{3199.6a1a9b0e6cd01dc6.js → 2415.738b777642a02233.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 3086.fb14b60ce98b53d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3124-561f7f037943cde2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 3291.f6c1005387d514bd.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
- package/apps/pwa/out/_next/static/chunks/{6877-84d47b7e85d0c41e.js → 3341-f09b9efbd7a82f70.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 3528.e4b8ab70d339f965.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{4036.d54e55e1ebf5acdc.js → 4804.6012b5cd33c22792.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{757-4fbaf50942b8c424.js → 5255-1b60d50eabe9f057.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 5307.d7328020227880c2.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 5638.107314dc479e2f37.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6493.27ad77de7aac7966.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1224.2ceca6c180d5130b.js → 7000.28157393caaf5343.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 7161-8f22db3ec5ed005e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{2479-fe7e188bd9402d14.js → 7311-60a7ea80d23c7521.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5952.294fc574a8625184.js → 7488.966b116789f3d41a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 7628.6b16863ac3972333.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 7954.4f7a8832663ee979.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 8019.21ca554a821dad01.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 8487.291666583bebe640.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 8879.ac06755bcf3e44a1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 8911.bf5e712acb25fb6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 8994d93e.33ba491f95345fc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +41 -0
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/{page-5c112c6d7c33656e.js → page-c348a3959c5b5fc6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-88a1edbff62eaf1d.js → page-d1d1210f99f620ae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/{page-b9af2ac1c4737ce8.js → page-7f569e533ddeecba.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/{page-fb9e639c107f5f72.js → page-a9d9a3e66459c1e0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → b7459770.6539b11860eb8a9c.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b7478fef.5917716286213fcc.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → bb6987f9.3647e1a23b0e3217.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/de8b930d.d94c0f42acf807fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → eaad0cba.771200940c529df7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.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/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/package.json +1 -1
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/brand/check.ts +13 -4
- 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/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +69 -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/gate-node.ts +161 -25
- 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/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +297 -8
- package/scripts/release-loop/resume.ts +13 -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 +29 -4
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/core-turn-bridge.ts +6 -1
- package/src/agent/run-context.ts +1 -1
- package/src/agent/task-notification.ts +3 -1
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +195 -27
- package/src/auto-research/question-ladder-contract.ts +137 -0
- package/src/auto-research/research-turn.ts +134 -0
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/bots/screen-probe.ts +1 -1
- package/src/capture/tui-self-report.ts +10 -2
- package/src/chat/index.ts +1 -0
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +48 -12
- package/src/cli/lesson-cli.ts +69 -9
- 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 +58 -5
- package/src/cli/release-checklist-read-cli.ts +5 -2
- package/src/cli/release-cli.ts +47 -9
- 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 +62 -23
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/context-bus/context-now.ts +86 -2
- package/src/core-turn/run-core-turn.ts +9 -2
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/index.ts +18 -17
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
- package/src/dashboard/term-slash-runtime.ts +2 -0
- package/src/dashboard/turn-preamble.ts +28 -4
- package/src/domains/guardian-tick.ts +9 -0
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/runner.ts +17 -2
- package/src/grok/credential.ts +107 -36
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +44 -14
- package/src/intake-plane/collect-telegram-saved.ts +54 -5
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm-tool-schema.ts +20 -0
- package/src/llm.ts +81 -11
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +6 -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/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-shell/pty-manifest.ts +16 -2
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/repl/index.ts +10 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +88 -0
- package/src/research/output-router.ts +127 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +41 -5
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +29 -16
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/run-supervisor.ts +22 -7
- package/src/self-dev/shard-run.ts +260 -3
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/doctor-visit.ts +25 -0
- package/src/self-implement/gate-artifacts.ts +2 -2
- package/src/self-implement/gate-baseline.ts +44 -9
- package/src/self-implement/gate-cli.ts +151 -86
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-remote.ts +2 -0
- package/src/self-implement/goal-author.ts +74 -3
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +38 -4
- package/src/self-implement/knowhow-pack.ts +120 -7
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +23 -0
- package/src/self-implement/orchestrator.ts +55 -12
- 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 +258 -0
- package/src/self-implement/seams.ts +33 -10
- package/src/self-implement/self-implement-cli.ts +26 -2
- 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 +3 -0
- package/src/session/index.ts +2 -0
- package/src/session-runtime/index.ts +9 -22
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/schedule-wakeup.ts +1 -6
- package/src/status/bar.ts +3 -3
- package/src/storage/file-lock.ts +17 -4
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/parent-host.ts +59 -12
- package/src/task-agent/repair-cycle.ts +67 -8
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/task-hand.ts +98 -10
- package/src/task-agent/tier-split.ts +37 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
- package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +126 -48
- 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/tui/chat/background-job-status.ts +8 -2
- package/src/tui/entry.ts +469 -31
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +176 -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-client/local-chat-turn.ts +29 -8
- package/src/user-config.ts +11 -2
- package/src/ux-sim/fake-llm.ts +11 -5
- package/src/ux-sim/next-tui-seat-scenarios.ts +53 -1
- package/src/version/packed-revision.json +1 -1
- 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/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/2318-450e75d07605b8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.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/3212.12179fd3eee8cef1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3578.4e9f9948a9a6f2f4.js +0 -2
- 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/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/4313.76f232c304a15bde.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/4725-34bed25720cc326b.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/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/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/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/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/layout-09788e1aa9a87db6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.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/morning/page-1e5da297557d2354.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/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/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/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/term/page-ac2c1e6169cfce57.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/workspace/page-c1c80e345fa9d6f5.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 → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statfsSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { availableParallelism, freemem, tmpdir } from 'node:os';
|
|
2
|
+
import { availableParallelism, freemem, loadavg, tmpdir, totalmem } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
5
5
|
import { prepareDeterministicChildEnvironment } from '../../scripts/lib/deterministic-env.js';
|
|
6
6
|
import { withGateTestEnv } from '../../scripts/lib/gate-test-env.js';
|
|
7
|
-
import { withBaselineWorktree } from '../self-implement/gate-baseline.js';
|
|
7
|
+
import { withBaselineWorktree, withBaselineWorktreeAsync } from '../self-implement/gate-baseline.js';
|
|
8
8
|
import { aggregateGateTestShards, type GateShardAttempt, type GateShardAggregate } from './shard-aggregate.js';
|
|
9
9
|
import { GateShardCapacityError, planFixedGateTestShards, planSelfGateSpawnSeparatedShards, type GateTestShard } from './shard-plan.js';
|
|
10
10
|
import { isGateSpawnLaneFile } from './spawn-lane-files.js';
|
|
@@ -27,6 +27,15 @@ export interface ShardRunResult {
|
|
|
27
27
|
unmeasuredByShard?: Record<string, string>;
|
|
28
28
|
/** git stderr tail (redacted · ≤2KB · one line) when the baseline worktree could not be added. */
|
|
29
29
|
baselineStderrTail?: string;
|
|
30
|
+
/** Effective live pool width and its host-load/memory decision, for gate artifacts and diagnosis. */
|
|
31
|
+
concurrency?: number;
|
|
32
|
+
concurrencyReason?: string;
|
|
33
|
+
/** Wall time spent in singleton RSS samples and current+baseline bundles, respectively. */
|
|
34
|
+
measurementMs?: number;
|
|
35
|
+
bundleMs?: number;
|
|
36
|
+
/** Sum of process wall times across bundles (overlaps under concurrency). */
|
|
37
|
+
currentProcessMs?: number;
|
|
38
|
+
baselineProcessMs?: number;
|
|
30
39
|
}
|
|
31
40
|
|
|
32
41
|
/** What a failed shard process leaves behind so «test failure vs runner error» can be told apart after the fact. */
|
|
@@ -50,9 +59,11 @@ export interface ShardRunMode {
|
|
|
50
59
|
/** OP FU — sorted round-robin into `count` shards, zero pre-measurement runs. Default off: the measured planner. */
|
|
51
60
|
fixedDistribution?: boolean;
|
|
52
61
|
/** Measured on the executing host; override only for deterministic planning tests. */
|
|
53
|
-
hostResources?: { cores: number; freeMemoryGiB: number; freeTmpGiB: number };
|
|
62
|
+
hostResources?: { cores: number; freeMemoryGiB: number; freeTmpGiB: number; load1?: number };
|
|
54
63
|
/** Observation after each bundle's first current+baseline attempt; never controls retries or verdict. */
|
|
55
64
|
onShardComplete?: (progress: ShardRunProgress) => void;
|
|
65
|
+
/** Maximum concurrently active shard bundles. The default is three, bounded to one through four. */
|
|
66
|
+
concurrency?: number;
|
|
56
67
|
}
|
|
57
68
|
|
|
58
69
|
export interface ShardRunProgress {
|
|
@@ -73,14 +84,37 @@ function hostResources(): ShardRunMode['hostResources'] | undefined {
|
|
|
73
84
|
const availableKiB = /^MemAvailable:\s+(\d+)\s+kB/m.exec(readFileSync('/proc/meminfo', 'utf8'))?.[1];
|
|
74
85
|
if (availableKiB) freeMemoryGiB = Number(availableKiB) / (1024 ** 2);
|
|
75
86
|
}
|
|
87
|
+
if (process.platform === 'darwin') {
|
|
88
|
+
// macOS freemem excludes reclaimable cache; node-b reported 5 GiB free of 512 GiB while
|
|
89
|
+
// memory_pressure reported 91% available. A freemem cap would silently serialize the gate.
|
|
90
|
+
const pressure = Bun.spawnSync(['memory_pressure', '-Q'], { stdout: 'pipe', stderr: 'ignore', timeout: 2_000 });
|
|
91
|
+
const percent = /System-wide memory free percentage:\s*(\d+(?:\.\d+)?)%/.exec(Buffer.from(pressure.stdout).toString('utf8'))?.[1];
|
|
92
|
+
if (pressure.exitCode === 0 && percent !== undefined && Number(percent) >= 0 && Number(percent) <= 100) {
|
|
93
|
+
freeMemoryGiB = totalmem() / (1024 ** 3) * Number(percent) / 100;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
76
96
|
return {
|
|
77
97
|
cores: availableParallelism(),
|
|
78
98
|
freeMemoryGiB,
|
|
79
99
|
freeTmpGiB: Number(tmp.bavail) * Number(tmp.bsize) / (1024 ** 3),
|
|
100
|
+
load1: loadavg()[0],
|
|
80
101
|
};
|
|
81
102
|
} catch { return undefined; }
|
|
82
103
|
}
|
|
83
104
|
|
|
105
|
+
/** A conservative snapshot taken before sampling. Explicit 1 preserves the old serial child order. */
|
|
106
|
+
export function resolveShardConcurrency(configured: number | undefined, resources: ShardRunMode['hostResources'], budgetGiB: number): { count: number; reason: string } {
|
|
107
|
+
if (!resources || !Number.isFinite(resources.cores) || resources.cores < 1) return { count: Math.max(1, Math.min(4, configured ?? 3)), reason: configured === undefined ? 'default; host load unavailable' : 'configured; host load unavailable' };
|
|
108
|
+
const loadRatio = Number.isFinite(resources.load1) ? resources.load1! / resources.cores : null;
|
|
109
|
+
const target = configured ?? (loadRatio !== null && loadRatio >= 0.8 ? 2
|
|
110
|
+
: loadRatio !== null && loadRatio <= 0.35 && resources.cores >= 8 ? 4 : 3);
|
|
111
|
+
const cpuCap = Math.max(1, Math.floor(resources.cores));
|
|
112
|
+
const memoryCap = Number.isFinite(resources.freeMemoryGiB) && Number.isFinite(budgetGiB) && budgetGiB > 0
|
|
113
|
+
? Math.max(1, Math.floor(resources.freeMemoryGiB / budgetGiB)) : 4;
|
|
114
|
+
const count = Math.max(1, Math.min(4, target, cpuCap, memoryCap));
|
|
115
|
+
return { count, reason: `${configured === undefined ? 'adaptive' : `configured ${configured}`} · host load/cores ${loadRatio === null ? '?' : loadRatio.toFixed(2)} · free ${resources.freeMemoryGiB.toFixed(1)} GiB · shard budget ${budgetGiB} GiB` };
|
|
116
|
+
}
|
|
117
|
+
|
|
84
118
|
/** One expansion slot needs one CPU, one shard memory budget, and 1 GiB of free tmp space.
|
|
85
119
|
* Explicitly requested shards remain the caller's choice; this only limits automatic growth. */
|
|
86
120
|
export function maxAutomaticShardCount(requested: number, budgetGiB: number, resources: ShardRunMode['hostResources']): number {
|
|
@@ -104,6 +138,7 @@ export type ShardProcess = (cwd: string, files: readonly string[]) => {
|
|
|
104
138
|
/** Present only when the process failed (exit≠0 · signal · no JUnit) — observation only, never part of the verdict. */
|
|
105
139
|
failure?: ShardFailureOutput;
|
|
106
140
|
};
|
|
141
|
+
export type AsyncShardProcess = (cwd: string, files: readonly string[]) => Promise<ReturnType<ShardProcess>>;
|
|
107
142
|
|
|
108
143
|
export const SHARD_FAILURE_TAIL_BYTES = 64 * 1024;
|
|
109
144
|
|
|
@@ -113,6 +148,29 @@ function outputTail(bytes: Uint8Array | undefined): string {
|
|
|
113
148
|
return redactSecretText(Buffer.from(tail).toString('utf8'));
|
|
114
149
|
}
|
|
115
150
|
|
|
151
|
+
/** Drain a child pipe without retaining its entire output. Diagnostics need the opening context and failure tail. */
|
|
152
|
+
async function boundedChildOutput(stream: ReadableStream<Uint8Array>, abort: AbortSignal): Promise<Uint8Array> {
|
|
153
|
+
const reader = stream.getReader();
|
|
154
|
+
const cancel = () => { void reader.cancel('child output drain timed out').catch(() => {}); };
|
|
155
|
+
abort.addEventListener('abort', cancel, { once: true });
|
|
156
|
+
const headLimit = 1024;
|
|
157
|
+
let head = new Uint8Array(0);
|
|
158
|
+
let tail = new Uint8Array(0);
|
|
159
|
+
let total = 0;
|
|
160
|
+
try {
|
|
161
|
+
for (;;) {
|
|
162
|
+
const { done, value } = await reader.read();
|
|
163
|
+
if (done) break;
|
|
164
|
+
total += value.byteLength;
|
|
165
|
+
if (head.byteLength < headLimit) head = Buffer.concat([head, value.subarray(0, headLimit - head.byteLength)]);
|
|
166
|
+
tail = value.byteLength >= SHARD_FAILURE_TAIL_BYTES
|
|
167
|
+
? value.slice(-SHARD_FAILURE_TAIL_BYTES)
|
|
168
|
+
: Buffer.concat([tail, value]).subarray(-SHARD_FAILURE_TAIL_BYTES);
|
|
169
|
+
}
|
|
170
|
+
} finally { abort.removeEventListener('abort', cancel); reader.releaseLock(); }
|
|
171
|
+
return total <= SHARD_FAILURE_TAIL_BYTES ? tail : Buffer.concat([head, tail]);
|
|
172
|
+
}
|
|
173
|
+
|
|
116
174
|
/** `<shardId>.failure.json` per failed shard (shard ids are already `shard-<n>`). Top level = the latest current-side
|
|
117
175
|
* failure (else the latest baseline one); `failures` keeps every failed side/attempt. Returns the written paths. */
|
|
118
176
|
export function writeShardFailureEvidence(dir: string, evidence: readonly ShardFailureEvidence[]): string[] {
|
|
@@ -321,6 +379,146 @@ function runPlannedShards(
|
|
|
321
379
|
};
|
|
322
380
|
}
|
|
323
381
|
|
|
382
|
+
/** Runs planned bundles concurrently while retaining plan order in attempts and aggregate evidence. */
|
|
383
|
+
export async function runShardedGateTestsAsync(
|
|
384
|
+
cwd: string,
|
|
385
|
+
files: readonly string[],
|
|
386
|
+
baseRef: string,
|
|
387
|
+
count = 2,
|
|
388
|
+
run: AsyncShardProcess = runBunShardAsync,
|
|
389
|
+
baselineWorktree: typeof withBaselineWorktreeAsync = withBaselineWorktreeAsync,
|
|
390
|
+
budgetGiB = 8,
|
|
391
|
+
mode: ShardRunMode = {},
|
|
392
|
+
measure: AsyncShardProcess = run,
|
|
393
|
+
): Promise<ShardRunResult> {
|
|
394
|
+
if (mode.concurrency !== undefined && (!Number.isSafeInteger(mode.concurrency) || mode.concurrency < 1 || mode.concurrency > 4)) throw new Error('invalid shard concurrency (expected 1–4)');
|
|
395
|
+
const resources = mode.hostResources ?? hostResources();
|
|
396
|
+
const selectedConcurrency = resolveShardConcurrency(mode.concurrency, resources, budgetGiB);
|
|
397
|
+
const concurrency = selectedConcurrency.count;
|
|
398
|
+
debug.log('self-dev.shard', 'concurrency', { concurrency, reason: selectedConcurrency.reason });
|
|
399
|
+
const measurementStartedAt = performance.now();
|
|
400
|
+
const samples = new Map<string, ReturnType<ShardProcess>>();
|
|
401
|
+
if (!mode.fixedDistribution) {
|
|
402
|
+
const unique = [...new Set(files)];
|
|
403
|
+
let nextSample = 0;
|
|
404
|
+
const sampleWorker = async () => {
|
|
405
|
+
for (;;) {
|
|
406
|
+
const index = nextSample++;
|
|
407
|
+
if (index >= unique.length) return;
|
|
408
|
+
const file = unique[index]!;
|
|
409
|
+
try { samples.set(file, await measure(cwd, [file])); }
|
|
410
|
+
catch (error) {
|
|
411
|
+
debug.log('self-dev.shard', 'rss-measurement-failed', { file, error: redactSecretText(String(error)).slice(0, 500) });
|
|
412
|
+
samples.set(file, { exitCode: null });
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, unique.length) }, () => sampleWorker()));
|
|
417
|
+
}
|
|
418
|
+
const measurementMs = Math.round(performance.now() - measurementStartedAt);
|
|
419
|
+
// Reuse the established measured/fixed planner and its host-cap fallback. The callback supplies a
|
|
420
|
+
// planning-only aggregate, so this phase never launches a shard or creates a baseline worktree.
|
|
421
|
+
const planningOnlyBaseline = (() => ({ status: 'passed' as const, retryShardIds: [] })) as unknown as typeof withBaselineWorktree;
|
|
422
|
+
const planned = runShardedGateTests(cwd, files, baseRef, count, (_cwd, selected) => samples.get(selected[0]!) ?? { exitCode: null },
|
|
423
|
+
planningOnlyBaseline, budgetGiB, { ...mode, ...(resources ? { hostResources: resources } : {}) });
|
|
424
|
+
if (planned.reason) return { ...planned, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs: 0 };
|
|
425
|
+
const shards = planned.shards;
|
|
426
|
+
const attempts: GateShardAttempt[] = [];
|
|
427
|
+
const failureEvidence: ShardFailureEvidence[] = [];
|
|
428
|
+
const bundlesStartedAt = performance.now();
|
|
429
|
+
let currentProcessMs = 0;
|
|
430
|
+
let baselineProcessMs = 0;
|
|
431
|
+
const baseline = await baselineWorktree(cwd, baseRef, async (dir) => {
|
|
432
|
+
const treeReadable = (() => { try { return statSync(dir).isDirectory(); } catch { return false; } })();
|
|
433
|
+
// Baseline membership is invariant for both rounds. Cache it before launching children.
|
|
434
|
+
const atBase = new Map(shards.map((shard) => [shard.id,
|
|
435
|
+
treeReadable ? shard.files.filter((file) => !absentAtBaseline(join(dir, file))) : [...shard.files]]));
|
|
436
|
+
const baselinePassCache = new Map<string, ReturnType<ShardProcess>>();
|
|
437
|
+
const totalFiles = new Set(shards.flatMap((shard) => shard.files)).size;
|
|
438
|
+
let completedShards = 0;
|
|
439
|
+
let completedFiles = 0;
|
|
440
|
+
let pending = shards;
|
|
441
|
+
for (let round = 1; round <= 2 && pending.length; round++) {
|
|
442
|
+
const roundAttempts = new Array<GateShardAttempt>(pending.length);
|
|
443
|
+
const roundEvidence = new Array<ShardFailureEvidence[]>(pending.length);
|
|
444
|
+
let next = 0;
|
|
445
|
+
const runSafely = async (location: string, selected: readonly string[]): Promise<ReturnType<ShardProcess>> => {
|
|
446
|
+
try { return await run(location, selected); }
|
|
447
|
+
catch (error) {
|
|
448
|
+
debug.log('self-dev.shard', 'bundle-runner-failed', { location, files: selected,
|
|
449
|
+
error: redactSecretText(String(error)).slice(0, 500) });
|
|
450
|
+
return { exitCode: null };
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
const worker = async () => {
|
|
454
|
+
for (;;) {
|
|
455
|
+
const index = next++;
|
|
456
|
+
if (index >= pending.length) return;
|
|
457
|
+
const shard = pending[index]!;
|
|
458
|
+
const baselineFiles = atBase.get(shard.id)!;
|
|
459
|
+
if (baselineFiles.length < shard.files.length) {
|
|
460
|
+
debug.log('self-dev.shard', 'baseline-files-absent', { shardId: shard.id, round,
|
|
461
|
+
absent: shard.files.filter((file) => !baselineFiles.includes(file)) });
|
|
462
|
+
}
|
|
463
|
+
const currentStartedAt = performance.now();
|
|
464
|
+
const current = await runSafely(cwd, shard.files);
|
|
465
|
+
currentProcessMs += performance.now() - currentStartedAt;
|
|
466
|
+
const cached = concurrency > 1 && round > 1 ? baselinePassCache.get(shard.id) : undefined;
|
|
467
|
+
if (cached) debug.log('self-dev.shard', 'baseline-cache-hit', { shardId: shard.id, round });
|
|
468
|
+
const baselineStartedAt = performance.now();
|
|
469
|
+
const base = cached ?? (baselineFiles.length ? await runSafely(dir, baselineFiles) : { exitCode: 0 });
|
|
470
|
+
baselineProcessMs += performance.now() - baselineStartedAt;
|
|
471
|
+
if (concurrency > 1 && baselineFiles.length && base.exitCode === 0 && !base.signal && base.junit) baselinePassCache.set(shard.id, base);
|
|
472
|
+
roundAttempts[index] = {
|
|
473
|
+
shardId: shard.id, attempt: round, currentJUnit: current.junit, baselineJUnit: base.junit,
|
|
474
|
+
currentExitCode: current.exitCode, baselineExitCode: base.exitCode,
|
|
475
|
+
currentSignal: current.signal, baselineSignal: base.signal,
|
|
476
|
+
currentDiagnostic: current.diagnostic, baselineDiagnostic: base.diagnostic,
|
|
477
|
+
baselineFiles, currentRoot: cwd, baselineRoot: dir,
|
|
478
|
+
};
|
|
479
|
+
roundEvidence[index] = [];
|
|
480
|
+
for (const [side, result, selected] of [
|
|
481
|
+
['current', current, shard.files], ['baseline', base, baselineFiles],
|
|
482
|
+
] as const) {
|
|
483
|
+
if (result.failure) roundEvidence[index]!.push({ shardId: shard.id, side, attempt: round,
|
|
484
|
+
files: [...selected], exitCode: result.exitCode, signal: result.signal ?? null, ...result.failure });
|
|
485
|
+
}
|
|
486
|
+
if (round === 1 && mode.onShardComplete) {
|
|
487
|
+
completedShards++;
|
|
488
|
+
completedFiles += shard.files.length;
|
|
489
|
+
try { mode.onShardComplete({ shardId: shard.id, completedShards, totalShards: shards.length,
|
|
490
|
+
completedFiles, totalFiles }); } catch { /* observation only */ }
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, pending.length) }, () => worker()));
|
|
495
|
+
attempts.push(...roundAttempts);
|
|
496
|
+
for (const evidence of roundEvidence) failureEvidence.push(...evidence);
|
|
497
|
+
const retry = new Set(aggregateGateTestShards(shards, attempts).retryShardIds);
|
|
498
|
+
pending = shards.filter((shard) => retry.has(shard.id));
|
|
499
|
+
}
|
|
500
|
+
return aggregateGateTestShards(shards, attempts);
|
|
501
|
+
});
|
|
502
|
+
const evidence = failureEvidence.length ? { failureEvidence } : {};
|
|
503
|
+
const bundleMs = Math.round(performance.now() - bundlesStartedAt);
|
|
504
|
+
if ('retryShardIds' in baseline) return {
|
|
505
|
+
...planned, aggregate: baseline, attempts, ...evidence, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs,
|
|
506
|
+
currentProcessMs: Math.round(currentProcessMs), baselineProcessMs: Math.round(baselineProcessMs),
|
|
507
|
+
...(baseline.retryShardIds.length ? { unmeasuredByShard: incompleteShardReasons(baseline.retryShardIds, attempts) } : {}),
|
|
508
|
+
};
|
|
509
|
+
const retryShardIds = shards.map((shard) => shard.id);
|
|
510
|
+
const stderrTail = baseline.gitStderrTail;
|
|
511
|
+
const stderrPart = stderrTail ? ` · git stderr: ${stderrTail}` : '';
|
|
512
|
+
return {
|
|
513
|
+
...planned, aggregate: { status: 'unmeasured', retryShardIds }, attempts, concurrency, concurrencyReason: selectedConcurrency.reason, measurementMs, bundleMs,
|
|
514
|
+
currentProcessMs: Math.round(currentProcessMs), baselineProcessMs: Math.round(baselineProcessMs),
|
|
515
|
+
reason: baseline.log, ...evidence,
|
|
516
|
+
unmeasuredByShard: Object.fromEntries(retryShardIds.map((id) => [id,
|
|
517
|
+
`baseline worktree: ${redactSecretText(baseline.log).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').slice(0, 500)}${stderrPart}`])),
|
|
518
|
+
...(stderrTail ? { baselineStderrTail: stderrTail } : {}),
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
|
|
324
522
|
function incompleteShardReasons(shardIds: readonly string[], attempts: readonly GateShardAttempt[]): Record<string, string> {
|
|
325
523
|
return Object.fromEntries(shardIds.map((id) => {
|
|
326
524
|
const latest = attempts.filter((attempt) => attempt.shardId === id).at(-1);
|
|
@@ -381,6 +579,65 @@ export function runBunShardWithSpawn(cwd: string, files: readonly string[], spaw
|
|
|
381
579
|
}
|
|
382
580
|
}
|
|
383
581
|
|
|
582
|
+
/** Nonblocking child runner; each bundle still owns its own deterministic environment and JUnit path. */
|
|
583
|
+
export async function runBunShardAsync(cwd: string, files: readonly string[], drainTimeoutMs = 5_000): Promise<ReturnType<ShardProcess>> {
|
|
584
|
+
const timeout = selfGateShardTimeoutMs(files);
|
|
585
|
+
const spawnLane = timeout === 120_000;
|
|
586
|
+
const dir = mkdtempSync(join(tmpdir(), 'elanous-shard-junit-'));
|
|
587
|
+
const report = join(dir, 'result.xml');
|
|
588
|
+
const isolated = prepareDeterministicChildEnvironment('elanous-shard-test-env-', { env: withGateTestEnv(process.env) });
|
|
589
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
590
|
+
let drainTimer: ReturnType<typeof setTimeout> | undefined;
|
|
591
|
+
const drainAbort = new AbortController();
|
|
592
|
+
try {
|
|
593
|
+
const args = ['test', ...(spawnLane ? ['--timeout=120000'] : []), '--reporter=junit', `--reporter-outfile=${report}`, ...files];
|
|
594
|
+
const started = performance.now();
|
|
595
|
+
const child = Bun.spawn(['bun', ...args], { cwd, env: isolated.env, stdout: 'pipe', stderr: 'pipe' });
|
|
596
|
+
let timedOut = false;
|
|
597
|
+
let drainTimedOut = false;
|
|
598
|
+
timer = setTimeout(() => { timedOut = true; child.kill('SIGKILL'); }, timeout);
|
|
599
|
+
const stdoutOutput = boundedChildOutput(child.stdout, drainAbort.signal);
|
|
600
|
+
const stderrOutput = boundedChildOutput(child.stderr, drainAbort.signal);
|
|
601
|
+
const exited = child.exited.then((code) => {
|
|
602
|
+
// Pipe draining can continue after process exit; a late timer must not relabel a clean exit as SIGKILL.
|
|
603
|
+
if (timer) clearTimeout(timer);
|
|
604
|
+
timer = undefined;
|
|
605
|
+
drainTimer = setTimeout(() => {
|
|
606
|
+
drainTimedOut = true;
|
|
607
|
+
debug.log('self-dev.shard', 'output-drain-timeout', { cwd, files, drainTimeoutMs });
|
|
608
|
+
drainAbort.abort();
|
|
609
|
+
}, drainTimeoutMs);
|
|
610
|
+
return code;
|
|
611
|
+
});
|
|
612
|
+
const [exitCode, stdoutBuffer, stderrBuffer] = await Promise.all([
|
|
613
|
+
exited,
|
|
614
|
+
stdoutOutput,
|
|
615
|
+
stderrOutput,
|
|
616
|
+
]);
|
|
617
|
+
if (drainTimer) clearTimeout(drainTimer);
|
|
618
|
+
drainTimer = undefined;
|
|
619
|
+
const stdout = stdoutBuffer;
|
|
620
|
+
const stderr = stderrBuffer;
|
|
621
|
+
const durationMs = performance.now() - started;
|
|
622
|
+
const usage = child.resourceUsage();
|
|
623
|
+
const junit = existsSync(report) ? readFileSync(report, 'utf8') : undefined;
|
|
624
|
+
const signal = drainTimedOut ? 'DRAIN_TIMEOUT' : timedOut ? 'SIGKILL' : child.signalCode ? String(child.signalCode) : undefined;
|
|
625
|
+
const failed = exitCode !== 0 || !!signal || junit === undefined;
|
|
626
|
+
return {
|
|
627
|
+
exitCode, signal, junit,
|
|
628
|
+
...(files.length === 1 ? { rssMb: usage ? usage.maxRSS / (1024 * 1024) : undefined, seconds: durationMs / 1000 } : {}),
|
|
629
|
+
...(junit === undefined && (exitCode !== 0 || signal) ? { diagnostic: boundedDiagnostic(stdout, stderr) } : {}),
|
|
630
|
+
...(failed ? { failure: { durationMs: Math.round(durationMs), stdoutTail: outputTail(stdout), stderrTail: outputTail(stderr) } } : {}),
|
|
631
|
+
};
|
|
632
|
+
} finally {
|
|
633
|
+
if (timer) clearTimeout(timer);
|
|
634
|
+
if (drainTimer) clearTimeout(drainTimer);
|
|
635
|
+
drainAbort.abort();
|
|
636
|
+
isolated.cleanup();
|
|
637
|
+
rmSync(dir, { recursive: true, force: true });
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
384
641
|
/** GATE-REMOTE-SHARD-PLAN — identity of one remote shard. files/introducedFiles are optional: a caller that only relays
|
|
385
642
|
* identity (CLI wiring) passes none, while a planner-produced shard carries its file-level attribution. */
|
|
386
643
|
export interface RemoteShardSpec {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
|
|
3
|
+
/** Exclude importer expansion only when non-comment bytes and comment boundaries
|
|
4
|
+
* are identical. The TypeScript parser finds comments within JSDoc that a bare
|
|
5
|
+
* scanner can misread because their prose contains backticks. */
|
|
6
|
+
export function isCommentOnlySourceChange(before: string, after: string, path: string): boolean {
|
|
7
|
+
if (before === after || !/\.(?:[cm]?[jt]sx?)$/.test(path)) return false;
|
|
8
|
+
const kind = /\.(?:[cm]?[jt]sx)$/.test(path) ? ts.ScriptKind.TSX
|
|
9
|
+
: /\.(?:[cm]?js)$/.test(path) ? ts.ScriptKind.JS : ts.ScriptKind.TS;
|
|
10
|
+
const collect = (source: string): { masked: string; comments: string[] } | null => {
|
|
11
|
+
const file = ts.createSourceFile(path, source, ts.ScriptTarget.Latest, true, kind);
|
|
12
|
+
if (file.parseDiagnostics.length) return null;
|
|
13
|
+
const ranges = new Map<number, ts.CommentRange>();
|
|
14
|
+
const add = (found: ts.CommentRange[] | undefined) => {
|
|
15
|
+
for (const range of found ?? []) ranges.set(range.pos, range);
|
|
16
|
+
};
|
|
17
|
+
const visit = (node: ts.Node) => {
|
|
18
|
+
add(ts.getLeadingCommentRanges(source, node.getFullStart()));
|
|
19
|
+
add(ts.getTrailingCommentRanges(source, node.getEnd()));
|
|
20
|
+
ts.forEachChild(node, visit);
|
|
21
|
+
};
|
|
22
|
+
visit(file);
|
|
23
|
+
const comments: string[] = [];
|
|
24
|
+
let masked = '';
|
|
25
|
+
let end = 0;
|
|
26
|
+
for (const range of [...ranges.values()].sort((left, right) => left.pos - right.pos)) {
|
|
27
|
+
if (range.pos < end) return null;
|
|
28
|
+
const comment = source.slice(range.pos, range.end);
|
|
29
|
+
comments.push(comment);
|
|
30
|
+
masked += source.slice(end, range.pos) + `\u0000C${range.kind}:${comment.match(/\r\n|\r|\n/g)?.join('') ?? ''}\u0000`;
|
|
31
|
+
end = range.end;
|
|
32
|
+
}
|
|
33
|
+
return { masked: masked + source.slice(end), comments };
|
|
34
|
+
};
|
|
35
|
+
const old = collect(before);
|
|
36
|
+
const current = collect(after);
|
|
37
|
+
if (!old || !current || old.masked !== current.masked || old.comments.length !== current.comments.length) return false;
|
|
38
|
+
const directive = /^(?:\/\/\/|\/\/[#@])|@|(?:eslint|istanbul|coverage|#__PURE__|__NO_SIDE_EFFECTS__)/i;
|
|
39
|
+
// Any unquoted @ may be a TypeScript/JSDoc tag, including newly introduced ones.
|
|
40
|
+
// A backticked example username such as `@example_bot` is prose, not a tag.
|
|
41
|
+
const semanticText = (comment: string) => comment.trim().replace(/`[^`\r\n]*`/g, '');
|
|
42
|
+
let changed = false;
|
|
43
|
+
for (let index = 0; index < old.comments.length; index++) {
|
|
44
|
+
const prior = old.comments[index]!;
|
|
45
|
+
const next = current.comments[index]!;
|
|
46
|
+
if (prior === next) continue;
|
|
47
|
+
changed = true;
|
|
48
|
+
// Ordinary inline block comments and line comments stay in the importer set.
|
|
49
|
+
// This exemption is intentionally limited to JSDoc prose edits.
|
|
50
|
+
if (!prior.startsWith('/**') || !next.startsWith('/**')) return false;
|
|
51
|
+
if (directive.test(semanticText(prior)) || directive.test(semanticText(next))) return false;
|
|
52
|
+
}
|
|
53
|
+
return changed;
|
|
54
|
+
}
|
|
@@ -319,6 +319,12 @@ export function recordShadowDoctorReevaluation(runId: string, dir?: string): {
|
|
|
319
319
|
const visit = entries[visitIndex]!;
|
|
320
320
|
|
|
321
321
|
const evidence = typeof visit.data.evidence === 'string' ? visit.data.evidence.trim() : '';
|
|
322
|
+
// The pack selected for this run was observed before the visit. Keep its actual slice ids;
|
|
323
|
+
// an absent or malformed observation must remain unknown, never imply an empty pack.
|
|
324
|
+
const pack = entries.slice(0, visitIndex).reverse().find((entry) => entry.event === 'knowhow-pack');
|
|
325
|
+
const packIds = Array.isArray(pack?.data?.ids) && pack.data.ids.length > 0
|
|
326
|
+
&& pack.data.ids.every((id: unknown) => typeof id === 'string' && id.length > 0)
|
|
327
|
+
? pack.data.ids as string[] : 'unknown';
|
|
322
328
|
const rx = evidence ? 're-evaluate-member' as const : null;
|
|
323
329
|
const outcome = evidence ? 'shadow-recorded' as const : 'needs-evidence' as const;
|
|
324
330
|
const data: Record<string, unknown> = {
|
|
@@ -326,6 +332,7 @@ export function recordShadowDoctorReevaluation(runId: string, dir?: string): {
|
|
|
326
332
|
visitIndex,
|
|
327
333
|
visit: { runId, from: visit.data.from, symptom: 'admit-starved', timestamp: visit.timestamp, evidence: evidence || null },
|
|
328
334
|
diagnosis: evidence ? 'admit-starved-reported' : 'evidence-unmeasured',
|
|
335
|
+
knowhowPackSliceIds: packIds,
|
|
329
336
|
rx,
|
|
330
337
|
cost: { estimatedTokens: 0, usedTokens: 0 },
|
|
331
338
|
outcome,
|
|
@@ -337,6 +344,24 @@ export function recordShadowDoctorReevaluation(runId: string, dir?: string): {
|
|
|
337
344
|
return { status: 'recorded', ...(rx ? { rx } : {}), outcome, visitIndex };
|
|
338
345
|
}
|
|
339
346
|
|
|
347
|
+
/** Guardian shadow tick: prescribe only for ledgers with an admit-starved visit. Repeated ticks are idempotent. */
|
|
348
|
+
export function recordPendingShadowDoctorReevaluations(dir?: string): { recorded: number; alreadyRecorded: number } {
|
|
349
|
+
let recorded = 0;
|
|
350
|
+
let alreadyRecorded = 0;
|
|
351
|
+
for (const ledger of listRunLedgers(dir ? { dir } : {}).matches) {
|
|
352
|
+
const visits = ledger.entries.flatMap((entry, index) => entry.event === 'doctor-visit' && entry.data.symptom === 'admit-starved' ? [index] : []);
|
|
353
|
+
if (visits.length === 0) continue;
|
|
354
|
+
const prescribed = new Set(ledger.entries.flatMap(entry => entry.event === 'doctor-rx' && entry.data.shadow === true
|
|
355
|
+
&& typeof entry.data.visitIndex === 'number' ? [entry.data.visitIndex] : []));
|
|
356
|
+
if (visits.every(index => prescribed.has(index))) { alreadyRecorded++; continue; }
|
|
357
|
+
const result = recordShadowDoctorReevaluation(ledger.runId, ledger.ledgerDirectory);
|
|
358
|
+
if (result.status === 'recorded') recorded++;
|
|
359
|
+
else if (result.status === 'already-recorded') alreadyRecorded++;
|
|
360
|
+
}
|
|
361
|
+
debug.log('run-doctor', 'shadow-tick', { recorded, alreadyRecorded });
|
|
362
|
+
return { recorded, alreadyRecorded };
|
|
363
|
+
}
|
|
364
|
+
|
|
340
365
|
/** OP 손판정 한 건 — 시각과 결과만 받는다(그 밖의 입력은 받지 않는다). */
|
|
341
366
|
export interface DoctorOpJudgment {
|
|
342
367
|
/** 손판정 시각(ISO). */
|
|
@@ -85,7 +85,7 @@ 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
89
|
exitCode: number;
|
|
90
90
|
/** 정수 칸 중 하나라도 null 일 때만 — 왜 못 셌나(한 줄). */
|
|
91
91
|
countsUnavailableReason?: string;
|
|
@@ -130,7 +130,7 @@ export interface GateArtifactInput {
|
|
|
130
130
|
testFiles: readonly string[];
|
|
131
131
|
verdict: string | null;
|
|
132
132
|
verdictLine?: string;
|
|
133
|
-
timeoutRechecks?: readonly { name: string; file: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
|
|
133
|
+
timeoutRechecks?: readonly { name: string; file: string; originalDiagnostic: string; result: 'pass' | 'timeout' | 'failure' | 'unknown'; elapsedMs: number; rawResultLine: string }[];
|
|
134
134
|
exitCode: number;
|
|
135
135
|
/** 판정 정수(못 센 칸은 null ⊕ countsUnavailableReason). 안 주면 다섯 다 null · 이유 'not recorded' — 칸은 «늘» 쓴다. */
|
|
136
136
|
counts?: GateArtifactCounts;
|
|
@@ -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
|
|
|
@@ -73,12 +73,13 @@ export interface GateBaselineReport extends GateBaselineSummary {
|
|
|
73
73
|
baselineStatus: BaselineProcessStatus;
|
|
74
74
|
log: string;
|
|
75
75
|
timeoutRechecks?: TimeoutRecheckRecord[];
|
|
76
|
-
|
|
76
|
+
loadTimeout?: number;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
export interface TimeoutRecheckRecord {
|
|
80
80
|
name: string;
|
|
81
81
|
file: string;
|
|
82
|
+
originalDiagnostic: string;
|
|
82
83
|
result: 'pass' | 'timeout' | 'failure' | 'unknown';
|
|
83
84
|
elapsedMs: number;
|
|
84
85
|
rawResultLine: string;
|
|
@@ -707,7 +708,7 @@ function summarizeGateBaseline(failures: readonly GateTestFailure[]): GateBaseli
|
|
|
707
708
|
if (failure.attribution === 'flaky-rerun') {
|
|
708
709
|
return { ...withPresence, flakyRerun: withPresence.flakyRerun + 1 };
|
|
709
710
|
}
|
|
710
|
-
if (failure.attribution === 'timeout
|
|
711
|
+
if (failure.attribution === 'load-timeout') {
|
|
711
712
|
return withPresence;
|
|
712
713
|
}
|
|
713
714
|
const withTimeoutRegression = failure.timeoutRegression === 'passed-at-base'
|
|
@@ -741,10 +742,15 @@ export function recheckTimeoutOnlyIntroducedFailures(
|
|
|
741
742
|
report: GateBaselineReport,
|
|
742
743
|
run: (cwd: string, file: string, name: string, timeoutMs: number) => { observation?: TimeoutRerunObservation; elapsedMs: number; output: string } = runTimeoutRecheck,
|
|
743
744
|
): GateBaselineReport {
|
|
745
|
+
const timeoutOnlyDiagnostic = (diagnostic: string | undefined): boolean => {
|
|
746
|
+
if (!diagnostic) return false;
|
|
747
|
+
const lines = diagnostic.split('\n').map((line) => line.trim()).filter(Boolean);
|
|
748
|
+
return lines.length === 1 && /^\^ this test timed out after \d+ms\.?$/i.test(lines[0]!);
|
|
749
|
+
};
|
|
744
750
|
const eligible = report.failures.length > 0
|
|
745
751
|
&& report.introduced === report.failures.length
|
|
746
752
|
&& report.failures.every((failure) => failure.attribution === 'introduced' && !!failure.file
|
|
747
|
-
&&
|
|
753
|
+
&& timeoutOnlyDiagnostic(failure.diagnostic));
|
|
748
754
|
if (!eligible) return report;
|
|
749
755
|
const records: TimeoutRecheckRecord[] = [];
|
|
750
756
|
const failures = report.failures.map((failure) => {
|
|
@@ -754,19 +760,19 @@ export function recheckTimeoutOnlyIntroducedFailures(
|
|
|
754
760
|
const { observation, elapsedMs, output } = run(cwd, failure.file, name, 60_000);
|
|
755
761
|
const result = observation ?? 'unknown';
|
|
756
762
|
const record: TimeoutRecheckRecord = {
|
|
757
|
-
name: failure.name, file: failure.file, result, elapsedMs,
|
|
763
|
+
name: failure.name, file: failure.file, originalDiagnostic: failure.diagnostic ?? '', result, elapsedMs,
|
|
758
764
|
rawResultLine: flattenControlChars(redactSecretText(output)).slice(-500),
|
|
759
765
|
};
|
|
760
766
|
records.push(record);
|
|
761
767
|
debug.log('gate.baseline', 'timeout-recheck', record);
|
|
762
|
-
return result === 'pass' ? { ...failure, attribution: 'timeout
|
|
768
|
+
return result === 'pass' ? { ...failure, attribution: 'load-timeout' as const } : failure;
|
|
763
769
|
});
|
|
764
770
|
return {
|
|
765
771
|
...report,
|
|
766
772
|
...summarizeGateBaseline(failures),
|
|
767
773
|
failures,
|
|
768
774
|
timeoutRechecks: records,
|
|
769
|
-
|
|
775
|
+
loadTimeout: failures.filter((failure) => failure.attribution === 'load-timeout').length,
|
|
770
776
|
};
|
|
771
777
|
}
|
|
772
778
|
|
|
@@ -1077,6 +1083,35 @@ export function withBaselineWorktree<T>(cwd: string, baseRef: string, run: (base
|
|
|
1077
1083
|
}
|
|
1078
1084
|
}
|
|
1079
1085
|
|
|
1086
|
+
/** Keep the baseline checkout attached until every asynchronous shard has settled. */
|
|
1087
|
+
export async function withBaselineWorktreeAsync<T>(cwd: string, baseRef: string, run: (baselineDir: string) => Promise<T>): Promise<T | BaselineProcessResult> {
|
|
1088
|
+
reapBeforeGateAdd(cwd);
|
|
1089
|
+
const baselineDir = mkdtempSync(join(tmpdir(), 'elanous-gate-baseline-'));
|
|
1090
|
+
let attached = false;
|
|
1091
|
+
try {
|
|
1092
|
+
const started = Date.now();
|
|
1093
|
+
const addTimeout = worktreeAddTimeoutForRepo(cwd, undefined, baseRef);
|
|
1094
|
+
const add = runGitCommand(cwd, gateWorktreeAddArgs(baselineDir, baseRef), { encoding: 'utf8', timeout: addTimeout.ms, killSignal: 'SIGKILL' });
|
|
1095
|
+
const elapsedMs = Date.now() - started;
|
|
1096
|
+
debug.log('self-implement.gate-baseline', 'worktree-add-result', {
|
|
1097
|
+
phase: 'baseline', status: add.status, signal: add.signal ?? null, errorCode: add.errorCode ?? null,
|
|
1098
|
+
elapsedMs, timeoutMs: addTimeout.ms, trackedFileCount: addTimeout.trackedFileCount,
|
|
1099
|
+
timeoutSource: addTimeout.source, parentRssBytes: process.memoryUsage().rss,
|
|
1100
|
+
cgroupMemoryCurrentBytes: cgroupMemoryBytes('memory.current'), cgroupMemoryLimitBytes: cgroupMemoryBytes('memory.max'),
|
|
1101
|
+
});
|
|
1102
|
+
if (add.status !== 0) return classifyBaselineWorktreeAddFailure(add, elapsedMs, addTimeout.ms, worktreeAddFailureContext(cwd, baselineDir, baseRef));
|
|
1103
|
+
attached = true;
|
|
1104
|
+
linkDependencies(cwd, baselineDir);
|
|
1105
|
+
return await run(baselineDir);
|
|
1106
|
+
} catch (error) {
|
|
1107
|
+
return { status: 'unknown', unknownReason: 'infrastructure-failure', childResponsibility: 'none', log: `baseline setup failed: ${String(error)}` };
|
|
1108
|
+
} finally {
|
|
1109
|
+
removeGateWorktree(cwd, baselineDir, !attached);
|
|
1110
|
+
try { rmSync(baselineDir, { recursive: true, force: true }); }
|
|
1111
|
+
catch (error) { debug.log('self-implement', 'gate.baseline.cleanup', { stage: 'exception', dir: baselineDir, error: String(error) }); }
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1080
1115
|
function linkDependencies(cwd: string, dir: string): void {
|
|
1081
1116
|
const dependencyLinks = linkWorktreeDependencies(cwd, dir, ['node_modules']);
|
|
1082
1117
|
debug.log('self-implement', 'gate.baseline.dependencies', { cwd, dir, dependencyLinks });
|
|
@@ -1570,7 +1605,7 @@ export function formatGateBaselineNote(report: GateBaselineReport, unrunImporter
|
|
|
1570
1605
|
+ `, unknown=${report.unknown}, precondition-unmet=${report.preconditionUnmet}`
|
|
1571
1606
|
+ (report.timedOut > 0 ? `, timed-out=${report.timedOut}` : '')
|
|
1572
1607
|
+ (report.flakyRerun > 0 ? `, flaky-rerun=${report.flakyRerun}` : '')
|
|
1573
|
-
+ ((report.
|
|
1608
|
+
+ ((report.loadTimeout ?? 0) > 0 ? `, load-timeout=${report.loadTimeout}` : '')
|
|
1574
1609
|
+ (runId ? `, run=${runId}` : '')
|
|
1575
1610
|
+ (report.missingAtBase > 0 ? `, missing-at-base=${report.missingAtBase}` : '');
|
|
1576
1611
|
const lines = report.failures.map((failure) => `- ${failure.attribution}: ${failure.name}`
|
|
@@ -1592,7 +1627,7 @@ export function formatGateBaselineNote(report: GateBaselineReport, unrunImporter
|
|
|
1592
1627
|
? `\n[gate-baseline] rerun not-run=${report.rerunNotRun}`
|
|
1593
1628
|
: '';
|
|
1594
1629
|
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')}`
|
|
1630
|
+
? `\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')}`
|
|
1596
1631
|
: '';
|
|
1597
1632
|
return `${head}\n${lines.join('\n')}\n${report.log}`
|
|
1598
1633
|
+ timedOutLine
|