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
|
@@ -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';
|
|
@@ -109,6 +109,7 @@ import { getUserConfig } from '../user-config.js';
|
|
|
109
109
|
import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
|
|
110
110
|
import { classifyMergeHoldStop, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
111
111
|
import { autohealFromStop, parseAutohealMode, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
|
|
112
|
+
import { recordParentNeedsOwnerVisit } from './doctor-visit.js';
|
|
112
113
|
import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
|
|
113
114
|
import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
|
|
114
115
|
import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
@@ -217,7 +218,7 @@ function onePrChecklistLine(body: string): string {
|
|
|
217
218
|
}
|
|
218
219
|
import { renderRoundSummaryCard, type RoundSummaryEntry } from './round-summary-card.js';
|
|
219
220
|
import { computeFlexSignals } from './flex-signals.js';
|
|
220
|
-
import { resolveAdaptiveMaxReworkDecision, resolveEscalateTier, resolveEscalateTarget, buildReworkFeature, failIndicator, isRepeatedUnverifiedOnlyGateFailure, unverifiedRepeatKey, appendReworkHistory, truncateReworkHistoryByItem, applyReworkBudgetDecision, parseContractConflictRelaxation, parseReworkBudgetDecision, resolveReworkBudgetCarry, stripReworkBudgetHeaders, countConsecutiveMustFixIds, mergeReworkNotes, resolveReworkKind, type ReworkPlanRevision, type ReworkNotePart } from './rework-policy.js';
|
|
221
|
+
import { resolveAdaptiveMaxReworkDecision, resolveEscalateTier, resolveEscalateTarget, buildReworkFeature, failIndicator, isRepeatedUnverifiedOnlyGateFailure, unverifiedRepeatKey, appendReworkHistory, truncateReworkHistoryByItem, applyReworkBudgetDecision, parseContractConflictRelaxation, parseReworkBudgetDecision, resolveReworkBudgetCarry, stripReworkBudgetHeaders, countConsecutiveMustFixIds, mergeReworkNotes, resolveReworkKind, decideReviewRound, type ReviewRoundDecision, type ReworkPlanRevision, type ReworkNotePart } from './rework-policy.js';
|
|
221
222
|
import type { SupervisionReworkSource } from './supervision-vocabulary.js';
|
|
222
223
|
import { classifyReworkBudgetShadow } from './classify-shadow.js';
|
|
223
224
|
import { createReworkBudgetJudgment, REWORK_BUDGET_JUDGMENT, reworkBudgetEvidenceForObservation, reworkBudgetWorkflow } from './rework-budget-judgment.js';
|
|
@@ -225,7 +226,7 @@ import { formatGateFailedId, type PremiseReviewCard, type PremiseReviewInput } f
|
|
|
225
226
|
import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
|
|
226
227
|
import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
|
|
227
228
|
import { resolveRunOutcome } from './run-outcome.js';
|
|
228
|
-
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';
|
|
229
230
|
import { resolveEvidenceHeadCommit } from './evidence-command-budget.js';
|
|
230
231
|
import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
|
|
231
232
|
import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
|
|
@@ -301,6 +302,7 @@ import { hasModuleLoadFailure, type GateTestFailure } from './gate-baseline.js';
|
|
|
301
302
|
import { commitWorktree, defaultBranchRef, preservationHasChanges } from './seams.js';
|
|
302
303
|
import { detectUncommittedWork } from './uncommitted-work.js';
|
|
303
304
|
import { execFile as execFileCallback, spawnSync } from 'node:child_process';
|
|
305
|
+
import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
|
|
304
306
|
import { promisify } from 'node:util';
|
|
305
307
|
import { blockedDraftDisposition, blockedDraftTargetFor, decideDraftOnStop, nextMoveFor, parseDraftOnStopMode, repairSalvageLinkComment, salvageBranchForRun, syntheticRepairBasePr, type DraftOnStopMode } from './blocked-draft-policy.js';
|
|
306
308
|
import { formatLlmMergeOutcome } from '../autopilot/build/llm-conflict-merge.js';
|
|
@@ -336,6 +338,7 @@ import {
|
|
|
336
338
|
export type { QuotaAccountAvailabilityEvidence };
|
|
337
339
|
import { decideReworkSalvage, type ReworkSalvageEvidence } from './rework-salvage.js';
|
|
338
340
|
import { type SupervisorGoalFillEvidence, fillUnverifiableGoalSlots, type SupervisorGoalFillResult } from './goal-supervisor-fill.js';
|
|
341
|
+
import { repairNextMove } from '../task-agent/repair-next-move.js';
|
|
339
342
|
import { escalateGoalDocumentClarifications, recordSupervisorPlanRevision, type GoalClarificationEscalationResult, type SupervisorPlanRevisionRelaxation, type SupervisorPlanRevisionResult } from './goal-clarification-escalation.js';
|
|
340
343
|
import { parseGoalDocumentClarifications, selfAnswerGoalDocumentClarifications, type GoalClarificationSelfResolver } from './goal-author-clarification.js';
|
|
341
344
|
import {
|
|
@@ -1053,6 +1056,7 @@ export type ImplementTerminalStatus = {
|
|
|
1053
1056
|
export interface SelfImplementSeams {
|
|
1054
1057
|
/** Run-observer ledger sink. Tests inject an in-memory sink to avoid touching user state. */
|
|
1055
1058
|
writeRunLedger?: RunLedgerWriter;
|
|
1059
|
+
checkUnwiredExports?: typeof findUnwiredExports;
|
|
1056
1060
|
/** STOP-AUTOHEAL — heal action seams (live mode only runs actions given here; missing = needs-owner). */
|
|
1057
1061
|
stopAutohealActions?: AutohealActions;
|
|
1058
1062
|
/** STOP-AUTOHEAL — one-attempt guard reader. Default: real run ledger, or none when `writeRunLedger` is injected. */
|
|
@@ -1103,6 +1107,8 @@ export interface SelfImplementSeams {
|
|
|
1103
1107
|
synthesizeGoalContext?: (input: { goalFile?: string }) => Promise<Pick<import('../harness/harness-worktree-add.js').HarnessWorktreeGoalMetadata, 'goalTitle' | 'goalDescription' | 'goalDescriptionSource'>>;
|
|
1104
1108
|
createWorktree: (opts: { branch: string; base?: string; runId?: string } & import('../harness/harness-worktree-add.js').HarnessWorktreeGoalMetadata) => Promise<{
|
|
1105
1109
|
path: string; branch: string;
|
|
1110
|
+
/** A single-use Pod may implement in its already checked-out source tree. */
|
|
1111
|
+
inPlace?: boolean;
|
|
1106
1112
|
/** Strict provenance values are returned only after their recording succeeds. */
|
|
1107
1113
|
owner?: string;
|
|
1108
1114
|
command?: string;
|
|
@@ -1229,6 +1235,8 @@ export interface SelfImplementSeams {
|
|
|
1229
1235
|
editPrComment?: (opts: { id: number; body: string; cwd: string }) => Promise<void>;
|
|
1230
1236
|
addPrLabel?: (opts: { number: number; label: string; cwd: string }) => Promise<void>;
|
|
1231
1237
|
readPrFiles?: (opts: { number: number; cwd: string; base?: string }) => Promise<string[]>;
|
|
1238
|
+
/** Read the authoritative GitHub head branch and creation timestamp before run attribution. */
|
|
1239
|
+
readPrAttribution?: (opts: { number: number; cwd: string }) => Promise<{ headRefName: string; createdAt: string }>;
|
|
1232
1240
|
/** PR의 base/head SHA와 관측된 PR base를 한 응답에서 고정한다. 미주입·실패·빈 SHA면 검사 대상을 증명할 수 없어 fail-closed로 PR을 열어 둔다. */
|
|
1233
1241
|
readPrCommitShas?: (opts: { number: number; cwd: string }) => Promise<{ baseCommit: string; headCommit: string; baseRefName?: string }>;
|
|
1234
1242
|
/** 고정한 base/head SHA 쌍의 unified diff. 가변 PR 조회를 다시 사용하면 ABA head 변경에 안전하지 않으므로 두 SHA는 필수 입력이다. */
|
|
@@ -2349,6 +2357,8 @@ export interface SelfImplementResult {
|
|
|
2349
2357
|
walk?: readonly { node: string; round: number }[];
|
|
2350
2358
|
/** Canonical run-identity join key; always present because resolveRunIdentity always mints or inherits one. */
|
|
2351
2359
|
runId: string;
|
|
2360
|
+
/** Parent-observed goal-plan revision attempt evidence; omitted when no ledger evidence was read. */
|
|
2361
|
+
goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
|
|
2352
2362
|
ok: boolean;
|
|
2353
2363
|
stage: SelfImplementStage;
|
|
2354
2364
|
/** Verbatim must-fix findings retained on a review-blocked terminal result. */
|
|
@@ -3323,7 +3333,12 @@ async function runPostMergeCleanup(
|
|
|
3323
3333
|
goalFile: string | undefined,
|
|
3324
3334
|
remoteBranch: string | undefined,
|
|
3325
3335
|
observe: (event: string, data: Record<string, unknown>) => void,
|
|
3336
|
+
inPlace = false,
|
|
3326
3337
|
): Promise<void> {
|
|
3338
|
+
if (inPlace) {
|
|
3339
|
+
observe('post-merge-cleanup-preserved', { worktreePath, branch, reason: 'pod-inplace-source' });
|
|
3340
|
+
return;
|
|
3341
|
+
}
|
|
3327
3342
|
if (!cleanup?.enabled) {
|
|
3328
3343
|
observe('post-merge-cleanup-preserved', { worktreePath, branch, reason: cleanup ? 'disabled' : 'not-configured' });
|
|
3329
3344
|
return;
|
|
@@ -3560,6 +3575,17 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
|
|
|
3560
3575
|
...(loadLedger ? { loadLedger } : {}),
|
|
3561
3576
|
...(s?.writeRunLedger ? { writeLedger: s.writeRunLedger } : {}),
|
|
3562
3577
|
});
|
|
3578
|
+
if (result.action === 'needs-owner') {
|
|
3579
|
+
try {
|
|
3580
|
+
const stopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
|
|
3581
|
+
const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey, evidence: result.reason ?? record.cause });
|
|
3582
|
+
if (visit.status === 'missing-ledger') {
|
|
3583
|
+
debug.log('run-doctor', 'visit-failed', { runId: stopEntry.runId, from: 'parent', symptom: 'needs-owner', error: 'run-ledger-missing' });
|
|
3584
|
+
}
|
|
3585
|
+
} catch (error) {
|
|
3586
|
+
try { debug.log('run-doctor', 'visit-failed', { runId: stopEntry.runId, from: 'parent', symptom: 'needs-owner', error: error instanceof Error ? error.message : String(error) }); } catch { /* fail-soft */ }
|
|
3587
|
+
}
|
|
3588
|
+
}
|
|
3563
3589
|
s?.onStopAutoheal?.(result);
|
|
3564
3590
|
} catch (error) {
|
|
3565
3591
|
try { debug.log('self-implement.autoheal', 'dispatch-failed', { runId: stopEntry.runId, error: error instanceof Error ? error.message : String(error) }); } catch { /* fail-soft */ }
|
|
@@ -3813,6 +3839,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3813
3839
|
reworkCapProceed = false;
|
|
3814
3840
|
const progressDelivery = { delivered: 0, unwired: 0, callbackFailed: 0 };
|
|
3815
3841
|
let capturedPrNumber: number | undefined;
|
|
3842
|
+
let prAttributionMismatch = false;
|
|
3816
3843
|
let openPrInvoked = false;
|
|
3817
3844
|
const defaultProviderName = opts.seams.currentProviderName?.() ?? currentProviderName();
|
|
3818
3845
|
const runProviderName = opts.childLlm?.provider ?? defaultProviderName;
|
|
@@ -3831,8 +3858,6 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3831
3858
|
openPrInvoked = true;
|
|
3832
3859
|
const pr = await opts.seams.openPr(args);
|
|
3833
3860
|
if (pr.rebind) debug.log('self-implement.same-cell', 'rebind-result', pr.rebind);
|
|
3834
|
-
const number = recordedPrNumber(pr.number);
|
|
3835
|
-
if (number !== undefined) capturedPrNumber = number;
|
|
3836
3861
|
return pr;
|
|
3837
3862
|
},
|
|
3838
3863
|
onProgress: (event) => {
|
|
@@ -4266,6 +4291,9 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4266
4291
|
hasCurrentCredentialFailure,
|
|
4267
4292
|
(commit: string | undefined) => { finishedImplementationAtMainSync = true; preSyncCommit = commit; },
|
|
4268
4293
|
preserveMergeHarvest,
|
|
4294
|
+
startedAtMs,
|
|
4295
|
+
(number) => { capturedPrNumber = number; },
|
|
4296
|
+
() => { prAttributionMismatch = true; },
|
|
4269
4297
|
);
|
|
4270
4298
|
terminalNode = result.node;
|
|
4271
4299
|
await mergeChildProviderErrors();
|
|
@@ -4310,6 +4338,22 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4310
4338
|
// ⛔ 이 스코프엔 `progress` 헬퍼가 «없다»(3695행 · 다른 스코프) — seam 을 직접 쓴다.
|
|
4311
4339
|
progress: (stage, message) => { try { opts.seams.onProgress?.({ stage, message }); } catch { /* best-effort */ } },
|
|
4312
4340
|
});
|
|
4341
|
+
if (addressedResult.abandonedClassification?.classification === 'report-deficit') {
|
|
4342
|
+
const classification = addressedResult.abandonedClassification;
|
|
4343
|
+
const basis = classification.classificationBasis;
|
|
4344
|
+
const kind = basis === 'terminal-state-not-reviewed' || basis === 'review-result-observation-unmeasured'
|
|
4345
|
+
? 'unmeasured' as const : 'unverified' as const;
|
|
4346
|
+
const previousEvidence = JSON.stringify({ classification, stage: addressedResult.stage,
|
|
4347
|
+
review: addressedResult.review ?? null, gate: addressedResult.gate ?? null });
|
|
4348
|
+
const deficit = { evidenceId: `report:${runId}:${basis}`, kind, previousEvidence, round: roundCount };
|
|
4349
|
+
observeOuter('supervisor-report-deficit', { ...deficit, supervisorResult: 'unverifiable', classification });
|
|
4350
|
+
if (deficit.kind !== 'unverified') {
|
|
4351
|
+
const move = repairNextMove({ supervisorDeficit: deficit, supervisorResult: 'unverifiable' });
|
|
4352
|
+
if (move.kind === 'grounding') observeOuter('repair-next-move-input', {
|
|
4353
|
+
...move.supervisorDeficit, supervisorResult: 'unverifiable', action: move.action, classification,
|
|
4354
|
+
});
|
|
4355
|
+
}
|
|
4356
|
+
}
|
|
4313
4357
|
observeRunOutcome(observeOuter, {
|
|
4314
4358
|
node: addressedResult.node,
|
|
4315
4359
|
stage: addressedResult.stage,
|
|
@@ -4347,7 +4391,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4347
4391
|
...terminalDetail(addressedResult.sessionId),
|
|
4348
4392
|
},
|
|
4349
4393
|
});
|
|
4350
|
-
observeRunRollup(observeOuter, addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
|
|
4394
|
+
observeRunRollup(observeOuter, prAttributionMismatch ? { ...addressedResult, prNumber: undefined } : addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
|
|
4351
4395
|
observeProgressDelivery();
|
|
4352
4396
|
return terminalResult;
|
|
4353
4397
|
} catch (e) {
|
|
@@ -4422,7 +4466,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4422
4466
|
...terminalDetail(addressedResult.sessionId ?? terminalSessionId),
|
|
4423
4467
|
},
|
|
4424
4468
|
});
|
|
4425
|
-
observeRunRollup(observeOuter, addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
|
|
4469
|
+
observeRunRollup(observeOuter, prAttributionMismatch ? { ...addressedResult, prNumber: undefined } : addressedResult, roundClassifications, roundCount, capturedPrNumber, openPrInvoked);
|
|
4426
4470
|
observeProgressDelivery();
|
|
4427
4471
|
return terminalResult;
|
|
4428
4472
|
}
|
|
@@ -4841,6 +4885,25 @@ function recordedPrNumber(value: unknown): number | undefined {
|
|
|
4841
4885
|
return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 ? value : undefined;
|
|
4842
4886
|
}
|
|
4843
4887
|
|
|
4888
|
+
/** GitHub's second-precision createdAt cannot distinguish events within that second. */
|
|
4889
|
+
export function prCreatedInRunWindow(createdAt: string, startedAtMs: number): boolean {
|
|
4890
|
+
const createdAtMs = Date.parse(createdAt);
|
|
4891
|
+
if (!Number.isFinite(createdAtMs) || !Number.isFinite(startedAtMs)) return false;
|
|
4892
|
+
const secondPrecision = !/\.\d+(?:Z|[+-]\d\d:\d\d)$/.test(createdAt);
|
|
4893
|
+
return createdAtMs >= (secondPrecision ? Math.floor(startedAtMs / 1_000) * 1_000 : startedAtMs);
|
|
4894
|
+
}
|
|
4895
|
+
|
|
4896
|
+
function prAttributedToRun(
|
|
4897
|
+
attribution: { headRefName: string; createdAt: string }, branch: string, startedAtMs: number,
|
|
4898
|
+
boundCardReuse: { headRefName: string } | undefined,
|
|
4899
|
+
): boolean {
|
|
4900
|
+
if (attribution.headRefName !== (boundCardReuse?.headRefName ?? branch)) return false;
|
|
4901
|
+
// A verified same-card PR predates this run. The production seam exposes the
|
|
4902
|
+
// exception only after the manager verifies card, PR identity, and leased push.
|
|
4903
|
+
return prCreatedInRunWindow(attribution.createdAt, startedAtMs)
|
|
4904
|
+
|| (!!boundCardReuse && Number.isFinite(Date.parse(attribution.createdAt)));
|
|
4905
|
+
}
|
|
4906
|
+
|
|
4844
4907
|
function rollupPrNumber(
|
|
4845
4908
|
result: Pick<SelfImplementResult, 'prNumber'>,
|
|
4846
4909
|
capturedPrNumber: number | undefined,
|
|
@@ -4936,6 +4999,9 @@ async function runSelfImplementInner(
|
|
|
4936
4999
|
hasCurrentCredentialFailure: () => boolean = hasCredentialFailure,
|
|
4937
5000
|
onMainSyncStarted: (commit: string | undefined) => void = () => {},
|
|
4938
5001
|
preserveMergeHarvest: (reason: string, inputChars?: number) => Promise<boolean> = async () => false,
|
|
5002
|
+
startedAtMs = Date.now(),
|
|
5003
|
+
onPrAttributed: (number: number) => void = () => {},
|
|
5004
|
+
onPrAttributionMismatch: () => void = () => {},
|
|
4939
5005
|
): Promise<Omit<SelfImplementResult, 'runId'>> {
|
|
4940
5006
|
const s = opts.seams;
|
|
4941
5007
|
const pipelineStartedAtMs = Date.now();
|
|
@@ -5125,14 +5191,22 @@ async function runSelfImplementInner(
|
|
|
5125
5191
|
: opts.goalFile
|
|
5126
5192
|
? 'authored-goal-file'
|
|
5127
5193
|
: 'no-goal-file';
|
|
5128
|
-
let activeProvider:
|
|
5129
|
-
provider: 'unknown'; model: 'unknown'; auth: 'unknown';
|
|
5130
|
-
};
|
|
5194
|
+
let activeProvider: { provider: string; model: string; auth: string };
|
|
5131
5195
|
try {
|
|
5132
5196
|
activeProvider = (s.inspectActiveProvider ?? inspectActiveProvider)();
|
|
5133
5197
|
} catch {
|
|
5134
5198
|
activeProvider = { provider: 'unknown', model: 'unknown', auth: 'unknown' };
|
|
5135
5199
|
}
|
|
5200
|
+
const configuredProvider = activeProvider;
|
|
5201
|
+
if (opts.childLlm) {
|
|
5202
|
+
// The configured parent model can be sol while this run's implementation child is
|
|
5203
|
+
// explicitly luna. Attribute the run to the model actually passed to implement.
|
|
5204
|
+
activeProvider = {
|
|
5205
|
+
provider: opts.childLlm.provider,
|
|
5206
|
+
model: opts.childLlm.model,
|
|
5207
|
+
auth: configuredProvider.provider?.replace(/^auto:/, '') === opts.childLlm.provider ? configuredProvider.auth : 'unknown',
|
|
5208
|
+
};
|
|
5209
|
+
}
|
|
5136
5210
|
// ⭐ 관측 이벤트와 «같은 값»을 원장으로도 보낸다 — 로그에만 있으면 원장 질의가 못 센다(`F12`).
|
|
5137
5211
|
try { onActiveProvider(activeProvider); } catch { /* 보조 기록이 런을 죽이지 않는다 */ }
|
|
5138
5212
|
const boundedFeature = boundReadableText(opts.feature, RUN_START_FEATURE_MAX_CHARS);
|
|
@@ -5146,6 +5220,7 @@ async function runSelfImplementInner(
|
|
|
5146
5220
|
nestDepth: nestInfo().depth, goalSource, goalFile: opts.goalFile === undefined ? null : resolve(launchCwd, opts.goalFile),
|
|
5147
5221
|
targetRoot: gitRootOf(launchCwd) ?? launchCwd, ...originObservationFields(),
|
|
5148
5222
|
provider: activeProvider.provider ?? null, model: activeProvider.model ?? null, auth: activeProvider.auth ?? null,
|
|
5223
|
+
...(opts.childLlm ? { configuredProvider: configuredProvider.provider ?? null, configuredModel: configuredProvider.model ?? null, modelSelectionSource: 'child' } : {}),
|
|
5149
5224
|
...(opts.correlationId !== undefined ? { correlationId: opts.correlationId } : {}),
|
|
5150
5225
|
});
|
|
5151
5226
|
try {
|
|
@@ -5220,6 +5295,7 @@ async function runSelfImplementInner(
|
|
|
5220
5295
|
observe('worktree', {
|
|
5221
5296
|
path: wt.path,
|
|
5222
5297
|
branch: wt.branch,
|
|
5298
|
+
inPlace: wt.inPlace === true,
|
|
5223
5299
|
terminalLaunchHead: terminalLaunchHead ?? null,
|
|
5224
5300
|
terminalLaunchDirtyPaths: terminalLaunchDirtyPaths ? [...terminalLaunchDirtyPaths] : null,
|
|
5225
5301
|
// ⭐ 우리가 **무엇을 요청했는지는 이미 안다** — 시임 반환에서 되읽지 않는다.
|
|
@@ -5240,7 +5316,7 @@ async function runSelfImplementInner(
|
|
|
5240
5316
|
// ⛔ 발사 부모(`harness ask`·`dev`)에는 ELANOUS_HARNESS_SPACE_ID 가 «없다» — 그 env 는 자식에게만 심긴다.
|
|
5241
5317
|
// 그래서 getHarnessSpace() 만 보면 운영에서 늘 undefined 이고 정지 확인이 «한 번도» 안 돈다(#20040 착지 직후 실측).
|
|
5242
5318
|
// `self send <space> --stop` 이 겨냥하는 것은 자식의 공간 = 워크트리 이름이다(아래 activeChildInboxId 와 같은 식 · dev-cli.ts recordRestart 폴백과 같다).
|
|
5243
|
-
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;
|
|
5244
5320
|
if (parentSoftStopSpaceId) {
|
|
5245
5321
|
try { s.onSoftStopSpaceReady?.(parentSoftStopSpaceId); } catch { /* UI registration must not break execution */ }
|
|
5246
5322
|
}
|
|
@@ -5391,7 +5467,11 @@ async function runSelfImplementInner(
|
|
|
5391
5467
|
// The repository copy travels with both local and Pod worktrees. Operational HQ ledgers are never read here.
|
|
5392
5468
|
const knowhow = selectKnowhowPack(wt.path, opts.feature);
|
|
5393
5469
|
if (knowhow.text) round0Feature = `${knowhow.text}\n\n${round0Feature}`;
|
|
5394
|
-
|
|
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 });
|
|
5395
5475
|
|
|
5396
5476
|
// E1 착수 구체화(RFC-progressive-goal-elaboration §2 E1 · §7 간선 ①) — 고정 층(KPI·판정 신호)은 그대로, 카드만 덧붙인다.
|
|
5397
5477
|
const elaboration = await (await import('./goal-elaborate.js')).runArrivalElaboration({ goal: opts.feature, prompt: round0Feature, cwd: wt.path, callLLM: s.elaborateCallLLM, observe });
|
|
@@ -5457,7 +5537,7 @@ async function runSelfImplementInner(
|
|
|
5457
5537
|
readonly update?: (delivery: SupervisorDeliveryState, reason?: string) => void;
|
|
5458
5538
|
};
|
|
5459
5539
|
let supervisorDeliveryUpdates: PendingSupervisorDelivery[] = [];
|
|
5460
|
-
const activeChildInboxId = normalizeSpaceId(basename(wt.path));
|
|
5540
|
+
const activeChildInboxId = normalizeSpaceId(wt.inPlace ? runId : basename(wt.path));
|
|
5461
5541
|
const undeliveredSupervisorInputs: UndeliveredSupervisorInput[] = [];
|
|
5462
5542
|
const recordUndeliveredSupervisorInput = (text: string, reason: string): void => {
|
|
5463
5543
|
undeliveredSupervisorInputs.push({ text, reason });
|
|
@@ -6242,7 +6322,7 @@ async function runSelfImplementInner(
|
|
|
6242
6322
|
return preserveReviewBlockedBranch(`review-blocked 작업 커밋 실패: ${commitError}`, false, `; 미커밋 작업은 worktree 에 남음: ${wt.path}`);
|
|
6243
6323
|
}
|
|
6244
6324
|
}
|
|
6245
|
-
let pr:
|
|
6325
|
+
let pr: OpenPrOutcome;
|
|
6246
6326
|
try {
|
|
6247
6327
|
pr = await withStepTimeout(s.openPr({
|
|
6248
6328
|
title: prTitle(opts.feature, opts.goalFile),
|
|
@@ -6293,9 +6373,48 @@ async function runSelfImplementInner(
|
|
|
6293
6373
|
: `중단 산출물의 draft PR 생성 실패(worktree·branch 보존 · 판정 본문 보존 실패: ${artifactError ?? 'unknown error'})`);
|
|
6294
6374
|
return undefined;
|
|
6295
6375
|
}
|
|
6296
|
-
|
|
6297
|
-
|
|
6298
|
-
|
|
6376
|
+
let draftAttribution: { headRefName: string; createdAt: string } | undefined;
|
|
6377
|
+
let draftAttributionReadError: string | undefined;
|
|
6378
|
+
try {
|
|
6379
|
+
if (s.readPrAttribution) {
|
|
6380
|
+
draftAttribution = await s.readPrAttribution({ number: pr.number, cwd: wt.path });
|
|
6381
|
+
} else {
|
|
6382
|
+
const viewed = spawnSync('gh', ['pr', 'view', String(pr.number), '--json', 'headRefName,createdAt'], { cwd: wt.path, encoding: 'utf8', timeout: 30_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
|
|
6383
|
+
if (viewed.status !== 0) throw new Error('gh pr view failed');
|
|
6384
|
+
const parsed = JSON.parse(viewed.stdout) as { headRefName?: unknown; createdAt?: unknown };
|
|
6385
|
+
if (typeof parsed.headRefName !== 'string' || typeof parsed.createdAt !== 'string') throw new Error('invalid PR attribution metadata');
|
|
6386
|
+
draftAttribution = { headRefName: parsed.headRefName, createdAt: parsed.createdAt };
|
|
6387
|
+
}
|
|
6388
|
+
} catch (error) { draftAttributionReadError = safeErrorDescription(error); }
|
|
6389
|
+
const expectedPrHead = pr.boundCardReuse?.headRefName ?? wt.branch;
|
|
6390
|
+
const draftAttributed = !draftAttributionReadError && !!draftAttribution
|
|
6391
|
+
&& prAttributedToRun(draftAttribution, wt.branch, startedAtMs, pr.boundCardReuse);
|
|
6392
|
+
if (draftAttributionReadError || !draftAttribution) {
|
|
6393
|
+
onPrAttributionMismatch();
|
|
6394
|
+
observe('pr-attribution-unverified', {
|
|
6395
|
+
expectedBranch: expectedPrHead,
|
|
6396
|
+
number: pr.number,
|
|
6397
|
+
url: pr.url,
|
|
6398
|
+
reason: draftAttributionReadError ?? 'metadata-absent',
|
|
6399
|
+
}, { level: 'warn' });
|
|
6400
|
+
} else if (draftAttributed) {
|
|
6401
|
+
onPrAttributed(pr.number);
|
|
6402
|
+
observe('pr-opened', { url: pr.url, number: pr.number, branch: expectedPrHead, draft: true });
|
|
6403
|
+
} else {
|
|
6404
|
+
onPrAttributionMismatch();
|
|
6405
|
+
observe('pr-attribution-mismatch', {
|
|
6406
|
+
expectedBranch: expectedPrHead,
|
|
6407
|
+
actualBranch: draftAttribution?.headRefName ?? null,
|
|
6408
|
+
createdAt: draftAttribution?.createdAt ?? null,
|
|
6409
|
+
number: pr.number,
|
|
6410
|
+
url: pr.url,
|
|
6411
|
+
}, { level: 'warn' });
|
|
6412
|
+
}
|
|
6413
|
+
if (!draftAttributed) {
|
|
6414
|
+
blockedDraftPrFailure = `draft PR 귀속 확인 실패; worktree·branch 보존: ${wt.branch} (${wt.path})`;
|
|
6415
|
+
progress('aborted', blockedDraftPrFailure);
|
|
6416
|
+
return undefined;
|
|
6417
|
+
}
|
|
6299
6418
|
observe('rework-blocked-draft-pr', {
|
|
6300
6419
|
...observation,
|
|
6301
6420
|
url: pr.url,
|
|
@@ -6513,6 +6632,19 @@ async function runSelfImplementInner(
|
|
|
6513
6632
|
return 'parked';
|
|
6514
6633
|
}
|
|
6515
6634
|
};
|
|
6635
|
+
let pendingReviewTriage: {
|
|
6636
|
+
round: number;
|
|
6637
|
+
verdict: 'fail';
|
|
6638
|
+
rawMustFix: string[];
|
|
6639
|
+
reflectedMustFix: string[];
|
|
6640
|
+
reflectionApplied: boolean;
|
|
6641
|
+
effectiveMax: number;
|
|
6642
|
+
} | undefined;
|
|
6643
|
+
const recordPendingReviewTriage = (decision: ReviewRoundDecision, nextNode: 'open-pr' | 'rework' | 'review-blocked', effectiveMax: number): void => {
|
|
6644
|
+
if (!pendingReviewTriage) return;
|
|
6645
|
+
observe('review-round-triage', { ...pendingReviewTriage, decision, nextNode, effectiveMax });
|
|
6646
|
+
pendingReviewTriage = undefined;
|
|
6647
|
+
};
|
|
6516
6648
|
for (;;) {
|
|
6517
6649
|
if (round > 0) {
|
|
6518
6650
|
const stoppedBeforeRework = honorParentSoftStop('rework');
|
|
@@ -6670,6 +6802,17 @@ async function runSelfImplementInner(
|
|
|
6670
6802
|
});
|
|
6671
6803
|
}
|
|
6672
6804
|
effectiveMax = budgetDecision.effectiveMax;
|
|
6805
|
+
if (pendingReviewTriage && budgetDecision.stop) {
|
|
6806
|
+
recordPendingReviewTriage('follow-up', budgetDecision.exit === 'proceed' ? 'open-pr' : 'review-blocked', effectiveMax);
|
|
6807
|
+
} else if (pendingReviewTriage && round <= effectiveMax) {
|
|
6808
|
+
const extendedDecision = decideReviewRound({
|
|
6809
|
+
verdict: pendingReviewTriage.verdict,
|
|
6810
|
+
mustFix: pendingReviewTriage.reflectedMustFix,
|
|
6811
|
+
round: pendingReviewTriage.round,
|
|
6812
|
+
effectiveMax,
|
|
6813
|
+
});
|
|
6814
|
+
if (extendedDecision === 'rework') recordPendingReviewTriage('rework', 'rework', effectiveMax);
|
|
6815
|
+
}
|
|
6673
6816
|
if (parsedDecision) {
|
|
6674
6817
|
if (diagnosisRefutations) {
|
|
6675
6818
|
const adjudications = parseSupervisorRefutationAdjudications(diagnosis, diagnosisRefutations.refutations);
|
|
@@ -6878,6 +7021,7 @@ async function runSelfImplementInner(
|
|
|
6878
7021
|
: 'UNCONVERGEABLE' as const;
|
|
6879
7022
|
const supervisorOutcome = { supervisorVerdict, ...(goalCauseObserved ? { goalCauseObserved: true as const } : {}) };
|
|
6880
7023
|
if (isReviewRework(reworkKind)) {
|
|
7024
|
+
recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
|
|
6881
7025
|
if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
|
|
6882
7026
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', verdict: parsedDecision.verdict, reason: parsedDecision.reason, gate, decomposition: terminalDecomposition, salvageStatusExpected: false });
|
|
6883
7027
|
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked', unresolvedMustFix: review?.mustFix, decompositionPieces: terminalDecomposition?.pieces?.map((p) => p.feature), feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
@@ -6909,6 +7053,7 @@ async function runSelfImplementInner(
|
|
|
6909
7053
|
const terminal = resolveRunOutcome({ termination: 'supervisor-abandoned', verdict: 'UNCONVERGEABLE', applied: true });
|
|
6910
7054
|
const reason = `rework judged unconvergeable after ${round - 1} rework round(s)`;
|
|
6911
7055
|
if (isReviewRework(reworkKind)) {
|
|
7056
|
+
recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
|
|
6912
7057
|
if (reflectRejectedAudit.length && review) review.shouldFix = [...review.shouldFix, ...reflectRejectedAudit];
|
|
6913
7058
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', verdict: lastReworkVerdict, reason, gate, salvageStatusExpected: false });
|
|
6914
7059
|
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked', unresolvedMustFix: review?.mustFix, feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
@@ -6952,6 +7097,7 @@ async function runSelfImplementInner(
|
|
|
6952
7097
|
);
|
|
6953
7098
|
podDecision(acceptance.decision.action === 'accept');
|
|
6954
7099
|
if (acceptance.decision.action === 'accept') {
|
|
7100
|
+
recordPendingReviewTriage('follow-up', 'open-pr', effectiveMax);
|
|
6955
7101
|
if (podReviewBlockedDraft) {
|
|
6956
7102
|
observe('merge-decision', {
|
|
6957
7103
|
autoMerge: autoMergeEnabled(opts), reviewed: review?.reviewed === true, verdict: review?.verdict ?? 'none',
|
|
@@ -6990,6 +7136,7 @@ async function runSelfImplementInner(
|
|
|
6990
7136
|
};
|
|
6991
7137
|
}
|
|
6992
7138
|
} else podDecision(false);
|
|
7139
|
+
recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
|
|
6993
7140
|
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', reason, gate, salvageStatusExpected: true });
|
|
6994
7141
|
const salvage = blockedDraftNoChanges || blockedDraftPrFailure ? 'parked' : await salvageHardCap(canSalvage, pr);
|
|
6995
7142
|
const disposition = { ...terminal, ...(salvage ? { salvage } : {}) };
|
|
@@ -7250,12 +7397,16 @@ async function runSelfImplementInner(
|
|
|
7250
7397
|
try { after = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff */ }
|
|
7251
7398
|
const targetDiff = after === undefined ? undefined : eligible(after);
|
|
7252
7399
|
const resultLine = /(?:^|\n)\s*RESULT:\s*\S/m.test(impl.evidenceTranscript ?? impl.summary);
|
|
7253
|
-
|
|
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;
|
|
7254
7404
|
goalOnlyReworkExhausted = !succeeded;
|
|
7255
7405
|
observe('implementation-goal-only-rework', {
|
|
7256
7406
|
status: succeeded ? 'succeeded' : 'exhausted', round: retryRound, targets,
|
|
7257
7407
|
firstToolCalls, retryToolCalls: impl.toolCalls ?? null,
|
|
7258
7408
|
targetDiffCount: targetDiff?.length ?? null, diffMeasured: after !== undefined, resultLine,
|
|
7409
|
+
...(succeeded ? { evidenceBasis: resultLine ? 'result-and-target-diff' : 'declared-target-diff' } : {}),
|
|
7259
7410
|
}, succeeded ? {} : { level: 'warn' });
|
|
7260
7411
|
if (!succeeded) impl = { ...impl, ok: false, summary: `goal-only-rework-exhausted: ${impl.summary}` };
|
|
7261
7412
|
round = retryRound;
|
|
@@ -7349,7 +7500,7 @@ async function runSelfImplementInner(
|
|
|
7349
7500
|
env.GIT_COMMITTER_NAME = childName;
|
|
7350
7501
|
env.GIT_COMMITTER_EMAIL = childEmail;
|
|
7351
7502
|
const git = (args: string[]) => spawnSync('git', ['--no-optional-locks', ...args], {
|
|
7352
|
-
cwd, env, encoding: 'utf8', timeout: 20_000,
|
|
7503
|
+
cwd, env, encoding: 'utf8', timeout: 20_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER,
|
|
7353
7504
|
});
|
|
7354
7505
|
const staged = git(['add', '-A', '--', ...paths]);
|
|
7355
7506
|
if (staged.status !== 0) return { ok: false, out: staged.stderr || staged.stdout || staged.error?.message || 'git add failed' };
|
|
@@ -7413,6 +7564,7 @@ async function runSelfImplementInner(
|
|
|
7413
7564
|
catch { /* observation is fail-soft */ }
|
|
7414
7565
|
}
|
|
7415
7566
|
const evidenceChecks = runBudgetedEvidenceChecks(roundGoal, wt.path, runId, evidenceHead);
|
|
7567
|
+
const authoredSignal = authoredSignalExecution(roundGoal, evidenceChecks);
|
|
7416
7568
|
const tagCoverage = coverRequiredEvidence(requiredEvidence, offDiffEvidence.items);
|
|
7417
7569
|
// EVIDENCE-WIRING-EXEMPT — a requirement whose own `|| bun test …` check passed is covered by what the harness measured.
|
|
7418
7570
|
const settledByCheck = settleUncoveredEvidence(tagCoverage.uncovered, { checks: evidenceChecks, required: requiredEvidence });
|
|
@@ -7858,10 +8010,11 @@ async function runSelfImplementInner(
|
|
|
7858
8010
|
// Gate has passed. Measure newly exported runtime values before review, without
|
|
7859
8011
|
// turning a static-analysis guess into a rework verdict during the first rollout.
|
|
7860
8012
|
const wiringFiles = [...new Set([...(runFacts.changedFiles ?? []), ...(gateRouteFiles ?? []), ...untrackedFiles])];
|
|
8013
|
+
let goalWiring: 'unwired' | undefined;
|
|
7861
8014
|
if (wiringFiles.some((file) => /^(?:src|scripts|apps\/pwa\/src)\/.*\.tsx?$/.test(file))) {
|
|
7862
8015
|
const wiringBase = wt.resolvedBase;
|
|
7863
8016
|
const wiring = wiringBase && /^[0-9a-f]{40}$/i.test(wiringBase)
|
|
7864
|
-
? findUnwiredExports({
|
|
8017
|
+
? (s.checkUnwiredExports ?? findUnwiredExports)({
|
|
7865
8018
|
cwd: wt.path,
|
|
7866
8019
|
changedFiles: wiringFiles,
|
|
7867
8020
|
// Timeouts and git errors throw → recorded as `failure`, never as "absent at base".
|
|
@@ -7871,6 +8024,15 @@ async function runSelfImplementInner(
|
|
|
7871
8024
|
),
|
|
7872
8025
|
})
|
|
7873
8026
|
: { checked: 0, unwired: [], failure: 'resolved-base-unavailable' };
|
|
8027
|
+
if (!wiring.failure && opts.goalFile && wiring.unwired.length > 0) {
|
|
8028
|
+
try {
|
|
8029
|
+
const declared = declaredPathsFromGoalDocumentText(readFileSync(opts.goalFile, 'utf8'));
|
|
8030
|
+
if (declared.readable && wiring.unwired.some(({ file }) =>
|
|
8031
|
+
declared.paths.some((target) => normalizeDeclaredScopePath(target) === normalizeDeclaredScopePath(file)))) {
|
|
8032
|
+
goalWiring = 'unwired';
|
|
8033
|
+
}
|
|
8034
|
+
} catch { /* unreadable goal text cannot establish a wiring deficit */ }
|
|
8035
|
+
}
|
|
7874
8036
|
const wiringObservation = {
|
|
7875
8037
|
round,
|
|
7876
8038
|
checked: wiring.checked,
|
|
@@ -7996,15 +8158,98 @@ async function runSelfImplementInner(
|
|
|
7996
8158
|
: `리뷰 미실행${review.failureReason !== undefined ? ` (${review.failureReason})` : ''}`);
|
|
7997
8159
|
if (opts.goalFile) {
|
|
7998
8160
|
let goalSlotFill: SupervisorGoalFillResult = 'unverifiable';
|
|
8161
|
+
let goalSlotDeficit: import('./goal-supervisor-fill.js').SupervisorGoalDeficit | undefined;
|
|
8162
|
+
let goalSlotAction: 'remeasure' | 'connect-goal' | undefined;
|
|
8163
|
+
let goalSlotFillError = false;
|
|
7999
8164
|
try {
|
|
8000
8165
|
goalSlotFill = await fillUnverifiableGoalSlots({
|
|
8001
|
-
path: opts.goalFile, round, gate, review,
|
|
8166
|
+
path: opts.goalFile, round, gate, review, ...(authoredSignal ? { authoredSignal } : {}),
|
|
8167
|
+
...(goalWiring ? { wiring: goalWiring } : {}),
|
|
8002
8168
|
independentlyCheck: s.independentlyCheckGoalSlots ?? (async () => false),
|
|
8169
|
+
observeDeficit: (deficit) => { goalSlotDeficit = deficit; },
|
|
8003
8170
|
});
|
|
8004
8171
|
} catch {
|
|
8005
8172
|
goalSlotFill = 'rejected';
|
|
8173
|
+
goalSlotFillError = true;
|
|
8174
|
+
}
|
|
8175
|
+
if (goalSlotFill === 'not-applicable') {
|
|
8176
|
+
observe('goal-slot-remeasure-result', { round, result: goalSlotFill, gatePassed: gate.passed,
|
|
8177
|
+
reason: 'test-step-scope-skipped', scopeReason: gate.scopeReason, testStepExecuted: gate.testStepExecuted });
|
|
8178
|
+
}
|
|
8179
|
+
if (goalSlotDeficit) {
|
|
8180
|
+
observe('supervisor-report-deficit', { runId, ...goalSlotDeficit, supervisorResult: goalSlotFill });
|
|
8181
|
+
if (goalSlotDeficit.kind !== 'unverified') {
|
|
8182
|
+
const move = repairNextMove({ supervisorDeficit: goalSlotDeficit,
|
|
8183
|
+
supervisorResult: goalSlotFill === 'rejected' ? 'rejected' : 'unverifiable' });
|
|
8184
|
+
if (move.kind === 'grounding') {
|
|
8185
|
+
goalSlotAction = move.action;
|
|
8186
|
+
observe('repair-next-move-input', { runId, ...move.supervisorDeficit,
|
|
8187
|
+
supervisorResult: goalSlotFill, action: move.action });
|
|
8188
|
+
}
|
|
8189
|
+
}
|
|
8190
|
+
}
|
|
8191
|
+
if (goalSlotFill === 'unverifiable' && gate.passed && goalSlotAction === 'remeasure' && goalSlotDeficit && runsGate) {
|
|
8192
|
+
observe('goal-slot-remeasure', { round, evidenceId: goalSlotDeficit.evidenceId, action: 'remeasure' });
|
|
8193
|
+
const measuredGate = await stepTimeout(s.gate(wt.path, { runId, round }), T.gate, 'gate');
|
|
8194
|
+
gate = measuredGate;
|
|
8195
|
+
let remeasureDeficit: import('./goal-supervisor-fill.js').SupervisorGoalDeficit | undefined;
|
|
8196
|
+
if (gate.passed) {
|
|
8197
|
+
goalSlotFill = await fillUnverifiableGoalSlots({ path: opts.goalFile, round, gate, review, ...(authoredSignal ? { authoredSignal } : {}),
|
|
8198
|
+
independentlyCheck: s.independentlyCheckGoalSlots ?? (async () => false),
|
|
8199
|
+
observeDeficit: (deficit) => { remeasureDeficit = deficit; } });
|
|
8200
|
+
}
|
|
8201
|
+
observe('goal-slot-remeasure-result', { round, evidenceId: goalSlotDeficit.evidenceId, result: goalSlotFill,
|
|
8202
|
+
gatePassed: measuredGate.passed,
|
|
8203
|
+
...(remeasureDeficit ? { deficitKind: remeasureDeficit.kind,
|
|
8204
|
+
deficitEvidenceId: remeasureDeficit.evidenceId, gateLog: remeasureDeficit.gateLog,
|
|
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') {
|
|
8226
|
+
finalizeSupervisorDeliveries('goal-slot-remeasure-gate-failed');
|
|
8227
|
+
const reason = `goal-slot remeasurement ${!gate.passed ? 'failed' : goalSlotFill === 'rejected' ? 'rejected' : 'unmeasured'} · evidence ${goalSlotDeficit.evidenceId}`;
|
|
8228
|
+
const pr = await preserveBlockedArtifacts({ stage: 'gate-failed', reason, gate, salvageStatusExpected: false });
|
|
8229
|
+
return { ok: false, stage: 'gate-failed', node: 'rework', ...resolveRunOutcome({ termination: 'abandoned' }),
|
|
8230
|
+
sessionId, worktreePath: wt.path, branch: wt.branch, gate,
|
|
8231
|
+
quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
|
|
8232
|
+
...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
|
|
8233
|
+
}
|
|
8234
|
+
}
|
|
8235
|
+
observe('goal-slot-fill', { round, result: goalSlotFill, gatePassed: gate.passed, reviewVerdict: review.verdict,
|
|
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' } : {}),
|
|
8240
|
+
...(goalSlotFill === 'not-applicable' ? { reason: 'test-step-scope-skipped', scopeReason: gate.scopeReason,
|
|
8241
|
+
testStepExecuted: gate.testStepExecuted } : {}) });
|
|
8242
|
+
if (goalSlotAction === 'connect-goal' && goalSlotDeficit) {
|
|
8243
|
+
finalizeSupervisorDeliveries('goal-slot-connect-goal');
|
|
8244
|
+
const reason = `goal-slot wiring deficit · evidence ${goalSlotDeficit.evidenceId}`;
|
|
8245
|
+
const pr = await preserveBlockedArtifacts({ stage: 'review-blocked', reason, gate, salvageStatusExpected: false });
|
|
8246
|
+
await draftFollowUpAfterBlocked({ runId, prNumber: pr?.number, stage: 'review-blocked',
|
|
8247
|
+
unresolvedMustFix: [reason], feature: opts.feature, cellId: opts.goalId, goalFile: opts.goalFile }, s.followUp);
|
|
8248
|
+
return { ok: false, stage: 'review-blocked', node: 'rework', ...resolveRunOutcome({ termination: 'abandoned' }),
|
|
8249
|
+
sessionId, worktreePath: wt.path, branch: wt.branch, gate, review,
|
|
8250
|
+
quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
|
|
8251
|
+
...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
|
|
8006
8252
|
}
|
|
8007
|
-
observe('goal-slot-fill', { round, result: goalSlotFill, gatePassed: gate.passed, reviewVerdict: review.verdict });
|
|
8008
8253
|
}
|
|
8009
8254
|
const evidenceFacts: ReflectEvidenceFacts = evidenceCoverage
|
|
8010
8255
|
? { requiredEvidence: evidenceCoverage.required, coveredEvidence: evidenceCoverage.covered, missingEvidence: evidenceCoverage.uncovered }
|
|
@@ -8066,6 +8311,9 @@ async function runSelfImplementInner(
|
|
|
8066
8311
|
});
|
|
8067
8312
|
} catch { /* fail-safe: REFUTE never changes a finding without supervisor judgment */ }
|
|
8068
8313
|
}
|
|
8314
|
+
const rawReviewMustFix = [...review.mustFix];
|
|
8315
|
+
let reflectionApplied = false;
|
|
8316
|
+
let reviewTriageRecorded = false;
|
|
8069
8317
|
if (review.verdict === 'fail' && review.mustFix.length > 0) {
|
|
8070
8318
|
let effectiveMustFix = review.mustFix;
|
|
8071
8319
|
if (s.reflectMustFix) {
|
|
@@ -8074,6 +8322,7 @@ async function runSelfImplementInner(
|
|
|
8074
8322
|
try {
|
|
8075
8323
|
const recurrenceHistory = recurrenceHistoryFor(review.mustFix);
|
|
8076
8324
|
const reflected = await withStepTimeout(s.reflectMustFix({ mustFix: review.mustFix, goal: roundGoal, cwd: wt.path, evidenceFacts, gateFacts: gate.reflectGateFacts, citedPathFacts, ...(recurrenceHistory.length ? { recurrenceHistory } : {}), runId, round }), T.review, 'review');
|
|
8325
|
+
reflectionApplied = true;
|
|
8077
8326
|
const rejectedItems = new Set(reflected.rejected.filter((r) => r.reason && r.reason.trim().length > 0).map((r) => r.item));
|
|
8078
8327
|
const rejected = reflected.rejected.filter((r) => rejectedItems.has(r.item));
|
|
8079
8328
|
effectiveMustFix = review.mustFix.filter((m) => !rejectedItems.has(m));
|
|
@@ -8110,6 +8359,17 @@ async function runSelfImplementInner(
|
|
|
8110
8359
|
}
|
|
8111
8360
|
}
|
|
8112
8361
|
if (effectiveMustFix.length === 0) {
|
|
8362
|
+
observe('review-round-triage', {
|
|
8363
|
+
round,
|
|
8364
|
+
verdict: 'fail',
|
|
8365
|
+
rawMustFix: rawReviewMustFix,
|
|
8366
|
+
reflectedMustFix: effectiveMustFix,
|
|
8367
|
+
reflectionApplied,
|
|
8368
|
+
decision: 'pass',
|
|
8369
|
+
nextNode: 'open-pr',
|
|
8370
|
+
effectiveMax,
|
|
8371
|
+
});
|
|
8372
|
+
reviewTriageRecorded = true;
|
|
8113
8373
|
finalizeSupervisorDeliveries('review-reflect-converged');
|
|
8114
8374
|
completionStatus = 'review-reflect-converged';
|
|
8115
8375
|
review.mustFix = [];
|
|
@@ -8119,6 +8379,21 @@ async function runSelfImplementInner(
|
|
|
8119
8379
|
progress('reviewed', '리뷰: fail → warn (반사가 must-fix 를 «전부» 기각 — 사유는 위 줄과 PR 코멘트에)');
|
|
8120
8380
|
break;
|
|
8121
8381
|
}
|
|
8382
|
+
const reviewDecision = decideReviewRound({ verdict: review.verdict, mustFix: effectiveMustFix, round, effectiveMax });
|
|
8383
|
+
const reviewTriage = {
|
|
8384
|
+
round,
|
|
8385
|
+
verdict: review.verdict,
|
|
8386
|
+
rawMustFix: rawReviewMustFix,
|
|
8387
|
+
reflectedMustFix: [...effectiveMustFix],
|
|
8388
|
+
reflectionApplied,
|
|
8389
|
+
effectiveMax,
|
|
8390
|
+
};
|
|
8391
|
+
if (reviewDecision === 'follow-up') {
|
|
8392
|
+
pendingReviewTriage = { ...reviewTriage, verdict: 'fail' };
|
|
8393
|
+
} else {
|
|
8394
|
+
observe('review-round-triage', { ...reviewTriage, decision: reviewDecision, nextNode: 'rework' });
|
|
8395
|
+
reviewTriageRecorded = true;
|
|
8396
|
+
}
|
|
8122
8397
|
appliedLastRound = [...effectiveMustFix];
|
|
8123
8398
|
roundSummaryEntries.push({ round, kind: 'review', tried: impl.summary.replace(/\s+/g, ' ').trim().slice(0, 200),
|
|
8124
8399
|
failedIds: effectiveMustFix.map(stableMustFixId), filesTouched: runFacts.changedFiles,
|
|
@@ -8171,6 +8446,18 @@ async function runSelfImplementInner(
|
|
|
8171
8446
|
round++;
|
|
8172
8447
|
continue;
|
|
8173
8448
|
}
|
|
8449
|
+
if (!reviewTriageRecorded && !pendingReviewTriage) {
|
|
8450
|
+
observe('review-round-triage', {
|
|
8451
|
+
round,
|
|
8452
|
+
verdict: review.verdict,
|
|
8453
|
+
rawMustFix: rawReviewMustFix,
|
|
8454
|
+
reflectedMustFix: rawReviewMustFix,
|
|
8455
|
+
reflectionApplied: false,
|
|
8456
|
+
decision: 'pass',
|
|
8457
|
+
nextNode: 'open-pr',
|
|
8458
|
+
effectiveMax,
|
|
8459
|
+
});
|
|
8460
|
+
}
|
|
8174
8461
|
}
|
|
8175
8462
|
// EVIDENCE-WIRING-EXEMPT — a commandless [preservation] is covered once the changed-file gate passed.
|
|
8176
8463
|
if (gate.passed && evidenceCoverage?.uncoveredCount) {
|
|
@@ -8517,7 +8804,7 @@ async function runSelfImplementInner(
|
|
|
8517
8804
|
s.persistPrBodyArtifact,
|
|
8518
8805
|
'self-implement-pr',
|
|
8519
8806
|
);
|
|
8520
|
-
let pr:
|
|
8807
|
+
let pr: OpenPrOutcome;
|
|
8521
8808
|
try {
|
|
8522
8809
|
pr = await withStepTimeout(s.openPr({
|
|
8523
8810
|
title: prTitle(opts.feature, opts.goalFile),
|
|
@@ -8548,15 +8835,64 @@ async function runSelfImplementInner(
|
|
|
8548
8835
|
const current = runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 });
|
|
8549
8836
|
if (current.status !== 0 || current.stdout.trim() !== reviewedHeadCommit) delete reviewedHeadResult.reviewedHeadCommit;
|
|
8550
8837
|
}
|
|
8551
|
-
|
|
8552
|
-
|
|
8553
|
-
|
|
8554
|
-
|
|
8555
|
-
|
|
8556
|
-
|
|
8557
|
-
|
|
8558
|
-
|
|
8559
|
-
|
|
8838
|
+
let prAttribution: { headRefName: string; createdAt: string } | undefined;
|
|
8839
|
+
let prAttributionReadError: string | undefined;
|
|
8840
|
+
try {
|
|
8841
|
+
if (s.readPrAttribution) {
|
|
8842
|
+
prAttribution = await s.readPrAttribution({ number: pr.number, cwd: wt.path });
|
|
8843
|
+
} else {
|
|
8844
|
+
const viewed = spawnSync('gh', ['pr', 'view', String(pr.number), '--json', 'headRefName,createdAt'], {
|
|
8845
|
+
cwd: wt.path, encoding: 'utf8', timeout: 30_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER,
|
|
8846
|
+
});
|
|
8847
|
+
if (viewed.status !== 0) throw new Error(viewed.stderr || viewed.stdout || 'gh pr view failed');
|
|
8848
|
+
const parsed = JSON.parse(viewed.stdout) as { headRefName?: unknown; createdAt?: unknown };
|
|
8849
|
+
if (typeof parsed.headRefName !== 'string' || typeof parsed.createdAt !== 'string') throw new Error('invalid PR attribution metadata');
|
|
8850
|
+
prAttribution = { headRefName: parsed.headRefName, createdAt: parsed.createdAt };
|
|
8851
|
+
}
|
|
8852
|
+
} catch (error) {
|
|
8853
|
+
prAttributionReadError = safeErrorDescription(error);
|
|
8854
|
+
}
|
|
8855
|
+
const expectedPrHead = pr.boundCardReuse?.headRefName ?? wt.branch;
|
|
8856
|
+
const prAttributed = !prAttributionReadError && !!prAttribution
|
|
8857
|
+
&& prAttributedToRun(prAttribution, wt.branch, startedAtMs, pr.boundCardReuse);
|
|
8858
|
+
if (prAttributionReadError || !prAttribution) {
|
|
8859
|
+
onPrAttributionMismatch();
|
|
8860
|
+
observe('pr-attribution-unverified', {
|
|
8861
|
+
expectedBranch: expectedPrHead,
|
|
8862
|
+
number: pr.number,
|
|
8863
|
+
url: pr.url,
|
|
8864
|
+
reason: prAttributionReadError ?? 'metadata-absent',
|
|
8865
|
+
}, { level: 'warn' });
|
|
8866
|
+
} else if (!prAttributed) {
|
|
8867
|
+
onPrAttributionMismatch();
|
|
8868
|
+
observe('pr-attribution-mismatch', {
|
|
8869
|
+
expectedBranch: expectedPrHead,
|
|
8870
|
+
actualBranch: prAttribution.headRefName,
|
|
8871
|
+
createdAt: prAttribution.createdAt,
|
|
8872
|
+
number: pr.number,
|
|
8873
|
+
url: pr.url,
|
|
8874
|
+
}, { level: 'warn' });
|
|
8875
|
+
} else {
|
|
8876
|
+
const attributedNumber = recordedPrNumber(pr.number);
|
|
8877
|
+
if (attributedNumber !== undefined) onPrAttributed(attributedNumber);
|
|
8878
|
+
observe('pr-opened', {
|
|
8879
|
+
url: pr.url,
|
|
8880
|
+
number: pr.number,
|
|
8881
|
+
branch: expectedPrHead,
|
|
8882
|
+
headCommit: runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 }).stdout.trim(),
|
|
8883
|
+
autoMerge: canAuto,
|
|
8884
|
+
autoReview: !!labels,
|
|
8885
|
+
...(preparedPrBody.truncated ? { prBodyTruncated: true, prBodyOriginalChars: preparedPrBody.originalChars } : {}),
|
|
8886
|
+
});
|
|
8887
|
+
}
|
|
8888
|
+
if (!prAttributed) {
|
|
8889
|
+
progress('aborted', `PR 귀속 확인 실패 — 외부 PR 후속 처리 중단 (${wt.branch}; worktree: ${wt.path})`);
|
|
8890
|
+
return {
|
|
8891
|
+
ok: false, stage: 'aborted', node: 'open-pr', ...resolveRunOutcome({ termination: 'abandoned' }),
|
|
8892
|
+
...decisionSignalResult, ...scopeExpansionResult, sessionId, worktreePath: wt.path, branch: wt.branch,
|
|
8893
|
+
gate, ...(review ? { review } : {}), detail: 'PR attribution could not be verified; worktree and branch preserved',
|
|
8894
|
+
};
|
|
8895
|
+
}
|
|
8560
8896
|
await flushPrComments(pr);
|
|
8561
8897
|
|
|
8562
8898
|
// Inspect the opened PR itself: the goal text and the pre-sync worktree can differ from its final file list.
|
|
@@ -8749,7 +9085,7 @@ async function runSelfImplementInner(
|
|
|
8749
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) => {
|
|
8750
9086
|
if (event.startsWith('post-merge-cleanup-')) cleanupOutcome = event.slice('post-merge-cleanup-'.length);
|
|
8751
9087
|
observe(event, data);
|
|
8752
|
-
}));
|
|
9088
|
+
}, wt.inPlace === true));
|
|
8753
9089
|
exitJourneyNode('cleanup', { provenance: 'post-merge', runId, outcome: cleanupOutcome });
|
|
8754
9090
|
const mergedLedger = (() => {
|
|
8755
9091
|
try { return loadRunLedger(runId); } catch { return null; }
|