elanous 0.2.36 → 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/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.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/{4304.e9b2512834a9e23e.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/1923-5c1695332240246a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
- 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/{5711.957b095705c12560.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/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
- 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/{3727.7949ccaacaa71242.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/3341-f09b9efbd7a82f70.js +1 -0
- 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/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
- 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/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
- 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/4804.6012b5cd33c22792.js +90 -0
- 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/{528.38ce20ef8aa251ff.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/5255-1b60d50eabe9f057.js +1 -0
- 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/{2683.c9773a0c589b031b.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/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
- 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/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
- 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/7000.28157393caaf5343.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
- 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/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
- 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/{3324.a09703033abcbd2f.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/{3410.7f9af5ab77cbe65f.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/{771.c3cdb6c1f7f47c02.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/{4615.8525eb0add35eba6.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/{6943.c6b24124853a47b2.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/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
- 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/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
- 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/{ceba0382.650712b56b85b582.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-c348a3959c5b5fc6.js +1 -0
- 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-d1d1210f99f620ae.js +1 -0
- 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-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
- 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-a9d9a3e66459c1e0.js +1 -0
- 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-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
- 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/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.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/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/graphs/drafts/recipes.yaml +27 -7
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/graphs/work/draft-close.yaml +54 -0
- package/graphs/work/green-close.yaml +37 -0
- package/graphs/work/recipes.yaml +46 -1
- package/graphs/work/run-research.yaml +35 -0
- package/package.json +1 -1
- package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/boundary-proof-mapping-audit.ts +88 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/codex-fallback-live-probe.ts +17 -15
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +546 -0
- package/scripts/goals/authoring-metrics.ts +258 -0
- package/scripts/graph-units/draft-close-node.ts +222 -0
- package/scripts/hook-order-sweep.ts +7 -4
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/land-global-checks.ts +69 -1
- package/scripts/measure-nl-routing-corpus.ts +207 -2
- 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/docs-node.ts +140 -0
- package/scripts/release-loop/gate-closure.ts +48 -0
- package/scripts/release-loop/gate-diff.ts +2 -1
- 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/known-issues-node.ts +6 -4
- package/scripts/release-loop/notes-repair.ts +216 -0
- package/scripts/release-loop/prepare-node.ts +61 -5
- package/scripts/release-loop/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +406 -7
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- 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 +109 -15
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +12 -1
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/run-context.ts +1 -1
- package/src/agent/task-notification.ts +3 -1
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent-substrate/pr-reviewer.ts +11 -3
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +537 -57
- 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/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/pr-manager.ts +64 -13
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/bots/screen-probe.ts +1 -1
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/capture/tui-self-report.ts +42 -5
- package/src/chat/index.ts +1 -0
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/autopilot-cli.ts +24 -9
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +116 -7
- 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/logs-cli.ts +357 -2
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +15 -11
- package/src/cli/pr-granularity.ts +5 -3
- 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 +112 -4
- package/src/cli/release-cli.ts +89 -18
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +24 -6
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +370 -33
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/cli/usage-cli.ts +12 -10
- package/src/context-bus/claude-memory-import.ts +99 -0
- package/src/context-bus/context-now.ts +86 -2
- package/src/context-bus/long-term-memory.ts +125 -0
- package/src/core-turn/run-core-turn.ts +9 -2
- package/src/core-turn/run-goal-loop.ts +5 -2
- package/src/core-turn/types.ts +5 -0
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/index.ts +115 -30
- package/src/dashboard/input/agent-wake.ts +43 -0
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- package/src/dashboard/term-slash-runtime.ts +2 -0
- package/src/dashboard/turn-preamble.ts +28 -4
- package/src/display/coordinator.ts +45 -12
- package/src/display/resize-listener.ts +41 -20
- package/src/display/synchronized-output-region.ts +60 -0
- package/src/domains/guardian-tick.ts +9 -0
- package/src/domains/surface-events.ts +80 -1
- package/src/exec-requests/planner.ts +37 -2
- package/src/execution-loop/launch-gate.ts +4 -3
- package/src/git-fs/cli-stderr.ts +45 -0
- package/src/git-fs/gh-cli.ts +6 -3
- package/src/git-fs/git-cli.ts +11 -5
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +26 -2
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +34 -7
- package/src/graph-wizard/generate.ts +29 -6
- package/src/grok/credential.ts +107 -36
- package/src/harness/harness-cli-command.ts +179 -33
- package/src/harness/review-adapter.ts +26 -6
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +151 -18
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- 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/route-decision.ts +13 -0
- package/src/llm-tool-name.ts +37 -0
- package/src/llm-tool-schema.ts +55 -0
- package/src/llm.ts +203 -21
- package/src/loops/checker.ts +100 -0
- package/src/loops/consensus.ts +26 -2
- package/src/loops/loop-cli.ts +9 -4
- package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +55 -7
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/msg/msg-store.ts +17 -0
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/graph-wizard-api.ts +27 -2
- package/src/nexus/api/grid.ts +24 -4
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +14 -6
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/nexus/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview.ts +41 -5
- package/src/patents/ledger.ts +18 -1
- package/src/policy/llm-policy.ts +3 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +9 -4
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +40 -31
- package/src/pty-shell/herdr-prune-stale.ts +17 -0
- package/src/pty-shell/herdr-sequence-lease.ts +60 -0
- package/src/pty-shell/pty-control-ipc.ts +187 -18
- package/src/pty-shell/pty-manifest.ts +16 -2
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/tui-run-state.ts +235 -1
- package/src/release-loop/checklist.ts +50 -5
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/repl/index.ts +18 -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/seat-loop/seat-report.ts +1 -0
- package/src/self-dev/ask-launch-flow.ts +86 -10
- package/src/self-dev/decompose-proposal.ts +29 -18
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-pipeline.ts +29 -7
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +254 -16
- package/src/self-dev/draft-triage-rules.ts +19 -5
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/run-supervisor.ts +22 -7
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +310 -6
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/doctor-visit.ts +108 -0
- package/src/self-implement/gate-artifacts.ts +6 -2
- package/src/self-implement/gate-baseline.ts +99 -1
- package/src/self-implement/gate-cli.ts +231 -82
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-remote.ts +30 -4
- package/src/self-implement/gate-scope.ts +13 -1
- package/src/self-implement/goal-author.ts +407 -21
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +110 -27
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +125 -12
- 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 +369 -33
- 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/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +14 -0
- package/src/self-implement/run-ledger.ts +428 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/seams.ts +45 -16
- package/src/self-implement/self-implement-cli.ts +26 -2
- package/src/self-implement/stop-autoheal.ts +1 -0
- package/src/self-implement/test-seams.ts +13 -1
- package/src/self-implement/train-reach-grouping.ts +8 -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 +10 -1
- package/src/session/id-prefix.ts +60 -0
- package/src/session/index.ts +6 -0
- package/src/session-runtime/index.ts +18 -23
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/pty.ts +5 -0
- package/src/skills/tools/schedule-wakeup.ts +1 -6
- package/src/status/bar.ts +3 -3
- package/src/status/metrics.ts +12 -1
- package/src/steward/rejudge-tick.ts +12 -5
- package/src/steward/resync-tick.ts +31 -4
- package/src/storage/file-lock.ts +17 -4
- package/src/task-agent/actions.ts +199 -4
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/boundary-proof-mapping.ts +12 -0
- package/src/task-agent/boundary-proof-producer.ts +147 -0
- package/src/task-agent/completion-evidence.ts +2 -1
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/green-close-recipe.ts +239 -0
- package/src/task-agent/green-sweep.ts +64 -10
- package/src/task-agent/live-moves.ts +48 -3
- package/src/task-agent/map-host-adapter.ts +134 -0
- package/src/task-agent/map-reduce.ts +158 -0
- package/src/task-agent/map-run-ledger.ts +226 -0
- package/src/task-agent/parent-host.ts +74 -17
- package/src/task-agent/rejudge-on-head.ts +72 -5
- package/src/task-agent/repair-cycle.ts +108 -8
- package/src/task-agent/repair-next-move.ts +12 -2
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +188 -5
- package/src/task-agent/task-hand.ts +253 -20
- package/src/task-agent/task-parent-role-llm.ts +9 -0
- package/src/task-agent/tier-split.ts +40 -5
- package/src/task-agent/work-order.ts +53 -2
- package/src/task-orchestrator/dispatcher.ts +46 -1
- package/src/task-orchestrator/generator-prompt.ts +6 -0
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +77 -8
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/testing/linux-env.ts +177 -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/chat/goal-interim.ts +5 -1
- package/src/tui/entry.ts +722 -30
- package/src/tui/input/at-picker.ts +55 -0
- 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 +38 -35
- package/src/tui/slash/signals.ts +114 -0
- package/src/tui/slash/term-next.ts +72 -0
- package/src/tui-client/local-chat-turn.ts +31 -9
- package/src/user-config.ts +30 -3
- package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
- package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +17 -6
- package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
- package/src/ux-sim/resume-picker-device.ts +173 -0
- package/src/ux-sim/session-id-seed.ts +60 -0
- package/src/ux-sim/skills-tools-shell-device.ts +156 -0
- package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
- package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
- package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
- package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.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/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
|
@@ -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`. */
|
|
@@ -834,6 +1070,15 @@ export interface RunLedgerTimelineEntry {
|
|
|
834
1070
|
shardId?: string;
|
|
835
1071
|
pieceIndex?: number;
|
|
836
1072
|
pieceTotal?: number;
|
|
1073
|
+
/** Producer-recorded `graph.unit` visits of this run, with terminal unmatched enters reported as orphans. */
|
|
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[];
|
|
837
1082
|
}
|
|
838
1083
|
|
|
839
1084
|
export interface RunLedgerTimelineQueryOptions {
|
|
@@ -842,6 +1087,20 @@ export interface RunLedgerTimelineQueryOptions {
|
|
|
842
1087
|
list?: (path: string) => string[];
|
|
843
1088
|
}
|
|
844
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
|
+
|
|
845
1104
|
/**
|
|
846
1105
|
* Read runs whose sole recorded goalId equals the historian missionId.
|
|
847
1106
|
* goalId is chosen because the producer already persists it on each observer event, while orchestrationId only groups shards.
|
|
@@ -875,6 +1134,8 @@ export function queryRunLedgerTimeline(missionId: string, options: RunLedgerTime
|
|
|
875
1134
|
...(execution.shardId === undefined ? {} : { shardId: execution.shardId }),
|
|
876
1135
|
...(execution.pieceIndex === undefined ? {} : { pieceIndex: execution.pieceIndex }),
|
|
877
1136
|
...(execution.pieceTotal === undefined ? {} : { pieceTotal: execution.pieceTotal }),
|
|
1137
|
+
unitVisits: classifyGraphUnitVisits(ledger),
|
|
1138
|
+
...runRequestEffectiveTimelineFields(ledger),
|
|
878
1139
|
});
|
|
879
1140
|
} catch {
|
|
880
1141
|
// A corrupt or concurrently replaced ledger must not leak a partial run into another mission timeline.
|
|
@@ -883,6 +1144,75 @@ export function queryRunLedgerTimeline(missionId: string, options: RunLedgerTime
|
|
|
883
1144
|
return entries.sort((left, right) => Date.parse(left.executedAt) - Date.parse(right.executedAt) || left.runId.localeCompare(right.runId));
|
|
884
1145
|
}
|
|
885
1146
|
|
|
1147
|
+
export interface GraphAdaptReport {
|
|
1148
|
+
goalId: string;
|
|
1149
|
+
runCount: number;
|
|
1150
|
+
uniquePathSignatures: number;
|
|
1151
|
+
unitCallCount: number;
|
|
1152
|
+
adaptationCount: number;
|
|
1153
|
+
adapted: { landed: number; denominator: number; rate: number | null };
|
|
1154
|
+
nonAdapted: { landed: number; denominator: number; rate: number | null };
|
|
1155
|
+
excludedCount: number;
|
|
1156
|
+
exclusionReasons: Record<string, number>;
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
/** Measure only producer-observed traversals and variant applications; never activate adaptation. */
|
|
1160
|
+
export function queryGraphAdaptReport(goalId: string, stateDir = elanousStateRoot()): GraphAdaptReport {
|
|
1161
|
+
const dir = runLedgerDir(stateDir);
|
|
1162
|
+
const signatures = new Set<string>();
|
|
1163
|
+
const counts = { adapted: { landed: 0, denominator: 0 }, nonAdapted: { landed: 0, denominator: 0 } };
|
|
1164
|
+
const exclusionReasons: Record<string, number> = {};
|
|
1165
|
+
const exclude = (reason: string): void => { exclusionReasons[reason] = (exclusionReasons[reason] ?? 0) + 1; };
|
|
1166
|
+
let unitCallCount = 0;
|
|
1167
|
+
let adaptationCount = 0;
|
|
1168
|
+
let fileNames: string[];
|
|
1169
|
+
try { fileNames = readdirSync(dir); }
|
|
1170
|
+
catch (error) {
|
|
1171
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') fileNames = [];
|
|
1172
|
+
else throw error;
|
|
1173
|
+
}
|
|
1174
|
+
for (const name of fileNames) {
|
|
1175
|
+
const runId = runIdFromCanonicalLedgerFile(name);
|
|
1176
|
+
if (!runId) continue;
|
|
1177
|
+
let ledger: RunLedgerEntry[] | null;
|
|
1178
|
+
try { ledger = loadRunLedger(runId, dir); }
|
|
1179
|
+
catch { exclude('invalid-ledger'); continue; }
|
|
1180
|
+
if (!ledger?.length) { exclude('empty-ledger'); continue; }
|
|
1181
|
+
const goalIds = new Set(ledger.map(entry => entry.goalId).filter((id): id is string => typeof id === 'string' && id.length > 0));
|
|
1182
|
+
if (goalIds.size === 1 && !goalIds.has(goalId)) continue;
|
|
1183
|
+
if (goalIds.size !== 1) { exclude('goal-id-missing-or-conflicting'); continue; }
|
|
1184
|
+
const traversals = ledger.filter(entry => entry.event === 'pipeline-traversal-shadow');
|
|
1185
|
+
const paths = traversals.map(entry => entry.data.observedNodes);
|
|
1186
|
+
if (paths.length === 0 || paths.some(path => !Array.isArray(path) || path.length === 0 || !path.every(node => typeof node === 'string' && node.length > 0))) {
|
|
1187
|
+
exclude('path-missing-or-invalid'); continue;
|
|
1188
|
+
}
|
|
1189
|
+
let graphRun: unknown;
|
|
1190
|
+
try { graphRun = JSON.parse(readFileSync(join(stateDir, 'graph-runs', 'self-implement', `${runId}.json`), 'utf8')); }
|
|
1191
|
+
catch (error) {
|
|
1192
|
+
if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { exclude('graph-run-unreadable'); continue; }
|
|
1193
|
+
}
|
|
1194
|
+
const recorded = graphRun && typeof graphRun === 'object' && !Array.isArray(graphRun) ? graphRun as Record<string, unknown> : null;
|
|
1195
|
+
if (recorded && (recorded.runId !== runId || recorded.graphId !== 'self-implement' ||
|
|
1196
|
+
(recorded.unitCalls !== undefined && !Array.isArray(recorded.unitCalls)))) {
|
|
1197
|
+
exclude('unit-calls-invalid'); continue;
|
|
1198
|
+
}
|
|
1199
|
+
const merge = [...ledger].reverse().find(entry => entry.event === 'merged');
|
|
1200
|
+
if (merge && typeof merge.data.merged !== 'boolean') { exclude('landing-invalid'); continue; }
|
|
1201
|
+
signatures.add(JSON.stringify(paths.at(-1)));
|
|
1202
|
+
unitCallCount += recorded && Array.isArray(recorded.unitCalls) ? recorded.unitCalls.length : 0;
|
|
1203
|
+
const adaptations = ledger.filter(entry => entry.event === 'graph-variant-applied');
|
|
1204
|
+
adaptationCount += adaptations.length;
|
|
1205
|
+
const group = adaptations.length ? counts.adapted : counts.nonAdapted;
|
|
1206
|
+
group.denominator += 1;
|
|
1207
|
+
if (merge?.data.merged === true) group.landed += 1;
|
|
1208
|
+
}
|
|
1209
|
+
const rate = (group: { landed: number; denominator: number }) => ({ ...group, rate: group.denominator ? group.landed / group.denominator : null });
|
|
1210
|
+
return { goalId, runCount: counts.adapted.denominator + counts.nonAdapted.denominator,
|
|
1211
|
+
uniquePathSignatures: signatures.size, unitCallCount, adaptationCount,
|
|
1212
|
+
adapted: rate(counts.adapted), nonAdapted: rate(counts.nonAdapted),
|
|
1213
|
+
excludedCount: Object.values(exclusionReasons).reduce((total, count) => total + count, 0), exclusionReasons };
|
|
1214
|
+
}
|
|
1215
|
+
|
|
886
1216
|
export interface GoalSourceDistributionQuery {
|
|
887
1217
|
ledgerDirectory: string;
|
|
888
1218
|
runCount: number;
|
|
@@ -1416,6 +1746,8 @@ export interface UnfinishedRunLedgerEntry {
|
|
|
1416
1746
|
lifecycle: UnfinishedRunLifecycle;
|
|
1417
1747
|
/** Non-blocking request record (kind·reason·next) carried by this runId's ledger; absent for runs without one. */
|
|
1418
1748
|
nonBlocking?: NonBlockingRunLedgerRecord;
|
|
1749
|
+
/** ⭐ graph.unit enter without its exit on a *terminal* ledger — present only when non-empty. */
|
|
1750
|
+
orphanUnitVisits?: readonly GraphUnitOrphanVisit[];
|
|
1419
1751
|
}
|
|
1420
1752
|
|
|
1421
1753
|
export interface UnfinishedRunLedgerQuery {
|
|
@@ -1435,6 +1767,12 @@ export interface UnfinishedRunLedgerQuery {
|
|
|
1435
1767
|
pathFilter?: string;
|
|
1436
1768
|
matchingPathCount?: number;
|
|
1437
1769
|
unknownPathCount?: number;
|
|
1770
|
+
/**
|
|
1771
|
+
* ⭐ Total orphan unit visits across **every scanned ledger** — including terminal runs that are not
|
|
1772
|
+
* returned as entries (they are counted, never revived). 같은 원장을 「미완」으로 되살리지 않고도
|
|
1773
|
+
* 엉킨 visit 을 셀 수 있게 하는 값이다.
|
|
1774
|
+
*/
|
|
1775
|
+
orphanUnitVisitCount?: number;
|
|
1438
1776
|
scope: 'self-implement-run-ledger';
|
|
1439
1777
|
note: string;
|
|
1440
1778
|
}
|
|
@@ -1546,6 +1884,78 @@ function isTerminalOnlyByTrailingRunStatus(ledger: readonly RunLedgerEntry[]): b
|
|
|
1546
1884
|
&& !hasHumanStopEvent(ledger);
|
|
1547
1885
|
}
|
|
1548
1886
|
|
|
1887
|
+
/** One producer-recorded `graph.unit` enter that the run never closed with a matching exit. */
|
|
1888
|
+
export interface GraphUnitOrphanVisit {
|
|
1889
|
+
childRunId: string | null;
|
|
1890
|
+
graphId: string | null;
|
|
1891
|
+
nodeId: string | null;
|
|
1892
|
+
unit: string | null;
|
|
1893
|
+
/** Timestamp of the unmatched enter; null when the producer recorded none. */
|
|
1894
|
+
enteredAt: string | null;
|
|
1895
|
+
}
|
|
1896
|
+
|
|
1897
|
+
export interface GraphUnitVisitClassification {
|
|
1898
|
+
/** Whether the ledger itself records the run's end (`run-status`, `terminal`, or `human-stop`). */
|
|
1899
|
+
terminal: boolean;
|
|
1900
|
+
enterCount: number;
|
|
1901
|
+
exitCount: number;
|
|
1902
|
+
/** Unmatched enters in a terminal run. An open enter on a non-terminal ledger is in flight, not an orphan. */
|
|
1903
|
+
orphanCount: number;
|
|
1904
|
+
orphanUnitVisits: readonly GraphUnitOrphanVisit[];
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1907
|
+
function dataString(data: Record<string, unknown>, field: string): string | null {
|
|
1908
|
+
const value = data[field];
|
|
1909
|
+
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
1910
|
+
}
|
|
1911
|
+
|
|
1912
|
+
function graphUnitVisitOf(entry: RunLedgerEntry): GraphUnitOrphanVisit {
|
|
1913
|
+
return {
|
|
1914
|
+
childRunId: dataString(entry.data, 'childRunId'),
|
|
1915
|
+
graphId: dataString(entry.data, 'graphId'),
|
|
1916
|
+
nodeId: dataString(entry.data, 'nodeId'),
|
|
1917
|
+
unit: dataString(entry.data, 'unit'),
|
|
1918
|
+
enteredAt: entry.timestamp ?? null,
|
|
1919
|
+
};
|
|
1920
|
+
}
|
|
1921
|
+
|
|
1922
|
+
/** An exit closes the visit with its own childRunId; without one it closes the latest visit on the same node. */
|
|
1923
|
+
function closesUnitVisit(exitChildRunId: string | null, exitNodeId: string | null, open: GraphUnitOrphanVisit): boolean {
|
|
1924
|
+
if (open.childRunId !== null || exitChildRunId !== null) return open.childRunId === exitChildRunId;
|
|
1925
|
+
return open.nodeId !== null && open.nodeId === exitNodeId;
|
|
1926
|
+
}
|
|
1927
|
+
|
|
1928
|
+
/**
|
|
1929
|
+
* Pair each producer-recorded `graph.unit` enter with its exit and report the visits a terminal run left open.
|
|
1930
|
+
* This only reads the already-loaded ledger: it never synthesizes or writes an exit entry.
|
|
1931
|
+
*/
|
|
1932
|
+
export function classifyGraphUnitVisits(ledger: readonly RunLedgerEntry[]): GraphUnitVisitClassification {
|
|
1933
|
+
const open: GraphUnitOrphanVisit[] = [];
|
|
1934
|
+
let enterCount = 0;
|
|
1935
|
+
let exitCount = 0;
|
|
1936
|
+
for (const entry of ledger) {
|
|
1937
|
+
if (entry.event !== 'graph.unit') continue;
|
|
1938
|
+
if (entry.data.phase === 'enter') {
|
|
1939
|
+
enterCount += 1;
|
|
1940
|
+
open.push(graphUnitVisitOf(entry));
|
|
1941
|
+
continue;
|
|
1942
|
+
}
|
|
1943
|
+
// `budget-exhausted` is a recorded failure the runner still follows with an exit, so it closes nothing.
|
|
1944
|
+
if (entry.data.phase !== 'exit') continue;
|
|
1945
|
+
exitCount += 1;
|
|
1946
|
+
const exitChildRunId = dataString(entry.data, 'childRunId');
|
|
1947
|
+
const exitNodeId = dataString(entry.data, 'nodeId');
|
|
1948
|
+
for (let index = open.length - 1; index >= 0; index -= 1) {
|
|
1949
|
+
if (!closesUnitVisit(exitChildRunId, exitNodeId, open[index]!)) continue;
|
|
1950
|
+
open.splice(index, 1);
|
|
1951
|
+
break;
|
|
1952
|
+
}
|
|
1953
|
+
}
|
|
1954
|
+
const terminal = hasTerminalRunStatus(ledger);
|
|
1955
|
+
const orphanUnitVisits = terminal ? open : [];
|
|
1956
|
+
return { terminal, enterCount, exitCount, orphanCount: orphanUnitVisits.length, orphanUnitVisits };
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1549
1959
|
/** ⛔⭐⭐⭐ 미완 항목의 «상태» — 종전엔 이 조회가 낸 것이 «한 값»(`terminal-status-missing`)뿐이었다.
|
|
1550
1960
|
* 📏 2026-08-11 실측: 그 한 값 안에 서로 «다른 것»이 섞여 있었다 —
|
|
1551
1961
|
* 실제로 도는 것 2 · 오래 전에 죽은 잔해 51(중앙 5.2일) · 종료를 «다른 이름»으로 적은 것 5.
|
|
@@ -1773,6 +2183,8 @@ interface UnfinishedLedgerFacts {
|
|
|
1773
2183
|
goalFile: string | null;
|
|
1774
2184
|
fixedLifecycle: UnfinishedRunLifecycle;
|
|
1775
2185
|
nonBlocking: NonBlockingRunLedgerRecord | null;
|
|
2186
|
+
/** Held here so a terminal ledger's orphan visits are countable before the terminal `continue`. */
|
|
2187
|
+
unitVisits: GraphUnitVisitClassification;
|
|
1776
2188
|
}
|
|
1777
2189
|
|
|
1778
2190
|
// A full federated scan can exceed 5,000 files; keep the previous scan resident for stat-checked reuse.
|
|
@@ -1797,7 +2209,8 @@ function unfinishedLedgerCacheKey(path: string, read?: RunLedgerReader): string
|
|
|
1797
2209
|
// 원장 옆에 (size, mtimeMs, ctimeMs) 스탬프로 저장하고, 스탬프가 같으면 재사용한다. 원장에 무엇이 «붙으면»
|
|
1798
2210
|
// 스탬프가 바뀌므로 무효화는 자동이다 (같은 크기로 덮고 mtime 을 되돌려도 ctime 이 바뀐다). 읽기 실패는 전부 fail-soft: 색인이 없으면 그냥 새로 읽는다.
|
|
1799
2211
|
const RUN_LEDGER_SCAN_INDEX_FILE = '.unfinished-scan-index.json';
|
|
1800
|
-
|
|
2212
|
+
// v3 added facts.unitVisits; a v2 record would hand back a facts object without it.
|
|
2213
|
+
const RUN_LEDGER_SCAN_INDEX_VERSION = 3;
|
|
1801
2214
|
const RUN_LEDGER_SCAN_INDEX_LIMIT = 32_768;
|
|
1802
2215
|
|
|
1803
2216
|
/** Where the persisted scan index lives: beside its ledgers, never mistaken for one (readdir filters canonical names). */
|
|
@@ -1829,7 +2242,9 @@ function isScanIndexFacts(value: unknown): value is UnfinishedLedgerFacts {
|
|
|
1829
2242
|
&& typeof facts.lastActivityStatus === 'string'
|
|
1830
2243
|
&& (facts.targetRoot === null || typeof facts.targetRoot === 'string')
|
|
1831
2244
|
&& (facts.goalFile === null || typeof facts.goalFile === 'string')
|
|
1832
|
-
&& typeof facts.fixedLifecycle === 'string' && UNFINISHED_LIFECYCLE_WORDS.has(facts.fixedLifecycle)
|
|
2245
|
+
&& typeof facts.fixedLifecycle === 'string' && UNFINISHED_LIFECYCLE_WORDS.has(facts.fixedLifecycle)
|
|
2246
|
+
&& typeof (facts.unitVisits as GraphUnitVisitClassification | undefined)?.orphanCount === 'number'
|
|
2247
|
+
&& Array.isArray((facts.unitVisits as GraphUnitVisitClassification | undefined)?.orphanUnitVisits);
|
|
1833
2248
|
}
|
|
1834
2249
|
|
|
1835
2250
|
function isScanIndexRecord(value: unknown): value is RunLedgerScanIndexRecord {
|
|
@@ -1895,6 +2310,7 @@ function unfinishedLedgerFacts(ledger: readonly RunLedgerEntry[]): UnfinishedLed
|
|
|
1895
2310
|
goalFile: ledgerGoalDocument(ledger),
|
|
1896
2311
|
fixedLifecycle: classifyUnfinishedLifecycle(ledger, null, 0),
|
|
1897
2312
|
nonBlocking: readNonBlockingRunRecord(ledger),
|
|
2313
|
+
unitVisits: classifyGraphUnitVisits(ledger),
|
|
1898
2314
|
};
|
|
1899
2315
|
}
|
|
1900
2316
|
|
|
@@ -2014,6 +2430,8 @@ export function queryUnfinishedRunLedgers(options: UnfinishedRunLedgerQueryOptio
|
|
|
2014
2430
|
let cacheMisses = 0;
|
|
2015
2431
|
let ledgerTargetCount = 0;
|
|
2016
2432
|
let callerCwdCount = 0;
|
|
2433
|
+
// ⭐ 터미널 원장도 «세기만» 한다 — entries 로 되살리지 않는다(부활 금지).
|
|
2434
|
+
let orphanUnitVisitCount = 0;
|
|
2017
2435
|
for (const fileName of fileNames) {
|
|
2018
2436
|
const runId = runIdFromCanonicalLedgerFile(fileName);
|
|
2019
2437
|
if (!runId) continue;
|
|
@@ -2037,6 +2455,9 @@ export function queryUnfinishedRunLedgers(options: UnfinishedRunLedgerQueryOptio
|
|
|
2037
2455
|
callerCwdCount += 1;
|
|
2038
2456
|
continue;
|
|
2039
2457
|
}
|
|
2458
|
+
const orphanUnitVisits = facts.unitVisits.orphanUnitVisits;
|
|
2459
|
+
orphanUnitVisitCount += facts.unitVisits.orphanCount;
|
|
2460
|
+
const orphanVisitField = orphanUnitVisits.length > 0 ? { orphanUnitVisits } : {};
|
|
2040
2461
|
if (facts.terminal) {
|
|
2041
2462
|
terminal += 1;
|
|
2042
2463
|
if (facts.terminalByTrailingRunStatus) terminalByTrailingRunStatus += 1;
|
|
@@ -2070,7 +2491,7 @@ export function queryUnfinishedRunLedgers(options: UnfinishedRunLedgerQueryOptio
|
|
|
2070
2491
|
: goalDocument.status === 'directory-unreadable'
|
|
2071
2492
|
? 'goal-directory-unreadable'
|
|
2072
2493
|
: 'goal-document-not-found';
|
|
2073
|
-
entries.push({ runId, branch, status: 'terminal-status-missing', plannedPaths: [], plannedPathStatus, ...unknownDeclaredPaths(), pathMatchReasons: {}, goalDocumentPath: null, goalLookupBasis, goalDocumentSearchDirectory: searchDirectory, ...activity, lifecycle, ...(facts.nonBlocking ? { nonBlocking: facts.nonBlocking } : {}) });
|
|
2494
|
+
entries.push({ runId, branch, status: 'terminal-status-missing', plannedPaths: [], plannedPathStatus, ...unknownDeclaredPaths(), pathMatchReasons: {}, goalDocumentPath: null, goalLookupBasis, goalDocumentSearchDirectory: searchDirectory, ...activity, lifecycle, ...(facts.nonBlocking ? { nonBlocking: facts.nonBlocking } : {}), ...orphanVisitField });
|
|
2074
2495
|
continue;
|
|
2075
2496
|
}
|
|
2076
2497
|
try {
|
|
@@ -2078,9 +2499,9 @@ export function queryUnfinishedRunLedgers(options: UnfinishedRunLedgerQueryOptio
|
|
|
2078
2499
|
const text = typeof document === 'string' ? document : document.toString('utf8');
|
|
2079
2500
|
const paths = [...new Set(tracedPathReferences(text).map((reference) => reference.path))];
|
|
2080
2501
|
const declared = declaredPathsFromGoalDocument(text);
|
|
2081
|
-
entries.push({ runId, branch, status: 'terminal-status-missing', plannedPaths: paths, plannedPathStatus: paths.length > 0 ? goalDocument.source === 'ledger' ? 'found-ledger-goal-file' : 'found-branch-fallback' : 'no-traced-paths', ...declared, pathMatchReasons: pathMatchReasons(declared.declaredPaths, paths), goalDocumentPath: goalDocument.path, goalLookupBasis, goalDocumentSearchDirectory: searchDirectory, ...activity, lifecycle, ...(facts.nonBlocking ? { nonBlocking: facts.nonBlocking } : {}) });
|
|
2502
|
+
entries.push({ runId, branch, status: 'terminal-status-missing', plannedPaths: paths, plannedPathStatus: paths.length > 0 ? goalDocument.source === 'ledger' ? 'found-ledger-goal-file' : 'found-branch-fallback' : 'no-traced-paths', ...declared, pathMatchReasons: pathMatchReasons(declared.declaredPaths, paths), goalDocumentPath: goalDocument.path, goalLookupBasis, goalDocumentSearchDirectory: searchDirectory, ...activity, lifecycle, ...(facts.nonBlocking ? { nonBlocking: facts.nonBlocking } : {}), ...orphanVisitField });
|
|
2082
2503
|
} catch {
|
|
2083
|
-
entries.push({ runId, branch, status: 'terminal-status-missing', plannedPaths: [], plannedPathStatus: 'goal-document-unreadable', declaredPaths: [], declaredPathStatus: 'goal-document-unreadable', pathMatchReasons: {}, goalDocumentPath: goalDocument.path, goalLookupBasis, goalDocumentSearchDirectory: searchDirectory, ...activity, lifecycle, ...(facts.nonBlocking ? { nonBlocking: facts.nonBlocking } : {}) });
|
|
2504
|
+
entries.push({ runId, branch, status: 'terminal-status-missing', plannedPaths: [], plannedPathStatus: 'goal-document-unreadable', declaredPaths: [], declaredPathStatus: 'goal-document-unreadable', pathMatchReasons: {}, goalDocumentPath: goalDocument.path, goalLookupBasis, goalDocumentSearchDirectory: searchDirectory, ...activity, lifecycle, ...(facts.nonBlocking ? { nonBlocking: facts.nonBlocking } : {}), ...orphanVisitField });
|
|
2084
2505
|
}
|
|
2085
2506
|
}
|
|
2086
2507
|
entries.sort((left, right) => left.runId.localeCompare(right.runId));
|
|
@@ -2098,7 +2519,7 @@ export function queryUnfinishedRunLedgers(options: UnfinishedRunLedgerQueryOptio
|
|
|
2098
2519
|
ms: Date.now() - startedAt,
|
|
2099
2520
|
});
|
|
2100
2521
|
if (options.path === undefined) {
|
|
2101
|
-
return { entries, ledgerDirectory: dir, goalsDirectory: goalsDir, unreadableLedgerCount, ledgerDirectoryMissing: false, terminalByTrailingRunStatus, cacheHits, cacheMisses, indexHits, indexOrigin, scope: 'self-implement-run-ledger', note: UNFINISHED_RUN_LEDGER_NOTE };
|
|
2522
|
+
return { entries, ledgerDirectory: dir, goalsDirectory: goalsDir, unreadableLedgerCount, orphanUnitVisitCount, ledgerDirectoryMissing: false, terminalByTrailingRunStatus, cacheHits, cacheMisses, indexHits, indexOrigin, scope: 'self-implement-run-ledger', note: UNFINISHED_RUN_LEDGER_NOTE };
|
|
2102
2523
|
}
|
|
2103
2524
|
const pathFilter = options.path;
|
|
2104
2525
|
const unknownPathStatus = (entry: UnfinishedRunLedgerEntry): boolean => entry.plannedPathStatus !== 'found-ledger-goal-file'
|
|
@@ -2114,6 +2535,7 @@ export function queryUnfinishedRunLedgers(options: UnfinishedRunLedgerQueryOptio
|
|
|
2114
2535
|
ledgerDirectory: dir,
|
|
2115
2536
|
goalsDirectory: goalsDir,
|
|
2116
2537
|
unreadableLedgerCount,
|
|
2538
|
+
orphanUnitVisitCount,
|
|
2117
2539
|
ledgerDirectoryMissing: false,
|
|
2118
2540
|
terminalByTrailingRunStatus,
|
|
2119
2541
|
cacheHits,
|
|
@@ -15,7 +15,7 @@ import type { PodChildEvidence } from '../task-orchestrator/surfaces/self-implem
|
|
|
15
15
|
|
|
16
16
|
/** 닫힌 목록 — 못 고르면 `unclassified`. */
|
|
17
17
|
export const RUN_STOP_CLASSES = [
|
|
18
|
-
'env-unrelated', 'main-sync', 'pod-died', 'review-repeat',
|
|
18
|
+
'env-unrelated', 'main-sync', 'pod-died', 'pod-vanished', 'review-repeat',
|
|
19
19
|
'review-out-of-scope', 'scope-escape', 'evidence-uncovered', 'fabric', 'launch-failed', 'gate-failed', 'unclassified',
|
|
20
20
|
] as const;
|
|
21
21
|
export type RunStopClass = typeof RUN_STOP_CLASSES[number];
|
|
@@ -246,6 +246,8 @@ export interface RunningRunsLedgerObservation {
|
|
|
246
246
|
|
|
247
247
|
export interface RunningRunsQueryObservation {
|
|
248
248
|
readonly caller?: string | null;
|
|
249
|
+
/** ID 조회(src/index.ts `self running-runs [runId]`가 넘겨준 runIds)가 요청한 runId 들 — 전체 관측 질의에는 이 키가 없다. */
|
|
250
|
+
readonly requestedRunIds?: readonly string[];
|
|
249
251
|
readonly cacheHits?: number;
|
|
250
252
|
readonly cacheMisses?: number;
|
|
251
253
|
readonly elapsedMs: number;
|
|
@@ -478,6 +480,9 @@ export function queryRunningRuns(options: { includeTest?: boolean; runIds?: read
|
|
|
478
480
|
const processStartTime = deps.processStartedAt ?? processStartedAt;
|
|
479
481
|
const observeQuery = deps.observeQuery ?? ((observation: RunningRunsQueryObservation) => debug.log('self-implement.running-runs', 'query', observation));
|
|
480
482
|
const startedAt = Date.now();
|
|
483
|
+
// ID 조회 배선 — src/index.ts의 `self running-runs [runId]` 액션이 넘겨준 options.runIds 를 이 조회가 소비한다:
|
|
484
|
+
// 정의된 runIds 는 연합 원장 질의 전달·엔트리·pty 관측을 모두 그 runId 들로 한정한다.
|
|
485
|
+
const requestedRunIdSet = options.runIds === undefined ? undefined : new Set(options.runIds);
|
|
481
486
|
let ledgerDirectoryCollectionElapsedMs = 0;
|
|
482
487
|
let ledgerReadElapsedMs = 0;
|
|
483
488
|
let screenProcessReadElapsedMs = 0;
|
|
@@ -521,7 +526,15 @@ export function queryRunningRuns(options: { includeTest?: boolean; runIds?: read
|
|
|
521
526
|
} finally {
|
|
522
527
|
screenProcessReadElapsedMs = Date.now() - screenProcessReadStartedAt;
|
|
523
528
|
}
|
|
524
|
-
|
|
529
|
+
// ID 조회 소비 지점 — deps·원장 질의가 runIds를 무시하고 넓게 관측해도 결과를 요청한 runId들로 한정하고,
|
|
530
|
+
// 일치하는 런이 없으면 entries는 []다(부분 관측 계수는 원장·pty 판독성 관측을 그대로 보존한다).
|
|
531
|
+
const scopedLedgerEntries = requestedRunIdSet === undefined
|
|
532
|
+
? ledger.entries
|
|
533
|
+
: ledger.entries.filter((entry) => requestedRunIdSet.has(entry.runId));
|
|
534
|
+
const scopedPty = requestedRunIdSet === undefined
|
|
535
|
+
? pty
|
|
536
|
+
: { ...pty, refs: pty.refs.filter((ref) => typeof ref.runId === 'string' && requestedRunIdSet.has(ref.runId)) };
|
|
537
|
+
const runIds = [...new Set([...scopedLedgerEntries.map((entry) => entry.runId), ...scopedPty.refs.flatMap((ref) => ref.runId ? [ref.runId] : [])])];
|
|
525
538
|
let observedPhases: ObservedRunPhases = { events: [], targetCount: 0, unreadableTargets: [] };
|
|
526
539
|
const stageStoreReadStartedAt = Date.now();
|
|
527
540
|
try {
|
|
@@ -534,7 +547,7 @@ export function queryRunningRuns(options: { includeTest?: boolean; runIds?: read
|
|
|
534
547
|
discardedNonStageEventCount = observedPhases.discardedNonStageEventCount ?? 0;
|
|
535
548
|
}
|
|
536
549
|
const phaseObservation = phaseObservationFor(observedPhases);
|
|
537
|
-
const result = assessRunningRuns(
|
|
550
|
+
const result = assessRunningRuns(scopedLedgerEntries, scopedPty, ledger, observedPhases.events, phaseObservation);
|
|
538
551
|
const unreadable: UnreadableRunningRunsLedger[] = [...(result.unreadable ?? [])].filter((entry) => entry.reason === 'unreadable-ledger');
|
|
539
552
|
const failedDirectories = hasUnreadableLedgerObservation(ledger)
|
|
540
553
|
? collectedLedgerDirectories.filter((dir) => !ledger.ledgerDirectories.includes(dir))
|
|
@@ -571,7 +584,7 @@ export function queryRunningRuns(options: { includeTest?: boolean; runIds?: read
|
|
|
571
584
|
let lingeringLaunchParents: LingeringLaunchParentAssessment;
|
|
572
585
|
try {
|
|
573
586
|
lingeringLaunchParents = assessLingeringLaunchParents(
|
|
574
|
-
|
|
587
|
+
scopedLedgerEntries, loadRun, isProcessAlive, processStartTime, ledger,
|
|
575
588
|
);
|
|
576
589
|
} finally {
|
|
577
590
|
launchParentClassificationElapsedMs = Date.now() - launchParentClassificationStartedAt;
|
|
@@ -581,6 +594,7 @@ export function queryRunningRuns(options: { includeTest?: boolean; runIds?: read
|
|
|
581
594
|
try {
|
|
582
595
|
observeQuery({
|
|
583
596
|
caller: options.caller ?? null,
|
|
597
|
+
...(options.runIds === undefined ? {} : { requestedRunIds: options.runIds }),
|
|
584
598
|
cacheHits,
|
|
585
599
|
cacheMisses,
|
|
586
600
|
elapsedMs: Date.now() - startedAt,
|