elanous 0.2.36 → 0.2.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 1026-44010f405704050c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
- package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 1632.7d87f998e714bede.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
- package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
- package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 2415.738b777642a02233.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 3291.f6c1005387d514bd.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
- package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
- package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
- package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +90 -0
- package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
- package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
- package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 5307.d7328020227880c2.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
- package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
- package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
- package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 7628.6b16863ac3972333.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 7954.4f7a8832663ee979.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 8019.21ca554a821dad01.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 8487.291666583bebe640.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 8879.ac06755bcf3e44a1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
- package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
- package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
- package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/{page-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/{page-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → eaad0cba.771200940c529df7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
- package/apps/pwa/out/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/graphs/drafts/recipes.yaml +27 -7
- package/graphs/release/recipes.yaml +9 -0
- package/graphs/release/release-loop.yaml +26 -18
- package/graphs/work/draft-close.yaml +54 -0
- package/graphs/work/green-close.yaml +37 -0
- package/graphs/work/recipes.yaml +46 -1
- package/graphs/work/run-research.yaml +35 -0
- package/package.json +1 -1
- package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
- package/scripts/ask-op-inbox-once.ts +17 -0
- package/scripts/boundary-proof-mapping-audit.ts +88 -0
- package/scripts/brand/check.ts +13 -4
- package/scripts/codex-fallback-live-probe.ts +17 -15
- package/scripts/fleet/node-setup.sh +32 -2
- package/scripts/fleet/run-light-worker.sh +9 -0
- package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
- package/scripts/gate-0226-failure-census.ts +546 -0
- package/scripts/goals/authoring-metrics.ts +258 -0
- package/scripts/graph-units/draft-close-node.ts +222 -0
- package/scripts/hook-order-sweep.ts +7 -4
- package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
- package/scripts/land-global-checks.ts +69 -1
- package/scripts/measure-nl-routing-corpus.ts +207 -2
- package/scripts/provision-export-redactions.ts +15 -0
- package/scripts/public-copy-lint.ts +122 -0
- package/scripts/public-export.ts +69 -2
- package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
- package/scripts/ratchets/train-side-invariants.sh +7 -1
- package/scripts/release-loop/cut-branch.ts +61 -12
- package/scripts/release-loop/docs-node.ts +140 -0
- package/scripts/release-loop/gate-closure.ts +48 -0
- package/scripts/release-loop/gate-diff.ts +2 -1
- package/scripts/release-loop/gate-node.ts +161 -25
- package/scripts/release-loop/gate-partial.ts +82 -3
- package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
- package/scripts/release-loop/gate-radius-live.ts +4 -2
- package/scripts/release-loop/known-issues-node.ts +6 -4
- package/scripts/release-loop/notes-repair.ts +216 -0
- package/scripts/release-loop/prepare-node.ts +61 -5
- package/scripts/release-loop/resume-cap.ts +2 -1
- package/scripts/release-loop/resume-release.ts +406 -7
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/resume.ts +13 -5
- package/scripts/release-loop/traffic-node.ts +12 -4
- package/scripts/release-loop/traffic-transition.ts +53 -13
- package/scripts/release-loop/version-node.ts +109 -15
- package/scripts/train/green-leg.ts +176 -0
- package/scripts/tui-continue-real-evidence.ts +47 -0
- package/scripts/ux-sim.ts +1 -1
- package/scripts/video-pipeline.ts +2 -2
- package/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +12 -1
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/run-context.ts +1 -1
- package/src/agent/task-notification.ts +3 -1
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent-substrate/pr-reviewer.ts +11 -3
- package/src/agent-substrate/review-observation.ts +10 -0
- package/src/agent-substrate/self-review-cli.ts +537 -57
- package/src/auto-research/question-ladder-contract.ts +137 -0
- package/src/auto-research/research-turn.ts +134 -0
- package/src/autopilot/discovery/doc-lint.ts +1 -1
- package/src/autopilot/lineage/sources.ts +1 -1
- package/src/autopilot/pr-manager.ts +64 -13
- package/src/boot/daemon-runtime.ts +35 -3
- package/src/boot/daemon-tools/pty-shell.ts +2 -1
- package/src/bots/screen-probe.ts +1 -1
- package/src/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/capture/tui-self-report.ts +42 -5
- package/src/chat/index.ts +1 -0
- package/src/chat/tool-render/dispatch.ts +8 -1
- package/src/cli/autopilot-cli.ts +24 -9
- package/src/cli/decisions-cli.ts +7 -4
- package/src/cli/doctor-cli.ts +116 -7
- package/src/cli/guardian-cli.ts +3 -1
- package/src/cli/intake-cli.ts +48 -12
- package/src/cli/lesson-cli.ts +69 -9
- package/src/cli/logs-cli.ts +357 -2
- package/src/cli/memory-cli.ts +30 -1
- package/src/cli/msg-cli.ts +15 -11
- package/src/cli/pr-granularity.ts +5 -3
- package/src/cli/pr-land-overlap-evidence.ts +38 -5
- package/src/cli/pr-land-refusal.ts +1 -1
- package/src/cli/pty-takeover-cli.ts +58 -5
- package/src/cli/release-checklist-read-cli.ts +112 -4
- package/src/cli/release-cli.ts +89 -18
- package/src/cli/review-carry.ts +77 -0
- package/src/cli/self-update.ts +24 -6
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-card-show.ts +31 -1
- package/src/cli/tasks-cli.ts +370 -33
- package/src/cli/tasks-read-cli.ts +13 -5
- package/src/cli/usage-cli.ts +12 -10
- package/src/context-bus/claude-memory-import.ts +99 -0
- package/src/context-bus/context-now.ts +86 -2
- package/src/context-bus/long-term-memory.ts +125 -0
- package/src/core-turn/run-core-turn.ts +9 -2
- package/src/core-turn/run-goal-loop.ts +5 -2
- package/src/core-turn/types.ts +5 -0
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/index.ts +115 -30
- package/src/dashboard/input/agent-wake.ts +43 -0
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/input/terminal-modal-router.ts +8 -159
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/side-basic-runtime.ts +61 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- package/src/dashboard/term-slash-runtime.ts +2 -0
- package/src/dashboard/turn-preamble.ts +28 -4
- package/src/display/coordinator.ts +45 -12
- package/src/display/resize-listener.ts +41 -20
- package/src/display/synchronized-output-region.ts +60 -0
- package/src/domains/guardian-tick.ts +9 -0
- package/src/domains/surface-events.ts +80 -1
- package/src/exec-requests/planner.ts +37 -2
- package/src/execution-loop/launch-gate.ts +4 -3
- package/src/git-fs/cli-stderr.ts +45 -0
- package/src/git-fs/gh-cli.ts +6 -3
- package/src/git-fs/git-cli.ts +11 -5
- package/src/git-fs/watcher.ts +27 -22
- package/src/git-fs/worktree.ts +19 -3
- package/src/graph-runner/graph-cli.ts +26 -2
- package/src/graph-runner/graph-grow.ts +37 -9
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +34 -7
- package/src/graph-wizard/generate.ts +29 -6
- package/src/grok/credential.ts +107 -36
- package/src/harness/harness-cli-command.ts +179 -33
- package/src/harness/review-adapter.ts +26 -6
- package/src/hq/fence-wrapper.ts +1 -1
- package/src/hq/transfer.ts +1 -1
- package/src/index.ts +151 -18
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- package/src/intake-plane/collect-telegram-saved.ts +54 -5
- package/src/interactive-terminal-modal.ts +3 -0
- package/src/keybindings.ts +17 -22
- package/src/llm/provider-credentials.ts +1 -1
- package/src/llm/route-decision.ts +13 -0
- package/src/llm-tool-name.ts +37 -0
- package/src/llm-tool-schema.ts +55 -0
- package/src/llm.ts +203 -21
- package/src/loops/checker.ts +100 -0
- package/src/loops/consensus.ts +26 -2
- package/src/loops/loop-cli.ts +9 -4
- package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
- package/src/loops/orchestrator/inbox-once.ts +28 -0
- package/src/loops/orchestrator/inbox.ts +130 -1
- package/src/loops/orchestrator/tick.ts +55 -7
- package/src/maturity/feature-maturity.ts +1 -0
- package/src/model-tier/llm-tier-map.ts +12 -17
- package/src/msg/msg-store.ts +17 -0
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/channel-ask-op.ts +96 -0
- package/src/nexus/api/discord-trigger-bot.ts +28 -1
- package/src/nexus/api/graph-wizard-api.ts +27 -2
- package/src/nexus/api/grid.ts +24 -4
- package/src/nexus/api/http-server.ts +1 -1
- package/src/nexus/api/ops-api.ts +14 -6
- package/src/nexus/api/telegram-trigger-bot.ts +24 -0
- package/src/nexus/api/terminals.ts +28 -6
- package/src/nexus/state/state.ts +7 -1
- package/src/oauth/codex-account-store.ts +34 -1
- package/src/ops/loops-map.ts +46 -0
- package/src/ops/overview-cache.ts +22 -4
- package/src/ops/overview.ts +41 -5
- package/src/patents/ledger.ts +18 -1
- package/src/policy/llm-policy.ts +3 -1
- package/src/preview/terminal.ts +4 -2
- package/src/prompt-cache/anthropic.ts +2 -0
- package/src/prompt-enhance/enhance.ts +9 -4
- package/src/pty-shell/availability.ts +7 -0
- package/src/pty-shell/herdr-agent-report.ts +40 -31
- package/src/pty-shell/herdr-prune-stale.ts +17 -0
- package/src/pty-shell/herdr-sequence-lease.ts +60 -0
- package/src/pty-shell/pty-control-ipc.ts +187 -18
- package/src/pty-shell/pty-manifest.ts +16 -2
- package/src/pty-shell/registry.ts +25 -15
- package/src/pty-shell/tui-run-state.ts +235 -1
- package/src/release-loop/checklist.ts +50 -5
- package/src/release-loop/feature-store.ts +9 -9
- package/src/release-loop/gate-shards.ts +61 -0
- package/src/release-loop/landed-but-yellow.ts +93 -12
- package/src/release-loop/light-rc.ts +7 -4
- package/src/release-loop/rehearsal.ts +1 -1
- package/src/repl/index.ts +18 -0
- package/src/research/axis-fanout.ts +133 -0
- package/src/research/edge-decision.ts +88 -0
- package/src/research/output-router.ts +127 -0
- package/src/research-bridge/format.ts +16 -1
- package/src/research-bridge/index.ts +1 -0
- package/src/research-bridge/invoke.ts +41 -5
- package/src/seat-loop/seat-report.ts +1 -0
- package/src/self-dev/ask-launch-flow.ts +86 -10
- package/src/self-dev/decompose-proposal.ts +29 -18
- package/src/self-dev/decompose.ts +45 -9
- package/src/self-dev/dev-pipeline.ts +29 -7
- package/src/self-dev/draft-residue.ts +221 -2
- package/src/self-dev/draft-sweep.ts +254 -16
- package/src/self-dev/draft-triage-rules.ts +19 -5
- package/src/self-dev/orchestrate.ts +1 -0
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/run-supervisor.ts +22 -7
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +310 -6
- package/src/self-implement/comment-only-source.ts +54 -0
- package/src/self-implement/doctor-visit.ts +108 -0
- package/src/self-implement/gate-artifacts.ts +6 -2
- package/src/self-implement/gate-baseline.ts +99 -1
- package/src/self-implement/gate-cli.ts +231 -82
- package/src/self-implement/gate-failure-signature.ts +44 -0
- package/src/self-implement/gate-remote.ts +30 -4
- package/src/self-implement/gate-scope.ts +13 -1
- package/src/self-implement/goal-author.ts +407 -21
- package/src/self-implement/goal-doc/section.ts +22 -0
- package/src/self-implement/goal-supervisor-fill.ts +110 -27
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +125 -12
- package/src/self-implement/l8-merge-queue.ts +198 -32
- package/src/self-implement/off-diff-evidence.ts +23 -0
- package/src/self-implement/orchestrator.ts +369 -33
- package/src/self-implement/pod-inplace-worktree.ts +82 -0
- package/src/self-implement/pod-warm-pool-profile.ts +2 -2
- package/src/self-implement/premise-review.ts +7 -5
- package/src/self-implement/review-round-brief.ts +300 -0
- package/src/self-implement/rework-policy.ts +14 -0
- package/src/self-implement/run-ledger.ts +428 -6
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/running-runs.ts +17 -3
- package/src/self-implement/seams.ts +45 -16
- package/src/self-implement/self-implement-cli.ts +26 -2
- package/src/self-implement/stop-autoheal.ts +1 -0
- package/src/self-implement/test-seams.ts +13 -1
- package/src/self-implement/train-reach-grouping.ts +8 -2
- package/src/session/channel-ask-op-envelope.ts +36 -0
- package/src/session/channel-op-reply-route.ts +200 -0
- package/src/session/chat.ts +10 -1
- package/src/session/id-prefix.ts +60 -0
- package/src/session/index.ts +6 -0
- package/src/session-runtime/index.ts +18 -23
- package/src/skills/runner.ts +7 -3
- package/src/skills/tools/dev-harness.ts +2 -2
- package/src/skills/tools/pty.ts +5 -0
- package/src/skills/tools/schedule-wakeup.ts +1 -6
- package/src/status/bar.ts +3 -3
- package/src/status/metrics.ts +12 -1
- package/src/steward/rejudge-tick.ts +12 -5
- package/src/steward/resync-tick.ts +31 -4
- package/src/storage/file-lock.ts +17 -4
- package/src/task-agent/actions.ts +199 -4
- package/src/task-agent/adopt-pr.ts +63 -2
- package/src/task-agent/boundary-proof-mapping.ts +12 -0
- package/src/task-agent/boundary-proof-producer.ts +147 -0
- package/src/task-agent/completion-evidence.ts +2 -1
- package/src/task-agent/evidence-command-normalize.ts +42 -0
- package/src/task-agent/export-redactions-provision.ts +43 -0
- package/src/task-agent/green-close-recipe.ts +239 -0
- package/src/task-agent/green-sweep.ts +64 -10
- package/src/task-agent/live-moves.ts +48 -3
- package/src/task-agent/map-host-adapter.ts +134 -0
- package/src/task-agent/map-reduce.ts +158 -0
- package/src/task-agent/map-run-ledger.ts +226 -0
- package/src/task-agent/parent-host.ts +74 -17
- package/src/task-agent/rejudge-on-head.ts +72 -5
- package/src/task-agent/repair-cycle.ts +108 -8
- package/src/task-agent/repair-next-move.ts +12 -2
- package/src/task-agent/repair-worker.ts +37 -1
- package/src/task-agent/review-prior-fix.ts +12 -2
- package/src/task-agent/shadow.ts +188 -5
- package/src/task-agent/task-hand.ts +253 -20
- package/src/task-agent/task-parent-role-llm.ts +9 -0
- package/src/task-agent/tier-split.ts +40 -5
- package/src/task-agent/work-order.ts +53 -2
- package/src/task-orchestrator/dispatcher.ts +46 -1
- package/src/task-orchestrator/generator-prompt.ts +6 -0
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +77 -8
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
- package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
- package/src/terminal/session-registry.ts +1 -0
- package/src/terminal/terminal-modal-router.ts +156 -0
- package/src/testing/linux-env.ts +177 -0
- package/src/tool-hints/gate.ts +6 -4
- package/src/tool-hints/signals.ts +33 -1
- package/src/tui/chat/background-job-status.ts +8 -2
- package/src/tui/chat/goal-interim.ts +5 -1
- package/src/tui/entry.ts +722 -30
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/sidetab/attach.ts +304 -0
- package/src/tui/sidetab/list.ts +176 -0
- package/src/tui/sidetab/nl-tool.ts +136 -0
- package/src/tui/slash/resume-command.ts +23 -0
- package/src/tui/slash/resume.ts +38 -35
- package/src/tui/slash/signals.ts +114 -0
- package/src/tui/slash/term-next.ts +72 -0
- package/src/tui-client/local-chat-turn.ts +31 -9
- package/src/user-config.ts +30 -3
- package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
- package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
- package/src/ux-sim/fake-gh.ts +174 -0
- package/src/ux-sim/fake-kubectl.ts +142 -0
- package/src/ux-sim/fake-llm.ts +17 -6
- package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
- package/src/ux-sim/resume-picker-device.ts +173 -0
- package/src/ux-sim/session-id-seed.ts +60 -0
- package/src/ux-sim/skills-tools-shell-device.ts +156 -0
- package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
- package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
- package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
- package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
- package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
- package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
- package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
- package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
- package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
- package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
- package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
- package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
- package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
- package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
- package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
- package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
- package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
- package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
- package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
- package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
- package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
- package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
- package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
- package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
- package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
- package/scripts/migrate-monad-to-elanous.ts +0 -195
- package/scripts/rebrand-elanous.ts +0 -242
- /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
|
@@ -58,6 +58,8 @@ 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
60
|
import { identityLines, repositoryIdentifiers } from './goal-author-identity.js';
|
|
61
|
+
import { selectRelevantAuthoringLessons } from './knowhow-pack.js';
|
|
62
|
+
export { selectRelevantAuthoringLessons } from './knowhow-pack.js';
|
|
61
63
|
export { formatSubmittedAt } from './goal-author-identity.js';
|
|
62
64
|
import { hasUnmetRequirementOutsidePreservationClause } from './goal-author-preservation-obligation.js';
|
|
63
65
|
export { hasUnmetRequirementOutsidePreservationClause } from './goal-author-preservation-obligation.js';
|
|
@@ -119,6 +121,12 @@ export interface GoalAuthorDeps {
|
|
|
119
121
|
launchPreflight?: LaunchPreflightResult;
|
|
120
122
|
/** Optional in-process notification for each authored-goal phase transition. */
|
|
121
123
|
onProgress?: (phase: GoalAuthorPhase, event: 'start' | 'end') => void;
|
|
124
|
+
/** AUTHOR-TIMEBOX: budget for the `ground` phase. Omitted means `GOAL_AUTHOR_GROUND_TIMEBOX_MS`. */
|
|
125
|
+
groundTimeboxMs?: number;
|
|
126
|
+
/** Stable IDs of bounded lessons carried as goal-head provenance. */
|
|
127
|
+
authoringLessonIds?: readonly string[];
|
|
128
|
+
/** Bounded prior lessons rendered as explicitly non-normative authoring context. */
|
|
129
|
+
authoringLessons?: string;
|
|
122
130
|
}
|
|
123
131
|
|
|
124
132
|
export type GoalAuthorGroundingPath = 'groundMissionInCodebase';
|
|
@@ -164,10 +172,12 @@ export interface GoalAuthorPersistentGroundingDecision {
|
|
|
164
172
|
* ⛔ 경로 «배열»을 남기지 않는다: 이 저장소의 debug.log 는 배열을 6에서 잘라 `{_more:N}` 을
|
|
165
173
|
* 붙이므로 ***분모가 깨진다***. 히스토그램은 안 잘리고 「무슨 종류를 봤나」에 그대로 답한다. */
|
|
166
174
|
readonly fileKinds?: Readonly<Record<string, number>>;
|
|
175
|
+
/** AUTHOR-TIMEBOX: 접지가 «던진» 것이 아니라 «예산 초과»로 끊겼다 — `groundingError` 와 다른 축이다. */
|
|
176
|
+
readonly timeboxExceeded?: boolean;
|
|
167
177
|
}
|
|
168
178
|
|
|
169
179
|
type GoalAuthorPersistentGroundingMetrics = Pick<GoalAuthorPersistentGroundingDecision,
|
|
170
|
-
'authorRunId' | 'grounded' | 'groundingError' | 'fileCount' | 'persistentEvidenceCount' | 'contextChars' | 'persistentStopReason' | 'codeChannel' | 'fileKinds'
|
|
180
|
+
'authorRunId' | 'grounded' | 'groundingError' | 'fileCount' | 'persistentEvidenceCount' | 'contextChars' | 'persistentStopReason' | 'codeChannel' | 'fileKinds' | 'timeboxExceeded'
|
|
171
181
|
>;
|
|
172
182
|
|
|
173
183
|
type GoalAuthorPersistentGroundingConfigReader = () => boolean | undefined;
|
|
@@ -211,11 +221,13 @@ function goalAuthorPersistentGroundingMetrics(
|
|
|
211
221
|
facts: CodebaseGrounding | null,
|
|
212
222
|
groundingError: boolean,
|
|
213
223
|
authorRunId: string,
|
|
224
|
+
timeboxExceeded = false,
|
|
214
225
|
): GoalAuthorPersistentGroundingMetrics {
|
|
215
226
|
return {
|
|
216
227
|
authorRunId,
|
|
217
228
|
grounded: facts?.grounded ?? false,
|
|
218
229
|
groundingError,
|
|
230
|
+
...(timeboxExceeded ? { timeboxExceeded: true } : {}),
|
|
219
231
|
fileCount: facts?.files.length ?? 0,
|
|
220
232
|
fileKinds: summarizeGroundingFileKinds(facts?.files ?? []),
|
|
221
233
|
persistentEvidenceCount: facts?.persistentEvidence?.length ?? 0,
|
|
@@ -259,6 +271,14 @@ const MAX_COLLISION_RETRIES = 50;
|
|
|
259
271
|
const SUPERSESSION_LOCK_STALE_MS = 30_000;
|
|
260
272
|
const GOAL_AUTHOR_HELP_PROBE_TIMEOUT_MS = 3_000;
|
|
261
273
|
const GOAL_AUTHOR_HELP_PROBE_STDERR_MAX_CHARS = 4_000;
|
|
274
|
+
/**
|
|
275
|
+
* ⭐ AUTHOR-TIMEBOX — 접지(`ground`) 단계의 기본 시간 한도.
|
|
276
|
+
*
|
|
277
|
+
* 🩸 실측(2026-10-21): 접지 헛돌기(`grounding.search` 1,584행)가 저작 전체를 80분 붙잡았고,
|
|
278
|
+
* 그렇게 죽은 런은 «결과 줄»을 하나도 안 남겨 상위 디스패처가 성공으로도 실패로도 판정하지 못했다.
|
|
279
|
+
* ⇒ 한도를 넘기면 접지 결과를 «기다리지 않고» 끊고 NOT-GROUNDED 로 끝낸다 — 문서·관측·결과 줄 셋 다.
|
|
280
|
+
*/
|
|
281
|
+
export const GOAL_AUTHOR_GROUND_TIMEBOX_MS = 15 * 60_000;
|
|
262
282
|
export const EVIDENCE_LOCATION_REQUIREMENT = 'For every acceptance criterion, state where evidence that it was met appears in the diff or which line of the report shows it. Evidence visible only on an execution screen and left in neither the diff nor the report is not evidence.';
|
|
263
283
|
export const REQUIRED_BLOCKS = ['## PROBLEM', '## WHAT TO BUILD', '## ACCEPTANCE CRITERIA', '## REQUIRED EVIDENCE', '## TRACED PATHS', '## SCOPE BOUNDARY', '## 답하지 못하는 것', '## 불변식', '## 판정 신호'] as const;
|
|
264
284
|
export const ERROR_REQUIRED_BLOCKS = new Set<string>(['## PROBLEM', '## ACCEPTANCE CRITERIA', '## REQUIRED EVIDENCE']);
|
|
@@ -487,7 +507,7 @@ export function linesOutsideFencedCode(document: string): GoalDocSourceLine[] {
|
|
|
487
507
|
return outside;
|
|
488
508
|
}
|
|
489
509
|
|
|
490
|
-
/** TA 완료 경계는
|
|
510
|
+
/** TA 완료 경계는 정식 절 안의 세 독립 행이다. 명시 행은 보존하고 누락 행은 태스크 넘김이 범위 기반 초안으로 보충한다. */
|
|
491
511
|
export const GOAL_DONE_BOUNDARY_LABELS = ['완료 경계 코드', '완료 경계 실물', '완료 경계 증거 명령'] as const;
|
|
492
512
|
export type GoalDoneBoundaryLabel = typeof GOAL_DONE_BOUNDARY_LABELS[number];
|
|
493
513
|
// This is a declaration check, not a judgement of whether the proposed work
|
|
@@ -511,12 +531,51 @@ const GOAL_DONE_UNSUPPORTED_SHELL_OPERATOR = /&&|\|\||[;|><`]|\$\(/;
|
|
|
511
531
|
// Only the narrow, concrete file predicates are accepted for `test`; the
|
|
512
532
|
// predicate also needs its operand, so `test -f` cannot claim proof.
|
|
513
533
|
const GOAL_DONE_SHELL_TEST_ARGS = /^-(?:f|e)\s+\S+(?:\s|$)/;
|
|
534
|
+
const GOAL_DONE_EVIDENCE_OPERATOR_ERROR = '증거 명령에 셸 연산자 — 명령 한 줄만';
|
|
535
|
+
const GOAL_DONE_EVIDENCE_SYNTAX_ERROR = '증거 명령 형식이 아님 — 실행 파일과 인자 필요';
|
|
536
|
+
|
|
537
|
+
function firstGoalDoneShellOperator(value: string): { index: number; token: string } | 'unsafe' | undefined {
|
|
538
|
+
let quote: "'" | '"' | undefined;
|
|
539
|
+
for (let index = 0; index < value.length; index++) {
|
|
540
|
+
const char = value[index];
|
|
541
|
+
if (char === '\\' && quote !== "'") { index++; continue; }
|
|
542
|
+
if (quote === "'") { if (char === "'") quote = undefined; continue; }
|
|
543
|
+
if (quote === '"') {
|
|
544
|
+
if (char === '"') quote = undefined;
|
|
545
|
+
else if (char === '`' || (char === '$' && value[index + 1] === '(')) return 'unsafe';
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
if (char === "'" || char === '"') { quote = char; continue; }
|
|
549
|
+
if (char === '`' || (char === '$' && value[index + 1] === '(')) return 'unsafe';
|
|
550
|
+
const pair = value.slice(index, index + 2);
|
|
551
|
+
if (pair === '&&' || pair === '||') return { index, token: pair };
|
|
552
|
+
if (char === ';' || char === '&' || char === '|' || char === '>' || char === '<') return { index, token: char };
|
|
553
|
+
}
|
|
554
|
+
return quote ? 'unsafe' : undefined;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/** Prepare one command for future checklist/hand wiring. This slice does not change their current admission rules. */
|
|
558
|
+
export function validateGoalDoneEvidenceCommand(value: string): { command?: string; error?: string } {
|
|
559
|
+
const raw = value.trim();
|
|
560
|
+
// A quote at each end does not necessarily wrap the whole command:
|
|
561
|
+
// `"bun test" ; "x"` has an operator between two separately quoted words.
|
|
562
|
+
if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
|
|
563
|
+
if (firstGoalDoneShellOperator(raw) !== undefined) return { error: GOAL_DONE_EVIDENCE_OPERATOR_ERROR };
|
|
564
|
+
}
|
|
565
|
+
const text = unwrapGoalDoneValue(value);
|
|
566
|
+
const operator = firstGoalDoneShellOperator(text);
|
|
567
|
+
if (operator !== undefined || /[\r\n]/u.test(text)) return { error: GOAL_DONE_EVIDENCE_OPERATOR_ERROR };
|
|
568
|
+
const command = text.trim();
|
|
569
|
+
const match = GOAL_DONE_EVIDENCE_COMMAND.exec(command);
|
|
570
|
+
const args = match?.[2]?.trim() ?? '';
|
|
571
|
+
if (!match || !args || (match[1] === 'test' && !GOAL_DONE_SHELL_TEST_ARGS.test(args)))
|
|
572
|
+
return { error: GOAL_DONE_EVIDENCE_SYNTAX_ERROR };
|
|
573
|
+
return { command };
|
|
574
|
+
}
|
|
514
575
|
|
|
515
576
|
function isGoalDoneEvidenceCommand(value: string): boolean {
|
|
516
577
|
if (GOAL_DONE_UNSUPPORTED_SHELL_OPERATOR.test(value)) return false;
|
|
517
|
-
|
|
518
|
-
const args = match?.[2]?.trim() ?? '';
|
|
519
|
-
return !!match && args.length > 0 && (match[1] !== 'test' || GOAL_DONE_SHELL_TEST_ARGS.test(args));
|
|
578
|
+
return validateGoalDoneEvidenceCommand(value).command !== undefined;
|
|
520
579
|
}
|
|
521
580
|
|
|
522
581
|
function unwrapGoalDoneValue(value: string): string {
|
|
@@ -550,6 +609,39 @@ export function explicitGoalDoneBoundaryLines(ask: string): string[] {
|
|
|
550
609
|
return GOAL_DONE_BOUNDARY_LABELS.flatMap((label) => values[label] ? [`- ${label}: ${values[label]}`] : []);
|
|
551
610
|
}
|
|
552
611
|
|
|
612
|
+
/**
|
|
613
|
+
* A live hand must not silently drop a cell just because its prose omitted the three
|
|
614
|
+
* completion lines. Preserve explicit values and draft only the missing lines from
|
|
615
|
+
* declared target paths; the child can refine this visible draft against the ask.
|
|
616
|
+
*/
|
|
617
|
+
export function draftMissingGoalDoneBoundary(document: string, targetPaths: readonly string[]): {
|
|
618
|
+
document: string;
|
|
619
|
+
added: GoalDoneBoundaryLabel[];
|
|
620
|
+
} {
|
|
621
|
+
const { values, missing } = inspectGoalDoneBoundary(document);
|
|
622
|
+
if (missing.length === 0) return { document, added: [] };
|
|
623
|
+
|
|
624
|
+
const scope = targetPaths.length > 0 ? targetPaths.join(' · ') : '요청 문면에 적힌 범위';
|
|
625
|
+
const explicitTests = targetPaths.filter((path) => /\.(?:test|spec)\.[cm]?[jt]sx?$/i.test(path));
|
|
626
|
+
const inferredTests = targetPaths.flatMap((path) => {
|
|
627
|
+
const match = /^(.*)\.([cm]?[jt]sx?)$/i.exec(path);
|
|
628
|
+
return match && !/\.(?:test|spec)$/i.test(match[1]!) ? [`${match[1]}.test.${match[2]}`] : [];
|
|
629
|
+
});
|
|
630
|
+
const evidencePaths = explicitTests.length > 0 ? explicitTests : inferredTests;
|
|
631
|
+
const quotePath = (path: string): string => /^[A-Za-z0-9_./:=@%+-]+$/.test(path) ? path : `'${path.replaceAll("'", `'\\''`)}'`;
|
|
632
|
+
const evidenceCommand = evidencePaths.length > 0
|
|
633
|
+
? `bun test ${evidencePaths.map(quotePath).join(' ')}`
|
|
634
|
+
: 'bun test';
|
|
635
|
+
const drafts: Record<GoalDoneBoundaryLabel, string> = {
|
|
636
|
+
'완료 경계 코드': `자동 초안: ${scope}에 문면의 요청 동작을 구현하고 대상 밖의 기본 동작은 보존한다.`,
|
|
637
|
+
'완료 경계 실물': `자동 초안: 격리 시험에서 ${scope}의 생산 경로를 지나 요청 동작과 기존 동작을 함께 관측한다.`,
|
|
638
|
+
'완료 경계 증거 명령': evidenceCommand,
|
|
639
|
+
};
|
|
640
|
+
const lines = missing.map((label) => `- ${label}: ${drafts[label]}`);
|
|
641
|
+
const separator = document.length === 0 || document.endsWith('\n') ? '' : '\n';
|
|
642
|
+
return { document: `${document}${separator}${lines.join('\n')}`, added: missing };
|
|
643
|
+
}
|
|
644
|
+
|
|
553
645
|
// CommonMark 펜스는 **한 종류의 문자**가 3개 이상 이어진 런이다 — `[`~]{3,}` 는 혼합(백틱+틸드)까지
|
|
554
646
|
// 펜스로 인정해 진짜 진양성을 펜스 안으로 숨긴다(리뷰 must-fix). 열기/닫기 모두 이 하나를 쓴다.
|
|
555
647
|
const FENCE_RUN = /^ {0,3}(`{3,}|~{3,})(.*)$/;
|
|
@@ -1438,6 +1530,57 @@ export function classifyGroundingFailure(input: GroundingFailureClassificationIn
|
|
|
1438
1530
|
return { root: 'undifferentiated', prescription: legacyPrescription };
|
|
1439
1531
|
}
|
|
1440
1532
|
|
|
1533
|
+
/**
|
|
1534
|
+
* ⭐ GROUNDING-PERSISTENT-EMPTY-REPAIR 4/7 — 빈 근거 분류. persistent 채널(Read-검증 근거)이 비어
|
|
1535
|
+
* 있을 때 그 사유를 구조화해 남긴다. 분기 우선순위: 선언된 대상 경로가 저장소 파일도 명시적 신설도
|
|
1536
|
+
* 아니면 `absent-path`, 그렇지 않으면서 접지가 저장소 파일을 Read 했으면 `read-mismatch`
|
|
1537
|
+
* (K-UX-15 — 근거 줄에 Read 하지 않은 경로가 섞이면 줄 전체가 기각된다), 둘 다 아니면 `undifferentiated`.
|
|
1538
|
+
* 채널이 비어 있지 않으면(≥1 항목) 분류가 아예 일어나지 않는다.
|
|
1539
|
+
*/
|
|
1540
|
+
export type GoalAuthorEmptyEvidenceReason = 'read-mismatch' | 'absent-path' | 'undifferentiated';
|
|
1541
|
+
|
|
1542
|
+
export interface GoalAuthorEmptyEvidenceClassificationInput {
|
|
1543
|
+
/** persistent 채널(Read-검증 근거)의 항목 수 — 0일 때만 분류가 일어난다. */
|
|
1544
|
+
readonly persistentEvidenceCount: number;
|
|
1545
|
+
/** 접지가 실제로 Read 한 저장소 파일 수. */
|
|
1546
|
+
readonly readFilesCount: number;
|
|
1547
|
+
/** TRACED PATHS 에서 저장소 파일·명시적 신설로 확인되지 않은 선언 대상 경로 수. */
|
|
1548
|
+
readonly unresolvedTargetCount: number;
|
|
1549
|
+
/** 문서에 조립된 TRACED PATHS 의 최종 추적 항목 수(미해석 행 제외). */
|
|
1550
|
+
readonly finalTracedCount: number;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
export interface GoalAuthorEmptyEvidenceClassification {
|
|
1554
|
+
readonly reason: GoalAuthorEmptyEvidenceReason;
|
|
1555
|
+
readonly reasonLabel: string;
|
|
1556
|
+
readonly finalTracedCount: number;
|
|
1557
|
+
/** 채널이 비어 있으므로 최종 추적 항목은 오직 ask 선언 대상 경로에서 왔다; 없으면 'none'. */
|
|
1558
|
+
readonly source: 'ask-declared-targets' | 'none';
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
const EMPTY_EVIDENCE_REASON_LABELS: Record<GoalAuthorEmptyEvidenceReason, string> = {
|
|
1562
|
+
'read-mismatch': 'empty-evidence:read-mismatch — grounding Read repository files, yet the persistent channel is empty: every evidence line cited at least one path grounding did not Read, so the whole line was rejected (notRead).',
|
|
1563
|
+
'absent-path': 'empty-evidence:absent-path — the ask-declared target path is neither a repository file nor an explicitly declared new file, so the evidence it needs could not be Read at all.',
|
|
1564
|
+
'undifferentiated': 'empty-evidence:undifferentiated — the persistent channel is empty and no distinguishing read or absence signal was observed.',
|
|
1565
|
+
};
|
|
1566
|
+
|
|
1567
|
+
export function classifyEmptyPersistentEvidence(
|
|
1568
|
+
input: GoalAuthorEmptyEvidenceClassificationInput,
|
|
1569
|
+
): GoalAuthorEmptyEvidenceClassification | null {
|
|
1570
|
+
if (input.persistentEvidenceCount > 0) return null;
|
|
1571
|
+
const reason: GoalAuthorEmptyEvidenceReason = input.unresolvedTargetCount > 0
|
|
1572
|
+
? 'absent-path'
|
|
1573
|
+
: input.readFilesCount > 0
|
|
1574
|
+
? 'read-mismatch'
|
|
1575
|
+
: 'undifferentiated';
|
|
1576
|
+
return {
|
|
1577
|
+
reason,
|
|
1578
|
+
reasonLabel: EMPTY_EVIDENCE_REASON_LABELS[reason],
|
|
1579
|
+
finalTracedCount: input.finalTracedCount,
|
|
1580
|
+
source: input.finalTracedCount > 0 ? 'ask-declared-targets' : 'none',
|
|
1581
|
+
};
|
|
1582
|
+
}
|
|
1583
|
+
|
|
1441
1584
|
function isTracedPathsEvidenceUnavailable(entry: string): boolean {
|
|
1442
1585
|
return entry === TRACED_PATHS_EVIDENCE_UNAVAILABLE || TRACED_PATHS_PERSISTENT_CHANNEL_UNAVAILABLE.test(entry);
|
|
1443
1586
|
}
|
|
@@ -2331,6 +2474,67 @@ export interface AuthoredGoal {
|
|
|
2331
2474
|
facts: CodebaseGrounding | null;
|
|
2332
2475
|
grounded: boolean;
|
|
2333
2476
|
authorRunId: string;
|
|
2477
|
+
/** AUTHOR-TIMEBOX: present only when the `ground` phase was short-circuited for exceeding its budget. */
|
|
2478
|
+
groundingTimebox?: GoalAuthorGroundingTimebox;
|
|
2479
|
+
}
|
|
2480
|
+
|
|
2481
|
+
/** AUTHOR-TIMEBOX 산출 — 예산과 실제 경과. 둘 다 «잰 값»이고 지어낸 값이 아니다. */
|
|
2482
|
+
export interface GoalAuthorGroundingTimebox {
|
|
2483
|
+
readonly budgetMs: number;
|
|
2484
|
+
readonly elapsedMs: number;
|
|
2485
|
+
}
|
|
2486
|
+
|
|
2487
|
+
type GoalAuthorGroundOutcome =
|
|
2488
|
+
| { readonly facts: CodebaseGrounding }
|
|
2489
|
+
| { readonly timebox: GoalAuthorGroundingTimebox };
|
|
2490
|
+
|
|
2491
|
+
/**
|
|
2492
|
+
* ⭐ AUTHOR-TIMEBOX — 주입된 접지 promise 는 «취소»할 수 없다(그것은 호출자의 seam 이다).
|
|
2493
|
+
* 그래서 여기서는 예산이 지나면 그 결과를 «안 쓰고» 끊는다 — 기다리지 않는 것이 요구다.
|
|
2494
|
+
* ⛔ 늦게 끝난 접지의 거절이 unhandled rejection 이 되어 런을 죽이면 안 된다 → 핸들러를 미리 붙인다.
|
|
2495
|
+
* ⛔ 시작 시각은 «이미 잰» 페이즈 시작값을 받는다 — 여기서 `Date.now()` 를 한 번 더 부르면
|
|
2496
|
+
* 고정 시계를 쓰는 기존 페이즈 시험의 호출 순서가 밀려 «보존 계약»이 깨진다(실측 2026-10-21).
|
|
2497
|
+
*/
|
|
2498
|
+
async function groundWithinTimebox(
|
|
2499
|
+
ground: () => Promise<CodebaseGrounding>,
|
|
2500
|
+
budgetMs: number,
|
|
2501
|
+
startedAt: number,
|
|
2502
|
+
): Promise<GoalAuthorGroundOutcome> {
|
|
2503
|
+
const expired = Symbol('goal-author-ground-timebox');
|
|
2504
|
+
const groundPromise = ground();
|
|
2505
|
+
groundPromise.catch(() => undefined);
|
|
2506
|
+
let handle: ReturnType<typeof setTimeout> | undefined;
|
|
2507
|
+
const timer = new Promise<typeof expired>((resolve) => {
|
|
2508
|
+
handle = setTimeout(() => resolve(expired), budgetMs);
|
|
2509
|
+
});
|
|
2510
|
+
try {
|
|
2511
|
+
const result = await Promise.race([groundPromise, timer]);
|
|
2512
|
+
return result === expired
|
|
2513
|
+
? { timebox: { budgetMs, elapsedMs: Date.now() - startedAt } }
|
|
2514
|
+
: { facts: result };
|
|
2515
|
+
} finally {
|
|
2516
|
+
clearTimeout(handle);
|
|
2517
|
+
}
|
|
2518
|
+
}
|
|
2519
|
+
|
|
2520
|
+
/** 접지 시간 한도가 걸렸다는 것을 골 문서 «안»에 남기는 줄 머리 — 발사 흐름이 이것으로 결과 줄을 쓴다. */
|
|
2521
|
+
export const GROUNDING_TIMEBOX_NOTICE_PREFIX = '- Grounding timebox:';
|
|
2522
|
+
|
|
2523
|
+
function groundingTimeboxNotice(timebox: GoalAuthorGroundingTimebox): string {
|
|
2524
|
+
return `${GROUNDING_TIMEBOX_NOTICE_PREFIX} the ${timebox.budgetMs}ms budget was exceeded after ${timebox.elapsedMs}ms — grounding was stopped and this goal is NOT-GROUNDED.`;
|
|
2525
|
+
}
|
|
2526
|
+
|
|
2527
|
+
/** 저작된 골 문서만 보고 «접지가 예산 초과로 끊겼나»를 읽는다 — 없으면 `null`(추정하지 않는다). */
|
|
2528
|
+
export function readGoalAuthorGroundingTimebox(document: string): GoalAuthorGroundingTimebox | null {
|
|
2529
|
+
const problem = markdownSection(document, 'PROBLEM');
|
|
2530
|
+
if (problem === null) return null;
|
|
2531
|
+
for (const line of problem.split(/\r?\n/)) {
|
|
2532
|
+
if (!line.startsWith(GROUNDING_TIMEBOX_NOTICE_PREFIX)) continue;
|
|
2533
|
+
const match = /(\d+)ms budget (?:was )?exceeded after (\d+)ms/.exec(line);
|
|
2534
|
+
if (!match) continue;
|
|
2535
|
+
return { budgetMs: Number(match[1]), elapsedMs: Number(match[2]) };
|
|
2536
|
+
}
|
|
2537
|
+
return null;
|
|
2334
2538
|
}
|
|
2335
2539
|
|
|
2336
2540
|
export interface GoalFileDeps {
|
|
@@ -2437,7 +2641,42 @@ function observePersistentEvidenceSourceKinds(facts: CodebaseGrounding | null, a
|
|
|
2437
2641
|
observeGoalAuthor('goal-author', 'persistent-grounding-evidence-source-count', { authorRunId, counts });
|
|
2438
2642
|
}
|
|
2439
2643
|
|
|
2440
|
-
|
|
2644
|
+
type TracedPathLedgerEvent = { event: string; data: Record<string, unknown> };
|
|
2645
|
+
|
|
2646
|
+
// ⭐ GROUNDING-PERSISTENT-EMPTY-REPAIR 4/7 — tracedPathsSection 이 내는 «선언 대상 미확인» 미해석 행의
|
|
2647
|
+
// 접미어(저장소 파일·명시적 신설 확인 불가) — 파싱 실패·경로 없는 근거 미해석 행과 구분하는 판별자다.
|
|
2648
|
+
const UNRESOLVED_DECLARED_TARGET_SUFFIX = ' — 요청에 선언된 대상 경로를 저장소 파일 또는 명시적 신설 파일로 확인하지 못함';
|
|
2649
|
+
|
|
2650
|
+
function isUnresolvedDeclaredTargetEntry(line: string): boolean {
|
|
2651
|
+
return line.includes('미해석: ') && line.endsWith(UNRESOLVED_DECLARED_TARGET_SUFFIX);
|
|
2652
|
+
}
|
|
2653
|
+
|
|
2654
|
+
function isTracedPathEntry(line: string): boolean {
|
|
2655
|
+
return /^\d+\. /.test(line) && !line.includes('미해석: ');
|
|
2656
|
+
}
|
|
2657
|
+
|
|
2658
|
+
/**
|
|
2659
|
+
* ⭐ GROUNDING-PERSISTENT-EMPTY-REPAIR 4/7 — 최종 TRACED PATHS 행이 확정된 뒤, persistent 채널이
|
|
2660
|
+
* 비어 있으면 구조화 사유·final traced count·출처를 관측 원장에 남긴다(launch-preflight 소비).
|
|
2661
|
+
* facts 가 없으면(lite 골) 기록하지 않고, 관측은 fail-soft 로 저작 자체를 멈추지 않는다.
|
|
2662
|
+
*/
|
|
2663
|
+
function observeEmptyPersistentEvidence(facts: CodebaseGrounding | null, tracedPathsLines: readonly string[], authorRunId: string): void {
|
|
2664
|
+
if (facts === null) return;
|
|
2665
|
+
const classification = classifyEmptyPersistentEvidence({
|
|
2666
|
+
persistentEvidenceCount: persistentEvidenceItems(facts).length,
|
|
2667
|
+
readFilesCount: facts.files.length,
|
|
2668
|
+
unresolvedTargetCount: tracedPathsLines.filter(isUnresolvedDeclaredTargetEntry).length,
|
|
2669
|
+
finalTracedCount: tracedPathsLines.filter(isTracedPathEntry).length,
|
|
2670
|
+
});
|
|
2671
|
+
if (classification === null) return;
|
|
2672
|
+
try {
|
|
2673
|
+
observeGoalAuthor('goal-author', 'persistent-grounding-empty-evidence', { authorRunId, ...classification });
|
|
2674
|
+
} catch {
|
|
2675
|
+
// 관측 채널 고장이 골 저작을 멈추게 하지 않는다(관측은 fail-soft).
|
|
2676
|
+
}
|
|
2677
|
+
}
|
|
2678
|
+
|
|
2679
|
+
function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, repositoryRoot: string | undefined, unavailableEvidence: string, authorRunId?: string, record?: (entry: TracedPathLedgerEvent) => void): string[] {
|
|
2441
2680
|
const evidence = persistentEvidenceItems(facts);
|
|
2442
2681
|
// Without a repository root we cannot verify paths. Keep the established
|
|
2443
2682
|
// rendering contract for callers that do not supply one.
|
|
@@ -2459,15 +2698,23 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
|
|
|
2459
2698
|
const targetLabels = linesOutsideFencedCode(ask)
|
|
2460
2699
|
.map(({ text }) => /^대상 경로:\s*(.*)$/.exec(text.trim())?.[1])
|
|
2461
2700
|
.filter((value): value is string => value !== undefined);
|
|
2701
|
+
const pathWithSpaces = (piece: string): string | null => {
|
|
2702
|
+
const path = piece.trim().replace(/^`|`$/g, '');
|
|
2703
|
+
if (!path.includes(' ') || !path.includes('/') || !/\.[a-z0-9]+$/i.test(path) || isAbsolute(path)
|
|
2704
|
+
|| path.split('/').some((part) => part === '.' || part === '..')) return null;
|
|
2705
|
+
if (path.split(/\s+/).slice(1).some((part) => part.includes('/'))) return null;
|
|
2706
|
+
return path;
|
|
2707
|
+
};
|
|
2462
2708
|
const unresolvedTargetPieces = targetLabels.flatMap((label) => label.split(/\s+[·,]\s*|[·,]\s+/))
|
|
2463
2709
|
.flatMap((piece) => {
|
|
2710
|
+
if (pathWithSpaces(piece)) return [];
|
|
2464
2711
|
const tokens = piece.trim().split(/\s+/).filter(Boolean);
|
|
2465
2712
|
return tokens.length === 0
|
|
2466
2713
|
? ['(빈 대상 경로)']
|
|
2467
2714
|
: tokens.filter((token) => targetPathsInLabelPiece(token).length === 0
|
|
2468
2715
|
&& classifyTracedPathToken(token, repositoryRoot).kind !== 'repository-root');
|
|
2469
2716
|
});
|
|
2470
|
-
const labeledTargets = declaredTargetPaths(ask);
|
|
2717
|
+
const labeledTargets = [...declaredTargetPaths(ask), ...targetLabels.flatMap((label) => label.split(/\s+[·,]\s*|[·,]\s+/).flatMap((piece) => pathWithSpaces(piece) ?? []))];
|
|
2471
2718
|
const labeledRootFiles = targetLabels.flatMap((label) => label.split(/\s+[·,]\s*|[·,]\s+/))
|
|
2472
2719
|
.flatMap((piece) => piece.trim().split(/\s+/).filter(Boolean))
|
|
2473
2720
|
.flatMap((token) => {
|
|
@@ -2497,10 +2744,75 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
|
|
|
2497
2744
|
return isSameOrNestedPath(real, root) && lstatSync(real).isFile();
|
|
2498
2745
|
} catch { return false; }
|
|
2499
2746
|
};
|
|
2747
|
+
const ambiguousPaths = new Set<string>();
|
|
2748
|
+
const correctedPaths = new Set<string>();
|
|
2749
|
+
const candidateFiles = new Map<string, string[]>();
|
|
2750
|
+
const filesIn = (directory: string): string[] => {
|
|
2751
|
+
const cached = candidateFiles.get(directory);
|
|
2752
|
+
if (cached) return cached;
|
|
2753
|
+
let entries: string[] = [];
|
|
2754
|
+
try {
|
|
2755
|
+
if (root !== null) {
|
|
2756
|
+
const realDirectory = realpathSync(resolve(root, directory));
|
|
2757
|
+
if (isSameOrNestedPath(realDirectory, root)) {
|
|
2758
|
+
entries = readdirSync(realDirectory, { withFileTypes: true })
|
|
2759
|
+
.filter((entry) => entry.isFile())
|
|
2760
|
+
.map((entry) => directory ? `${directory}/${entry.name}` : entry.name)
|
|
2761
|
+
.filter((candidate) => valid(candidate, false));
|
|
2762
|
+
}
|
|
2763
|
+
}
|
|
2764
|
+
} catch { /* Missing or outside-repository directories have no candidates. */ }
|
|
2765
|
+
candidateFiles.set(directory, entries);
|
|
2766
|
+
return entries;
|
|
2767
|
+
};
|
|
2768
|
+
const distance = (left: string, right: string): number => {
|
|
2769
|
+
let row = Array.from({ length: right.length + 1 }, (_, index) => index);
|
|
2770
|
+
for (let i = 1; i <= left.length; i += 1) {
|
|
2771
|
+
const next = [i];
|
|
2772
|
+
for (let j = 1; j <= right.length; j += 1) {
|
|
2773
|
+
next[j] = Math.min(next[j - 1]! + 1, row[j]! + 1, row[j - 1]! + Number(left[i - 1] !== right[j - 1]));
|
|
2774
|
+
}
|
|
2775
|
+
row = next;
|
|
2776
|
+
}
|
|
2777
|
+
return row[right.length]!;
|
|
2778
|
+
};
|
|
2779
|
+
const correct = (path: string): string | null => {
|
|
2780
|
+
if (!path.includes('/') || isAbsolute(path) || path.split('/').some((part) => part === '.' || part === '..')) return null;
|
|
2781
|
+
const directory = dirname(path);
|
|
2782
|
+
const name = path.slice(directory.length + 1);
|
|
2783
|
+
const candidates = [...new Set([...filesIn(directory), ...known.filter((candidate) => dirname(candidate) === directory && valid(candidate, false))])];
|
|
2784
|
+
const prefixName = name.includes('*') ? name.slice(0, name.indexOf('*')) : name;
|
|
2785
|
+
const prefix = prefixName.length >= 3
|
|
2786
|
+
? candidates.filter((candidate) => candidate.slice(directory.length + 1).startsWith(prefixName))
|
|
2787
|
+
: [];
|
|
2788
|
+
const near = [...new Set([...prefix, ...candidates.filter((candidate) => {
|
|
2789
|
+
const candidateName = candidate.slice(directory.length + 1);
|
|
2790
|
+
const limit = name.length >= 6 ? 2 : 1;
|
|
2791
|
+
return !name.includes('*') && candidateName.slice(candidateName.lastIndexOf('.')) === name.slice(name.lastIndexOf('.'))
|
|
2792
|
+
&& distance(name, candidateName) <= limit;
|
|
2793
|
+
})])];
|
|
2794
|
+
if (near.length === 1) return near[0]!;
|
|
2795
|
+
if (near.length > 1 && !ambiguousPaths.has(path)) {
|
|
2796
|
+
ambiguousPaths.add(path);
|
|
2797
|
+
const message = `[goal-author] traced path warning: ambiguous ${path} — ${near.join(', ')}; skipped`;
|
|
2798
|
+
process.stderr.write(`${message}\n`);
|
|
2799
|
+
try { observeGoalAuthor('goal-author', 'traced-path-warning', { authorRunId, path, candidates: near, action: 'skipped' }); } catch { /* observation is fail-soft */ }
|
|
2800
|
+
record?.({ event: 'traced-path-warning', data: { authorRunId, path, candidates: near, action: 'skipped' } });
|
|
2801
|
+
}
|
|
2802
|
+
return null;
|
|
2803
|
+
};
|
|
2500
2804
|
const resolvePath = (path: string, declaredTarget = false): string | null => {
|
|
2501
|
-
if (declaredTarget
|
|
2805
|
+
if (declaredTarget && valid(path, true)) return path;
|
|
2502
2806
|
if (path.includes('/') && valid(path, true)) return path;
|
|
2503
|
-
if (path.includes('/'))
|
|
2807
|
+
if (path.includes('/')) {
|
|
2808
|
+
const corrected = correct(path);
|
|
2809
|
+
if (corrected && !correctedPaths.has(path)) {
|
|
2810
|
+
correctedPaths.add(path);
|
|
2811
|
+
try { observeGoalAuthor('goal-author', 'traced-path-correction', { authorRunId, from: path, to: corrected }); } catch { /* observation is fail-soft */ }
|
|
2812
|
+
record?.({ event: 'traced-path-correction', data: { authorRunId, from: path, to: corrected } });
|
|
2813
|
+
}
|
|
2814
|
+
return corrected;
|
|
2815
|
+
}
|
|
2504
2816
|
const matches = known.filter((candidate) => candidate.endsWith(`/${path}`) && valid(candidate, false));
|
|
2505
2817
|
return matches.length === 1 ? matches[0]! : null;
|
|
2506
2818
|
};
|
|
@@ -2517,7 +2829,7 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
|
|
|
2517
2829
|
for (const path of requestedTargets) {
|
|
2518
2830
|
const resolved = resolvePath(path, true);
|
|
2519
2831
|
if (resolved) addPath(resolved);
|
|
2520
|
-
else paths.push(`${paths.length + 1}. 미해석: ${path} — 요청에 선언된 대상 경로를 저장소 파일 또는 명시적 신설 파일로 확인하지 못함`);
|
|
2832
|
+
else if (!ambiguousPaths.has(path)) paths.push(`${paths.length + 1}. 미해석: ${path} — 요청에 선언된 대상 경로를 저장소 파일 또는 명시적 신설 파일로 확인하지 못함`);
|
|
2521
2833
|
}
|
|
2522
2834
|
for (const piece of unresolvedTargetPieces) {
|
|
2523
2835
|
paths.push(`${paths.length + 1}. 미해석: ${piece} — 요청에 선언된 대상 경로를 파싱하지 못함`);
|
|
@@ -2532,7 +2844,7 @@ function tracedPathsSection(facts: CodebaseGrounding | null, ask: string, reposi
|
|
|
2532
2844
|
referenced.forEach((path, index) => {
|
|
2533
2845
|
const resolved = resolvePath(path);
|
|
2534
2846
|
if (resolved) addPath(resolved, index === 0 ? renderPersistentEvidence(item) : undefined);
|
|
2535
|
-
else paths.push(`${paths.length + 1}. 미해석: ${path} — ${renderPersistentEvidence(item)}`);
|
|
2847
|
+
else if (!ambiguousPaths.has(path)) paths.push(`${paths.length + 1}. 미해석: ${path} — ${renderPersistentEvidence(item)}`);
|
|
2536
2848
|
});
|
|
2537
2849
|
}
|
|
2538
2850
|
if (evidence.length === 0) paths.push(`- ${unavailableEvidence}`);
|
|
@@ -2635,6 +2947,21 @@ const INJECTION_LADDER: Record<InjectionLadderLevel, string> = {
|
|
|
2635
2947
|
const VERIFICATION_MENU_DOC = join('docs', 'goal-context', '03-verification-menu.md');
|
|
2636
2948
|
const MOCK_CATALOG_DOC = join('docs', 'goal-context', '04-mock-scenarios.md');
|
|
2637
2949
|
|
|
2950
|
+
/**
|
|
2951
|
+
* 새 무대의 식별자 — 카탈로그 `MS-xx` 가 없는 골도 «어느 무대인지»를 원장에 남긴다.
|
|
2952
|
+
*
|
|
2953
|
+
* ⛔ 0.2.38 실측(`GOAL-TDD-PLAN-REACHES-CHILD`): 카탈로그가 맞지 않는 골(표본 대부분)에서
|
|
2954
|
+
* `stage.id` 가 `null` 이었고, 그래서 `verification-plan` 이벤트의 `stageId` 칸이 비어
|
|
2955
|
+
* 원장만 보고는 ***「무대가 없었다」와 「무대를 안 적었다」를 가를 수 없었다.***
|
|
2956
|
+
* ⭐ 값은 «실제로 고른 갈래»에서 나온다 — 화면 무대(L2) · 기록된 실제 입력 fixture(L1) · 문서 문구 대조(L1).
|
|
2957
|
+
* ⇒ 같은 골을 두 번 저작하면 같은 id 가 나오고, 다른 갈래는 다른 id 를 갖는다.
|
|
2958
|
+
*/
|
|
2959
|
+
const NEW_STAGE_IDS = {
|
|
2960
|
+
'ux-sim': 'new-stage:ux-sim',
|
|
2961
|
+
fixture: 'new-stage:fixture',
|
|
2962
|
+
'doc-phrase': 'new-stage:doc-phrase',
|
|
2963
|
+
} as const;
|
|
2964
|
+
|
|
2638
2965
|
/** 저장소 안의 검증 메뉴·무대 카탈로그를 읽는다. 없으면 null(저작은 «새 무대»로 내려간다). */
|
|
2639
2966
|
export function readVerificationMenuDocs(root: string | undefined): { menu: string | null; catalog: string | null } {
|
|
2640
2967
|
const read = (relativePath: string): string | null => {
|
|
@@ -2791,7 +3118,7 @@ export function authorVerificationPlan(input: VerificationPlanInput): Verificati
|
|
|
2791
3118
|
: `bun test ${testFile}`;
|
|
2792
3119
|
const base = (input.targetPaths.find((path) => !/\.test\./u.test(path)) ?? testFile).split('/').pop()!.replace(/\.[^.]+$/u, '');
|
|
2793
3120
|
const name = screen ? `${base} ux-sim 고정 입력` : `${base} 기록된 실제 입력 fixture`;
|
|
2794
|
-
stage = { source: 'new-stage', id:
|
|
3121
|
+
stage = { source: 'new-stage', id: screen ? NEW_STAGE_IDS['ux-sim'] : NEW_STAGE_IDS.fixture, level };
|
|
2795
3122
|
stageLine = `- ② 무대: 새 무대: ${name} — \`${command}\` · ${level} (${INJECTION_LADDER[level]})${input.catalog ? ' · 카탈로그(04-mock-scenarios.md)에 맞는 MS 없음' : ' · 카탈로그 문서 없음'}${operationalNote}`;
|
|
2796
3123
|
}
|
|
2797
3124
|
const docOnly = input.targetPaths.length > 0 && input.targetPaths.every((path) => /\.md$/iu.test(path));
|
|
@@ -2800,7 +3127,7 @@ export function authorVerificationPlan(input: VerificationPlanInput): Verificati
|
|
|
2800
3127
|
const docs = input.targetPaths.join(' ');
|
|
2801
3128
|
const phrase = (/`([^`]+)`/u.exec(behaviour)?.[1] ?? behaviour.replace(/[`'"]/gu, '').slice(0, 30)).trim();
|
|
2802
3129
|
const check = `rg -n -F '${phrase.replace(/'/gu, '’')}' ${docs}`;
|
|
2803
|
-
stage = { source: 'new-stage', id:
|
|
3130
|
+
stage = { source: 'new-stage', id: NEW_STAGE_IDS['doc-phrase'], level: 'L1' };
|
|
2804
3131
|
return {
|
|
2805
3132
|
lines: [
|
|
2806
3133
|
VERIFICATION_PLAN_HEADING,
|
|
@@ -5413,7 +5740,7 @@ export async function authorGoal(ask: string, deps: GoalAuthorDeps): Promise<Aut
|
|
|
5413
5740
|
/** Internal-only path: the locked superseded document is the authoritative RootIntent source. */
|
|
5414
5741
|
async function authorGoalWithSupersededRootIntent(
|
|
5415
5742
|
ask: string,
|
|
5416
|
-
deps: GoalAuthorDeps & { supersessionRootIntent?: string; mandatoryGoalContextEvidence?: readonly string[] },
|
|
5743
|
+
deps: GoalAuthorDeps & { supersessionRootIntent?: string; mandatoryGoalContextEvidence?: readonly string[]; recordTracedPath?: (entry: TracedPathLedgerEvent) => void },
|
|
5417
5744
|
): Promise<AuthoredGoal> {
|
|
5418
5745
|
try {
|
|
5419
5746
|
const markerWarnings = formatEarlyMarkerWarnings(ask);
|
|
@@ -5453,18 +5780,32 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5453
5780
|
};
|
|
5454
5781
|
let facts: CodebaseGrounding | null = null;
|
|
5455
5782
|
let groundingError = false;
|
|
5783
|
+
let groundingTimebox: GoalAuthorGroundingTimebox | undefined;
|
|
5456
5784
|
if (!lite) {
|
|
5457
5785
|
const persistentGrounding = resolveGoalAuthorPersistentGrounding('persistentGrounding' in deps ? deps.persistentGrounding : undefined);
|
|
5458
5786
|
const groundStartedAt = startGoalAuthorPhase('ground', authorRunId, deps.onProgress);
|
|
5787
|
+
const timeboxBudgetMs = deps.groundTimeboxMs ?? GOAL_AUTHOR_GROUND_TIMEBOX_MS;
|
|
5459
5788
|
try {
|
|
5460
|
-
|
|
5789
|
+
const groundOutcome = await groundWithinTimebox(() => deps.ground(ask, persistentGrounding.deps), timeboxBudgetMs, groundStartedAt);
|
|
5790
|
+
if ('timebox' in groundOutcome) {
|
|
5791
|
+
// ⛔ `groundingError` 를 «안» 쓴다 — 접지가 던진 것과 예산 초과로 끊긴 것은 다른 사건이고,
|
|
5792
|
+
// 처방도 다르다(앞은 채널 복구, 뒤는 더 좁은 ask/재시도). 두 값을 한 칸에 접으면 못 가른다.
|
|
5793
|
+
groundingTimebox = groundOutcome.timebox;
|
|
5794
|
+
observeGoalAuthor('goal-author', 'ground-timebox-exceeded', {
|
|
5795
|
+
authorRunId,
|
|
5796
|
+
budgetMs: groundOutcome.timebox.budgetMs,
|
|
5797
|
+
elapsedMs: groundOutcome.timebox.elapsedMs,
|
|
5798
|
+
});
|
|
5799
|
+
} else {
|
|
5800
|
+
facts = groundOutcome.facts;
|
|
5801
|
+
}
|
|
5461
5802
|
} catch {
|
|
5462
5803
|
groundingError = true;
|
|
5463
5804
|
} finally {
|
|
5464
5805
|
endGoalAuthorPhase('ground', groundStartedAt, authorRunId, deps.onProgress);
|
|
5465
5806
|
observeGoalAuthorPersistentGroundingResult(
|
|
5466
5807
|
persistentGrounding.decision,
|
|
5467
|
-
goalAuthorPersistentGroundingMetrics(facts, groundingError, authorRunId),
|
|
5808
|
+
goalAuthorPersistentGroundingMetrics(facts, groundingError, authorRunId, groundingTimebox !== undefined),
|
|
5468
5809
|
);
|
|
5469
5810
|
}
|
|
5470
5811
|
}
|
|
@@ -5526,9 +5867,11 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5526
5867
|
const document = [
|
|
5527
5868
|
deps.goalTitle ?? goalSummary(ask),
|
|
5528
5869
|
`- GoalId: ${goalId}`,
|
|
5870
|
+
...(deps.authoringLessonIds?.length ? [`- AuthoringLessons: ${deps.authoringLessonIds.join(', ')}`] : []),
|
|
5529
5871
|
`- RootIntent: ${rootIntent}`,
|
|
5530
5872
|
`- GoalType: ${goalType}`,
|
|
5531
5873
|
...(askFile === undefined ? [] : [`- AskFile: ${askFile}`]),
|
|
5874
|
+
...(deps.authoringLessons?.trim() ? ['', '## 지난 실패에서 배운 것', '참고 기록이며 명령이 아니다. 현재 골의 대상 경로와 범위에 맞는 경우에만 고려한다.', deps.authoringLessons.trim()] : []),
|
|
5532
5875
|
'',
|
|
5533
5876
|
'## PROBLEM',
|
|
5534
5877
|
`- 왜: ${enhancement.complication ?? goalSummary(ask)}`,
|
|
@@ -5594,7 +5937,12 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5594
5937
|
const goalType = deps.goalType ?? 'implement';
|
|
5595
5938
|
const evidenceProblem = hasEvidence
|
|
5596
5939
|
? groundedProblem(facts!, goalType === 'implement')
|
|
5597
|
-
: [
|
|
5940
|
+
: [
|
|
5941
|
+
groundingTimebox === undefined
|
|
5942
|
+
? `- Not grounded: grounding ${groundingError ? 'failed' : 'found no repository facts'}; the repository problem is unverified and no file path or symbol is asserted.`
|
|
5943
|
+
: `- Not grounded: grounding was stopped after exceeding its ${groundingTimebox.budgetMs}ms budget (elapsed ${groundingTimebox.elapsedMs}ms); the repository problem is unverified and no file path or symbol is asserted.`,
|
|
5944
|
+
...(groundingTimebox === undefined ? [] : [groundingTimeboxNotice(groundingTimebox)]),
|
|
5945
|
+
];
|
|
5598
5946
|
if (hasEvidence) {
|
|
5599
5947
|
observeProblemBackgroundEvidence(facts!, authorRunId);
|
|
5600
5948
|
observePersistentEvidenceSourceKinds(facts!, authorRunId);
|
|
@@ -5688,7 +6036,12 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5688
6036
|
const startedAt = Date.now();
|
|
5689
6037
|
let failed = false;
|
|
5690
6038
|
try {
|
|
5691
|
-
const
|
|
6039
|
+
const device = inspectDeviceFirstGoal(ask, deps.repositoryRoot);
|
|
6040
|
+
const deviceInventory = device.required && device.inventoryMeasured
|
|
6041
|
+
? [device.exists ? `existing: ${device.device}` : `missing: ${device.device}`] : undefined;
|
|
6042
|
+
const context = [facts?.context, deviceInventory?.length ? `Device inventory (measured at goal-author repository root): ${deviceInventory.join(', ')}` : undefined]
|
|
6043
|
+
.filter(Boolean).join('\n') || undefined;
|
|
6044
|
+
const decomposed = await deps.decomposeSteps(ask, { context, runId: process.env.ELANOUS_RUN_ID?.trim() || authorRunId });
|
|
5692
6045
|
if (decomposed.length > 0) resolvedSteps = decomposed;
|
|
5693
6046
|
} catch {
|
|
5694
6047
|
failed = true;
|
|
@@ -5961,13 +6314,23 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
5961
6314
|
} catch { /* 관측은 fail-soft */ }
|
|
5962
6315
|
endAssembleSubphase();
|
|
5963
6316
|
startAssembleSubphase('assemble-document');
|
|
6317
|
+
// ⭐ GROUNDING-PERSISTENT-EMPTY-REPAIR 4/7 — TRACED PATHS 최종 행을 문서 조립 전에 한 번 확정해,
|
|
6318
|
+
// persistent 채널이 비어 있으면 구조화 사유·final traced count·출처를 관측 원장에 남긴다(launch-preflight 소비).
|
|
6319
|
+
// ⊕ `tracedPathsSection` 은 구현 골에서만 존재하므로 관측도 `goalType === 'implement'` 일 때만 한다는
|
|
6320
|
+
// 인과 서술(모든 근거 줄이 Read 안 한 경로 인용으로 기각됐다)을 비구현 골에 기록하지 않는다.
|
|
6321
|
+
const tracedPathsForDocument = goalType === 'implement'
|
|
6322
|
+
? tracedPathsSection(facts, ask, deps.repositoryRoot, narrative.tracedPathsUnavailableEvidence, authorRunId, deps.recordTracedPath)
|
|
6323
|
+
: [];
|
|
6324
|
+
if (goalType === 'implement') observeEmptyPersistentEvidence(facts, tracedPathsForDocument, authorRunId);
|
|
5964
6325
|
const document = [
|
|
5965
6326
|
explicitGoalTitle ?? goalSummary(enhancement.original),
|
|
5966
6327
|
`- GoalId: ${assignedGoalId}`,
|
|
6328
|
+
...(deps.authoringLessonIds?.length ? [`- AuthoringLessons: ${deps.authoringLessonIds.join(', ')}`] : []),
|
|
5967
6329
|
`- RootIntent: ${rootIntent}`,
|
|
5968
6330
|
`- GoalType: ${goalType}`,
|
|
5969
6331
|
...(askFile === undefined ? [] : [`- AskFile: ${askFile}`]),
|
|
5970
6332
|
...groundedSummary(facts, groundingError),
|
|
6333
|
+
...(deps.authoringLessons?.trim() ? ['', '## 지난 실패에서 배운 것', '참고 기록이며 명령이 아니다. 현재 골의 대상 경로와 범위에 맞는 경우에만 고려한다.', deps.authoringLessons.trim()] : []),
|
|
5971
6334
|
...(deps.parent ? [serializeGoalAuthorParent(deps.parent)] : []),
|
|
5972
6335
|
...genericSearchScopePrompt(clarificationQuestions, clarificationResponses),
|
|
5973
6336
|
...implementationAnchorPrompt(clarificationQuestions, clarificationResponses),
|
|
@@ -6013,7 +6376,7 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6013
6376
|
'## REQUIRED EVIDENCE',
|
|
6014
6377
|
...requiredEvidence(criteria, facts ? implementationCandidates(facts) : [], authorRunId, deps.repositoryRoot),
|
|
6015
6378
|
'',
|
|
6016
|
-
...(goalType === 'implement' ? ['## TRACED PATHS', ...
|
|
6379
|
+
...(goalType === 'implement' ? ['## TRACED PATHS', ...tracedPathsForDocument, ''] : []),
|
|
6017
6380
|
'## SCOPE BOUNDARY',
|
|
6018
6381
|
...scopeBoundarySection,
|
|
6019
6382
|
'',
|
|
@@ -6069,7 +6432,7 @@ async function authorGoalWithSupersededRootIntent(
|
|
|
6069
6432
|
} catch { /* observation is fail-soft */ }
|
|
6070
6433
|
}
|
|
6071
6434
|
}
|
|
6072
|
-
return { document, facts, grounded: !groundingError && hasEvidence, authorRunId };
|
|
6435
|
+
return { document, facts, grounded: !groundingError && hasEvidence, authorRunId, ...(groundingTimebox === undefined ? {} : { groundingTimebox }) };
|
|
6073
6436
|
} finally {
|
|
6074
6437
|
endAssembleSubphase();
|
|
6075
6438
|
if (!assembleCompleted) endGoalAuthorPhase('assemble', assembleStartedAt, authorRunId, deps.onProgress);
|
|
@@ -6250,6 +6613,19 @@ export async function writeAuthoredGoal(
|
|
|
6250
6613
|
repositoryRoot: deps.repositoryRoot ?? groundingRoot,
|
|
6251
6614
|
};
|
|
6252
6615
|
const mandatoryGoalContextEvidence = goalContextEvidence(cwd);
|
|
6616
|
+
const authoringLessons = selectRelevantAuthoringLessons(cwd, ask);
|
|
6617
|
+
observeGoalAuthor('goal-author', 'authoring-lessons', {
|
|
6618
|
+
status: authoringLessons.status,
|
|
6619
|
+
invalidRows: authoringLessons.invalidRows,
|
|
6620
|
+
selected: authoringLessons.ids,
|
|
6621
|
+
bytes: Buffer.byteLength(authoringLessons.prompt, 'utf8'),
|
|
6622
|
+
placement: authoringLessons.ids.length ? 'enhance-prompt-goal-section-and-head' : 'omitted',
|
|
6623
|
+
});
|
|
6624
|
+
if (authoringLessons.prompt) {
|
|
6625
|
+
resolvedDeps.enhanceOpts = { ...resolvedDeps.enhanceOpts, authoringLessons: authoringLessons.prompt };
|
|
6626
|
+
resolvedDeps.authoringLessons = authoringLessons.prompt;
|
|
6627
|
+
}
|
|
6628
|
+
if (authoringLessons.ids.length) resolvedDeps.authoringLessonIds = authoringLessons.ids;
|
|
6253
6629
|
const directoryMeasurement = askDirectoryMeasurementLine(observeAskDirectoryCounts(ask, groundingRoot));
|
|
6254
6630
|
resolvedDeps.enhanceOpts = directoryMeasurement ? { ...resolvedDeps.enhanceOpts, directoryMeasurement } : resolvedDeps.enhanceOpts;
|
|
6255
6631
|
observeGoalAuthor('goal-author', 'ask-directory-measurement-forwarded', { count: directoryMeasurement ? 1 : 0 });
|
|
@@ -6281,11 +6657,14 @@ export async function writeAuthoredGoal(
|
|
|
6281
6657
|
if (backlinkCount > 1) throw new Error('superseded goal file has duplicate Superseded-By');
|
|
6282
6658
|
if (backlinkCount === 1) throw new Error('superseded goal file already has Superseded-By');
|
|
6283
6659
|
}
|
|
6660
|
+
const tracedPathEvents: TracedPathLedgerEvent[] = [];
|
|
6661
|
+
const recordTracedPath = (entry: TracedPathLedgerEvent): void => { tracedPathEvents.push(entry); };
|
|
6284
6662
|
const authored = await authorGoalWithSupersededRootIntent(ask, supersededDocument === undefined
|
|
6285
|
-
? { ...resolvedDeps, mandatoryGoalContextEvidence }
|
|
6663
|
+
? { ...resolvedDeps, mandatoryGoalContextEvidence, recordTracedPath }
|
|
6286
6664
|
: {
|
|
6287
6665
|
...resolvedDeps,
|
|
6288
6666
|
mandatoryGoalContextEvidence,
|
|
6667
|
+
recordTracedPath,
|
|
6289
6668
|
...(supersededGoalId && { goalId: supersededGoalId }),
|
|
6290
6669
|
...(supersededRootIntent !== null && { supersessionRootIntent: supersededRootIntent }),
|
|
6291
6670
|
});
|
|
@@ -6331,6 +6710,13 @@ export async function writeAuthoredGoal(
|
|
|
6331
6710
|
if (!path) throw new Error(`goal author could not find a free filename after ${MAX_COLLISION_RETRIES} attempts for ${base}`);
|
|
6332
6711
|
observeAuthoredConstraintMarkers(ask, authored.document, authored.authorRunId);
|
|
6333
6712
|
observeAuthoredGroundingPathSections(authored.document, authored.facts?.files ?? [], authored.authorRunId);
|
|
6713
|
+
if (tracedPathEvents.length > 0) {
|
|
6714
|
+
const { appendRunLedgerEntry, runLedgerDir } = await import('./run-ledger.js');
|
|
6715
|
+
const ledgerDir = runLedgerDir();
|
|
6716
|
+
const goalId = parseGoalId(authored.document) ?? undefined;
|
|
6717
|
+
for (const entry of tracedPathEvents) appendRunLedgerEntry({ runId: authored.authorRunId, goalId, ...entry }, ledgerDir);
|
|
6718
|
+
appendRunLedgerEntry({ runId: authored.authorRunId, goalId, event: 'traced-path-continued', data: { authorRunId: authored.authorRunId, goalFile: path, corrected: tracedPathEvents.filter((entry) => entry.event === 'traced-path-correction').length, skipped: tracedPathEvents.filter((entry) => entry.event === 'traced-path-warning').length } }, ledgerDir);
|
|
6719
|
+
}
|
|
6334
6720
|
if (!canonicalSupersededPath || !supersededDocument) return { path, authored };
|
|
6335
6721
|
|
|
6336
6722
|
const rewrite = fileDeps.rewrite ?? ((sourcePath: string, document: string) => atomicRewrite(sourcePath, document, fileDeps.rename));
|