elanous 0.2.36 → 0.2.37
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 → 8kITumG9GAZ1LwT9POrAR}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +62 -0
- package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 1262.a89bb27a5b2f844e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 1746.3563617ea64023a3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 2002-a43a3f380df873ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +32 -0
- package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 2283.edd9627b7bdfb546.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 2375.bf364c85dbb6f085.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +148 -0
- package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +27 -0
- package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 3199.6a1a9b0e6cd01dc6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2986.45d7652e4f13557e.js → 3578.4e9f9948a9a6f2f4.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +36 -0
- package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +90 -0
- package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +226 -0
- package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +287 -0
- package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7481.39f7a4654907bf6e.js → 4313.76f232c304a15bde.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4337e36d.f42c3b391b3d8f20.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 4383.18e5c54db3a22c88.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3757-180308bc61021b05.js → 4725-34bed25720cc326b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +24 -0
- package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 4931.95cc6dbd230774ca.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5046.7fd5cbd859299448.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +104 -0
- package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +1 -0
- package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 58edce7d.f1b0c72acf13b123.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
- package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 5952.294fc574a8625184.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 5f6af561-f90b7a67f4f75d13.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +74 -0
- package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 6252.240578f10952e091.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 6680.6a693c28aae4cd19.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 6745-5a63492933959dd9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +149 -0
- package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 6819.be5c9c4d67f22922.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → 709a918c.4fd3b4e2a32cb4e3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +41 -0
- package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 7424.c0fe2a595d4232b5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +1 -0
- package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +1 -0
- package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 7867.e8725745ddd1d940.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/{6466-92e65a48490b68a9.js → 7893-e444a1b0809cd1e4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{ccae1c4b-0cf414f5eff1b10d.js → 7c5ed21f-f286708e57cf88f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{3840-5825d56d46976a92.js → 8080-40d781e7704d3671.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +77 -0
- package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +1 -0
- package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +286 -0
- package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +79 -0
- package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → 8c58d09b.e8724a299658d86f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 9151.a2c51e93f9156dae.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +94 -0
- package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{190.285c832bd9626f8c.js → 958.53a8dcf4729e6997.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/{page-e2de2e59111c9aad.js → page-3337c6a1328c2674.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/{page-f2b2e4bf6e981450.js → page-89acd5d68c0bc560.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-2af16e62c12f22df.js → page-fe986fe79b107546.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → d9815f84.4918f682a45a8502.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → de8446d3.31b73eb239fecd7b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.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/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/boundary-proof-mapping-audit.ts +88 -0
- 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-failure-census.ts +507 -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/land-global-checks.ts +69 -1
- package/scripts/measure-nl-routing-corpus.ts +207 -2
- 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/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-release.ts +114 -4
- package/scripts/release-loop/resume-test-traffic.ts +10 -0
- package/scripts/release-loop/version-node.ts +81 -12
- 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/src/acp/client.ts +31 -5
- package/src/acp/core-turn-bridge.ts +6 -0
- package/src/acp/stderr-summary.ts +49 -0
- package/src/agent/monad-agent-turn.ts +1 -0
- package/src/agent/terminal-surface.ts +217 -0
- package/src/agent-substrate/pr-reviewer.ts +11 -3
- package/src/agent-substrate/self-review-cli.ts +343 -31
- 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/budget/run-usage-rollup.ts +12 -7
- package/src/budget/unified-usage.ts +20 -0
- package/src/capture/tui-self-report.ts +32 -3
- 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/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/release-checklist-read-cli.ts +109 -4
- package/src/cli/release-cli.ts +43 -10
- package/src/cli/self-update.ts +23 -5
- package/src/cli/self-utterances-cli.ts +13 -16
- package/src/cli/tasks-cli.ts +309 -11
- package/src/cli/usage-cli.ts +12 -10
- package/src/context-bus/claude-memory-import.ts +99 -0
- package/src/context-bus/long-term-memory.ts +125 -0
- package/src/core-turn/run-goal-loop.ts +5 -2
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/chat/acp-chat.ts +9 -0
- package/src/dashboard/index.ts +97 -13
- package/src/dashboard/input/agent-wake.ts +43 -0
- package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
- package/src/dashboard/replay-preview.ts +25 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +17 -8
- package/src/dashboard/synchronized-frame-output.ts +74 -0
- 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/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/graph-runner/graph-cli.ts +26 -2
- package/src/graph-runner/graph-run-api.ts +3 -2
- package/src/graph-runner/runner.ts +17 -5
- package/src/graph-wizard/generate.ts +29 -6
- package/src/harness/harness-cli-command.ts +179 -33
- package/src/harness/review-adapter.ts +26 -6
- package/src/index.ts +116 -13
- package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
- package/src/llm/route-decision.ts +13 -0
- package/src/llm-tool-name.ts +37 -0
- package/src/llm-tool-schema.ts +35 -0
- package/src/llm.ts +123 -11
- 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/tick.ts +49 -4
- 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/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/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/policy/llm-policy.ts +3 -1
- package/src/prompt-enhance/enhance.ts +4 -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/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/landed-but-yellow.ts +93 -12
- package/src/repl/index.ts +8 -0
- 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/dev-pipeline.ts +29 -7
- package/src/self-dev/draft-sweep.ts +241 -16
- package/src/self-dev/draft-triage-rules.ts +19 -5
- package/src/self-dev/review-provider-fallback.ts +45 -7
- package/src/self-dev/shard-plan.ts +48 -0
- package/src/self-dev/shard-run.ts +50 -3
- package/src/self-implement/doctor-visit.ts +83 -0
- package/src/self-implement/gate-artifacts.ts +6 -2
- package/src/self-implement/gate-baseline.ts +64 -1
- package/src/self-implement/gate-cli.ts +93 -9
- package/src/self-implement/gate-remote.ts +28 -4
- package/src/self-implement/gate-scope.ts +13 -1
- package/src/self-implement/goal-author.ts +333 -18
- package/src/self-implement/goal-supervisor-fill.ts +75 -26
- package/src/self-implement/importer-test-index.ts +215 -2
- package/src/self-implement/knowhow-pack.ts +5 -5
- package/src/self-implement/orchestrator.ts +318 -25
- 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 +170 -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 +12 -6
- 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/chat.ts +7 -1
- package/src/session/id-prefix.ts +60 -0
- package/src/session/index.ts +4 -0
- package/src/session-runtime/index.ts +9 -1
- package/src/skills/tools/pty.ts +5 -0
- 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/task-agent/actions.ts +199 -4
- 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/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 +21 -11
- package/src/task-agent/rejudge-on-head.ts +72 -5
- package/src/task-agent/repair-cycle.ts +41 -0
- package/src/task-agent/repair-next-move.ts +12 -2
- 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 +158 -13
- package/src/task-agent/task-parent-role-llm.ts +9 -0
- package/src/task-agent/tier-split.ts +4 -3
- 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-ledger-collect.ts +8 -6
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +50 -4
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +217 -36
- package/src/task-orchestrator/surfaces/self-implement.ts +4 -0
- package/src/testing/linux-env.ts +177 -0
- package/src/tui/chat/goal-interim.ts +5 -1
- package/src/tui/entry.ts +258 -4
- package/src/tui/input/at-picker.ts +55 -0
- package/src/tui/slash/resume.ts +35 -12
- package/src/tui/slash/signals.ts +114 -0
- package/src/tui/slash/term-next.ts +71 -0
- package/src/tui-client/local-chat-turn.ts +4 -3
- package/src/user-config.ts +19 -1
- 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 +6 -1
- package/src/ux-sim/next-tui-seat-scenarios.ts +124 -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/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/2812ca6a.3b9f4a7a08885744.js +0 -1
- 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/3031-85328a92fcce4da6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3148-98efd4869d660a87.js +0 -1
- 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/379.ee262e37586fe1ae.js +0 -74
- 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/4116.a84a92a2492c080e.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/599.c39c571b6733f2a2.js +0 -41
- 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/6566.926a1d1b7c911442.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/6925.562d532110879886.js +0 -1
- package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.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/7784.1f0ac4a16d190cf4.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/8037.e254fd797aa224d1.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/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/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/outputs/page-e7abc34a48a6f71e.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/term/page-c15958835534404b.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/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/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
|
@@ -74,6 +74,194 @@ export function resolveCorpusRunSafety(
|
|
|
74
74
|
return { observeOnly, bypassed, exposedMutatingTools };
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
// ── NL-UTTERANCE-PATTERNS v5 — 경로·복합 처리 채점 입구 ─────────────────────
|
|
78
|
+
//
|
|
79
|
+
// 칸의 판정선은 수가 아니라 «판정선»이다: 가림 예시 누출 0 · 패턴 ≥12 · v5 채점 문항 ≥25.
|
|
80
|
+
// 패턴은 발화 어휘 신호(경로 지정 / 복합 요청)이고, 문항은 그 패턴이 실제로 발화하는지
|
|
81
|
+
// 스스로 증명한다(선언 패턴이 프롬프트에서 안 잡히면 mismatch 로 판정 실패).
|
|
82
|
+
// ⛔ 가림 예시(masking examples)는 «채점되지 않는» 홀드아웃 발화다 — 문항·패턴에 새면 판정선이 무너진다.
|
|
83
|
+
|
|
84
|
+
export interface NlRoutingToolExpectation {
|
|
85
|
+
readonly tool: string;
|
|
86
|
+
readonly minCount?: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface NlUtterancePattern {
|
|
90
|
+
readonly id: string;
|
|
91
|
+
readonly handles: 'path' | 'compound';
|
|
92
|
+
readonly signal: RegExp;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export const NL_UTTERANCE_PATTERNS: readonly NlUtterancePattern[] = [
|
|
96
|
+
{ id: 'path-single-read', handles: 'path', signal: /(?:읽어\s*줘|열어\s*줘)/u },
|
|
97
|
+
{ id: 'path-relative', handles: 'path', signal: /(?:상대\s*경로|\.\/)/u },
|
|
98
|
+
{ id: 'path-absolute', handles: 'path', signal: /(?:절대\s*경로|\/tmp\/|\/home\/)/u },
|
|
99
|
+
{ id: 'path-home-config', handles: 'path', signal: /(?:~\/\.elanous|홈\s*디렉터리)/u },
|
|
100
|
+
{ id: 'path-directory-scope', handles: 'path', signal: /(?:디렉터리\s*안에서|그\s*폴더\s*안)/u },
|
|
101
|
+
{ id: 'path-symbol-search', handles: 'path', signal: /어디서\s*쓰/u },
|
|
102
|
+
{ id: 'path-file-glob', handles: 'path', signal: /(?:목록|어떤\s*파일들)/u },
|
|
103
|
+
{ id: 'path-nested-file', handles: 'path', signal: /하위\s*디렉터리[\s\S]*파일/u },
|
|
104
|
+
{ id: 'compound-read-then-grep', handles: 'compound', signal: /읽고\s*나서[\s\S]*찾/u },
|
|
105
|
+
{ id: 'compound-grep-then-read', handles: 'compound', signal: /찾아서\s*그\s*파일/u },
|
|
106
|
+
{ id: 'compound-glob-then-read', handles: 'compound', signal: /목록[\s\S]*첫\s*파일/u },
|
|
107
|
+
{ id: 'compound-two-file-compare', handles: 'compound', signal: /두\s*파일[\s\S]*비교/u },
|
|
108
|
+
{ id: 'compound-three-way', handles: 'compound', signal: /읽고[\s\S]*찾고[\s\S]*목록/u },
|
|
109
|
+
{ id: 'compound-search-then-confirm', handles: 'compound', signal: /검색해서[\s\S]*전부\s*확인/u },
|
|
110
|
+
];
|
|
111
|
+
|
|
112
|
+
export interface NlRoutingV5Question {
|
|
113
|
+
readonly id: string;
|
|
114
|
+
readonly pattern: string;
|
|
115
|
+
readonly prompt: string;
|
|
116
|
+
readonly expects: readonly NlRoutingToolExpectation[];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const single = (tool: string): readonly NlRoutingToolExpectation[] => [{ tool }];
|
|
120
|
+
|
|
121
|
+
export const NL_ROUTING_V5_QUESTIONS: readonly NlRoutingV5Question[] = [
|
|
122
|
+
{ id: 'v5-01', pattern: 'path-single-read', prompt: 'src/domains/surface-events.ts 파일 읽어 줘', expects: single('Read') },
|
|
123
|
+
{ id: 'v5-02', pattern: 'path-single-read', prompt: 'scripts/measure-nl-routing-corpus.ts 읽어 줘', expects: single('Read') },
|
|
124
|
+
{ id: 'v5-03', pattern: 'path-relative', prompt: 'src/cli/self-utterances-cli.ts 상대 경로로 열어 줘', expects: single('Read') },
|
|
125
|
+
{ id: 'v5-04', pattern: 'path-relative', prompt: './scripts/lib/nl-routing-screening.ts 상대 경로 파일 보여줘', expects: single('Read') },
|
|
126
|
+
{ id: 'v5-05', pattern: 'path-absolute', prompt: '/home/ubuntu/.elanous/logs 절대 경로 확인해 줘', expects: single('Read') },
|
|
127
|
+
{ id: 'v5-06', pattern: 'path-absolute', prompt: '/tmp/nl-routing/corpus.json 절대 경로 읽어 줘', expects: single('Read') },
|
|
128
|
+
{ id: 'v5-07', pattern: 'path-home-config', prompt: '~/.elanous 아래 설정 파일 읽어 줘', expects: single('Read') },
|
|
129
|
+
{ id: 'v5-08', pattern: 'path-home-config', prompt: '홈 디렉터리의 elanous 설정 읽어 줘', expects: single('Read') },
|
|
130
|
+
{ id: 'v5-09', pattern: 'path-directory-scope', prompt: 'src/domains 디렉터리 안에서 발화 origin 찾아 줘', expects: single('Grep') },
|
|
131
|
+
{ id: 'v5-10', pattern: 'path-directory-scope', prompt: '그 폴더 안에서 querySurfaceUtterances 를 검색해 줘', expects: single('Grep') },
|
|
132
|
+
{ id: 'v5-11', pattern: 'path-symbol-search', prompt: 'recordInboundTurn 이 어디서 쓰이는지 알려 줘', expects: single('Grep') },
|
|
133
|
+
{ id: 'v5-12', pattern: 'path-symbol-search', prompt: 'classifyTier 어디서 쓰는지 찾아 줘', expects: single('Grep') },
|
|
134
|
+
{ id: 'v5-13', pattern: 'path-file-glob', prompt: 'scripts 아래 측정 스크립트 목록 뽑아 줘', expects: single('Glob') },
|
|
135
|
+
{ id: 'v5-14', pattern: 'path-file-glob', prompt: '어떤 파일들 *.test.ts 이 있는지 보여 줘', expects: single('Glob') },
|
|
136
|
+
{ id: 'v5-15', pattern: 'path-nested-file', prompt: 'src/domains 하위 디렉터리의 파일 하나 읽어 줘', expects: single('Read') },
|
|
137
|
+
{ id: 'v5-16', pattern: 'path-nested-file', prompt: 'scripts/lib 하위 디렉터리 파일 읽어 줘', expects: single('Read') },
|
|
138
|
+
{ id: 'v5-17', pattern: 'compound-read-then-grep', prompt: 'src/domains/surface-events.ts 읽고 나서 호출부 찾아 줘', expects: [{ tool: 'Read' }, { tool: 'Grep' }] },
|
|
139
|
+
{ id: 'v5-18', pattern: 'compound-read-then-grep', prompt: 'docs/goal-context README 읽고 나서 참조 찾아 줘', expects: [{ tool: 'Read' }, { tool: 'Grep' }] },
|
|
140
|
+
{ id: 'v5-19', pattern: 'compound-grep-then-read', prompt: 'recordInboundTurn 찾아서 그 파일 읽어 줘', expects: [{ tool: 'Grep' }, { tool: 'Read' }] },
|
|
141
|
+
{ id: 'v5-20', pattern: 'compound-grep-then-read', prompt: 'querySurfaceUtterances 찾아서 그 파일 열어 줘', expects: [{ tool: 'Grep' }, { tool: 'Read' }] },
|
|
142
|
+
{ id: 'v5-21', pattern: 'compound-glob-then-read', prompt: 'src/domains 목록 뽑고 첫 파일 읽어 줘', expects: [{ tool: 'Glob' }, { tool: 'Read' }] },
|
|
143
|
+
{ id: 'v5-22', pattern: 'compound-glob-then-read', prompt: 'scripts/lib 목록 보고 첫 파일 읽어 줘', expects: [{ tool: 'Glob' }, { tool: 'Read' }] },
|
|
144
|
+
{ id: 'v5-23', pattern: 'compound-two-file-compare', prompt: 'surface-events.ts 와 provenance.ts 두 파일 비교해 줘', expects: [{ tool: 'Read', minCount: 2 }] },
|
|
145
|
+
{ id: 'v5-24', pattern: 'compound-two-file-compare', prompt: 'measure-nl-routing-corpus.ts 와 nl-routing-measurement.ts 두 파일 비교해 줘', expects: [{ tool: 'Read', minCount: 2 }] },
|
|
146
|
+
{ id: 'v5-25', pattern: 'compound-three-way', prompt: 'surface-events.ts 읽고 지난 기록 찾고 폴더 목록도 뽑아 줘', expects: [{ tool: 'Read' }, { tool: 'Grep' }, { tool: 'Glob' }] },
|
|
147
|
+
{ id: 'v5-26', pattern: 'compound-three-way', prompt: 'self-utterances-cli.ts 읽고 origin 찾고 scripts 목록도 뽑아 줘', expects: [{ tool: 'Read' }, { tool: 'Grep' }, { tool: 'Glob' }] },
|
|
148
|
+
{ id: 'v5-27', pattern: 'compound-search-then-confirm', prompt: 'origin 표기를 검색해서 관련 파일 전부 확인해 줘', expects: [{ tool: 'Grep' }, { tool: 'Read' }] },
|
|
149
|
+
{ id: 'v5-28', pattern: 'compound-search-then-confirm', prompt: 'v5 문항을 검색해서 전부 확인해 줘', expects: [{ tool: 'Grep' }, { tool: 'Read' }] },
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
/** 채점에 쓰이지 않는 홀드아웃 발화 — 문항·패턴에 «한 글자도» 새면 안 된다. */
|
|
153
|
+
export const NL_ROUTING_MASKING_EXAMPLES: readonly string[] = [
|
|
154
|
+
'이 저장소에서 라우팅 규칙이 어디에 적혀 있는지 알려 줘',
|
|
155
|
+
'방금 만든 스크립트랑 예전 스크립트를 나란히 놓고 틀린 곳만 짚어 줘',
|
|
156
|
+
'설정 폴더 아래 있는 재정의 항목만 훑어 줘',
|
|
157
|
+
'테스트가 실제로 도는 파일과 그렇지 않은 파일을 갈라 줘',
|
|
158
|
+
'복합 요청: 먼저 근거를 모으고 그다음에 요약을 만들어 줘',
|
|
159
|
+
'이 변경이 어떤 진입점을 타는지 확인해 줘',
|
|
160
|
+
'오늘 새로 생긴 산출물만 모아서 보여 줘',
|
|
161
|
+
'지난 실행에서 실패한 문항을 다시 재 보고 싶어',
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
export const NL_ROUTING_V5_THRESHOLDS = { maskingLeaks: 0, patterns: 12, scored: 25 } as const;
|
|
165
|
+
|
|
166
|
+
function normalizeUtterance(text: string): string {
|
|
167
|
+
return text.toLowerCase().replace(/[^\p{L}\p{N}]+/gu, ' ').trim();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** 발화에서 발화하는 패턴 id 목록(패턴 정의가 장식이 아님을 문항 단위로 확인하는 자). */
|
|
171
|
+
export function matchNlUtterancePatterns(prompt: string): string[] {
|
|
172
|
+
return NL_UTTERANCE_PATTERNS.filter((pattern) => pattern.signal.test(prompt)).map((pattern) => pattern.id);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** 가림 예시 누출 검사 — 문항 프롬프트·패턴 id 어디에도 홀드아웃 발화가 겹치면 누출이다. */
|
|
176
|
+
export function maskingExampleLeaks(): string[] {
|
|
177
|
+
const prompts = NL_ROUTING_V5_QUESTIONS.map((question) => ({ id: question.id, text: normalizeUtterance(question.prompt) }));
|
|
178
|
+
const patternIds = NL_UTTERANCE_PATTERNS.map((pattern) => normalizeUtterance(pattern.id));
|
|
179
|
+
const leaks: string[] = [];
|
|
180
|
+
NL_ROUTING_MASKING_EXAMPLES.forEach((example, index) => {
|
|
181
|
+
const normalized = normalizeUtterance(example);
|
|
182
|
+
if (!normalized) return;
|
|
183
|
+
const hit = prompts.find((prompt) => prompt.text.includes(normalized) || normalized.includes(prompt.text));
|
|
184
|
+
if (hit) { leaks.push(`example${index + 1}:${hit.id}`); return; }
|
|
185
|
+
if (patternIds.some((id) => id.includes(normalized))) leaks.push(`example${index + 1}:pattern`);
|
|
186
|
+
});
|
|
187
|
+
return leaks;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export interface NlRoutingV5Score {
|
|
191
|
+
readonly questions: number;
|
|
192
|
+
readonly pathQuestions: number;
|
|
193
|
+
readonly compoundQuestions: number;
|
|
194
|
+
readonly patterns: number;
|
|
195
|
+
readonly pathPatterns: number;
|
|
196
|
+
readonly compoundPatterns: number;
|
|
197
|
+
readonly scored: number;
|
|
198
|
+
readonly passed: number;
|
|
199
|
+
readonly failed: readonly string[];
|
|
200
|
+
readonly failedRuns: number;
|
|
201
|
+
readonly maskingLeaks: readonly string[];
|
|
202
|
+
readonly patternMismatches: readonly string[];
|
|
203
|
+
readonly thresholdsMet: boolean;
|
|
204
|
+
readonly verdict: 'pass' | 'fail';
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function expectationsMet(expects: readonly NlRoutingToolExpectation[], breakdown: Record<string, number>): boolean {
|
|
208
|
+
return expects.every((expectation) => (breakdown[expectation.tool] ?? 0) >= (expectation.minCount ?? 1));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** v5 28문항을 «생산 runEvalPrompt seam» 으로 그대로 돌려 경로·복합 처리를 채점한다. */
|
|
212
|
+
export async function scoreNlRoutingV5(opts: {
|
|
213
|
+
runPrompt: typeof runEvalPrompt;
|
|
214
|
+
surface: EvalPromptToolSurface;
|
|
215
|
+
cwd: string;
|
|
216
|
+
maxTurns?: number;
|
|
217
|
+
}): Promise<NlRoutingV5Score> {
|
|
218
|
+
const maxTurns = opts.maxTurns ?? 6;
|
|
219
|
+
const matched = new Set<string>();
|
|
220
|
+
const failed: string[] = [];
|
|
221
|
+
const patternMismatches: string[] = [];
|
|
222
|
+
let scored = 0;
|
|
223
|
+
let passed = 0;
|
|
224
|
+
let failedRuns = 0;
|
|
225
|
+
for (const question of NL_ROUTING_V5_QUESTIONS) {
|
|
226
|
+
if (!matchNlUtterancePatterns(question.prompt).includes(question.pattern)) {
|
|
227
|
+
patternMismatches.push(question.id);
|
|
228
|
+
}
|
|
229
|
+
try {
|
|
230
|
+
const result = await opts.runPrompt({ prompt: question.prompt, maxTurns, tools: opts.surface, silent: true, cwd: opts.cwd });
|
|
231
|
+
scored += 1;
|
|
232
|
+
if (expectationsMet(question.expects, result.toolBreakdown)) {
|
|
233
|
+
passed += 1;
|
|
234
|
+
matched.add(question.pattern);
|
|
235
|
+
} else failed.push(question.id);
|
|
236
|
+
} catch {
|
|
237
|
+
failedRuns += 1;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const matchedPatterns = NL_UTTERANCE_PATTERNS.filter((pattern) => matched.has(pattern.id));
|
|
241
|
+
const leaks = maskingExampleLeaks();
|
|
242
|
+
const thresholdsMet = scored >= NL_ROUTING_V5_THRESHOLDS.scored
|
|
243
|
+
&& passed >= NL_ROUTING_V5_THRESHOLDS.scored
|
|
244
|
+
&& matchedPatterns.length >= NL_ROUTING_V5_THRESHOLDS.patterns
|
|
245
|
+
&& leaks.length <= NL_ROUTING_V5_THRESHOLDS.maskingLeaks
|
|
246
|
+
&& patternMismatches.length === 0;
|
|
247
|
+
return {
|
|
248
|
+
questions: NL_ROUTING_V5_QUESTIONS.length,
|
|
249
|
+
pathQuestions: NL_ROUTING_V5_QUESTIONS.filter((question) => NL_UTTERANCE_PATTERNS.find((pattern) => pattern.id === question.pattern)?.handles === 'path').length,
|
|
250
|
+
compoundQuestions: NL_ROUTING_V5_QUESTIONS.filter((question) => NL_UTTERANCE_PATTERNS.find((pattern) => pattern.id === question.pattern)?.handles === 'compound').length,
|
|
251
|
+
patterns: matchedPatterns.length,
|
|
252
|
+
pathPatterns: matchedPatterns.filter((pattern) => pattern.handles === 'path').length,
|
|
253
|
+
compoundPatterns: matchedPatterns.filter((pattern) => pattern.handles === 'compound').length,
|
|
254
|
+
scored,
|
|
255
|
+
passed,
|
|
256
|
+
failed,
|
|
257
|
+
failedRuns,
|
|
258
|
+
maskingLeaks: leaks,
|
|
259
|
+
patternMismatches,
|
|
260
|
+
thresholdsMet,
|
|
261
|
+
verdict: thresholdsMet ? 'pass' : 'fail',
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
77
265
|
function formatMachineLoad(load: MachineLoad): string {
|
|
78
266
|
return `부하 ${load.loadAverage.map((value) => value.toFixed(2)).join('/')}, ${load.coreCount}코어`;
|
|
79
267
|
}
|
|
@@ -110,7 +298,7 @@ export async function main(
|
|
|
110
298
|
const unknownArgs = process.argv.slice(2);
|
|
111
299
|
if (unknownArgs.length) {
|
|
112
300
|
throw new Error(`이 러너는 인자를 받지 않는다 — 모르는 인자 ${unknownArgs.join(' ')}. `
|
|
113
|
-
+ '설정은 환경변수다: CORPUS_CWD=<툴 작업 디렉토리> · CORPUS_PATH=<코퍼스 JSON 경로> · CORPUS_OUT=<원자료 JSON 경로> · CORPUS_TIERS · CORPUS_IDS · CORPUS_REPEATS · CORPUS_BUDGETS · CORPUS_CONCURRENCY');
|
|
301
|
+
+ '설정은 환경변수다: CORPUS_CWD=<툴 작업 디렉토리> · CORPUS_PATH=<코퍼스 JSON 경로> · CORPUS_OUT=<원자료 JSON 경로> · CORPUS_TIERS · CORPUS_IDS · CORPUS_REPEATS · CORPUS_BUDGETS · CORPUS_CONCURRENCY · CORPUS_V5=1 (v5 28문항 경로·복합 처리 채점)');
|
|
114
302
|
}
|
|
115
303
|
const corpusCwd = resolveCorpusCwdFromEnv();
|
|
116
304
|
const requestedSurface = process.env.CORPUS_SURFACE;
|
|
@@ -209,13 +397,30 @@ export async function main(
|
|
|
209
397
|
console.log(` 실패 분류 — ①미발사 ${noFire} · ②툴 오선택 ${wrong} · ③거부툴 선택 ${rejected} (측정 가능 실행 ${measurableRecords.length})\n`);
|
|
210
398
|
}
|
|
211
399
|
|
|
400
|
+
// ★ v5 28문항 경로·복합 처리 채점 — 같은 러너·같은 runEvalPrompt seam 으로 채점한다
|
|
401
|
+
// (다른 자로 재면 판정선과 비교 불가 · 형태 F3). 임계 미달은 «조용한 0» 이 아니라 거부다.
|
|
402
|
+
let v5: NlRoutingV5Score | undefined;
|
|
403
|
+
if (process.env.CORPUS_V5 === '1') {
|
|
404
|
+
v5 = await scoreNlRoutingV5({ runPrompt, surface, cwd: corpusCwd, maxTurns: budgets[0] });
|
|
405
|
+
console.log(`[v5] patterns ${v5.patterns} (path ${v5.pathPatterns} · compound ${v5.compoundPatterns}) · 문항 ${v5.questions} (path ${v5.pathQuestions} · compound ${v5.compoundQuestions}) · 채점 ${v5.scored} · 통과 ${v5.passed} · 실패 ${v5.failed.length ? v5.failed.join(',') : '(없음)'} · 실행 실패 ${v5.failedRuns} · masking-leak ${v5.maskingLeaks.length} ${v5.maskingLeaks.length ? v5.maskingLeaks.join(',') : '(없음)'} · pattern-mismatch ${v5.patternMismatches.length ? v5.patternMismatches.join(',') : '(없음)'} · 판정 ${v5.verdict}`);
|
|
406
|
+
if (!v5.thresholdsMet) {
|
|
407
|
+
throw new Error(
|
|
408
|
+
`NL routing v5 entrance stopped: 채점 문항 ${v5.scored} < ${NL_ROUTING_V5_THRESHOLDS.scored}`
|
|
409
|
+
+ ` 또는 올바른 라우팅 ${v5.passed} < ${NL_ROUTING_V5_THRESHOLDS.scored}`
|
|
410
|
+
+ ` 또는 패턴 ${v5.patterns} < ${NL_ROUTING_V5_THRESHOLDS.patterns}`
|
|
411
|
+
+ ` 또는 가림 예시 누출 ${v5.maskingLeaks.length} > ${NL_ROUTING_V5_THRESHOLDS.maskingLeaks}`
|
|
412
|
+
+ ` 또는 패턴 미발화 ${v5.patternMismatches.length}.`,
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
212
417
|
const errored = jobs.length - records.length;
|
|
213
418
|
if (errored > 0) console.log(`⚠️ 실행 실패 ${errored}건은 측정 가능 표본의 누락 실행이며 관측된 k/n 분모에서 제외했다.`);
|
|
214
419
|
const out = process.env.CORPUS_OUT;
|
|
215
420
|
// ⛔⭐ 최상위 `machineLoad` 는 **런 시작 스냅샷**이고 이름은 그대로 둔다(기존 원자료가 그 뜻으로 쓰였다).
|
|
216
421
|
// 레코드의 실제 부하는 `records[].loadAtStart`·`loadAtEnd` 다(`MEAS-T15` · 타입 주석에 표로 있다).
|
|
217
422
|
// ⛔ 별칭 필드를 나란히 두지 않는다 — 소비자 없는 중복은 **죽은 공개 필드**다(리뷰 must-fix 수용).
|
|
218
|
-
if (out) writeFileSync(out, JSON.stringify({ surface, repeats, budgets, machineLoad: load, observeOnly: safety.observeOnly, unsafeBypass: safety.bypassed, exposedMutatingTools: safety.exposedMutatingTools, surfaceToolNames, unmeasurableIds, records }, null, 2));
|
|
423
|
+
if (out) writeFileSync(out, JSON.stringify({ surface, repeats, budgets, machineLoad: load, observeOnly: safety.observeOnly, unsafeBypass: safety.bypassed, exposedMutatingTools: safety.exposedMutatingTools, surfaceToolNames, unmeasurableIds, ...(v5 ? { v5 } : {}), records }, null, 2));
|
|
219
424
|
}
|
|
220
425
|
|
|
221
426
|
if (import.meta.main) await main();
|
|
@@ -22,6 +22,7 @@ interface DocsResult {
|
|
|
22
22
|
branch?: string;
|
|
23
23
|
worktree?: string;
|
|
24
24
|
translationFallbacks?: number;
|
|
25
|
+
artifactOwner?: { runId: string; attempt: number; localBackup?: string; remoteBackup?: string; remoteHead?: string };
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
type TranslationRunner = (line: string) => string;
|
|
@@ -495,6 +496,11 @@ export function joinTui(context: GraphContext, env: NodeJS.ProcessEnv, repo: str
|
|
|
495
496
|
export function graphDocs(context: GraphContext, env: NodeJS.ProcessEnv, repo: string, run: Runner = commandRunner,
|
|
496
497
|
stateRoot = effectiveInstanceRoot()): DocsResult {
|
|
497
498
|
const version = context.input.version;
|
|
499
|
+
if (context.runId) {
|
|
500
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(context.runId))
|
|
501
|
+
return { outcome: 'error', version, error: 'invalid release runId' };
|
|
502
|
+
return graphDocsOwned(context, env, repo, run, stateRoot);
|
|
503
|
+
}
|
|
498
504
|
let tree: string | undefined;
|
|
499
505
|
// Before ANY check (and so also on every failure path): only the first docs attempt may consume a staged cache,
|
|
500
506
|
// and only when the worker won the claim; otherwise this attempt claims the slot so a late worker cannot publish.
|
|
@@ -541,6 +547,137 @@ export function graphDocs(context: GraphContext, env: NodeJS.ProcessEnv, repo: s
|
|
|
541
547
|
}
|
|
542
548
|
}
|
|
543
549
|
|
|
550
|
+
type DocsOwner = NonNullable<DocsResult['artifactOwner']>;
|
|
551
|
+
type DocsReceipt = { owner: DocsOwner; branch: string; worktree: string; outcome: 'staged' | 'pushed'; result?: DocsResult; head?: string };
|
|
552
|
+
|
|
553
|
+
/** The resume count is part of the artifact key; the first run has attempt zero. */
|
|
554
|
+
function docsAttempt(stateRoot: string, version: string, runId: string): number {
|
|
555
|
+
const path = join(stateRoot, 'release', version, 'resume-attempts', `${runId}.json`);
|
|
556
|
+
if (!existsSync(path)) return 0;
|
|
557
|
+
const value = JSON.parse(readFileSync(path, 'utf8')) as { version?: unknown; runId?: unknown; attempts?: unknown };
|
|
558
|
+
if (value.version !== version || value.runId !== runId || !Array.isArray(value.attempts)
|
|
559
|
+
|| value.attempts.some((at) => typeof at !== 'string' || !Number.isFinite(Date.parse(at))))
|
|
560
|
+
throw new Error(`invalid release resume attempts ledger: ${path}`);
|
|
561
|
+
return value.attempts.length;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
function docsReceipt(path: string): DocsReceipt | null {
|
|
565
|
+
if (!existsSync(path)) return null;
|
|
566
|
+
const value = JSON.parse(readFileSync(path, 'utf8')) as DocsReceipt;
|
|
567
|
+
if (!value || typeof value !== 'object' || !value.owner || typeof value.owner.runId !== 'string'
|
|
568
|
+
|| !Number.isSafeInteger(value.owner.attempt) || typeof value.worktree !== 'string'
|
|
569
|
+
|| typeof value.branch !== 'string' || !['staged', 'pushed'].includes(value.outcome))
|
|
570
|
+
throw new Error(`invalid docs ownership receipt: ${path}`);
|
|
571
|
+
return value;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
function remoteBranchHead(run: Runner, repo: string, branch: string): string | null {
|
|
575
|
+
const line = run('git', ['ls-remote', '--heads', 'origin', `refs/heads/${branch}`], repo).trim();
|
|
576
|
+
if (!line) return null;
|
|
577
|
+
const match = /^([0-9a-f]{40})\s+refs\/heads\/[^\s]+$/i.exec(line);
|
|
578
|
+
if (!match) throw new Error(`invalid remote docs branch response: ${line}`);
|
|
579
|
+
return match[1]!;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
function graphDocsOwned(context: GraphContext, env: NodeJS.ProcessEnv, repo: string, run: Runner, stateRoot: string): DocsResult {
|
|
583
|
+
const version = context.input.version;
|
|
584
|
+
const runId = context.runId!;
|
|
585
|
+
let tree: string | undefined;
|
|
586
|
+
let owner: DocsOwner | undefined;
|
|
587
|
+
let mayConsume = false;
|
|
588
|
+
let cacheDir: string | undefined;
|
|
589
|
+
try {
|
|
590
|
+
cacheDir = runCacheDir(env);
|
|
591
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
592
|
+
const closed = join(cacheDir, 'docs-closed');
|
|
593
|
+
const firstAttempt = !existsSync(closed);
|
|
594
|
+
writeFileSync(closed, `${new Date().toISOString()}\n`);
|
|
595
|
+
const docsWon = claimPrefetch(cacheDir, 'docs');
|
|
596
|
+
mayConsume = firstAttempt && !docsWon && readFileSync(join(cacheDir, 'claim'), 'utf8') === 'worker';
|
|
597
|
+
} catch { /* standalone graph: no prefetch slot */ }
|
|
598
|
+
try {
|
|
599
|
+
for (const node of ['gate', 'prepare', 'upgrade', 'tui']) if (context.outputs[node]?.outcome !== 'ok') throw new Error(`${node} did not pass`);
|
|
600
|
+
const attempt = docsAttempt(stateRoot, version, runId);
|
|
601
|
+
const branch = `release-docs/${version}`;
|
|
602
|
+
const receiptPath = join(stateRoot, 'release', version, 'docs-branch-owner.json');
|
|
603
|
+
const previous = docsReceipt(receiptPath);
|
|
604
|
+
const sameOwner = previous?.owner.runId === runId && previous.owner.attempt === attempt && previous.branch === branch;
|
|
605
|
+
let cached: DocsCache | null = null;
|
|
606
|
+
if (mayConsume && cacheDir) { try { cached = loadCache(cacheDir, cutFor(context, stateRoot)); } catch { cached = null; } }
|
|
607
|
+
run('git', ['fetch', 'origin', 'main'], repo);
|
|
608
|
+
const main = run('git', ['rev-parse', '--verify', 'origin/main^{commit}'], repo);
|
|
609
|
+
if (!SHA.test(main)) throw new Error('invalid origin/main commit');
|
|
610
|
+
let local = '';
|
|
611
|
+
try { local = run('git', ['show-ref', '--verify', '--hash', `refs/heads/${branch}`], repo).trim(); }
|
|
612
|
+
catch { /* No local branch is the normal first-run case. */ }
|
|
613
|
+
const remote = remoteBranchHead(run, repo, branch);
|
|
614
|
+
owner = { runId, attempt };
|
|
615
|
+
if (sameOwner && local && existsSync(previous!.worktree)) {
|
|
616
|
+
tree = previous!.worktree;
|
|
617
|
+
if (run('git', ['rev-parse', '--abbrev-ref', 'HEAD'], tree) !== branch) throw new Error('docs owner worktree changed branch');
|
|
618
|
+
if (previous!.outcome === 'pushed' && previous!.head === local && remote === local && previous!.result?.outcome === 'ok')
|
|
619
|
+
return { ...previous!.result, artifactOwner: previous!.owner };
|
|
620
|
+
if (remote && run('git', ['merge-base', remote, local], repo) !== remote)
|
|
621
|
+
throw new Error(`same-run docs remote diverged: ${branch}`);
|
|
622
|
+
} else {
|
|
623
|
+
const suffix = `${runId}-${attempt}-${randomUUID()}`;
|
|
624
|
+
if (local) {
|
|
625
|
+
const localBackup = `release-docs-backup/${version}/${suffix}`;
|
|
626
|
+
run('git', ['branch', '-m', branch, localBackup], repo);
|
|
627
|
+
owner.localBackup = localBackup;
|
|
628
|
+
}
|
|
629
|
+
if (remote) {
|
|
630
|
+
const remoteBackup = `release-docs-backup/${version}/${suffix}`;
|
|
631
|
+
run('git', ['fetch', 'origin', `refs/heads/${branch}`], repo);
|
|
632
|
+
if (run('git', ['rev-parse', '--verify', 'FETCH_HEAD^{commit}'], repo) !== remote)
|
|
633
|
+
throw new Error(`remote docs branch changed while backing up: ${branch}`);
|
|
634
|
+
const changed = run('git', ['diff', '--name-only', `${main}...${remote}`], repo).split('\n').filter(Boolean);
|
|
635
|
+
if (changed.some((path) => !path.startsWith('release/public/docs/') && path !== 'website/pages.json'))
|
|
636
|
+
throw new Error(`foreign docs branch changes outside public docs: ${changed.join(', ')}`);
|
|
637
|
+
run('git', ['push', 'origin', `${remote}:refs/heads/${remoteBackup}`], repo);
|
|
638
|
+
if (remoteBranchHead(run, repo, remoteBackup) !== remote) throw new Error('remote docs backup not verified');
|
|
639
|
+
owner.remoteBackup = remoteBackup;
|
|
640
|
+
owner.remoteHead = remote;
|
|
641
|
+
}
|
|
642
|
+
const useCache = !remote && cached?.main === main && SHA.test(main);
|
|
643
|
+
if (useCache) {
|
|
644
|
+
tree = cached!.tree;
|
|
645
|
+
run('git', ['-C', tree, 'switch', '-c', branch], repo);
|
|
646
|
+
rmSync(cacheFile(cacheDir!, cached!), { force: true });
|
|
647
|
+
} else {
|
|
648
|
+
const root = mkdtempSync(join(tmpdir(), 'release-docs-'));
|
|
649
|
+
tree = join(root, 'tree');
|
|
650
|
+
run('git', ['worktree', 'add', '-b', branch, tree, main], repo);
|
|
651
|
+
}
|
|
652
|
+
// A foreign ref is incorporated by a normal merge, keeping the original branch fast-forwardable.
|
|
653
|
+
// Restore the docs inputs from main before generating this run's notes: old output is history, not input.
|
|
654
|
+
if (remote) {
|
|
655
|
+
run('git', ['merge', '--no-ff', '--no-edit', remote], tree);
|
|
656
|
+
run('git', ['restore', '--source', main, '--staged', '--worktree', '--', 'release/public/docs', 'website/pages.json'], tree);
|
|
657
|
+
}
|
|
658
|
+
const receipt: DocsReceipt = { owner, branch, worktree: tree, outcome: 'staged' };
|
|
659
|
+
mkdirSync(dirname(receiptPath), { recursive: true });
|
|
660
|
+
publish(receiptPath, receipt);
|
|
661
|
+
if (!useCache) run('bun', ['install', '--frozen-lockfile'], tree);
|
|
662
|
+
}
|
|
663
|
+
const result = cached?.tree === tree && cached.main === main ? cached.docs
|
|
664
|
+
: runDocs(['--version', version, '--base', tree, '--json'], repo, env, { stateRoot });
|
|
665
|
+
if (result.outcome !== 'ok') throw new Error(result.error ?? 'docs generation failed');
|
|
666
|
+
run('git', ['add', 'release/public/docs', 'website/pages.json'], tree);
|
|
667
|
+
const changes = run('git', ['diff', '--cached', '--name-only'], tree).trim();
|
|
668
|
+
if (changes) run('git', ['commit', '-m', `docs: release ${version}`], tree);
|
|
669
|
+
// No force: a concurrent remote update fails and leaves both branch and backup intact.
|
|
670
|
+
run('git', ['push', '-u', 'origin', branch], tree);
|
|
671
|
+
const head = run('git', ['rev-parse', '--verify', 'HEAD'], tree);
|
|
672
|
+
const output: DocsResult = { ...result, branch, worktree: tree, artifactOwner: owner };
|
|
673
|
+
publish(receiptPath, { owner, branch, worktree: tree, outcome: 'pushed', head, result: output } satisfies DocsReceipt);
|
|
674
|
+
return output;
|
|
675
|
+
} catch (error) {
|
|
676
|
+
return { outcome: 'error', version, error: error instanceof Error ? error.message : String(error),
|
|
677
|
+
...(tree ? { worktree: tree } : {}), ...(owner ? { artifactOwner: owner } : {}) };
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
|
|
544
681
|
/** Detached prefetch worker; an asynchronous spawn failure is logged as a cache miss and never escapes the node. */
|
|
545
682
|
export function startPrefetchWorker(version: string, commit: string,
|
|
546
683
|
spawnWorker: () => ReturnType<typeof spawn> = () => spawn(process.execPath, [resolve(import.meta.filename), '--prefetch-worker'], {
|
|
@@ -597,6 +734,9 @@ if (import.meta.main) {
|
|
|
597
734
|
result = { ...joinTui(context, process.env, process.cwd()), version: context.input.version } as typeof result;
|
|
598
735
|
} else if (node === 'docs') {
|
|
599
736
|
result = graphDocs(readGraphContext(), process.env, process.cwd(), commandRunner);
|
|
737
|
+
} else if (node === 'notes-repair') {
|
|
738
|
+
const { runNotesRepair } = await import('./notes-repair.js');
|
|
739
|
+
result = await runNotesRepair(readGraphContext()) as typeof result;
|
|
600
740
|
} else if (node === null) result = runDocs(process.argv.slice(2));
|
|
601
741
|
else throw new Error(`unknown release docs node: ${node}`);
|
|
602
742
|
} catch (error) {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
//
|
|
6
6
|
// Read from the tip commit's git objects, never from the working tree (the resume can run from any checkout).
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
8
9
|
import { dirname, join, normalize } from 'node:path/posix';
|
|
9
10
|
import ts from 'typescript';
|
|
10
11
|
import { sourceCandidates } from '../../src/self-implement/importer-test-index.js';
|
|
@@ -230,6 +231,53 @@ export function testsReachingChanged(tree: ClosureTree, changed: readonly string
|
|
|
230
231
|
opaqueFiles: [...opaque].filter(([file]) => !preloadClosure.has(file)).map(([file, why]) => `${file}: ${why}`).sort() };
|
|
231
232
|
}
|
|
232
233
|
|
|
234
|
+
// TRAIN-REACH-GROUPING — two PRs whose reach sets share a test ride the same release train (their gates
|
|
235
|
+
// cannot be reused independently); disjoint reach sets stay separate trains. Pure and deterministic: the
|
|
236
|
+
// ledger is derived from content alone — no file, clock, or network effects.
|
|
237
|
+
|
|
238
|
+
/** One PR's reach set for train grouping — the `tests` of a `testsReachingChanged` verdict (`ok: true`). */
|
|
239
|
+
export interface TrainReach {
|
|
240
|
+
/** The PR that owns this reach set (number or url). */
|
|
241
|
+
readonly pr: string;
|
|
242
|
+
/** 도달 시험 집합 — tests reaching the PR's changed files. */
|
|
243
|
+
readonly tests: readonly string[];
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** 묶음 원장 — train grouping ledger returned by `defineTrainGrouping`. */
|
|
247
|
+
export interface TrainGrouping {
|
|
248
|
+
/** Train id per PR — both PRs share one id when their reach sets intersect. */
|
|
249
|
+
readonly trainIds: ReadonlyMap<string, string>;
|
|
250
|
+
/** The tests both reach sets share (sorted, deduped) — empty when they stay separate trains. */
|
|
251
|
+
readonly intersection: readonly string[];
|
|
252
|
+
/** True when the reach sets intersect and the two PRs ride the same train. */
|
|
253
|
+
readonly sameTrain: boolean;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Train id derived from content — same parts give the same id; a sha256 slice keeps the ledger readable. */
|
|
257
|
+
const trainIdOf = (parts: readonly string[]): string =>
|
|
258
|
+
`train-${createHash('sha256').update(parts.join('\u0000')).digest('hex').slice(0, 12)}`;
|
|
259
|
+
|
|
260
|
+
/** Bundle two PRs' reach sets into trains: intersecting reach sets get one shared train id, disjoint reach
|
|
261
|
+
* sets keep separate per-PR ids. Deterministic and side-effect free — same inputs, same ledger. */
|
|
262
|
+
export function defineTrainGrouping(left: TrainReach, right: TrainReach): TrainGrouping {
|
|
263
|
+
const reachOf = (reach: TrainReach): string[] => [...new Set(reach.tests)].sort();
|
|
264
|
+
const leftTests = reachOf(left);
|
|
265
|
+
const rightTests = reachOf(right);
|
|
266
|
+
const rightSet = new Set(rightTests);
|
|
267
|
+
const shared = leftTests.filter((test) => rightSet.has(test));
|
|
268
|
+
const trainIds = new Map<string, string>();
|
|
269
|
+
if (shared.length > 0) {
|
|
270
|
+
const sharedId = trainIdOf(shared);
|
|
271
|
+
trainIds.set(left.pr, sharedId);
|
|
272
|
+
trainIds.set(right.pr, sharedId);
|
|
273
|
+
} else {
|
|
274
|
+
// Disjoint reach sets: mix the PR key into each id so even two empty reach sets stay separate trains.
|
|
275
|
+
trainIds.set(left.pr, trainIdOf([left.pr, ...leftTests]));
|
|
276
|
+
trainIds.set(right.pr, trainIdOf([right.pr, ...rightTests]));
|
|
277
|
+
}
|
|
278
|
+
return { trainIds, intersection: shared, sameTrain: shared.length > 0 };
|
|
279
|
+
}
|
|
280
|
+
|
|
233
281
|
/** `[test].preload` of a bunfig.toml text (repo-relative). Null when the file has a preload we cannot parse. */
|
|
234
282
|
export function bunfigPreload(text: string | undefined): string[] | null {
|
|
235
283
|
if (text === undefined) return [];
|
|
@@ -12,7 +12,8 @@ export function parseFailures(output: string): string[] {
|
|
|
12
12
|
const line = raw.trim();
|
|
13
13
|
const header = /^(?:\.\/)?((?:[\w.-]+\/)+[\w.-]+\.test\.tsx?):(?:\s|$)/.exec(line);
|
|
14
14
|
if (header) { file = header[1]; continue; }
|
|
15
|
-
|
|
15
|
+
// Line-start only: a title/body `(fail)` is not a reporter row. Trailing CR is still a real Bun fail row.
|
|
16
|
+
const failed = /^\(fail\)[ \t]+(.+?)(?:[ \t]+\[[\d.]+(?:ms|s)\])?[ \t]*\r?$/.exec(raw);
|
|
16
17
|
if (failed && file) failures.add(`${file} > ${failed[1]!.trim()}`);
|
|
17
18
|
}
|
|
18
19
|
return [...failures].sort();
|
|
@@ -22,7 +22,7 @@ const INTRO = 'The following issues are known in this release.';
|
|
|
22
22
|
const resolved = /\b(?:fixed|resolved|no longer|has been addressed|is addressed|was addressed)\b/i;
|
|
23
23
|
const unsafe = /[^\x20-\x7e]|#\d+|\/Users\/|\.test\.ts\b|\[(?:TC|MK|OP|UX|S|T|F|O)\]|\b(?:TC|MK|OP|UX)\s+track\b|\b(?:PR|pull request)\s*\d+\b|\b(?:scripts|src|test)\/\S+|\bfile:\/\/|(?<![\w:/])\/(?!\/)[\w.-]+(?:\/[\w.-]+)*|\b[A-Z]:\\(?:[^\s\\]+\\)*[^\s\\]+|\b(?:RFC|HANDOFF|MANUAL)-/i;
|
|
24
24
|
|
|
25
|
-
type Issue = { id: string; title?: string; evidence?: string; note?: string };
|
|
25
|
+
type Issue = { id: string; title?: string; evidence?: string; knownIssue?: string; note?: string };
|
|
26
26
|
|
|
27
27
|
// Accepted regressions with the same public note describe one issue, even if several gates recorded it.
|
|
28
28
|
function issueGroup(issue: Issue, checklistIssues: ReadonlySet<Issue>): string {
|
|
@@ -62,9 +62,9 @@ function generatedBullets(raw: string, sourceIds: string[]): string[] {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
function coversIssue(bullet: string, issue: Issue, others: Issue[]): boolean {
|
|
65
|
-
const source = issue.
|
|
65
|
+
const source = issue.knownIssue ?? issue.note ?? '';
|
|
66
66
|
const words = source.toLowerCase().match(/[a-z]{5,}/g) ?? [];
|
|
67
|
-
const otherWords = new Set(others.flatMap((other) => ((other.
|
|
67
|
+
const otherWords = new Set(others.flatMap((other) => ((other.knownIssue ?? other.note ?? '').toLowerCase().match(/[a-z]{5,}/g) ?? []).map((word) => word.slice(0, 5))));
|
|
68
68
|
const publicWords = new Set((bullet.toLowerCase().match(/[a-z]{5,}/g) ?? []).map((word) => word.slice(0, 5)));
|
|
69
69
|
const distinctive = [...new Set(words.map((word) => word.slice(0, 5)))].filter((word) => !otherWords.has(word));
|
|
70
70
|
const negative = /\b(?:not|never|no|cannot|can't|doesn't|don't|won't|fails? to|isn't|aren't)\b/i;
|
|
@@ -130,7 +130,9 @@ export function runKnownIssues(context: GraphContext = readGraphContext(), run:
|
|
|
130
130
|
if (context.outputs.docs?.branch !== `release-docs/${version}`) throw new Error('docs branch/version mismatch');
|
|
131
131
|
const notes = join(worktree, 'release/public/docs/releases', `${version}.md`);
|
|
132
132
|
if (!existsSync(notes)) throw new Error(`release notes missing: ${notes}`);
|
|
133
|
-
|
|
133
|
+
// A checklist title is an internal task label, not public issue copy. Missing dedicated copy
|
|
134
|
+
// means no public note row is generated for that checklist item.
|
|
135
|
+
const checklist = issues(context.outputs['checklist-gate']?.knownIssues, 'checklist').filter((issue) => typeof issue.knownIssue === 'string' && issue.knownIssue.trim()).map((issue) => ({ ...issue, title: issue.knownIssue!.trim() }));
|
|
134
136
|
const accepted = issues(context.input.acceptedRegressions, 'accepted');
|
|
135
137
|
const approved0233Batch = version === '0.2.33' && accepted.length === APPROVED_0233_INPUT.length
|
|
136
138
|
&& new Set(accepted.map((issue) => issue.id)).size === accepted.length
|