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
|
@@ -39,7 +39,7 @@ export function resolveGoalAuthorGrade(flag?: GoalAuthorGrade, configured?: unkn
|
|
|
39
39
|
import type { ObserveOnlySource } from './observe-only.js';
|
|
40
40
|
import type { Question } from '../ask-user-question/types.js';
|
|
41
41
|
import { requestTestScenario as defaultRequestTestScenario, type TestScenarioRequestInput, type TestScenarioRequestResult } from './test-scenario-request.js';
|
|
42
|
-
import { resolveGoalAuthorClarification, parseGoalDocumentClarifications, serializeGoalAuthorParent, type GoalAuthorClarificationResponse, type GoalAuthorParent, type GoalAuthorSelfResolution } from './goal-author-clarification.js';
|
|
42
|
+
import { defaultGoalAuthorSelfResolve, resolveGoalAuthorClarification, parseGoalDocumentClarifications, serializeGoalAuthorParent, type GoalAuthorClarificationResponse, type GoalAuthorParent, type GoalAuthorSelfResolution } from './goal-author-clarification.js';
|
|
43
43
|
import { acquireLockSync } from '../storage/file-lock.js';
|
|
44
44
|
import { createRepositoryReferencedFileReader, type ReferencedFileReadResult } from './goal-file-reader.js';
|
|
45
45
|
import { extractGoalDocSections, type GoalDocSourceLine } from './goal-doc/section.js';
|
|
@@ -57,8 +57,10 @@ import { targetScopedGoalText } from './goal-text-path-scope.js';
|
|
|
57
57
|
import { parseReleaseNoteSection } from '../release-loop/release-note.js';
|
|
58
58
|
import { declaredNewFilePaths } from './goal-new-paths.js';
|
|
59
59
|
import { classifyGoalCommandExecution, type GoalCommandExecutionResult } from './goal-command-execution.js';
|
|
60
|
+
import { formatShadowArmProbeRecord, probeShadowArm, type ShadowArmProbeRecord, type ShadowDifficulty } from '../budget/shadow-arms.js';
|
|
60
61
|
import { identityLines, repositoryIdentifiers } from './goal-author-identity.js';
|
|
61
62
|
import { selectRelevantAuthoringLessons } from './knowhow-pack.js';
|
|
63
|
+
import { elanousStateRoot } from '../autopilot/state-paths.js';
|
|
62
64
|
export { selectRelevantAuthoringLessons } from './knowhow-pack.js';
|
|
63
65
|
export { formatSubmittedAt } from './goal-author-identity.js';
|
|
64
66
|
import { hasUnmetRequirementOutsidePreservationClause } from './goal-author-preservation-obligation.js';
|
|
@@ -116,7 +118,7 @@ export interface GoalAuthorDeps {
|
|
|
116
118
|
/** Optional externally decomposed plan steps rendered verbatim into the authored goal; the author never generates them. */
|
|
117
119
|
steps?: readonly string[];
|
|
118
120
|
/** Optional injected decomposition seam; omitted means authoring never invokes an LLM or decomposition. */
|
|
119
|
-
decomposeSteps?: (objective: string, opts?: { context?: string; runId?: string }) => Promise<readonly string[]>;
|
|
121
|
+
decomposeSteps?: (objective: string, opts?: { context?: string; runId?: string; goalId?: string }) => Promise<readonly string[]>;
|
|
120
122
|
/** Optional launch preflight result supplied by the caller; authoring never reads the ledger or logs itself. */
|
|
121
123
|
launchPreflight?: LaunchPreflightResult;
|
|
122
124
|
/** Optional in-process notification for each authored-goal phase transition. */
|
|
@@ -384,6 +386,7 @@ type GoalAuthorTimedPhase = GoalAuthorPhase | GoalAuthorAssembleSubphase;
|
|
|
384
386
|
function startGoalAuthorPhase(phase: GoalAuthorTimedPhase, authorRunId: string, onProgress?: GoalAuthorDeps['onProgress']): number {
|
|
385
387
|
observeGoalAuthor('goal-author', 'phase-start', { phase, authorRunId });
|
|
386
388
|
if (GOAL_AUTHOR_PHASES.includes(phase as GoalAuthorPhase)) {
|
|
389
|
+
if (phase === 'assemble') probeAuthoringShadowArm(authorRunId);
|
|
387
390
|
if (onProgress) onProgress(phase as GoalAuthorPhase, 'start');
|
|
388
391
|
else process.stderr.write(`[goal-author] ${phase} started\n`);
|
|
389
392
|
}
|
|
@@ -402,6 +405,56 @@ function endGoalAuthorPhase(phase: GoalAuthorTimedPhase, startedAt: number, auth
|
|
|
402
405
|
}
|
|
403
406
|
}
|
|
404
407
|
|
|
408
|
+
// ── SHADOW-MODEL-ARMS · 저작 단계 그림자 «1팔» probe(명시 실행 · 관측만) ────────────────
|
|
409
|
+
/**
|
|
410
|
+
* ⭐ 저작 단계 그림자 1팔 — `planShadowArms`(src/budget/shadow-arms.ts) 를 일일 상한
|
|
411
|
+
* 안에서 «실제 호출»해 난이도·모델·예상/실제 비용·결과를 한 줄 원장 형식으로 기록한다.
|
|
412
|
+
* ⛔ 관측만 한다 — 라이브 LLM(Claude 구독) 호출 0 · 골/PR/착지 파일 쓰기 0.
|
|
413
|
+
* 팔은 «계획»이고, 실행·자동 런 훅·다른 단계(implement·review·judge) 팔은 후속 조각이다.
|
|
414
|
+
* ⛔ 오늘 이미 쓴 그림자 예산의 실 지출 원장 배선도 후속 — 지금은 0지출 고정값으로 판정한다.
|
|
415
|
+
*/
|
|
416
|
+
export const SHADOW_AUTHORING_ARM_MODEL = 'gpt-5.6-terra';
|
|
417
|
+
export const SHADOW_AUTHORING_ARM_DIFFICULTY: ShadowDifficulty = 'medium';
|
|
418
|
+
export const SHADOW_AUTHORING_ARM_INPUT_TOKENS = 24_000;
|
|
419
|
+
export const SHADOW_AUTHORING_ARM_OUTPUT_TOKENS = 8_000;
|
|
420
|
+
export const SHADOW_AUTHORING_SPENT_TODAY_USD = 0;
|
|
421
|
+
export const SHADOW_AUTHORING_DAILY_CAP_USD = 5;
|
|
422
|
+
|
|
423
|
+
export interface AuthoringShadowArmProbe {
|
|
424
|
+
record: ShadowArmProbeRecord;
|
|
425
|
+
line: string;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
let shadowArmProbeObserver: ((probe: AuthoringShadowArmProbe, authorRunId: string) => void) | undefined;
|
|
429
|
+
|
|
430
|
+
function defaultShadowArmProbeObserver(probe: AuthoringShadowArmProbe, authorRunId: string): void {
|
|
431
|
+
observeGoalAuthor('goal-author', 'shadow-arm-authoring', { authorRunId, ...probe.record, line: probe.line });
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/** 저작 단계 그림자 1팔을 실제 호출해 기록을 낸다 — 부작용은 관측 원장뿐이다(관측만). */
|
|
435
|
+
export function probeAuthoringShadowArm(authorRunId: string): AuthoringShadowArmProbe {
|
|
436
|
+
const record = probeShadowArm({
|
|
437
|
+
stage: 'authoring',
|
|
438
|
+
difficulty: SHADOW_AUTHORING_ARM_DIFFICULTY,
|
|
439
|
+
inputTokens: SHADOW_AUTHORING_ARM_INPUT_TOKENS,
|
|
440
|
+
expectedOutputTokens: SHADOW_AUTHORING_ARM_OUTPUT_TOKENS,
|
|
441
|
+
candidates: [SHADOW_AUTHORING_ARM_MODEL],
|
|
442
|
+
spentTodayUsd: SHADOW_AUTHORING_SPENT_TODAY_USD,
|
|
443
|
+
dailyCapUsd: SHADOW_AUTHORING_DAILY_CAP_USD,
|
|
444
|
+
});
|
|
445
|
+
const probe: AuthoringShadowArmProbe = { record, line: formatShadowArmProbeRecord(record) };
|
|
446
|
+
const observer = shadowArmProbeObserver ?? defaultShadowArmProbeObserver;
|
|
447
|
+
observer(probe, authorRunId);
|
|
448
|
+
return probe;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/** 관측 접합점 갈아끼우기(시험 전용) — 인자 없이 부르면 생산 기본 관측자로 복원한다. */
|
|
452
|
+
export function _setShadowArmProbeObserverForTesting(
|
|
453
|
+
observer?: (probe: AuthoringShadowArmProbe, authorRunId: string) => void,
|
|
454
|
+
): void {
|
|
455
|
+
shadowArmProbeObserver = observer;
|
|
456
|
+
}
|
|
457
|
+
|
|
405
458
|
export type GoalFileLintLevel = 'ERROR' | 'WARN';
|
|
406
459
|
|
|
407
460
|
export type GoalFileLintTag = 'canonical-structure' | 'evidence-section' | 'boundary-size' | 'launch-branch' | 'unanswered-clarification' | 'shell-damage' | 'traced-path' | 'traced-path-new' | 'grounding-evidence' | 'empty-result-population' | 'decision-signal-numeric-source' | 'decision-signal-numeric-coverage' | 'decision-signal-proxy-expectation' | 'out-of-target-requirement' | 'heading-form-marker' | 'blanket-invariant' | 'self-question-subject' | 'artifact-launch-declaration' | 'all-negative-signals' | 'unreadable-signals' | 'alternative-signals' | 'count-observation' | 'identifier-name-observation' | 'self-reported-observation' | 'default-invocation-observation' | 'release-note';
|
|
@@ -2971,7 +3024,17 @@ export function readVerificationMenuDocs(root: string | undefined): { menu: stri
|
|
|
2971
3024
|
return { menu: read(VERIFICATION_MENU_DOC), catalog: read(MOCK_CATALOG_DOC) };
|
|
2972
3025
|
}
|
|
2973
3026
|
|
|
2974
|
-
interface CatalogStage {
|
|
3027
|
+
interface CatalogStage {
|
|
3028
|
+
id: string;
|
|
3029
|
+
name: string;
|
|
3030
|
+
universe: string;
|
|
3031
|
+
injection: string;
|
|
3032
|
+
observation: string;
|
|
3033
|
+
run: string;
|
|
3034
|
+
level: InjectionLadderLevel;
|
|
3035
|
+
strong: string[];
|
|
3036
|
+
weak: string[];
|
|
3037
|
+
}
|
|
2975
3038
|
interface MenuRow { method: string; command: string; stages: string }
|
|
2976
3039
|
|
|
2977
3040
|
const CATALOG_STOP_WORDS = new Set(['bun', 'bin', 'elanous', 'elanous.mjs', 'mjs', 'test', 'git', 'grep', 'head', 'json', 'path', 'paths']);
|
|
@@ -2998,8 +3061,10 @@ function parseCatalogStages(catalog: string): CatalogStage[] {
|
|
|
2998
3061
|
const [, id, name] = header as unknown as [string, string, string];
|
|
2999
3062
|
const universe = catalogField(block, '우주');
|
|
3000
3063
|
const behaviour = catalogField(block, '증명하는 동작');
|
|
3064
|
+
const injection = catalogField(block, '무대 세우기');
|
|
3065
|
+
const observation = catalogField(block, '판정');
|
|
3001
3066
|
const run = catalogField(block, '실행');
|
|
3002
|
-
const text = `${name} ${behaviour} ${run}`;
|
|
3067
|
+
const text = `${name} ${behaviour} ${universe} ${injection} ${observation} ${run}`;
|
|
3003
3068
|
const strong = new Set<string>();
|
|
3004
3069
|
const weak = new Set<string>();
|
|
3005
3070
|
for (const span of text.match(/`[^`]+`/gu) ?? []) {
|
|
@@ -3014,7 +3079,8 @@ function parseCatalogStages(catalog: string): CatalogStage[] {
|
|
|
3014
3079
|
if (word.length >= 2 && !CATALOG_KOREAN_STOP_WORDS.has(word)) weak.add(word);
|
|
3015
3080
|
}
|
|
3016
3081
|
for (const word of strong) weak.delete(word);
|
|
3017
|
-
return [{ id, name: name.trim(),
|
|
3082
|
+
return [{ id, name: name.trim(), universe, injection, observation, run,
|
|
3083
|
+
level: ladderLevelForUniverse(universe), strong: [...strong], weak: [...weak] }];
|
|
3018
3084
|
});
|
|
3019
3085
|
}
|
|
3020
3086
|
|
|
@@ -3094,6 +3160,10 @@ export function authorVerificationPlan(input: VerificationPlanInput): Verificati
|
|
|
3094
3160
|
const operationalNote = operational
|
|
3095
3161
|
? ` · 운영 실물: 메뉴 «${operationalRow?.method ?? '운영 실물 로그 관측'}» — 운영 데이터가 입력일 때만${operationalRow ? ` (${oneLine(operationalRow.command.replace(/`/gu, ''), 120)})` : ''}`
|
|
3096
3162
|
: '';
|
|
3163
|
+
const completionEvidenceCommandValue = /^\s*(?:[-*]\s*)?완료\s*경계\s*증거\s*명령\s*:\s*(.+?)\s*$/mu.exec(ask)?.[1];
|
|
3164
|
+
const completionEvidenceCommand = completionEvidenceCommandValue
|
|
3165
|
+
? validateGoalDoneEvidenceCommand(completionEvidenceCommandValue).command
|
|
3166
|
+
: undefined;
|
|
3097
3167
|
const testFile = firstTestTarget(input.targetPaths);
|
|
3098
3168
|
const cellId = ask.match(/\b[A-Z][A-Z0-9]+(?:-[A-Z0-9]+)+\b/u)?.[0];
|
|
3099
3169
|
const behaviour = oneLine((input.behaviour || '').split(/\s*(?:판정선|판정\s*신호)\s*(?:\(반증\))?\s*:/u)[0] || 'ask 에서 동작 문장을 고르지 못했다 — 사람이 ① 을 채운다', 120);
|
|
@@ -3108,7 +3178,7 @@ export function authorVerificationPlan(input: VerificationPlanInput): Verificati
|
|
|
3108
3178
|
const row = menuRows.find((candidate) => candidate.stages.includes(best!.stage.id));
|
|
3109
3179
|
const run = /`([^`]+)`/u.exec(best.stage.run)?.[1];
|
|
3110
3180
|
stage = { source: 'catalog', id: best.stage.id, level: best.stage.level };
|
|
3111
|
-
stageLine = `- ② 무대: ${best.stage.id} ${best.stage.name} · ${best.stage.level} (${INJECTION_LADDER[best.stage.level]})${row ? ` · 메뉴: ${row.method}` : ''}${run ? ` · 실행: \`${run}\`` : ''}${operationalNote}`;
|
|
3181
|
+
stageLine = `- ② 무대: ${best.stage.id} ${best.stage.name} · 우주: ${oneLine(best.stage.universe, 90)} · 사건 주입: ${oneLine(best.stage.injection, 120)} · 관측: ${oneLine(best.stage.observation, 120)} · ${best.stage.level} (${INJECTION_LADDER[best.stage.level]})${row ? ` · 메뉴: ${row.method}` : ''}${run ? ` · 실행: \`${run}\`` : ''}${operationalNote}`;
|
|
3112
3182
|
} else {
|
|
3113
3183
|
const screen = /TUI|화면|렌더|위젯|ux-sim|fake-llm|fake-bin|fake-clock|타이머/iu.test(ask);
|
|
3114
3184
|
const level: InjectionLadderLevel = screen ? 'L2' : 'L1';
|
|
@@ -3145,6 +3215,9 @@ export function authorVerificationPlan(input: VerificationPlanInput): Verificati
|
|
|
3145
3215
|
const symbol = wiringSymbol(ask);
|
|
3146
3216
|
const productionPaths = input.targetPaths.filter((path) => !/\.test\./u.test(path) && !/\.md$/u.test(path));
|
|
3147
3217
|
const wiring = `git grep -n -F '${symbol ?? '<새 함수>'}(' HEAD -- ${productionPaths.length ? productionPaths.join(' ') : 'src'}`;
|
|
3218
|
+
const e2 = completionEvidenceCommand
|
|
3219
|
+
? `E2 완료 경계 증거 명령 \`${completionEvidenceCommand}\` 을 origin/main 에서 rc0 확인`
|
|
3220
|
+
: 'E2 완료 경계 증거 명령은 ask에 없거나 유효하지 않아 저작자가 채움';
|
|
3148
3221
|
return {
|
|
3149
3222
|
lines: [
|
|
3150
3223
|
VERIFICATION_PLAN_HEADING,
|
|
@@ -3152,7 +3225,7 @@ export function authorVerificationPlan(input: VerificationPlanInput): Verificati
|
|
|
3152
3225
|
stageLine,
|
|
3153
3226
|
`- ③ 먼저 쓸 시험(RED): \`${testFile}\` › '${testName}' — ① 의 동작이 아직 없어 단언이 실패한다(구현 전에 먼저 쓰고 실패를 확인한다)`,
|
|
3154
3227
|
`- ④ GREEN 뒤 같은 명령: \`${testCommand}\` → 0 fail`,
|
|
3155
|
-
`- ⑤ 생산 진입점 배선(MS-05): \`${wiring}\` — 호출부를 커밋한 뒤 PR head
|
|
3228
|
+
`- ⑤ 생산 진입점 배선(MS-05 · G1 v4): \`${wiring}\` — 호출부를 커밋한 뒤 PR head에서 돌린다 · 정의·주석·시험 행이 아닌 생산 호출 문장 1건 이상(0건만으로 미배선 판정 금지) · E1 착지 뒤 PR head가 main의 조상인지 확인 · ${e2} · E3 생산 진입점 시험 또는 mock 무대 · E4 운영 실물은 필수 아님`,
|
|
3156
3229
|
],
|
|
3157
3230
|
stage,
|
|
3158
3231
|
menuPresent: input.menu !== null,
|
|
@@ -3907,6 +3980,8 @@ function renderClarification(
|
|
|
3907
3980
|
` - includeOther: ${question.includeOther !== false}`,
|
|
3908
3981
|
` - answer: ${answerValue}`,
|
|
3909
3982
|
...(provenance ? [` - provenance.source: ${provenance.source}`] : []),
|
|
3983
|
+
...(provenance?.assumption ? [` - provenance.assumption: ${renderClarificationValue(provenance.assumption)}`] : []),
|
|
3984
|
+
...(provenance?.assumptionSource ? [` - provenance.assumption-source: ${provenance.assumptionSource}`] : []),
|
|
3910
3985
|
...(provenance?.evidence ?? []).map((evidence) => ` - evidence: ${renderClarificationValue(evidence)}`),
|
|
3911
3986
|
];
|
|
3912
3987
|
}
|
|
@@ -6031,6 +6106,7 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6031
6106
|
throw new Error('legacy parent document has no RootIntent; rootIntent is required');
|
|
6032
6107
|
}
|
|
6033
6108
|
const rootIntent = validateRootIntent(supersessionRootIntent ?? inheritedRootIntent ?? requestedRootIntent ?? goalSummary(enhancement.original));
|
|
6109
|
+
const assignedGoalId = deps.goalId ?? generateGoalId();
|
|
6034
6110
|
let resolvedSteps = deps.steps;
|
|
6035
6111
|
if (resolvedSteps === undefined && goalType === 'implement' && deps.decomposeSteps) {
|
|
6036
6112
|
const startedAt = Date.now();
|
|
@@ -6041,7 +6117,7 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6041
6117
|
? [device.exists ? `existing: ${device.device}` : `missing: ${device.device}`] : undefined;
|
|
6042
6118
|
const context = [facts?.context, deviceInventory?.length ? `Device inventory (measured at goal-author repository root): ${deviceInventory.join(', ')}` : undefined]
|
|
6043
6119
|
.filter(Boolean).join('\n') || undefined;
|
|
6044
|
-
const decomposed = await deps.decomposeSteps(ask, { context, runId: process.env.ELANOUS_RUN_ID?.trim() || authorRunId });
|
|
6120
|
+
const decomposed = await deps.decomposeSteps(ask, { context, runId: process.env.ELANOUS_RUN_ID?.trim() || authorRunId, goalId: assignedGoalId });
|
|
6045
6121
|
if (decomposed.length > 0) resolvedSteps = decomposed;
|
|
6046
6122
|
} catch {
|
|
6047
6123
|
failed = true;
|
|
@@ -6270,7 +6346,6 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6270
6346
|
// ⚠️⭐ 계약 — 이 줄은 조립·린트가 «끝나기 전»에 난다(goalId 가 여기서 정해지므로 더 늦출 수 없다).
|
|
6271
6347
|
// ⇒ 저작이 그 «뒤»에 실패하면 이 조인 행만 남는다(dangling). 그러므로 ***집계는 「착지한 골」과의
|
|
6272
6348
|
// inner join 으로만 한다*** — 이 행 자체를 「골이 하나 생겼다」로 세면 «실패분까지» 센다(무인 리뷰 지적).
|
|
6273
|
-
const assignedGoalId = deps.goalId ?? generateGoalId();
|
|
6274
6349
|
const askFile = deps.askFile === undefined ? undefined : validateAskFile(deps.askFile);
|
|
6275
6350
|
try { observeGoalAuthor('goal-author', 'goal-id-assigned', { authorRunId, goalId: assignedGoalId, superseded: Boolean(deps.goalId) }); }
|
|
6276
6351
|
catch { /* 관측은 fail-soft */ }
|
|
@@ -6565,6 +6640,7 @@ export function defaultGoalAuthorDeps(cwd: string): GoalAuthorDeps {
|
|
|
6565
6640
|
},
|
|
6566
6641
|
readSourceFile: createRepositoryReferencedFileReader(cwd),
|
|
6567
6642
|
runHelpProbe: (argv) => runDefaultHelpProbe(cwd, argv),
|
|
6643
|
+
selfResolveClarification: defaultGoalAuthorSelfResolve,
|
|
6568
6644
|
};
|
|
6569
6645
|
}
|
|
6570
6646
|
|
|
@@ -6613,7 +6689,7 @@ export async function writeAuthoredGoal(
|
|
|
6613
6689
|
repositoryRoot: deps.repositoryRoot ?? groundingRoot,
|
|
6614
6690
|
};
|
|
6615
6691
|
const mandatoryGoalContextEvidence = goalContextEvidence(cwd);
|
|
6616
|
-
const authoringLessons = selectRelevantAuthoringLessons(cwd, ask);
|
|
6692
|
+
const authoringLessons = selectRelevantAuthoringLessons(cwd, ask, elanousStateRoot());
|
|
6617
6693
|
observeGoalAuthor('goal-author', 'authoring-lessons', {
|
|
6618
6694
|
status: authoringLessons.status,
|
|
6619
6695
|
invalidRows: authoringLessons.invalidRows,
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { createGraphUnitResolver } from './graph-unit-resolver.js';
|
|
3
|
+
import { flattenGraphUnits } from './graph-unit-flatten.js';
|
|
4
|
+
import {
|
|
5
|
+
implementLoopUnitEquivalence,
|
|
6
|
+
implementLoopUnitSpec,
|
|
7
|
+
stageUnitSeamsForGraph,
|
|
8
|
+
type ImplementLoopUnitEquivalence,
|
|
9
|
+
type ImplementStageUnitId,
|
|
10
|
+
type ImplementStageUnitSeam,
|
|
11
|
+
} from './graph-templates.js';
|
|
12
|
+
import type { GraphTemplateSpec } from './graph-yaml.js';
|
|
13
|
+
|
|
14
|
+
/** 한 부품이 «실제로» 어느 파일에서 해석됐나 — 원장·관측이 「어느 판의 부품으로 걸었나」를 답한다. */
|
|
15
|
+
export interface ResolvedStageUnit {
|
|
16
|
+
readonly stage: ImplementStageUnitId;
|
|
17
|
+
readonly call: string;
|
|
18
|
+
readonly unitId: string;
|
|
19
|
+
readonly version: number;
|
|
20
|
+
readonly path: string;
|
|
21
|
+
readonly hash: string;
|
|
22
|
+
readonly entry: string;
|
|
23
|
+
readonly nodes: readonly string[];
|
|
24
|
+
readonly exits: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** ⛔ 「부품이 없다」와 「부품을 못 읽었다」를 가른다 — 성공이면 reason 은 undefined 다. */
|
|
28
|
+
export interface StageUnitResolution {
|
|
29
|
+
readonly units: readonly ResolvedStageUnit[];
|
|
30
|
+
readonly flattened?: GraphTemplateSpec;
|
|
31
|
+
readonly equivalence?: ImplementLoopUnitEquivalence;
|
|
32
|
+
readonly reason?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** ⭐ 하나의 NodeContext — 골·근거·되먹임·예산·체크포인트가 저작→구현으로 «같은 객체»로 흐른다. */
|
|
36
|
+
export interface StageNodeContext {
|
|
37
|
+
readonly goal: {
|
|
38
|
+
readonly goalId?: string;
|
|
39
|
+
readonly goalType?: string;
|
|
40
|
+
readonly graphId: string;
|
|
41
|
+
readonly graphVersion: string;
|
|
42
|
+
};
|
|
43
|
+
readonly grounding: {
|
|
44
|
+
readonly units: readonly ResolvedStageUnit[];
|
|
45
|
+
readonly flattenedNodeCount: number | null;
|
|
46
|
+
/** null 이면 평탄화 자체를 못 했다 — 「불변」으로 읽지 않는다(reason 이 그 자리를 덮는다). */
|
|
47
|
+
readonly equivalence: ImplementLoopUnitEquivalence | null;
|
|
48
|
+
/** 부품 해석은 됐지만 합성 평탄화가 실패한 원인을 보존한다. */
|
|
49
|
+
readonly resolutionReason?: string;
|
|
50
|
+
};
|
|
51
|
+
readonly feedback: { readonly attempts?: number };
|
|
52
|
+
readonly budget: { readonly unitCount: number; readonly visitBudget: number | null };
|
|
53
|
+
readonly checkpoint: { readonly runId: string; readonly round?: number };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** 등록 부품을 graphs/units 에서 `id@version` 으로 해석하고, 합성 선언을 평탄화해 불변식을 값으로 낸다. */
|
|
57
|
+
export function resolveStageUnits(
|
|
58
|
+
seams: readonly ImplementStageUnitSeam[],
|
|
59
|
+
graphsDir: string,
|
|
60
|
+
): StageUnitResolution {
|
|
61
|
+
if (seams.length === 0) return { units: [] };
|
|
62
|
+
// ⛔ 호출자 경로가 곧 탐색 규약이다(graph-unit-resolver: dirname(caller)/units → dirname(caller) → repo/graphs/units).
|
|
63
|
+
const callerPath = join(graphsDir, 'implement-loop.yaml');
|
|
64
|
+
const resolver = createGraphUnitResolver();
|
|
65
|
+
const units: ResolvedStageUnit[] = [];
|
|
66
|
+
try {
|
|
67
|
+
for (const seam of seams) {
|
|
68
|
+
const unit = resolver(seam.call, callerPath);
|
|
69
|
+
// 부품 «단독» 평탄화 — unit 계약(entries·exits·terminal_nodes)이 그 자리에서 성립하는지 검증한다.
|
|
70
|
+
flattenGraphUnits(unit.template, unit.path, resolver);
|
|
71
|
+
units.push({
|
|
72
|
+
stage: seam.stage,
|
|
73
|
+
call: seam.call,
|
|
74
|
+
unitId: unit.template.graphId,
|
|
75
|
+
version: unit.template.version,
|
|
76
|
+
path: unit.path,
|
|
77
|
+
hash: unit.hash,
|
|
78
|
+
entry: seam.entry,
|
|
79
|
+
nodes: seam.nodes,
|
|
80
|
+
exits: unit.template.unit?.exits ?? [],
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const flattened = flattenGraphUnits(
|
|
84
|
+
implementLoopUnitSpec(),
|
|
85
|
+
join(graphsDir, 'self-implement-units.yaml'),
|
|
86
|
+
resolver,
|
|
87
|
+
);
|
|
88
|
+
return { units, flattened, equivalence: implementLoopUnitEquivalence(flattened) };
|
|
89
|
+
} catch (error) {
|
|
90
|
+
return { units, reason: error instanceof Error ? error.message : String(error) };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function buildStageNodeContext(input: {
|
|
95
|
+
readonly resolution: StageUnitResolution;
|
|
96
|
+
readonly graphId: string;
|
|
97
|
+
readonly graphVersion: string;
|
|
98
|
+
readonly runId: string;
|
|
99
|
+
readonly attempts?: number;
|
|
100
|
+
readonly round?: number;
|
|
101
|
+
readonly goalId?: string;
|
|
102
|
+
readonly goalType?: string;
|
|
103
|
+
}): StageNodeContext {
|
|
104
|
+
const { resolution } = input;
|
|
105
|
+
const visitBudget = resolution.flattened === undefined
|
|
106
|
+
? null
|
|
107
|
+
: resolution.flattened.nodes.reduce((total, node) => total + node.maxVisits, 0);
|
|
108
|
+
return {
|
|
109
|
+
goal: {
|
|
110
|
+
...(input.goalId === undefined ? {} : { goalId: input.goalId }),
|
|
111
|
+
...(input.goalType === undefined ? {} : { goalType: input.goalType }),
|
|
112
|
+
graphId: input.graphId,
|
|
113
|
+
graphVersion: input.graphVersion,
|
|
114
|
+
},
|
|
115
|
+
grounding: {
|
|
116
|
+
units: resolution.units,
|
|
117
|
+
flattenedNodeCount: resolution.flattened?.nodes.length ?? null,
|
|
118
|
+
equivalence: resolution.equivalence ?? null,
|
|
119
|
+
...(resolution.reason === undefined ? {} : { resolutionReason: resolution.reason }),
|
|
120
|
+
},
|
|
121
|
+
feedback: input.attempts === undefined ? {} : { attempts: input.attempts },
|
|
122
|
+
budget: { unitCount: resolution.units.length, visitBudget },
|
|
123
|
+
checkpoint: { runId: input.runId, ...(input.round === undefined ? {} : { round: input.round }) },
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** 원장 관측 payload — ⛔ 큰 구조(평탄화 그래프 전체)를 싣지 않고 «판정에 쓰는 값»만 싣는다. */
|
|
128
|
+
export function stageNodeContextObservation(context: StageNodeContext): Record<string, unknown> {
|
|
129
|
+
const equivalence = context.grounding.equivalence;
|
|
130
|
+
return {
|
|
131
|
+
graphId: context.goal.graphId,
|
|
132
|
+
graphVersion: context.goal.graphVersion,
|
|
133
|
+
runId: context.checkpoint.runId,
|
|
134
|
+
...(context.checkpoint.round === undefined ? {} : { round: context.checkpoint.round }),
|
|
135
|
+
...(context.grounding.resolutionReason === undefined ? {} : { resolutionReason: context.grounding.resolutionReason }),
|
|
136
|
+
units: context.grounding.units.map((unit) => ({
|
|
137
|
+
stage: unit.stage, call: unit.call, unitId: unit.unitId, version: unit.version, hash: unit.hash,
|
|
138
|
+
entry: unit.entry, nodes: unit.nodes, exits: unit.exits,
|
|
139
|
+
})),
|
|
140
|
+
flattenedNodeCount: context.grounding.flattenedNodeCount,
|
|
141
|
+
kindMismatches: equivalence?.kindMismatches.length ?? null,
|
|
142
|
+
missingEdges: equivalence?.missingEdges.length ?? null,
|
|
143
|
+
extraEdges: equivalence?.extraEdges.length ?? null,
|
|
144
|
+
visitBudget: context.budget.visitBudget,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** 라운드마다 같은 부품이 «여전히» 그 파일·그 판인가 — 파일이 도는 중에 바뀌면 걸음이 신원과 갈린다. */
|
|
149
|
+
export function stageUnitDrift(
|
|
150
|
+
units: readonly ResolvedStageUnit[],
|
|
151
|
+
graphsDir: string,
|
|
152
|
+
): { readonly missing: readonly string[]; readonly changed: readonly string[] } {
|
|
153
|
+
if (units.length === 0) return { missing: [], changed: [] };
|
|
154
|
+
const callerPath = join(graphsDir, 'implement-loop.yaml');
|
|
155
|
+
const resolver = createGraphUnitResolver();
|
|
156
|
+
const missing: string[] = [];
|
|
157
|
+
const changed: string[] = [];
|
|
158
|
+
for (const unit of units) {
|
|
159
|
+
try {
|
|
160
|
+
const current = resolver(unit.call, callerPath);
|
|
161
|
+
if (current.hash !== unit.hash) changed.push(unit.call);
|
|
162
|
+
} catch {
|
|
163
|
+
missing.push(unit.call);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return { missing, changed };
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** 그래프의 단계 부품을 «생산 진입점 문장» 하나로 — orchestrator 가 이 함수를 부른다. */
|
|
170
|
+
export function resolveGraphStageUnits(graphId: string, graphsDir: string): StageUnitResolution {
|
|
171
|
+
return resolveStageUnits(stageUnitSeamsForGraph(graphId), graphsDir);
|
|
172
|
+
}
|
|
@@ -5,7 +5,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
5
5
|
import ts from 'typescript';
|
|
6
6
|
import { GOAL_TYPES, type GoalType } from './goal-author.js';
|
|
7
7
|
import type { GraphRunContractSpec } from './graph-run-contract.js';
|
|
8
|
-
import { edgeMapOf, loadGraphTemplates, type GraphNodeContract, type GraphNodeKind, type GraphNodeSpec, type GraphTemplateSpec } from './graph-yaml.js';
|
|
8
|
+
import { edgeMapOf, loadGraphTemplates, type GraphEdgeSpec, type GraphNodeContract, type GraphNodeKind, type GraphNodeSpec, type GraphTemplateSpec } from './graph-yaml.js';
|
|
9
9
|
|
|
10
10
|
/** ⭐ RFC §5 «3단계» — 템플릿을 «데이터»로 둔다(RFC §4.1 어휘).
|
|
11
11
|
*
|
|
@@ -96,6 +96,167 @@ const RESEARCH_LOOP: GraphTemplate = {
|
|
|
96
96
|
},
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
+
/** ⭐ SELFIMPL-NODE-SEAMS-BACK — 한 NodeContext 가 저작→구현으로 흐르는 다섯 입력 칸.
|
|
100
|
+
*
|
|
101
|
+
* ⛔ 이 다섯은 «부품의 계약»이다 — units/<stage>/<stage>.yaml 의 unit.inputs 와 글자 그대로 같아야 한다
|
|
102
|
+
* (flattenGraphUnits 가 호출 노드의 contract 와 unit.inputs 를 «길이·원소» 둘 다로 대조한다). */
|
|
103
|
+
export const NODE_CONTEXT_INPUTS = ['goal', 'context', 'feedback', 'budget', 'checkpoint'] as const;
|
|
104
|
+
|
|
105
|
+
/** 등록 부품의 이름 — 요구가 이름으로 든 다섯 단계(구현·gate·리뷰·git·착지). */
|
|
106
|
+
export type ImplementStageUnitId = 'implement' | 'gate' | 'review' | 'git' | 'landing';
|
|
107
|
+
|
|
108
|
+
export interface ImplementStageUnitExit {
|
|
109
|
+
/** unit.exits 의 이름 — flattenGraphUnits 가 호출 간선 map 의 키와 «정확히» 대조한다. */
|
|
110
|
+
readonly exit: string;
|
|
111
|
+
/** 그 출구가 향하는 «파이프라인 노드» — PIPELINE_EDGES_BY_NODE 의 목적지에서만 고른다. */
|
|
112
|
+
readonly to: string;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface ImplementStageUnitSeam {
|
|
116
|
+
readonly stage: ImplementStageUnitId;
|
|
117
|
+
/** `id@version` — createGraphUnitResolver 규약 그대로. */
|
|
118
|
+
readonly call: string;
|
|
119
|
+
/** 그 부품이 소유한 파이프라인 노드(PIPELINE_EDGES_BY_NODE 의 키). */
|
|
120
|
+
readonly nodes: readonly string[];
|
|
121
|
+
/** 이 부품에서 처음 밟는 노드(= 호출 노드의 call_entry). */
|
|
122
|
+
readonly entry: string;
|
|
123
|
+
/** 합성 호출되는 단계만 계약을 갖는다; landing은 종결 노드라 호출 계약이 없다. */
|
|
124
|
+
readonly outputs?: readonly string[];
|
|
125
|
+
readonly exits?: readonly ImplementStageUnitExit[];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** ⛔ 출처는 «둘»이다 — kind 는 IMPLEMENT_LOOP, edges 는 PIPELINE_EDGES_BY_NODE. 여기서 새 어휘를 만들지 않는다.
|
|
129
|
+
*
|
|
130
|
+
* 📌 착지(landing) 부품은 합성 그래프에서 «평범한 merge 노드»로 남는다: flattenGraphUnits 는 호출 노드마다
|
|
131
|
+
* 나가는 outcome map 을 요구하는데 종결 노드(merge)에는 나가는 간선이 없다 — 즉 «종결 노드는 호출일 수 없다».
|
|
132
|
+
* 그래서 landing 은 등록·해석·단독 평탄화(계약 검증)로 생산 경로를 지나고, 합성 그래프의 종결은 merge 가 맡는다. */
|
|
133
|
+
export const IMPLEMENT_STAGE_UNITS: readonly ImplementStageUnitSeam[] = [
|
|
134
|
+
{ stage: 'implement', call: 'implement@1', nodes: ['implement'], entry: 'implement',
|
|
135
|
+
outputs: ['diff', 'evidence', 'result'],
|
|
136
|
+
exits: [{ exit: 'done', to: 'gate' }, { exit: 'rework', to: 'gate' }, { exit: 'failed', to: 'gate' }] },
|
|
137
|
+
{ stage: 'gate', call: 'gate@1', nodes: ['gate'], entry: 'gate',
|
|
138
|
+
outputs: ['gate-verdict', 'evidence'],
|
|
139
|
+
exits: [{ exit: 'pass', to: 'review' }, { exit: 'fail', to: 'rework' },
|
|
140
|
+
{ exit: 'sync', to: 'main-sync' }, { exit: 'open', to: 'open-pr' }] },
|
|
141
|
+
{ stage: 'review', call: 'review@1', nodes: ['review'], entry: 'review',
|
|
142
|
+
outputs: ['verdict', 'must-fix', 'evidence'],
|
|
143
|
+
exits: [{ exit: 'pass', to: 'main-sync' }, { exit: 'fail', to: 'rework' },
|
|
144
|
+
{ exit: 'sync', to: 'main-sync' }, { exit: 'open', to: 'open-pr' }] },
|
|
145
|
+
{ stage: 'git', call: 'git@1', nodes: ['main-sync', 'open-pr'], entry: 'main-sync',
|
|
146
|
+
outputs: ['commit', 'pr-number', 'evidence'],
|
|
147
|
+
exits: [{ exit: 'to-regate', to: 'regate' }, { exit: 'to-open-pr', to: 'open-pr' },
|
|
148
|
+
{ exit: 'to-merge', to: 'merge' }] },
|
|
149
|
+
{ stage: 'landing', call: 'landing@1', nodes: ['merge'], entry: 'merge',
|
|
150
|
+
// 합성 그래프의 merge는 종결 노드라 landing 부품의 종료 매핑을 만들지 않는다.
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
|
|
154
|
+
/** 그 그래프가 «부품으로 떼어 놓은» 단계 목록 — self-implement 밖의 그래프는 빈 배열(동작 불변). */
|
|
155
|
+
export function stageUnitSeamsForGraph(graphId: string): readonly ImplementStageUnitSeam[] {
|
|
156
|
+
return graphId === PIPELINE_GRAPH_ID ? IMPLEMENT_STAGE_UNITS : [];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** 파이프라인 노드의 kind — IMPLEMENT_LOOP 과 «같은 출처»에서 읽는다(두 벌로 갈리지 않게). */
|
|
160
|
+
export function pipelineNodeKind(nodeId: string): string | undefined {
|
|
161
|
+
return IMPLEMENT_LOOP.nodes.find((node) => node.nodeId === nodeId)?.kind;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const UNIT_CALL_CONTRACT = (outputs: readonly string[]): GraphNodeContract => ({
|
|
165
|
+
inputs: [...NODE_CONTEXT_INPUTS],
|
|
166
|
+
tools: 'none',
|
|
167
|
+
outputs: [...outputs],
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
/** ⭐ 부품 호출로 «재조립한» self-implement 선언 — 실행 그래프가 아니라 «정적 검증용 합성»이다.
|
|
171
|
+
*
|
|
172
|
+
* ⛔ 실행 그래프(graphs/implement-loop.yaml)는 건드리지 않는다(보존 계약: 도는 동작 불변).
|
|
173
|
+
* 이 spec 은 flattenGraphUnits 의 정적 검증(entry/exit 매핑·inputs/outputs 계약·이름 충돌·순환/깊이≤3)을
|
|
174
|
+
* «실제 등록 부품»에 걸어, 부품 분해가 기존 kind+edges 를 그대로 재현함을 값으로 낸다. */
|
|
175
|
+
export function implementLoopUnitSpec(): GraphTemplateSpec {
|
|
176
|
+
const call = (seam: ImplementStageUnitSeam, callEntry?: string): GraphNodeSpec => ({
|
|
177
|
+
nodeId: callEntry ?? seam.entry,
|
|
178
|
+
kind: 'subgraph',
|
|
179
|
+
recipe: 'none',
|
|
180
|
+
maxVisits: 1,
|
|
181
|
+
call: seam.call,
|
|
182
|
+
...(callEntry === undefined ? {} : { callEntry }),
|
|
183
|
+
contract: UNIT_CALL_CONTRACT(seam.outputs ?? []),
|
|
184
|
+
});
|
|
185
|
+
const seamOf = (stage: ImplementStageUnitId): ImplementStageUnitSeam =>
|
|
186
|
+
IMPLEMENT_STAGE_UNITS.find((seam) => seam.stage === stage)!;
|
|
187
|
+
const outcome = (stage: ImplementStageUnitId, from: string): GraphEdgeSpec => ({
|
|
188
|
+
from,
|
|
189
|
+
on: 'outcome',
|
|
190
|
+
map: Object.fromEntries((seamOf(stage).exits ?? []).map(({ exit, to }) => [exit, to])),
|
|
191
|
+
});
|
|
192
|
+
const nodes: GraphNodeSpec[] = [
|
|
193
|
+
call(seamOf('implement')),
|
|
194
|
+
call(seamOf('gate')),
|
|
195
|
+
call(seamOf('review')),
|
|
196
|
+
call(seamOf('git'), 'main-sync'),
|
|
197
|
+
call(seamOf('git'), 'open-pr'),
|
|
198
|
+
{ nodeId: 'rework', kind: pipelineNodeKind('rework')!, recipe: 'none', maxVisits: 6 },
|
|
199
|
+
{ nodeId: 'regate', kind: pipelineNodeKind('regate')!, recipe: 'none', maxVisits: 2 },
|
|
200
|
+
{ nodeId: 'merge', kind: pipelineNodeKind('merge')!, recipe: 'none', maxVisits: 1 },
|
|
201
|
+
];
|
|
202
|
+
const edges: GraphEdgeSpec[] = [
|
|
203
|
+
outcome('implement', 'implement'),
|
|
204
|
+
outcome('gate', 'gate'),
|
|
205
|
+
outcome('review', 'review'),
|
|
206
|
+
outcome('git', 'main-sync'),
|
|
207
|
+
outcome('git', 'open-pr'),
|
|
208
|
+
{ from: 'rework', to: 'implement' },
|
|
209
|
+
{ from: 'regate', to: 'open-pr' },
|
|
210
|
+
];
|
|
211
|
+
return {
|
|
212
|
+
graphId: PIPELINE_GRAPH_ID,
|
|
213
|
+
version: 1,
|
|
214
|
+
entryNode: 'implement',
|
|
215
|
+
terminalNodes: ['merge'],
|
|
216
|
+
nodes,
|
|
217
|
+
edges,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export interface ImplementLoopUnitEquivalence {
|
|
222
|
+
/** 파이프라인 노드마다 «합성 그래프의 kind» 가 IMPLEMENT_LOOP 과 다른 것. */
|
|
223
|
+
readonly kindMismatches: readonly { node: string; expected: string; actual: string | undefined }[];
|
|
224
|
+
/** PIPELINE_EDGES_BY_NODE 에 있는데 평탄화 결과에 «없는» 간선. */
|
|
225
|
+
readonly missingEdges: readonly string[];
|
|
226
|
+
/** 평탄화 결과에 있는데 PIPELINE_EDGES_BY_NODE 에 «없는» 간선 — 0 이어야 동작 불변이다. */
|
|
227
|
+
readonly extraEdges: readonly string[];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/** flattenGraphUnits 는 호출 노드의 자식을 `${callNodeId}__${nodeId}` 로 접두한다 — 그 접두를 벗겨 되돌린다. */
|
|
231
|
+
export function normalizeFlattenedNodeId(nodeId: string): string {
|
|
232
|
+
const at = nodeId.lastIndexOf('__');
|
|
233
|
+
return at < 0 ? nodeId : nodeId.slice(at + 2);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/** ⭐ 판정선: 평탄화 결과가 기존 kind+edges 와 «같은가»를 세 방향으로 낸다. */
|
|
237
|
+
export function implementLoopUnitEquivalence(flattened: GraphTemplateSpec): ImplementLoopUnitEquivalence {
|
|
238
|
+
const kindMismatches: { node: string; expected: string; actual: string | undefined }[] = [];
|
|
239
|
+
const actualKinds = new Map<string, string>();
|
|
240
|
+
for (const node of flattened.nodes) actualKinds.set(normalizeFlattenedNodeId(node.nodeId), node.kind);
|
|
241
|
+
for (const nodeId of Object.keys(PIPELINE_EDGES_BY_NODE)) {
|
|
242
|
+
const expected = pipelineNodeKind(nodeId);
|
|
243
|
+
const actual = actualKinds.get(nodeId);
|
|
244
|
+
if (expected !== undefined && actual !== expected) kindMismatches.push({ node: nodeId, expected, actual });
|
|
245
|
+
}
|
|
246
|
+
const edgesOf = (map: Readonly<Record<string, readonly string[]>>): Set<string> =>
|
|
247
|
+
new Set(Object.entries(map).flatMap(([from, targets]) => targets.map((to) => `${from}->${to}`)));
|
|
248
|
+
const normalizedFlattened = Object.fromEntries(
|
|
249
|
+
Object.entries(edgeMapOf(flattened)).map(([from, targets]) => [normalizeFlattenedNodeId(from), targets.map(normalizeFlattenedNodeId)]),
|
|
250
|
+
);
|
|
251
|
+
const actual = edgesOf(normalizedFlattened);
|
|
252
|
+
const expected = edgesOf(PIPELINE_EDGES_BY_NODE as unknown as Record<string, readonly string[]>);
|
|
253
|
+
return {
|
|
254
|
+
kindMismatches,
|
|
255
|
+
missingEdges: [...expected].filter((edge) => !actual.has(edge)).sort(),
|
|
256
|
+
extraEdges: [...actual].filter((edge) => !expected.has(edge)).sort(),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
99
260
|
/** ⭐⭐ RFC §5 «배선» — 선언의 «출처»가 YAML 이다(대표 지시: TypeScript 는 저장에서 빠진다).
|
|
100
261
|
*
|
|
101
262
|
* ⛔ 이 상수들(IMPLEMENT_LOOP·RESEARCH_LOOP)은 «폴백»이다 — YAML 을 못 읽었을 때만 쓴다.
|
|
@@ -31,10 +31,38 @@ export interface GraphVariantGoalAnalysis {
|
|
|
31
31
|
readonly targetPathCount: number;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
/** 한 런이 읽은 unit 선언의 원문 — 해시 근거를 만들 입력이며 결과에는 실리지 않는다. */
|
|
35
|
+
export interface GraphVariantUnitDeclaration {
|
|
36
|
+
readonly path: string;
|
|
37
|
+
readonly content: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** 선택된 unit 선언의 근거 — 경로와 내용 해시만. 본문은 로그·원장에 복제하지 않는다. */
|
|
41
|
+
export interface GraphVariantUnitDeclarationEvidence {
|
|
42
|
+
readonly path: string;
|
|
43
|
+
readonly contentHash: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
34
46
|
/** 최초 graph variant 선택 — id·선택 이유가 런 원장 옆 .graph.yaml 에 함께 저장되고 재조회된다. */
|
|
35
47
|
export interface GraphVariantSelection {
|
|
36
48
|
readonly variantId: string;
|
|
37
49
|
readonly reason: string;
|
|
50
|
+
/** 선택된 unit 선언의 경로·내용 해시 — 선언이 없으면 키 자체가 없다(기존 두 키 계약 불변). */
|
|
51
|
+
readonly unitDeclarations?: readonly GraphVariantUnitDeclarationEvidence[];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** unit 선언 본문의 sha256 — 내용 대신 이 값만 근거에 남긴다(goalContentHash 와 같은 해시-only 예비). */
|
|
55
|
+
export function hashUnitDeclarationContent(content: string): string {
|
|
56
|
+
return createHash('sha256').update(content, 'utf8').digest('hex');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** 경로 오름차순·경로당 한 줄로 정렬한 근거 — 선언 순서가 달라도 같은 값을 낸다. */
|
|
60
|
+
function unitDeclarationEvidence(unitDeclarations: readonly GraphVariantUnitDeclaration[]): GraphVariantUnitDeclarationEvidence[] {
|
|
61
|
+
const byPath = new Map<string, string>();
|
|
62
|
+
for (const declaration of [...unitDeclarations].sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0)) {
|
|
63
|
+
byPath.set(declaration.path, hashUnitDeclarationContent(declaration.content));
|
|
64
|
+
}
|
|
65
|
+
return [...byPath].map(([path, contentHash]) => ({ path, contentHash }));
|
|
38
66
|
}
|
|
39
67
|
|
|
40
68
|
export type GraphVariantRejection =
|
|
@@ -55,14 +83,17 @@ export type GraphVariantResult =
|
|
|
55
83
|
| { readonly ok: true; readonly overlay: GraphOverlaySpec; readonly template: GraphTemplateSpec; readonly patches: readonly OverlayPatchOp[]; readonly selection?: GraphVariantSelection }
|
|
56
84
|
| { readonly ok: false; readonly rejections: readonly GraphVariantRejection[] };
|
|
57
85
|
|
|
58
|
-
/** 최초 변형 선택(id·선택 이유)의 결정론적 유도 — 같은
|
|
59
|
-
export function initialGraphVariantSelection(analysis: GraphVariantGoalAnalysis
|
|
86
|
+
/** 최초 변형 선택(id·선택 이유 + 선택된 unit 선언의 경로·해시)의 결정론적 유도 — 같은 입력이면 항상 같은 값을 낸다. */
|
|
87
|
+
export function initialGraphVariantSelection(analysis: GraphVariantGoalAnalysis,
|
|
88
|
+
unitDeclarations: readonly GraphVariantUnitDeclaration[] = []): GraphVariantSelection {
|
|
60
89
|
const variantId = `variant-${analysis.goalType}-${createHash('sha256')
|
|
61
90
|
.update(JSON.stringify({ goalType: analysis.goalType, targetPathCount: analysis.targetPathCount }))
|
|
62
91
|
.digest('hex').slice(0, 12)}`;
|
|
92
|
+
const evidence = unitDeclarationEvidence(unitDeclarations);
|
|
63
93
|
return {
|
|
64
94
|
variantId,
|
|
65
95
|
reason: `initial graph variant selected from goal type ${analysis.goalType} with ${analysis.targetPathCount} target path${analysis.targetPathCount === 1 ? '' : 's'}`,
|
|
96
|
+
...(evidence.length === 0 ? {} : { unitDeclarations: evidence }),
|
|
66
97
|
};
|
|
67
98
|
}
|
|
68
99
|
|
|
@@ -72,8 +103,10 @@ export function createGraphVariant(input: {
|
|
|
72
103
|
readonly goal: string;
|
|
73
104
|
readonly plan: GraphVariantPlan;
|
|
74
105
|
readonly goalAnalysis?: GraphVariantGoalAnalysis;
|
|
106
|
+
/** 이 런이 읽은 unit 선언 — 경로·내용 해시만 근거에 실리고 본문은 결과에 남지 않는다. */
|
|
107
|
+
readonly unitDeclarations?: readonly GraphVariantUnitDeclaration[];
|
|
75
108
|
}): GraphVariantResult {
|
|
76
|
-
const { template, goal, plan, goalAnalysis } = input;
|
|
109
|
+
const { template, goal, plan, goalAnalysis, unitDeclarations = [] } = input;
|
|
77
110
|
const known = new Set(template.nodes.map((node) => node.nodeId));
|
|
78
111
|
const rejections: GraphVariantRejection[] = [];
|
|
79
112
|
if (!/^g_[a-z0-9_-]+$/i.test(goal)) rejections.push({ kind: 'invalid-goal' });
|
|
@@ -82,7 +115,7 @@ export function createGraphVariant(input: {
|
|
|
82
115
|
if (!GOAL_TYPES.includes(goalAnalysis.goalType) || !Number.isSafeInteger(goalAnalysis.targetPathCount) || goalAnalysis.targetPathCount < 0) {
|
|
83
116
|
rejections.push({ kind: 'invalid-goal-analysis' });
|
|
84
117
|
} else {
|
|
85
|
-
selection = initialGraphVariantSelection(goalAnalysis);
|
|
118
|
+
selection = initialGraphVariantSelection(goalAnalysis, unitDeclarations);
|
|
86
119
|
}
|
|
87
120
|
}
|
|
88
121
|
if (plan.growth) {
|