elanous 0.2.35 → 0.2.36
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/chunks/{d06f9160.a3d9062f95de8ad7.js → 053a429e.9a63436527cc751c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +287 -0
- package/apps/pwa/out/_next/static/chunks/{4346.8601952e73bf5803.js → 1201.afbfc5b1c5e5cbe4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +64 -0
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +36 -0
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +149 -0
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3103.0df8da390948bb84.js → 2500.cbc1257b774aae52.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7644.17e37ba6f1d4226e.js → 2683.c9773a0c589b031b.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.js → 275-02ea4c2a33980422.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +1 -0
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8714.ff0b7ce3ec3e3ae2.js → 2941.3c3546f96bc6efa7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.js → 2986.45d7652e4f13557e.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3136.30aaaa5fa03662a3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3677-4215f826f6aa68e5.js → 3148-98efd4869d660a87.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +226 -0
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3324.a09703033abcbd2f.js +34 -0
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +8 -0
- package/apps/pwa/out/_next/static/chunks/3410.7f9af5ab77cbe65f.js +115 -0
- package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +32 -0
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +286 -0
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 3727.7949ccaacaa71242.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8557-e7898769499cd56f.js → 3757-180308bc61021b05.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{359-2250789a2d3499e7.js → 3840-5825d56d46976a92.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.js → 3a3d9966.cc4d4585a2708e7c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +104 -0
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9952.5daf5f94063a2b3e.js → 4286.b70c4520306817e8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4304.e9b2512834a9e23e.js +23 -0
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.js → 4615.8525eb0add35eba6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +148 -0
- package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6236.e18cced2d5ba6afb.js → 528.38ce20ef8aa251ff.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{3408.21d1570602f4b6c0.js → 552.b7d061ad91eeac51.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5711.957b095705c12560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1530.0e612369b6fd7ea0.js → 575.d929793a53f27c4b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +41 -0
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +79 -0
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +1 -0
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.js → 6943.c6b24124853a47b2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{630.fe5a46428d63b013.js → 727.7deb87749b0a343a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2018.a741297bce759490.js → 7481.39f7a4654907bf6e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8444.4c26b379ca2b9596.js → 771.c3cdb6c1f7f47c02.js} +17 -17
- package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3589.5444a06bcf6e775c.js → 7891.03f910124a737985.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +1 -0
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{b2f6ba4d.fb56fdbbf798df33.js → 873d6c12.09bd499f57171543.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 8904.7d51af2dc033965c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{5637.281e5dec4ea6ecf1.js → 914.8abefd48d579547b.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.js → 9250-072df22eaadaa6b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +77 -0
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8637.47f5b35afcae5e6b.js → 9514.131c52cc75fe6439.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1674.2a65fd5668e1cc5f.js → 9789.60f723d18097ec30.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9f31e478.fefcbcd3c388ebc5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.js → ceba0382.650712b56b85b582.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.js → da5ecc5c-b005ad8cac737d57.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{56d372f2.681ab4ec4c998fae.js → f9a61e4d.1fc2c1dbdd49fe46.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +1 -0
- package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_buildManifest.js +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
- package/docs/goal-context/README.md +3 -0
- package/graphs/default-loop.yaml +6 -1
- package/graphs/implement-loop.yaml +24 -0
- package/graphs/release/recipes.yaml +6 -0
- package/graphs/release/release-loop.yaml +17 -4
- package/graphs/wizard/recipes.yaml +44 -0
- package/graphs/wizard/wizard-loop.yaml +44 -0
- package/graphs/work/research-report.yaml +2 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +139 -5
- package/scripts/coord-role-pack.ts +1 -1
- package/scripts/first10-gate.ts +416 -0
- package/scripts/fleet/wsl-node-setup.sh +432 -0
- package/scripts/release-loop/docs-node.ts +204 -8
- package/scripts/release-loop/gate-node.ts +249 -53
- package/scripts/release-loop/node-verdict.ts +2 -0
- package/scripts/release-loop/resume-cap.ts +14 -34
- package/scripts/release-loop/resume-release.ts +37 -11
- package/scripts/release-loop/traffic-node.ts +59 -0
- package/scripts/release-loop/traffic-transition.ts +159 -0
- package/scripts/rhythm/daily.ts +137 -3
- package/scripts/ux-sim.ts +53 -0
- package/skills/README.md +1 -0
- package/src/acp/core-turn-bridge.ts +48 -6
- package/src/agent/delegate-hint.ts +16 -0
- package/src/agent/runner.ts +82 -2
- package/src/agent/task-notification.ts +56 -10
- package/src/agent/types.ts +4 -0
- package/src/agent-substrate/pr-reviewer.ts +55 -3
- package/src/agent-substrate/review-intent.ts +29 -2
- package/src/agent-substrate/review-observation.ts +3 -0
- package/src/agent-substrate/self-review-cli.ts +168 -16
- package/src/autopilot/mission-codebase-gate.ts +141 -12
- package/src/autopilot/pr-manager.ts +25 -5
- package/src/boot/daemon-tools/self-implement.ts +1 -0
- package/src/budget/usage-outcomes.ts +8 -4
- package/src/capture/tui-self-report.ts +102 -0
- package/src/chat/goal-continue-verdict.ts +41 -0
- package/src/chat/index.ts +30 -4
- package/src/chat/internal-turn-origin.ts +1 -0
- package/src/chat/paste-fold.ts +86 -0
- package/src/chat/tool-render/block.ts +32 -0
- package/src/chat/tool-render/dispatch.ts +2 -20
- package/src/chat/tool-render/result-text.ts +98 -0
- package/src/chat/turn-typeahead.ts +70 -7
- package/src/cli/config-audit.ts +119 -0
- package/src/cli/doctor-cli.ts +22 -0
- package/src/cli/guardian-cli.ts +10 -0
- package/src/cli/herdr-cli.ts +34 -0
- package/src/cli/light-entry-route.ts +6 -3
- package/src/cli/log-event-names.ts +2 -0
- package/src/cli/make-cli.ts +247 -11
- package/src/cli/msg-cli.ts +117 -3
- package/src/cli/pr-cli.ts +29 -16
- package/src/cli/pr-land-base-read.ts +11 -2
- package/src/cli/pr-land-heavy-remote.ts +6 -3
- package/src/cli/pr-land-overlap-evidence.ts +23 -4
- package/src/cli/pr-land-recovery.ts +117 -1
- package/src/cli/pty-takeover-cli.ts +8 -7
- package/src/cli/release-cli.ts +21 -5
- package/src/cli/release-single-flight.ts +1 -1
- package/src/cli/tasks-card-show.ts +162 -0
- package/src/cli/tasks-cli.ts +574 -356
- package/src/cli/tasks-read-cli.ts +197 -0
- package/src/core-turn/run-core-turn.ts +4 -2
- package/src/core-turn/run-goal-loop.ts +73 -16
- package/src/core-turn/types.ts +6 -1
- package/src/dashboard/context/keys.ts +8 -31
- package/src/dashboard/index.ts +202 -49
- package/src/dashboard/input/agent-wake.ts +7 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
- package/src/dashboard/input/chat-main-slash-command.ts +4 -2
- package/src/dashboard/input/goal-continue.ts +210 -0
- package/src/dashboard/input/goal-interim.ts +2 -0
- package/src/dashboard/input/internal-turn.ts +2 -8
- package/src/dashboard/input/seat-autowake.ts +9 -7
- package/src/dashboard/input/turn-autoheal.ts +52 -0
- package/src/dashboard/seat-boot-preamble.ts +132 -5
- package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
- package/src/dashboard/slash-runtime/model-choices.ts +15 -0
- package/src/dashboard/stale-install-check.ts +3 -99
- package/src/debug/batch-queue.ts +119 -0
- package/src/debug/tui-log-tag.ts +67 -0
- package/src/display/agent-surface.ts +7 -0
- package/src/domains/standalone-log-sink.ts +15 -2
- package/src/esc-abort-gate.ts +69 -0
- package/src/git-fs/worktree.ts +95 -1
- package/src/graph-runner/graph-cli.ts +18 -0
- package/src/graph-runner/runner.ts +20 -11
- package/src/graph-wizard/generate.ts +108 -4
- package/src/graph-wizard/steps.ts +15 -0
- package/src/grounding/proactive-ground.ts +86 -0
- package/src/harness/control-inbox.ts +49 -1
- package/src/harness/harness-cli-command.ts +51 -7
- package/src/harness/harness-incidents.ts +52 -1
- package/src/harness/pod-control-send.ts +33 -5
- package/src/harness/self-send-remote.ts +69 -0
- package/src/harness/self-send-routing-guard.ts +6 -0
- package/src/harness/self-send-target.ts +4 -3
- package/src/index.ts +327 -12
- package/src/input-core/context-key-runtime.ts +21 -0
- package/src/light-cli.ts +6 -1
- package/src/llm-wellformed.ts +70 -0
- package/src/llm.ts +35 -4
- package/src/loops/msg-wake.ts +35 -39
- package/src/loops/orchestrator/inbox.ts +59 -11
- package/src/loops/orchestrator/knowhow-pack.ts +364 -0
- package/src/loops/orchestrator/tick.ts +5 -1
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/models/prompts.ts +17 -2
- package/src/msg/msg-post-office.ts +116 -0
- package/src/mss/logging/log-store.ts +79 -22
- package/src/nexus/api/decisions-route.ts +38 -18
- package/src/nexus/api/graph-wizard-api.ts +20 -2
- package/src/nexus/boot/register-mcp-clients.ts +263 -38
- package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
- package/src/onboarding/first-run.ts +37 -6
- package/src/onboarding/web-first.ts +43 -11
- package/src/ops/overview-collect.ts +12 -6
- package/src/ops/overview.ts +3 -3
- package/src/persona/loader.ts +11 -0
- package/src/persona/types.ts +8 -0
- package/src/prompt-library/session-guidance.ts +14 -0
- package/src/provider-summary.ts +8 -0
- package/src/pty-shell/herdr-agent-report.ts +118 -9
- package/src/pty-shell/herdr-prompt.ts +266 -0
- package/src/pty-shell/pty-control-ipc.ts +151 -8
- package/src/pty-shell/pty-special-keys.ts +42 -2
- package/src/pty-shell/stale-install-check.ts +99 -0
- package/src/pty-shell/tui-run-state.ts +14 -2
- package/src/release-loop/auto-start.ts +20 -2
- package/src/release-loop/checklist.ts +76 -4
- package/src/release-loop/rehearsal.ts +36 -20
- package/src/repl/index.ts +19 -1
- package/src/seat-loop/knowhow-lint.ts +1 -1
- package/src/self-dev/decompose-proposal.ts +172 -20
- package/src/self-dev/decompose.ts +61 -0
- package/src/self-dev/dev-cli.ts +37 -3
- package/src/self-dev/dev-pipeline.ts +8 -2
- package/src/self-dev/draft-triage-rules.ts +31 -0
- package/src/self-dev/glm-credential-guard.ts +77 -0
- package/src/self-dev/graph-journey-nodes.ts +1 -0
- package/src/self-dev/graph-journey-route.ts +12 -2
- package/src/self-dev/orchestrate-cli.ts +68 -3
- package/src/self-dev/orchestrate.ts +116 -17
- package/src/self-dev/run-supervisor.ts +55 -2
- package/src/self-dev/run-types.ts +1 -1
- package/src/self-health/autoheal.ts +153 -0
- package/src/self-health/signatures.ts +6 -0
- package/src/self-implement/device-first.ts +116 -0
- package/src/self-implement/doctor-visit.ts +239 -1
- package/src/self-implement/evidence-command-budget.ts +80 -0
- package/src/self-implement/goal-author-cli.ts +1 -0
- package/src/self-implement/goal-author-decompose.ts +265 -4
- package/src/self-implement/goal-author.ts +33 -8
- package/src/self-implement/goal-elaborate.ts +176 -22
- package/src/self-implement/goal-refine.ts +3 -0
- package/src/self-implement/graph-variant.ts +40 -6
- package/src/self-implement/headless-elanous-driver.ts +19 -3
- package/src/self-implement/off-diff-evidence.ts +58 -6
- package/src/self-implement/orchestrator.ts +222 -21
- package/src/self-implement/pod-warm-pool-profile.ts +1 -0
- package/src/self-implement/pwa-import-graph.ts +1 -1
- package/src/self-implement/rework-policy.ts +30 -0
- package/src/self-implement/run-ledger.ts +108 -0
- package/src/self-implement/run-ttl.ts +38 -24
- package/src/self-implement/scope-adjacency.ts +3 -1
- package/src/self-implement/seams.ts +60 -4
- package/src/self-implement/wiring-check.ts +358 -0
- package/src/shell-env-bootstrap.ts +11 -4
- package/src/skills/runner.ts +4 -2
- package/src/skills/tools/agent.ts +290 -48
- package/src/skills/tools/schedule-wakeup.ts +23 -4
- package/src/skills/tools/shell.ts +61 -6
- package/src/skills/tools/terminal-modal-inject.ts +1 -2
- package/src/skills/tools/terminal-modal.ts +10 -8
- package/src/skills/url-router.ts +41 -1
- package/src/smart-wizard/run.ts +66 -0
- package/src/status/bar.ts +34 -6
- package/src/status/status-provider-info.ts +37 -6
- package/src/steward/rejudge-tick.ts +10 -2
- package/src/steward/ta-repair-event-collect.ts +17 -6
- package/src/task-agent/actions.ts +3 -1
- package/src/task-agent/land-queue.ts +21 -8
- package/src/task-agent/live-moves.ts +22 -6
- package/src/task-agent/mission.ts +30 -0
- package/src/task-agent/rejudge-on-head.ts +15 -0
- package/src/task-agent/repair-cycle.ts +138 -32
- package/src/task-agent/repair-next-move.ts +31 -3
- package/src/task-agent/repair-outcomes.ts +29 -0
- package/src/task-agent/repair-worker.ts +14 -4
- package/src/task-agent/shadow.ts +41 -3
- package/src/task-agent/task-card-prefix.ts +2 -0
- package/src/task-agent/task-hand.ts +477 -22
- package/src/task-agent/task-parent-role-llm.ts +36 -0
- package/src/task-agent/tier-split.ts +78 -9
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
- package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
- package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
- package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
- package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
- package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
- package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +485 -36
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +396 -19
- package/src/task-orchestrator/surfaces/self-implement.ts +42 -2
- package/src/tool-runtime/index.ts +15 -2
- package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
- package/src/tty-foreground.ts +155 -0
- package/src/tui/chat/goal-interim.ts +173 -0
- package/src/tui/chat/log-view.ts +205 -18
- package/src/tui/chat/self-health-status.ts +232 -0
- package/src/tui/entry.ts +370 -81
- package/src/tui/input/composer.ts +8 -1
- package/src/tui/slash/compact-command.ts +7 -0
- package/src/tui/slash/compact.ts +1 -7
- package/src/tui/slash/resume.ts +75 -0
- package/src/tui-client/local-chat-turn.ts +45 -2
- package/src/tui-client/next-dashboard-runtime.ts +8 -0
- package/src/tui-client/next-loop-command.ts +70 -0
- package/src/tui-client/next-wakeup.ts +191 -0
- package/src/tui.ts +37 -0
- package/src/ui/modal-adapter.ts +2 -2
- package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
- package/src/ux-sim/cli-config-audit-device.ts +121 -0
- package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
- package/src/ux-sim/event-monkey.ts +3 -2
- package/src/ux-sim/fake-bin.ts +45 -0
- package/src/ux-sim/fake-herdr.ts +238 -0
- package/src/ux-sim/fake-llm.ts +111 -6
- package/src/ux-sim/fault-glm-no-credential.ts +116 -0
- package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
- package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
- package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
- package/src/ux-sim/goal-device.ts +619 -0
- package/src/ux-sim/in-process-cli.ts +22 -5
- package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
- package/src/ux-sim/mock-authoring-first-run.ts +97 -0
- package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
- package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
- package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
- package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
- package/src/ux-sim/onboarding-first-run-device.ts +269 -0
- package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
- package/src/ux-sim/subagent-tools-device.ts +81 -0
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
- package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +0 -1
- package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
- package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
- package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
- package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
- package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
- package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +0 -122
- package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
- package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
- package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5483-dd5d7697f6bdb106.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
- package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
- package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
- package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
- package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
- package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
- package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
- package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
- package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-dc0a532f5b9196ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
- /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
|
@@ -40,6 +40,7 @@ import { writeGoalDocumentAtomic } from './goal-document-write.js';
|
|
|
40
40
|
import { hostname, loadavg } from 'node:os';
|
|
41
41
|
import { resolveHostId } from '../platform/host-id.js';
|
|
42
42
|
import { resolveInstanceName } from '../instance-identity.js';
|
|
43
|
+
import { ghAutomationEnv } from '../autopilot/pr-manager.js';
|
|
43
44
|
import { citedReviewSymbols, MAX_CITED_REVIEW_SYMBOL_CHARS, measureReviewFindingKeyOverlap, normalizeReviewFindingKey, REVIEW_FINDING_KEY_VERSION, reviewFindingKey, shortNormalizedReviewFindingHash, type CitedReviewSymbol } from '../agent-substrate/review-finding-key.js';
|
|
44
45
|
export { citedReviewSymbols, MAX_CITED_REVIEW_SYMBOL_CHARS, normalizeReviewFindingKey, REVIEW_FINDING_KEY_VERSION, reviewFindingKey, shortNormalizedReviewFindingHash, type CitedReviewSymbol } from '../agent-substrate/review-finding-key.js';
|
|
45
46
|
|
|
@@ -47,6 +48,46 @@ function displayBranchName(ref: string): string {
|
|
|
47
48
|
return ref.trim().replace(/^refs\/heads\//, '').replace(/^origin\//, '');
|
|
48
49
|
}
|
|
49
50
|
|
|
51
|
+
export const HARVEST_DEFERRED_MARKER = '수확보류: harvest-deferred';
|
|
52
|
+
const execFileAsync = promisify(execFileCallback);
|
|
53
|
+
|
|
54
|
+
export function markHarvestDeferredBody(input: {
|
|
55
|
+
runStatus: string | undefined;
|
|
56
|
+
prNumber: number | undefined;
|
|
57
|
+
body: string | undefined;
|
|
58
|
+
}): string | undefined {
|
|
59
|
+
if (input.runStatus !== 'failed' || input.prNumber === undefined || !Number.isSafeInteger(input.prNumber) || input.prNumber < 1 || input.body === undefined) return undefined;
|
|
60
|
+
if (harvestDeferredMarker(input.body)) return input.body;
|
|
61
|
+
const separator = input.body.endsWith('\n') ? '\n' : '\n\n';
|
|
62
|
+
return `${input.body}${separator}${HARVEST_DEFERRED_MARKER}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function readHarvestPrBody(opts: { number: number; cwd: string }): Promise<{ body: string; state: string; isDraft: boolean } | undefined> {
|
|
66
|
+
const { stdout } = await execFileAsync('gh', ['pr', 'view', String(opts.number), '--json', 'body,state,isDraft'], {
|
|
67
|
+
cwd: opts.cwd,
|
|
68
|
+
env: ghAutomationEnv(process.env),
|
|
69
|
+
encoding: 'utf8',
|
|
70
|
+
timeout: 120_000,
|
|
71
|
+
maxBuffer: 2 * 1024 * 1024,
|
|
72
|
+
});
|
|
73
|
+
const parsed: unknown = JSON.parse(stdout);
|
|
74
|
+
if (!parsed || typeof parsed !== 'object') return undefined;
|
|
75
|
+
const record = parsed as { body?: unknown; state?: unknown; isDraft?: unknown };
|
|
76
|
+
return typeof record.body === 'string' && typeof record.state === 'string' && typeof record.isDraft === 'boolean'
|
|
77
|
+
? { body: record.body, state: record.state, isDraft: record.isDraft }
|
|
78
|
+
: undefined;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export async function updateHarvestPrBody(opts: { number: number; body: string; cwd: string }): Promise<void> {
|
|
82
|
+
await execFileAsync('gh', ['pr', 'edit', String(opts.number), '--body', opts.body], {
|
|
83
|
+
cwd: opts.cwd,
|
|
84
|
+
env: ghAutomationEnv(process.env),
|
|
85
|
+
encoding: 'utf8',
|
|
86
|
+
timeout: 120_000,
|
|
87
|
+
maxBuffer: 2 * 1024 * 1024,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
50
91
|
export function formatAutoMergeSuccessMessage(input: {
|
|
51
92
|
prNumber: number;
|
|
52
93
|
mergedBase?: string | undefined;
|
|
@@ -79,6 +120,7 @@ import { classifyGateEnvDeficit, DEFAULT_GATE_ENV_RETRY, GATE_ENV_DEFICIT_HARVES
|
|
|
79
120
|
import { recordFailureEvent } from './heal-intake.js';
|
|
80
121
|
import { classifyReworkCapExhaustion, type ReworkCapHealDecision } from './heal-triage.js';
|
|
81
122
|
import { releasePathHold, releasePathHoldComment, RELEASE_PATH_LABEL } from '../self-dev/release-path-guard.js';
|
|
123
|
+
import { harvestDeferredMarker } from '../self-dev/draft-triage-rules.js';
|
|
82
124
|
import { emitDecision } from '../live/detail-switch.js';
|
|
83
125
|
import { reworkDecision } from './decision-events.js';
|
|
84
126
|
import type { LogSink } from '../mss/logging/sink.js';
|
|
@@ -91,7 +133,7 @@ import { classifyError } from '../session-runtime/retry-policy.js';
|
|
|
91
133
|
import { decomposeSelfDevGoal, inferHotPaths, type SelfDevDecomposeOptions } from '../self-dev/decompose.js';
|
|
92
134
|
import { boundaryGlobs, boundaryViolations } from './goal-boundary.js';
|
|
93
135
|
import { askAtExecution, type ExecutionClarificationResult } from './execution-clarification.js';
|
|
94
|
-
import { decideScopeExpansion, renderScopeExpansionSection, SCOPE_EXPANSION_CAP, type ScopeExpansion } from './scope-adjacency.js';
|
|
136
|
+
import { decideScopeExpansion, renderScopeExpansionSection, SCOPE_EXPANSION_CAP, type ScopeExpansion, type ScopeStopReason } from './scope-adjacency.js';
|
|
95
137
|
import { targetScopedGoalText } from './goal-text-path-scope.js';
|
|
96
138
|
import { selectKnowhowPack } from './knowhow-pack.js';
|
|
97
139
|
import { declaredNewFilePaths } from './goal-new-paths.js';
|
|
@@ -183,7 +225,8 @@ import { formatGateFailedId, type PremiseReviewCard, type PremiseReviewInput } f
|
|
|
183
225
|
import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
|
|
184
226
|
import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
|
|
185
227
|
import { resolveRunOutcome } from './run-outcome.js';
|
|
186
|
-
import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal,
|
|
228
|
+
import { authorLimitationCountFromGoal, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
|
|
229
|
+
import { resolveEvidenceHeadCommit } from './evidence-command-budget.js';
|
|
187
230
|
import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
|
|
188
231
|
import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
|
|
189
232
|
|
|
@@ -257,7 +300,8 @@ import type { ClassifyShadowCallLLM } from './classify-shadow.js';
|
|
|
257
300
|
import { hasModuleLoadFailure, type GateTestFailure } from './gate-baseline.js';
|
|
258
301
|
import { commitWorktree, defaultBranchRef, preservationHasChanges } from './seams.js';
|
|
259
302
|
import { detectUncommittedWork } from './uncommitted-work.js';
|
|
260
|
-
import { spawnSync } from 'node:child_process';
|
|
303
|
+
import { execFile as execFileCallback, spawnSync } from 'node:child_process';
|
|
304
|
+
import { promisify } from 'node:util';
|
|
261
305
|
import { blockedDraftDisposition, blockedDraftTargetFor, decideDraftOnStop, nextMoveFor, parseDraftOnStopMode, repairSalvageLinkComment, salvageBranchForRun, syntheticRepairBasePr, type DraftOnStopMode } from './blocked-draft-policy.js';
|
|
262
306
|
import { formatLlmMergeOutcome } from '../autopilot/build/llm-conflict-merge.js';
|
|
263
307
|
import { FOUND_CITED_PATH_REFUTATION_QUOTE, MISSING_CITED_PATH_REFUTATION_QUOTE, MUST_FIX_REFUTATION_ACKNOWLEDGEMENT_WITH_REASON, REFUTATION_QUOTE_GRAMMAR, observeMustFixCitedPaths, parseMustFixRefutationAcknowledgement, parseMustFixRefutations, renderMustFixCitedPathFacts, snapshotMustFixFindings, stableMustFixId, type ReflectEvidenceFacts, type ReflectGateFacts, type MustFixCitedPathFact, type MustFixFinding, type MustFixRecurrenceHistory, type MustFixRefutation, type MustFixRefutationKind } from './reflect-mustfix.js';
|
|
@@ -281,6 +325,7 @@ import { appendGateWorktreeFreshnessEvidence, gateEvidenceNote } from '../harnes
|
|
|
281
325
|
import { diffHeaderPaths } from '../agent-substrate/self-review-cli.js';
|
|
282
326
|
import { format as formatPrComment, type PrCommentRole } from '../agent-substrate/pr-comment-meta.js';
|
|
283
327
|
import { changedFiles, commitTitles, type OpenPrOutcome, type SelfImplementCompletionDisposition } from './seams.js';
|
|
328
|
+
import { findUnwiredExports, gitBaseFileReader } from './wiring-check.js';
|
|
284
329
|
import {
|
|
285
330
|
classifyAbandonedRun,
|
|
286
331
|
isAbandonedClassificationOutcome,
|
|
@@ -1159,6 +1204,8 @@ export interface SelfImplementSeams {
|
|
|
1159
1204
|
/** Test seam for blocked environment branch persistence; return whether the branch was pushed. */
|
|
1160
1205
|
/** Test seam — the worktree commit to pin before main sync (default `git rev-parse HEAD`). */
|
|
1161
1206
|
headCommit?: (cwd: string) => string | undefined;
|
|
1207
|
+
/** Test seam for required evidence command execution; production uses its bounded shell runner. */
|
|
1208
|
+
evidenceCommandRunner?: (command: string, cwd: string) => Pick<ReturnType<typeof spawnSync>, 'status' | 'stdout' | 'stderr' | 'error'>;
|
|
1162
1209
|
/** `commit` pins the pushed state; without it the worktree HEAD is pushed. */
|
|
1163
1210
|
preserveBlockedBranch?: (ctx: { cwd: string; branch: string; title: string; commit?: string }) => boolean | Promise<boolean>;
|
|
1164
1211
|
/** DRAFT-NOT-ARCHIVE — `tools.selfImplement.draftOnStop` 읽기 seam. 생략하면 user-config(실패·부재 = 'always' · 종전). */
|
|
@@ -1173,6 +1220,10 @@ export interface SelfImplementSeams {
|
|
|
1173
1220
|
openPr: (opts: { title: string; body: string; head: string; base?: string; draft?: boolean; labels?: string[]; cwd: string; runId?: string }) => Promise<OpenPrOutcome>;
|
|
1174
1221
|
/** PR 생성 뒤 런의 라운드 대화를 게시한다. 실패는 PR 개설을 되돌리지 않는다. */
|
|
1175
1222
|
postPrComment?: (opts: { number: number; body: string; cwd: string }) => Promise<void>;
|
|
1223
|
+
/** Read-only body/state confirmation for the failed-run draft preservation marker. */
|
|
1224
|
+
readPrBodyForHarvest?: (opts: { number: number; cwd: string }) => Promise<{ body: string; state: string; isDraft: boolean } | undefined>;
|
|
1225
|
+
/** Update only the confirmed existing PR body; never creates a PR. */
|
|
1226
|
+
updatePrBodyForHarvest?: (opts: { number: number; body: string; cwd: string }) => Promise<void>;
|
|
1176
1227
|
/** Read and edit the single marked status comment; missing seams fall back to individual comments. */
|
|
1177
1228
|
findPrComment?: (opts: { number: number; marker: string; cwd: string; comments?: unknown }) => Promise<{ id: number; body: string } | undefined>;
|
|
1178
1229
|
editPrComment?: (opts: { id: number; body: string; cwd: string }) => Promise<void>;
|
|
@@ -2333,6 +2384,8 @@ export interface SelfImplementResult {
|
|
|
2333
2384
|
scopeExpansion?: ScopeExpansion;
|
|
2334
2385
|
/** Bounded names measured by the execution-scope guard on a held edit. */
|
|
2335
2386
|
outOfScopeEdits?: string[];
|
|
2387
|
+
/** SCOPE-ESCAPE-AS-REFINE: why the held edit stops (deletion · protected path · cap) — the parent stops only on these. */
|
|
2388
|
+
scopeStopReasons?: ScopeStopReason[];
|
|
2336
2389
|
nameCapReached?: boolean;
|
|
2337
2390
|
outsideCount?: number;
|
|
2338
2391
|
gate?: SelfImplementGateResult;
|
|
@@ -4394,6 +4447,50 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4394
4447
|
} finally {
|
|
4395
4448
|
if (loopRegistered) registerRunLoop('ended');
|
|
4396
4449
|
const terminalStage = terminalResult?.stage ?? 'crashed';
|
|
4450
|
+
// A blocked draft may be opened on the first failed attempt, before the
|
|
4451
|
+
// normal outcome observer has written its terminal status. Persist the
|
|
4452
|
+
// actual terminal result before exposing harvest-deferred on that PR.
|
|
4453
|
+
const terminalOutcome = terminalResult ? mapStageToRunStatus(terminalStage) : undefined;
|
|
4454
|
+
if (terminalOutcome?.runStatus === 'failed'
|
|
4455
|
+
&& loadRunLedger(runId)?.filter((entry) => entry.event === 'run-status').at(-1)?.data.runStatus !== 'failed') {
|
|
4456
|
+
observeOuter('run-status', {
|
|
4457
|
+
stage: terminalStage, node: terminalResult?.node ?? null, ...terminalOutcome,
|
|
4458
|
+
...(terminalResult?.reviewReflectRejectedCount !== undefined
|
|
4459
|
+
? { reviewReflectRejectedCount: terminalResult.reviewReflectRejectedCount }
|
|
4460
|
+
: {}),
|
|
4461
|
+
}, { level: 'warn' });
|
|
4462
|
+
}
|
|
4463
|
+
try {
|
|
4464
|
+
const runStatus = terminalOutcome?.runStatus;
|
|
4465
|
+
const prNumber = recordedPrNumber(terminalResult?.prNumber) ?? capturedPrNumber;
|
|
4466
|
+
// openPr is required on every seam (including production); it cannot
|
|
4467
|
+
// distinguish test PRs from real ones. The production adapter explicitly
|
|
4468
|
+
// supplies both body operations. A test replacing openPr without both
|
|
4469
|
+
// body operations must fail closed instead of touching a real PR.
|
|
4470
|
+
const readPrBody = opts.seams.readPrBodyForHarvest;
|
|
4471
|
+
const updatePrBody = opts.seams.updatePrBodyForHarvest;
|
|
4472
|
+
// The terminal observer must have persisted this run's failure before a
|
|
4473
|
+
// draft can advertise harvest deferral. Even an injected writer must
|
|
4474
|
+
// leave a matching record in the canonical ledger before mutation.
|
|
4475
|
+
const lastPersistedStatus = loadRunLedger(runId)?.filter((entry) => entry.event === 'run-status').at(-1)?.data.runStatus;
|
|
4476
|
+
const persistedFailure = runStatus === 'failed' && lastPersistedStatus === 'failed';
|
|
4477
|
+
if (persistedFailure && prNumber !== undefined && readPrBody && updatePrBody) {
|
|
4478
|
+
const existing = await readPrBody({ number: prNumber, cwd: worktreePath ?? process.cwd() });
|
|
4479
|
+
if (existing?.state === 'OPEN' && existing.isDraft === true) {
|
|
4480
|
+
const markedBody = markHarvestDeferredBody({ runStatus, prNumber, body: existing.body });
|
|
4481
|
+
if (markedBody !== undefined && markedBody !== existing.body) {
|
|
4482
|
+
await updatePrBody({ number: prNumber, body: markedBody, cwd: worktreePath ?? process.cwd() });
|
|
4483
|
+
observeOuter('harvest-deferred', { runStatus, prNumber, marker: HARVEST_DEFERRED_MARKER });
|
|
4484
|
+
}
|
|
4485
|
+
} else {
|
|
4486
|
+
observeOuter('harvest-deferred-skipped', { runStatus, prNumber, reason: 'existing-draft-not-confirmed' }, { level: 'warn' });
|
|
4487
|
+
}
|
|
4488
|
+
} else {
|
|
4489
|
+
observeOuter('harvest-deferred-skipped', { runStatus: runStatus ?? null, prNumber: prNumber ?? null, reason: 'status-pr-body-seam-unavailable' }, { level: 'warn' });
|
|
4490
|
+
}
|
|
4491
|
+
} catch (error) {
|
|
4492
|
+
logRunAwareFailSoft(runId, 'harvest-deferred-failed', { error: safeErrorDescription(error) });
|
|
4493
|
+
}
|
|
4397
4494
|
try {
|
|
4398
4495
|
const mappedStatus = mapStageToRunStatus(terminalStage)?.runStatus;
|
|
4399
4496
|
const reworkCapStop = terminalResult?.stage === 'pr-opened' && (
|
|
@@ -4741,7 +4838,7 @@ export function observeRunOutcome(
|
|
|
4741
4838
|
type RollupPrNumber = number | 'none' | 'unknown';
|
|
4742
4839
|
|
|
4743
4840
|
function recordedPrNumber(value: unknown): number | undefined {
|
|
4744
|
-
return typeof value === 'number' && Number.
|
|
4841
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 ? value : undefined;
|
|
4745
4842
|
}
|
|
4746
4843
|
|
|
4747
4844
|
function rollupPrNumber(
|
|
@@ -4869,7 +4966,7 @@ async function runSelfImplementInner(
|
|
|
4869
4966
|
const { graphVersionHash } = await import('./graph-yaml.js');
|
|
4870
4967
|
const { applyGraphOverlays } = await import('./graph-overlay-yaml.js');
|
|
4871
4968
|
const { createGraphVariant } = await import('./graph-variant.js');
|
|
4872
|
-
const {
|
|
4969
|
+
const { saveRunGraphVariant, loadRunGraphVariant } = await import('./run-ledger.js');
|
|
4873
4970
|
const { stringify } = await import('yaml');
|
|
4874
4971
|
const baseSpec = GRAPH_SPECS[graphTemplate.graphId];
|
|
4875
4972
|
const variantRunId = identity?.runId ?? opts.runId;
|
|
@@ -4881,16 +4978,16 @@ async function runSelfImplementInner(
|
|
|
4881
4978
|
: undefined;
|
|
4882
4979
|
if (launch && !launch.ok) throw new Error(`graph variant rejected: ${JSON.stringify(launch.rejections)}`);
|
|
4883
4980
|
const sourceSpec = launch?.ok ? launch.template : baseSpec;
|
|
4884
|
-
|
|
4981
|
+
// ⭐ 최초 변형 선택 — 골 종류(graphGoalType)·대상 경로 수(declaredPremiseScopePaths) 두 입력만으로
|
|
4982
|
+
// 결정론적으로 id·선택 이유를 유도해 검증 결과에 싣는다(종류를 못 읽었으면 지어내지 않는다).
|
|
4983
|
+
const variant = createGraphVariant({ template: sourceSpec, goal: `g_${variantRunId.replace(/[^a-z0-9_-]/gi, '_')}`, plan: opts.graphVariantPlan,
|
|
4984
|
+
...(graphGoalType === undefined ? {} : { goalAnalysis: { goalType: graphGoalType, targetPathCount: declaredPremiseScopePaths(opts.feature).length } }) });
|
|
4885
4985
|
if (!variant.ok) throw new Error(`graph variant rejected: ${JSON.stringify(variant.rejections)}`);
|
|
4886
4986
|
variantSpec = variant.template;
|
|
4887
4987
|
graphTemplate = { ...specToTemplate(variantSpec), version: graphVersionHash(variantSpec) };
|
|
4888
|
-
const
|
|
4889
|
-
const graphFile = `${runLedgerPath(variantRunId)}.graph.yaml`;
|
|
4890
|
-
mkdirSync(runLedgerDir(), { recursive: true });
|
|
4891
|
-
const { writeFileSync } = await import('node:fs');
|
|
4892
|
-
writeFileSync(graphFile, stringify({
|
|
4988
|
+
const graphFile = saveRunGraphVariant(variantRunId, stringify({
|
|
4893
4989
|
graph_id: variantSpec.graphId, version: variantSpec.version,
|
|
4990
|
+
...(variant.selection === undefined ? {} : { variant_id: variant.selection.variantId, reason: variant.selection.reason }),
|
|
4894
4991
|
entry_node: variantSpec.entryNode, terminal_nodes: variantSpec.terminalNodes,
|
|
4895
4992
|
...(variantSpec.journeyStages ? { journey_stages: variantSpec.journeyStages } : {}),
|
|
4896
4993
|
...(variantSpec.runContract ? { run_contract: variantSpec.runContract } : {}),
|
|
@@ -4900,6 +4997,9 @@ async function runSelfImplementInner(
|
|
|
4900
4997
|
...(n.progress ? { progress: n.progress } : {}), ...(n.phases ? { phases: n.phases } : {}),
|
|
4901
4998
|
...(n.terminalStages ? { terminal_stages: n.terminalStages } : {}),
|
|
4902
4999
|
...(n.fanOut ? { fan_out: n.fanOut } : {}), ...(n.contract ? { contract: n.contract } : {}),
|
|
5000
|
+
...(n.call ? { call: n.call } : {}),
|
|
5001
|
+
...(n.callEntry ? { call_entry: n.callEntry } : {}),
|
|
5002
|
+
...(n.budget ? { budget: { inner_steps: n.budget.innerSteps } } : {}),
|
|
4903
5003
|
...(n.skipWhen ? { skip_when: n.skipWhen } : {}),
|
|
4904
5004
|
})),
|
|
4905
5005
|
edges: variantSpec.edges.map(e => ({
|
|
@@ -4908,9 +5008,17 @@ async function runSelfImplementInner(
|
|
|
4908
5008
|
...(e.observed === undefined ? {} : { observed: e.observed }),
|
|
4909
5009
|
...(e.when ? { when: e.when } : {}),
|
|
4910
5010
|
})),
|
|
4911
|
-
})
|
|
5011
|
+
}));
|
|
5012
|
+
// ⭐ 저장·diff — 방금 원장 옆에 쓴 선택(id·이유)을 다시 읽어 «같은지» 확인한다(다르면 이 런의 그래프 신원이 거짓).
|
|
5013
|
+
if (variant.selection !== undefined) {
|
|
5014
|
+
const persisted = loadRunGraphVariant(variantRunId);
|
|
5015
|
+
if (persisted === null || persisted.variantId !== variant.selection.variantId || persisted.reason !== variant.selection.reason) {
|
|
5016
|
+
throw new Error(`graph variant rejected: persisted selection mismatch: ${JSON.stringify(persisted)}`);
|
|
5017
|
+
}
|
|
5018
|
+
}
|
|
4912
5019
|
observe('graph-variant-applied', { graphId: variant.template.graphId, overlayId: variant.overlay.overlayId,
|
|
4913
|
-
graphFile, patches: variant.patches
|
|
5020
|
+
graphFile, patches: variant.patches,
|
|
5021
|
+
...(variant.selection === undefined ? {} : { variantId: variant.selection.variantId, variantReason: variant.selection.reason }) });
|
|
4914
5022
|
}
|
|
4915
5023
|
/** 단계 이름 → 그 템플릿의 노드 이름. */
|
|
4916
5024
|
const node = (stage: PipelineNodeId): PipelineNodeId => nodeNameForStage(stage, graphTemplate) as PipelineNodeId;
|
|
@@ -5091,6 +5199,14 @@ async function runSelfImplementInner(
|
|
|
5091
5199
|
...goalContext,
|
|
5092
5200
|
}), T.worktree, 'worktree');
|
|
5093
5201
|
onWorktreeCreated(wt.path);
|
|
5202
|
+
// Capture the child worktree's HEAD at creation. `wt.invokedHead` names the
|
|
5203
|
+
// caller checkout and may differ after base selection or PR-source checkout.
|
|
5204
|
+
const terminalLaunchHeadRead = runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 });
|
|
5205
|
+
const terminalLaunchHeadCandidate = terminalLaunchHeadRead.status === 0 ? terminalLaunchHeadRead.stdout.trim() : '';
|
|
5206
|
+
const terminalLaunchHead = /^[0-9a-f]{40,64}$/i.test(terminalLaunchHeadCandidate) ? terminalLaunchHeadCandidate : undefined;
|
|
5207
|
+
const terminalLaunchWork = detectUncommittedWork(wt.path);
|
|
5208
|
+
const terminalLaunchDirtyPaths = terminalLaunchWork.status === 'unavailable' ? undefined
|
|
5209
|
+
: new Set([...terminalLaunchWork.trackedChanges, ...terminalLaunchWork.untrackedFiles]);
|
|
5094
5210
|
// ⭐ 제1원칙 — **어디서 갈랐나**를 관측에 남긴다. 이것이 없어서 2026-07-29 에 하니스 런 둘이
|
|
5095
5211
|
// `main` 위에서 돌았고(호출자가 브랜치 워크트리에서 발사했는데도) 산출 diff 를 눈으로 봐야 알았다.
|
|
5096
5212
|
// ⚠️ `branch` 는 **새로 만든 브랜치 이름**이라 그 질문에 답하지 않는다.
|
|
@@ -5104,6 +5220,8 @@ async function runSelfImplementInner(
|
|
|
5104
5220
|
observe('worktree', {
|
|
5105
5221
|
path: wt.path,
|
|
5106
5222
|
branch: wt.branch,
|
|
5223
|
+
terminalLaunchHead: terminalLaunchHead ?? null,
|
|
5224
|
+
terminalLaunchDirtyPaths: terminalLaunchDirtyPaths ? [...terminalLaunchDirtyPaths] : null,
|
|
5107
5225
|
// ⭐ 우리가 **무엇을 요청했는지는 이미 안다** — 시임 반환에서 되읽지 않는다.
|
|
5108
5226
|
// 커스텀 시임이 관측 필드를 생략하면 명시/생략이 둘 다 null 이 되어 구분이 사라진다(리뷰 must-fix).
|
|
5109
5227
|
requestedBase,
|
|
@@ -5635,6 +5753,9 @@ async function runSelfImplementInner(
|
|
|
5635
5753
|
};
|
|
5636
5754
|
}
|
|
5637
5755
|
let round = 0;
|
|
5756
|
+
// A timeout is evidence about this command, not an invitation to spend the
|
|
5757
|
+
// next rework round on the identical oversized check.
|
|
5758
|
+
const runBudgetedEvidenceChecks = createRequiredEvidenceBudget({ run: s.evidenceCommandRunner });
|
|
5638
5759
|
// A goal-only retry spends its one allowance for this run even if a later
|
|
5639
5760
|
// gate/review round removes the target diff and reaches the same disposition.
|
|
5640
5761
|
let goalOnlyReworkUsed = false;
|
|
@@ -6172,6 +6293,9 @@ async function runSelfImplementInner(
|
|
|
6172
6293
|
: `중단 산출물의 draft PR 생성 실패(worktree·branch 보존 · 판정 본문 보존 실패: ${artifactError ?? 'unknown error'})`);
|
|
6173
6294
|
return undefined;
|
|
6174
6295
|
}
|
|
6296
|
+
// The production draft sweep resolves run ownership from pr-opened, not
|
|
6297
|
+
// from the blocked-draft diagnostic event. Bind this PR to the same run.
|
|
6298
|
+
observe('pr-opened', { url: pr.url, number: pr.number, branch: wt.branch, draft: true });
|
|
6175
6299
|
observe('rework-blocked-draft-pr', {
|
|
6176
6300
|
...observation,
|
|
6177
6301
|
url: pr.url,
|
|
@@ -6441,7 +6565,7 @@ async function runSelfImplementInner(
|
|
|
6441
6565
|
const predictionAccuracyBefore = supervisorDecisionHistory.length
|
|
6442
6566
|
? judgePredictionAccuracy(supervisorDecisionHistory)
|
|
6443
6567
|
: undefined;
|
|
6444
|
-
diagnosis = await withStepTimeout(s.diagnose({ runId, note: reworkJudgeNote, kind: reworkKind, round, cwd: wt.path, goal:
|
|
6568
|
+
diagnosis = await withStepTimeout(s.diagnose({ runId, note: reworkJudgeNote, kind: reworkKind, round, cwd: wt.path, goal: roundGoal, history: priorHistory, supervisorDecisionHistory, ...(predictionAccuracyBefore ? { judgePredictionAccuracy: predictionAccuracyBefore } : {}), effectiveMax, priorRuns, reviewFindingTelemetry: reviewFindingTelemetrySnapshot, ...(diagnosisRefutations ? { refutations: diagnosisRefutations.refutations, refutationRound: diagnosisRefutations.round } : {}), purpose: 'budget' }), T.review, 'review');
|
|
6445
6569
|
const diagnosedDecision = parseReworkBudgetDecision(diagnosis);
|
|
6446
6570
|
if (diagnosedDecision?.verdict === 'CONTRACT-CONFLICT') lastSupervisorVerdict = diagnosedDecision.verdict;
|
|
6447
6571
|
let parsedDecision = diagnosedDecision;
|
|
@@ -6885,7 +7009,7 @@ async function runSelfImplementInner(
|
|
|
6885
7009
|
if (escalationEligible && s.diagnose) {
|
|
6886
7010
|
try {
|
|
6887
7011
|
escalationJudgement = await withStepTimeout(s.diagnose({
|
|
6888
|
-
runId, note: reworkNote, kind: reworkKind, round, cwd: wt.path, goal:
|
|
7012
|
+
runId, note: reworkNote, kind: reworkKind, round, cwd: wt.path, goal: roundGoal,
|
|
6889
7013
|
history: reworkHistory.slice(0, -1), supervisorDecisionHistory, effectiveMax,
|
|
6890
7014
|
purpose: 'escalation-triage',
|
|
6891
7015
|
}), T.review, 'review');
|
|
@@ -6906,7 +7030,9 @@ async function runSelfImplementInner(
|
|
|
6906
7030
|
const firstRound = roundSummaryEntries.at(-1);
|
|
6907
7031
|
const refined = await (await import('./goal-refine.js')).runFirstRoundRefine({
|
|
6908
7032
|
goal: opts.feature, round, visit: goalRefineVisits, callLLM: s.elaborateCallLLM, observe,
|
|
6909
|
-
|
|
7033
|
+
// SCOPE-ESCAPE-AS-REFINE — accepted out-of-scope edits are the «new scope» the first implementation found.
|
|
7034
|
+
evidence: { implSummary: firstRound?.tried, findings: reworkNote, changedFiles: firstRound?.filesTouched,
|
|
7035
|
+
...(scopeExpansion?.files.length ? { newScope: scopeExpansion.files.map((file) => file.path) } : {}) },
|
|
6910
7036
|
});
|
|
6911
7037
|
roundGoal = refined.goal;
|
|
6912
7038
|
// PR «골 변경» 절 — 유지(kept · no-provider 포함)여도 «시도 · v1 유지 · 사유» 한 줄을 싣는다(리뷰 r2).
|
|
@@ -7136,6 +7262,45 @@ async function runSelfImplementInner(
|
|
|
7136
7262
|
}
|
|
7137
7263
|
}
|
|
7138
7264
|
}
|
|
7265
|
+
// The child can report changed=false after committing its edits. Compare
|
|
7266
|
+
// against the worktree HEAD captured at creation, not the caller's HEAD or
|
|
7267
|
+
// origin/main: a PR source already had a diff before the child ran.
|
|
7268
|
+
if (!impl.ok && impl.completionDisposition === 'completed-without-changes'
|
|
7269
|
+
&& impl.terminalStatus?.reached === true && impl.terminalStatus.timedOut === false
|
|
7270
|
+
&& !hasCurrentProviderError() && !hasCurrentCredentialFailure()) {
|
|
7271
|
+
const committed = terminalLaunchHead
|
|
7272
|
+
? runGitCommand(wt.path, ['diff', '--name-only', '-z', terminalLaunchHead, 'HEAD'], { encoding: 'utf8', timeout: 10_000 })
|
|
7273
|
+
: undefined;
|
|
7274
|
+
const pending = detectUncommittedWork(wt.path);
|
|
7275
|
+
const observedFiles = committed?.status === 0 && pending.status !== 'unavailable'
|
|
7276
|
+
? [...new Set([
|
|
7277
|
+
...committed.stdout.split('\0').filter(Boolean),
|
|
7278
|
+
...pending.trackedChanges, ...pending.untrackedFiles,
|
|
7279
|
+
])]
|
|
7280
|
+
: [];
|
|
7281
|
+
if (!terminalLaunchHead || terminalLaunchDirtyPaths === undefined || committed?.status !== 0 || pending.status === 'unavailable') {
|
|
7282
|
+
observe('terminal-change-evidence', { round, status: 'unmeasured',
|
|
7283
|
+
reason: !terminalLaunchHead ? 'launch-head-unavailable' : terminalLaunchDirtyPaths === undefined
|
|
7284
|
+
? 'launch-status-unavailable' : committed?.status !== 0 ? 'git-diff-unavailable' : 'git-status-unavailable' }, { level: 'warn' });
|
|
7285
|
+
}
|
|
7286
|
+
// A PR-source worktree may be dirty before this child starts. A path
|
|
7287
|
+
// already dirty at launch cannot prove this child's edits from names
|
|
7288
|
+
// alone, even if the child later commits it. Leave that path unmeasured.
|
|
7289
|
+
const implementationFiles = terminalLaunchDirtyPaths === undefined ? [] : observedFiles.filter(path =>
|
|
7290
|
+
!terminalLaunchDirtyPaths.has(path) && !harnessSeededPaths.includes(path) && !isHarnessTempArtifact(path));
|
|
7291
|
+
const preexistingDirtyPaths = terminalLaunchDirtyPaths === undefined ? [] : observedFiles.filter(path =>
|
|
7292
|
+
terminalLaunchDirtyPaths.has(path) && !harnessSeededPaths.includes(path) && !isHarnessTempArtifact(path));
|
|
7293
|
+
if (preexistingDirtyPaths.length > 0) observe('terminal-change-evidence', {
|
|
7294
|
+
round, status: 'unmeasured', reason: 'preexisting-dirty-path', paths: preexistingDirtyPaths,
|
|
7295
|
+
}, { level: 'warn' });
|
|
7296
|
+
if (implementationFiles.length > 0) {
|
|
7297
|
+
observe('terminal-change-reconciled', {
|
|
7298
|
+
round, source: 'post-launch-git-diff', launchHead: terminalLaunchHead, childDisposition: impl.completionDisposition,
|
|
7299
|
+
paths: implementationFiles, pathCount: implementationFiles.length,
|
|
7300
|
+
});
|
|
7301
|
+
impl = { ...impl, ok: true, completionDisposition: undefined };
|
|
7302
|
+
}
|
|
7303
|
+
}
|
|
7139
7304
|
// A finished child can leave edits without a commit. Measure them before any
|
|
7140
7305
|
// diff/no-changes classification, and commit only paths declared in the goal.
|
|
7141
7306
|
finishedChildCommitMissing = false;
|
|
@@ -7241,7 +7406,13 @@ async function runSelfImplementInner(
|
|
|
7241
7406
|
// E3 — refine 뒤 라운드는 «현재 골»(v2)로 증거를 센다(REQUIRED EVIDENCE 절은 고정 칸이라 v1 과 같다).
|
|
7242
7407
|
const requiredEvidence = requiredEvidenceFromGoal(roundGoal);
|
|
7243
7408
|
const limitationCount = authorLimitationCountFromGoal(roundGoal);
|
|
7244
|
-
const
|
|
7409
|
+
const evidenceHead = resolveEvidenceHeadCommit(s.headCommit?.(wt.path), () =>
|
|
7410
|
+
runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 }).stdout.trim());
|
|
7411
|
+
if (!evidenceHead) {
|
|
7412
|
+
try { debug.log('self-implement.evidence', 'command-budget-head-unresolved', { runId, round, cwd: wt.path }); }
|
|
7413
|
+
catch { /* observation is fail-soft */ }
|
|
7414
|
+
}
|
|
7415
|
+
const evidenceChecks = runBudgetedEvidenceChecks(roundGoal, wt.path, runId, evidenceHead);
|
|
7245
7416
|
const tagCoverage = coverRequiredEvidence(requiredEvidence, offDiffEvidence.items);
|
|
7246
7417
|
// EVIDENCE-WIRING-EXEMPT — a requirement whose own `|| bun test …` check passed is covered by what the harness measured.
|
|
7247
7418
|
const settledByCheck = settleUncoveredEvidence(tagCoverage.uncovered, { checks: evidenceChecks, required: requiredEvidence });
|
|
@@ -7387,7 +7558,7 @@ async function runSelfImplementInner(
|
|
|
7387
7558
|
files: decision.expansion.files });
|
|
7388
7559
|
if ('parked' in result) progress('parked', `critical 질문 ${result.questionId} 미응답 — 이 런만 대기`);
|
|
7389
7560
|
return { ok: false, stage: 'parked' in result ? 'parked' : 'soft-stopped', node: 'implement', ...resolveRunOutcome({ termination: 'abandoned' }), sessionId, worktreePath: wt.path, branch: wt.branch,
|
|
7390
|
-
outOfScopeEdits, nameCapReached: scope.nameCapReached, outsideCount: scope.outsideCount,
|
|
7561
|
+
outOfScopeEdits, ...(!decision.accept ? { scopeStopReasons: decision.reasons } : {}), nameCapReached: scope.nameCapReached, outsideCount: scope.outsideCount,
|
|
7391
7562
|
detail: 'parked' in result ? `critical-unanswered: ${result.questionId}` : 'Out-of-scope edits held in the worktree; gate and publication skipped.' };
|
|
7392
7563
|
}
|
|
7393
7564
|
}
|
|
@@ -7684,6 +7855,33 @@ async function runSelfImplementInner(
|
|
|
7684
7855
|
if (untracked.status === 0) untrackedFiles = untracked.stdout.split(/\r?\n/).filter(Boolean);
|
|
7685
7856
|
} catch { /* change discovery must not stop review */ }
|
|
7686
7857
|
}
|
|
7858
|
+
// Gate has passed. Measure newly exported runtime values before review, without
|
|
7859
|
+
// turning a static-analysis guess into a rework verdict during the first rollout.
|
|
7860
|
+
const wiringFiles = [...new Set([...(runFacts.changedFiles ?? []), ...(gateRouteFiles ?? []), ...untrackedFiles])];
|
|
7861
|
+
if (wiringFiles.some((file) => /^(?:src|scripts|apps\/pwa\/src)\/.*\.tsx?$/.test(file))) {
|
|
7862
|
+
const wiringBase = wt.resolvedBase;
|
|
7863
|
+
const wiring = wiringBase && /^[0-9a-f]{40}$/i.test(wiringBase)
|
|
7864
|
+
? findUnwiredExports({
|
|
7865
|
+
cwd: wt.path,
|
|
7866
|
+
changedFiles: wiringFiles,
|
|
7867
|
+
// Timeouts and git errors throw → recorded as `failure`, never as "absent at base".
|
|
7868
|
+
readBaseFile: gitBaseFileReader(
|
|
7869
|
+
(args) => runGitCommand(wt.path, args, { encoding: 'utf8', timeout: 10_000 }),
|
|
7870
|
+
wiringBase,
|
|
7871
|
+
),
|
|
7872
|
+
})
|
|
7873
|
+
: { checked: 0, unwired: [], failure: 'resolved-base-unavailable' };
|
|
7874
|
+
const wiringObservation = {
|
|
7875
|
+
round,
|
|
7876
|
+
checked: wiring.checked,
|
|
7877
|
+
unwired: wiring.unwired.length,
|
|
7878
|
+
examples: wiring.unwired.slice(0, 10),
|
|
7879
|
+
...(wiring.failure ? { failure: wiring.failure } : {}),
|
|
7880
|
+
mode: 'warn',
|
|
7881
|
+
};
|
|
7882
|
+
debug.log('self-implement.wiring-check', wiring.failure ? 'unmeasured' : 'measured', wiringObservation);
|
|
7883
|
+
observe('wiring-check', wiringObservation, wiring.failure || wiring.unwired.length ? { level: 'warn' } : {});
|
|
7884
|
+
}
|
|
7687
7885
|
if ([...(runFacts.changedFiles ?? []), ...(gateRouteFiles ?? []), ...untrackedFiles].some((file) => /\.(?:html|css)$/i.test(file))) {
|
|
7688
7886
|
try {
|
|
7689
7887
|
designGate = (s.runDesignGate ?? runDesignGate)({ projectDir: wt.path, base: wt.resolvedBase });
|
|
@@ -8044,10 +8242,13 @@ async function runSelfImplementInner(
|
|
|
8044
8242
|
// (모집단 0인데 distinguishes=1) 틀린 값으로 막으면 새 병목이 된다.
|
|
8045
8243
|
// ⛔ `ran === false`(skipped)는 «다른 것»이다 — 자식이 테스트를 안 건드린 경우이고
|
|
8046
8244
|
// 그건 `skippedReason` 이 이미 가른다. 그래서 여기 조건에 넣지 않는다.
|
|
8047
|
-
|
|
8048
|
-
|
|
8245
|
+
// A new test absent from the fixed base is a structural RED witness when the
|
|
8246
|
+
// head gate passed. Keep that distinct from an executed test that proved nothing.
|
|
8247
|
+
const verifyStructuralRed = gate.verifyByBreaking?.ran === true && (gate.verifyByBreaking.missingAtBase ?? 0) > 0;
|
|
8248
|
+
const verifyInconclusive = gate.verifyByBreaking?.ran === true
|
|
8249
|
+
&& (gate.verifyByBreaking.distinguishes ?? 0) === 0 && !verifyStructuralRed;
|
|
8049
8250
|
let mergeReason = canAuto && reviewDeferredToHost ? REVIEW_DEFERRED_TO_HOST_MERGE_REASON
|
|
8050
|
-
: canAuto ? (
|
|
8251
|
+
: canAuto ? (verifyStructuralRed ? 'review-clean-verify-structural-red' : verifyInconclusive ? 'review-clean-verify-inconclusive' : 'review-clean-armed')
|
|
8051
8252
|
: gateTimeoutUnmeasured ? GATE_TIMEOUT_UNMEASURED_MERGE_REASON
|
|
8052
8253
|
: !autoMerge ? 'no-auto-flag'
|
|
8053
8254
|
: requiredEvidenceMissing ? 'required-evidence-uncovered'
|
|
@@ -29,7 +29,7 @@ function sourceFiles(cwd: string): string[] {
|
|
|
29
29
|
const IMPORT_SPECIFIER = /\b(?:import|export)\s+(?:[^;'"]*?\s+from\s*)?['"](\.[^'"]+)['"]|\bimport\s*\(\s*['"](\.[^'"]+)['"]\s*\)/g;
|
|
30
30
|
|
|
31
31
|
/** Repo-relative file candidates a relative import specifier (already joined to its importer's directory) can resolve to. */
|
|
32
|
-
function importCandidates(base: string): string[] {
|
|
32
|
+
export function importCandidates(base: string): string[] {
|
|
33
33
|
return /\.js$/.test(base)
|
|
34
34
|
// A real .js file wins over a same-named .ts source (the actual resolution order).
|
|
35
35
|
? [base, base.replace(/\.js$/, '.ts'), base.replace(/\.js$/, '.tsx'), `${base.slice(0, -3)}/index.ts`, `${base.slice(0, -3)}/index.tsx`, `${base.slice(0, -3)}/index.js`]
|
|
@@ -316,6 +316,36 @@ export function parseReworkBudgetDecision(response: string | undefined): ReworkB
|
|
|
316
316
|
return verdict && reason ? { verdict, reason } : undefined;
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
+
/** TDD-SUPERVISOR-IMPOSSIBLE-EVIDENCE — «구조적으로 불가능한 증거 요구» 표지.
|
|
320
|
+
* base 에 없는 신규 파일·모듈의 시험은 base 에서 실패할 수 없다(missing-at-base). 그 «적색 증인 없음 · unproved» 지적이
|
|
321
|
+
* 라운드마다 반복돼도 구현이 고칠 수 있는 결함이 아니다 — 10-22 #30254 가 이 반복으로 UNCONVERGEABLE 에 버려졌다. */
|
|
322
|
+
const IMPOSSIBLE_EVIDENCE_MARKERS: readonly { readonly id: string; readonly re: RegExp }[] = [
|
|
323
|
+
{ id: 'missing-at-base', re: /missing-at-base/i },
|
|
324
|
+
{ id: 'changed-test-unproved', re: /\[changed-test-evidence\][^\n]*verdict=unproved/i },
|
|
325
|
+
{ id: 'base-fail-zero', re: /base-fail=0\/[1-9]/i },
|
|
326
|
+
{ id: 'base-absent-new-module', re: /(베이스|base)\s*에\s*(없는|부재)[^\n]{0,40}(신규|새)[^\n]{0,20}(모듈|파일)|(신규|새)\s*(모듈|파일)[^\n]{0,40}(베이스|base)\s*에\s*(없|부재)/i },
|
|
327
|
+
{ id: 'no-red-witness', re: /적색\s*증인\s*(없|부재)|red witness/i },
|
|
328
|
+
];
|
|
329
|
+
|
|
330
|
+
export interface ImpossibleEvidenceReclassification {
|
|
331
|
+
readonly response: string;
|
|
332
|
+
readonly applied: boolean;
|
|
333
|
+
readonly markers: readonly string[];
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** 감독이 UNCONVERGEABLE 을 냈는데 현재 지적이 «불가능한 증거 요구» 표지를 담으면 CONTRACT-CONFLICT 로 바꾼다.
|
|
337
|
+
* 다음 라운드는 그 요구가 불가능하다는 계획 수정(이유)을 들고 계속한다(런을 버리지 않는다). 다른 판정·표지 없는 지적은 그대로. */
|
|
338
|
+
export function reclassifyImpossibleEvidence(response: string, note: string): ImpossibleEvidenceReclassification {
|
|
339
|
+
const decision = parseReworkBudgetDecision(response);
|
|
340
|
+
if (decision?.verdict !== 'UNCONVERGEABLE') return { response, applied: false, markers: [] };
|
|
341
|
+
const markers = IMPOSSIBLE_EVIDENCE_MARKERS.filter(({ re }) => re.test(note)).map(({ id }) => id);
|
|
342
|
+
if (markers.length === 0) return { response, applied: false, markers };
|
|
343
|
+
const lines = response.split(/\r?\n/);
|
|
344
|
+
lines[0] = 'BUDGET: CONTRACT-CONFLICT';
|
|
345
|
+
lines[1] = `REASON: 구조적으로 불가능한 증거 요구(${markers.join('·')}) — base 에 없는 신규 파일은 base 에서 실패할 수 없으니 같은 지적 반복으로 세지 않는다 · 감독 원판정: ${decision.reason}`;
|
|
346
|
+
return { response: lines.join('\n'), applied: true, markers };
|
|
347
|
+
}
|
|
348
|
+
|
|
319
349
|
/** Optional structured contract-conflict payload. Missing or partial fields deliberately remain legacy-compatible. */
|
|
320
350
|
export function parseContractConflictRelaxation(response: string | undefined): ContractConflictRelaxation | undefined {
|
|
321
351
|
const fields = new Map<string, string[]>();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
3
4
|
import { refuseProductionLedgerWriteInTest } from '../harness/ledger-write-guard.js';
|
|
4
5
|
import { tracedPathReferences, verbatimOriginalAsk } from './goal-author.js';
|
|
5
6
|
import { parseAskTargetPathHintsResult } from '../self-dev/launch-preflight-text.js';
|
|
@@ -408,6 +409,49 @@ export function describeFederatedMissingRunLedger(runId: string, options: Federa
|
|
|
408
409
|
};
|
|
409
410
|
}
|
|
410
411
|
|
|
412
|
+
/** 런 원장 옆 `.graph.yaml` 경로 — 원장 경로 계약(runLedgerPath)에서 파생한다. */
|
|
413
|
+
export function runGraphVariantPath(runId: string, dir = runLedgerDir()): string {
|
|
414
|
+
return `${runLedgerPath(runId, dir)}.graph.yaml`;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/** 최초 graph variant 선택의 원장 옆 재조회 계약 — 같은 runId·파일이면 같은 id·선택 이유가 돌아온다. */
|
|
418
|
+
export interface RunGraphVariantSelection {
|
|
419
|
+
/** createGraphVariant 가 골 종류·대상 경로 수에서 유도한 최초 variant id. */
|
|
420
|
+
readonly variantId: string;
|
|
421
|
+
/** 그 variant가 최초로 선택된 근거(종류·경로 수 기반) — 저장·재조회가 같은 문자열. */
|
|
422
|
+
readonly reason: string;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/** 런 원장 옆 .graph.yaml 을 처음 한 번 쓰고 저장 경로를 돌려준다 — 이미 있으면 덮쓰지 않는다(flag wx). */
|
|
426
|
+
export function saveRunGraphVariant(runId: string, yamlText: string, dir = runLedgerDir()): string {
|
|
427
|
+
mkdirSync(dir, { recursive: true });
|
|
428
|
+
const path = runGraphVariantPath(runId, dir);
|
|
429
|
+
writeFileSync(path, yamlText, { flag: 'wx' });
|
|
430
|
+
return path;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/** 런 원장 옆 .graph.yaml 에서 최초 graph variant 선택(id·이유)을 재조회한다 — 파일·선택이 없으면 null. */
|
|
434
|
+
export function loadRunGraphVariant(runId: string, dir = runLedgerDir()): RunGraphVariantSelection | null {
|
|
435
|
+
const path = runGraphVariantPath(runId, dir);
|
|
436
|
+
let text: string;
|
|
437
|
+
try {
|
|
438
|
+
text = readFileSync(path, 'utf8');
|
|
439
|
+
} catch (error) {
|
|
440
|
+
if ((error as NodeJS.ErrnoException).code === 'ENOENT') return null;
|
|
441
|
+
throw new Error(`unable to read run graph variant ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
442
|
+
}
|
|
443
|
+
let parsed: unknown;
|
|
444
|
+
try {
|
|
445
|
+
parsed = parseYaml(text);
|
|
446
|
+
} catch (error) {
|
|
447
|
+
throw new Error(`invalid run graph variant YAML at ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
448
|
+
}
|
|
449
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null;
|
|
450
|
+
const record = parsed as { variant_id?: unknown; reason?: unknown };
|
|
451
|
+
if (typeof record.variant_id !== 'string' || typeof record.reason !== 'string') return null;
|
|
452
|
+
return { variantId: record.variant_id, reason: record.reason };
|
|
453
|
+
}
|
|
454
|
+
|
|
411
455
|
/** Append one observer event. Callers own fail-soft handling. */
|
|
412
456
|
export function appendRunLedgerEntry(entry: RunLedgerEntry, dir = runLedgerDir()): void {
|
|
413
457
|
if (refuseProductionLedgerWriteInTest(dir, 'run-ledger')) return;
|
|
@@ -423,6 +467,70 @@ export function appendRunLedgerEntry(entry: RunLedgerEntry, dir = runLedgerDir()
|
|
|
423
467
|
});
|
|
424
468
|
}
|
|
425
469
|
|
|
470
|
+
/** Caller decision inside `appendRunLedgerEntryChecked`: either `append` exactly one entry, or skip with `result`. */
|
|
471
|
+
export type RunLedgerCheckedAppendDecision<T> =
|
|
472
|
+
| { append: false; result: T }
|
|
473
|
+
| { append: true; entry: RunLedgerEntry };
|
|
474
|
+
|
|
475
|
+
export interface RunLedgerCheckedAppendOutcome<T> {
|
|
476
|
+
appended: boolean;
|
|
477
|
+
result: T | null;
|
|
478
|
+
/** Named reason when `appended:false` was produced without calling the decision — e.g. a test-universe refusal of an operating-ledger write. */
|
|
479
|
+
refusal: 'ledger-write-refused' | null;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Thrown (typed, with the stable `runId-mismatch` reason) when a checked-append
|
|
484
|
+
* decision returns an entry whose `runId` differs from the locked `runId`. Callers
|
|
485
|
+
* classify identity violations from `error.reason === 'runId-mismatch'` instead of
|
|
486
|
+
* parsing message substrings.
|
|
487
|
+
*/
|
|
488
|
+
export class RunLedgerCheckedAppendRunIdMismatchError extends Error {
|
|
489
|
+
readonly reason = 'runId-mismatch' as const;
|
|
490
|
+
constructor(readonly decisionRunId: string, readonly lockedRunId: string) {
|
|
491
|
+
super(
|
|
492
|
+
`runId-mismatch: appendRunLedgerEntryChecked: decision entry runId ${JSON.stringify(decisionRunId)} does not match locked runId ${JSON.stringify(lockedRunId)}`,
|
|
493
|
+
);
|
|
494
|
+
this.name = 'RunLedgerCheckedAppendRunIdMismatchError';
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Atomically decide-and-append under a single per-run lock: the caller-supplied
|
|
500
|
+
* decision runs on the loaded ledger inside `withRunLedgerLock`, and at most one
|
|
501
|
+
* append is written by the same lock. Never calls `appendRunLedgerEntry` inside
|
|
502
|
+
* the lock (that function acquires the same lock itself, so nesting it would
|
|
503
|
+
* time out). Preserves the archived-ledger restore contract exactly like
|
|
504
|
+
* `appendRunLedgerEntry`. A missing ledger yields `null` entries to the
|
|
505
|
+
* decision (which may throw); a corrupt ledger throws before any append.
|
|
506
|
+
* Test-universe writes are refused before any lock directory or ledger path is created.
|
|
507
|
+
* The caller-supplied entry must carry the same `runId` as the acquired lock — on mismatch,
|
|
508
|
+
* the lock is released and a runId mismatch error is thrown before any append or archive restore.
|
|
509
|
+
*/
|
|
510
|
+
export function appendRunLedgerEntryChecked<T>(
|
|
511
|
+
runId: string,
|
|
512
|
+
decide: (entries: RunLedgerEntry[] | null) => RunLedgerCheckedAppendDecision<T>,
|
|
513
|
+
dir = runLedgerDir(),
|
|
514
|
+
): RunLedgerCheckedAppendOutcome<T> {
|
|
515
|
+
if (refuseProductionLedgerWriteInTest(dir, 'run-ledger')) return { appended: false, result: null, refusal: 'ledger-write-refused' as const };
|
|
516
|
+
return withRunLedgerLock(dir, runId, () => {
|
|
517
|
+
const decision = decide(loadRunLedger(runId, dir));
|
|
518
|
+
if (!decision.append) return { appended: false, result: decision.result, refusal: null };
|
|
519
|
+
const entry = decision.entry;
|
|
520
|
+
if (entry.runId !== runId) {
|
|
521
|
+
throw new RunLedgerCheckedAppendRunIdMismatchError(entry.runId, runId);
|
|
522
|
+
}
|
|
523
|
+
const live = runLedgerPath(entry.runId, dir);
|
|
524
|
+
const devProject = process.env.ELANOUS_DEV_PROJECT;
|
|
525
|
+
const row = entry.devProject === undefined && typeof devProject === 'string' && devProject.startsWith('prj-')
|
|
526
|
+
? { ...entry, devProject }
|
|
527
|
+
: entry;
|
|
528
|
+
const line = `${JSON.stringify(row)}\n`;
|
|
529
|
+
if (!restoreArchivedRunLedger(dir, entry.runId, line)) appendFileSync(live, line, 'utf8');
|
|
530
|
+
return { appended: true, result: null, refusal: null };
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
|
|
426
534
|
export interface HumanStopRunLedgerOptions {
|
|
427
535
|
stoppedBy: string;
|
|
428
536
|
stoppedAt?: string;
|