elanous 0.2.40 → 0.2.42
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/README.md +7 -7
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4769.9fd582071301f382.js → 1063.2fb8a9dc55c731f2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{470.51a72a2348306455.js → 1262.e804feb8fd1acb8c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7219-15bdd9a80661af8e.js → 1455-530ca16c7e71baff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.js → 1487.2f67b79444062da6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
- package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{1350.59f40e39e02d91b1.js → 2456.b6de0e1c05f28843.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +115 -0
- package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 2974.595d1e29d040cb6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 3207.a756c95e9ec8c3c8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 3347.f846266b5e5f3ede.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{8099.1cccf31c1baa7e1c.js → 3741.9cf76acaa2ee5298.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4864a2ca.1c1c280a7772c5e5.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3330.7443183b7e6fdbdf.js → 4276.336d76d858fcdf1b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{3b355b3d.6f73c98bf6f9c749.js → 50061469.0326382241ef3b2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +149 -0
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
- package/apps/pwa/out/_next/static/chunks/{8d173e38.18a2f7b4e1848bdb.js → 53c73f84.373b6160adfa89a4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1537-6bb97b5214928ea9.js → 5431-72a1dbde59400691.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{261.0d471e8aded799f3.js → 6131.348b7d6bdcd267ce.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.js → 6377.bc7df239edbff244.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2226.2cf61ec781827219.js → 6632.0eac1c554f8f2ef3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b84cad00.594027ebe0531fe2.js → 73d2eb0e.4966ad55293c801a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.js → 7411.9b4b8b747dc7b802.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9189505a.980427ac048c8c60.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2566.beaffc3a5e1fcd2e.js → 8262.ddc03e06b733f184.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
- package/apps/pwa/out/_next/static/chunks/{8272-025653884f9645d2.js → 8546-6f03f8ea34dd61d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.js → 8673-bab689a55f7e13b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4351.0f37a6db2b34d50b.js → 9249.976f1e69a9d80754.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.js → 9427.96aa912ddb5801e0.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7611.85f045bf232053ac.js → 9633.ce5bddc56784da72.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 9656-374232558fd528d0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/{page-83d27757e2b8060a.js → page-0e3d7b9421b79dac.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-139d722de1dcd6c1.js → page-bf067887b3307423.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{409c787b.e48c5bec8ec10456.js → b450776b.3db34d8d965f82d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
- package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +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 +23 -24
- 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 +22 -22
- 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 +23 -24
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -24
- 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/bin/elanous.mjs +6 -1
- package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
- package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
- package/docs/goal-context/04-mock-scenarios.md +13 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
- package/graphs/demo/persona-teacher/recipes.yaml +17 -0
- package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
- package/graphs/heal/heal-loop.yaml +1 -0
- package/graphs/overlays/stop-heal-ladder.yaml +136 -2
- package/graphs/release/release-loop.yaml +3 -1
- package/graphs/units/gate/gate.yaml +20 -0
- package/graphs/units/git/git.yaml +26 -0
- package/graphs/units/implement/implement.yaml +19 -0
- package/graphs/units/landing/landing.yaml +18 -0
- package/graphs/units/review/review.yaml +20 -0
- package/graphs/units/verbs/recipes.yaml +13 -10
- package/graphs/units/verbs/research.yaml +20 -0
- package/graphs/work/research-report.yaml +21 -3
- package/package.json +1 -1
- package/scripts/disk-steward.ts +46 -0
- package/scripts/fleet/node-setup.sh +50 -0
- package/scripts/graph-units/verbs/research.ts +55 -0
- package/scripts/heal/run-role.ts +99 -5
- package/scripts/land-global-checks.ts +6 -1
- package/scripts/lib/decompose-ab.ts +1 -0
- package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
- package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
- package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
- package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
- package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
- package/scripts/lib/tui-regress-checks.ts +33 -13
- package/scripts/llm-cost-ledger.ts +179 -8
- package/scripts/measure-nl-routing-corpus.ts +10 -2
- package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
- package/scripts/public-copy-lint.ts +163 -19
- package/scripts/ratchets/train-side-invariants.sh +0 -1
- package/scripts/release-loop/gate-autoheal.ts +117 -0
- package/scripts/release-loop/gate-baseline-receipt.ts +55 -10
- package/scripts/release-loop/gate-diff.ts +22 -3
- package/scripts/release-loop/gate-image-pin.ts +81 -0
- package/scripts/release-loop/gate-node-sim.ts +207 -0
- package/scripts/release-loop/gate-node.ts +489 -62
- package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
- package/scripts/release-loop/gate-radius-live.ts +97 -13
- package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
- package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
- package/scripts/release-loop/gate-train-receipts.ts +122 -0
- package/scripts/release-loop/gate-triage-node.ts +70 -10
- package/scripts/release-loop/resume-release.ts +330 -23
- package/scripts/release-loop/traffic-node.ts +6 -3
- package/scripts/release-loop/unattended-release.ts +4 -2
- package/scripts/shadow-authoring-probe.ts +20 -0
- package/scripts/ux-sim.ts +37 -3
- package/scripts/warm-pool-provider-config.ts +263 -0
- package/skills/omni-crawl/SKILL.md +5 -2
- package/skills/omni-crawl/scripts/main.ts +84 -23
- package/src/acp/core-turn-bridge.ts +99 -4
- package/src/agent/registry.ts +2 -0
- package/src/agent/task-notification.ts +25 -5
- package/src/agent/types.ts +6 -0
- package/src/agent-mission/mission-cli.ts +24 -0
- package/src/agent-mission/mission-out.ts +595 -0
- package/src/agent-mission/tool-install.ts +88 -2
- package/src/agent-substrate/context-strategy.ts +4 -4
- package/src/agent-substrate/self-review-cli.ts +267 -40
- package/src/auto-research/research-turn.ts +133 -51
- package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
- package/src/autopilot/pr-manager.ts +38 -7
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/boot/daemon-tools/self-implement.ts +46 -9
- package/src/budget/shadow-arms.ts +52 -0
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- package/src/chat/pickers/state.ts +7 -1
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
- package/src/cli/log-event-names.ts +5 -0
- package/src/cli/mcp-login.ts +8 -18
- package/src/cli/msg-cli.ts +57 -1
- package/src/cli/pr-land-heavy-remote.ts +47 -9
- package/src/cli/pr-land-overlap-evidence.ts +100 -1
- package/src/cli/pr-land-pod-shadow-job.ts +60 -0
- package/src/cli/release-checklist-read-cli.ts +20 -10
- package/src/cli/release-cli.ts +27 -1
- package/src/cli/research-cli.ts +4 -5
- package/src/cli/sim-cli.ts +7 -1
- package/src/cli/tasks-cli.ts +12 -4
- package/src/codex/models.ts +30 -15
- package/src/compact/auto.ts +8 -1
- package/src/control-plane/ledger.ts +52 -2
- package/src/control-plane/server.ts +16 -2
- package/src/core-turn/run-core-turn.ts +313 -89
- package/src/core-turn/run-goal-loop.ts +106 -2
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/acp-boot.ts +72 -3
- package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
- package/src/dashboard/classic-sidetab-mission.ts +185 -0
- package/src/dashboard/index.ts +155 -15
- package/src/dashboard/input/agent-wake.ts +23 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
- package/src/dashboard/mission-cli-consumer.ts +153 -0
- package/src/dashboard/seat-boot-preamble.ts +171 -1
- package/src/dashboard/side-basic-runtime.ts +54 -1
- package/src/dashboard/sidetab-runtime.ts +90 -1
- package/src/dashboard/skill-catalog-preamble.ts +101 -0
- package/src/dashboard/skill-detection-runtime.ts +55 -15
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
- package/src/dashboard/turn-preamble.ts +65 -16
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/disk-steward/judge.ts +73 -0
- package/src/disk-steward/ledger.ts +122 -0
- package/src/disk-steward/steward.ts +373 -0
- package/src/domains/guardian-tick.ts +191 -2
- package/src/graph-runner/graph-cli.ts +44 -7
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/in-process-registry.ts +37 -0
- package/src/graph-runner/runner.ts +34 -4
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/grounding/ref-index.ts +19 -0
- package/src/grounding/sources-cli.ts +9 -1
- package/src/harness/harness-cli-command.ts +267 -14
- package/src/harness/harness-incidents.ts +312 -7
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-space.ts +15 -1
- package/src/harness/harness-stop.ts +155 -11
- package/src/harness/progress-worker-entry.ts +59 -0
- package/src/harness/progress-worker-runtime.ts +11 -0
- package/src/index.ts +52 -7
- package/src/instance/dev-project.ts +25 -0
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/intelligence-map/model-alias.ts +6 -5
- package/src/intelligence-map/model-catalog.ts +59 -2
- package/src/llm/model-defaults.ts +4 -4
- package/src/llm.ts +208 -19
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +61 -0
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mcp/mcp-oauth.ts +3 -1
- package/src/model-tier/llm-tier-map.ts +9 -9
- package/src/model-tier/turn-tier.ts +1 -1
- package/src/msg/msg-mirror-github.ts +80 -0
- package/src/msg/msg-mirror-policy.ts +61 -0
- package/src/msg/msg-mirror-runner.ts +219 -0
- package/src/msg/msg-mirror-state.ts +33 -0
- package/src/msg/msg-store.ts +11 -0
- package/src/native-tool-catalog.ts +2 -2
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/output-truncation.ts +41 -12
- package/src/pr-tool/census.ts +3 -2
- package/src/project/project-store.ts +48 -1
- package/src/pty-shell/tui-run-state.ts +188 -2
- package/src/release-loop/checklist-target-path-hint.ts +13 -0
- package/src/release-loop/checklist.ts +9 -1
- package/src/release-loop/gate-host-reservation.ts +144 -0
- package/src/release-loop/release-schedule.ts +90 -1
- package/src/repl/index.ts +43 -2
- package/src/research/axis-fanout.ts +121 -16
- package/src/research/bloom-exemplars.ts +137 -0
- package/src/research/gap-followup.ts +13 -1
- package/src/research/plugin-discovery.ts +36 -14
- package/src/research-bridge/invoke.ts +22 -5
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +39 -25
- package/src/self-dev/decompose.ts +119 -5
- package/src/self-dev/dev-cli.ts +17 -17
- package/src/self-dev/graph-front-nodes.ts +23 -0
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/launch-preflight.ts +9 -4
- package/src/self-dev/orchestrate.ts +27 -2
- package/src/self-dev/review-provider-fallback.ts +9 -2
- package/src/self-dev/run-supervisor.ts +226 -6
- package/src/self-dev/run-types.ts +7 -0
- package/src/self-implement/doctor-visit.ts +88 -0
- package/src/self-implement/gate-artifacts.ts +13 -0
- package/src/self-implement/gate-cli.ts +54 -24
- package/src/self-implement/gate-remote.ts +23 -5
- package/src/self-implement/goal-author-clarification.ts +31 -12
- package/src/self-implement/goal-author.ts +403 -8
- package/src/self-implement/graph-overlay-yaml.ts +7 -0
- package/src/self-implement/graph-stage-units.ts +172 -0
- package/src/self-implement/graph-templates.ts +162 -1
- package/src/self-implement/graph-variant.ts +37 -4
- package/src/self-implement/headless-elanous-driver.ts +31 -2
- package/src/self-implement/heal-intake.ts +112 -4
- package/src/self-implement/heal-triage.ts +20 -0
- package/src/self-implement/host-regate.ts +31 -8
- package/src/self-implement/knowhow-pack.ts +38 -0
- package/src/self-implement/merge-train.ts +5 -0
- package/src/self-implement/orchestrator.ts +359 -30
- package/src/self-implement/regate-detail.ts +38 -1
- package/src/self-implement/rework-child-provider.ts +25 -0
- package/src/self-implement/run-chart.ts +119 -0
- package/src/self-implement/run-ledger.ts +176 -17
- package/src/self-implement/run-stop.ts +208 -5
- package/src/self-implement/running-runs.ts +35 -12
- package/src/self-implement/self-implement-cli.ts +36 -4
- package/src/self-implement/stop-autoheal-operational.ts +43 -0
- package/src/self-implement/stop-autoheal.ts +28 -6
- package/src/session/chat.ts +69 -58
- package/src/session/request-size-guard.ts +123 -0
- package/src/session-runtime/index.ts +98 -4
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/sidetab-core/model.ts +150 -0
- package/src/sidetab-core/visible-agent-mission.ts +186 -0
- package/src/skills/name-match.ts +20 -0
- package/src/skills/tools/agent.ts +30 -2
- package/src/skills/tools/omni-search.ts +67 -5
- package/src/task-agent/parent-host.ts +14 -1
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/task-hand.ts +31 -1
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
- package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +280 -60
- package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
- package/src/tokens.ts +35 -2
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
- package/src/tool-runtime/skill-exec-runtime.ts +33 -13
- package/src/tool-runtime/types.ts +1 -0
- package/src/tui/entry.ts +24 -7
- package/src/tui/sidetab/attach.ts +47 -0
- package/src/tui/sidetab/list.ts +45 -0
- package/src/tui/sidetab/nl-tool.ts +2 -136
- package/src/tui/sidetab/peek.ts +52 -0
- package/src/tui-client/dashboard-session.ts +3 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/user-config.ts +11 -5
- package/src/ux-sim/fake-kubectl.ts +37 -3
- package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
- package/src/ux-sim/fault-pod-child-result.ts +42 -0
- package/src/ux-sim/fault-pool-cap.ts +11 -6
- package/src/ux-sim/mock-scenario-catalog.json +41 -0
- package/src/ux-sim/mock-scenario-catalog.ts +156 -0
- package/src/ux-sim/release-sim-rig.ts +262 -0
- package/src/ux-sim/scenario.ts +116 -23
- package/src/ux-sim/seminar-rehearsal.ts +109 -0
- package/src/ux-sim/subagent-tools-device.ts +2 -2
- package/src/version/packed-revision.json +1 -1
- package/src/voice/voice-tts-singleton.ts +18 -3
- package/src/web-search/grok.ts +5 -9
- package/apps/pwa/out/_next/static/chunks/1060.014f1f01a17aec26.js +0 -115
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +0 -2
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066.a77257c8c350770a.js +0 -23
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8357.1aaa713b052a78b1.js +0 -309
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +0 -79
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d8de0de2-dd0f4ac8e5ab1832.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
- /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
|
@@ -106,10 +106,12 @@ export function formatAutoMergeSuccessMessage(input: {
|
|
|
106
106
|
import { GoalRunStore, insertGoalRunRecord, type GoalPriorRuns } from './goal-run-store.js';
|
|
107
107
|
import { writeGoalRunRecordFragment } from './goal-execution-records.js';
|
|
108
108
|
import { getUserConfig } from '../user-config.js';
|
|
109
|
-
import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
|
|
110
|
-
import { classifyMergeHoldStop, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
111
|
-
import { autohealFromStop, parseAutohealMode, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
|
|
112
|
-
import {
|
|
109
|
+
import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, runLedgerDir, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
|
|
110
|
+
import { buildRunStopTerminalEvidence, classifyMergeHoldStop, classifyTerminalHarnessFailure, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
111
|
+
import { autohealFromStop, parseAutohealMode, pickAutohealAction, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
|
|
112
|
+
import { operationalAutohealActions } from './stop-autoheal-operational.js';
|
|
113
|
+
import { recordParentNeedsOwnerVisit, runDoctorHandoff } from './doctor-visit.js';
|
|
114
|
+
import { readRunChart, recordRunChartDecision, RUN_DOCTOR_HANDOFF_INPUT_PREFIX } from './run-chart.js';
|
|
113
115
|
import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
|
|
114
116
|
import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
|
|
115
117
|
import { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
@@ -136,7 +138,7 @@ import { boundaryGlobs, boundaryViolations } from './goal-boundary.js';
|
|
|
136
138
|
import { askAtExecution, type ExecutionClarificationResult } from './execution-clarification.js';
|
|
137
139
|
import { decideScopeExpansion, renderScopeExpansionSection, SCOPE_EXPANSION_CAP, type ScopeExpansion, type ScopeStopReason } from './scope-adjacency.js';
|
|
138
140
|
import { targetScopedGoalText } from './goal-text-path-scope.js';
|
|
139
|
-
import { selectKnowhowPack } from './knowhow-pack.js';
|
|
141
|
+
import { selectKnowhowPack, selectHealKnowhowPack } from './knowhow-pack.js';
|
|
140
142
|
import { declaredNewFilePaths } from './goal-new-paths.js';
|
|
141
143
|
import { dropStaleReverts, type RevertGuardResult } from './revert-guard.js';
|
|
142
144
|
import type { SelfDevGoalType } from '../self-dev/orchestrate.js';
|
|
@@ -321,7 +323,14 @@ import { buildRuntimeOverlayState } from './graph-overlay-condition.js';
|
|
|
321
323
|
import { activeTemplate, decideTemplate, graphAuthorityFields, nodeNameForStage, overlayDecisionObservation, resolveGraphAuthorityForUserConfig, routeGate, visitBudgetOf } from './graph-authority.js';
|
|
322
324
|
import type { GraphTemplate } from './graph-templates.js';
|
|
323
325
|
import { defaultOverlaysDir, loadGraphOverlays, type GraphOverlaySpec } from './graph-overlay-yaml.js';
|
|
324
|
-
import { graphIdentityOf, measureL0Coverage, pipelineNodeEntryPayload } from './graph-templates.js';
|
|
326
|
+
import { defaultGraphsDir, graphIdentityOf, measureL0Coverage, pipelineNodeEntryPayload } from './graph-templates.js';
|
|
327
|
+
import {
|
|
328
|
+
buildStageNodeContext,
|
|
329
|
+
resolveGraphStageUnits,
|
|
330
|
+
stageNodeContextObservation,
|
|
331
|
+
stageUnitDrift,
|
|
332
|
+
type StageNodeContext,
|
|
333
|
+
} from './graph-stage-units.js';
|
|
325
334
|
import { AMBIGUOUS_STAGES, checkPipelineTraversal, nodesForStage, pipelineGraphIdentity, TERMINAL_STAGES_BY_NODE, type PipelineNodeId, type PipelineTraversalCheck } from './pipeline-shape.js';
|
|
326
335
|
import { appendGateWorktreeFreshnessEvidence, gateEvidenceNote } from '../harness/review-adapter.js';
|
|
327
336
|
import { diffHeaderPaths } from '../agent-substrate/self-review-cli.js';
|
|
@@ -348,6 +357,9 @@ import {
|
|
|
348
357
|
} from '../ask-user-question/tool.js';
|
|
349
358
|
import { acquireClarificationResolverLease, decideClarificationResolverInstall } from './clarification-resolver-lease.js';
|
|
350
359
|
import { inspectCodexRotation } from '../oauth/codex-account-store.js';
|
|
360
|
+
import { resolveGrokCredential } from '../grok/credential.js';
|
|
361
|
+
import { resolveChildLlmPreference } from './child-llm-preference.js';
|
|
362
|
+
import { reselectChildForRework } from './rework-child-provider.js';
|
|
351
363
|
import { resolveDefaultProvider } from '../llm.js';
|
|
352
364
|
import { createWidgetAskUserResolver } from '../expression/widget/adapters/ask-user-resolver.js';
|
|
353
365
|
import { createNodeReadlineHost } from '../expression/widget/readline-host.js';
|
|
@@ -1061,12 +1073,16 @@ export interface SelfImplementSeams {
|
|
|
1061
1073
|
stopAutohealActions?: AutohealActions;
|
|
1062
1074
|
/** STOP-AUTOHEAL — one-attempt guard reader. Default: real run ledger, or none when `writeRunLedger` is injected. */
|
|
1063
1075
|
stopAutohealLoadLedger?: (runId: string) => readonly RunLedgerEntry[] | null;
|
|
1076
|
+
/** Supervisor heal delivery history reader; defaults to the run ledger unless a test injects a writer. */
|
|
1077
|
+
healPackLoadLedger?: (runId: string) => readonly RunLedgerEntry[] | null;
|
|
1064
1078
|
/** STOP-AUTOHEAL — observes each dispatcher result (tests). */
|
|
1065
1079
|
onStopAutoheal?: (result: AutohealResult) => void;
|
|
1066
1080
|
/** Optional context-journal sink for isolated runs. */
|
|
1067
1081
|
emitContextEvent?: (input: SessionEventInput) => void;
|
|
1068
1082
|
/** Registers this run as an ephemeral loop-agent asset; failures are observed but never affect execution. */
|
|
1069
1083
|
registerLoopAgent?: (input: LoopAgentInput) => void;
|
|
1084
|
+
/** Executes a persisted run-doctor supervisor handoff; injectable to verify the parent delivery route. */
|
|
1085
|
+
runDoctorHandoff?: typeof runDoctorHandoff;
|
|
1070
1086
|
/** Wraps implementation and gate promises with their effective wall-clock timeout; tests observe the actual stage budgets. */
|
|
1071
1087
|
withStepTimeout?: <T>(promise: Promise<T>, ms: number, step: keyof StepTimeouts) => Promise<T>;
|
|
1072
1088
|
/** Samples the one-minute machine load at the end of a gate observation. */
|
|
@@ -1083,7 +1099,7 @@ export interface SelfImplementSeams {
|
|
|
1083
1099
|
* store, the orchestrator must not claim the child had zero provider failures.
|
|
1084
1100
|
*/
|
|
1085
1101
|
queryChildProviderErrors?: (input: { runId: string; sinceMs: number; untilMs: number }) => Promise<
|
|
1086
|
-
| { status: 'found'; providerErrorCount: number; credentialFailureCount: number; lastProviderError?: { provider?: string; message?: string }; lastCredentialFailure?: { provider?: string; message?: string } }
|
|
1102
|
+
| { status: 'found'; providerErrorCount: number; credentialFailureCount: number; lastProviderError?: { provider?: string; model?: string; message?: string; observedAt?: string }; lastCredentialFailure?: { provider?: string; model?: string; message?: string; observedAt?: string } }
|
|
1087
1103
|
| { status: 'none' }
|
|
1088
1104
|
| { status: 'unavailable'; reason?: string }
|
|
1089
1105
|
>;
|
|
@@ -2198,6 +2214,8 @@ export interface SelfImplementOptions {
|
|
|
2198
2214
|
runId?: string;
|
|
2199
2215
|
/** Authored goal document's stable identity, carried into self-implement observations when present. */
|
|
2200
2216
|
goalId?: string;
|
|
2217
|
+
/** Stable heal-cell identity propagated across supervisor reauthor retries. */
|
|
2218
|
+
healCellKey?: string;
|
|
2201
2219
|
/** Optional opaque ID for joining this request with correlated execution records. */
|
|
2202
2220
|
correlationId?: string;
|
|
2203
2221
|
/** Optional opaque ID for the parent correlation in a nested request. */
|
|
@@ -3014,8 +3032,8 @@ export function queryStructuredChildProviderErrors(
|
|
|
3014
3032
|
});
|
|
3015
3033
|
if (rows.length === 0) return { status: 'none' };
|
|
3016
3034
|
let credentialFailureCount = 0;
|
|
3017
|
-
let lastProviderError: { provider?: string; message?: string } | undefined;
|
|
3018
|
-
let lastCredentialFailure: { provider?: string; message?: string } | undefined;
|
|
3035
|
+
let lastProviderError: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
|
|
3036
|
+
let lastCredentialFailure: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
|
|
3019
3037
|
for (const row of rows) {
|
|
3020
3038
|
let data: Record<string, unknown> | undefined;
|
|
3021
3039
|
try {
|
|
@@ -3024,7 +3042,9 @@ export function queryStructuredChildProviderErrors(
|
|
|
3024
3042
|
} catch { /* malformed payload is still a structured router-error record */ }
|
|
3025
3043
|
const detail = {
|
|
3026
3044
|
...(typeof data?.provider === 'string' ? { provider: data.provider } : {}),
|
|
3045
|
+
...(typeof data?.model === 'string' ? { model: data.model } : {}),
|
|
3027
3046
|
...(typeof data?.message === 'string' ? { message: data.message } : {}),
|
|
3047
|
+
...(typeof row.ts === 'string' ? { observedAt: row.ts } : {}),
|
|
3028
3048
|
};
|
|
3029
3049
|
lastProviderError = detail;
|
|
3030
3050
|
if (data?.authRejected === true) {
|
|
@@ -3568,19 +3588,32 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
|
|
|
3568
3588
|
try {
|
|
3569
3589
|
const record = readRunStopRecord(stopEntry);
|
|
3570
3590
|
if (!record) return;
|
|
3591
|
+
const chartDir = runLedgerDir();
|
|
3592
|
+
const chartBefore = readRunChart(stopEntry.runId, 'macrophage', chartDir);
|
|
3593
|
+
const chartStopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
|
|
3594
|
+
try { debug.log('harness.heal', 'symptom', { runId: stopEntry.runId, class: record.class, cause: record.cause, evidenceRef: record.evidenceRef }); } catch { /* observation is fail-soft */ }
|
|
3595
|
+
const pick = pickAutohealAction(record.class);
|
|
3596
|
+
try { debug.log('harness.heal', 'prescription', { runId: stopEntry.runId, class: record.class, action: pick.action, source: pick.source, ...(pick.overlayId ? { overlayId: pick.overlayId } : {}) }); } catch { /* observation is fail-soft */ }
|
|
3571
3597
|
const mode = parseAutohealMode((await import('../user-config.js')).getUserConfig().tools.selfImplement.autoheal?.mode);
|
|
3572
3598
|
const loadLedger = s?.stopAutohealLoadLedger ?? (s?.writeRunLedger ? () => null : undefined);
|
|
3599
|
+
// A test ledger must never trigger a production host gate. Explicit seams override operational hands.
|
|
3600
|
+
const actions = s?.writeRunLedger ? s.stopAutohealActions
|
|
3601
|
+
: { ...operationalAutohealActions({ repoRoot: process.cwd() }), ...s?.stopAutohealActions };
|
|
3573
3602
|
const result = await autohealFromStop({ runId: stopEntry.runId, ...(stopEntry.goalId ? { goalId: stopEntry.goalId } : {}), record }, {
|
|
3574
3603
|
mode,
|
|
3575
3604
|
knowhowCandidateDir: join(effectiveInstanceRoot(), 'self-implement', 'knowhow-candidates'),
|
|
3576
|
-
...(
|
|
3605
|
+
...(actions ? { actions } : {}),
|
|
3577
3606
|
...(loadLedger ? { loadLedger } : {}),
|
|
3578
3607
|
...(s?.writeRunLedger ? { writeLedger: s.writeRunLedger } : {}),
|
|
3579
3608
|
});
|
|
3609
|
+
try { debug.log('harness.heal', 'outcome', { runId: stopEntry.runId, class: result.class, action: result.action, mode: result.mode, outcome: result.outcome, ...(result.reason ? { reason: result.reason } : {}), ...(result.detail ? { detail: result.detail } : {}) }); } catch { /* observation is fail-soft */ }
|
|
3610
|
+
recordRunChartDecision({ runId: stopEntry.runId, device: 'macrophage', stopKey: chartStopKey,
|
|
3611
|
+
observed: `${record.class}: ${record.cause}`, verdict: result.action, action: result.outcome,
|
|
3612
|
+
handoff: result.action === 'needs-owner' ? 'outer-supervisor' : null,
|
|
3613
|
+
why: result.reason ?? result.detail ?? record.cause, readStopKeys: chartBefore.map((cell) => cell.stopKey), dir: chartDir });
|
|
3580
3614
|
if (result.action === 'needs-owner') {
|
|
3581
3615
|
try {
|
|
3582
|
-
const
|
|
3583
|
-
const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey, evidence: result.reason ?? record.cause });
|
|
3616
|
+
const visit = recordParentNeedsOwnerVisit({ runId: stopEntry.runId, stopKey: chartStopKey, evidence: result.reason ?? record.cause });
|
|
3584
3617
|
if (visit.status === 'missing-ledger') {
|
|
3585
3618
|
debug.log('run-doctor', 'visit-failed', { runId: stopEntry.runId, from: 'parent', symptom: 'needs-owner', error: 'run-ledger-missing' });
|
|
3586
3619
|
}
|
|
@@ -3594,6 +3627,54 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
|
|
|
3594
3627
|
}
|
|
3595
3628
|
}
|
|
3596
3629
|
|
|
3630
|
+
async function dispatchTerminalHarnessHeal(input: {
|
|
3631
|
+
result: SelfImplementResult;
|
|
3632
|
+
runId: string;
|
|
3633
|
+
goalId?: string;
|
|
3634
|
+
shardIdentity: RunShardIdentity;
|
|
3635
|
+
seams: SelfImplementSeams;
|
|
3636
|
+
}): Promise<void> {
|
|
3637
|
+
const { result, runId, goalId, shardIdentity, seams } = input;
|
|
3638
|
+
const mergeHeld = Boolean(result.mergeReason && result.mergeReason !== 'auto');
|
|
3639
|
+
if (result.outcome !== 'abandoned' && result.outcome !== 'budget-exhausted' && result.stage !== 'timed-out' && !mergeHeld) return;
|
|
3640
|
+
if (runStopRecorded(runId)) return;
|
|
3641
|
+
const stopClass = mergeHeld ? classifyMergeHoldStop(result.mergeReason) : classifyTerminalHarnessFailure({
|
|
3642
|
+
stage: result.stage,
|
|
3643
|
+
cause: result.detail,
|
|
3644
|
+
mergeReason: result.mergeReason,
|
|
3645
|
+
abandonedClassification: result.abandonedClassification?.classification,
|
|
3646
|
+
providerErrorCategory: result.providerErrors?.category,
|
|
3647
|
+
supervisorVerdict: result.supervisorVerdict,
|
|
3648
|
+
});
|
|
3649
|
+
let priorLedger: RunLedgerEntry[] = [];
|
|
3650
|
+
try { priorLedger = loadRunLedger(runId) ?? []; } catch { /* terminal observation must not change the run result */ }
|
|
3651
|
+
const terminalEvidence = buildRunStopTerminalEvidence({
|
|
3652
|
+
stage: result.stage,
|
|
3653
|
+
node: result.node,
|
|
3654
|
+
outcome: result.outcome,
|
|
3655
|
+
detail: result.detail,
|
|
3656
|
+
terminationReason: result.terminationReason,
|
|
3657
|
+
providerErrorCategory: result.providerErrors?.category,
|
|
3658
|
+
entries: priorLedger,
|
|
3659
|
+
});
|
|
3660
|
+
let stopEntry: RunLedgerEntry | undefined;
|
|
3661
|
+
try {
|
|
3662
|
+
stopEntry = recordRunStop({
|
|
3663
|
+
runId,
|
|
3664
|
+
...(goalId ? { goalId } : {}),
|
|
3665
|
+
shardIdentity,
|
|
3666
|
+
site: mergeHeld ? 'merge-hold' : `terminal-${result.stage}`,
|
|
3667
|
+
class: stopClass,
|
|
3668
|
+
// Never copy free-form provider/child text into the durable stop summary.
|
|
3669
|
+
cause: mergeHeld ? `merge held: ${result.mergeReason}` : `terminal failure: ${result.stage}; ${terminalEvidence.reasonCode}`,
|
|
3670
|
+
evidenceRef: result.prUrl ?? `run-ledger:${runId}:${result.stage}`,
|
|
3671
|
+
nextMove: `Existing heal ladder: ${stopClass}; failure disposition remains until its prescribed action resolves`,
|
|
3672
|
+
terminalEvidence,
|
|
3673
|
+
}, seams.writeRunLedger ?? appendRunLedgerEntry);
|
|
3674
|
+
} catch { /* stop observation cannot change the run outcome */ }
|
|
3675
|
+
if (stopEntry) await autohealRecordedStop(stopEntry, seams);
|
|
3676
|
+
}
|
|
3677
|
+
|
|
3597
3678
|
export function measureReviewRework(counts: readonly number[], findings: readonly (readonly RecurrenceFinding[])[]): ReviewRework {
|
|
3598
3679
|
const deltas = counts.slice(1).map((count, index) => Math.sign(count - counts[index]!));
|
|
3599
3680
|
const directions = deltas.filter((delta) => delta !== 0);
|
|
@@ -3761,17 +3842,20 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3761
3842
|
let lastCredentialFailureSeq = 0;
|
|
3762
3843
|
let lastFailedGateSeq = 0;
|
|
3763
3844
|
let lastMustFixReviewSeq = 0;
|
|
3845
|
+
let providerErrorAtLastGate: string | undefined;
|
|
3764
3846
|
const recordFailureVerdict = async (kind: 'gate' | 'review'): Promise<void> => {
|
|
3765
3847
|
// Capture child errors at the verdict boundary, not when terminal reporting eventually reads them.
|
|
3766
3848
|
await mergeChildProviderErrors();
|
|
3849
|
+
providerErrorAtLastGate = lastProviderErrorSeq > Math.max(lastFailedGateSeq, lastMustFixReviewSeq)
|
|
3850
|
+
? lastProviderError?.message : undefined;
|
|
3767
3851
|
if (kind === 'gate') lastFailedGateSeq = ++failureSequence;
|
|
3768
3852
|
else lastMustFixReviewSeq = ++failureSequence;
|
|
3769
3853
|
};
|
|
3770
3854
|
const latestVerdictSeq = (): number => Math.max(lastFailedGateSeq, lastMustFixReviewSeq);
|
|
3771
3855
|
const hasCurrentProviderError = (): boolean => providerErrorCount > 0 && lastProviderErrorSeq > latestVerdictSeq();
|
|
3772
3856
|
const hasCurrentCredentialFailure = (): boolean => credentialFailureCount > 0 && lastCredentialFailureSeq > latestVerdictSeq();
|
|
3773
|
-
let lastProviderError: { provider?: string; message?: string } | undefined;
|
|
3774
|
-
let lastCredentialFailure: { provider?: string; message?: string } | undefined;
|
|
3857
|
+
let lastProviderError: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
|
|
3858
|
+
let lastCredentialFailure: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
|
|
3775
3859
|
let childProviderErrorQueryStatus: 'found' | 'none' | 'unavailable' | 'not-configured' = 'not-configured';
|
|
3776
3860
|
let queriedProviderErrorCount = 0;
|
|
3777
3861
|
let queriedCredentialFailureCount = 0;
|
|
@@ -3808,18 +3892,43 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3808
3892
|
childProviderErrorQueryStatus = 'unavailable';
|
|
3809
3893
|
}
|
|
3810
3894
|
};
|
|
3895
|
+
const observeFailureClassificationInputs = (result: SelfImplementResult): void => {
|
|
3896
|
+
if (!isAbandonedClassificationOutcome(result.outcome)) return;
|
|
3897
|
+
observeOuter('failure-classification-inputs', {
|
|
3898
|
+
stage: result.stage,
|
|
3899
|
+
node: result.node,
|
|
3900
|
+
outcome: result.outcome,
|
|
3901
|
+
classification: result.abandonedClassification?.classification ?? null,
|
|
3902
|
+
classificationBasis: result.abandonedClassification?.classificationBasis ?? null,
|
|
3903
|
+
childProviderErrorQueryStatus,
|
|
3904
|
+
providerErrorCount,
|
|
3905
|
+
credentialFailureCount,
|
|
3906
|
+
queriedProviderErrorCount,
|
|
3907
|
+
queriedCredentialFailureCount,
|
|
3908
|
+
lastProviderError: lastProviderError ? { provider: lastProviderError.provider ?? null, model: lastProviderError.model ?? null, observedAt: lastProviderError.observedAt ?? null } : null,
|
|
3909
|
+
lastCredentialFailure: lastCredentialFailure ? { provider: lastCredentialFailure.provider ?? null, model: lastCredentialFailure.model ?? null, observedAt: lastCredentialFailure.observedAt ?? null } : null,
|
|
3910
|
+
lastProviderErrorSeq,
|
|
3911
|
+
lastCredentialFailureSeq,
|
|
3912
|
+
lastFailedGateSeq,
|
|
3913
|
+
lastMustFixReviewSeq,
|
|
3914
|
+
currentProviderError: hasCurrentProviderError(),
|
|
3915
|
+
currentCredentialFailure: hasCurrentCredentialFailure(),
|
|
3916
|
+
});
|
|
3917
|
+
};
|
|
3811
3918
|
const unregisterProviderErrorSink = debug.registerSink({
|
|
3812
3919
|
name: `self-implement-provider-error-${runId}`,
|
|
3813
3920
|
emit(record) {
|
|
3814
3921
|
if (record.category !== 'llm.router.error') return;
|
|
3815
3922
|
const data = record.data;
|
|
3816
3923
|
if (!data || typeof data !== 'object') return;
|
|
3817
|
-
const { provider, message } = data as Record<string, unknown>;
|
|
3924
|
+
const { provider, model, message } = data as Record<string, unknown>;
|
|
3818
3925
|
providerErrorCount++;
|
|
3819
3926
|
lastProviderErrorSeq = ++failureSequence;
|
|
3820
3927
|
lastProviderError = {
|
|
3821
3928
|
...(typeof provider === 'string' ? { provider } : {}),
|
|
3929
|
+
...(typeof model === 'string' ? { model } : {}),
|
|
3822
3930
|
...(typeof message === 'string' ? { message } : {}),
|
|
3931
|
+
...(typeof record.ts === 'string' ? { observedAt: record.ts } : {}),
|
|
3823
3932
|
};
|
|
3824
3933
|
// ⛔⭐⭐⭐ 자격 거부는 「프로바이더 오류」의 부분집합이지만 ***사람이 할 다음 행동이 다르다***
|
|
3825
3934
|
// (2026-08-14 실측 · `[T]` 83차): grok 자식 «둘»이 401 로 죽었는데 부모가 남긴 것은
|
|
@@ -4108,6 +4217,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4108
4217
|
}
|
|
4109
4218
|
};
|
|
4110
4219
|
let terminalResult: SelfImplementResult | undefined;
|
|
4220
|
+
let uncaughtTerminalStop: SelfImplementResult | undefined;
|
|
4111
4221
|
let reviewReflectRejectedCount: number | undefined;
|
|
4112
4222
|
const attachReviewReflectionOutcome = <T extends Omit<SelfImplementResult, 'runId'>>(result: T): T & Pick<SelfImplementResult, 'completionStatus' | 'reviewReflectRejectedCount'> => ({
|
|
4113
4223
|
...result,
|
|
@@ -4287,6 +4397,11 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4287
4397
|
(sessionId) => { terminalSessionId = sessionId; },
|
|
4288
4398
|
(contract) => { runContract = contract; },
|
|
4289
4399
|
recordFailureVerdict,
|
|
4400
|
+
() => {
|
|
4401
|
+
const error = providerErrorAtLastGate;
|
|
4402
|
+
providerErrorAtLastGate = undefined;
|
|
4403
|
+
return error;
|
|
4404
|
+
},
|
|
4290
4405
|
() => providerErrorCount > 0,
|
|
4291
4406
|
() => credentialFailureCount > 0,
|
|
4292
4407
|
hasCurrentProviderError,
|
|
@@ -4307,6 +4422,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4307
4422
|
opts.seams.inspectCodexRotation,
|
|
4308
4423
|
runProviderName,
|
|
4309
4424
|
);
|
|
4425
|
+
observeFailureClassificationInputs(addressedResult);
|
|
4310
4426
|
if (isAbandonedClassificationOutcome(addressedResult.outcome)) logQuotaProvider(addressedResult.quotaExhaustionAssessment);
|
|
4311
4427
|
observeOuter('child-provider-error-query', { status: childProviderErrorQueryStatus });
|
|
4312
4428
|
if (lastProviderError) {
|
|
@@ -4318,20 +4434,24 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4318
4434
|
}
|
|
4319
4435
|
terminalResult = withEvidenceCoverage(withMeasuredRework(addressedResult));
|
|
4320
4436
|
// runSelfImplement is the terminal caller: retain every existing PR/ledger/log observation and append one stop fact.
|
|
4321
|
-
|
|
4437
|
+
const envDeficitStop = addressedResult.stage === 'gate-failed' && addressedResult.harvestable === true
|
|
4438
|
+
&& addressedResult.detail?.includes(GATE_ENV_DEFICIT_HARVESTABLE_MARK) === true;
|
|
4439
|
+
if ((addressedResult.stage === 'aborted' || envDeficitStop || (addressedResult.mergeReason && addressedResult.mergeReason !== 'auto')) && !runStopRecorded(runId)) {
|
|
4322
4440
|
const reason = addressedResult.mergeReason;
|
|
4323
4441
|
const aborted = addressedResult.stage === 'aborted';
|
|
4324
4442
|
let stopEntry: RunLedgerEntry | undefined;
|
|
4325
4443
|
try {
|
|
4326
4444
|
stopEntry = recordRunStop({ runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity,
|
|
4327
|
-
site: aborted ? 'implement-aborted' : 'merge-hold',
|
|
4328
|
-
class:
|
|
4445
|
+
site: envDeficitStop ? 'gate-env-deficit' : aborted ? 'implement-aborted' : 'merge-hold',
|
|
4446
|
+
class: envDeficitStop ? 'env-unrelated' : aborted ? 'unclassified' : classifyMergeHoldStop(reason),
|
|
4447
|
+
cause: envDeficitStop ? addressedResult.detail ?? 'gate environment deficit' : aborted ? 'implement aborted' : `merge held: ${reason}`,
|
|
4329
4448
|
evidenceRef: addressedResult.prUrl ?? `run-ledger:${runId}:${aborted ? 'implemented' : 'merge-decision'}`,
|
|
4330
|
-
nextMove: aborted ? 'Inspect preserved worktree and child summary' : 'Review merge decision and PR before landing',
|
|
4449
|
+
nextMove: envDeficitStop ? 'Measure the preserved PR head in a clean checkout' : aborted ? 'Inspect preserved worktree and child summary' : 'Review merge decision and PR before landing',
|
|
4331
4450
|
}, opts.seams.writeRunLedger ?? appendRunLedgerEntry);
|
|
4332
4451
|
} catch { /* stop observation cannot change the run outcome */ }
|
|
4333
4452
|
if (stopEntry) await autohealRecordedStop(stopEntry, opts.seams);
|
|
4334
4453
|
}
|
|
4454
|
+
await dispatchTerminalHarnessHeal({ result: addressedResult, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
|
|
4335
4455
|
observeDeclaredScopeDiff(observeOuter, {
|
|
4336
4456
|
goalFile: opts.goalFile,
|
|
4337
4457
|
changedFiles: opts.goalFile && addressedResult.worktreePath
|
|
@@ -4420,6 +4540,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4420
4540
|
terminalNode = result.node;
|
|
4421
4541
|
await mergeChildProviderErrors();
|
|
4422
4542
|
const addressedResult = attachAbandonedClassification(attachReviewReflectionOutcome({ ...result, ...providerErrorsForResult() }), opts.goalFile, hasCurrentProviderError(), hasCurrentCredentialFailure(), opts.seams.inspectCodexRotation, runProviderName);
|
|
4543
|
+
observeFailureClassificationInputs(addressedResult);
|
|
4423
4544
|
logQuotaProvider(addressedResult.quotaExhaustionAssessment);
|
|
4424
4545
|
observeOuter('child-provider-error-query', { status: childProviderErrorQueryStatus });
|
|
4425
4546
|
if (lastProviderError) {
|
|
@@ -4429,6 +4550,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4429
4550
|
observeOuter('credential-failure-observed', { count: credentialFailureCount, ...lastCredentialFailure });
|
|
4430
4551
|
}
|
|
4431
4552
|
terminalResult = withMeasuredRework(addressedResult); // ⛔ 이 분기(StepTimeoutError)는 스코프가 달라 달성 근사값은 «없다»(0 으로 채우지 않는다)
|
|
4553
|
+
await dispatchTerminalHarnessHeal({ result: addressedResult, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
|
|
4432
4554
|
observeDeclaredScopeDiff(observeOuter, {
|
|
4433
4555
|
goalFile: opts.goalFile,
|
|
4434
4556
|
changedFiles: opts.goalFile && addressedResult.worktreePath
|
|
@@ -4489,9 +4611,12 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4489
4611
|
...terminalDetail(terminalSessionId),
|
|
4490
4612
|
},
|
|
4491
4613
|
});
|
|
4614
|
+
uncaughtTerminalStop = { runId, ok: false, stage: 'aborted', node: terminalNode ?? 'implement', outcome: 'abandoned', detail: safeErrorDescription(e) };
|
|
4492
4615
|
throw e;
|
|
4493
4616
|
} finally {
|
|
4494
4617
|
if (loopRegistered) registerRunLoop('ended');
|
|
4618
|
+
// Persist the outer-exception stop and its prescription before the crashed run-status below.
|
|
4619
|
+
if (uncaughtTerminalStop) await dispatchTerminalHarnessHeal({ result: uncaughtTerminalStop, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
|
|
4495
4620
|
const terminalStage = terminalResult?.stage ?? 'crashed';
|
|
4496
4621
|
// A blocked draft may be opened on the first failed attempt, before the
|
|
4497
4622
|
// normal outcome observer has written its terminal status. Persist the
|
|
@@ -4564,6 +4689,10 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4564
4689
|
summary: reworkCap
|
|
4565
4690
|
? reworkCapFailureSummary(opts.feature, reworkCap)
|
|
4566
4691
|
: opts.feature.split(/\r?\n/, 1)[0]?.trim() || `Harness run ${runId} failed`,
|
|
4692
|
+
goalText: opts.feature,
|
|
4693
|
+
...(opts.goalId ? { goalId: opts.goalId } : {}),
|
|
4694
|
+
...(opts.goalFile ? { goalFile: opts.goalFile } : {}),
|
|
4695
|
+
...(opts.healCellKey ? { cellKey: opts.healCellKey } : {}),
|
|
4567
4696
|
at: new Date().toISOString(),
|
|
4568
4697
|
});
|
|
4569
4698
|
}
|
|
@@ -4952,6 +5081,38 @@ function reworkCapFailureSummary(feature: string, decision: ReworkCapHealDecisio
|
|
|
4952
5081
|
return `${title} [${decision.defectClass} → ${decision.nextAction}] ${evidence}`;
|
|
4953
5082
|
}
|
|
4954
5083
|
|
|
5084
|
+
/** ⭐ SELFIMPL-NODE-SEAMS-BACK — 등록 부품(구현·gate·리뷰·git·착지)을 graphs/units 에서 해석하고
|
|
5085
|
+
* 합성 선언을 평탄화해 «하나의 NodeContext» 로 묶는다. ⛔ 실패는 값(reason)으로 낸다 — 실행을 막지 않는다. */
|
|
5086
|
+
export function resolveRunStageNodeContext(input: {
|
|
5087
|
+
readonly graphId: string;
|
|
5088
|
+
readonly graphVersion: string;
|
|
5089
|
+
readonly graphsDir: string;
|
|
5090
|
+
readonly runId: string;
|
|
5091
|
+
readonly attempts?: number;
|
|
5092
|
+
readonly round?: number;
|
|
5093
|
+
readonly goalId?: string;
|
|
5094
|
+
readonly goalType?: string;
|
|
5095
|
+
}): { readonly nodeContext?: StageNodeContext; readonly reason?: string } {
|
|
5096
|
+
const resolution = resolveGraphStageUnits(input.graphId, input.graphsDir);
|
|
5097
|
+
if (resolution.units.length === 0) {
|
|
5098
|
+
return { reason: resolution.reason ?? 'no-unit-resolved' };
|
|
5099
|
+
}
|
|
5100
|
+
return {
|
|
5101
|
+
nodeContext: buildStageNodeContext({
|
|
5102
|
+
resolution,
|
|
5103
|
+
graphId: input.graphId,
|
|
5104
|
+
graphVersion: input.graphVersion,
|
|
5105
|
+
runId: input.runId,
|
|
5106
|
+
...(input.attempts === undefined ? {} : { attempts: input.attempts }),
|
|
5107
|
+
...(input.round === undefined ? {} : { round: input.round }),
|
|
5108
|
+
...(input.goalId === undefined ? {} : { goalId: input.goalId }),
|
|
5109
|
+
...(input.goalType === undefined ? {} : { goalType: input.goalType }),
|
|
5110
|
+
}),
|
|
5111
|
+
...(resolution.reason === undefined ? {} : { reason: resolution.reason }),
|
|
5112
|
+
};
|
|
5113
|
+
}
|
|
5114
|
+
|
|
5115
|
+
/** 라운드마다 같은 부품이 «그 파일·그 판»인지 — 도는 중에 바뀌면 걸음과 신원이 갈린다. */
|
|
4955
5116
|
async function runSelfImplementInner(
|
|
4956
5117
|
opts: SelfImplementOptions,
|
|
4957
5118
|
identity?: { runId: string; source: ReturnType<typeof resolveRunIdentity>['source'] },
|
|
@@ -4988,13 +5149,14 @@ async function runSelfImplementInner(
|
|
|
4988
5149
|
hasCredentialFailure: () => boolean = () => false,
|
|
4989
5150
|
providerErrorCategory: () => NonNullable<SelfImplementResult['providerErrors']>['category'] | undefined = () => undefined,
|
|
4990
5151
|
onReviewReflectRejected: (rejectedCount: number) => void = () => {},
|
|
4991
|
-
observe
|
|
5152
|
+
observe?: ReturnType<typeof makeRunObserver>,
|
|
4992
5153
|
/** ⭐ 「이 런이 «실제로» 어느 두뇌로 돌았나」를 원장까지 나른다 — ⛔ 기록 «시점»에 다시 읽지 않는다
|
|
4993
5154
|
* (그러면 「런이 끝날 무렵의 provider」가 되어 `F45` 를 그대로 밟는다). 시작 시점 값을 넘긴다. */
|
|
4994
5155
|
onActiveProvider: (active: { provider?: string; model?: string; auth?: string }) => void = () => {},
|
|
4995
5156
|
onSessionCreated: (sessionId: string) => void = () => {},
|
|
4996
5157
|
onRunContractResolved: (contract: RunContract) => void = () => {},
|
|
4997
5158
|
onFailureVerdict: (kind: 'gate' | 'review') => Promise<void> = async () => {},
|
|
5159
|
+
providerErrorAtLastGate: () => string | undefined = () => undefined,
|
|
4998
5160
|
hasObservedProviderError: () => boolean = hasProviderError,
|
|
4999
5161
|
hasObservedCredentialFailure: () => boolean = hasCredentialFailure,
|
|
5000
5162
|
hasCurrentProviderError: () => boolean = hasProviderError,
|
|
@@ -5005,7 +5167,23 @@ async function runSelfImplementInner(
|
|
|
5005
5167
|
onPrAttributed: (number: number) => void = () => {},
|
|
5006
5168
|
onPrAttributionMismatch: () => void = () => {},
|
|
5007
5169
|
): Promise<Omit<SelfImplementResult, 'runId'>> {
|
|
5170
|
+
const runIdentity = identity ?? resolveRunIdentity({ explicit: opts.runId });
|
|
5171
|
+
observe ??= makeRunObserver(runIdentity.runId, opts.goalId, debug.log.bind(debug), opts.seams.writeRunLedger, shardIdentity);
|
|
5008
5172
|
const s = opts.seams;
|
|
5173
|
+
const deliveredHealPacks = new Set<string>();
|
|
5174
|
+
const healRunId = identity?.runId ?? resolveRunIdentity({ explicit: opts.runId }).runId;
|
|
5175
|
+
try {
|
|
5176
|
+
const entries = (s.healPackLoadLedger ?? (s.writeRunLedger ? () => null : loadRunLedger))(healRunId);
|
|
5177
|
+
for (const entry of entries ?? []) {
|
|
5178
|
+
if (entry.runId !== healRunId || entry.event !== 'supervisor-heal-pack'
|
|
5179
|
+
|| !['matched', 'already-delivered'].includes(String(entry.data?.decision))) continue;
|
|
5180
|
+
const { signature, packIds } = entry.data;
|
|
5181
|
+
if (typeof signature !== 'string' || !Array.isArray(packIds)) continue;
|
|
5182
|
+
for (const id of packIds) {
|
|
5183
|
+
if (typeof id === 'string') deliveredHealPacks.add(`${healRunId}:${signature}:${id}`);
|
|
5184
|
+
}
|
|
5185
|
+
}
|
|
5186
|
+
} catch { /* An unavailable history contributes no invented deliveries. */ }
|
|
5009
5187
|
const pipelineStartedAtMs = Date.now();
|
|
5010
5188
|
// Graph authority is always ON; retain the resolved event with default provenance.
|
|
5011
5189
|
// For research documents, its declared docs-only routing intentionally skips the gate.
|
|
@@ -5046,9 +5224,16 @@ async function runSelfImplementInner(
|
|
|
5046
5224
|
: undefined;
|
|
5047
5225
|
if (launch && !launch.ok) throw new Error(`graph variant rejected: ${JSON.stringify(launch.rejections)}`);
|
|
5048
5226
|
const sourceSpec = launch?.ok ? launch.template : baseSpec;
|
|
5227
|
+
// ⭐ unit 선언 근거 — 이 런이 읽은 «대상 경로»(단위 선언) 원문의 내용 해시만 남긴다.
|
|
5228
|
+
// ⛔ 본문은 로그에도 원장에도 복제하지 않는다(goalContentHash 와 같은 해시-only 예비).
|
|
5229
|
+
// ⛔ 읽지 못한 경로(신설 파일 등)는 해시를 지어내지 않고 근거에서 뺀다.
|
|
5230
|
+
const unitDeclarations = declaredPremiseScopePaths(opts.feature).flatMap(path => {
|
|
5231
|
+
try { return [{ path, content: readFileSync(resolve(process.cwd(), path), 'utf8') }]; } catch { return []; }
|
|
5232
|
+
});
|
|
5049
5233
|
// ⭐ 최초 변형 선택 — 골 종류(graphGoalType)·대상 경로 수(declaredPremiseScopePaths) 두 입력만으로
|
|
5050
5234
|
// 결정론적으로 id·선택 이유를 유도해 검증 결과에 싣는다(종류를 못 읽었으면 지어내지 않는다).
|
|
5051
5235
|
const variant = createGraphVariant({ template: sourceSpec, goal: `g_${variantRunId.replace(/[^a-z0-9_-]/gi, '_')}`, plan: opts.graphVariantPlan,
|
|
5236
|
+
...(unitDeclarations.length === 0 ? {} : { unitDeclarations }),
|
|
5052
5237
|
...(graphGoalType === undefined ? {} : { goalAnalysis: { goalType: graphGoalType, targetPathCount: declaredPremiseScopePaths(opts.feature).length } }) });
|
|
5053
5238
|
if (!variant.ok) throw new Error(`graph variant rejected: ${JSON.stringify(variant.rejections)}`);
|
|
5054
5239
|
variantSpec = variant.template;
|
|
@@ -5056,6 +5241,9 @@ async function runSelfImplementInner(
|
|
|
5056
5241
|
const graphFile = saveRunGraphVariant(variantRunId, stringify({
|
|
5057
5242
|
graph_id: variantSpec.graphId, version: variantSpec.version,
|
|
5058
5243
|
...(variant.selection === undefined ? {} : { variant_id: variant.selection.variantId, reason: variant.selection.reason }),
|
|
5244
|
+
// 추가 키 — 한 런이 어느 unit 선언 «버전»을 읽었는지. 경로·내용 해시뿐이고 본문은 없다.
|
|
5245
|
+
...(variant.selection?.unitDeclarations === undefined ? {}
|
|
5246
|
+
: { unit_declarations: variant.selection.unitDeclarations.map(entry => ({ path: entry.path, content_hash: entry.contentHash })) }),
|
|
5059
5247
|
entry_node: variantSpec.entryNode, terminal_nodes: variantSpec.terminalNodes,
|
|
5060
5248
|
...(variantSpec.journeyStages ? { journey_stages: variantSpec.journeyStages } : {}),
|
|
5061
5249
|
...(variantSpec.runContract ? { run_contract: variantSpec.runContract } : {}),
|
|
@@ -5080,13 +5268,15 @@ async function runSelfImplementInner(
|
|
|
5080
5268
|
// ⭐ 저장·diff — 방금 원장 옆에 쓴 선택(id·이유)을 다시 읽어 «같은지» 확인한다(다르면 이 런의 그래프 신원이 거짓).
|
|
5081
5269
|
if (variant.selection !== undefined) {
|
|
5082
5270
|
const persisted = loadRunGraphVariant(variantRunId);
|
|
5083
|
-
if (persisted === null || persisted.variantId !== variant.selection.variantId || persisted.reason !== variant.selection.reason
|
|
5271
|
+
if (persisted === null || persisted.variantId !== variant.selection.variantId || persisted.reason !== variant.selection.reason
|
|
5272
|
+
|| JSON.stringify(persisted.unitDeclarations ?? null) !== JSON.stringify(variant.selection.unitDeclarations ?? null)) {
|
|
5084
5273
|
throw new Error(`graph variant rejected: persisted selection mismatch: ${JSON.stringify(persisted)}`);
|
|
5085
5274
|
}
|
|
5086
5275
|
}
|
|
5087
5276
|
observe('graph-variant-applied', { graphId: variant.template.graphId, overlayId: variant.overlay.overlayId,
|
|
5088
5277
|
graphFile, patches: variant.patches,
|
|
5089
|
-
...(variant.selection === undefined ? {} : { variantId: variant.selection.variantId, variantReason: variant.selection.reason })
|
|
5278
|
+
...(variant.selection === undefined ? {} : { variantId: variant.selection.variantId, variantReason: variant.selection.reason }),
|
|
5279
|
+
...(variant.selection?.unitDeclarations === undefined ? {} : { unitDeclarations: variant.selection.unitDeclarations }) });
|
|
5090
5280
|
}
|
|
5091
5281
|
/** 단계 이름 → 그 템플릿의 노드 이름. */
|
|
5092
5282
|
const node = (stage: PipelineNodeId): PipelineNodeId => nodeNameForStage(stage, graphTemplate) as PipelineNodeId;
|
|
@@ -5103,6 +5293,28 @@ async function runSelfImplementInner(
|
|
|
5103
5293
|
onRunContractResolved(runContract);
|
|
5104
5294
|
observe('graph-run-contract-resolved', { ...graphIdentityOf(graphTemplate), ...runContract, ...runContractAtNode(runContract) });
|
|
5105
5295
|
}
|
|
5296
|
+
// ⭐ SELFIMPL-NODE-SEAMS-BACK — 등록 부품을 «생산 진입점»에서 해석·평탄화해 하나의 NodeContext 로 만든다.
|
|
5297
|
+
// ⛔ 이 줄이 없으면 부품은 선언만 있고 걸음에서 안 불린다. 실패는 값으로 남기고 실행은 안 막는다.
|
|
5298
|
+
let nodeContext: StageNodeContext | undefined;
|
|
5299
|
+
{
|
|
5300
|
+
const unitResolution = resolveRunStageNodeContext({
|
|
5301
|
+
graphId: graphTemplate.graphId,
|
|
5302
|
+
graphVersion: graphTemplate.version,
|
|
5303
|
+
graphsDir: defaultGraphsDir(),
|
|
5304
|
+
runId: runIdentity.runId,
|
|
5305
|
+
...(typeof attemptOrdinal === 'number' ? { attempts: attemptOrdinal } : {}),
|
|
5306
|
+
...(opts.goalId === undefined ? {} : { goalId: opts.goalId }),
|
|
5307
|
+
...(graphGoalType === undefined ? {} : { goalType: graphGoalType }),
|
|
5308
|
+
});
|
|
5309
|
+
nodeContext = unitResolution.nodeContext;
|
|
5310
|
+
if (nodeContext === undefined) {
|
|
5311
|
+
if (graphTemplate.graphId === 'self-implement') {
|
|
5312
|
+
observe('graph-stage-units-unresolved', { ...graphIdentityOf(graphTemplate), reason: unitResolution.reason ?? 'no-unit-resolved' });
|
|
5313
|
+
}
|
|
5314
|
+
} else {
|
|
5315
|
+
observe('graph-stage-units-resolved', stageNodeContextObservation(nodeContext));
|
|
5316
|
+
}
|
|
5317
|
+
}
|
|
5106
5318
|
// ⛔ 승격이 꺼져 있으면 «심지 않는다» — 그러면 예산 관측도 안 난다(운영 원장이 오늘과 같다).
|
|
5107
5319
|
if (graphAuthority.enabled) onGraphTemplateResolved(graphTemplate);
|
|
5108
5320
|
// ⛔ 선택을 «전부» 싣는다 — 얹힌 것만 실으면 「왜 안 얹혔나」를 사후에 못 묻는다.
|
|
@@ -5116,7 +5328,7 @@ async function runSelfImplementInner(
|
|
|
5116
5328
|
// ⛔ 「지금 아는 것」만 준다 — 없는 값을 0 으로 지어내지 않는다(key-absent 가 그것을 말한다).
|
|
5117
5329
|
let stopClass: import('./run-stop.js').RunStopClass | undefined;
|
|
5118
5330
|
try {
|
|
5119
|
-
const { runId } =
|
|
5331
|
+
const { runId } = runIdentity;
|
|
5120
5332
|
const entries = loadRunLedger(runId);
|
|
5121
5333
|
const lastStop = entries?.slice().reverse().find((entry) => entry.event === 'stop');
|
|
5122
5334
|
if (lastStop && isRunStopClass(lastStop.data.class)) stopClass = readRunStopRecord(lastStop)?.class;
|
|
@@ -5136,6 +5348,16 @@ async function runSelfImplementInner(
|
|
|
5136
5348
|
...(variantSpec ? { specs: { [variantSpec.graphId]: variantSpec } } : {}),
|
|
5137
5349
|
});
|
|
5138
5350
|
if (decision.appliedIds.length > 0) graphTemplate = decision.template;
|
|
5351
|
+
// ⭐ SELFIMPL-NODE-SEAMS-BACK — 같은 NodeContext 가 라운드로 이어진다: 체크포인트를 옮기고,
|
|
5352
|
+
// 부품이 도는 중에 다른 판으로 바뀌었으면 그 사실을 값으로 낸다(걸음과 신원이 갈리는 것을 막는다).
|
|
5353
|
+
if (nodeContext !== undefined) {
|
|
5354
|
+
nodeContext = { ...nodeContext, checkpoint: { ...nodeContext.checkpoint, round } };
|
|
5355
|
+
const drift = stageUnitDrift(nodeContext.grounding.units, defaultGraphsDir());
|
|
5356
|
+
observe('graph-stage-units-drift', {
|
|
5357
|
+
graphId: nodeContext.goal.graphId, graphVersion: nodeContext.goal.graphVersion,
|
|
5358
|
+
round, missing: drift.missing, changed: drift.changed,
|
|
5359
|
+
});
|
|
5360
|
+
}
|
|
5139
5361
|
// ⛔⭐ 승격이 켜져 있으면 «언제나» 낸다 — 후보가 0이어도 낸다.
|
|
5140
5362
|
// 🩸 안 내면 「얹을 게 없었다」와 「이 배선이 «안 돌았다»」가 원장에서 «같은 값»(0건)이 된다.
|
|
5141
5363
|
// ⇒ `considered` 가 그 둘을 가른다: 배선이 돌면 이 줄이 있고, 그 수가 «본 오버레이 수»다.
|
|
@@ -5174,7 +5396,7 @@ async function runSelfImplementInner(
|
|
|
5174
5396
|
roundClassifications.push(classification);
|
|
5175
5397
|
onRoundClassification(classification);
|
|
5176
5398
|
};
|
|
5177
|
-
const { runId, source: runIdSource } =
|
|
5399
|
+
const { runId, source: runIdSource } = runIdentity;
|
|
5178
5400
|
const branch = opts.branchName ?? plannedSelfImplBranch(opts.feature, opts.goalId, runId);
|
|
5179
5401
|
try {
|
|
5180
5402
|
debug.log('run-identity', 'own', {
|
|
@@ -5922,6 +6144,7 @@ async function runSelfImplementInner(
|
|
|
5922
6144
|
};
|
|
5923
6145
|
let preservationBase = wt.resolvedBase;
|
|
5924
6146
|
const runProviderName = opts.childLlm?.provider ?? (s.currentProviderName?.() ?? currentProviderName());
|
|
6147
|
+
let activeChildLlm = opts.childLlm;
|
|
5925
6148
|
let cachedQuotaExhaustionAssessment: QuotaExhaustionAssessment | undefined;
|
|
5926
6149
|
const quotaExhaustionAssessmentForRun = (): QuotaExhaustionAssessment => {
|
|
5927
6150
|
cachedQuotaExhaustionAssessment ??= readQuotaExhausted(s.inspectCodexRotation, runProviderName);
|
|
@@ -7050,7 +7273,38 @@ async function runSelfImplementInner(
|
|
|
7050
7273
|
if (fabricObservation) observe('rework-budget-fabric-shadow', fabricObservation);
|
|
7051
7274
|
}
|
|
7052
7275
|
} catch (error) {
|
|
7053
|
-
if (judgmentStarted)
|
|
7276
|
+
if (judgmentStarted) {
|
|
7277
|
+
const failureKind = classifyReviewProviderFailure(safeErrorDescription(error));
|
|
7278
|
+
if (failureKind === 'credentials-unavailable') {
|
|
7279
|
+
const blockedStage = isReviewRework(reworkKind) ? 'review-blocked' : 'gate-failed';
|
|
7280
|
+
const reason = 'rework skipped: provider credentials unavailable';
|
|
7281
|
+
observe('rework-skipped-provider-unavailable', { round, kind: reworkKind, reason: failureKind }, { level: 'warn' });
|
|
7282
|
+
finalizeSupervisorDeliveries('rework-provider-credentials-unavailable');
|
|
7283
|
+
if (blockedStage === 'review-blocked') recordPendingReviewTriage('follow-up', 'review-blocked', effectiveMax);
|
|
7284
|
+
const pr = await preserveBlockedArtifacts({
|
|
7285
|
+
stage: blockedStage,
|
|
7286
|
+
reason,
|
|
7287
|
+
gate,
|
|
7288
|
+
failureKind,
|
|
7289
|
+
salvageStatusExpected: false,
|
|
7290
|
+
});
|
|
7291
|
+
const common = {
|
|
7292
|
+
ok: false as const,
|
|
7293
|
+
node: 'rework' as const,
|
|
7294
|
+
...resolveRunOutcome({ termination: 'abandoned' }),
|
|
7295
|
+
sessionId,
|
|
7296
|
+
worktreePath: wt.path,
|
|
7297
|
+
branch: wt.branch,
|
|
7298
|
+
gate,
|
|
7299
|
+
...(review ? { review } : {}),
|
|
7300
|
+
quotaExhaustionAssessment: quotaExhaustionAssessmentForRun(),
|
|
7301
|
+
};
|
|
7302
|
+
return blockedStage === 'review-blocked'
|
|
7303
|
+
? { ...common, ...reviewBlockedResult(pr), detail: reason }
|
|
7304
|
+
: { ...common, stage: 'gate-failed' as const, ...(pr ? { prUrl: pr.url, prNumber: pr.number } : {}), detail: reason };
|
|
7305
|
+
}
|
|
7306
|
+
throw error;
|
|
7307
|
+
}
|
|
7054
7308
|
consecutiveUnresolvedBudget = 0;
|
|
7055
7309
|
}
|
|
7056
7310
|
} else if (round > 0) {
|
|
@@ -7278,6 +7532,30 @@ async function runSelfImplementInner(
|
|
|
7278
7532
|
}
|
|
7279
7533
|
throw error;
|
|
7280
7534
|
}
|
|
7535
|
+
// Only the preceding round's observed error or gate evidence can authorize a remedy.
|
|
7536
|
+
let healInput = '';
|
|
7537
|
+
if (round > 0) {
|
|
7538
|
+
const failure = reworkKind === 'gate' && gate?.passed === false ? gate : undefined;
|
|
7539
|
+
const failures = failure?.baselineFailures;
|
|
7540
|
+
const facts = failure?.reflectGateFacts;
|
|
7541
|
+
const providerMessage = providerErrorAtLastGate();
|
|
7542
|
+
const signature = providerMessage && /\b1310\b.*\blimit\b|\blimit\b.*\b1310\b/i.test(providerMessage) ? 'provider-1310'
|
|
7543
|
+
: failure && facts?.introduced === 0 && facts.preexisting !== undefined && facts.preexisting > 0
|
|
7544
|
+
&& facts.unknown === 0 && failures?.length && failures.every(item => item.attribution === 'preexisting')
|
|
7545
|
+
? 'preexisting'
|
|
7546
|
+
: failure && failures?.some(item => item.timeoutVariability === 'may-vary'
|
|
7547
|
+
&& /\b(?:order|time)[ -]dependent\b/i.test(`${item.name} ${item.diagnostic ?? ''}`))
|
|
7548
|
+
? 'order-time-dependent' : 'unknown';
|
|
7549
|
+
const pack = signature === 'unknown' ? { text: '', ids: [], bytes: 0 } : selectHealKnowhowPack(wt.path, signature);
|
|
7550
|
+
const freshIds = pack.ids.filter(id => !deliveredHealPacks.has(`${healRunId}:${signature}:${id}`));
|
|
7551
|
+
const decision = !pack.ids.length ? 'unknown' : freshIds.length ? 'matched' : 'already-delivered';
|
|
7552
|
+
if (decision === 'matched') {
|
|
7553
|
+
for (const id of freshIds) deliveredHealPacks.add(`${healRunId}:${signature}:${id}`);
|
|
7554
|
+
healInput = `[SUPERVISOR-HEAL-PACK signature=${signature} ids=${freshIds.join(',')}]\n${pack.text.split('\n').slice(1).filter(line => freshIds.some(id => line.startsWith(`${id}:`))).join('\n')}`;
|
|
7555
|
+
}
|
|
7556
|
+
observe('supervisor-heal-pack', { runId: healRunId, round, signature, packIds: decision === 'matched' ? freshIds : decision === 'already-delivered' ? pack.ids : [], decision,
|
|
7557
|
+
...(decision === 'unknown' ? { missingEvidence: signature === 'unknown' ? 'observed-signature-unavailable' : 'matching-active-pack-unavailable' } : {}) });
|
|
7558
|
+
}
|
|
7281
7559
|
const implementAbortController = new AbortController();
|
|
7282
7560
|
const abortImplementation = (): void => implementAbortController.abort(opts.signal?.reason);
|
|
7283
7561
|
if (opts.signal?.aborted) abortImplementation();
|
|
@@ -7299,18 +7577,66 @@ async function runSelfImplementInner(
|
|
|
7299
7577
|
let supervisorInputClosed = false;
|
|
7300
7578
|
const closeSupervisorInput = (): void => { supervisorInputClosed = true; };
|
|
7301
7579
|
try {
|
|
7580
|
+
if (round > 0 && activeChildLlm?.provider === 'grok') {
|
|
7581
|
+
const { readGrokQuotaForLaunch, defaultChildLlmModel } = await import('../self-dev/dev-cli.js');
|
|
7582
|
+
const grokQuota = readGrokQuotaForLaunch();
|
|
7583
|
+
const grokCredential = resolveGrokCredential() ? 'available' as const : 'unavailable' as const;
|
|
7584
|
+
let codexRotation: ReturnType<typeof inspectCodexRotation> | undefined;
|
|
7585
|
+
try { codexRotation = (s.inspectCodexRotation ?? inspectCodexRotation)(); } catch { codexRotation = undefined; }
|
|
7586
|
+
const preference = resolveChildLlmPreference(getUserConfig());
|
|
7587
|
+
const alternateSlot = preference.chain.find((slot) => slot.provider === 'openai-codex' && slot.provider !== activeChildLlm!.provider);
|
|
7588
|
+
const hasCodexCredential = (codexRotation?.knownAccountCount ?? 0) > 0;
|
|
7589
|
+
const codexQuota = readQuotaExhausted(s.inspectCodexRotation, 'openai-codex');
|
|
7590
|
+
const alternate = hasCodexCredential ? {
|
|
7591
|
+
provider: 'openai-codex', model: alternateSlot?.model ?? defaultChildLlmModel('openai-codex'), source: 'config' as const,
|
|
7592
|
+
} : undefined;
|
|
7593
|
+
const decision = reselectChildForRework({ current: activeChildLlm, grokQuota, grokCredential,
|
|
7594
|
+
...(alternate ? { alternate } : {}), alternateCredential: hasCodexCredential ? 'available' : 'unavailable',
|
|
7595
|
+
alternateQuotaExhausted: codexQuota.exhausted });
|
|
7596
|
+
if (decision.action === 'reselect') {
|
|
7597
|
+
activeChildLlm = decision.selection;
|
|
7598
|
+
observe('rework-child-model-reselected', { round, previousProvider: decision.previous.provider, previousModel: decision.previous.model,
|
|
7599
|
+
provider: activeChildLlm.provider, model: activeChildLlm.model, reason: decision.reason, quota: grokQuota,
|
|
7600
|
+
grokCredential, alternateQuotaExhausted: codexQuota.exhausted ?? null });
|
|
7601
|
+
}
|
|
7602
|
+
}
|
|
7302
7603
|
implementPromise = s.implement({
|
|
7303
7604
|
sessionId, cwd: wt.path, feature, runId, shardIdentity, signal: implementAbortController.signal,
|
|
7304
7605
|
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7305
7606
|
onSurfaceProgress: (line) => progress('implementing', line.trimEnd()),
|
|
7306
7607
|
onLifecycleScreenClassification: recordRoundClassification,
|
|
7307
|
-
...(round > 0 ? { roundContext: { round, effectiveMax, previousRoundFailure: reworkPromptNote, ...(landedSiblings ? { landedSiblings } : {}) } } : {}),
|
|
7608
|
+
...(round > 0 ? { roundContext: { round, effectiveMax, previousRoundFailure: healInput ? `${reworkPromptNote}\n\n${healInput}` : reworkPromptNote, ...(landedSiblings ? { landedSiblings } : {}) } } : {}),
|
|
7308
7609
|
onSupervisorInput: (text, updateDelivery) => {
|
|
7309
7610
|
const normalized = text.trim();
|
|
7310
7611
|
if (!normalized) {
|
|
7311
7612
|
updateDelivery?.('not-delivered', 'empty-supervisor-input');
|
|
7312
7613
|
return;
|
|
7313
7614
|
}
|
|
7615
|
+
if (normalized.startsWith(RUN_DOCTOR_HANDOFF_INPUT_PREFIX)) {
|
|
7616
|
+
const runIdMatch = /(?:^|\s)runId=([^\s]+)/u.exec(normalized);
|
|
7617
|
+
const stopKeyMatch = /(?:^|\s)stopKey=([^\s]+)/u.exec(normalized);
|
|
7618
|
+
if (!runIdMatch?.[1] || runIdMatch[1] !== runId || !stopKeyMatch?.[1]) {
|
|
7619
|
+
updateDelivery?.('not-delivered', 'invalid-run-doctor-handoff');
|
|
7620
|
+
return;
|
|
7621
|
+
}
|
|
7622
|
+
void (s.runDoctorHandoff ?? runDoctorHandoff)({ runId, stopKey: stopKeyMatch[1], dir: runLedgerDir(elanousStateRoot() || undefined),
|
|
7623
|
+
dispatch: (action, handoff) => {
|
|
7624
|
+
if (action !== 'reauthor-from-materialized') return { outcome: 'needs-human', detail: `prescription executor not wired: ${action}` };
|
|
7625
|
+
const accepted = recordFailureEvent({ source: 'harness-run', kind: 'run-supervisor-wait-streak', ref: runId,
|
|
7626
|
+
summary: `[implement aborted] run-supervisor wait streak ${String(handoff.waitCount ?? 'unknown')} · doctor reauthor handoff`,
|
|
7627
|
+
goalText: feature, ...(opts.goalId ? { goalId: opts.goalId } : {}), ...(opts.goalFile ? { goalFile: opts.goalFile } : {}),
|
|
7628
|
+
...(opts.healCellKey ? { cellKey: opts.healCellKey } : {}), at: new Date().toISOString() });
|
|
7629
|
+
return { outcome: accepted.folded ? 'heal-event-already-present' : 'heal-graph-requested',
|
|
7630
|
+
detail: accepted.folded ? 'same-run heal event already recorded' : 'PR1 heal intake accepted the materialized reauthor action' };
|
|
7631
|
+
},
|
|
7632
|
+
}).then((result) => {
|
|
7633
|
+
updateDelivery?.(result.status === 'acted' || result.status === 'already-acted' ? 'delivered' : 'not-delivered',
|
|
7634
|
+
result.status === 'needs-human' ? result.outcome : result.status === 'missing-handoff' ? 'run-chart-handoff-missing' : undefined);
|
|
7635
|
+
}).catch((error: unknown) => {
|
|
7636
|
+
updateDelivery?.('not-delivered', error instanceof Error ? error.message.slice(0, 120) : String(error).slice(0, 120));
|
|
7637
|
+
});
|
|
7638
|
+
return;
|
|
7639
|
+
}
|
|
7314
7640
|
if (supervisorInputClosed) {
|
|
7315
7641
|
recordUndeliveredSupervisorInput(normalized, 'late-supervisor-input');
|
|
7316
7642
|
updateDelivery?.('not-delivered', 'late-supervisor-input');
|
|
@@ -7326,7 +7652,7 @@ async function runSelfImplementInner(
|
|
|
7326
7652
|
supervisorDeliveryUpdates.push({ text: normalized, update: updateDelivery });
|
|
7327
7653
|
},
|
|
7328
7654
|
...(escalateTier !== 'none' ? { escalateTier } : {}),
|
|
7329
|
-
...(
|
|
7655
|
+
...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
|
|
7330
7656
|
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7331
7657
|
});
|
|
7332
7658
|
} catch (error) {
|
|
@@ -7401,7 +7727,7 @@ async function runSelfImplementInner(
|
|
|
7401
7727
|
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7402
7728
|
onSurfaceProgress: line => progress('implementing', line.trimEnd()),
|
|
7403
7729
|
roundContext: { round: retryRound, effectiveMax, previousRoundFailure: retryNote },
|
|
7404
|
-
...(
|
|
7730
|
+
...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
|
|
7405
7731
|
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7406
7732
|
}), T.implement, 'implement');
|
|
7407
7733
|
} catch (error) {
|
|
@@ -7502,7 +7828,7 @@ async function runSelfImplementInner(
|
|
|
7502
7828
|
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7503
7829
|
onSurfaceProgress: (line) => progress('implementing', line.trimEnd()),
|
|
7504
7830
|
roundContext: { round: tddRetryRound, effectiveMax, previousRoundFailure: tddRetryNote },
|
|
7505
|
-
...(
|
|
7831
|
+
...(activeChildLlm ? { childLlm: activeChildLlm } : {}),
|
|
7506
7832
|
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7507
7833
|
}), T.implement, 'implement');
|
|
7508
7834
|
} catch (error) {
|
|
@@ -7697,7 +8023,10 @@ async function runSelfImplementInner(
|
|
|
7697
8023
|
}, { compact: { stringMax: Math.max(MAX_HARVESTED_EVIDENCE_CHARS, harvestObs.harvestedEvidence?.length ?? 0) } });
|
|
7698
8024
|
if (impl.ok) completionDisposition = finishedChildCommitMissing || finishedChildCommitted ? undefined : impl.completionDisposition;
|
|
7699
8025
|
const effectiveDisposition = impl.ok ? completionDisposition : impl.completionDisposition;
|
|
7700
|
-
|
|
8026
|
+
let materializedPaths: readonly string[] | undefined;
|
|
8027
|
+
try { materializedPaths = (s.changedFilesForGateRoute ?? changedFiles)(wt.path); } catch { /* unknown diff is not path evidence */ }
|
|
8028
|
+
observe('implemented', { ok: impl.ok, round, ...(materializedPaths ? { materializedPaths: [...materializedPaths] } : {}),
|
|
8029
|
+
...(effectiveDisposition ? { completionDisposition: effectiveDisposition } : {}) });
|
|
7701
8030
|
progress('implemented', impl.ok ? (round === 0 ? '구현 완료' : `rework ${round} 완료`) : impl.completionDisposition ? '변경 없이 완료 검증' : '구현 실패(worktree 보존)');
|
|
7702
8031
|
if (!impl.ok) {
|
|
7703
8032
|
finalizeSupervisorDeliveries('next-round-implement-not-ok');
|