elanous 0.2.41 → 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/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → 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/{5159.115f1c2ca471386c.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/{9048.212083de42d25be3.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/1455-530ca16c7e71baff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.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/2456.b6de0e1c05f28843.js +1 -0
- 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/{530.d26346e18089640a.js → 2690.0521c738b7749931.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4702.4a4adc1f16d7c93b.js → 2974.595d1e29d040cb6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3207.a756c95e9ec8c3c8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9541.eb8e2f8480c7feca.js → 3285.89ee2f298682f5e5.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 3347.f846266b5e5f3ede.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.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/3741.9cf76acaa2ee5298.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1661.0dd330f3d89f73f3.js → 3837.a210d7d0db8d8abd.js} +1 -1
- 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/{2fdf2931.b431eee4fb468bc3.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/4276.336d76d858fcdf1b.js +1 -0
- 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/50061469.0326382241ef3b2d.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{1115.434ae2ecb0ad986d.js → 5112.4b9f300124fab7b3.js} +3 -3
- 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/53c73f84.373b6160adfa89a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +1 -0
- 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/6131.348b7d6bdcd267ce.js +226 -0
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{2073.689dcb2680113d76.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/{1800.f7ff51dc4978a958.js → 6632.0eac1c554f8f2ef3.js} +1 -1
- 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/{2527-5c636a43c7cc5dde.js → 7279-c199ea83f34338fa.js} +1 -1
- 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/{385e4574.e9886ab32759eda3.js → 73d2eb0e.4966ad55293c801a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.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/{2fe2c302.41b517f88d6fe502.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/{5574.f35accf4f132b29d.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/{8050-9b364bdef8f71927.js → 8546-6f03f8ea34dd61d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.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/{5937.c2df9e3447e1f667.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/{1971-7efb628c471dc5a0.js → 9353-12bfff0c130104cf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7191.fdc955f7d96064a4.js → 9415.69e4a21c60c7d2db.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.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/9633.ce5bddc56784da72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 9656-374232558fd528d0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6552.a3840aa7da35ad68.js → 9832.f4a98c878ecf2c0a.js} +1 -1
- 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-0e3d7b9421b79dac.js +1 -0
- 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-bf067887b3307423.js +1 -0
- 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/{a0a01613.6d1cca322238d7fe.js → b450776b.3db34d8d965f82d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.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/docs/goal-context/04-mock-scenarios.md +13 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/heal/heal-loop.yaml +1 -0
- package/graphs/overlays/stop-heal-ladder.yaml +113 -0
- package/graphs/units/verbs/recipes.yaml +11 -11
- package/graphs/work/research-report.yaml +10 -2
- package/package.json +1 -1
- 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/release-loop/gate-baseline-receipt.ts +47 -9
- 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 +285 -46
- 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-train-receipts.ts +122 -0
- package/scripts/release-loop/resume-release.ts +83 -8
- package/scripts/ux-sim.ts +18 -1
- 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 +13 -0
- 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 +178 -13
- package/src/auto-research/research-turn.ts +123 -50
- package/src/autopilot/pr-manager.ts +38 -7
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -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/pr-land-heavy-remote.ts +32 -0
- 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/research-cli.ts +4 -5
- package/src/cli/tasks-cli.ts +7 -0
- 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 +311 -90
- package/src/core-turn/run-goal-loop.ts +18 -0
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
- package/src/dashboard/classic-sidetab-mission.ts +185 -0
- package/src/dashboard/index.ts +149 -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 +53 -15
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/graph-runner/graph-cli.ts +23 -7
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/runner.ts +1 -1
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-stop.ts +155 -11
- package/src/index.ts +34 -5
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/llm.ts +166 -8
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +13 -0
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/native-tool-catalog.ts +2 -2
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/pr-tool/census.ts +3 -2
- 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/repl/index.ts +43 -2
- package/src/research/axis-fanout.ts +121 -16
- package/src/research/bloom-exemplars.ts +3 -1
- 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/decompose.ts +119 -5
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/orchestrate.ts +12 -2
- package/src/self-dev/review-provider-fallback.ts +9 -2
- package/src/self-dev/run-supervisor.ts +42 -4
- package/src/self-dev/run-types.ts +4 -0
- package/src/self-implement/doctor-visit.ts +88 -0
- package/src/self-implement/goal-author.ts +326 -3
- package/src/self-implement/graph-overlay-yaml.ts +7 -0
- 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 +27 -4
- package/src/self-implement/merge-train.ts +5 -0
- package/src/self-implement/orchestrator.ts +126 -11
- 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 +112 -11
- package/src/self-implement/run-stop.ts +188 -4
- package/src/self-implement/stop-autoheal.ts +13 -0
- package/src/session/chat.ts +38 -4
- package/src/session-runtime/index.ts +98 -4
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/sidetab-core/model.ts +19 -5
- 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/pod-distributor-entry.ts +3 -0
- package/src/task-agent/task-hand.ts +27 -0
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- 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 +165 -45
- 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 +14 -4
- package/src/tui/sidetab/attach.ts +47 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/ux-sim/fake-kubectl.ts +37 -3
- 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/scenario.ts +116 -23
- 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/1121.667cec0bcdbb3fdb.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
- package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
- package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +0 -41
- package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +0 -1
- package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
- package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
- package/apps/pwa/out/_next/static/chunks/53aeb4ee-51c92f8d683f5220.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
- package/apps/pwa/out/_next/static/chunks/5744.b9415e18ad623100.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +0 -2
- package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
- package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
- package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
- package/apps/pwa/out/_next/static/chunks/9834.63ab2bbc3153172e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/addc2b32.8c4ff8f0aefe987d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
|
@@ -3,7 +3,8 @@ import { invokeResearchAxes } from '../research-bridge/index.js';
|
|
|
3
3
|
import { invokeResearch } from '../research-bridge/invoke.js';
|
|
4
4
|
import type { AxisFanoutResult } from '../research/axis-fanout.js';
|
|
5
5
|
import { routeResearchOutput } from '../research/output-router.js';
|
|
6
|
-
import { runGapFollowup } from '../research/gap-followup.js';
|
|
6
|
+
import { planGapFollowup, runGapFollowup } from '../research/gap-followup.js';
|
|
7
|
+
import type { ResearchGapFollowupInput, ResearchGapFollowupPlan } from '../research/gap-followup.js';
|
|
7
8
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
8
9
|
import {
|
|
9
10
|
buildWorkingBackwardsContractPrompt,
|
|
@@ -16,13 +17,16 @@ import { attachResearchEvidence, buildResearchQuestionLadderPrompt,
|
|
|
16
17
|
type SixLevelResearchQuestionLadder } from './question-ladder-contract.js';
|
|
17
18
|
|
|
18
19
|
export interface ResearchQuestionLadderRunOptions {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
generateContract?: (prompt: string, signal?: AbortSignal) => Promise<string>;
|
|
22
|
+
generate?: (prompt: string, signal?: AbortSignal) => Promise<string>;
|
|
23
|
+
invokeAxes?: (questions: SixLevelResearchQuestionLadder['questions'], signal?: AbortSignal) => Promise<AxisFanoutResult>;
|
|
22
24
|
routeOutput?: typeof routeResearchOutput;
|
|
23
|
-
invokeOutputSkill?: (skill: string, args: string) => Promise<{ ok: boolean; output: string; error?: string }>;
|
|
25
|
+
invokeOutputSkill?: (skill: string, args: string, signal?: AbortSignal) => Promise<{ ok: boolean; output: string; error?: string }>;
|
|
24
26
|
/** Test seam for the bounded Bloom 4/5 evidence-gap follow-up. */
|
|
25
27
|
gapFollowup?: typeof runGapFollowup;
|
|
28
|
+
/** Test seam for deciding whether production gap-follow-up has any runnable calls. */
|
|
29
|
+
planGapFollowup?: (input: ResearchGapFollowupInput) => ResearchGapFollowupPlan;
|
|
26
30
|
/** Test/config seam for an explicitly installed private Bloom exemplar pack. */
|
|
27
31
|
bloomExemplarPackPath?: string;
|
|
28
32
|
}
|
|
@@ -205,9 +209,10 @@ export async function runResearchQuestionLadder(
|
|
|
205
209
|
const initial: SixLevelResearchQuestionLadder = { request, questions: [], evidence: [] };
|
|
206
210
|
let contractRaw: string;
|
|
207
211
|
try {
|
|
208
|
-
contractRaw = await (options.generateContract ?? ((prompt) => defaultGenerate(prompt, 'research-working-backwards-contract')))(
|
|
209
|
-
buildWorkingBackwardsContractPrompt(request),
|
|
212
|
+
contractRaw = await (options.generateContract ?? ((prompt, signal) => defaultGenerate(prompt, 'research-working-backwards-contract', signal)))(
|
|
213
|
+
buildWorkingBackwardsContractPrompt(request), options.signal,
|
|
210
214
|
);
|
|
215
|
+
if (options.signal?.aborted) return { ok: false, ladder: initial, output: '', error: 'research aborted' };
|
|
211
216
|
} catch (error) {
|
|
212
217
|
const reason = errorText(error);
|
|
213
218
|
debug.log('research.lens', 'working-backwards-contract-failed', { reason }, { level: 'warn' });
|
|
@@ -247,9 +252,11 @@ export async function runResearchQuestionLadder(
|
|
|
247
252
|
domain: exemplar.domain, domainSignal: exemplar.domainSignal,
|
|
248
253
|
source: exemplar.source, count: exemplar.count, levels: exemplar.levels,
|
|
249
254
|
});
|
|
250
|
-
raw = await (options.generate ?? ((prompt) => defaultGenerate(prompt, 'research-question-ladder')))(
|
|
255
|
+
raw = await (options.generate ?? ((prompt, signal) => defaultGenerate(prompt, 'research-question-ladder', signal)))(
|
|
251
256
|
`${buildResearchQuestionLadderPrompt(request, sectionIds)}\n\n${exemplar.context ? `${exemplar.context}\n\n` : ''}${ladderContext}${retroGroundingContext(request)}`,
|
|
257
|
+
options.signal,
|
|
252
258
|
);
|
|
259
|
+
if (options.signal?.aborted) return { ok: false, ladder: initial, outputContract, output: '', error: 'research aborted' };
|
|
253
260
|
debug.log('research.turn', 'bloom-generated', { questionCount: 6 });
|
|
254
261
|
} catch (error) {
|
|
255
262
|
debug.log('research.turn', 'bloom-failed', { reason: errorText(error) }, { level: 'warn' });
|
|
@@ -276,7 +283,8 @@ export async function runResearchQuestionLadder(
|
|
|
276
283
|
const observedAt = new Date().toISOString();
|
|
277
284
|
let fanout: AxisFanoutResult;
|
|
278
285
|
try {
|
|
279
|
-
fanout = await (options.invokeAxes ?? invokeResearchAxes)(ladder.questions);
|
|
286
|
+
fanout = await (options.invokeAxes ?? ((questions, signal) => invokeResearchAxes(questions, { signal })))(ladder.questions, options.signal);
|
|
287
|
+
if (options.signal?.aborted) return { ok: false, ladder, outputContract, output: '', error: 'research aborted' };
|
|
280
288
|
debug.log('research.turn', 'axis-evidence-collected', {
|
|
281
289
|
axisCount: fanout.axes.length,
|
|
282
290
|
evidenceCount: fanout.axes.reduce((count, axis) => count + axis.evidence.length, 0),
|
|
@@ -327,47 +335,92 @@ export async function runResearchQuestionLadder(
|
|
|
327
335
|
stage: 'axis-fanout', reason: 'every output-contract section slot is filled',
|
|
328
336
|
});
|
|
329
337
|
}
|
|
330
|
-
if (!finalBoundary.complete) {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
})
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
338
|
+
if (!finalBoundary.complete && !options.signal?.aborted) {
|
|
339
|
+
const followupStartedAt = performance.now();
|
|
340
|
+
const followupInput: ResearchGapFollowupInput = {
|
|
341
|
+
request,
|
|
342
|
+
questions: ladder.questions,
|
|
343
|
+
evidence: ladder.evidence,
|
|
344
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
345
|
+
};
|
|
346
|
+
let followupPlan: ResearchGapFollowupPlan | undefined;
|
|
347
|
+
if (options.planGapFollowup || !options.gapFollowup) {
|
|
348
|
+
try {
|
|
349
|
+
followupPlan = (options.planGapFollowup ?? planGapFollowup)(followupInput);
|
|
350
|
+
debug.log('research.turn', 'gap-followup-planned', {
|
|
351
|
+
rounds: followupPlan.rounds,
|
|
352
|
+
classifications: followupPlan.classifications.length,
|
|
353
|
+
calls: followupPlan.followups.length,
|
|
354
|
+
elapsedMs: Math.round((performance.now() - followupStartedAt) * 10) / 10,
|
|
355
|
+
});
|
|
356
|
+
} catch (error) {
|
|
357
|
+
debug.log('research.turn', 'gap-followup-plan-failed', {
|
|
358
|
+
reason: errorText(error),
|
|
359
|
+
elapsedMs: Math.round((performance.now() - followupStartedAt) * 10) / 10,
|
|
360
|
+
}, { level: 'warn' });
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (followupPlan && followupPlan.followups.length === 0) {
|
|
364
|
+
if (followupPlan.classifications.length > 0) {
|
|
365
|
+
sections.push(
|
|
366
|
+
'## Bounded research gap follow-up',
|
|
367
|
+
`Rounds: ${followupPlan.rounds} · budget: ${followupPlan.timeBudgetMs}ms`,
|
|
368
|
+
...followupPlan.classifications.map((item) => `- ${item.questionId} [${item.action}/${item.reason}]${item.skill ? ` · ${item.skill}` : ''}: ${item.gap}`),
|
|
369
|
+
);
|
|
351
370
|
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
371
|
+
debug.log('research.turn', 'gap-followup-skipped', {
|
|
372
|
+
reason: 'no-runnable-followup-calls',
|
|
373
|
+
classifications: followupPlan.classifications.length,
|
|
374
|
+
timeBudgetMs: followupPlan.timeBudgetMs,
|
|
375
|
+
});
|
|
376
|
+
} else {
|
|
377
|
+
const executionStartedAt = performance.now();
|
|
378
|
+
debug.log('research.turn', 'gap-followup-started', {
|
|
379
|
+
evidenceCount: ladder.evidence.length,
|
|
380
|
+
completeEvidenceCount: ladder.evidence.filter((item) => item.outcome === 'complete').length,
|
|
359
381
|
});
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
382
|
+
try {
|
|
383
|
+
const followup = await (options.gapFollowup ?? runGapFollowup)(followupInput);
|
|
384
|
+
const followupLines = [
|
|
385
|
+
'## Bounded research gap follow-up',
|
|
386
|
+
`Rounds: ${followup.rounds} · budget: ${followup.timeBudgetMs}ms`,
|
|
387
|
+
...followup.classifications.map((item) => `- ${item.questionId} [${item.action}/${item.reason}]${item.skill ? ` · ${item.skill}` : ''}: ${item.gap}`),
|
|
388
|
+
];
|
|
389
|
+
for (const envelope of followup.followupEvidence) {
|
|
390
|
+
const attached = attachResearchEvidence(ladder, envelope);
|
|
391
|
+
if (!attached.ok) {
|
|
392
|
+
evidenceRejected = true;
|
|
393
|
+
followupLines.push(`- Evidence rejected: ${attached.reason}`);
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
ladder.evidence = attached.value.evidence;
|
|
397
|
+
followupLines.push(`- [${envelope.outcome}] ${envelope.sourceKind} · ${envelope.source}: ${envelope.content}`);
|
|
398
|
+
}
|
|
399
|
+
for (const card of followup.discoveryCards ?? []) followupLines.push(card);
|
|
400
|
+
if (followup.classifications.length || followup.followupEvidence.length) sections.push(...followupLines);
|
|
401
|
+
debug.log('research.turn', 'gap-followup-completed', {
|
|
402
|
+
rounds: followup.rounds,
|
|
403
|
+
classifications: followup.classifications.length,
|
|
404
|
+
evidenceCount: followup.followupEvidence.length,
|
|
405
|
+
evidenceAttached: ladder.evidence.length,
|
|
406
|
+
elapsedMs: Math.round((performance.now() - executionStartedAt) * 10) / 10,
|
|
365
407
|
});
|
|
408
|
+
finalBoundary = planWorkingBackwardsCompletion(outputContract, ladder.questions, ladder.evidence);
|
|
409
|
+
logCompletionBoundary('gap-followup', finalBoundary);
|
|
410
|
+
if (finalBoundary.complete) {
|
|
411
|
+
debug.log('research.turn', 'completion-boundary-stop', {
|
|
412
|
+
stage: 'gap-followup', reason: 'every output-contract section slot is filled',
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
} catch (error) {
|
|
416
|
+
debug.log('research.turn', 'gap-followup-failed', {
|
|
417
|
+
reason: errorText(error),
|
|
418
|
+
elapsedMs: Math.round((performance.now() - executionStartedAt) * 10) / 10,
|
|
419
|
+
}, { level: 'warn' });
|
|
366
420
|
}
|
|
367
|
-
} catch (error) {
|
|
368
|
-
debug.log('research.turn', 'gap-followup-failed', { reason: errorText(error) }, { level: 'warn' });
|
|
369
421
|
}
|
|
370
422
|
}
|
|
423
|
+
if (options.signal?.aborted) return { ok: false, ladder, outputContract, output: '', error: 'research aborted' };
|
|
371
424
|
|
|
372
425
|
const outputContractSectionIndex = sections.findIndex((section) => section.startsWith('## Output contract\n'));
|
|
373
426
|
if (outputContractSectionIndex < 0) throw new Error('output contract section is missing from research output');
|
|
@@ -405,24 +458,43 @@ export async function runResearchQuestionLadder(
|
|
|
405
458
|
fallbackReason: route?.fallbackReason ?? (route ? undefined : 'router-failed'),
|
|
406
459
|
});
|
|
407
460
|
let routedOutput = '';
|
|
408
|
-
|
|
461
|
+
const hasCompleteEvidence = ladder.evidence.some((item) => item.outcome === 'complete');
|
|
462
|
+
if (route?.skillCallPlan && !hasCompleteEvidence) {
|
|
463
|
+
debug.log('research.turn', 'output-skill-skipped', {
|
|
464
|
+
skill: route.skillCallPlan.skill,
|
|
465
|
+
reason: 'no-complete-evidence',
|
|
466
|
+
evidenceCount: ladder.evidence.length,
|
|
467
|
+
});
|
|
468
|
+
} else if (route?.skillCallPlan) {
|
|
469
|
+
const outputSkillStartedAt = performance.now();
|
|
470
|
+
debug.log('research.turn', 'output-skill-started', {
|
|
471
|
+
skill: route.skillCallPlan.skill,
|
|
472
|
+
evidenceCount: ladder.evidence.length,
|
|
473
|
+
completeEvidenceCount: ladder.evidence.filter((item) => item.outcome === 'complete').length,
|
|
474
|
+
});
|
|
409
475
|
try {
|
|
410
476
|
const formatted = await (options.invokeOutputSkill ?? defaultInvokeOutputSkill)(
|
|
411
|
-
route.skillCallPlan.skill, route.skillCallPlan.args,
|
|
477
|
+
route.skillCallPlan.skill, route.skillCallPlan.args, options.signal,
|
|
412
478
|
);
|
|
413
479
|
if (formatted.ok && formatted.output.trim()) {
|
|
414
480
|
routedOutput = `\n\n## Routed ${route.format} output (${route.skillCallPlan.skill})\n\n${formatted.output.trim()}`;
|
|
415
|
-
debug.log('research.turn', 'output-skill-completed', {
|
|
481
|
+
debug.log('research.turn', 'output-skill-completed', {
|
|
482
|
+
skill: route.skillCallPlan.skill,
|
|
483
|
+
outputChars: formatted.output.length,
|
|
484
|
+
elapsedMs: Math.round((performance.now() - outputSkillStartedAt) * 10) / 10,
|
|
485
|
+
});
|
|
416
486
|
} else {
|
|
417
487
|
debug.log('research.turn', 'output-skill-fallback', {
|
|
418
488
|
skill: route.skillCallPlan.skill,
|
|
419
489
|
reason: formatted.error ?? 'empty output',
|
|
490
|
+
elapsedMs: Math.round((performance.now() - outputSkillStartedAt) * 10) / 10,
|
|
420
491
|
}, { level: 'warn' });
|
|
421
492
|
}
|
|
422
493
|
} catch (error) {
|
|
423
494
|
debug.log('research.turn', 'output-skill-fallback', {
|
|
424
495
|
skill: route.skillCallPlan.skill,
|
|
425
496
|
reason: errorText(error),
|
|
497
|
+
elapsedMs: Math.round((performance.now() - outputSkillStartedAt) * 10) / 10,
|
|
426
498
|
}, { level: 'warn' });
|
|
427
499
|
}
|
|
428
500
|
}
|
|
@@ -436,8 +508,8 @@ export async function runResearchQuestionLadder(
|
|
|
436
508
|
};
|
|
437
509
|
}
|
|
438
510
|
|
|
439
|
-
async function defaultInvokeOutputSkill(skill: string, args: string) {
|
|
440
|
-
const result = await invokeResearch(args, { skill });
|
|
511
|
+
async function defaultInvokeOutputSkill(skill: string, args: string, signal?: AbortSignal) {
|
|
512
|
+
const result = await invokeResearch(args, { skill, signal });
|
|
441
513
|
return { ok: result.ok, output: result.output, ...(result.error ? { error: result.error } : {}) };
|
|
442
514
|
}
|
|
443
515
|
|
|
@@ -451,10 +523,11 @@ export function researchTurnForGrounding(result: ResearchQuestionLadderRunResult
|
|
|
451
523
|
};
|
|
452
524
|
}
|
|
453
525
|
|
|
454
|
-
async function defaultGenerate(prompt: string, usageSite: string): Promise<string> {
|
|
526
|
+
async function defaultGenerate(prompt: string, usageSite: string, signal?: AbortSignal): Promise<string> {
|
|
455
527
|
return streamLLM([{ role: 'user', content: prompt }], () => {}, {
|
|
456
528
|
usageSite,
|
|
457
529
|
usagePhase: 'research',
|
|
530
|
+
...(signal ? { signal } : {}),
|
|
458
531
|
});
|
|
459
532
|
}
|
|
460
533
|
|
|
@@ -488,12 +488,15 @@ function editExistingPr(run: CmdRunner, input: UpsertPrInput, url: string): Upse
|
|
|
488
488
|
/** Same-card rework may have a new run branch. Merge the bound PR head into that work,
|
|
489
489
|
* then update the bound branch with a plain fast-forward push. Every identity read is
|
|
490
490
|
* checked again after the inventory snapshot; an ambiguous or moved PR stays refused. */
|
|
491
|
-
function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullable<GuardVerdict['sameCellReuse']>,
|
|
491
|
+
function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullable<GuardVerdict['sameCellReuse']>,
|
|
492
|
+
initialInventory: GuardVerdict, recheck: () => GuardVerdict): UpsertPrOutcome {
|
|
492
493
|
const cwd = input.worktreePath;
|
|
493
494
|
const pushEvidence = { ref: `refs/heads/${target.branch}`, remoteHead: target.headSha, cardId: target.cardId };
|
|
494
|
-
const fail = (detail: string): UpsertPrOutcome => {
|
|
495
|
+
const fail = (detail: string, inventoryEvidence?: { inventoryBefore: unknown; inventoryAfter: unknown; inventoryDiff: unknown }): UpsertPrOutcome => {
|
|
495
496
|
const safeDetail = sanitizeCredentialText(detail).slice(0, 300);
|
|
496
|
-
debug.log('autopilot.pr-manager', 'same-cell-push-decision', {
|
|
497
|
+
debug.log('autopilot.pr-manager', 'same-cell-push-decision', {
|
|
498
|
+
...pushEvidence, outcome: 'refused', reason: safeDetail, ...inventoryEvidence,
|
|
499
|
+
}, { level: 'warn' });
|
|
497
500
|
return { ok: false, reason: 'guard', detail: `same-cell reuse: ${safeDetail}` };
|
|
498
501
|
};
|
|
499
502
|
if (!/^[0-9a-f]{40}$/i.test(target.headSha) || !Number.isSafeInteger(target.number) || target.number < 1
|
|
@@ -617,11 +620,39 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
|
|
|
617
620
|
|| finalPr.url !== pr.url) return fail('PR changed before push');
|
|
618
621
|
const finalRemote = run('git', ['-C', cwd, 'ls-remote', '--exit-code', 'origin', remoteRef]);
|
|
619
622
|
if (!finalRemote.ok || finalRemote.out.trim() !== `${target.headSha}\t${remoteRef}`) return fail('remote head changed before push');
|
|
620
|
-
const
|
|
623
|
+
const latestInventory = recheck();
|
|
624
|
+
const latest = latestInventory.sameCellReuse;
|
|
621
625
|
if (!latest || latest.number !== target.number || latest.branch !== target.branch
|
|
622
626
|
|| latest.headSha !== target.headSha || latest.cellId !== target.cellId
|
|
623
|
-
|| latest.cardId !== target.cardId || Boolean(latest.legacyBound) !== Boolean(target.legacyBound))
|
|
624
|
-
|
|
627
|
+
|| latest.cardId !== target.cardId || Boolean(latest.legacyBound) !== Boolean(target.legacyBound)) {
|
|
628
|
+
const snapshot = (verdict: GuardVerdict) => ({
|
|
629
|
+
conflicts: [...(verdict.sameCellConflicts ?? [])].map((row) => ({ pr: row.pr,
|
|
630
|
+
branch: row.branch === null ? null : sanitizeCredentialText(row.branch).slice(0, 180),
|
|
631
|
+
headSha: /^[0-9a-f]{40}$/i.test(row.headSha) ? row.headSha.toLowerCase() : 'invalid',
|
|
632
|
+
cardId: row.cardId === null ? null : sanitizeCredentialText(row.cardId).slice(0, 128), slice: row.slice ?? null,
|
|
633
|
+
})).sort((a, b) => a.pr - b.pr),
|
|
634
|
+
reusable: verdict.sameCellReuse ? { number: verdict.sameCellReuse.number,
|
|
635
|
+
branch: sanitizeCredentialText(verdict.sameCellReuse.branch).slice(0, 180),
|
|
636
|
+
headSha: /^[0-9a-f]{40}$/i.test(verdict.sameCellReuse.headSha) ? verdict.sameCellReuse.headSha.toLowerCase() : 'invalid',
|
|
637
|
+
cellId: sanitizeCredentialText(verdict.sameCellReuse.cellId).slice(0, 128),
|
|
638
|
+
cardId: sanitizeCredentialText(verdict.sameCellReuse.cardId).slice(0, 128),
|
|
639
|
+
legacyBound: Boolean(verdict.sameCellReuse.legacyBound) } : null,
|
|
640
|
+
});
|
|
641
|
+
const before = snapshot(initialInventory);
|
|
642
|
+
const after = snapshot(latestInventory);
|
|
643
|
+
const beforeByPr = new Map(before.conflicts.map((row) => [row.pr, row]));
|
|
644
|
+
const afterByPr = new Map(after.conflicts.map((row) => [row.pr, row]));
|
|
645
|
+
const inventoryDiff = {
|
|
646
|
+
added: after.conflicts.filter((row) => !beforeByPr.has(row.pr)),
|
|
647
|
+
removed: before.conflicts.filter((row) => !afterByPr.has(row.pr)),
|
|
648
|
+
changed: after.conflicts.flatMap((row) => {
|
|
649
|
+
const old = beforeByPr.get(row.pr);
|
|
650
|
+
return old && JSON.stringify(old) !== JSON.stringify(row) ? [{ pr: row.pr, before: old, after: row }] : [];
|
|
651
|
+
}),
|
|
652
|
+
reusableChanged: JSON.stringify(before.reusable) !== JSON.stringify(after.reusable),
|
|
653
|
+
};
|
|
654
|
+
return fail('OPEN PR inventory changed before push', { inventoryBefore: before, inventoryAfter: after, inventoryDiff });
|
|
655
|
+
}
|
|
625
656
|
// The result descends from the exact fetched head. The explicit lease binds the
|
|
626
657
|
// remote update to that head, so a delete or move between reads cannot be revived.
|
|
627
658
|
// The Pod hook receives these values for this one push only. It checks the Pod card,
|
|
@@ -857,7 +888,7 @@ export function makePrManager(
|
|
|
857
888
|
};
|
|
858
889
|
const earlyVerdict = earlyGuard ? siblingSliceAllowed(earlyGuard) : undefined;
|
|
859
890
|
const freshGuard = () => checkCreate!({ cwd, base: comparisonBase, seat: input.seat ?? seatFromEnvironment(), body: input.body }, run);
|
|
860
|
-
if (earlyVerdict?.sameCellReuse) return reuseSameCellPr(run, input, earlyVerdict.sameCellReuse, freshGuard);
|
|
891
|
+
if (earlyVerdict?.sameCellReuse) return reuseSameCellPr(run, input, earlyVerdict.sameCellReuse, earlyVerdict, freshGuard);
|
|
861
892
|
if (earlyVerdict?.status === 'refuse') return { ok: false, reason: 'guard', detail: sameCellGuardDetail(earlyVerdict, candidateCardId) };
|
|
862
893
|
const earlyInventoryUnknown = !!candidateCardId && (!checkCreate || (earlyVerdict?.status === 'unknown'
|
|
863
894
|
&& earlyVerdict.reasons.length === 1 && earlyVerdict.reasons[0]?.code === 'inventory-unknown'));
|
|
@@ -73,6 +73,8 @@ export interface ControlObservation {
|
|
|
73
73
|
readonly subjectPtyId?: string;
|
|
74
74
|
/** 이 판단이 속한 harness run. harness 밖 감독자는 생략한다. */
|
|
75
75
|
readonly runId?: string;
|
|
76
|
+
/** Recent same-run chart cells pulled immediately before this supervision judgment. */
|
|
77
|
+
readonly runChart?: readonly { device: string; stopKey: string; observed: string; verdict: string; action: string; handoff: string | null; why: string }[];
|
|
76
78
|
/** Last structured action that could not be performed; brain sees the reason next round. */
|
|
77
79
|
readonly unavailableAction?: string;
|
|
78
80
|
}
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
import type { SelfReportFrame } from './self-report-frame.js';
|
|
32
32
|
import { resolveInstanceName } from '../instance-identity.js';
|
|
33
33
|
import { getHarnessRunId } from '../harness/harness-space.js';
|
|
34
|
-
import { injectKey, setFrameObserver, splitKeys, termSize as tuiTermSize, type Key } from '../tui.js';
|
|
34
|
+
import { injectKey, routeExternalTuiKey, setFrameObserver, splitKeys, termSize as tuiTermSize, type Key } from '../tui.js';
|
|
35
35
|
import { canTransitionAccessMode, type PtyAccessMode, type PtyTransitionPolicy } from '../pty-shell/pty-ref.js';
|
|
36
36
|
import { resolveWriteDecision, type PtyWriteActor } from '../pty-shell/pty-write-arbiter.js';
|
|
37
37
|
import { registerPtyControlTarget, startPtyControlPoller, type PtyControlTarget } from '../pty-shell/registry.js';
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
updatePtyManifestBuild,
|
|
44
44
|
} from '../pty-shell/pty-manifest.js';
|
|
45
45
|
import { writeHarnessScreen } from '../harness/harness-screen.js';
|
|
46
|
-
import { runningBuild, startTuiRunStateRecorder } from '../pty-shell/tui-run-state.js';
|
|
46
|
+
import { runningBuild, seatCompareDepsFromEnv, startTuiRunStateRecorder } from '../pty-shell/tui-run-state.js';
|
|
47
47
|
import type { TuiSelfRestartDeps } from '../pty-shell/tui-run-state.js';
|
|
48
48
|
import { lastHumanKeyAt } from '../tui.js';
|
|
49
49
|
import { debug } from '../debug/log.js';
|
|
@@ -176,9 +176,19 @@ export function createTuiControlTarget(surfaceId: string, deps: TuiControlTarget
|
|
|
176
176
|
stopTurn: (force: true) => force && stopTurn(),
|
|
177
177
|
canWrite: (actor: PtyWriteActor = 'human') => resolveWriteDecision(accessMode, actor).allow,
|
|
178
178
|
write(chars: string): void {
|
|
179
|
+
const keys = parse(chars);
|
|
180
|
+
const remaining: Key[] = [];
|
|
181
|
+
let routedToModal = false;
|
|
182
|
+
for (const key of keys) {
|
|
183
|
+
if (routeExternalTuiKey(key)) routedToModal = true;
|
|
184
|
+
else remaining.push(key);
|
|
185
|
+
}
|
|
186
|
+
if (routedToModal) {
|
|
187
|
+
if (remaining.length > 0 && !remaining.every(inject)) throw new Error('tui-input-undelivered');
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
179
190
|
// ⭐ 이 write 는 «바깥»(제어 IPC)에서만 온다 — 키보드와 섞이기 전에 라우터가 먼저 가른다.
|
|
180
191
|
if (routeExternal(chars) !== 'passthrough') return;
|
|
181
|
-
const keys = parse(chars);
|
|
182
192
|
if (!keys.length || !keys.every(inject)) throw new Error('tui-input-undelivered');
|
|
183
193
|
},
|
|
184
194
|
resize: () => { throw new Error('tui-resize-unsupported'); },
|
|
@@ -444,9 +454,15 @@ export function startTuiSelfReport(deps: TuiSelfReportDeps = {}): () => void {
|
|
|
444
454
|
const startRunState = deps.startRunState
|
|
445
455
|
?? (deps.registerRow
|
|
446
456
|
? () => () => {}
|
|
447
|
-
: (id: string) =>
|
|
448
|
-
|
|
449
|
-
|
|
457
|
+
: (id: string) => {
|
|
458
|
+
// TUI-SEAT-PILOT-2H-COMPARE — 판정 신호 한 줄은 env(ELANOUS_SEAT_COMPARE_RUN_ID)가 있을 때만 켜진다.
|
|
459
|
+
// env 가 없으면 빈 spread → 종전 기록 경로 그대로(보존 계약).
|
|
460
|
+
const seatCompare = seatCompareDepsFromEnv();
|
|
461
|
+
return startTuiRunStateRecorder(id, {
|
|
462
|
+
selfRestart: deps.selfRestart === null ? undefined : (deps.selfRestart ?? productionTuiSelfRestart(readActiveSessionId)),
|
|
463
|
+
...(seatCompare ? { seatCompare } : {}),
|
|
464
|
+
});
|
|
465
|
+
});
|
|
450
466
|
try { stopRunState = startRunState(surfaceId); } catch { /* fail-soft — recorder logs its own write failures */ }
|
|
451
467
|
// 미룬 우편 깨움(TUI-H4) — 이 TUI 가 턴 중·5분 창이라 못 받은 깨움을 idle 로 «기록»된 뒤 한 번 다시 두드린다.
|
|
452
468
|
// 실 행 등록과 짝일 때만(시험이 행 등록을 갈아 끼우면 0) · 무거운 모듈은 늦게 불러온다.
|
package/src/chat/index.ts
CHANGED
|
@@ -523,7 +523,7 @@ export const SLASH_COMMANDS: SlashCommand[] = ([
|
|
|
523
523
|
{ name: 'tablet', aliases: [], description: 'Tablet mode — collapse layout to log + input', subcommands: ['on', 'off', 'toggle', 'auto', 'status', 'browser-preview', 'bp'] },
|
|
524
524
|
{ name: 'surface', aliases: [], description: 'Surface control — open a pane/catalog launcher (/surface catalog · browser · preview · log · scratch · obsidian · skill) OR set a preferred LLM surface (/surface coding-agent · research-agent · control-agent · ops-agent · … · clear · status)', subcommands: ['catalog', 'browser', 'preview', 'browser-preview', 'log', 'scratch', 'obsidian', 'skill', 'skill-file', 'agents', 'coding-agent', 'coding-chat', 'research-agent', 'research-chat', 'control-agent', 'ops-ui-agent', 'ops-fleet-agent', 'ops-agent', 'clear', 'status'] },
|
|
525
525
|
{ name: 'term', aliases: ['terminal'], description: 'Interactive terminal modal — new / list / attach / detach / switch / kill / snapshot / resume', subcommands: ['new', 'list', 'attach', 'detach', 'switch', 'kill', 'snapshot', 'resume'] },
|
|
526
|
-
{ name: 'side', aliases: [], description: '사이드탭
|
|
526
|
+
{ name: 'side', aliases: [], description: '사이드탭 — 목록 · 셸/Codex/Claude 탭 · attach · 미션 결과 파일', subcommands: ['list', 'new', 'attach', 'open', 'mission'] },
|
|
527
527
|
{ name: 'claude', aliases: [], description: 'Spawn claude-code CLI in a terminal modal' },
|
|
528
528
|
{ name: 'codex', aliases: [], description: 'Spawn codex CLI in a terminal modal' },
|
|
529
529
|
{ name: 'gemini', aliases: [], description: 'Spawn gemini CLI in a terminal modal' },
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr": 32646, "headCommit": "1694ccc7a1704d451508008068265aeee45cde24", "reviewed": true, "verdict": "pass", "mustFix": [], "shouldFix": [], "reviewer": "OP-waiver", "model": "none (OP adjudication)", "waiver": {"by": "OP", "approvedBy": "OP 2026-10-29 10:5x «무한 리뷰 중단·웨이버» · r9 초과", "adjudicates": "pr-32646-2dcdb05e4306.json (gpt-6.1-terra r9 fail · mustFix 1: evidencePathPattern 이 @·공백·한글 경로를 잘라 출력)", "headTestRun": {"host": "node-b", "sha": "1694ccc7a1704d451508008068265aeee45cde24", "command": "bun test src/dashboard/seat-boot-preamble.test.ts", "pass": 20, "fail": 0, "expects": 97, "exit": 0, "rawOutput": "~/elanous-hq/seat-state/OPC/evidence/32646-1694ccc7a170-node-b.txt"}, "diffChecked": "2dcdb05e→1694ccc7: seat-boot-preamble.ts +7/-5 · test +16/-8 — 경로 끝 경계 판정 · 공백 경로는 확장자 꼬리 확인 · 시험이 proof@2.md·검증@2.md 전체 보존 ⊕ 공백·# 경로는 잘린 포인터 미출력 확인 — OP 직접 대조", "dispositions": [{"finding": 1, "disposition": "fixed-in-this-head", "evidence": "seat-boot-preamble.test.ts 추가 단언(asciiSpecialPath·unicodeSpecialPath 포함 · spaced/delimiter 잘린 출력 없음) · node-b 20/0"}]}, "summary": "OP waiver — r9 지적 수리 확인."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr": 32853, "headCommit": "bd8f73595c83e3bee478faa3b765d4082c4c5aa6", "reviewed": true, "verdict": "pass", "mustFix": [], "shouldFix": [], "reviewer": "OP-waiver", "model": "none (OP adjudication)", "waiver": {"by": "OP", "approvedBy": "OP 2026-10-29 10:5x «b OP 판정 예외 승인 · 무한 리뷰 중단·웨이버»", "adjudicates": "pr-32853-1c0f33c905e0.json (gpt-6.1-terra r11 fail mustFix 5) — 이후 수정 1c0f33c9→f3d60e98→bd8f7359 은 driver.test.ts 만(import 1 · 동적 경로 · 구독 fake · fail-closed 회귀 추가) · OP 가 diff 직접 대조", "headTestRun": {"host": "node-b", "sha": "bd8f73595c83e3bee478faa3b765d4082c4c5aa6", "command": "bun test src/agent-mission/driver.test.ts", "pass": 140, "fail": 0, "expects": 586, "exit": 0, "reportedBy": "OPC #51223"}, "dispositions": [{"finding": 1, "disposition": "already-fixed", "evidence": "driver.test.ts «$name accepts only its observed final-input suggestion after marker, answer, and stable idle»"}, {"finding": 2, "disposition": "already-fixed", "evidence": "driver.test.ts «completion record preserves a final answer longer than 100 lines…» · «long final answer is preserved while output logging remains bounded» · driver.ts slice(-3500) 은 LLM 입력·reviewSummary 뿐"}, {"finding": 3, "disposition": "out-of-scope-followup", "evidence": "실 CLI 자동 시험 → AGENT-MISSION-BENCH-READY-FU · 실측 run-ab227633 양팔 통과"}, {"finding": 4, "disposition": "already-fixed", "evidence": "driver.test.ts «empty input prompt never completes even after a stable interval»"}, {"finding": 5, "disposition": "fixed-in-this-head", "evidence": "readdirSync import 추가(f3d60e98) · fail-closed 쓰기 실패 회귀 추가(bd8f7359)"}]}, "summary": "OP waiver(재작성) — 정확 head 실측 140/0 근거."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr": 33097, "headCommit": "1cc85900413cfcb2fdc427d4ca85c51fc0eb8358", "reviewed": true, "verdict": "pass", "mustFix": [], "shouldFix": [], "reviewer": "OP-waiver", "model": "none (OP adjudication)", "waiver": {"by": "OP", "approvedBy": "OP 2026-10-29 10:5x «무한 리뷰 중단·웨이버» 일반 승인 · r7 상한 도달", "adjudicates": "pr-33097-1cc85900413c.json (gpt-6.1-terra r7 fail mustFix 2 — 리뷰 입력이 PR 본문·실행 로그를 못 봐 재개)", "headTestRun": {"host": "node-b", "sha": "1cc85900413cfcb2fdc427d4ca85c51fc0eb8358", "command": "bun test src/cli/pr-land-heavy-remote.test.ts src/task-orchestrator/surfaces/pod-warm-switch.test.ts src/task-orchestrator/surfaces/warm-reuse-evidence.test.ts src/cli/pr-land-pod-shadow-job.test.ts src/task-orchestrator/surfaces/pod-warm-worker-provider.test.ts", "pass": 130, "fail": 0, "expects": 536, "exit": 0, "rawOutput": "~/elanous-hq/seat-state/TC/evidence/33097-1cc85900-node-b.txt"}, "dispositions": [{"finding": 1, "disposition": "evidence-provided", "evidence": "원문 파일에 명령·EXIT_CODE=0·130 pass · (pass) «heavy land gate decides warm reuse once per landing — no evidence=off · 3 matching=live · 1 mismatch=recent-mismatch» · «persisted writer rows flow through the shared reader…» — OP 가 원문·head 시험 존재 대조"}, {"finding": 2, "disposition": "already-fixed", "evidence": "warm-reuse-evidence.test.ts:56 «expired or corrupt rows cannot revive older warm matches» · :69 «corruption after recent passing rows invalidates the entire evidence window» · :83 «a corrupt recent mismatch row cannot restore the preceding three green samples» — 원문에서 corrupt (pass) 3"}]}, "summary": "OP waiver — r7 stale reopen · 정확 head node-b 원문 130/0 근거."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr":33106,"headCommit":"972f31e4a3cab0dc62873f915f0c71a2882b6044","reviewed":true,"verdict":"pass","mustFix":[],"shouldFix":[],"reviewer":"OP-waiver","model":"none (OP adjudication)","waiver":{"by":"OP","approvedBy":"OP 2026-10-29 12:2x «0.2.41 재개 최적 경로» · 10:5x 웨이버 승인","adjudicates":"gpt-6.1-terra r6 on cc59ca7b (fail · mustFix 2 · shouldFix 1)","headTestRun":{"host":"node-b","sha":"972f31e4a3cab0dc62873f915f0c71a2882b6044","scope":"resume-release.test.ts 전체(apps/pwa/node_modules 부재 전·후 모두 · afterAll rmdirSync 경로 실제 통과)","pass":40,"fail":0,"reportedBy":"MK #51574"},"parentTestRun":{"host":"node-b","sha":"cc59ca7b1e264f4f23504d5523a32efbecf300b9","scope":"resume-release·release-branch·gate-autoheal·gate-shard-receipts 4 suite","pass":287,"fail":0,"expects":1677,"reportedBy":"MK #51494"},"diffChecked":"cc59ca7b→32646bb4: resume-release.ts +13/-5 · resume-release.test.ts +45/-? — 저장된 cutoff baseline 과 receipt base40 대조 · 부재/불일치 시 full(fail-closed) · OP 직접 대조 · 32646bb4→30001d64→972f31e4: 시험 파일만 — Pod checkout 의 apps/pwa/node_modules 부재(기존 28·새 3 실패 공통 원인 · 급행 게이트 123723) 를 빈 디렉터리 fixture 로 · 정리는 rmdirSync","mergeGate":"급행 열차 gate 가 착지 전 전체 반경 재측정","dispositions":[{"finding":1,"disposition":"fixed-in-this-head","evidence":"expectedBase40 = cutoff 노드 baseline.sha · 불일치/부재 → fail(full gate)"},{"finding":2,"disposition":"out-of-scope-followup","evidence":"Goodhart(합성 gate 출력 대신 실 graph 상태) → 0.2.42 GATE-MOCK-EVENT-SCENARIOS"},{"finding":3,"disposition":"fixed-in-this-head","evidence":"SIGTERM 시험이 완료 receipt 확인 뒤 중단"}],"expressGateFinding":"batch-minim5-express-123723 introduced 3 = 환경 원인(verifyResumePreflight 기본 commandRoot 의 apps/pwa/node_modules 부재) — 같은 파일 preexisting 28 과 동일 원인"},"summary":"OP waiver — 0.2.41 필수 GATE-RESUME-STALLED-ONLY."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr": 33113, "headCommit": "3ab51f05968f926047a670d11c2afcca698df028", "reviewed": true, "verdict": "pass", "mustFix": [], "shouldFix": [], "reviewer": "OP-waiver", "model": "none (OP adjudication)", "waiver": {"by": "OP", "approvedBy": "OP 2026-10-29 10:5x «무한 리뷰 중단·웨이버» · identity 지적 r1·r2 반복", "adjudicates": "ux-coord-entrance-fold-terra-r2-33113-f5db480b56d5.json (fail · mustFix 2)", "headTestRun": {"host": "node-b", "sha": "3ab51f05968f926047a670d11c2afcca698df028", "tests": {"task-hand": "1/0", "coordinator-shadow": "9/0", "tick": "5/0"}, "exit": 0, "rawOutput": "~/elanous-hq/seat-state/UX/evidence/33113-3ab51f05968f-node-b.txt", "fileHashesMatchHead": 7}, "dispositions": [{"finding": 1, "disposition": "reviewer-misread-contract", "evidence": "칸 COORD-ENTRANCE-FOLD «조율자 그림자가 ④ builder 로 같은 칸·같은 지시서 3일 연속» — ④ builder 는 지시서를 «만드는» caller 단계(OP #51545·#51569 정의 · PR 본문 기록). recipient(--seat)는 받는 자리로 증거 행에만 남긴다. 리뷰어는 builder 4 를 «받는 쪽»으로 읽었다."}, {"finding": 2, "disposition": "fixed-in-this-head", "evidence": "coordinator-shadow.ts:120 그룹 키 = agent·cell·directive(recipient 제외) · :116-124 recipient 는 그룹 속성으로만 · recipient 없는 옛 행도 같은 그룹 — OP 가 head 코드 직접 대조"}]}, "summary": "OP waiver — 계약 오독 1 · 수리 확인 1."}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"pr":"33097","model":"gpt-6.1-terra","verdict":"fail","mustFix":["통합 head의 필수 수용 증거가 미완료다: 골 문서가 요구한 `bun test src/cli/pr-land-heavy-remote.test.ts src/task-orchestrator/surfaces/pod-warm-switch.test.ts`와 생산 호출 경로를 지나는 mock 무대의 명령·종료 코드·출력 원문이 없다. 장애 환경을 피한 판단은 타당하지만, node-b에서 실행해 일치 3건의 live, mismatch의 recent-mismatch, 착지당 판정 1줄과 기존 시험 통과를 확인해야 한다.","`readWarmReuseEvidence()`는 손상되거나 유효하지 않은 행을 조용히 제거한다. 최근 mismatch 행이 손상되면 그 앞의 성공 행들이 연속 표본으로 복원될 수 있어 fail-closed가 아니다. 손상된 창은 미측정으로 처리하고 회귀 시험을 추가하라."],"shouldFix":[],"requirements":["DELTA-FINDING 1: OPEN — 이번 delta에 필수 실행 결과와 출력 증거가 없다.","DELTA-FINDING 2: OPEN — 회귀 시험은 추가됐지만 구현 변경이나 시험 통과 증거는 없다.","관찰: 추가된 시험은 임시 디렉터리의 파일만 쓰고 정리한다. 실제 fail-closed 동작은 시험 실행 결과로 확인해야 한다."],"reviewed":true,"diffBudget":{"truncated":false,"shownChars":1645,"totalChars":1645,"omittedFiles":0},"referencedFilesOpened":false,"referencedFilesRead":0,"reviewInputChars":2488,"reviewDurationMs":6440,"basedOn":"10cd6c80fe8d036f7530fd373fcfffc1aa9be044","basedOnReview":"warm-land-evidence-terra-0241-r5-33097-10cd6c80fe8d.json","deltaFindings":[{"finding":"통합 head의 필수 수용 증거가 미완료다: 골 문서가 요구한 `bun test src/cli/pr-land-heavy-remote.test.ts src/task-orchestrator/surfaces/pod-warm-switch.test.ts`와 생산 호출 경로를 지나는 mock 무대의 명령·종료 코드·출력 원문이 없다. 장애 환경을 피한 판단은 타당하지만, node-b에서 실행해 일치 3건의 live, mismatch의 recent-mismatch, 착지당 판정 1줄과 기존 시험 통과를 확인해야 한다.","status":"open"},{"finding":"`readWarmReuseEvidence()`는 손상되거나 유효하지 않은 행을 조용히 제거한다. 최근 mismatch 행이 손상되면 그 앞의 성공 행들이 연속 표본으로 복원될 수 있어 fail-closed가 아니다. 손상된 창은 미측정으로 처리하고 회귀 시험을 추가하라.","status":"open"}],"excludedNewFindings":2,"deltaInputChars":2488,"deltaDurationMs":6440,"deltaEfficiency":{"inputRatio":0.8632893823733518,"timeRatio":0.9649385675756668,"maxRatio":0.3333333333333333,"withinTarget":false},"deltaOutcome":"reviewed","reviewRoute":"api","fallbackAttempted":false,"requestedModel":"gpt-6.1-terra","fallbackNotAttemptedReason":"primary-review-succeeded","skippedAcpFallbackBackends":[{"backend":"gemini","reason":"Confirmed live 2026-08-19 (first observed 2026-08-12): gemini-cli is rejected with IneligibleTierError (free-tier UNSUPPORTED_CLIENT). Antigravity CLI (agy) replaces it but does NOT speak ACP, so this ACP entry has no successor yet — use the PTY backend (--backend gemini) instead."}],"respondedProvider":"openai-codex","respondedModel":"gpt-6.1-terra","reviewerSource":"cli","headCommit":"1cc85900413cfcb2fdc427d4ca85c51fc0eb8358","currentHeadCommit":"1cc85900413cfcb2fdc427d4ca85c51fc0eb8358","stale":false,"refetched":false,"diffSource":"sha-pinned","diffBaseCommit":"10cd6c80fe8d036f7530fd373fcfffc1aa9be044","localHeadComparison":"unavailable","localHead":"59018b9bd0d74574b50bdf4880373756335758a8","prHead":"1cc85900413cfcb2fdc427d4ca85c51fc0eb8358","localHeadComparisonReason":"detached-head","reviewerContextLoaded":0,"reviewerContextFailed":0,"reviewerContextFailures":[],"reviewerContextSource":"pr-diff-files","reviewerContextSourcePaths":[],"decompositionContextStatus":"absent","findingPathHeadChecks":[],"pathWarnings":[],"evidence":"saved-review-delta","prDiffFiles":1}
|
|
@@ -6,6 +6,8 @@ import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
|
6
6
|
import { getUserConfig } from '../user-config.js';
|
|
7
7
|
import { debug, redactSecretText } from '../debug/log.js';
|
|
8
8
|
import { gateRemoteHostCap, realGateRemoteRunner, resolveGateRemoteSettings, runOnRemote, type GateRemoteRunner, type RemoteRunOutcome } from '../self-implement/gate-remote.js';
|
|
9
|
+
import { decideWarmReuse, type WarmReuseEvidenceByConsumer, type WarmReuseSwitchConfig } from '../task-orchestrator/surfaces/pod-warm-switch.js';
|
|
10
|
+
import { buildLandWarmEvidence, type LandShadowSampleWindow } from './pr-land-pod-shadow-job.js';
|
|
9
11
|
|
|
10
12
|
const SHA = /^[0-9a-f]{40}$/i;
|
|
11
13
|
// This is the stable fallback order when settings.host is unavailable; an explicitly configured allowlisted host
|
|
@@ -66,6 +68,10 @@ export interface HeavyRemoteDeps {
|
|
|
66
68
|
/** Test seam — same cadence as self gate (`dispatchHeavyCheck`): sleep at most 15s while a host stays busy. */
|
|
67
69
|
sleep?: (ms: number) => void;
|
|
68
70
|
observe?: (event: string, data: Record<string, unknown>) => void;
|
|
71
|
+
/** WARM-REUSE-LAND-CONSUMER-WIRE — land warm 재사용 config seam(기본은 `getUserConfig().pod?.warmReuse`). */
|
|
72
|
+
warmReuseConfig?: () => WarmReuseSwitchConfig | undefined;
|
|
73
|
+
/** WARM-REUSE-LAND-CONSUMER-WIRE — land shadow Job 결과 창 seam(기본 없음 = 증거 없음 = off). */
|
|
74
|
+
landShadowSamples?: () => LandShadowSampleWindow | undefined;
|
|
69
75
|
}
|
|
70
76
|
|
|
71
77
|
function evidencePath(input: HeavyRemoteInput): string {
|
|
@@ -209,6 +215,32 @@ export function ensurePrLandHeavyRemote(input: HeavyRemoteInput, deps: HeavyRemo
|
|
|
209
215
|
if (!Number.isSafeInteger(input.pr) || input.pr <= 0 || !SHA.test(input.head) || !SHA.test(input.main)) {
|
|
210
216
|
return { ok: false, source: 'unmeasured', reason: 'invalid-pr-head-or-main', elapsedMs: 0, evidencePath: path };
|
|
211
217
|
}
|
|
218
|
+
// WARM-REUSE-LAND-CONSUMER-WIRE — 무거운 착지 판정마다 land 소비자 판정을 1줄 남긴다(pod.warm/switch-decision).
|
|
219
|
+
// 판정은 그림자 전용이다: live 여부와 무관하게 원격 게이트는 기존(fresh) 경로를 그대로 간다.
|
|
220
|
+
// 증거는 land shadow Job 결과 창(주입 seam · 기본 없음=증거 없음=off)에서 만들고, 판정 실패는 착지를 깨지 않는다.
|
|
221
|
+
let warmConfig: WarmReuseSwitchConfig | undefined;
|
|
222
|
+
let warmEvidence: WarmReuseEvidenceByConsumer | undefined;
|
|
223
|
+
let warmStage: 'config' | 'evidence' = 'config';
|
|
224
|
+
try {
|
|
225
|
+
warmConfig = deps.warmReuseConfig?.() ?? getUserConfig().pod?.warmReuse;
|
|
226
|
+
} catch (error) {
|
|
227
|
+
debug.log('pod.warm', 'land-shadow-unavailable', {
|
|
228
|
+
pr: input.pr, stage: warmStage,
|
|
229
|
+
reason: `warm-${warmStage}-read-failed`,
|
|
230
|
+
detail: error instanceof Error ? error.message : String(error), execution: 'fresh-gate',
|
|
231
|
+
}, { level: 'warn' });
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
warmStage = 'evidence';
|
|
235
|
+
warmEvidence = buildLandWarmEvidence(deps.landShadowSamples?.(), { head: input.head, main: input.main });
|
|
236
|
+
} catch (error) {
|
|
237
|
+
debug.log('pod.warm', 'land-shadow-unavailable', {
|
|
238
|
+
pr: input.pr, stage: warmStage, reason: 'warm-evidence-read-failed',
|
|
239
|
+
detail: error instanceof Error ? error.message : String(error), execution: 'fresh-gate',
|
|
240
|
+
}, { level: 'warn' });
|
|
241
|
+
}
|
|
242
|
+
// Read failures leave config/evidence absent, but every valid landing still emits one fail-closed decision.
|
|
243
|
+
decideWarmReuse('land', warmConfig, warmEvidence);
|
|
212
244
|
// A cached success is still a landing claim; accept only a measured host in the landing allowlist.
|
|
213
245
|
const settings = deps.settings ?? resolveGateRemoteSettings(getUserConfig().gateRemote);
|
|
214
246
|
if (!allowedHost(settings.host)) {
|