elanous 0.2.38 → 0.2.41
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/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +149 -0
- package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1178.1aa9cad0e7695427.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 1219.7e17964e0e7cd8e5.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +287 -0
- package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +90 -0
- package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7573.2376e13c9c21f1f8.js → 1765.679b29625c8e88d4.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 1800.f7ff51dc4978a958.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +1 -0
- package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 2263.e09b6edea33bad2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +41 -0
- package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +32 -0
- package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 2fdf2931.b431eee4fb468bc3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 2fe2c302.41b517f88d6fe502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +79 -0
- package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +1 -0
- package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +74 -0
- package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → 385e4574.e9886ab32759eda3.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 4527.a69f2894d1bc9f4a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 4667.97e31aa38c95c475.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 4702.4a4adc1f16d7c93b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +94 -0
- package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 5159.115f1c2ca471386c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/530.d26346e18089640a.js +115 -0
- package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → 53aeb4ee-51c92f8d683f5220.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 5471.1e611302ed3a7c53.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 5574.f35accf4f132b29d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 5744.b9415e18ad623100.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5300.677c97e0393742e6.js → 5892.2526d962339662d8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 5947-135e26537d80a6b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 5964-7e21164a8f2cf0ce.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +62 -0
- package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +2 -0
- package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +122 -0
- package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2415.738b777642a02233.js → 7191.fdc955f7d96064a4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8050-9b364bdef8f71927.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +104 -0
- package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 9048.212083de42d25be3.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 9507.7026657a2f47eb64.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +93 -0
- package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +34 -0
- package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 9834.63ab2bbc3153172e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3389.012c70767a872f9b.js → 9869.81a1e24ca682d5a0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → a0a01613.6d1cca322238d7fe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → addc2b32.8c4ff8f0aefe987d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-14949db884bfa672.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → c0c1a699.0ba79f97005965d4.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +22 -22
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +21 -21
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +22 -22
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +22 -22
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- package/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/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
- package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
- package/graphs/demo/persona-marketer/recipes.yaml +19 -0
- 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/overlays/stop-heal-ladder.yaml +23 -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 +3 -0
- package/graphs/units/verbs/research.yaml +20 -0
- package/graphs/video/explainer-line.yaml +4 -1
- package/graphs/work/research-report.yaml +11 -1
- package/package.json +1 -1
- package/scripts/dead-code/report.ts +169 -0
- 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/lib/morning-report-options.ts +3 -4
- package/scripts/lib/tui-regress-evidence.ts +56 -0
- package/scripts/llm-cost-ledger.ts +179 -8
- package/scripts/measure-nl-routing-corpus.ts +10 -2
- package/scripts/morning-report.ts +5 -1
- package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
- package/scripts/public-copy-lint.ts +163 -19
- package/scripts/public-export.ts +15 -7
- package/scripts/ratchets/train-side-invariants.sh +0 -1
- package/scripts/release-loop/export-check-node.ts +21 -3
- package/scripts/release-loop/gate-autoheal.ts +117 -0
- package/scripts/release-loop/gate-baseline-receipt.ts +8 -1
- package/scripts/release-loop/gate-diff.ts +22 -3
- package/scripts/release-loop/gate-node.ts +583 -64
- package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
- package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
- package/scripts/release-loop/gate-shard-receipts.ts +89 -0
- package/scripts/release-loop/gate-triage-node.ts +70 -10
- package/scripts/release-loop/gate-wall.ts +5 -5
- package/scripts/release-loop/preflight.ts +6 -2
- package/scripts/release-loop/resume-release.ts +267 -20
- package/scripts/release-loop/resume.ts +48 -0
- package/scripts/release-loop/traffic-node.ts +6 -3
- package/scripts/release-loop/unattended-release.ts +4 -2
- package/scripts/release-loop/version-node.ts +7 -2
- package/scripts/release-story/draft.ts +1 -1
- package/scripts/research-bench/README.md +53 -0
- package/scripts/research-bench/questions.json +66 -0
- package/scripts/research-bench/rubric.md +33 -0
- package/scripts/research-bench/run.ts +523 -0
- package/scripts/shadow-authoring-probe.ts +20 -0
- package/scripts/tui-regress.ts +85 -10
- package/scripts/ux-sim.ts +19 -2
- package/src/acp/core-turn-bridge.ts +94 -4
- package/src/agent/autonomous-tools.ts +10 -3
- package/src/agent/monad-agent-turn.ts +4 -1
- package/src/agent/registry.ts +26 -2
- package/src/agent/shared-app-tools.ts +1 -1
- package/src/agent/surface-ux/build.ts +12 -3
- package/src/agent/surface-ux/types.ts +1 -1
- package/src/agent/task-notification.ts +75 -6
- package/src/agent/types.ts +3 -0
- package/src/agent-mission/driver.ts +29 -3
- package/src/agent-mission/mission-cli.ts +2 -1
- package/src/agent-substrate/review-context-pack.ts +365 -0
- package/src/agent-substrate/self-review-cli.ts +291 -20
- package/src/ask-user-question/index.ts +6 -0
- package/src/ask-user-question/inline-resolver.ts +49 -0
- package/src/auto-research/question-ladder-contract.ts +22 -3
- package/src/auto-research/research-turn.ts +359 -17
- package/src/autopilot/agent-loop.ts +1 -1
- package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
- package/src/autopilot/pty-control-loop.ts +8 -1
- package/src/boot/daemon-tools/index.ts +4 -3
- package/src/boot/daemon-tools/self-implement.ts +312 -7
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/budget/llm-cost.ts +44 -5
- package/src/budget/shadow-arms.ts +52 -0
- package/src/budget/unified-usage.ts +17 -1
- package/src/capture/tui-self-report.ts +14 -0
- package/src/chat/index.ts +33 -7
- package/src/chat/pickers/state.ts +7 -1
- package/src/cli/agent-cli.ts +43 -8
- package/src/cli/intake-cli.ts +22 -1
- package/src/cli/lesson-cli.ts +19 -3
- package/src/cli/log-event-names.ts +6 -0
- package/src/cli/mcp-login.ts +8 -18
- package/src/cli/msg-cli.ts +57 -1
- package/src/cli/pod-cli.ts +17 -2
- package/src/cli/pr-land-heavy-remote.ts +15 -9
- package/src/cli/pty-takeover-cli.ts +67 -7
- package/src/cli/release-cli.ts +79 -7
- package/src/cli/repo-cli.ts +2 -1
- package/src/cli/sim-cli.ts +7 -1
- package/src/cli/tasks-cli.ts +41 -13
- package/src/codex/models.ts +30 -15
- package/src/control-plane/ledger.ts +21 -4
- package/src/core-turn/run-core-turn.ts +47 -3
- package/src/core-turn/run-goal-loop.ts +240 -10
- package/src/core-turn/types.ts +9 -0
- package/src/dashboard/acp-boot.ts +72 -3
- package/src/dashboard/chat/acp-chat.ts +2 -2
- package/src/dashboard/classic-sigquit.ts +16 -0
- package/src/dashboard/index.ts +327 -27
- package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
- package/src/dashboard/input/chat-main-slash-command.ts +7 -0
- package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
- package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
- package/src/dashboard/input/external-input-host.ts +2 -0
- package/src/dashboard/sidetab-runtime.ts +228 -0
- package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
- package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
- package/src/dashboard/term-slash-runtime.ts +16 -18
- package/src/dashboard/turn-preamble.ts +14 -1
- 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/domains/knowledge.ts +1 -1
- package/src/esc-abort-gate.ts +33 -1
- package/src/execution-loop/launch-gate.ts +206 -1
- package/src/graph-runner/graph-cli.ts +27 -4
- package/src/graph-runner/in-process-registry.ts +37 -0
- package/src/graph-runner/runner.ts +63 -11
- package/src/graph-wizard/generate.ts +16 -7
- package/src/graph-wizard/mission-compose.ts +201 -0
- package/src/grok/agent-search.ts +8 -2
- package/src/grok/credential.ts +5 -0
- package/src/grounding/ref-index.ts +30 -0
- package/src/grounding/ref-vector.ts +61 -0
- package/src/grounding/sources-cli.ts +11 -3
- package/src/grounding/sources.ts +15 -1
- package/src/harness/harness-cli-command.ts +305 -23
- package/src/harness/harness-incidents.ts +312 -7
- package/src/harness/harness-pod-dispatch.ts +7 -1
- package/src/harness/harness-space.ts +15 -1
- package/src/harness/progress-worker-entry.ts +59 -0
- package/src/harness/progress-worker-runtime.ts +11 -0
- package/src/index.ts +35 -5
- package/src/input/external-input-queue.ts +10 -0
- package/src/instance/dev-project.ts +25 -0
- package/src/intake-plane/collect-telegram-saved.ts +36 -1
- package/src/intake-plane/intake-to-tasks.ts +246 -3
- package/src/intelligence-map/model-alias.ts +6 -5
- package/src/intelligence-map/model-catalog.ts +59 -2
- package/src/lessons/friction-ledger.ts +154 -0
- package/src/live-supply/collector.ts +149 -0
- package/src/live-supply/probes.ts +52 -0
- package/src/live-supply/snapshot.ts +40 -0
- package/src/llm/model-defaults.ts +4 -4
- package/src/llm.ts +473 -87
- package/src/loops/orchestrator/tick.ts +56 -0
- 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/nexus/api/harness-api.ts +2 -1
- package/src/output-truncation.ts +41 -12
- package/src/project/project-store.ts +48 -1
- package/src/pty/snapshot.py +132 -0
- package/src/pty-shell/pty-control-ipc.ts +29 -2
- package/src/pty-shell/pty-manifest.ts +59 -3
- package/src/pty-shell/registry.ts +2 -0
- package/src/pty-shell/tui-run-state.ts +80 -3
- package/src/release-loop/gate-host-reservation.ts +157 -4
- package/src/release-loop/gate-shard-ledger.ts +68 -0
- package/src/release-loop/merged-pr-checklist.ts +25 -2
- package/src/release-loop/rehearsal-shard-plan.ts +6 -1
- package/src/release-loop/rehearsal.ts +27 -0
- package/src/release-loop/release-schedule.ts +90 -1
- package/src/research/bloom-exemplars.ts +135 -0
- package/src/research/edge-decision.ts +124 -15
- package/src/research/gap-followup.ts +249 -0
- package/src/research/lenses/counter-evidence.ts +100 -0
- package/src/research/lenses/working-backwards.ts +89 -0
- package/src/research/plugin-discovery.ts +242 -0
- package/src/research-bridge/invoke.ts +4 -2
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +73 -131
- package/src/self-dev/dev-cli.ts +19 -17
- package/src/self-dev/dev-pipeline.ts +8 -4
- package/src/self-dev/graph-front-nodes.ts +23 -0
- package/src/self-dev/graph-journey-route.ts +10 -2
- package/src/self-dev/launch-preflight-text.ts +2 -2
- package/src/self-dev/launch-preflight.ts +47 -11
- package/src/self-dev/orchestrate-cli.ts +1 -0
- package/src/self-dev/orchestrate.ts +15 -0
- package/src/self-dev/run-supervisor.ts +204 -3
- package/src/self-dev/run-types.ts +3 -0
- package/src/self-implement/device-first.ts +8 -2
- package/src/self-implement/doctor-visit.ts +76 -58
- package/src/self-implement/gate-artifacts.ts +16 -0
- package/src/self-implement/gate-baseline.ts +75 -4
- package/src/self-implement/gate-cli.ts +368 -30
- package/src/self-implement/gate-receipt-registry.ts +180 -0
- package/src/self-implement/gate-remote.ts +165 -24
- package/src/self-implement/goal-author-clarification.ts +205 -32
- package/src/self-implement/goal-author-decompose.ts +24 -15
- package/src/self-implement/goal-author.ts +86 -10
- 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/host-regate.ts +124 -49
- package/src/self-implement/impl-findings-feedback.ts +188 -0
- package/src/self-implement/knowhow-pack.ts +227 -10
- package/src/self-implement/off-diff-evidence.ts +124 -0
- package/src/self-implement/orchestrator.ts +320 -28
- package/src/self-implement/run-ledger.ts +110 -14
- package/src/self-implement/run-stop.ts +33 -2
- package/src/self-implement/running-runs.ts +35 -12
- package/src/self-implement/seams.ts +6 -3
- package/src/self-implement/self-implement-cli.ts +40 -6
- package/src/self-implement/stop-autoheal-operational.ts +43 -0
- package/src/self-implement/stop-autoheal.ts +15 -6
- package/src/session/chat.ts +66 -15
- package/src/session/request-size-guard.ts +123 -0
- package/src/session-runtime/provider-circuit.ts +140 -0
- package/src/shell-runner/file-engine.ts +1 -0
- package/src/shell-runner/types.ts +4 -0
- package/src/sidetab-core/model.ts +312 -0
- package/src/skills/tools/schedule-wakeup.ts +23 -1
- package/src/skills/tools/shell.ts +51 -5
- package/src/steward/directive-audit.ts +354 -0
- package/src/surface/child-process.ts +31 -0
- package/src/surface/tui-stderr-owner.ts +48 -0
- package/src/task-agent/cover.ts +30 -12
- package/src/task-agent/judge.ts +56 -0
- package/src/task-agent/parent-host.ts +14 -1
- package/src/task-agent/postland-card.ts +35 -2
- package/src/task-agent/rejudge-on-head.ts +46 -2
- package/src/task-agent/repair-cycle.ts +1 -1
- package/src/task-agent/task-hand.ts +133 -25
- package/src/task-agent/tier-split.ts +105 -21
- package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
- package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +70 -2
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
- package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
- package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +298 -45
- package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
- package/src/tool-runtime/skill-exec-runtime.ts +95 -5
- package/src/tui/entry.ts +25 -5
- package/src/tui/inline-choice.ts +188 -0
- package/src/tui/sidetab/list.ts +36 -165
- package/src/tui/sidetab/nl-tool.ts +2 -136
- package/src/tui/sidetab/peek.ts +52 -0
- package/src/tui/slash/term.ts +12 -1
- package/src/tui-client/dashboard-session.ts +10 -1
- package/src/user-config.ts +45 -9
- package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
- package/src/ux-sim/fake-land-queue.ts +88 -0
- 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/gate-shard-host-reroute.ts +82 -0
- package/src/ux-sim/goal-interim-trace.ts +24 -0
- package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
- package/src/ux-sim/release-sim-rig.ts +262 -0
- package/src/ux-sim/seminar-rehearsal.ts +109 -0
- package/src/ux-sim/subagent-tools-device.ts +2 -2
- package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/recipes/explainer.ts +54 -2
- package/src/web-search/grok.ts +32 -6
- package/src/web-search/index.ts +8 -7
- package/src/workflow-runtime/node-catalog.ts +53 -4
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +0 -148
- package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +0 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7628.6b16863ac3972333.js +0 -34
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7954.4f7a8832663ee979.js +0 -115
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
- package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +0 -226
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
- package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +0 -122
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
- package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
- /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_ssgManifest.js +0 -0
|
@@ -709,16 +709,16 @@ export function buildAgentMissionDevSpec(o: {
|
|
|
709
709
|
export async function executeAgentMissionReroute(
|
|
710
710
|
spec: DevPipelineSpec,
|
|
711
711
|
agentBackend: AgentBackend,
|
|
712
|
-
deps?: { runDevPipeline?: typeof runDevPipeline },
|
|
712
|
+
deps?: { runDevPipeline?: typeof runDevPipeline; signal?: AbortSignal },
|
|
713
713
|
): Promise<{ result: AgentMissionResult; exitCode: number }> {
|
|
714
714
|
const run = deps?.runDevPipeline ?? runDevPipeline;
|
|
715
|
-
const r = await run(spec, { resolveBackend: () => agentBackend });
|
|
715
|
+
const r = await run(spec, { resolveBackend: () => agentBackend, ...(deps?.signal ? { signal: deps.signal } : {}) });
|
|
716
716
|
// ★ 잘못된 라우팅 즉시 표면화 — spec 이 external+pty 가 아니면 kind 불일치(무조건 캐스팅 금지).
|
|
717
717
|
if (r.kind !== 'agent-mission') {
|
|
718
718
|
throw new DevPipelineError(`executeAgentMissionReroute: 예상 밖 dispatch(kind=${r.kind}) — external+pty spec 이어야`);
|
|
719
719
|
}
|
|
720
720
|
const result = r.result;
|
|
721
|
-
return { result, exitCode: result.ok ? 0 : 2 };
|
|
721
|
+
return { result, exitCode: result.reason === 'aborted' ? 130 : result.ok ? 0 : 2 };
|
|
722
722
|
}
|
|
723
723
|
|
|
724
724
|
// ── U4b: self implement 재라우팅 seam(테스트 가능) ──
|
|
@@ -2234,6 +2234,7 @@ async function runDevPipelineDispatch(
|
|
|
2234
2234
|
const result = await run({
|
|
2235
2235
|
...toSelfImplementOptions(text, plan, seams),
|
|
2236
2236
|
...(spec.runId ? { runId: spec.runId } : {}),
|
|
2237
|
+
...(deps.signal ? { signal: deps.signal } : {}),
|
|
2237
2238
|
onNodeEntry: (node, round) => { walk.push({ node, round }); },
|
|
2238
2239
|
});
|
|
2239
2240
|
// ⛔ 「걸음이 비었다」와 「안 걸었다」를 가른다 — 빈 배열은 «싣지 않는다».
|
|
@@ -2252,5 +2253,8 @@ async function runDevPipelineDispatch(
|
|
|
2252
2253
|
// agent-mission-pty
|
|
2253
2254
|
const run = deps.runAgentMission ?? (await import('../agent-mission/driver.js')).runAgentMission;
|
|
2254
2255
|
const resolveBackend = deps.resolveBackend ?? (await import('../agent-mission/driver.js')).resolveBackend;
|
|
2255
|
-
return { plan, kind: 'agent-mission', result: await run(
|
|
2256
|
+
return { plan, kind: 'agent-mission', result: await run({
|
|
2257
|
+
...toAgentMissionSpec(text, plan, resolveBackend),
|
|
2258
|
+
...(deps.signal ? { signal: deps.signal } : {}),
|
|
2259
|
+
}) };
|
|
2256
2260
|
}
|
|
@@ -55,6 +55,19 @@ export function resetFrontVisitCountsForTesting(now?: () => number): void {
|
|
|
55
55
|
lastFrontVisitPruneMs = Number.NEGATIVE_INFINITY;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
/** Explicit context carried by a front-node handler. The same object can grow to
|
|
59
|
+
* hold authoring evidence and budget/checkpoint data without changing handlers. */
|
|
60
|
+
export interface FrontNodeUnitContext {
|
|
61
|
+
readonly runId?: string;
|
|
62
|
+
readonly goalType?: GoalType;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** A front-half processing unit with an explicit input, context, and output. */
|
|
66
|
+
export interface FrontNodeUnit<Input, Output> {
|
|
67
|
+
readonly node: FrontNodeId;
|
|
68
|
+
readonly execute: (input: Input, context: FrontNodeUnitContext) => Promise<Output>;
|
|
69
|
+
}
|
|
70
|
+
|
|
58
71
|
/** Record the actual front-half execution boundary, without controlling the stage. */
|
|
59
72
|
export async function observeFrontNodeUnit<T>(node: FrontNodeId, runId: string | undefined, goalType: GoalType | undefined, execute: () => Promise<T>): Promise<T> {
|
|
60
73
|
const emit = (phase: 'enter' | 'exit'): void => {
|
|
@@ -74,6 +87,16 @@ export async function observeFrontNodeUnit<T>(node: FrontNodeId, runId: string |
|
|
|
74
87
|
finally { emit('exit'); }
|
|
75
88
|
}
|
|
76
89
|
|
|
90
|
+
/** Execute one typed front-node unit while preserving the caller's context and
|
|
91
|
+
* the fail-soft graph.unit observation contract. */
|
|
92
|
+
export function runFrontNodeUnit<Input, Output>(
|
|
93
|
+
unit: FrontNodeUnit<Input, Output>,
|
|
94
|
+
input: Input,
|
|
95
|
+
context: FrontNodeUnitContext,
|
|
96
|
+
): Promise<Output> {
|
|
97
|
+
return observeFrontNodeUnit(unit.node, context.runId, context.goalType, () => unit.execute(input, context));
|
|
98
|
+
}
|
|
99
|
+
|
|
77
100
|
function pruneIdleFrontVisitRuns(nowMs: number): void {
|
|
78
101
|
if (nowMs - lastFrontVisitPruneMs < FRONT_VISIT_PRUNE_INTERVAL_MS) return;
|
|
79
102
|
lastFrontVisitPruneMs = nowMs;
|
|
@@ -122,6 +122,10 @@ export function readJourneyEdge(
|
|
|
122
122
|
* 그 밖의 칸은 그 간선에 결속할 근거(예: 착지 거부 원문·cardId · LAND-REFUSAL-EDGES) — 간선 칸(from·to·taken…)을 덮지 못한다. */
|
|
123
123
|
export interface JourneyEdgeFields {
|
|
124
124
|
readonly moveId?: string;
|
|
125
|
+
readonly runId?: string;
|
|
126
|
+
readonly card?: string;
|
|
127
|
+
readonly pr?: number;
|
|
128
|
+
readonly head?: string;
|
|
125
129
|
readonly [key: string]: unknown;
|
|
126
130
|
}
|
|
127
131
|
|
|
@@ -140,11 +144,15 @@ export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: s
|
|
|
140
144
|
graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
|
|
141
145
|
...journeyJoinFields(),
|
|
142
146
|
});
|
|
143
|
-
// Evidence never overrides an edge field: the later spread wins
|
|
144
|
-
const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch,
|
|
147
|
+
// Evidence never overrides an edge field: the later spread wins. Explicit repair join keys win over ambient context.
|
|
148
|
+
const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch,
|
|
149
|
+
runId, card, pr, head, moveId, ...evidence } = data ?? {};
|
|
145
150
|
debug.log('self-implement', 'graph-edge-taken', {
|
|
146
151
|
...evidence, graphId: 'self-implement', ...route, taken, honored: route.to === null || route.to === taken,
|
|
147
152
|
...(reason === undefined ? {} : { reason }), ...journeyJoinFields(),
|
|
153
|
+
...(runId === undefined ? {} : { runId }), ...(card === undefined ? {} : { card }),
|
|
154
|
+
...(pr === undefined ? {} : { pr }), ...(head === undefined ? {} : { head }),
|
|
155
|
+
...(moveId === undefined ? {} : { moveId }),
|
|
148
156
|
});
|
|
149
157
|
} catch { /* 관측은 fail-soft */ }
|
|
150
158
|
}
|
|
@@ -22,8 +22,8 @@ export interface LaunchPreflightBlocker {
|
|
|
22
22
|
readonly name: string;
|
|
23
23
|
/** 왜 막혔는지 한 줄 — 경로와 수를 포함한다. */
|
|
24
24
|
readonly detail: string;
|
|
25
|
-
/** 골 판독 실패(`goal-unreadable`)
|
|
26
|
-
readonly reasonCode?: 'goal-unreadable' | 'missing-traced-path';
|
|
25
|
+
/** 골 판독 실패(`goal-unreadable`) · 골 해석 실패(`goal-parse`) · traced-path 오류(`missing-traced-path`)를 가르는 사유 코드. */
|
|
26
|
+
readonly reasonCode?: 'goal-unreadable' | 'goal-parse' | 'missing-traced-path';
|
|
27
27
|
/** 어느 검사인지 — 경로를 접지 않은 검사 이름. */
|
|
28
28
|
readonly checkName?: string;
|
|
29
29
|
/** 잘리지 않은 대상 경로. 경로 없는 검사(빈 traced paths)는 생략한다. */
|
|
@@ -695,7 +695,7 @@ export interface AskPreflightDeps {
|
|
|
695
695
|
/** 던지면 그 축은 `unknown` 이 된다. */
|
|
696
696
|
readonly listUnfinishedRuns: (path?: string) => readonly PreflightUnfinishedRun[];
|
|
697
697
|
/** 실제 실행 확신 판정. 기본은 테스트 우주까지 포함한 `queryRunningRuns`이며, 실패는 경고 한 줄로만 남긴다. */
|
|
698
|
-
readonly queryRunningRuns?: (options: { includeTest: true }) => RunningRunsResult;
|
|
698
|
+
readonly queryRunningRuns?: (options: { includeTest: true; timeBudgetMs?: number }) => RunningRunsResult;
|
|
699
699
|
/** 이미 완료된 런 조회. `plannedPaths`는 원장 정규화 결과라 경로 겹침 판정에 재사용한다. */
|
|
700
700
|
readonly listCompletedRuns?: (limit: number, paths?: string | readonly string[]) => PreflightCompletedRunsQuery;
|
|
701
701
|
/** 이미 종료된 중단 런 조회. `plannedPaths`는 원장 정규화 결과라 경로 겹침 판정에 재사용한다. */
|
|
@@ -1019,9 +1019,14 @@ export type RunningRunsConfidenceAssessment =
|
|
|
1019
1019
|
readonly includesTest: true;
|
|
1020
1020
|
};
|
|
1021
1021
|
|
|
1022
|
-
|
|
1022
|
+
const LAUNCH_PREFLIGHT_RUNNING_RUNS_BUDGET_MS = 3_000;
|
|
1023
|
+
|
|
1024
|
+
export function assessRunningRunsConfidence(query: (options: { includeTest: true; timeBudgetMs?: number }) => RunningRunsResult, nowMs: number = Date.now()): RunningRunsConfidenceAssessment {
|
|
1023
1025
|
try {
|
|
1024
|
-
const running = query({ includeTest: true });
|
|
1026
|
+
const running = query({ includeTest: true, timeBudgetMs: LAUNCH_PREFLIGHT_RUNNING_RUNS_BUDGET_MS });
|
|
1027
|
+
if (running.stalled) {
|
|
1028
|
+
throw new Error(`조회 예산 초과(${running.stalled.stage}: ${running.stalled.reason})`);
|
|
1029
|
+
}
|
|
1025
1030
|
const confirmedCount = running.counts.running;
|
|
1026
1031
|
const probableCount = running.counts['probable-running'];
|
|
1027
1032
|
if (!Number.isSafeInteger(confirmedCount) || confirmedCount < 0 || !Number.isSafeInteger(probableCount) || probableCount < 0) {
|
|
@@ -1055,7 +1060,7 @@ export function assessRunningRunsConfidence(query: (options: { includeTest: true
|
|
|
1055
1060
|
}
|
|
1056
1061
|
|
|
1057
1062
|
/** 나이 기반 기존 집계와 별도로 실제 PTY·원장을 교차한 확신 판정을 사람이 읽는 한 줄로 만든다. */
|
|
1058
|
-
export function renderRunningRunsConfidenceAppendix(query: (options: { includeTest: true }) => RunningRunsResult, nowMs: number = Date.now()): string {
|
|
1063
|
+
export function renderRunningRunsConfidenceAppendix(query: (options: { includeTest: true; timeBudgetMs?: number }) => RunningRunsResult, nowMs: number = Date.now()): string {
|
|
1059
1064
|
return assessRunningRunsConfidence(query, nowMs).appendix;
|
|
1060
1065
|
}
|
|
1061
1066
|
|
|
@@ -1112,14 +1117,31 @@ export function decideAskPreflight(
|
|
|
1112
1117
|
const inspectionRoot = goalDocument === null || !hasAuthoredGoal
|
|
1113
1118
|
? undefined
|
|
1114
1119
|
: opts.declaredPathsRoot?.trim() || process.cwd();
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1120
|
+
// ⛔ 골 «판독»(읽기) 실패와 골 «해석» 실패는 고칠 곳이 다르다 — 파서가 던진 예외를 사유 코드로 바꿔
|
|
1121
|
+
// 원장에 «어느 검사가» 막았는지 남긴다(AUT-PREFLIGHT-REASON-OPAQUE: 두 갈래가 한 문장으로 뭉개졌다).
|
|
1122
|
+
let goalParseFailure: { readonly checkName: string; readonly message: string } | undefined;
|
|
1123
|
+
const authoredTracedPaths = (() => {
|
|
1124
|
+
if (goalDocument === null) return [];
|
|
1125
|
+
try {
|
|
1126
|
+
return inspectableAuthoredTracedPaths(deps.tracedPaths(goalDocument), inspectionRoot);
|
|
1127
|
+
} catch (error) {
|
|
1128
|
+
goalParseFailure = { checkName: 'goal-parse', message: oneLineConfidenceFailureDetail(error) };
|
|
1129
|
+
return [];
|
|
1130
|
+
}
|
|
1131
|
+
})();
|
|
1118
1132
|
const tracedPathsRaw = opts.pathsOverride ?? authoredTracedPaths;
|
|
1119
1133
|
const tracedPaths = inspectionRoot && !opts.pathsOverride
|
|
1120
1134
|
? tracedPathsRaw.filter((path) => tracedPathExists(path, inspectionRoot) || isFileShapedTracedPath(path))
|
|
1121
1135
|
: tracedPathsRaw;
|
|
1122
|
-
const declaredNewPaths =
|
|
1136
|
+
const declaredNewPaths = (() => {
|
|
1137
|
+
if (goalDocument === null) return new Set<string>();
|
|
1138
|
+
try {
|
|
1139
|
+
return new Set(declaredNewFilePaths(goalDocument));
|
|
1140
|
+
} catch (error) {
|
|
1141
|
+
goalParseFailure ??= { checkName: 'goal-new-paths', message: oneLineConfidenceFailureDetail(error) };
|
|
1142
|
+
return new Set<string>();
|
|
1143
|
+
}
|
|
1144
|
+
})();
|
|
1123
1145
|
const invalidTracedPaths: Array<{ path: string; reason: 'occupied-new' | 'not-file' | 'missing' | 'inaccessible' }> = inspectionRoot
|
|
1124
1146
|
? authoredTracedPaths.flatMap<{ path: string; reason: 'occupied-new' | 'not-file' | 'missing' | 'inaccessible' }>((path) => {
|
|
1125
1147
|
const occupation = tracedPathOccupation(path, inspectionRoot);
|
|
@@ -1315,7 +1337,8 @@ export function decideAskPreflight(
|
|
|
1315
1337
|
...(recentChangesUnknownReason ? { recentChangesUnknownReason } : {}),
|
|
1316
1338
|
});
|
|
1317
1339
|
const missingTracedPathBlockers: LaunchPreflightBlocker[] = [
|
|
1318
|
-
|
|
1340
|
+
// ⛔ 해석 실패를 「traced path 0」으로 한 번 더 뭉개지 않는다 — 그건 다른 갈래다.
|
|
1341
|
+
...(hasAuthoredGoal && authoredTracedPaths.length === 0 && goalParseFailure === undefined ? [{
|
|
1319
1342
|
kind: 'missing-traced-path' as const,
|
|
1320
1343
|
name: '최종 골의 TRACED PATHS 경로 0',
|
|
1321
1344
|
detail: '정리 후 보존된 traced 경로가 없다 — 실제 파일 또는 유효한 신설: 파일 경로를 골에 선언해야 발사할 수 있다',
|
|
@@ -1347,16 +1370,29 @@ export function decideAskPreflight(
|
|
|
1347
1370
|
checkName: 'goal-read',
|
|
1348
1371
|
targetPath: resolvedGoalFile,
|
|
1349
1372
|
}] : [];
|
|
1373
|
+
const goalParseBlockers: LaunchPreflightBlocker[] = goalParseFailure ? [{
|
|
1374
|
+
kind: 'goal-unreadable',
|
|
1375
|
+
name: `골 문서 해석 실패: ${opts.goalFile}`,
|
|
1376
|
+
detail: `${goalParseFailure.checkName} 검사가 골 문서를 해석하지 못했다(${goalParseFailure.message}) — 골 판독 실패(goal-unreadable)도 traced path 오류(missing-traced-path)도 아닌 별개 갈래다 · 어느 검사가 막았는지는 checkName 이 가른다 — 골의 TRACED PATHS · 신설: 문면을 바로잡아야 한다`,
|
|
1377
|
+
reasonCode: 'goal-parse' as const,
|
|
1378
|
+
checkName: goalParseFailure.checkName,
|
|
1379
|
+
targetPath: resolvedGoalFile,
|
|
1380
|
+
}] : [];
|
|
1350
1381
|
const decisionResult = {
|
|
1351
1382
|
...result,
|
|
1352
|
-
|
|
1383
|
+
// ⛔ 해석 실패를 「대상 경로 0」 문면으로 덮지 않는다 — 사유 코드가 이미 그 자리를 말한다.
|
|
1384
|
+
blockers: [
|
|
1385
|
+
...result.blockers.filter((blocker) => goalParseFailure === undefined || blocker.kind !== 'no-target-paths'),
|
|
1386
|
+
...missingTracedPathBlockers, ...goalParseBlockers, ...goalReadBlockers,
|
|
1387
|
+
],
|
|
1353
1388
|
warnings: [...result.warnings, ...askMarkerWarnings],
|
|
1354
1389
|
runningRunsConfidenceAppendix: runningRunsConfidence.appendix,
|
|
1355
1390
|
};
|
|
1356
1391
|
emittedAskMarkerObservations.add(decisionResult);
|
|
1357
1392
|
return {
|
|
1358
1393
|
result: decisionResult,
|
|
1359
|
-
shouldLaunch: missingTracedPathBlockers.length === 0 &&
|
|
1394
|
+
shouldLaunch: missingTracedPathBlockers.length === 0 && goalParseBlockers.length === 0 && goalReadBlockers.length === 0
|
|
1395
|
+
&& (result.blockers.length === 0 || force),
|
|
1360
1396
|
plannedBranchResolution,
|
|
1361
1397
|
};
|
|
1362
1398
|
}
|
|
@@ -451,6 +451,7 @@ export async function runSelfOrchestrateCliCommand(
|
|
|
451
451
|
await recordRoundPrs(results);
|
|
452
452
|
results = await superviseRun({
|
|
453
453
|
initial: results,
|
|
454
|
+
knowhowRepo: deps.repositoryRoot ?? process.cwd(),
|
|
454
455
|
// The add-repair-task branch below runs each authored review-oscillation repair goal as that goal's new
|
|
455
456
|
// feature (a fresh piece, same goal id) — the supervisor records the repair text, so a second oscillation stops.
|
|
456
457
|
repairGoalExecution: true,
|
|
@@ -1529,6 +1529,9 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1529
1529
|
...(!cancelling && disp?.stopReason ? { stopReason: disp.stopReason } : {}),
|
|
1530
1530
|
...(disp?.completionDisposition ? { completionDisposition: disp.completionDisposition } : {}),
|
|
1531
1531
|
...(disp?.failureClassification ? { failureClassification: disp.failureClassification } : {}),
|
|
1532
|
+
...(disp?.childEvidence?.classificationBasis ? { classificationBasis: disp.childEvidence.classificationBasis } : {}),
|
|
1533
|
+
...(typeof disp?.childEvidence?.terminationReason === 'string'
|
|
1534
|
+
? { terminationReason: disp.childEvidence.terminationReason } : {}),
|
|
1532
1535
|
...(disp?.providerErrors ? { providerErrors: disp.providerErrors } : {}),
|
|
1533
1536
|
...(disp?.rework ? { rework: disp.rework } : {}),
|
|
1534
1537
|
...(disp?.mustFix ? { reviewMustFix: disp.mustFix } : {}),
|
|
@@ -1542,7 +1545,17 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1542
1545
|
};
|
|
1543
1546
|
|
|
1544
1547
|
// S3 — persist a resumable checkpoint after each job settles (fail-soft).
|
|
1548
|
+
let checkpointRound = 0;
|
|
1545
1549
|
const doCheckpoint = (): void => {
|
|
1550
|
+
checkpointRound++;
|
|
1551
|
+
const progressResults = buildResults();
|
|
1552
|
+
const progress = summarizeResults(progressResults);
|
|
1553
|
+
const remaining = Math.max(0, progressResults.length - progress.done - progress.failed - progress.cancelled);
|
|
1554
|
+
try { debug.log('self-dev.orchestrate', 'progress', {
|
|
1555
|
+
runId: runId ?? null, round: checkpointRound, total: progressResults.length,
|
|
1556
|
+
done: progress.done, failed: progress.failed, cancelled: progress.cancelled,
|
|
1557
|
+
landed: progress.landed, remaining,
|
|
1558
|
+
}); } catch { /* progress observation must not change orchestration */ }
|
|
1546
1559
|
if (opts.checkpoint) { try { opts.checkpoint(buildResults()); } catch { /* fail-soft */ } }
|
|
1547
1560
|
if (opts.onSnapshot) { try { opts.onSnapshot(graph.snapshot().tasks); } catch { /* fail-soft */ } }
|
|
1548
1561
|
};
|
|
@@ -1559,6 +1572,8 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1559
1572
|
stage: result.stage ?? null,
|
|
1560
1573
|
mergeReason: result.mergeReason ?? null,
|
|
1561
1574
|
failureClassification: result.failureClassification ?? null,
|
|
1575
|
+
classificationBasis: result.classificationBasis ?? null,
|
|
1576
|
+
terminationReason: result.terminationReason ?? null,
|
|
1562
1577
|
prNumber: result.prNumber ?? null,
|
|
1563
1578
|
});
|
|
1564
1579
|
} catch { /* terminal observation must not change the result */ }
|
|
@@ -9,6 +9,7 @@ export { SUPERVISOR_STOP_REASONS } from './run-types.js';
|
|
|
9
9
|
import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
|
|
10
10
|
import { debug } from '../debug/log.js';
|
|
11
11
|
import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
|
|
12
|
+
import { selectKnowhowPack } from '../self-implement/knowhow-pack.js';
|
|
12
13
|
import { routeSupervisorVerdict } from './supervisor-verdict-edges.js';
|
|
13
14
|
import type { TaskAgentShadowInput } from '../task-agent/shadow.js';
|
|
14
15
|
import { cardPrNumber, taskAgentStatePath } from '../task-agent/task-hand.js';
|
|
@@ -42,6 +43,11 @@ export interface SupervisorRound {
|
|
|
42
43
|
mainSyncRelaunchFeatures?: string[];
|
|
43
44
|
/** PR 없는 미분류 실패에 대해 실제 분해 실행기로 수복한 원래 골. 새 taskId에도 한 번 상한을 지킨다. */
|
|
44
45
|
selfHealDecomposeFeatures?: string[];
|
|
46
|
+
/**
|
|
47
|
+
* NEEDS-HUMAN-REASON-REPAIR — 사유별 자가 수복 1회의 소진 기억(사유 → 그때 수복한 골 전문).
|
|
48
|
+
* 사유가 다르면 다른 시도다. 옛 원장엔 이 칸이 없다 = 「안 쟀다」이지 「시도했다」가 아니다.
|
|
49
|
+
*/
|
|
50
|
+
selfHealRepairFeatures?: Partial<Record<NeedsHumanRepairReason, string[]>>;
|
|
45
51
|
/**
|
|
46
52
|
* Tasks of this round that ended `status=failed` without a PR. Omitted when there are none — and on older
|
|
47
53
|
* history, which never measured it, so the no-PR streak guard reads it as «not measured» and stays off.
|
|
@@ -101,6 +107,10 @@ export interface SupervisorDecision {
|
|
|
101
107
|
action: 'relaunch' | 'add-repair-task' | 'stop';
|
|
102
108
|
stopReason?: SupervisorStopReason;
|
|
103
109
|
why: string;
|
|
110
|
+
/** Repository lessons pulled at this decision, never appended to a child's goal. */
|
|
111
|
+
knowhowPackSliceIds?: string[];
|
|
112
|
+
/** Bounded reference for the supervisor handoff. It is evidence, not an executable child instruction. */
|
|
113
|
+
knowhowPackReference?: string;
|
|
104
114
|
round: number;
|
|
105
115
|
rerunnable: string[];
|
|
106
116
|
reworkable: string[];
|
|
@@ -132,7 +142,96 @@ export interface SupervisorDecision {
|
|
|
132
142
|
};
|
|
133
143
|
oscillation?: { taskIds: string[]; helper: 'review-oscillation'; signature: string; repairGoals?: Record<string, string>; heldTaskIds?: string[] };
|
|
134
144
|
pendingDecision?: 'attempt-care-escalation';
|
|
135
|
-
selfHeal?: { reason:
|
|
145
|
+
selfHeal?: { reason: SelfHealReason; attempt: 1; taskIds: string[]; repairGoals?: Record<string, string> };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* NEEDS-HUMAN-REASON-REPAIR — needs-human 으로 접히기 «전»에 한 번 수복해 볼 사유.
|
|
150
|
+
* 각 사유의 수복은 다르다: 없는 경로 → 재접지 · 범위 확장 → 좁히기 · 시간 초과 → 좁은 시험 · 조각 없음 → 조각 재걸기.
|
|
151
|
+
*/
|
|
152
|
+
export type NeedsHumanRepairReason = 'missing-path' | 'scope-expansion' | 'step-timeout' | 'no-piece';
|
|
153
|
+
|
|
154
|
+
/** 선행 0.2.38 의 분해 수복 사유까지 포함한 자가 수복 사유 전체. */
|
|
155
|
+
export type SelfHealReason = 'supervisor-unclassified-decompose' | `supervisor-${NeedsHumanRepairReason}`;
|
|
156
|
+
|
|
157
|
+
const NEEDS_HUMAN_REPAIR_REASONS: readonly NeedsHumanRepairReason[] = ['missing-path', 'scope-expansion', 'step-timeout', 'no-piece'];
|
|
158
|
+
|
|
159
|
+
/** 파일 부재의 두 코드 — 없는 경로(ENOENT)와 중간 성분이 파일인 경로(ENOTDIR). */
|
|
160
|
+
const MISSING_PATH_ERROR_CODES: ReadonlySet<string> = new Set(['ENOENT', 'ENOTDIR']);
|
|
161
|
+
|
|
162
|
+
const NEEDS_HUMAN_REPAIR_INSTRUCTION: Record<NeedsHumanRepairReason, string> = {
|
|
163
|
+
'missing-path': '없는 경로를 다시 접지한다 — 저장소에 있는 파일이나 골에 명시된 대상 경로만 고르고, 새 파일은 골이 신설을 요구할 때만 만든다',
|
|
164
|
+
'scope-expansion': '범위 확장을 좁힌다 — 대상 경로 밖으로 나간 변경을 되돌리고 골의 대상·완료 경계 안에서만 구현한다',
|
|
165
|
+
'step-timeout': '단계 예산을 넘겼다 — 좁은 시험 하나로 판정선을 먼저 세우고 나머지 실행은 그 뒤로 미룬다',
|
|
166
|
+
'no-piece': '조각 없이 실패했다 — 같은 골을 다시 걸되 완료 경계를 한 조각 분량으로 잘라 건다',
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
function normalizedRepairPath(path: string): string {
|
|
170
|
+
return path.replace(/^\.\//u, '').replace(/[),.;:]+$/u, '');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** 경로가 범위 집합 안인가 — 정확 일치 · 디렉터리 접두 · (언급이 파일 이름뿐이면) 파일 이름 일치. */
|
|
174
|
+
function pathWithinScope(path: string, scope: readonly string[]): boolean {
|
|
175
|
+
const p = normalizedRepairPath(path);
|
|
176
|
+
return scope.some((raw) => {
|
|
177
|
+
const s = normalizedRepairPath(raw);
|
|
178
|
+
if (s === p) return true;
|
|
179
|
+
if (s.endsWith('/') ? p.startsWith(s) : p.startsWith(`${s}/`)) return true;
|
|
180
|
+
return !p.includes('/') && s.split('/').at(-1) === p;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* 범위 확장 — «밖»이라고 잰 변경 전부.
|
|
186
|
+
* ⛔ 대상 경로를 모르면 `changedFiles` 로는 «밖»을 단정하지 않는다(둘 다 쟀을 때만).
|
|
187
|
+
* 다만 실행 범위 가드가 «대상 밖»으로 직접 잰 값(`outsideTargetFiles`)은 그 자체가 측정이다.
|
|
188
|
+
*/
|
|
189
|
+
function expandedBeyondTargetPaths(result: SupervisorJobResult): string[] {
|
|
190
|
+
const measured = result.outsideTargetFiles ?? [];
|
|
191
|
+
const changed = result.changedFiles;
|
|
192
|
+
const targets = result.targetPaths;
|
|
193
|
+
const byScope = changed !== undefined && targets !== undefined && targets.length > 0
|
|
194
|
+
? changed.filter((file) => !pathWithinScope(file, targets))
|
|
195
|
+
: [];
|
|
196
|
+
return [...new Set([...measured, ...byScope])];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* needs-human 앞의 수복 사유 discriminator — 결과에 이미 실리는 판정 재료만 본다:
|
|
201
|
+
* 단계(`timed-out`) · 오류 코드(ENOENT/ENOTDIR) · 변경 파일 vs 골 대상 경로 · 분해 제안 조각 수.
|
|
202
|
+
* PR 이 있는 결과(사람이 볼 PR)와 재시도 재료가 있는 결과는 여기 대상이 아니다(undefined).
|
|
203
|
+
*/
|
|
204
|
+
export function needsHumanRepairReason(result: SupervisorJobResult): NeedsHumanRepairReason | undefined {
|
|
205
|
+
if (result.status !== 'failed' || result.prNumber !== undefined || result.prUrl) return undefined;
|
|
206
|
+
if (result.stage === 'timed-out') return 'step-timeout';
|
|
207
|
+
if (result.error?.code !== undefined && MISSING_PATH_ERROR_CODES.has(result.error.code)) return 'missing-path';
|
|
208
|
+
if (expandedBeyondTargetPaths(result).length > 0) return 'scope-expansion';
|
|
209
|
+
if ((result.decomposeProposal?.pieces.length ?? 0) < 2) return 'no-piece';
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/** 사유별 수복 골 원문 — 사유의 수복 지시 + 골의 대상 경로 + 관측된 원인 + 원래 골. */
|
|
214
|
+
export function needsHumanRepairGoal(result: SupervisorJobResult, reason: NeedsHumanRepairReason): string {
|
|
215
|
+
const outside = expandedBeyondTargetPaths(result);
|
|
216
|
+
const repairTargets = result.targetPaths?.length ? result.targetPaths : undefined;
|
|
217
|
+
return [
|
|
218
|
+
`[supervisor-needs-human-repair:${reason}] ${NEEDS_HUMAN_REPAIR_INSTRUCTION[reason]}`,
|
|
219
|
+
...(repairTargets?.length ? [`대상 경로: ${repairTargets.join(', ')}`] : []),
|
|
220
|
+
...(outside.length ? [`대상 경로 밖 변경: ${outside.join(', ')}`] : []),
|
|
221
|
+
...(result.error?.message ? [`이전 실패: ${result.error.message.slice(0, 200)}`] : []),
|
|
222
|
+
result.feature,
|
|
223
|
+
].join('\n');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** 수복 사유가 붙은 자가 수복인가 — 선행 분해 수복('supervisor-unclassified-decompose')과 갈라낸다. */
|
|
227
|
+
function needsHumanRepairDecisionReason(reason: SelfHealReason): NeedsHumanRepairReason | undefined {
|
|
228
|
+
return NEEDS_HUMAN_REPAIR_REASONS.find((candidate) => reason === `supervisor-${candidate}`);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** 사유별 소진 기억에 이 조각이 이미 있는가 — 새 taskId 여도 골 전문으로 짝을 맞춘다. */
|
|
232
|
+
function needsHumanRepairSpent(history: readonly SupervisorRound[], reason: NeedsHumanRepairReason, feature: string): boolean {
|
|
233
|
+
const key = resumeKey(feature);
|
|
234
|
+
return history.some((entry) => (entry.selfHealRepairFeatures?.[reason] ?? []).some((spent) => resumeKey(spent) === key));
|
|
136
235
|
}
|
|
137
236
|
|
|
138
237
|
export interface SupervisorLimits {
|
|
@@ -240,6 +339,11 @@ export type SupervisorJobResult = SelfDevJobResult & {
|
|
|
240
339
|
reviewReason?: string;
|
|
241
340
|
salvage?: 'launched' | 'parked';
|
|
242
341
|
next?: SupervisorNext;
|
|
342
|
+
/**
|
|
343
|
+
* NEEDS-HUMAN-REASON-REPAIR — 실행 범위 가드가 «대상 경로 밖»으로 직접 잰 변경.
|
|
344
|
+
* 골이 대상 경로를 안 선언했어도 이 값은 측정이다 — `changedFiles` 와 달리 «밖»을 단정할 수 있다.
|
|
345
|
+
*/
|
|
346
|
+
outsideTargetFiles?: readonly string[];
|
|
243
347
|
};
|
|
244
348
|
|
|
245
349
|
export function aggregateReviewTrend(results: readonly SelfDevJobResult[]): ReviewRework['trend'] | undefined {
|
|
@@ -355,6 +459,8 @@ export function decideNextRun(input: {
|
|
|
355
459
|
reviewMustFixTrend?: ReviewRework['trend'];
|
|
356
460
|
/** True: the rerun consumes the authored goal. False: it cannot, so oscillation stops for a human. Undefined: pure decision. */
|
|
357
461
|
repairGoalExecution?: boolean;
|
|
462
|
+
/** Separate opt-in for needs-human reason repairs; omitted keeps the new repair execution disabled. */
|
|
463
|
+
needsHumanReasonRepairExecution?: boolean;
|
|
358
464
|
/** 분해 제안을 실제 조각 실행으로 승격할 수 있는 supervisor 경로에만 true. */
|
|
359
465
|
decompositionExecution?: boolean;
|
|
360
466
|
}): SupervisorDecision {
|
|
@@ -545,7 +651,52 @@ export function decideNextRun(input: {
|
|
|
545
651
|
why: `supervisor-unclassified-decompose (attempt: 1/1) — PR 없는 미분류 조각 ${taskIds.length}개를 실증된 분해 제안으로 한 번 재걸기`,
|
|
546
652
|
};
|
|
547
653
|
}
|
|
654
|
+
// NEEDS-HUMAN-REASON-REPAIR — 사람에게 접기 «전»에 사유별로 한 번 수복한다. 수복 골은 rerun 이 그대로 실행한다.
|
|
655
|
+
// ⛔ 실행기가 선언되지 않았으면(repairGoalExecution !== true) 수복 대신 지금처럼 사람에게 간다.
|
|
656
|
+
if (input.repairGoalExecution === true && input.needsHumanReasonRepairExecution === true && round + 1 <= maxRounds) {
|
|
657
|
+
const repairable = activeResults.flatMap((result) => {
|
|
658
|
+
if (!t.needsHuman.includes(result.taskId)) return [];
|
|
659
|
+
if (!t.classifications.some((classification) => classification.taskId === result.taskId && classification.kind === 'unclassified')) return [];
|
|
660
|
+
const reason = needsHumanRepairReason(result);
|
|
661
|
+
if (reason === undefined || (result.targetPaths?.length ?? 0) === 0) return [];
|
|
662
|
+
return needsHumanRepairSpent(history, reason, result.feature) ? [] : [{ result, reason }];
|
|
663
|
+
});
|
|
664
|
+
const first = repairable[0];
|
|
665
|
+
const single = first !== undefined && repairable.length === 1 && t.needsHuman.every((id) => id === first.result.taskId)
|
|
666
|
+
? first : undefined;
|
|
667
|
+
if (single) {
|
|
668
|
+
const taskIds = [single.result.taskId];
|
|
669
|
+
return {
|
|
670
|
+
...base,
|
|
671
|
+
action: 'relaunch',
|
|
672
|
+
needsHuman: t.needsHuman.filter((id) => !taskIds.includes(id)),
|
|
673
|
+
selfHeal: {
|
|
674
|
+
reason: `supervisor-${single.reason}`,
|
|
675
|
+
attempt: 1,
|
|
676
|
+
taskIds,
|
|
677
|
+
repairGoals: { [single.result.taskId]: needsHumanRepairGoal(single.result, single.reason) },
|
|
678
|
+
},
|
|
679
|
+
why: `supervisor-${single.reason} (attempt: 1/1) — ${NEEDS_HUMAN_REPAIR_INSTRUCTION[single.reason]}`,
|
|
680
|
+
};
|
|
681
|
+
}
|
|
682
|
+
}
|
|
548
683
|
if (t.needsHuman.length > 0) {
|
|
684
|
+
// 이미 한 번 수복했는데 같은 사유로 다시 섰다 — 사유·시도를 원문으로 남기고 사람에게 넘긴다.
|
|
685
|
+
const exhausted = activeResults.flatMap((result) => {
|
|
686
|
+
if (!t.needsHuman.includes(result.taskId)) return [];
|
|
687
|
+
const reason = needsHumanRepairReason(result);
|
|
688
|
+
if (reason === undefined || !needsHumanRepairSpent(history, reason, result.feature)) return [];
|
|
689
|
+
return [{ result, reason }];
|
|
690
|
+
});
|
|
691
|
+
if (exhausted.length > 0) {
|
|
692
|
+
return {
|
|
693
|
+
...base,
|
|
694
|
+
action: 'stop',
|
|
695
|
+
stopReason: 'needs-human',
|
|
696
|
+
why: withGoalPlanRevisionObservation(`${exhausted.map(({ result, reason }) =>
|
|
697
|
+
`supervisor-${reason} (attempt: 1/1) — ${NEEDS_HUMAN_REPAIR_INSTRUCTION[reason]} 을 한 번 시도했으나 같은 조각이 다시 실패했다(${result.taskId})`).join(' · ')} · 사람이 볼 것 ${t.needsHuman.length}`),
|
|
698
|
+
};
|
|
699
|
+
}
|
|
549
700
|
return {
|
|
550
701
|
...base,
|
|
551
702
|
action: 'stop',
|
|
@@ -797,6 +948,9 @@ export function appendRound(
|
|
|
797
948
|
if (result.durationMs === undefined) { unknownTimeTaskIds.add(result.taskId); continue; }
|
|
798
949
|
lostTimeMsByTask[result.taskId] = (lostTimeMsByTask[result.taskId] ?? 0) + result.durationMs;
|
|
799
950
|
}
|
|
951
|
+
const selfHealRepairReason = decision?.action !== 'stop' && decision?.selfHeal
|
|
952
|
+
? needsHumanRepairDecisionReason(decision.selfHeal.reason)
|
|
953
|
+
: undefined;
|
|
800
954
|
return [...history, {
|
|
801
955
|
round: history.length,
|
|
802
956
|
landed: countLanded(results),
|
|
@@ -821,6 +975,15 @@ export function appendRound(
|
|
|
821
975
|
return feature === undefined ? [] : [feature];
|
|
822
976
|
}),
|
|
823
977
|
} : {}),
|
|
978
|
+
// NEEDS-HUMAN-REASON-REPAIR — 사유별 수복 1회 소진을 회차 원장에 남긴다(사유가 다르면 다른 시도).
|
|
979
|
+
...(selfHealRepairReason !== undefined && decision?.selfHeal ? {
|
|
980
|
+
selfHealRepairFeatures: {
|
|
981
|
+
[selfHealRepairReason]: decision.selfHeal.taskIds.flatMap((id) => {
|
|
982
|
+
const feature = results.find((result) => result.taskId === id)?.feature;
|
|
983
|
+
return feature === undefined ? [] : [feature];
|
|
984
|
+
}),
|
|
985
|
+
},
|
|
986
|
+
} : {}),
|
|
824
987
|
...(decision?.action === 'add-repair-task' && decision.oscillation ? (() => {
|
|
825
988
|
// Each repaired task is recorded under its original goal feature and, when a rerun runs the authored goal as
|
|
826
989
|
// the piece's new feature (orchestrate), under that repair text too — so the repair's own oscillation stops.
|
|
@@ -1027,6 +1190,8 @@ export function patternMineSignaturesFromDecision(decision: SupervisorDecision):
|
|
|
1027
1190
|
|
|
1028
1191
|
export interface SuperviseRunOptions {
|
|
1029
1192
|
initial: readonly SupervisorJobResult[];
|
|
1193
|
+
/** Stable repository source for decision-time knowhow; falls back to a result worktree if omitted. */
|
|
1194
|
+
knowhowRepo?: string;
|
|
1030
1195
|
rerun: (previous: readonly SupervisorJobResult[], invocation: { relaunch: true; repairGoals?: Record<string, string> }) => Promise<readonly SupervisorJobResult[]>;
|
|
1031
1196
|
limits?: SupervisorLimits;
|
|
1032
1197
|
enrich?: (results: readonly SupervisorJobResult[]) => readonly SupervisorJobResult[];
|
|
@@ -1041,6 +1206,7 @@ export interface SuperviseRunOptions {
|
|
|
1041
1206
|
sweepPendingMerges?: typeof sweepFrozenMerges;
|
|
1042
1207
|
/** True only when rerun consumes `invocation.repairGoals`; omitted or false → a review oscillation stops for a human. */
|
|
1043
1208
|
repairGoalExecution?: boolean;
|
|
1209
|
+
needsHumanReasonRepairExecution?: boolean;
|
|
1044
1210
|
/**
|
|
1045
1211
|
* TASK-AGENT-SHADOW — 멈춤이 확정되면 판단부를 그림자로 부른다(기본 `recordTaskAgentShadowMove`).
|
|
1046
1212
|
* `false` 면 끈다. 던져도 런의 결말은 바뀌지 않는다(fail-soft).
|
|
@@ -1090,6 +1256,7 @@ export async function rejudgeTerminalTaskCard(runId: string | null, deps: {
|
|
|
1090
1256
|
export async function superviseRun(opts: SuperviseRunOptions): Promise<SupervisorJobResult[]> {
|
|
1091
1257
|
let results = [...opts.initial];
|
|
1092
1258
|
let history: SupervisorRound[] = [];
|
|
1259
|
+
const maxRounds = opts.limits?.maxRounds ?? DEFAULT_MAX_ROUNDS;
|
|
1093
1260
|
|
|
1094
1261
|
for (;;) {
|
|
1095
1262
|
try {
|
|
@@ -1137,6 +1304,7 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1137
1304
|
decompositionExecution: opts.promoteDecomposition !== undefined,
|
|
1138
1305
|
// Undeclared = cannot run the repair goal: an add-repair-task would otherwise be a same-strategy relaunch.
|
|
1139
1306
|
repairGoalExecution: opts.repairGoalExecution === true,
|
|
1307
|
+
...(opts.needsHumanReasonRepairExecution === undefined ? {} : { needsHumanReasonRepairExecution: opts.needsHumanReasonRepairExecution }),
|
|
1140
1308
|
...(aggregateReviewTrend(results) ? { reviewMustFixTrend: aggregateReviewTrend(results) } : {}),
|
|
1141
1309
|
...(opts.limits ? { limits: opts.limits } : {}),
|
|
1142
1310
|
...(observed.deployFindings ? { deployFindings: observed.deployFindings } : {}),
|
|
@@ -1147,6 +1315,33 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1147
1315
|
} : {}),
|
|
1148
1316
|
});
|
|
1149
1317
|
|
|
1318
|
+
const reasonRepairSkipped = decision.action !== 'stop' || decision.stopReason !== 'needs-human' || history.length + 1 > maxRounds
|
|
1319
|
+
? [] : results.flatMap((result) => {
|
|
1320
|
+
if (!decision.needsHuman.includes(result.taskId) || needsHumanRepairReason(result) === undefined) return [];
|
|
1321
|
+
if (!decision.classifications.some((classification) => classification.taskId === result.taskId && classification.kind === 'unclassified')) return [];
|
|
1322
|
+
const repairReason = needsHumanRepairReason(result)!;
|
|
1323
|
+
if (needsHumanRepairSpent(history, repairReason, result.feature)) return [];
|
|
1324
|
+
const reason = opts.repairGoalExecution !== true || opts.needsHumanReasonRepairExecution !== true
|
|
1325
|
+
? 'disabled' : 'no-target-paths';
|
|
1326
|
+
if (reason === 'no-target-paths' && (result.targetPaths?.length ?? 0) > 0) return [];
|
|
1327
|
+
return [{ taskId: result.taskId, reason }];
|
|
1328
|
+
});
|
|
1329
|
+
for (const skipped of reasonRepairSkipped) {
|
|
1330
|
+
try { opts.observe?.('supervisor.reason-repair-skipped', skipped); } catch { /* fail-soft */ }
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
// The supervisor consumes knowhow when it judges a failed piece. Keep the child prompt untouched.
|
|
1334
|
+
const failedPiece = results.find((result) => result.status === 'failed' && result.feature.trim());
|
|
1335
|
+
if (failedPiece) {
|
|
1336
|
+
const repo = opts.knowhowRepo ?? failedPiece.worktreePath;
|
|
1337
|
+
if (repo) {
|
|
1338
|
+
const pulled = selectKnowhowPack(repo, failedPiece.feature);
|
|
1339
|
+
try { opts.observe?.('knowhow-pack-decision', { taskId: failedPiece.taskId, ids: pulled.ids, reason: pulled.reason, action: decision.action }); } catch { /* fail-soft */ }
|
|
1340
|
+
if (pulled.ids.length) decision = { ...decision, knowhowPackSliceIds: pulled.ids, knowhowPackReference: pulled.text,
|
|
1341
|
+
why: `${decision.why} · 판단 참고 노하우 ${pulled.ids.join(',')}` };
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1150
1345
|
const runId = opts.runStore?.runId ?? results.find((result) => result.runId?.trim())?.runId ?? null;
|
|
1151
1346
|
|
|
1152
1347
|
let decomposePromotion: DecomposePromotionObservation = decision.decomposable.length === 0
|
|
@@ -1169,7 +1364,13 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1169
1364
|
decomposePromotion = { attempted: true, reason: `shim-failed: ${String(error)}` };
|
|
1170
1365
|
}
|
|
1171
1366
|
}
|
|
1172
|
-
if (decision.selfHeal) {
|
|
1367
|
+
if (decision.selfHeal && needsHumanRepairDecisionReason(decision.selfHeal.reason) !== undefined) {
|
|
1368
|
+
// NEEDS-HUMAN-REASON-REPAIR — 수복 시도는 rerun 이 사유별 수복 골로 실행한다(아래 repairGoals).
|
|
1369
|
+
// 여기서는 «한 번 시도했다»를 관측하고 relaunch 를 유지한다 — 실패는 다음 라운드 판정이 사유·시도 원문으로 접는다.
|
|
1370
|
+
try { opts.observe?.('supervisor-self-heal', { runId, reason: decision.selfHeal.reason,
|
|
1371
|
+
attempt: decision.selfHeal.attempt, taskIds: decision.selfHeal.taskIds,
|
|
1372
|
+
outcome: 'relaunching', repairGoalTasks: Object.keys(decision.selfHeal.repairGoals ?? {}) }); } catch { /* fail-open */ }
|
|
1373
|
+
} else if (decision.selfHeal) {
|
|
1173
1374
|
const promoted = decomposePromotion.attempted && (decomposePromotion.pieceCount ?? 0) >= 2;
|
|
1174
1375
|
try { opts.observe?.('supervisor-self-heal', { runId, reason: decision.selfHeal.reason,
|
|
1175
1376
|
attempt: decision.selfHeal.attempt, taskIds: decision.selfHeal.taskIds,
|
|
@@ -1290,7 +1491,7 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1290
1491
|
// but their results stay in the round so the human hand-off (and the final review-oscillating stop) keeps them.
|
|
1291
1492
|
const held = decision.oscillation?.heldTaskIds ?? [];
|
|
1292
1493
|
const heldResults = results.filter((result) => held.includes(result.taskId));
|
|
1293
|
-
const repairGoals = { ...decision.relaunchGoals, ...decision.oscillation?.repairGoals };
|
|
1494
|
+
const repairGoals = { ...decision.relaunchGoals, ...decision.selfHeal?.repairGoals, ...decision.oscillation?.repairGoals };
|
|
1294
1495
|
const rerunResults = await opts.rerun(held.length ? results.filter((result) => !held.includes(result.taskId)) : results,
|
|
1295
1496
|
{ relaunch: true, ...(Object.keys(repairGoals).length > 0 ? { repairGoals } : {}) });
|
|
1296
1497
|
results = [...rerunResults, ...heldResults.filter((heldResult) => !rerunResults.some((result) => result.taskId === heldResult.taskId))];
|
|
@@ -114,6 +114,9 @@ export interface SelfDevJobResult {
|
|
|
114
114
|
completionDisposition?: string;
|
|
115
115
|
/** Abandoned-run classification from the child. Independent of completionDisposition. */
|
|
116
116
|
failureClassification?: AbandonedClassification;
|
|
117
|
+
/** Basis and explicit terminal reason are kept separate from the classification label. */
|
|
118
|
+
classificationBasis?: string;
|
|
119
|
+
terminationReason?: string;
|
|
117
120
|
/** Provider failure evidence from the child result; absent when unobserved. */
|
|
118
121
|
providerErrors?: { count: number; provider: string; category: 'quota' | 'credential' | 'request' | 'other' };
|
|
119
122
|
/** Stable child run identity used to join its run-ledger proposal. */
|
|
@@ -72,6 +72,12 @@ export function ensureDeviceFirstSteps(goal: string, steps: readonly string[], r
|
|
|
72
72
|
const evidenceCommand = /완료\s*경계\s*증거\s*명령\s*[::]\s*([^\r\n]+)/u.exec(goal)?.[1] ?? '';
|
|
73
73
|
const goalFeatureTest = [evidenceCommand, goal].flatMap((text) => [...text.matchAll(/(?:src|test)\/[\w./-]+\.test\.[cm]?[jt]sx?/gu)]
|
|
74
74
|
.map((match) => match[0])).find((path) => path !== test && !path.startsWith('src/ux-sim/'));
|
|
75
|
+
// ⭐ TDD 를 로직으로(S4) — 문면이 아니라 로직 판정에 필요한 RED→GREEN 기록 필드를 조각 계획에 실어
|
|
76
|
+
// 넘긴다. 오케스트레이터가 [tdd-red]/[tdd-green] 기록의 태그·같은 명령·결과를 판정한다(문면 유지).
|
|
77
|
+
const tddRecordFields = 'TDD 기록 필드: 첫 조각 커밋에 피처 시험을 먼저 쓰고 구현 전 실행 RED 기록을 남긴다'
|
|
78
|
+
+ " — 'EVIDENCE: [tdd-red] <무엇을 확인했나> || <증거 명령>' 다음 줄 'RESULT: <실패 요약 한 줄>'"
|
|
79
|
+
+ " · 구현 뒤 같은 명령의 GREEN 기록을 남긴다 — 'EVIDENCE: [tdd-green] <무엇을 확인했나> || <같은 증거 명령>' 다음 줄 'RESULT: <통과 요약 한 줄>'"
|
|
80
|
+
+ ' · 오케스트레이터가 두 기록의 태그·같은 명령·결과를 로직으로 판정하고 없으면 수리 라운드를 돌린다';
|
|
75
81
|
const completeFeatureStage = (stage: string, index: number): string => {
|
|
76
82
|
const withPredecessor = stage.includes(predecessor) ? stage : `${stage}\n${predecessor}`;
|
|
77
83
|
const declaredGoalTest = index === 0 ? goalFeatureTest : undefined;
|
|
@@ -87,10 +93,10 @@ export function ensureDeviceFirstSteps(goal: string, steps: readonly string[], r
|
|
|
87
93
|
? stageSource.replace(/\.ts$/u, '.test.ts') : undefined;
|
|
88
94
|
const featureTest = declaredGoalTest ?? stageTest
|
|
89
95
|
?? (existingSiblingTest && existsSync(join(root!, existingSiblingTest)) ? existingSiblingTest : undefined);
|
|
90
|
-
if (!featureTest) return `${withoutWrongPlan}\n검증 계획(TDD): 시험 경로 미확정(${stageSource ? `${stageSource}의 시험 확장자 미정` : '조각 대상 경로 없음'}) · 이 조각에서 시험 경로를 먼저 정하고 RED 실패 뒤 같은 명령으로 GREEN을
|
|
96
|
+
if (!featureTest) return `${withoutWrongPlan}\n검증 계획(TDD): 시험 경로 미확정(${stageSource ? `${stageSource}의 시험 확장자 미정` : '조각 대상 경로 없음'}) · 이 조각에서 시험 경로를 먼저 정하고 RED 실패 뒤 같은 명령으로 GREEN을 확인한다. ${tddRecordFields}`;
|
|
91
97
|
const inventory = root === undefined ? '시험 재고 미측정(대상 루트 미상)'
|
|
92
98
|
: existsSync(join(root, featureTest)) ? '기존 시험' : '신규 시험(이 조각에서 먼저 신설)';
|
|
93
|
-
return `${withoutWrongPlan}\n검증 계획(TDD): ${inventory} ${featureTest} · 피처 시험 bun test ${featureTest}를 구현 전에 RED로 확인하고 생산 경로를 구현한 뒤 같은 명령으로 GREEN을
|
|
99
|
+
return `${withoutWrongPlan}\n검증 계획(TDD): ${inventory} ${featureTest} · 피처 시험 bun test ${featureTest}를 구현 전에 RED로 확인하고 생산 경로를 구현한 뒤 같은 명령으로 GREEN을 확인한다. ${tddRecordFields}`;
|
|
94
100
|
};
|
|
95
101
|
const targetPaths = [decision.device, test].filter((path) => root !== undefined && existsSync(join(root, path)));
|
|
96
102
|
const newPaths = [decision.device, test].filter((path) => !targetPaths.includes(path));
|