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
|
@@ -107,8 +107,9 @@ import { GoalRunStore, insertGoalRunRecord, type GoalPriorRuns } from './goal-ru
|
|
|
107
107
|
import { writeGoalRunRecordFragment } from './goal-execution-records.js';
|
|
108
108
|
import { getUserConfig } from '../user-config.js';
|
|
109
109
|
import { appendRunLedgerEntry, loadRunLedger, parseRunShardIdentity, queryRunChain, type RunChainShardSibling, type RunLedgerEntry, type RunLedgerWriter, type RunOriginData, type RunShardIdentity } from './run-ledger.js';
|
|
110
|
-
import { classifyMergeHoldStop, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
111
|
-
import { autohealFromStop, parseAutohealMode, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
|
|
110
|
+
import { classifyMergeHoldStop, classifyTerminalHarnessFailure, forgetRunStop, isRunStopClass, readRunStopRecord, recordRunStop, runStopRecorded } from './run-stop.js';
|
|
111
|
+
import { autohealFromStop, parseAutohealMode, pickAutohealAction, type AutohealActions, type AutohealResult } from './stop-autoheal.js';
|
|
112
|
+
import { operationalAutohealActions } from './stop-autoheal-operational.js';
|
|
112
113
|
import { recordParentNeedsOwnerVisit } from './doctor-visit.js';
|
|
113
114
|
import { emitSessionEvent, type SessionEventInput } from '../context-bus/session-events.js';
|
|
114
115
|
import { decideLineageSupersede, lineageSupersedeCloseComment, type LineageSupersedeOpenDraft } from './lineage-supersede.js';
|
|
@@ -136,7 +137,7 @@ import { boundaryGlobs, boundaryViolations } from './goal-boundary.js';
|
|
|
136
137
|
import { askAtExecution, type ExecutionClarificationResult } from './execution-clarification.js';
|
|
137
138
|
import { decideScopeExpansion, renderScopeExpansionSection, SCOPE_EXPANSION_CAP, type ScopeExpansion, type ScopeStopReason } from './scope-adjacency.js';
|
|
138
139
|
import { targetScopedGoalText } from './goal-text-path-scope.js';
|
|
139
|
-
import { selectKnowhowPack } from './knowhow-pack.js';
|
|
140
|
+
import { selectKnowhowPack, selectHealKnowhowPack } from './knowhow-pack.js';
|
|
140
141
|
import { declaredNewFilePaths } from './goal-new-paths.js';
|
|
141
142
|
import { dropStaleReverts, type RevertGuardResult } from './revert-guard.js';
|
|
142
143
|
import type { SelfDevGoalType } from '../self-dev/orchestrate.js';
|
|
@@ -226,7 +227,7 @@ import { formatGateFailedId, type PremiseReviewCard, type PremiseReviewInput } f
|
|
|
226
227
|
import { runWorkflowToCompletion } from '../workflow-runtime/executor.js';
|
|
227
228
|
import { mapReworkVerdict, supervisionObservationFields } from './supervision-vocabulary.js';
|
|
228
229
|
import { resolveRunOutcome } from './run-outcome.js';
|
|
229
|
-
import { authorLimitationCountFromGoal, authoredSignalExecution, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
|
|
230
|
+
import { authorLimitationCountFromGoal, authoredSignalExecution, harvestEvidenceLines, harvestedEvidenceObservation, MAX_HARVESTED_EVIDENCE_CHARS, parseOffDiffEvidence, judgeTddEvidence, requiredEvidenceFromGoal, createRequiredEvidenceBudget, coverRequiredEvidence, settleUncoveredEvidence, formatUncoveredEvidenceFeedback, type OffDiffEvidenceParse } from './off-diff-evidence.js';
|
|
230
231
|
import { resolveEvidenceHeadCommit } from './evidence-command-budget.js';
|
|
231
232
|
import { pressDecisionSignals, type DecisionSignalPressResult } from './decision-signal-press.js';
|
|
232
233
|
import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisionSignalObservations } from '../../scripts/ask-marker-check.js';
|
|
@@ -321,7 +322,14 @@ import { buildRuntimeOverlayState } from './graph-overlay-condition.js';
|
|
|
321
322
|
import { activeTemplate, decideTemplate, graphAuthorityFields, nodeNameForStage, overlayDecisionObservation, resolveGraphAuthorityForUserConfig, routeGate, visitBudgetOf } from './graph-authority.js';
|
|
322
323
|
import type { GraphTemplate } from './graph-templates.js';
|
|
323
324
|
import { defaultOverlaysDir, loadGraphOverlays, type GraphOverlaySpec } from './graph-overlay-yaml.js';
|
|
324
|
-
import { graphIdentityOf, measureL0Coverage, pipelineNodeEntryPayload } from './graph-templates.js';
|
|
325
|
+
import { defaultGraphsDir, graphIdentityOf, measureL0Coverage, pipelineNodeEntryPayload } from './graph-templates.js';
|
|
326
|
+
import {
|
|
327
|
+
buildStageNodeContext,
|
|
328
|
+
resolveGraphStageUnits,
|
|
329
|
+
stageNodeContextObservation,
|
|
330
|
+
stageUnitDrift,
|
|
331
|
+
type StageNodeContext,
|
|
332
|
+
} from './graph-stage-units.js';
|
|
325
333
|
import { AMBIGUOUS_STAGES, checkPipelineTraversal, nodesForStage, pipelineGraphIdentity, TERMINAL_STAGES_BY_NODE, type PipelineNodeId, type PipelineTraversalCheck } from './pipeline-shape.js';
|
|
326
334
|
import { appendGateWorktreeFreshnessEvidence, gateEvidenceNote } from '../harness/review-adapter.js';
|
|
327
335
|
import { diffHeaderPaths } from '../agent-substrate/self-review-cli.js';
|
|
@@ -1061,6 +1069,8 @@ export interface SelfImplementSeams {
|
|
|
1061
1069
|
stopAutohealActions?: AutohealActions;
|
|
1062
1070
|
/** STOP-AUTOHEAL — one-attempt guard reader. Default: real run ledger, or none when `writeRunLedger` is injected. */
|
|
1063
1071
|
stopAutohealLoadLedger?: (runId: string) => readonly RunLedgerEntry[] | null;
|
|
1072
|
+
/** Supervisor heal delivery history reader; defaults to the run ledger unless a test injects a writer. */
|
|
1073
|
+
healPackLoadLedger?: (runId: string) => readonly RunLedgerEntry[] | null;
|
|
1064
1074
|
/** STOP-AUTOHEAL — observes each dispatcher result (tests). */
|
|
1065
1075
|
onStopAutoheal?: (result: AutohealResult) => void;
|
|
1066
1076
|
/** Optional context-journal sink for isolated runs. */
|
|
@@ -1083,7 +1093,7 @@ export interface SelfImplementSeams {
|
|
|
1083
1093
|
* store, the orchestrator must not claim the child had zero provider failures.
|
|
1084
1094
|
*/
|
|
1085
1095
|
queryChildProviderErrors?: (input: { runId: string; sinceMs: number; untilMs: number }) => Promise<
|
|
1086
|
-
| { status: 'found'; providerErrorCount: number; credentialFailureCount: number; lastProviderError?: { provider?: string; message?: string }; lastCredentialFailure?: { provider?: string; message?: string } }
|
|
1096
|
+
| { status: 'found'; providerErrorCount: number; credentialFailureCount: number; lastProviderError?: { provider?: string; model?: string; message?: string; observedAt?: string }; lastCredentialFailure?: { provider?: string; model?: string; message?: string; observedAt?: string } }
|
|
1087
1097
|
| { status: 'none' }
|
|
1088
1098
|
| { status: 'unavailable'; reason?: string }
|
|
1089
1099
|
>;
|
|
@@ -2180,6 +2190,8 @@ export function appendGoalExecutionRecord(goalFile: string, record: GoalExecutio
|
|
|
2180
2190
|
}
|
|
2181
2191
|
|
|
2182
2192
|
export interface SelfImplementOptions {
|
|
2193
|
+
/** Parent managed-task cancellation, linked to the active implementation child. */
|
|
2194
|
+
signal?: AbortSignal;
|
|
2183
2195
|
/** ⭐ 걸음을 «호출부»로 흘리는 이음매 — 노드에 들어갈 때마다 한 번.
|
|
2184
2196
|
* 🩸 2026-09-08: 이 콜백은 «내부에» 있었고 ***호출부가 0*** 이라 걸음이 런 밖으로 안 나갔다.
|
|
2185
2197
|
* ⇒ 런 슈퍼바이저는 「시도의 요약 판정」만 보고 「어떻게 걸었나」를 «못 봤다».
|
|
@@ -3012,8 +3024,8 @@ export function queryStructuredChildProviderErrors(
|
|
|
3012
3024
|
});
|
|
3013
3025
|
if (rows.length === 0) return { status: 'none' };
|
|
3014
3026
|
let credentialFailureCount = 0;
|
|
3015
|
-
let lastProviderError: { provider?: string; message?: string } | undefined;
|
|
3016
|
-
let lastCredentialFailure: { provider?: string; message?: string } | undefined;
|
|
3027
|
+
let lastProviderError: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
|
|
3028
|
+
let lastCredentialFailure: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
|
|
3017
3029
|
for (const row of rows) {
|
|
3018
3030
|
let data: Record<string, unknown> | undefined;
|
|
3019
3031
|
try {
|
|
@@ -3022,7 +3034,9 @@ export function queryStructuredChildProviderErrors(
|
|
|
3022
3034
|
} catch { /* malformed payload is still a structured router-error record */ }
|
|
3023
3035
|
const detail = {
|
|
3024
3036
|
...(typeof data?.provider === 'string' ? { provider: data.provider } : {}),
|
|
3037
|
+
...(typeof data?.model === 'string' ? { model: data.model } : {}),
|
|
3025
3038
|
...(typeof data?.message === 'string' ? { message: data.message } : {}),
|
|
3039
|
+
...(typeof row.ts === 'string' ? { observedAt: row.ts } : {}),
|
|
3026
3040
|
};
|
|
3027
3041
|
lastProviderError = detail;
|
|
3028
3042
|
if (data?.authRejected === true) {
|
|
@@ -3566,15 +3580,22 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
|
|
|
3566
3580
|
try {
|
|
3567
3581
|
const record = readRunStopRecord(stopEntry);
|
|
3568
3582
|
if (!record) return;
|
|
3583
|
+
try { debug.log('harness.heal', 'symptom', { runId: stopEntry.runId, class: record.class, cause: record.cause, evidenceRef: record.evidenceRef }); } catch { /* observation is fail-soft */ }
|
|
3584
|
+
const pick = pickAutohealAction(record.class);
|
|
3585
|
+
try { debug.log('harness.heal', 'prescription', { runId: stopEntry.runId, class: record.class, action: pick.action, source: pick.source, ...(pick.overlayId ? { overlayId: pick.overlayId } : {}) }); } catch { /* observation is fail-soft */ }
|
|
3569
3586
|
const mode = parseAutohealMode((await import('../user-config.js')).getUserConfig().tools.selfImplement.autoheal?.mode);
|
|
3570
3587
|
const loadLedger = s?.stopAutohealLoadLedger ?? (s?.writeRunLedger ? () => null : undefined);
|
|
3588
|
+
// A test ledger must never trigger a production host gate. Explicit seams override operational hands.
|
|
3589
|
+
const actions = s?.writeRunLedger ? s.stopAutohealActions
|
|
3590
|
+
: { ...operationalAutohealActions({ repoRoot: process.cwd() }), ...s?.stopAutohealActions };
|
|
3571
3591
|
const result = await autohealFromStop({ runId: stopEntry.runId, ...(stopEntry.goalId ? { goalId: stopEntry.goalId } : {}), record }, {
|
|
3572
3592
|
mode,
|
|
3573
3593
|
knowhowCandidateDir: join(effectiveInstanceRoot(), 'self-implement', 'knowhow-candidates'),
|
|
3574
|
-
...(
|
|
3594
|
+
...(actions ? { actions } : {}),
|
|
3575
3595
|
...(loadLedger ? { loadLedger } : {}),
|
|
3576
3596
|
...(s?.writeRunLedger ? { writeLedger: s.writeRunLedger } : {}),
|
|
3577
3597
|
});
|
|
3598
|
+
try { debug.log('harness.heal', 'outcome', { runId: stopEntry.runId, class: result.class, action: result.action, mode: result.mode, outcome: result.outcome, ...(result.reason ? { reason: result.reason } : {}), ...(result.detail ? { detail: result.detail } : {}) }); } catch { /* observation is fail-soft */ }
|
|
3578
3599
|
if (result.action === 'needs-owner') {
|
|
3579
3600
|
try {
|
|
3580
3601
|
const stopKey = JSON.stringify([stopEntry.timestamp, record.site ?? '', record.class, record.cause, record.evidenceRef]);
|
|
@@ -3592,6 +3613,40 @@ async function autohealRecordedStop(stopEntry: RunLedgerEntry, s: SelfImplementS
|
|
|
3592
3613
|
}
|
|
3593
3614
|
}
|
|
3594
3615
|
|
|
3616
|
+
async function dispatchTerminalHarnessHeal(input: {
|
|
3617
|
+
result: SelfImplementResult;
|
|
3618
|
+
runId: string;
|
|
3619
|
+
goalId?: string;
|
|
3620
|
+
shardIdentity: RunShardIdentity;
|
|
3621
|
+
seams: SelfImplementSeams;
|
|
3622
|
+
}): Promise<void> {
|
|
3623
|
+
const { result, runId, goalId, shardIdentity, seams } = input;
|
|
3624
|
+
const mergeHeld = Boolean(result.mergeReason && result.mergeReason !== 'auto');
|
|
3625
|
+
if (result.outcome !== 'abandoned' && result.outcome !== 'budget-exhausted' && result.stage !== 'timed-out' && !mergeHeld) return;
|
|
3626
|
+
if (runStopRecorded(runId)) return;
|
|
3627
|
+
const stopClass = mergeHeld ? classifyMergeHoldStop(result.mergeReason) : classifyTerminalHarnessFailure({
|
|
3628
|
+
stage: result.stage,
|
|
3629
|
+
mergeReason: result.mergeReason,
|
|
3630
|
+
abandonedClassification: result.abandonedClassification?.classification,
|
|
3631
|
+
providerErrorCategory: result.providerErrors?.category,
|
|
3632
|
+
supervisorVerdict: result.supervisorVerdict,
|
|
3633
|
+
});
|
|
3634
|
+
let stopEntry: RunLedgerEntry | undefined;
|
|
3635
|
+
try {
|
|
3636
|
+
stopEntry = recordRunStop({
|
|
3637
|
+
runId,
|
|
3638
|
+
...(goalId ? { goalId } : {}),
|
|
3639
|
+
shardIdentity,
|
|
3640
|
+
site: mergeHeld ? 'merge-hold' : `terminal-${result.stage}`,
|
|
3641
|
+
class: stopClass,
|
|
3642
|
+
cause: mergeHeld ? `merge held: ${result.mergeReason}` : result.detail ?? `terminal failure: ${result.stage}`,
|
|
3643
|
+
evidenceRef: result.prUrl ?? `run-ledger:${runId}:${result.stage}`,
|
|
3644
|
+
nextMove: `Existing heal ladder: ${stopClass}; failure disposition remains until its prescribed action resolves`,
|
|
3645
|
+
}, seams.writeRunLedger ?? appendRunLedgerEntry);
|
|
3646
|
+
} catch { /* stop observation cannot change the run outcome */ }
|
|
3647
|
+
if (stopEntry) await autohealRecordedStop(stopEntry, seams);
|
|
3648
|
+
}
|
|
3649
|
+
|
|
3595
3650
|
export function measureReviewRework(counts: readonly number[], findings: readonly (readonly RecurrenceFinding[])[]): ReviewRework {
|
|
3596
3651
|
const deltas = counts.slice(1).map((count, index) => Math.sign(count - counts[index]!));
|
|
3597
3652
|
const directions = deltas.filter((delta) => delta !== 0);
|
|
@@ -3759,17 +3814,20 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3759
3814
|
let lastCredentialFailureSeq = 0;
|
|
3760
3815
|
let lastFailedGateSeq = 0;
|
|
3761
3816
|
let lastMustFixReviewSeq = 0;
|
|
3817
|
+
let providerErrorAtLastGate: string | undefined;
|
|
3762
3818
|
const recordFailureVerdict = async (kind: 'gate' | 'review'): Promise<void> => {
|
|
3763
3819
|
// Capture child errors at the verdict boundary, not when terminal reporting eventually reads them.
|
|
3764
3820
|
await mergeChildProviderErrors();
|
|
3821
|
+
providerErrorAtLastGate = lastProviderErrorSeq > Math.max(lastFailedGateSeq, lastMustFixReviewSeq)
|
|
3822
|
+
? lastProviderError?.message : undefined;
|
|
3765
3823
|
if (kind === 'gate') lastFailedGateSeq = ++failureSequence;
|
|
3766
3824
|
else lastMustFixReviewSeq = ++failureSequence;
|
|
3767
3825
|
};
|
|
3768
3826
|
const latestVerdictSeq = (): number => Math.max(lastFailedGateSeq, lastMustFixReviewSeq);
|
|
3769
3827
|
const hasCurrentProviderError = (): boolean => providerErrorCount > 0 && lastProviderErrorSeq > latestVerdictSeq();
|
|
3770
3828
|
const hasCurrentCredentialFailure = (): boolean => credentialFailureCount > 0 && lastCredentialFailureSeq > latestVerdictSeq();
|
|
3771
|
-
let lastProviderError: { provider?: string; message?: string } | undefined;
|
|
3772
|
-
let lastCredentialFailure: { provider?: string; message?: string } | undefined;
|
|
3829
|
+
let lastProviderError: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
|
|
3830
|
+
let lastCredentialFailure: { provider?: string; model?: string; message?: string; observedAt?: string } | undefined;
|
|
3773
3831
|
let childProviderErrorQueryStatus: 'found' | 'none' | 'unavailable' | 'not-configured' = 'not-configured';
|
|
3774
3832
|
let queriedProviderErrorCount = 0;
|
|
3775
3833
|
let queriedCredentialFailureCount = 0;
|
|
@@ -3806,18 +3864,43 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
3806
3864
|
childProviderErrorQueryStatus = 'unavailable';
|
|
3807
3865
|
}
|
|
3808
3866
|
};
|
|
3867
|
+
const observeFailureClassificationInputs = (result: SelfImplementResult): void => {
|
|
3868
|
+
if (!isAbandonedClassificationOutcome(result.outcome)) return;
|
|
3869
|
+
observeOuter('failure-classification-inputs', {
|
|
3870
|
+
stage: result.stage,
|
|
3871
|
+
node: result.node,
|
|
3872
|
+
outcome: result.outcome,
|
|
3873
|
+
classification: result.abandonedClassification?.classification ?? null,
|
|
3874
|
+
classificationBasis: result.abandonedClassification?.classificationBasis ?? null,
|
|
3875
|
+
childProviderErrorQueryStatus,
|
|
3876
|
+
providerErrorCount,
|
|
3877
|
+
credentialFailureCount,
|
|
3878
|
+
queriedProviderErrorCount,
|
|
3879
|
+
queriedCredentialFailureCount,
|
|
3880
|
+
lastProviderError: lastProviderError ? { provider: lastProviderError.provider ?? null, model: lastProviderError.model ?? null, observedAt: lastProviderError.observedAt ?? null } : null,
|
|
3881
|
+
lastCredentialFailure: lastCredentialFailure ? { provider: lastCredentialFailure.provider ?? null, model: lastCredentialFailure.model ?? null, observedAt: lastCredentialFailure.observedAt ?? null } : null,
|
|
3882
|
+
lastProviderErrorSeq,
|
|
3883
|
+
lastCredentialFailureSeq,
|
|
3884
|
+
lastFailedGateSeq,
|
|
3885
|
+
lastMustFixReviewSeq,
|
|
3886
|
+
currentProviderError: hasCurrentProviderError(),
|
|
3887
|
+
currentCredentialFailure: hasCurrentCredentialFailure(),
|
|
3888
|
+
});
|
|
3889
|
+
};
|
|
3809
3890
|
const unregisterProviderErrorSink = debug.registerSink({
|
|
3810
3891
|
name: `self-implement-provider-error-${runId}`,
|
|
3811
3892
|
emit(record) {
|
|
3812
3893
|
if (record.category !== 'llm.router.error') return;
|
|
3813
3894
|
const data = record.data;
|
|
3814
3895
|
if (!data || typeof data !== 'object') return;
|
|
3815
|
-
const { provider, message } = data as Record<string, unknown>;
|
|
3896
|
+
const { provider, model, message } = data as Record<string, unknown>;
|
|
3816
3897
|
providerErrorCount++;
|
|
3817
3898
|
lastProviderErrorSeq = ++failureSequence;
|
|
3818
3899
|
lastProviderError = {
|
|
3819
3900
|
...(typeof provider === 'string' ? { provider } : {}),
|
|
3901
|
+
...(typeof model === 'string' ? { model } : {}),
|
|
3820
3902
|
...(typeof message === 'string' ? { message } : {}),
|
|
3903
|
+
...(typeof record.ts === 'string' ? { observedAt: record.ts } : {}),
|
|
3821
3904
|
};
|
|
3822
3905
|
// ⛔⭐⭐⭐ 자격 거부는 「프로바이더 오류」의 부분집합이지만 ***사람이 할 다음 행동이 다르다***
|
|
3823
3906
|
// (2026-08-14 실측 · `[T]` 83차): grok 자식 «둘»이 401 로 죽었는데 부모가 남긴 것은
|
|
@@ -4106,6 +4189,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4106
4189
|
}
|
|
4107
4190
|
};
|
|
4108
4191
|
let terminalResult: SelfImplementResult | undefined;
|
|
4192
|
+
let uncaughtTerminalStop: SelfImplementResult | undefined;
|
|
4109
4193
|
let reviewReflectRejectedCount: number | undefined;
|
|
4110
4194
|
const attachReviewReflectionOutcome = <T extends Omit<SelfImplementResult, 'runId'>>(result: T): T & Pick<SelfImplementResult, 'completionStatus' | 'reviewReflectRejectedCount'> => ({
|
|
4111
4195
|
...result,
|
|
@@ -4285,6 +4369,11 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4285
4369
|
(sessionId) => { terminalSessionId = sessionId; },
|
|
4286
4370
|
(contract) => { runContract = contract; },
|
|
4287
4371
|
recordFailureVerdict,
|
|
4372
|
+
() => {
|
|
4373
|
+
const error = providerErrorAtLastGate;
|
|
4374
|
+
providerErrorAtLastGate = undefined;
|
|
4375
|
+
return error;
|
|
4376
|
+
},
|
|
4288
4377
|
() => providerErrorCount > 0,
|
|
4289
4378
|
() => credentialFailureCount > 0,
|
|
4290
4379
|
hasCurrentProviderError,
|
|
@@ -4305,6 +4394,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4305
4394
|
opts.seams.inspectCodexRotation,
|
|
4306
4395
|
runProviderName,
|
|
4307
4396
|
);
|
|
4397
|
+
observeFailureClassificationInputs(addressedResult);
|
|
4308
4398
|
if (isAbandonedClassificationOutcome(addressedResult.outcome)) logQuotaProvider(addressedResult.quotaExhaustionAssessment);
|
|
4309
4399
|
observeOuter('child-provider-error-query', { status: childProviderErrorQueryStatus });
|
|
4310
4400
|
if (lastProviderError) {
|
|
@@ -4316,20 +4406,24 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4316
4406
|
}
|
|
4317
4407
|
terminalResult = withEvidenceCoverage(withMeasuredRework(addressedResult));
|
|
4318
4408
|
// runSelfImplement is the terminal caller: retain every existing PR/ledger/log observation and append one stop fact.
|
|
4319
|
-
|
|
4409
|
+
const envDeficitStop = addressedResult.stage === 'gate-failed' && addressedResult.harvestable === true
|
|
4410
|
+
&& addressedResult.detail?.includes(GATE_ENV_DEFICIT_HARVESTABLE_MARK) === true;
|
|
4411
|
+
if ((addressedResult.stage === 'aborted' || envDeficitStop || (addressedResult.mergeReason && addressedResult.mergeReason !== 'auto')) && !runStopRecorded(runId)) {
|
|
4320
4412
|
const reason = addressedResult.mergeReason;
|
|
4321
4413
|
const aborted = addressedResult.stage === 'aborted';
|
|
4322
4414
|
let stopEntry: RunLedgerEntry | undefined;
|
|
4323
4415
|
try {
|
|
4324
4416
|
stopEntry = recordRunStop({ runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity,
|
|
4325
|
-
site: aborted ? 'implement-aborted' : 'merge-hold',
|
|
4326
|
-
class:
|
|
4417
|
+
site: envDeficitStop ? 'gate-env-deficit' : aborted ? 'implement-aborted' : 'merge-hold',
|
|
4418
|
+
class: envDeficitStop ? 'env-unrelated' : aborted ? 'unclassified' : classifyMergeHoldStop(reason),
|
|
4419
|
+
cause: envDeficitStop ? addressedResult.detail ?? 'gate environment deficit' : aborted ? 'implement aborted' : `merge held: ${reason}`,
|
|
4327
4420
|
evidenceRef: addressedResult.prUrl ?? `run-ledger:${runId}:${aborted ? 'implemented' : 'merge-decision'}`,
|
|
4328
|
-
nextMove: aborted ? 'Inspect preserved worktree and child summary' : 'Review merge decision and PR before landing',
|
|
4421
|
+
nextMove: envDeficitStop ? 'Measure the preserved PR head in a clean checkout' : aborted ? 'Inspect preserved worktree and child summary' : 'Review merge decision and PR before landing',
|
|
4329
4422
|
}, opts.seams.writeRunLedger ?? appendRunLedgerEntry);
|
|
4330
4423
|
} catch { /* stop observation cannot change the run outcome */ }
|
|
4331
4424
|
if (stopEntry) await autohealRecordedStop(stopEntry, opts.seams);
|
|
4332
4425
|
}
|
|
4426
|
+
await dispatchTerminalHarnessHeal({ result: addressedResult, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
|
|
4333
4427
|
observeDeclaredScopeDiff(observeOuter, {
|
|
4334
4428
|
goalFile: opts.goalFile,
|
|
4335
4429
|
changedFiles: opts.goalFile && addressedResult.worktreePath
|
|
@@ -4418,6 +4512,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4418
4512
|
terminalNode = result.node;
|
|
4419
4513
|
await mergeChildProviderErrors();
|
|
4420
4514
|
const addressedResult = attachAbandonedClassification(attachReviewReflectionOutcome({ ...result, ...providerErrorsForResult() }), opts.goalFile, hasCurrentProviderError(), hasCurrentCredentialFailure(), opts.seams.inspectCodexRotation, runProviderName);
|
|
4515
|
+
observeFailureClassificationInputs(addressedResult);
|
|
4421
4516
|
logQuotaProvider(addressedResult.quotaExhaustionAssessment);
|
|
4422
4517
|
observeOuter('child-provider-error-query', { status: childProviderErrorQueryStatus });
|
|
4423
4518
|
if (lastProviderError) {
|
|
@@ -4427,6 +4522,7 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4427
4522
|
observeOuter('credential-failure-observed', { count: credentialFailureCount, ...lastCredentialFailure });
|
|
4428
4523
|
}
|
|
4429
4524
|
terminalResult = withMeasuredRework(addressedResult); // ⛔ 이 분기(StepTimeoutError)는 스코프가 달라 달성 근사값은 «없다»(0 으로 채우지 않는다)
|
|
4525
|
+
await dispatchTerminalHarnessHeal({ result: addressedResult, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
|
|
4430
4526
|
observeDeclaredScopeDiff(observeOuter, {
|
|
4431
4527
|
goalFile: opts.goalFile,
|
|
4432
4528
|
changedFiles: opts.goalFile && addressedResult.worktreePath
|
|
@@ -4487,9 +4583,12 @@ export async function runSelfImplement(opts: SelfImplementOptions): Promise<Self
|
|
|
4487
4583
|
...terminalDetail(terminalSessionId),
|
|
4488
4584
|
},
|
|
4489
4585
|
});
|
|
4586
|
+
uncaughtTerminalStop = { runId, ok: false, stage: 'aborted', node: terminalNode ?? 'implement', outcome: 'abandoned', detail: safeErrorDescription(e) };
|
|
4490
4587
|
throw e;
|
|
4491
4588
|
} finally {
|
|
4492
4589
|
if (loopRegistered) registerRunLoop('ended');
|
|
4590
|
+
// Persist the outer-exception stop and its prescription before the crashed run-status below.
|
|
4591
|
+
if (uncaughtTerminalStop) await dispatchTerminalHarnessHeal({ result: uncaughtTerminalStop, runId, ...(opts.goalId ? { goalId: opts.goalId } : {}), shardIdentity, seams: opts.seams });
|
|
4493
4592
|
const terminalStage = terminalResult?.stage ?? 'crashed';
|
|
4494
4593
|
// A blocked draft may be opened on the first failed attempt, before the
|
|
4495
4594
|
// normal outcome observer has written its terminal status. Persist the
|
|
@@ -4950,6 +5049,38 @@ function reworkCapFailureSummary(feature: string, decision: ReworkCapHealDecisio
|
|
|
4950
5049
|
return `${title} [${decision.defectClass} → ${decision.nextAction}] ${evidence}`;
|
|
4951
5050
|
}
|
|
4952
5051
|
|
|
5052
|
+
/** ⭐ SELFIMPL-NODE-SEAMS-BACK — 등록 부품(구현·gate·리뷰·git·착지)을 graphs/units 에서 해석하고
|
|
5053
|
+
* 합성 선언을 평탄화해 «하나의 NodeContext» 로 묶는다. ⛔ 실패는 값(reason)으로 낸다 — 실행을 막지 않는다. */
|
|
5054
|
+
export function resolveRunStageNodeContext(input: {
|
|
5055
|
+
readonly graphId: string;
|
|
5056
|
+
readonly graphVersion: string;
|
|
5057
|
+
readonly graphsDir: string;
|
|
5058
|
+
readonly runId: string;
|
|
5059
|
+
readonly attempts?: number;
|
|
5060
|
+
readonly round?: number;
|
|
5061
|
+
readonly goalId?: string;
|
|
5062
|
+
readonly goalType?: string;
|
|
5063
|
+
}): { readonly nodeContext?: StageNodeContext; readonly reason?: string } {
|
|
5064
|
+
const resolution = resolveGraphStageUnits(input.graphId, input.graphsDir);
|
|
5065
|
+
if (resolution.units.length === 0) {
|
|
5066
|
+
return { reason: resolution.reason ?? 'no-unit-resolved' };
|
|
5067
|
+
}
|
|
5068
|
+
return {
|
|
5069
|
+
nodeContext: buildStageNodeContext({
|
|
5070
|
+
resolution,
|
|
5071
|
+
graphId: input.graphId,
|
|
5072
|
+
graphVersion: input.graphVersion,
|
|
5073
|
+
runId: input.runId,
|
|
5074
|
+
...(input.attempts === undefined ? {} : { attempts: input.attempts }),
|
|
5075
|
+
...(input.round === undefined ? {} : { round: input.round }),
|
|
5076
|
+
...(input.goalId === undefined ? {} : { goalId: input.goalId }),
|
|
5077
|
+
...(input.goalType === undefined ? {} : { goalType: input.goalType }),
|
|
5078
|
+
}),
|
|
5079
|
+
...(resolution.reason === undefined ? {} : { reason: resolution.reason }),
|
|
5080
|
+
};
|
|
5081
|
+
}
|
|
5082
|
+
|
|
5083
|
+
/** 라운드마다 같은 부품이 «그 파일·그 판»인지 — 도는 중에 바뀌면 걸음과 신원이 갈린다. */
|
|
4953
5084
|
async function runSelfImplementInner(
|
|
4954
5085
|
opts: SelfImplementOptions,
|
|
4955
5086
|
identity?: { runId: string; source: ReturnType<typeof resolveRunIdentity>['source'] },
|
|
@@ -4986,13 +5117,14 @@ async function runSelfImplementInner(
|
|
|
4986
5117
|
hasCredentialFailure: () => boolean = () => false,
|
|
4987
5118
|
providerErrorCategory: () => NonNullable<SelfImplementResult['providerErrors']>['category'] | undefined = () => undefined,
|
|
4988
5119
|
onReviewReflectRejected: (rejectedCount: number) => void = () => {},
|
|
4989
|
-
observe
|
|
5120
|
+
observe?: ReturnType<typeof makeRunObserver>,
|
|
4990
5121
|
/** ⭐ 「이 런이 «실제로» 어느 두뇌로 돌았나」를 원장까지 나른다 — ⛔ 기록 «시점»에 다시 읽지 않는다
|
|
4991
5122
|
* (그러면 「런이 끝날 무렵의 provider」가 되어 `F45` 를 그대로 밟는다). 시작 시점 값을 넘긴다. */
|
|
4992
5123
|
onActiveProvider: (active: { provider?: string; model?: string; auth?: string }) => void = () => {},
|
|
4993
5124
|
onSessionCreated: (sessionId: string) => void = () => {},
|
|
4994
5125
|
onRunContractResolved: (contract: RunContract) => void = () => {},
|
|
4995
5126
|
onFailureVerdict: (kind: 'gate' | 'review') => Promise<void> = async () => {},
|
|
5127
|
+
providerErrorAtLastGate: () => string | undefined = () => undefined,
|
|
4996
5128
|
hasObservedProviderError: () => boolean = hasProviderError,
|
|
4997
5129
|
hasObservedCredentialFailure: () => boolean = hasCredentialFailure,
|
|
4998
5130
|
hasCurrentProviderError: () => boolean = hasProviderError,
|
|
@@ -5003,7 +5135,23 @@ async function runSelfImplementInner(
|
|
|
5003
5135
|
onPrAttributed: (number: number) => void = () => {},
|
|
5004
5136
|
onPrAttributionMismatch: () => void = () => {},
|
|
5005
5137
|
): Promise<Omit<SelfImplementResult, 'runId'>> {
|
|
5138
|
+
const runIdentity = identity ?? resolveRunIdentity({ explicit: opts.runId });
|
|
5139
|
+
observe ??= makeRunObserver(runIdentity.runId, opts.goalId, debug.log.bind(debug), opts.seams.writeRunLedger, shardIdentity);
|
|
5006
5140
|
const s = opts.seams;
|
|
5141
|
+
const deliveredHealPacks = new Set<string>();
|
|
5142
|
+
const healRunId = identity?.runId ?? resolveRunIdentity({ explicit: opts.runId }).runId;
|
|
5143
|
+
try {
|
|
5144
|
+
const entries = (s.healPackLoadLedger ?? (s.writeRunLedger ? () => null : loadRunLedger))(healRunId);
|
|
5145
|
+
for (const entry of entries ?? []) {
|
|
5146
|
+
if (entry.runId !== healRunId || entry.event !== 'supervisor-heal-pack'
|
|
5147
|
+
|| !['matched', 'already-delivered'].includes(String(entry.data?.decision))) continue;
|
|
5148
|
+
const { signature, packIds } = entry.data;
|
|
5149
|
+
if (typeof signature !== 'string' || !Array.isArray(packIds)) continue;
|
|
5150
|
+
for (const id of packIds) {
|
|
5151
|
+
if (typeof id === 'string') deliveredHealPacks.add(`${healRunId}:${signature}:${id}`);
|
|
5152
|
+
}
|
|
5153
|
+
}
|
|
5154
|
+
} catch { /* An unavailable history contributes no invented deliveries. */ }
|
|
5007
5155
|
const pipelineStartedAtMs = Date.now();
|
|
5008
5156
|
// Graph authority is always ON; retain the resolved event with default provenance.
|
|
5009
5157
|
// For research documents, its declared docs-only routing intentionally skips the gate.
|
|
@@ -5044,9 +5192,16 @@ async function runSelfImplementInner(
|
|
|
5044
5192
|
: undefined;
|
|
5045
5193
|
if (launch && !launch.ok) throw new Error(`graph variant rejected: ${JSON.stringify(launch.rejections)}`);
|
|
5046
5194
|
const sourceSpec = launch?.ok ? launch.template : baseSpec;
|
|
5195
|
+
// ⭐ unit 선언 근거 — 이 런이 읽은 «대상 경로»(단위 선언) 원문의 내용 해시만 남긴다.
|
|
5196
|
+
// ⛔ 본문은 로그에도 원장에도 복제하지 않는다(goalContentHash 와 같은 해시-only 예비).
|
|
5197
|
+
// ⛔ 읽지 못한 경로(신설 파일 등)는 해시를 지어내지 않고 근거에서 뺀다.
|
|
5198
|
+
const unitDeclarations = declaredPremiseScopePaths(opts.feature).flatMap(path => {
|
|
5199
|
+
try { return [{ path, content: readFileSync(resolve(process.cwd(), path), 'utf8') }]; } catch { return []; }
|
|
5200
|
+
});
|
|
5047
5201
|
// ⭐ 최초 변형 선택 — 골 종류(graphGoalType)·대상 경로 수(declaredPremiseScopePaths) 두 입력만으로
|
|
5048
5202
|
// 결정론적으로 id·선택 이유를 유도해 검증 결과에 싣는다(종류를 못 읽었으면 지어내지 않는다).
|
|
5049
5203
|
const variant = createGraphVariant({ template: sourceSpec, goal: `g_${variantRunId.replace(/[^a-z0-9_-]/gi, '_')}`, plan: opts.graphVariantPlan,
|
|
5204
|
+
...(unitDeclarations.length === 0 ? {} : { unitDeclarations }),
|
|
5050
5205
|
...(graphGoalType === undefined ? {} : { goalAnalysis: { goalType: graphGoalType, targetPathCount: declaredPremiseScopePaths(opts.feature).length } }) });
|
|
5051
5206
|
if (!variant.ok) throw new Error(`graph variant rejected: ${JSON.stringify(variant.rejections)}`);
|
|
5052
5207
|
variantSpec = variant.template;
|
|
@@ -5054,6 +5209,9 @@ async function runSelfImplementInner(
|
|
|
5054
5209
|
const graphFile = saveRunGraphVariant(variantRunId, stringify({
|
|
5055
5210
|
graph_id: variantSpec.graphId, version: variantSpec.version,
|
|
5056
5211
|
...(variant.selection === undefined ? {} : { variant_id: variant.selection.variantId, reason: variant.selection.reason }),
|
|
5212
|
+
// 추가 키 — 한 런이 어느 unit 선언 «버전»을 읽었는지. 경로·내용 해시뿐이고 본문은 없다.
|
|
5213
|
+
...(variant.selection?.unitDeclarations === undefined ? {}
|
|
5214
|
+
: { unit_declarations: variant.selection.unitDeclarations.map(entry => ({ path: entry.path, content_hash: entry.contentHash })) }),
|
|
5057
5215
|
entry_node: variantSpec.entryNode, terminal_nodes: variantSpec.terminalNodes,
|
|
5058
5216
|
...(variantSpec.journeyStages ? { journey_stages: variantSpec.journeyStages } : {}),
|
|
5059
5217
|
...(variantSpec.runContract ? { run_contract: variantSpec.runContract } : {}),
|
|
@@ -5078,13 +5236,15 @@ async function runSelfImplementInner(
|
|
|
5078
5236
|
// ⭐ 저장·diff — 방금 원장 옆에 쓴 선택(id·이유)을 다시 읽어 «같은지» 확인한다(다르면 이 런의 그래프 신원이 거짓).
|
|
5079
5237
|
if (variant.selection !== undefined) {
|
|
5080
5238
|
const persisted = loadRunGraphVariant(variantRunId);
|
|
5081
|
-
if (persisted === null || persisted.variantId !== variant.selection.variantId || persisted.reason !== variant.selection.reason
|
|
5239
|
+
if (persisted === null || persisted.variantId !== variant.selection.variantId || persisted.reason !== variant.selection.reason
|
|
5240
|
+
|| JSON.stringify(persisted.unitDeclarations ?? null) !== JSON.stringify(variant.selection.unitDeclarations ?? null)) {
|
|
5082
5241
|
throw new Error(`graph variant rejected: persisted selection mismatch: ${JSON.stringify(persisted)}`);
|
|
5083
5242
|
}
|
|
5084
5243
|
}
|
|
5085
5244
|
observe('graph-variant-applied', { graphId: variant.template.graphId, overlayId: variant.overlay.overlayId,
|
|
5086
5245
|
graphFile, patches: variant.patches,
|
|
5087
|
-
...(variant.selection === undefined ? {} : { variantId: variant.selection.variantId, variantReason: variant.selection.reason })
|
|
5246
|
+
...(variant.selection === undefined ? {} : { variantId: variant.selection.variantId, variantReason: variant.selection.reason }),
|
|
5247
|
+
...(variant.selection?.unitDeclarations === undefined ? {} : { unitDeclarations: variant.selection.unitDeclarations }) });
|
|
5088
5248
|
}
|
|
5089
5249
|
/** 단계 이름 → 그 템플릿의 노드 이름. */
|
|
5090
5250
|
const node = (stage: PipelineNodeId): PipelineNodeId => nodeNameForStage(stage, graphTemplate) as PipelineNodeId;
|
|
@@ -5101,6 +5261,28 @@ async function runSelfImplementInner(
|
|
|
5101
5261
|
onRunContractResolved(runContract);
|
|
5102
5262
|
observe('graph-run-contract-resolved', { ...graphIdentityOf(graphTemplate), ...runContract, ...runContractAtNode(runContract) });
|
|
5103
5263
|
}
|
|
5264
|
+
// ⭐ SELFIMPL-NODE-SEAMS-BACK — 등록 부품을 «생산 진입점»에서 해석·평탄화해 하나의 NodeContext 로 만든다.
|
|
5265
|
+
// ⛔ 이 줄이 없으면 부품은 선언만 있고 걸음에서 안 불린다. 실패는 값으로 남기고 실행은 안 막는다.
|
|
5266
|
+
let nodeContext: StageNodeContext | undefined;
|
|
5267
|
+
{
|
|
5268
|
+
const unitResolution = resolveRunStageNodeContext({
|
|
5269
|
+
graphId: graphTemplate.graphId,
|
|
5270
|
+
graphVersion: graphTemplate.version,
|
|
5271
|
+
graphsDir: defaultGraphsDir(),
|
|
5272
|
+
runId: runIdentity.runId,
|
|
5273
|
+
...(typeof attemptOrdinal === 'number' ? { attempts: attemptOrdinal } : {}),
|
|
5274
|
+
...(opts.goalId === undefined ? {} : { goalId: opts.goalId }),
|
|
5275
|
+
...(graphGoalType === undefined ? {} : { goalType: graphGoalType }),
|
|
5276
|
+
});
|
|
5277
|
+
nodeContext = unitResolution.nodeContext;
|
|
5278
|
+
if (nodeContext === undefined) {
|
|
5279
|
+
if (graphTemplate.graphId === 'self-implement') {
|
|
5280
|
+
observe('graph-stage-units-unresolved', { ...graphIdentityOf(graphTemplate), reason: unitResolution.reason ?? 'no-unit-resolved' });
|
|
5281
|
+
}
|
|
5282
|
+
} else {
|
|
5283
|
+
observe('graph-stage-units-resolved', stageNodeContextObservation(nodeContext));
|
|
5284
|
+
}
|
|
5285
|
+
}
|
|
5104
5286
|
// ⛔ 승격이 꺼져 있으면 «심지 않는다» — 그러면 예산 관측도 안 난다(운영 원장이 오늘과 같다).
|
|
5105
5287
|
if (graphAuthority.enabled) onGraphTemplateResolved(graphTemplate);
|
|
5106
5288
|
// ⛔ 선택을 «전부» 싣는다 — 얹힌 것만 실으면 「왜 안 얹혔나」를 사후에 못 묻는다.
|
|
@@ -5114,7 +5296,7 @@ async function runSelfImplementInner(
|
|
|
5114
5296
|
// ⛔ 「지금 아는 것」만 준다 — 없는 값을 0 으로 지어내지 않는다(key-absent 가 그것을 말한다).
|
|
5115
5297
|
let stopClass: import('./run-stop.js').RunStopClass | undefined;
|
|
5116
5298
|
try {
|
|
5117
|
-
const { runId } =
|
|
5299
|
+
const { runId } = runIdentity;
|
|
5118
5300
|
const entries = loadRunLedger(runId);
|
|
5119
5301
|
const lastStop = entries?.slice().reverse().find((entry) => entry.event === 'stop');
|
|
5120
5302
|
if (lastStop && isRunStopClass(lastStop.data.class)) stopClass = readRunStopRecord(lastStop)?.class;
|
|
@@ -5134,6 +5316,16 @@ async function runSelfImplementInner(
|
|
|
5134
5316
|
...(variantSpec ? { specs: { [variantSpec.graphId]: variantSpec } } : {}),
|
|
5135
5317
|
});
|
|
5136
5318
|
if (decision.appliedIds.length > 0) graphTemplate = decision.template;
|
|
5319
|
+
// ⭐ SELFIMPL-NODE-SEAMS-BACK — 같은 NodeContext 가 라운드로 이어진다: 체크포인트를 옮기고,
|
|
5320
|
+
// 부품이 도는 중에 다른 판으로 바뀌었으면 그 사실을 값으로 낸다(걸음과 신원이 갈리는 것을 막는다).
|
|
5321
|
+
if (nodeContext !== undefined) {
|
|
5322
|
+
nodeContext = { ...nodeContext, checkpoint: { ...nodeContext.checkpoint, round } };
|
|
5323
|
+
const drift = stageUnitDrift(nodeContext.grounding.units, defaultGraphsDir());
|
|
5324
|
+
observe('graph-stage-units-drift', {
|
|
5325
|
+
graphId: nodeContext.goal.graphId, graphVersion: nodeContext.goal.graphVersion,
|
|
5326
|
+
round, missing: drift.missing, changed: drift.changed,
|
|
5327
|
+
});
|
|
5328
|
+
}
|
|
5137
5329
|
// ⛔⭐ 승격이 켜져 있으면 «언제나» 낸다 — 후보가 0이어도 낸다.
|
|
5138
5330
|
// 🩸 안 내면 「얹을 게 없었다」와 「이 배선이 «안 돌았다»」가 원장에서 «같은 값»(0건)이 된다.
|
|
5139
5331
|
// ⇒ `considered` 가 그 둘을 가른다: 배선이 돌면 이 줄이 있고, 그 수가 «본 오버레이 수»다.
|
|
@@ -5172,7 +5364,7 @@ async function runSelfImplementInner(
|
|
|
5172
5364
|
roundClassifications.push(classification);
|
|
5173
5365
|
onRoundClassification(classification);
|
|
5174
5366
|
};
|
|
5175
|
-
const { runId, source: runIdSource } =
|
|
5367
|
+
const { runId, source: runIdSource } = runIdentity;
|
|
5176
5368
|
const branch = opts.branchName ?? plannedSelfImplBranch(opts.feature, opts.goalId, runId);
|
|
5177
5369
|
try {
|
|
5178
5370
|
debug.log('run-identity', 'own', {
|
|
@@ -5465,13 +5657,20 @@ async function runSelfImplementInner(
|
|
|
5465
5657
|
}
|
|
5466
5658
|
|
|
5467
5659
|
// The repository copy travels with both local and Pod worktrees. Operational HQ ledgers are never read here.
|
|
5468
|
-
const knowhow = selectKnowhowPack(
|
|
5469
|
-
|
|
5660
|
+
const knowhow = selectKnowhowPack(
|
|
5661
|
+
wt.path,
|
|
5662
|
+
opts.feature,
|
|
5663
|
+
undefined,
|
|
5664
|
+
{ goalFile: opts.goalFile ?? null },
|
|
5665
|
+
);
|
|
5666
|
+
// Keep the original ask first: the child preflight and PR title read its first line.
|
|
5667
|
+
const injectKnowhow = getUserConfig().harness?.knowhowChildInjection === true;
|
|
5668
|
+
if (injectKnowhow && knowhow.text) round0Feature = `${round0Feature}\n\n${knowhow.text}`;
|
|
5470
5669
|
const knowhowRevisionRead = runGitCommand(wt.path, ['rev-parse', '--verify', 'HEAD'], { encoding: 'utf8', timeout: 10_000 });
|
|
5471
5670
|
const knowhowRevision = knowhowRevisionRead.status === 0 && /^[0-9a-f]{40,64}$/i.test(knowhowRevisionRead.stdout.trim())
|
|
5472
5671
|
? knowhowRevisionRead.stdout.trim() : null;
|
|
5473
|
-
observe('knowhow-pack', { ids: knowhow.ids, bytes: knowhow.bytes, injected: knowhow.bytes > 0,
|
|
5474
|
-
reason: knowhow.reason, repoPath: wt.path, repoRevision: knowhowRevision });
|
|
5672
|
+
observe('knowhow-pack', { goal: opts.feature.slice(0, 4096), ids: knowhow.ids, bytes: knowhow.bytes, sources: knowhow.sources ?? [], injected: injectKnowhow && knowhow.bytes > 0,
|
|
5673
|
+
reason: knowhow.reason, knowhowReason: knowhow.knowhowReason ?? knowhow.reason, repoPath: wt.path, repoRevision: knowhowRevision });
|
|
5475
5674
|
|
|
5476
5675
|
// E1 착수 구체화(RFC-progressive-goal-elaboration §2 E1 · §7 간선 ①) — 고정 층(KPI·판정 신호)은 그대로, 카드만 덧붙인다.
|
|
5477
5676
|
const elaboration = await (await import('./goal-elaborate.js')).runArrivalElaboration({ goal: opts.feature, prompt: round0Feature, cwd: wt.path, callLLM: s.elaborateCallLLM, observe });
|
|
@@ -7269,7 +7468,34 @@ async function runSelfImplementInner(
|
|
|
7269
7468
|
}
|
|
7270
7469
|
throw error;
|
|
7271
7470
|
}
|
|
7471
|
+
// Only the preceding round's observed error or gate evidence can authorize a remedy.
|
|
7472
|
+
let healInput = '';
|
|
7473
|
+
if (round > 0) {
|
|
7474
|
+
const failure = reworkKind === 'gate' && gate?.passed === false ? gate : undefined;
|
|
7475
|
+
const failures = failure?.baselineFailures;
|
|
7476
|
+
const facts = failure?.reflectGateFacts;
|
|
7477
|
+
const providerMessage = providerErrorAtLastGate();
|
|
7478
|
+
const signature = providerMessage && /\b1310\b.*\blimit\b|\blimit\b.*\b1310\b/i.test(providerMessage) ? 'provider-1310'
|
|
7479
|
+
: failure && facts?.introduced === 0 && facts.preexisting !== undefined && facts.preexisting > 0
|
|
7480
|
+
&& facts.unknown === 0 && failures?.length && failures.every(item => item.attribution === 'preexisting')
|
|
7481
|
+
? 'preexisting'
|
|
7482
|
+
: failure && failures?.some(item => item.timeoutVariability === 'may-vary'
|
|
7483
|
+
&& /\b(?:order|time)[ -]dependent\b/i.test(`${item.name} ${item.diagnostic ?? ''}`))
|
|
7484
|
+
? 'order-time-dependent' : 'unknown';
|
|
7485
|
+
const pack = signature === 'unknown' ? { text: '', ids: [], bytes: 0 } : selectHealKnowhowPack(wt.path, signature);
|
|
7486
|
+
const freshIds = pack.ids.filter(id => !deliveredHealPacks.has(`${healRunId}:${signature}:${id}`));
|
|
7487
|
+
const decision = !pack.ids.length ? 'unknown' : freshIds.length ? 'matched' : 'already-delivered';
|
|
7488
|
+
if (decision === 'matched') {
|
|
7489
|
+
for (const id of freshIds) deliveredHealPacks.add(`${healRunId}:${signature}:${id}`);
|
|
7490
|
+
healInput = `[SUPERVISOR-HEAL-PACK signature=${signature} ids=${freshIds.join(',')}]\n${pack.text.split('\n').slice(1).filter(line => freshIds.some(id => line.startsWith(`${id}:`))).join('\n')}`;
|
|
7491
|
+
}
|
|
7492
|
+
observe('supervisor-heal-pack', { runId: healRunId, round, signature, packIds: decision === 'matched' ? freshIds : decision === 'already-delivered' ? pack.ids : [], decision,
|
|
7493
|
+
...(decision === 'unknown' ? { missingEvidence: signature === 'unknown' ? 'observed-signature-unavailable' : 'matching-active-pack-unavailable' } : {}) });
|
|
7494
|
+
}
|
|
7272
7495
|
const implementAbortController = new AbortController();
|
|
7496
|
+
const abortImplementation = (): void => implementAbortController.abort(opts.signal?.reason);
|
|
7497
|
+
if (opts.signal?.aborted) abortImplementation();
|
|
7498
|
+
else opts.signal?.addEventListener('abort', abortImplementation, { once: true });
|
|
7273
7499
|
let implementPromise: ReturnType<SelfImplementSeams['implement']>;
|
|
7274
7500
|
// Rework needs landed sibling PRs only after the initial round; shard eligibility avoids an expensive impossible lookup.
|
|
7275
7501
|
const landedSiblings = round > 0
|
|
@@ -7292,7 +7518,7 @@ async function runSelfImplementInner(
|
|
|
7292
7518
|
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7293
7519
|
onSurfaceProgress: (line) => progress('implementing', line.trimEnd()),
|
|
7294
7520
|
onLifecycleScreenClassification: recordRoundClassification,
|
|
7295
|
-
...(round > 0 ? { roundContext: { round, effectiveMax, previousRoundFailure: reworkPromptNote, ...(landedSiblings ? { landedSiblings } : {}) } } : {}),
|
|
7521
|
+
...(round > 0 ? { roundContext: { round, effectiveMax, previousRoundFailure: healInput ? `${reworkPromptNote}\n\n${healInput}` : reworkPromptNote, ...(landedSiblings ? { landedSiblings } : {}) } } : {}),
|
|
7296
7522
|
onSupervisorInput: (text, updateDelivery) => {
|
|
7297
7523
|
const normalized = text.trim();
|
|
7298
7524
|
if (!normalized) {
|
|
@@ -7336,7 +7562,10 @@ async function runSelfImplementInner(
|
|
|
7336
7562
|
}
|
|
7337
7563
|
finalizeSupervisorDeliveries(error instanceof StepTimeoutError ? 'next-round-implement-timeout' : 'next-round-implement-rejected');
|
|
7338
7564
|
throw error;
|
|
7565
|
+
} finally {
|
|
7566
|
+
opts.signal?.removeEventListener('abort', abortImplementation);
|
|
7339
7567
|
}
|
|
7568
|
+
if (opts.signal?.aborted) throw opts.signal.reason ?? new Error('SelfImplement aborted');
|
|
7340
7569
|
// ⭐ 성공 경로에서도 닫는다 — 이 호출은 끝났고, 이후 자식이 늦게 보내는 입력은
|
|
7341
7570
|
// 「이 라운드의 재투입」이 아니다(다음 라운드는 자기 콜백을 새로 만든다).
|
|
7342
7571
|
closeSupervisorInput();
|
|
@@ -7452,6 +7681,69 @@ async function runSelfImplementInner(
|
|
|
7452
7681
|
impl = { ...impl, ok: true, completionDisposition: undefined };
|
|
7453
7682
|
}
|
|
7454
7683
|
}
|
|
7684
|
+
// ⭐ TDD 를 로직으로(S4) — 문면(device-first 조각 계획)이 아니라 실행 판정으로 끼운다.
|
|
7685
|
+
// ① 자식의 [tdd-red]/[tdd-green] 기록을 태그·같은 명령·결과로 판정한다.
|
|
7686
|
+
// ② 첫 조각 커밋의 피처 시험·구현 전 실행 RED 기록과 구현 뒤 같은 명령 GREEN 기록이
|
|
7687
|
+
// 없으면 수리 라운드 1회(완료 경계·기존 동작은 보존), 그래도 없으면 fail-closed.
|
|
7688
|
+
// ③ 관측 원장에 tdd-red/tdd-green 이벤트를 남긴다.
|
|
7689
|
+
let tddJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(impl.evidenceTranscript?.trim() || impl.summary));
|
|
7690
|
+
if (tddJudgment.needsRepair && impl.ok && round < effectiveMax && opts.goalFile
|
|
7691
|
+
&& !hasCurrentProviderError() && !hasCurrentCredentialFailure()) {
|
|
7692
|
+
let goalDocument: string | undefined;
|
|
7693
|
+
try { goalDocument = readFileSync(opts.goalFile, 'utf8'); } catch { goalDocument = undefined; }
|
|
7694
|
+
if (goalDocument !== undefined) {
|
|
7695
|
+
const tddRetryNote = [
|
|
7696
|
+
'[구현 재작업 · tdd-evidence-missing]',
|
|
7697
|
+
`대상 경로: ${declaredPathsFromGoalDocumentText(goalDocument).paths.join(' · ') || '골 문서에 선언된 대상 경로 없음'}`,
|
|
7698
|
+
'첫 조각 커밋에 피처 시험을 먼저 쓰고 구현 전 실행 RED 기록을 남기고, 구현 뒤 같은 명령의 GREEN 기록을 남겨라.',
|
|
7699
|
+
"기록 양식(두 줄씩): 'EVIDENCE: [tdd-red] <무엇을 확인했나> || <증거 명령>' 다음 줄 'RESULT: <실패 요약 한 줄>' ·",
|
|
7700
|
+
"'EVIDENCE: [tdd-green] <무엇을 확인했나> || <같은 증거 명령>' 다음 줄 'RESULT: <통과 요약 한 줄>'.",
|
|
7701
|
+
`지금 잡힌 결손: ${tddJudgment.missing.join(' · ')}`,
|
|
7702
|
+
'원래 골 문서(완료 경계 포함):',
|
|
7703
|
+
goalDocument,
|
|
7704
|
+
].join('\n');
|
|
7705
|
+
const tddRetryRound = round + 1;
|
|
7706
|
+
observe('implementation-tdd-rework', { status: 'started', round: tddRetryRound, missing: [...tddJudgment.missing] }, { level: 'warn' });
|
|
7707
|
+
progress('implementing', `[구현 재작업 · tdd-evidence-missing] 수리 라운드 ${tddRetryRound} 시작 — RED/GREEN 기록 결손`);
|
|
7708
|
+
onNodeEntry(node('rework'), tddRetryRound);
|
|
7709
|
+
onNodeEntry(node('implement'), tddRetryRound);
|
|
7710
|
+
const tddRetryAbort = new AbortController();
|
|
7711
|
+
const beforeTddRetry = impl;
|
|
7712
|
+
let tddRetryImpl = impl;
|
|
7713
|
+
try {
|
|
7714
|
+
tddRetryImpl = await stepTimeout(s.implement({
|
|
7715
|
+
sessionId, cwd: wt.path, feature: `${feature}\n\n${tddRetryNote}`, runId, shardIdentity, signal: tddRetryAbort.signal,
|
|
7716
|
+
...(harnessSeededPaths.length ? { harnessSeededPaths } : {}),
|
|
7717
|
+
onSurfaceProgress: (line) => progress('implementing', line.trimEnd()),
|
|
7718
|
+
roundContext: { round: tddRetryRound, effectiveMax, previousRoundFailure: tddRetryNote },
|
|
7719
|
+
...(opts.childLlm ? { childLlm: opts.childLlm } : {}),
|
|
7720
|
+
...(opts.documentReferences ? { documentReferences: opts.documentReferences } : {}),
|
|
7721
|
+
}), T.implement, 'implement');
|
|
7722
|
+
} catch (error) {
|
|
7723
|
+
tddRetryAbort.abort();
|
|
7724
|
+
tddRetryImpl = { ...beforeTddRetry, ok: false, summary: `[구현 재작업 · tdd-evidence-missing] 수리 라운드 실패 — ${safeErrorDescription(error)}` };
|
|
7725
|
+
}
|
|
7726
|
+
const tddRetryJudgment = judgeTddEvidence(roundGoal, parseOffDiffEvidence(tddRetryImpl.evidenceTranscript?.trim() || tddRetryImpl.summary));
|
|
7727
|
+
if (tddRetryImpl.ok && !tddRetryJudgment.needsRepair) {
|
|
7728
|
+
observe('implementation-tdd-rework', { status: 'succeeded', round: tddRetryRound, missing: [] });
|
|
7729
|
+
tddJudgment = tddRetryJudgment;
|
|
7730
|
+
impl = tddRetryImpl;
|
|
7731
|
+
round = tddRetryRound;
|
|
7732
|
+
} else {
|
|
7733
|
+
observe('implementation-tdd-rework', { status: 'exhausted', round: tddRetryRound, missing: [...tddRetryJudgment.missing] }, { level: 'warn' });
|
|
7734
|
+
impl = { ...beforeTddRetry, ok: false, summary: `[구현 재작업 · tdd-evidence-missing] RED/GREEN 기록 결손 — ${beforeTddRetry.summary}` };
|
|
7735
|
+
}
|
|
7736
|
+
}
|
|
7737
|
+
}
|
|
7738
|
+
observe('tdd-red', {
|
|
7739
|
+
round, planned: tddJudgment.planned, observed: tddJudgment.red.observed, missing: tddJudgment.red.observed ? [] : ['tdd-red'],
|
|
7740
|
+
verify: tddJudgment.red.verify ?? null, result: tddJudgment.red.result ?? null,
|
|
7741
|
+
}, tddJudgment.planned && !tddJudgment.red.observed ? { level: 'warn' } : {});
|
|
7742
|
+
observe('tdd-green', {
|
|
7743
|
+
round, planned: tddJudgment.planned, observed: tddJudgment.green.observed, sameCommand: tddJudgment.sameCommand,
|
|
7744
|
+
missing: tddJudgment.green.observed && tddJudgment.sameCommand ? [] : ['tdd-green'],
|
|
7745
|
+
verify: tddJudgment.green.verify ?? null, result: tddJudgment.green.result ?? null,
|
|
7746
|
+
}, tddJudgment.planned && !(tddJudgment.green.observed && tddJudgment.sameCommand) ? { level: 'warn' } : {});
|
|
7455
7747
|
// A finished child can leave edits without a commit. Measure them before any
|
|
7456
7748
|
// diff/no-changes classification, and commit only paths declared in the goal.
|
|
7457
7749
|
finishedChildCommitMissing = false;
|
|
@@ -9046,9 +9338,9 @@ async function runSelfImplementInner(
|
|
|
9046
9338
|
const mergedBase = m.baseRefName?.trim() || observedPrBase;
|
|
9047
9339
|
if (mergedBase && displayBranchName(mergedBase) === 'main') {
|
|
9048
9340
|
try {
|
|
9049
|
-
const {
|
|
9341
|
+
const { syncMergedPrChecklistWithFeedback } = await import('../release-loop/merged-pr-checklist.js');
|
|
9050
9342
|
const goalFile = opts.goalFile ?? (opts.goalId ? s.goalDocumentPathByGoalId?.(opts.goalId) : undefined);
|
|
9051
|
-
|
|
9343
|
+
await syncMergedPrChecklistWithFeedback(pr.number, wt.path, goalFile);
|
|
9052
9344
|
} catch (error) {
|
|
9053
9345
|
observe('merged-pr-checklist-sync-failed', { number: pr.number, error: safeErrorDescription(error) }, { level: 'warn' });
|
|
9054
9346
|
}
|