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
|
@@ -5,6 +5,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
5
5
|
import { debug } from '../debug/log.js';
|
|
6
6
|
import { narrowerEvidenceCommand } from './evidence-command-budget.js';
|
|
7
7
|
import { resolveRunIdentity } from '../harness/harness-space.js';
|
|
8
|
+
import { authoredSignalCommandFromGoal } from './goal-doc/section.js';
|
|
8
9
|
//
|
|
9
10
|
// ⛔ **왜 필요한가** — 리뷰어의 증거 채널은 워크트리 diff 하나다(`seams.ts` 의 `reviewDiff`).
|
|
10
11
|
// 그래서 자식이 **diff 로 드러나지 않는 이행**(명령을 돌려 확인한 결과·라이브 관측)을 했을 때
|
|
@@ -334,6 +335,26 @@ interface RequiredEvidenceCheckRun {
|
|
|
334
335
|
readonly substitutedFor?: string;
|
|
335
336
|
}
|
|
336
337
|
|
|
338
|
+
function authoredSignalCommand(goal: string): string | undefined {
|
|
339
|
+
const command = authoredSignalCommandFromGoal(goal);
|
|
340
|
+
if (!command) return undefined;
|
|
341
|
+
// Goal-authored signals run as one explicit command. Reject shell composition and
|
|
342
|
+
// substitutions; keep the accepted executable set aligned with goal-author's contract.
|
|
343
|
+
if (/[\r\n;|&<>`$()]/u.test(command) || /\b(?:sudo|eval|exec)\b/u.test(command)) return undefined;
|
|
344
|
+
const match = command.match(/^([A-Za-z0-9_./~-]+)\s+(.+)$/u);
|
|
345
|
+
if (!match) return undefined;
|
|
346
|
+
const executable = match[1]!.split('/').at(-1);
|
|
347
|
+
if (!new Set(['eln','bun','git','gh','rg','test','npm','pnpm','yarn','node','python','python3','pytest','make','cargo','go','curl','jq','sqlite3','grep','sed','awk','cat','find','docker','kubectl']).has(executable!)) return undefined;
|
|
348
|
+
if (executable === 'test' && !/^(?:-f|-e)\s+[^\s]+$/u.test(match[2]!)) return undefined;
|
|
349
|
+
return command;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export function authoredSignalExecution(goal: string, checks: readonly RequiredEvidenceCheckRun[]): { command: string; exitCode: number | null; stdout: string; stderr: string } | undefined {
|
|
353
|
+
const command = authoredSignalCommand(goal);
|
|
354
|
+
const run = command ? checks.find((check) => check.command === command) : undefined;
|
|
355
|
+
return run ? { command: run.command, exitCode: run.exitCode, stdout: run.stdout, stderr: run.stderr } : undefined;
|
|
356
|
+
}
|
|
357
|
+
|
|
337
358
|
type EvidenceCommandRunner = (command: string, cwd: string) => Pick<ReturnType<typeof spawnSync>, 'status' | 'stdout' | 'stderr' | 'error'>;
|
|
338
359
|
|
|
339
360
|
/**
|
|
@@ -436,6 +457,8 @@ export function runRequiredEvidenceChecks(goal: string, cwd: string, runId?: str
|
|
|
436
457
|
} = {}): RequiredEvidenceCheckRun[] {
|
|
437
458
|
const identity = resolveRunIdentity({ explicit: runId });
|
|
438
459
|
const checks = requiredEvidenceFromGoal(goal).flatMap(({ tag, verifyCommand }) => verifyCommand ? [{ tag, command: verifyCommand }] : []);
|
|
460
|
+
const signalCommand = authoredSignalCommand(goal);
|
|
461
|
+
if (signalCommand && !checks.some(({ command }) => command === signalCommand)) checks.push({ tag: 'authored-signal', command: signalCommand });
|
|
439
462
|
// Direct callers without a measured HEAD have no stable revision identity;
|
|
440
463
|
// the run-owned wrapper supplies a temporary identity when appropriate.
|
|
441
464
|
const timeoutCounts = options.headCommit ? options.timeoutCounts : undefined;
|
|
@@ -33,7 +33,7 @@ export {
|
|
|
33
33
|
} from './pr-evidence-artifact.js';
|
|
34
34
|
import { judgePredictionAccuracy } from './judge-prediction-accuracy.js';
|
|
35
35
|
import { classifyPodReviewBudgetResidue, measureReviewFindingRecurrence, type ReviewFindingRecurrence, type RecurrenceFinding } from './review-finding-recurrence.js';
|
|
36
|
-
import type { ReviewRework } from '../self-dev/run-types.js';
|
|
36
|
+
import type { ReviewRework, SelfDevJobResult } from '../self-dev/run-types.js';
|
|
37
37
|
import { createHash } from 'node:crypto';
|
|
38
38
|
import { appendFileSync, copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync } from 'node:fs';
|
|
39
39
|
import { writeGoalDocumentAtomic } from './goal-document-write.js';
|
|
@@ -226,7 +226,7 @@ import { formatGateFailedId, type PremiseReviewCard, type PremiseReviewInput } f
|
|
|
226
226
|
import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
|
|
227
227
|
import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
|
|
228
228
|
import { resolveRunOutcome } from './run-outcome.js';
|
|
229
|
-
import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
|
|
229
|
+
import { authorLimitationCountFromGoal, authoredSignalExecution, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
|
|
230
230
|
import { resolveEvidenceHeadCommit } from './evidence-command-budget.js';
|
|
231
231
|
import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
|
|
232
232
|
import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
|
|
@@ -1107,6 +1107,8 @@ export interface SelfImplementSeams {
|
|
|
1107
1107
|
synthesizeGoalContext?: (input: { goalFile?: string }) => Promise<Pick<import('../harness/harness-worktree-add.js').HarnessWorktreeGoalMetadata, 'goalTitle' | 'goalDescription' | 'goalDescriptionSource'>>;
|
|
1108
1108
|
createWorktree: (opts: { branch: string; base?: string; runId?: string } & import('../harness/harness-worktree-add.js').HarnessWorktreeGoalMetadata) => Promise<{
|
|
1109
1109
|
path: string; branch: string;
|
|
1110
|
+
/** A single-use Pod may implement in its already checked-out source tree. */
|
|
1111
|
+
inPlace?: boolean;
|
|
1110
1112
|
/** Strict provenance values are returned only after their recording succeeds. */
|
|
1111
1113
|
owner?: string;
|
|
1112
1114
|
command?: string;
|
|
@@ -2355,6 +2357,8 @@ export interface SelfImplementResult {
|
|
|
2355
2357
|
walk?: readonly { node: string; round: number }[];
|
|
2356
2358
|
/** Canonical run-identity join key; always present because resolveRunIdentity always mints or inherits one. */
|
|
2357
2359
|
runId: string;
|
|
2360
|
+
/** Parent-observed goal-plan revision attempt evidence; omitted when no ledger evidence was read. */
|
|
2361
|
+
goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
|
|
2358
2362
|
ok: boolean;
|
|
2359
2363
|
stage: SelfImplementStage;
|
|
2360
2364
|
/** Verbatim must-fix findings retained on a review-blocked terminal result. */
|
|
@@ -3329,7 +3333,12 @@ async function runPostMergeCleanup(
|
|
|
3329
3333
|
goalFile: string | undefined,
|
|
3330
3334
|
remoteBranch: string | undefined,
|
|
3331
3335
|
observe: (event: string, data: Record<string, unknown>) => void,
|
|
3336
|
+
inPlace = false,
|
|
3332
3337
|
): Promise<void> {
|
|
3338
|
+
if (inPlace) {
|
|
3339
|
+
observe('post-merge-cleanup-preserved', { worktreePath, branch, reason: 'pod-inplace-source' });
|
|
3340
|
+
return;
|
|
3341
|
+
}
|
|
3333
3342
|
if (!cleanup?.enabled) {
|
|
3334
3343
|
observe('post-merge-cleanup-preserved', { worktreePath, branch, reason: cleanup ? 'disabled' : 'not-configured' });
|
|
3335
3344
|
return;
|
|
@@ -5286,6 +5295,7 @@ async function runSelfImplementInner(
|
|
|
5286
5295
|
observe('worktree', {
|
|
5287
5296
|
path: wt.path,
|
|
5288
5297
|
branch: wt.branch,
|
|
5298
|
+
inPlace: wt.inPlace === true,
|
|
5289
5299
|
terminalLaunchHead: terminalLaunchHead ?? null,
|
|
5290
5300
|
terminalLaunchDirtyPaths: terminalLaunchDirtyPaths ? [...terminalLaunchDirtyPaths] : null,
|
|
5291
5301
|
// ⭐ 우리가 **무엇을 요청했는지는 이미 안다** — 시임 반환에서 되읽지 않는다.
|
|
@@ -5306,7 +5316,7 @@ async function runSelfImplementInner(
|
|
|
5306
5316
|
// ⛔ 발사 부모(`harness ask`·`dev`)에는 ELANOUS_HARNESS_SPACE_ID 가 «없다» — 그 env 는 자식에게만 심긴다.
|
|
5307
5317
|
// 그래서 getHarnessSpace() 만 보면 운영에서 늘 undefined 이고 정지 확인이 «한 번도» 안 돈다(#20040 착지 직후 실측).
|
|
5308
5318
|
// `self send <space> --stop` 이 겨냥하는 것은 자식의 공간 = 워크트리 이름이다(아래 activeChildInboxId 와 같은 식 · dev-cli.ts recordRestart 폴백과 같다).
|
|
5309
|
-
const parentSoftStopSpaceId = s.parentSoftStopSpaceId || getHarnessSpace()?.id || normalizeSpaceId(basename(wt.path)) || undefined;
|
|
5319
|
+
const parentSoftStopSpaceId = s.parentSoftStopSpaceId || getHarnessSpace()?.id || normalizeSpaceId(wt.inPlace ? runId : basename(wt.path)) || undefined;
|
|
5310
5320
|
if (parentSoftStopSpaceId) {
|
|
5311
5321
|
try { s.onSoftStopSpaceReady?.(parentSoftStopSpaceId); } catch { /* UI registration must not break execution */ }
|
|
5312
5322
|
}
|
|
@@ -5457,7 +5467,11 @@ async function runSelfImplementInner(
|
|
|
5457
5467
|
// The repository copy travels with both local and Pod worktrees. Operational HQ ledgers are never read here.
|
|
5458
5468
|
const knowhow = selectKnowhowPack(wt.path, opts.feature);
|
|
5459
5469
|
if (knowhow.text) round0Feature = `${knowhow.text}\n\n${round0Feature}`;
|
|
5460
|
-
|
|
5470
|
+
const knowhowRevisionRead = runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 });
|
|
5471
|
+
const knowhowRevision = knowhowRevisionRead.status === 0 && /^[0-9a-f]{40,64}$/i.test(knowhowRevisionRead.stdout.trim())
|
|
5472
|
+
? knowhowRevisionRead.stdout.trim() : null;
|
|
5473
|
+
observe('knowhow-pack', { ids: knowhow.ids, bytes: knowhow.bytes, injected: knowhow.bytes > 0,
|
|
5474
|
+
reason: knowhow.reason, repoPath: wt.path, repoRevision: knowhowRevision });
|
|
5461
5475
|
|
|
5462
5476
|
// E1 착수 구체화(RFC-progressive-goal-elaboration §2 E1 · §7 간선 ①) — 고정 층(KPI·판정 신호)은 그대로, 카드만 덧붙인다.
|
|
5463
5477
|
const elaboration = await (await import('./goal-elaborate.js')).runArrivalElaboration({ goal: opts.feature, prompt: round0Feature, cwd: wt.path, callLLM: s.elaborateCallLLM, observe });
|
|
@@ -5523,7 +5537,7 @@ async function runSelfImplementInner(
|
|
|
5523
5537
|
readonly update?: (delivery: SupervisorDeliveryState, reason?: string) => void;
|
|
5524
5538
|
};
|
|
5525
5539
|
let supervisorDeliveryUpdates: PendingSupervisorDelivery[] = [];
|
|
5526
|
-
const activeChildInboxId = normalizeSpaceId(basename(wt.path));
|
|
5540
|
+
const activeChildInboxId = normalizeSpaceId(wt.inPlace ? runId : basename(wt.path));
|
|
5527
5541
|
const undeliveredSupervisorInputs: UndeliveredSupervisorInput[] = [];
|
|
5528
5542
|
const recordUndeliveredSupervisorInput = (text: string, reason: string): void => {
|
|
5529
5543
|
undeliveredSupervisorInputs.push({ text, reason });
|
|
@@ -7383,12 +7397,16 @@ async function runSelfImplementInner(
|
|
|
7383
7397
|
try { after = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff */ }
|
|
7384
7398
|
const targetDiff = after === undefined ? undefined : eligible(after);
|
|
7385
7399
|
const resultLine = /(?:^|\n)\s*RESULT:\s*\S/m.test(impl.evidenceTranscript ?? impl.summary);
|
|
7386
|
-
|
|
7400
|
+
// A completed child can leave a real, declared-target diff while its
|
|
7401
|
+
// final screen omits RESULT. The measured diff is sufficient to enter
|
|
7402
|
+
// review/gate; a failed child or an unmeasured/empty diff still stops.
|
|
7403
|
+
const succeeded = impl.ok && !!targetDiff?.length;
|
|
7387
7404
|
goalOnlyReworkExhausted = !succeeded;
|
|
7388
7405
|
observe('implementation-goal-only-rework', {
|
|
7389
7406
|
status: succeeded ? 'succeeded' : 'exhausted', round: retryRound, targets,
|
|
7390
7407
|
firstToolCalls, retryToolCalls: impl.toolCalls ?? null,
|
|
7391
7408
|
targetDiffCount: targetDiff?.length ?? null, diffMeasured: after !== undefined, resultLine,
|
|
7409
|
+
...(succeeded ? { evidenceBasis: resultLine ? 'result-and-target-diff' : 'declared-target-diff' } : {}),
|
|
7392
7410
|
}, succeeded ? {} : { level: 'warn' });
|
|
7393
7411
|
if (!succeeded) impl = { ...impl, ok: false, summary: `goal-only-rework-exhausted: ${impl.summary}` };
|
|
7394
7412
|
round = retryRound;
|
|
@@ -7546,6 +7564,7 @@ async function runSelfImplementInner(
|
|
|
7546
7564
|
catch { /* observation is fail-soft */ }
|
|
7547
7565
|
}
|
|
7548
7566
|
const evidenceChecks = runBudgetedEvidenceChecks(roundGoal, wt.path, runId, evidenceHead);
|
|
7567
|
+
const authoredSignal = authoredSignalExecution(roundGoal, evidenceChecks);
|
|
7549
7568
|
const tagCoverage = coverRequiredEvidence(requiredEvidence, offDiffEvidence.items);
|
|
7550
7569
|
// EVIDENCE-WIRING-EXEMPT — a requirement whose own `|| bun test …` check passed is covered by what the harness measured.
|
|
7551
7570
|
const settledByCheck = settleUncoveredEvidence(tagCoverage.uncovered, { checks: evidenceChecks, required: requiredEvidence });
|
|
@@ -8141,15 +8160,17 @@ async function runSelfImplementInner(
|
|
|
8141
8160
|
let goalSlotFill: SupervisorGoalFillResult = 'unverifiable';
|
|
8142
8161
|
let goalSlotDeficit: import('./goal-supervisor-fill.js').SupervisorGoalDeficit | undefined;
|
|
8143
8162
|
let goalSlotAction: 'remeasure' | 'connect-goal' | undefined;
|
|
8163
|
+
let goalSlotFillError = false;
|
|
8144
8164
|
try {
|
|
8145
8165
|
goalSlotFill = await fillUnverifiableGoalSlots({
|
|
8146
|
-
path: opts.goalFile, round, gate, review,
|
|
8166
|
+
path: opts.goalFile, round, gate, review, ...(authoredSignal ? { authoredSignal } : {}),
|
|
8147
8167
|
...(goalWiring ? { wiring: goalWiring } : {}),
|
|
8148
8168
|
independentlyCheck: s.independentlyCheckGoalSlots ?? (async () => false),
|
|
8149
8169
|
observeDeficit: (deficit) => { goalSlotDeficit = deficit; },
|
|
8150
8170
|
});
|
|
8151
8171
|
} catch {
|
|
8152
8172
|
goalSlotFill = 'rejected';
|
|
8173
|
+
goalSlotFillError = true;
|
|
8153
8174
|
}
|
|
8154
8175
|
if (goalSlotFill === 'not-applicable') {
|
|
8155
8176
|
observe('goal-slot-remeasure-result', { round, result: goalSlotFill, gatePassed: gate.passed,
|
|
@@ -8173,7 +8194,7 @@ async function runSelfImplementInner(
|
|
|
8173
8194
|
gate = measuredGate;
|
|
8174
8195
|
let remeasureDeficit: import('./goal-supervisor-fill.js').SupervisorGoalDeficit | undefined;
|
|
8175
8196
|
if (gate.passed) {
|
|
8176
|
-
goalSlotFill = await fillUnverifiableGoalSlots({ path: opts.goalFile, round, gate, review,
|
|
8197
|
+
goalSlotFill = await fillUnverifiableGoalSlots({ path: opts.goalFile, round, gate, review, ...(authoredSignal ? { authoredSignal } : {}),
|
|
8177
8198
|
independentlyCheck: s.independentlyCheckGoalSlots ?? (async () => false),
|
|
8178
8199
|
observeDeficit: (deficit) => { remeasureDeficit = deficit; } });
|
|
8179
8200
|
}
|
|
@@ -8181,8 +8202,27 @@ async function runSelfImplementInner(
|
|
|
8181
8202
|
gatePassed: measuredGate.passed,
|
|
8182
8203
|
...(remeasureDeficit ? { deficitKind: remeasureDeficit.kind,
|
|
8183
8204
|
deficitEvidenceId: remeasureDeficit.evidenceId, gateLog: remeasureDeficit.gateLog,
|
|
8184
|
-
reason: remeasureDeficit.reason,
|
|
8185
|
-
|
|
8205
|
+
reason: remeasureDeficit.reason, reasonDetail: remeasureDeficit.reasonDetail,
|
|
8206
|
+
inputSummary: remeasureDeficit.inputSummary, gateLogRef: remeasureDeficit.gateLogRef } : {}) });
|
|
8207
|
+
if (goalSlotFill === 'unverifiable' && gate.passed) {
|
|
8208
|
+
finalizeSupervisorDeliveries('goal-slot-remeasurement-unverifiable');
|
|
8209
|
+
const evidenceReason = [remeasureDeficit?.reason, remeasureDeficit?.reasonDetail]
|
|
8210
|
+
.filter((part): part is string => Boolean(part)).join(' · ');
|
|
8211
|
+
const reason = `goal-slot remeasurement remained unverifiable after the second gate passed · evidence ${goalSlotDeficit.evidenceId}${evidenceReason ? ` · ${evidenceReason}` : ''}`;
|
|
8212
|
+
observe('goal-slot-remeasurement-preserved', {
|
|
8213
|
+
round, evidenceId: goalSlotDeficit.evidenceId, gatePassed: true,
|
|
8214
|
+
reason: remeasureDeficit?.reason ?? 'remeasurement-deficit-not-reported',
|
|
8215
|
+
...(remeasureDeficit?.reasonDetail ? { reasonDetail: remeasureDeficit.reasonDetail } : {}),
|
|
8216
|
+
...(remeasureDeficit?.gateLogRef ? { gateLogRef: remeasureDeficit.gateLogRef } : {}),
|
|
8217
|
+
disposition: 'preserve-for-recovery',
|
|
8218
|
+
});
|
|
8219
|
+
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', reason, gate, salvageStatusExpected: false });
|
|
8220
|
+
return { ok: false, stage: 'review-blocked', node: 'rework', ...resolveRunOutcome({ termination: 'budget-exhausted' }),
|
|
8221
|
+
sessionId, worktreePath: wt.path, branch: wt.branch, gate,
|
|
8222
|
+
quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
|
|
8223
|
+
...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
|
|
8224
|
+
}
|
|
8225
|
+
if (!gate.passed || goalSlotFill === 'rejected') {
|
|
8186
8226
|
finalizeSupervisorDeliveries('goal-slot-remeasure-gate-failed');
|
|
8187
8227
|
const reason = `goal-slot remeasurement ${!gate.passed ? 'failed' : goalSlotFill === 'rejected' ? 'rejected' : 'unmeasured'} · evidence ${goalSlotDeficit.evidenceId}`;
|
|
8188
8228
|
const pr = await preserveBlockedArtifacts({ stage: 'gate-failed', reason, gate, salvageStatusExpected: false });
|
|
@@ -8193,7 +8233,10 @@ async function runSelfImplementInner(
|
|
|
8193
8233
|
}
|
|
8194
8234
|
}
|
|
8195
8235
|
observe('goal-slot-fill', { round, result: goalSlotFill, gatePassed: gate.passed, reviewVerdict: review.verdict,
|
|
8196
|
-
...(
|
|
8236
|
+
...(goalSlotDeficit ? { reason: goalSlotDeficit.reason, reasonDetail: goalSlotDeficit.reasonDetail,
|
|
8237
|
+
inputSummary: goalSlotDeficit.inputSummary, gateLogRef: goalSlotDeficit.gateLogRef } : {}),
|
|
8238
|
+
...(!goalSlotDeficit && goalSlotFill === 'unverifiable' ? { reason: 'goal-slot-fill-no-deficit' } : {}),
|
|
8239
|
+
...(goalSlotFillError ? { reason: 'goal-slot-fill-error' } : {}),
|
|
8197
8240
|
...(goalSlotFill === 'not-applicable' ? { reason: 'test-step-scope-skipped', scopeReason: gate.scopeReason,
|
|
8198
8241
|
testStepExecuted: gate.testStepExecuted } : {}) });
|
|
8199
8242
|
if (goalSlotAction === 'connect-goal' && goalSlotDeficit) {
|
|
@@ -9042,7 +9085,7 @@ async function runSelfImplementInner(
|
|
|
9042
9085
|
await withJourneyNode('cleanup', { provenance: 'post-merge', runId }, () => runPostMergeCleanup(s.postMergeCleanup, wt.path, wt.branch, opts.goalFile, mergedBase && defaultBranch && displayBranchName(mergedBase) === displayBranchName(defaultBranch) ? defaultBranch : undefined, (event, data) => {
|
|
9043
9086
|
if (event.startsWith('post-merge-cleanup-')) cleanupOutcome = event.slice('post-merge-cleanup-'.length);
|
|
9044
9087
|
observe(event, data);
|
|
9045
|
-
}));
|
|
9088
|
+
}, wt.inPlace === true));
|
|
9046
9089
|
exitJourneyNode('cleanup', { provenance: 'post-merge', runId, outcome: cleanupOutcome });
|
|
9047
9090
|
const mergedLedger = (() => {
|
|
9048
9091
|
try { return loadRunLedger(runId); } catch { return null; }
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { realpathSync } from 'node:fs';
|
|
2
|
+
import { relative, resolve, sep } from 'node:path';
|
|
3
|
+
import { debug } from '../debug/log.js';
|
|
4
|
+
import { runGitCommand } from '../git-fs/runner.js';
|
|
5
|
+
import { DEFAULT_BRANCH_WORKTREE_BASE, prepareWorktreeDependencies, resolveDefaultBranchBase, worktreeDependenciesAvailable } from '../git-fs/worktree.js';
|
|
6
|
+
import type { CreateWorktreeResult } from '../git-fs/worktree.js';
|
|
7
|
+
|
|
8
|
+
export type PodInplaceWorktree = CreateWorktreeResult & { readonly inPlace: true };
|
|
9
|
+
|
|
10
|
+
export function tryCreatePodInplaceWorktree(input: {
|
|
11
|
+
readonly repoRoot: string;
|
|
12
|
+
readonly cwd: string;
|
|
13
|
+
readonly branch: string;
|
|
14
|
+
readonly base?: string;
|
|
15
|
+
readonly runId?: string;
|
|
16
|
+
readonly goalFile?: string;
|
|
17
|
+
readonly env: NodeJS.ProcessEnv;
|
|
18
|
+
readonly dependencyFallbackRoot?: string;
|
|
19
|
+
}): PodInplaceWorktree | null {
|
|
20
|
+
if (input.env.ELANOUS_POD_INPLACE_WORKTREE !== '1') return null;
|
|
21
|
+
const skip = (reason: string): null => {
|
|
22
|
+
debug.log('self-implement', 'pod-inplace-worktree-skipped', { reason, branch: input.branch }, { level: 'warn' });
|
|
23
|
+
process.stderr.write(`ELANOUS_POD_INPLACE_SKIP reason=${reason}\n`);
|
|
24
|
+
return null;
|
|
25
|
+
};
|
|
26
|
+
if (input.env.ELANOUS_SUBSTRATE !== 'pod' || input.env.ELANOUS_POD_SINGLE_CHILD !== '1'
|
|
27
|
+
|| !input.env.ELANOUS_POD_NAME?.trim() || !input.runId || input.env.ELANOUS_RUN_ID !== input.runId) {
|
|
28
|
+
return skip('not-single-owned-pod-child');
|
|
29
|
+
}
|
|
30
|
+
let repoRoot: string;
|
|
31
|
+
try {
|
|
32
|
+
repoRoot = realpathSync(input.repoRoot);
|
|
33
|
+
if (repoRoot !== realpathSync(input.cwd)) return skip('different-cwd');
|
|
34
|
+
} catch { return skip('repo-path-unavailable'); }
|
|
35
|
+
const git = (args: string[]) => runGitCommand(repoRoot, args, { encoding: 'utf8', timeout: 10_000 });
|
|
36
|
+
const top = git(['rev-parse', '--show-toplevel']);
|
|
37
|
+
if (top.status !== 0 || resolve(top.stdout.trim()) !== repoRoot) return skip('not-repo-root');
|
|
38
|
+
const head = git(['rev-parse', '--verify', 'HEAD']);
|
|
39
|
+
const resolvedBase = head.status === 0 ? head.stdout.trim() : '';
|
|
40
|
+
if (!/^[0-9a-f]{40,64}$/i.test(resolvedBase)) return skip('head-unavailable');
|
|
41
|
+
const base = input.base === DEFAULT_BRANCH_WORKTREE_BASE
|
|
42
|
+
? (resolveDefaultBranchBase(repoRoot) ?? 'HEAD')
|
|
43
|
+
: (input.base ?? 'origin/main');
|
|
44
|
+
const pin = git(['rev-parse', '--verify', `${base}^{commit}`]);
|
|
45
|
+
if (pin.status !== 0 || pin.stdout.trim() !== resolvedBase) return skip('base-pin-mismatch');
|
|
46
|
+
const clean = git(['status', '--porcelain', '-z', '--untracked-files=all']);
|
|
47
|
+
let expectedGoalStatus: string | undefined;
|
|
48
|
+
if (input.goalFile) {
|
|
49
|
+
try {
|
|
50
|
+
const goalRelative = relative(repoRoot, realpathSync(resolve(repoRoot, input.goalFile))).split(sep).join('/');
|
|
51
|
+
if (/^docs\/goals\/GOAL-[^/]+\.md$/.test(goalRelative)) expectedGoalStatus = `?? ${goalRelative}`;
|
|
52
|
+
} catch { /* An unavailable goal file cannot exempt source dirt. */ }
|
|
53
|
+
}
|
|
54
|
+
const dirty = clean.stdout.split('\0').filter(Boolean);
|
|
55
|
+
if (clean.status !== 0 || (dirty.length > 0 && (dirty.length !== 1 || dirty[0] !== expectedGoalStatus))) return skip('source-dirty');
|
|
56
|
+
if (!worktreeDependenciesAvailable(repoRoot, input.dependencyFallbackRoot)) return skip('dependencies-unavailable');
|
|
57
|
+
const validBranch = git(['check-ref-format', '--branch', input.branch]);
|
|
58
|
+
if (validBranch.status !== 0) return skip('invalid-branch');
|
|
59
|
+
const held = git(['show-ref', '--verify', '--quiet', `refs/heads/${input.branch}`]);
|
|
60
|
+
if (held.status !== 1) return skip('branch-exists-or-unreadable');
|
|
61
|
+
const started = Date.now();
|
|
62
|
+
const switched = git(['switch', '--no-guess', '-c', input.branch]);
|
|
63
|
+
if (switched.status !== 0) {
|
|
64
|
+
throw new Error(`pod in-place branch switch failed: ${(switched.stderr || switched.stdout || `git exited ${switched.status}`).trim()}`);
|
|
65
|
+
}
|
|
66
|
+
const after = git(['rev-parse', '--verify', 'HEAD']);
|
|
67
|
+
const currentBranch = git(['branch', '--show-current']);
|
|
68
|
+
if (after.status !== 0 || after.stdout.trim() !== resolvedBase
|
|
69
|
+
|| currentBranch.status !== 0 || currentBranch.stdout.trim() !== input.branch) {
|
|
70
|
+
throw new Error('pod in-place branch switch changed pin or branch unexpectedly');
|
|
71
|
+
}
|
|
72
|
+
const switchElapsedMs = Date.now() - started;
|
|
73
|
+
prepareWorktreeDependencies(repoRoot, repoRoot,
|
|
74
|
+
input.dependencyFallbackRoot ? { dependencyFallbackRoot: input.dependencyFallbackRoot } : {}, {});
|
|
75
|
+
const elapsedMs = Date.now() - started;
|
|
76
|
+
debug.log('self-implement', 'pod-inplace-worktree-selected', {
|
|
77
|
+
branch: input.branch, runId: input.runId, sourcePath: repoRoot,
|
|
78
|
+
resolvedBase, elapsedMs, switchElapsedMs, checkoutFiles: 0,
|
|
79
|
+
});
|
|
80
|
+
process.stderr.write(`ELANOUS_POD_INPLACE_SELECTED elapsedMs=${elapsedMs} switchMs=${switchElapsedMs} checkoutFiles=0\n`);
|
|
81
|
+
return { path: repoRoot, branch: input.branch, base: input.base ?? 'HEAD', resolvedBase, baseFreshness: 'head', inPlace: true };
|
|
82
|
+
}
|
|
@@ -3,8 +3,8 @@ export const WARM_POOL_PROFILES = ['fixed', 'gate', 'landing', 'feature'] as con
|
|
|
3
3
|
export type WarmPoolProfile = (typeof WARM_POOL_PROFILES)[number];
|
|
4
4
|
export type WarmPoolTier = 'lite' | 'standard';
|
|
5
5
|
const STANDARD_HOST_MAX: Readonly<Record<string, number>> = {
|
|
6
|
-
node-b: 16,
|
|
7
|
-
node-c: 4,
|
|
6
|
+
'node-b': 16,
|
|
7
|
+
'node-c': 4,
|
|
8
8
|
'elangram-wsl': 5,
|
|
9
9
|
'host-e-wsl': 5,
|
|
10
10
|
};
|
|
@@ -42,6 +42,11 @@ function latestFailingIds(input: FlexSignalsInput): readonly string[] | undefine
|
|
|
42
42
|
return latest !== undefined && latest.length > 0 ? latest : undefined;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/** P2 evidence may name a file only when the latest failure ID itself confirms that attribution. */
|
|
46
|
+
function latestPreexistingFailureId(input: FlexSignalsInput): string | undefined {
|
|
47
|
+
return latestFailingIds(input)?.find((id) => /\(preexisting\)\s*$/.test(id));
|
|
48
|
+
}
|
|
49
|
+
|
|
45
50
|
/**
|
|
46
51
|
* 게이트 실패 id — 생산자(orchestrator 의 roundSummaryEntries.failedIds)와 P3 파서가 «같은 꼴»을 쓰도록
|
|
47
52
|
* 둘 다 이 함수 짝을 거친다. 꼴: `${name}@${file ?? '?'} (${attribution})`.
|
|
@@ -96,11 +101,8 @@ function judgeP2(input: PremiseReviewInput): PremiseFinding {
|
|
|
96
101
|
}
|
|
97
102
|
const preexistingIndex = attributions.indexOf('preexisting');
|
|
98
103
|
if (preexistingIndex >= 0) {
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
? latest[preexistingIndex]!
|
|
102
|
-
: 'preexisting';
|
|
103
|
-
return { premise: 'P2', verdict: 'wrong', evidence };
|
|
104
|
+
const latestPreexistingId = latestPreexistingFailureId(input);
|
|
105
|
+
return { premise: 'P2', verdict: 'wrong', evidence: latestPreexistingId ?? 'preexisting' };
|
|
104
106
|
}
|
|
105
107
|
if (attributions.includes('unknown')) {
|
|
106
108
|
return { premise: 'P2', verdict: 'unknown', evidence: UNMEASURED };
|
|
@@ -452,6 +452,237 @@ export function loadRunGraphVariant(runId: string, dir = runLedgerDir()): RunGra
|
|
|
452
452
|
return { variantId: record.variant_id, reason: record.reason };
|
|
453
453
|
}
|
|
454
454
|
|
|
455
|
+
/**
|
|
456
|
+
* Axes compared between what a run asked for and what it actually ran with:
|
|
457
|
+
* the child LLM request (`childModel`/`childProvider`), `zaiCodingPlan.overage`,
|
|
458
|
+
* the Pod pool and the parent host.
|
|
459
|
+
*/
|
|
460
|
+
export type RunRequestEffectiveAxis = 'childModel' | 'childProvider' | 'overagePolicy' | 'podPool' | 'parentHost';
|
|
461
|
+
|
|
462
|
+
/** Ledger event carrying one requested-vs-effective comparison row set. */
|
|
463
|
+
export const RUN_REQUEST_VS_EFFECTIVE_EVENT = 'run-request-vs-effective';
|
|
464
|
+
|
|
465
|
+
const RUN_REQUEST_EFFECTIVE_AXES: readonly RunRequestEffectiveAxis[] = [
|
|
466
|
+
'childModel',
|
|
467
|
+
'childProvider',
|
|
468
|
+
'overagePolicy',
|
|
469
|
+
'podPool',
|
|
470
|
+
'parentHost',
|
|
471
|
+
];
|
|
472
|
+
|
|
473
|
+
/** Values of the compared axes. Requested and effective sides share this shape so a row can name both. */
|
|
474
|
+
export interface RunRequestEffectiveValues {
|
|
475
|
+
childModel?: string;
|
|
476
|
+
childProvider?: string;
|
|
477
|
+
overagePolicy?: string;
|
|
478
|
+
podPool?: string;
|
|
479
|
+
parentHost?: string;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/** One axis whose requested value differs from the effective value observed while the run executed. */
|
|
483
|
+
export interface RunRequestEffectiveMismatch {
|
|
484
|
+
axis: RunRequestEffectiveAxis;
|
|
485
|
+
requested: string;
|
|
486
|
+
effective: string;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
export interface RunRequestEffectiveComparison {
|
|
490
|
+
requested: RunRequestEffectiveValues;
|
|
491
|
+
effective: RunRequestEffectiveValues;
|
|
492
|
+
mismatches: RunRequestEffectiveMismatch[];
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
496
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function readRunRequestEffectiveValues(value: unknown): RunRequestEffectiveValues {
|
|
500
|
+
if (!isPlainRecord(value)) return {};
|
|
501
|
+
const values: RunRequestEffectiveValues = {};
|
|
502
|
+
for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
|
|
503
|
+
const raw = value[axis];
|
|
504
|
+
if (typeof raw === 'string' && raw.trim()) values[axis] = raw.trim();
|
|
505
|
+
}
|
|
506
|
+
return values;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function nonEmptyString(value: unknown): string | undefined {
|
|
510
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/** Compare both sides axis by axis; an axis observed on one side only is not a mismatch. */
|
|
514
|
+
export function compareRunRequestEffective(
|
|
515
|
+
requested: RunRequestEffectiveValues,
|
|
516
|
+
effective: RunRequestEffectiveValues,
|
|
517
|
+
): RunRequestEffectiveMismatch[] {
|
|
518
|
+
const mismatches: RunRequestEffectiveMismatch[] = [];
|
|
519
|
+
for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
|
|
520
|
+
const requestedValue = requested[axis];
|
|
521
|
+
const effectiveValue = effective[axis];
|
|
522
|
+
if (requestedValue === undefined || effectiveValue === undefined || requestedValue === effectiveValue) continue;
|
|
523
|
+
mismatches.push({ axis, requested: requestedValue, effective: effectiveValue });
|
|
524
|
+
}
|
|
525
|
+
return mismatches;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Read the two sides out of one observer event. The canonical contract is an explicit
|
|
530
|
+
* `data.requested` / `data.effective` object. The real orchestrator records the
|
|
531
|
+
* requested child at run-origin and the selected execution provider at start.
|
|
532
|
+
*/
|
|
533
|
+
function runRequestEffectiveSidesOf(entry: RunLedgerEntry): RunRequestEffectiveComparison {
|
|
534
|
+
const data = isPlainRecord(entry.data) ? entry.data : {};
|
|
535
|
+
const requested = readRunRequestEffectiveValues(data.requested);
|
|
536
|
+
const effective = readRunRequestEffectiveValues(data.effective);
|
|
537
|
+
|
|
538
|
+
if (entry.event === 'run-origin') {
|
|
539
|
+
requested.childProvider ??= nonEmptyString(data.childProvider);
|
|
540
|
+
requested.childModel ??= nonEmptyString(data.childModel);
|
|
541
|
+
}
|
|
542
|
+
if (entry.event === 'start') {
|
|
543
|
+
effective.childProvider ??= nonEmptyString(data.provider);
|
|
544
|
+
effective.childModel ??= nonEmptyString(data.model);
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const childLlm = data.childLlm;
|
|
548
|
+
if (isPlainRecord(childLlm)) {
|
|
549
|
+
const provider = nonEmptyString(childLlm.provider);
|
|
550
|
+
if (provider !== undefined && requested.childProvider === undefined) requested.childProvider = provider;
|
|
551
|
+
const model = nonEmptyString(childLlm.model);
|
|
552
|
+
if (model !== undefined && requested.childModel === undefined) requested.childModel = model;
|
|
553
|
+
}
|
|
554
|
+
const zaiCodingPlan = data.zaiCodingPlan;
|
|
555
|
+
if (isPlainRecord(zaiCodingPlan)) {
|
|
556
|
+
const overage = nonEmptyString(zaiCodingPlan.overage);
|
|
557
|
+
if (overage !== undefined && requested.overagePolicy === undefined) requested.overagePolicy = overage;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
for (const key of ['childStart', 'llmConsumeStart'] as const) {
|
|
561
|
+
const start = data[key];
|
|
562
|
+
if (!isPlainRecord(start)) continue;
|
|
563
|
+
const provider = nonEmptyString(start.provider);
|
|
564
|
+
if (provider !== undefined && effective.childProvider === undefined) effective.childProvider = provider;
|
|
565
|
+
const model = nonEmptyString(start.model);
|
|
566
|
+
if (model !== undefined && effective.childModel === undefined) effective.childModel = model;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
return { requested, effective, mismatches: compareRunRequestEffective(requested, effective) };
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
/**
|
|
573
|
+
* Merge every non-comparison event of a run into one comparison. The request side keeps the
|
|
574
|
+
* first recorded value (run-origin) and the effective side keeps the last observed one
|
|
575
|
+
* (child start, first llm consume-start, actual Pod pool).
|
|
576
|
+
*/
|
|
577
|
+
export function runRequestEffectiveFromLedger(ledger: readonly RunLedgerEntry[]): RunRequestEffectiveComparison {
|
|
578
|
+
const requested: RunRequestEffectiveValues = {};
|
|
579
|
+
const effective: RunRequestEffectiveValues = {};
|
|
580
|
+
for (const entry of ledger) {
|
|
581
|
+
if (entry.event === RUN_REQUEST_VS_EFFECTIVE_EVENT) continue;
|
|
582
|
+
const sides = runRequestEffectiveSidesOf(entry);
|
|
583
|
+
for (const axis of RUN_REQUEST_EFFECTIVE_AXES) {
|
|
584
|
+
const requestedValue = sides.requested[axis];
|
|
585
|
+
if (requestedValue !== undefined && requested[axis] === undefined) requested[axis] = requestedValue;
|
|
586
|
+
const effectiveValue = sides.effective[axis];
|
|
587
|
+
if (effectiveValue !== undefined && effective[axis] === undefined) effective[axis] = effectiveValue;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
return { requested, effective, mismatches: compareRunRequestEffective(requested, effective) };
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/** Mismatch rows this run already wrote, de-duplicated across repeated comparisons. */
|
|
594
|
+
export function recordedRunRequestEffectiveMismatches(
|
|
595
|
+
ledger: readonly RunLedgerEntry[],
|
|
596
|
+
): RunRequestEffectiveMismatch[] {
|
|
597
|
+
const seen = new Set<string>();
|
|
598
|
+
const rows: RunRequestEffectiveMismatch[] = [];
|
|
599
|
+
for (const entry of ledger) {
|
|
600
|
+
if (entry.event !== RUN_REQUEST_VS_EFFECTIVE_EVENT) continue;
|
|
601
|
+
const recorded = isPlainRecord(entry.data) ? entry.data.mismatches : undefined;
|
|
602
|
+
if (!Array.isArray(recorded)) continue;
|
|
603
|
+
for (const row of recorded) {
|
|
604
|
+
if (!isPlainRecord(row)) continue;
|
|
605
|
+
const axis = row.axis;
|
|
606
|
+
if (typeof axis !== 'string' || !RUN_REQUEST_EFFECTIVE_AXES.includes(axis as RunRequestEffectiveAxis)) continue;
|
|
607
|
+
const requested = nonEmptyString(row.requested);
|
|
608
|
+
const effective = nonEmptyString(row.effective);
|
|
609
|
+
if (requested === undefined || effective === undefined) continue;
|
|
610
|
+
const key = `${axis}\u0000${requested}\u0000${effective}`;
|
|
611
|
+
if (seen.has(key)) continue;
|
|
612
|
+
seen.add(key);
|
|
613
|
+
rows.push({ axis: axis as RunRequestEffectiveAxis, requested, effective });
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
return rows;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
export interface RunRequestVsEffectiveRecordOptions {
|
|
620
|
+
/** Ledger directory; default = `runLedgerDir()`. */
|
|
621
|
+
dir?: string;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Write one `run-request-vs-effective` row under the run's own ledger file, inheriting the
|
|
626
|
+
* run's goalId and shard identity so the run stays a single mission on the timeline.
|
|
627
|
+
*/
|
|
628
|
+
export function recordRunRequestVsEffective(
|
|
629
|
+
runId: string,
|
|
630
|
+
requested: RunRequestEffectiveValues,
|
|
631
|
+
effective: RunRequestEffectiveValues,
|
|
632
|
+
options: RunRequestVsEffectiveRecordOptions = {},
|
|
633
|
+
): RunRequestEffectiveComparison {
|
|
634
|
+
const dir = options.dir ?? runLedgerDir();
|
|
635
|
+
const ledger = loadRunLedger(runId, dir) ?? [];
|
|
636
|
+
const start = ledger.find((entry) => entry.event === 'start' && typeof entry.timestamp === 'string');
|
|
637
|
+
const goalOwner = ledger.find((entry) => nonEmptyString(entry.goalId) !== undefined);
|
|
638
|
+
const comparison: RunRequestEffectiveComparison = {
|
|
639
|
+
requested,
|
|
640
|
+
effective,
|
|
641
|
+
mismatches: compareRunRequestEffective(requested, effective),
|
|
642
|
+
};
|
|
643
|
+
appendRunLedgerEntry({
|
|
644
|
+
timestamp: new Date().toISOString(),
|
|
645
|
+
runId,
|
|
646
|
+
event: RUN_REQUEST_VS_EFFECTIVE_EVENT,
|
|
647
|
+
data: { requested: comparison.requested, effective: comparison.effective, mismatches: comparison.mismatches },
|
|
648
|
+
...(goalOwner?.goalId === undefined ? {} : { goalId: goalOwner.goalId }),
|
|
649
|
+
...(start?.orchestrationId === undefined ? {} : { orchestrationId: start.orchestrationId }),
|
|
650
|
+
...(start?.shardId === undefined ? {} : { shardId: start.shardId }),
|
|
651
|
+
...(start?.pieceIndex === undefined ? {} : { pieceIndex: start.pieceIndex }),
|
|
652
|
+
...(start?.pieceTotal === undefined ? {} : { pieceTotal: start.pieceTotal }),
|
|
653
|
+
}, dir);
|
|
654
|
+
return comparison;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
function sameRunRequestEffectiveMismatches(
|
|
658
|
+
left: readonly RunRequestEffectiveMismatch[],
|
|
659
|
+
right: readonly RunRequestEffectiveMismatch[],
|
|
660
|
+
): boolean {
|
|
661
|
+
if (left.length !== right.length) return false;
|
|
662
|
+
const keys = new Set(right.map((row) => `${row.axis}\u0000${row.requested}\u0000${row.effective}`));
|
|
663
|
+
return left.every((row) => keys.has(`${row.axis}\u0000${row.requested}\u0000${row.effective}`));
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Production hook: after any observer event lands, compare the run's requested and effective
|
|
668
|
+
* sides and write the mismatch rows when they differ. Idempotent — a run whose rows already
|
|
669
|
+
* match its current comparison writes nothing. Recording only; no alerting and no repair.
|
|
670
|
+
*/
|
|
671
|
+
function recordRunRequestVsEffectiveFromLedger(runId: string, dir: string, appended: RunLedgerEntry): void {
|
|
672
|
+
// Keep unrelated observer writes O(1); only events carrying one side can
|
|
673
|
+
// change the comparison. In particular, a long run must not reread its
|
|
674
|
+
// complete ledger after every progress event.
|
|
675
|
+
if (!['run-origin', 'start', 'child-start', 'llm-consume-start'].includes(appended.event)
|
|
676
|
+
&& !isPlainRecord(appended.data?.requested) && !isPlainRecord(appended.data?.effective)) return;
|
|
677
|
+
if (appended.event === RUN_REQUEST_VS_EFFECTIVE_EVENT) return;
|
|
678
|
+
const ledger = loadRunLedger(runId, dir);
|
|
679
|
+
if (!ledger?.length) return;
|
|
680
|
+
const comparison = runRequestEffectiveFromLedger(ledger);
|
|
681
|
+
if (comparison.mismatches.length === 0) return;
|
|
682
|
+
if (sameRunRequestEffectiveMismatches(recordedRunRequestEffectiveMismatches(ledger), comparison.mismatches)) return;
|
|
683
|
+
recordRunRequestVsEffective(runId, comparison.requested, comparison.effective, { dir });
|
|
684
|
+
}
|
|
685
|
+
|
|
455
686
|
/** Append one observer event. Callers own fail-soft handling. */
|
|
456
687
|
export function appendRunLedgerEntry(entry: RunLedgerEntry, dir = runLedgerDir()): void {
|
|
457
688
|
if (refuseProductionLedgerWriteInTest(dir, 'run-ledger')) return;
|
|
@@ -465,6 +696,11 @@ export function appendRunLedgerEntry(entry: RunLedgerEntry, dir = runLedgerDir()
|
|
|
465
696
|
const line = `${JSON.stringify(row)}\n`;
|
|
466
697
|
if (!restoreArchivedRunLedger(dir, entry.runId, line)) appendFileSync(live, line, 'utf8');
|
|
467
698
|
});
|
|
699
|
+
try {
|
|
700
|
+
recordRunRequestVsEffectiveFromLedger(entry.runId, dir, entry);
|
|
701
|
+
} catch {
|
|
702
|
+
// The comparison is observation: it must never fail a producer write that already landed.
|
|
703
|
+
}
|
|
468
704
|
}
|
|
469
705
|
|
|
470
706
|
/** Caller decision inside `appendRunLedgerEntryChecked`: either `append` exactly one entry, or skip with `result`. */
|
|
@@ -836,6 +1072,13 @@ export interface RunLedgerTimelineEntry {
|
|
|
836
1072
|
pieceTotal?: number;
|
|
837
1073
|
/** Producer-recorded `graph.unit` visits of this run, with terminal unmatched enters reported as orphans. */
|
|
838
1074
|
unitVisits?: GraphUnitVisitClassification;
|
|
1075
|
+
/** Requested vs effective values this run recorded; present only when the two sides differ. */
|
|
1076
|
+
requestVsEffective?: {
|
|
1077
|
+
requested: RunRequestEffectiveValues;
|
|
1078
|
+
effective: RunRequestEffectiveValues;
|
|
1079
|
+
};
|
|
1080
|
+
/** Mismatch rows (axis · requested · effective) for this run; absent when requested equals effective. */
|
|
1081
|
+
mismatches?: RunRequestEffectiveMismatch[];
|
|
839
1082
|
}
|
|
840
1083
|
|
|
841
1084
|
export interface RunLedgerTimelineQueryOptions {
|
|
@@ -844,6 +1087,20 @@ export interface RunLedgerTimelineQueryOptions {
|
|
|
844
1087
|
list?: (path: string) => string[];
|
|
845
1088
|
}
|
|
846
1089
|
|
|
1090
|
+
/**
|
|
1091
|
+
* Timeline projection of the requested-vs-effective rows. Recorded rows win over a derived
|
|
1092
|
+
* comparison so the timeline shows what the run actually wrote; equal sides project nothing.
|
|
1093
|
+
*/
|
|
1094
|
+
function runRequestEffectiveTimelineFields(
|
|
1095
|
+
ledger: readonly RunLedgerEntry[],
|
|
1096
|
+
): Pick<RunLedgerTimelineEntry, 'mismatches' | 'requestVsEffective'> {
|
|
1097
|
+
const recorded = recordedRunRequestEffectiveMismatches(ledger);
|
|
1098
|
+
const derived = runRequestEffectiveFromLedger(ledger);
|
|
1099
|
+
const mismatches = recorded.length > 0 ? recorded : derived.mismatches;
|
|
1100
|
+
if (mismatches.length === 0) return {};
|
|
1101
|
+
return { mismatches, requestVsEffective: { requested: derived.requested, effective: derived.effective } };
|
|
1102
|
+
}
|
|
1103
|
+
|
|
847
1104
|
/**
|
|
848
1105
|
* Read runs whose sole recorded goalId equals the historian missionId.
|
|
849
1106
|
* goalId is chosen because the producer already persists it on each observer event, while orchestrationId only groups shards.
|
|
@@ -878,6 +1135,7 @@ export function queryRunLedgerTimeline(missionId: string, options: RunLedgerTime
|
|
|
878
1135
|
...(execution.pieceIndex === undefined ? {} : { pieceIndex: execution.pieceIndex }),
|
|
879
1136
|
...(execution.pieceTotal === undefined ? {} : { pieceTotal: execution.pieceTotal }),
|
|
880
1137
|
unitVisits: classifyGraphUnitVisits(ledger),
|
|
1138
|
+
...runRequestEffectiveTimelineFields(ledger),
|
|
881
1139
|
});
|
|
882
1140
|
} catch {
|
|
883
1141
|
// A corrupt or concurrently replaced ledger must not leak a partial run into another mission timeline.
|