1607 Commits

Author SHA1 Message Date
HWLAB node GitOps Bot c028845195 chore: promote node GitOps source 1c67a1e 2026-07-22 22:42:58 +00:00
UniDesk Web Probe Sentinel 17b60f4711 deploy: render web-probe sentinel 6016400b5d4ed843f0be9cc346e9c291a93a5c07 2026-07-22 13:56:35 +00:00
UniDesk Web Probe Sentinel 6aea57326e deploy: render web-probe sentinel 5f43997d4a88bf74023228941cb8f9c360261584 2026-07-22 13:30:56 +00:00
UniDesk Web Probe Sentinel b94ea87d06 deploy: render web-probe sentinel c9dfd8ea578462d9658d891894e75324d9bb815e 2026-07-22 12:52:20 +00:00
HWLAB node GitOps Bot f632873ea2 chore: promote node GitOps source e2e2ef0 2026-07-22 06:33:57 +00:00
HWLAB node GitOps Bot 06057ec39b chore: promote node GitOps source 0e12cfa 2026-07-21 22:20:55 +00:00
HWLAB node GitOps Bot e4214988c6 chore: promote node GitOps source 2c7e867 2026-07-21 21:49:07 +00:00
HWLAB node GitOps Bot d802ad6d5b chore: promote node GitOps source ed0c4a7 2026-07-21 20:43:45 +00:00
HWLAB node GitOps Bot 961aa4a44f chore: promote node GitOps source 3a87d35 2026-07-10 08:44:31 +00:00
UniDesk Web Probe Sentinel 080f2c55f8 deploy: render web-probe sentinel 2eaafdb3c2744293f451b41dcd1d1d91a7078bbc 2026-07-10 08:33:57 +00:00
HWLAB node GitOps Bot 2b96c9d265 chore: promote node GitOps source 3a87d35 2026-07-10 08:32:02 +00:00
UniDesk Web Probe Sentinel 5f68eee89e deploy: render web-probe sentinel ff723ccff21ff7a08f3f3dc81812ac1c442d3c01 2026-07-10 08:19:48 +00:00
UniDesk Web Probe Sentinel 9f20995bfe deploy: render web-probe sentinel 84b26b73d0fbe05327b787969ecb1c30774b48ee 2026-07-10 08:07:05 +00:00
UniDesk Web Probe Sentinel 144559e333 deploy: render web-probe sentinel 002ad4b16a6cae7c2987e3d4dffefea8a6f19182 2026-07-10 08:03:53 +00:00
UniDesk Web Probe Sentinel 00ade0578c deploy: render web-probe sentinel ebff879da60f3386e5f8171bf9af3876aaf799ce 2026-07-10 07:47:32 +00:00
UniDesk Web Probe Sentinel 82195aa1ec deploy: render web-probe sentinel 4a49c3597743cdbd794dff66b44b576203e9adc0 2026-07-10 07:26:29 +00:00
UniDesk Web Probe Sentinel 6b3ec6c37d deploy: render web-probe sentinel aa454c6fe1d15ee9f7fdb4c2fbdbb9882902a727 2026-07-10 07:06:25 +00:00
UniDesk Web Probe Sentinel fc27742760 deploy: render web-probe sentinel bfa2ac8fac0149bb7696e9f1aa9c92c3af5117fa 2026-07-10 06:13:45 +00:00
UniDesk Web Probe Sentinel 1474f9b888 deploy: render web-probe sentinel 9a5976f7b4d12452fdc6bf86000fab0853fa4c3a 2026-07-10 06:10:01 +00:00
UniDesk Web Probe Sentinel 56602e307c deploy: render web-probe sentinel 52eddfe841c6cc3100dba51735dd1b822a74bb4a 2026-07-10 05:36:25 +00:00
UniDesk Web Probe Sentinel d4abc94d6f deploy: render web-probe sentinel d6350d0234caf4f6ecd713e72517e07e646f4937 2026-07-10 05:26:14 +00:00
UniDesk Web Probe Sentinel 105719e74e deploy: render web-probe sentinel 71ec3a62645ed6525566a52e9b3ee8f9181bec56 2026-07-10 05:10:18 +00:00
UniDesk Web Probe Sentinel 2943dc0b37 deploy: render web-probe sentinel 243c72e30145da319c6f6fdb82e92d7c221e5da4 2026-07-10 05:07:45 +00:00
UniDesk Web Probe Sentinel 95d2096057 deploy: render web-probe sentinel 19f9147d687112499b71a73f41eb2d45db6b905a 2026-07-10 05:02:46 +00:00
UniDesk Web Probe Sentinel 11057829a1 deploy: render web-probe sentinel f128d73663c20c23dc6af89f84f6ec9d89836a33 2026-07-10 04:44:59 +00:00
UniDesk Web Probe Sentinel d82aa979c3 deploy: render web-probe sentinel 19d3047e3d57dc6d350194a57875e1e5c726299f 2026-07-10 04:42:54 +00:00
UniDesk Web Probe Sentinel 1af28a2d1e deploy: render web-probe sentinel da2da4ce67d169064d140aea0759934f68b87a1a 2026-07-10 04:33:47 +00:00
UniDesk Web Probe Sentinel 0012fc3d8f deploy: render web-probe sentinel a498582be328215b41463a5689a8987e2f0d11e3 2026-07-10 04:32:01 +00:00
UniDesk Web Probe Sentinel dd86c2d802 deploy: render web-probe sentinel 0addf8d3b94505e11fc3aecd3605bc289b55aa04 2026-07-10 04:27:00 +00:00
UniDesk Web Probe Sentinel d42a22cd29 deploy: render web-probe sentinel 6846098c3ab76c72c93547b85277388f160751e2 2026-07-10 04:21:58 +00:00
UniDesk Web Probe Sentinel e6a7034406 deploy: render web-probe sentinel 1510e800fa4ad57974d032bcecff80f6282ea286 2026-07-10 03:52:55 +00:00
UniDesk Web Probe Sentinel 7e10211fb8 deploy: render web-probe sentinel 4fed5966e4c420efdb2532ea6e218dc92d0c6a65 2026-07-10 03:36:14 +00:00
UniDesk Web Probe Sentinel 0b8b090e63 deploy: render web-probe sentinel 5ab59dd63aa3f44ef3384f2199cab079b4ab5ec5 2026-07-10 03:30:16 +00:00
UniDesk Web Probe Sentinel f56a705ce0 deploy: render web-probe sentinel 976934be77f3cfc9bdc6c60df3942c6ee90693e9 2026-07-10 03:20:24 +00:00
UniDesk Web Probe Sentinel 20005048eb deploy: render web-probe sentinel 7da82fb0be2b80c64433a3d95136f56a1a44c06a 2026-07-10 03:17:19 +00:00
UniDesk Web Probe Sentinel 661ea29f19 deploy: render web-probe sentinel 46aa981320ad0790c6a9e20a544cd6cbdd134c67 2026-07-10 03:13:09 +00:00
HWLAB node GitOps Bot a35beed849 chore: promote node GitOps source 030089d 2026-07-10 03:10:51 +00:00
UniDesk Web Probe Sentinel 7baf3a3cdd deploy: render web-probe sentinel 121e36bd46cc490792b5f8945d14c6065adf82c1 2026-07-10 03:09:26 +00:00
UniDesk Web Probe Sentinel 6251c0325d deploy: render web-probe sentinel e1a59c246ecf6f694c111f1cd30af241cdea195e 2026-07-10 03:03:39 +00:00
UniDesk Web Probe Sentinel 58f2dc7bfa deploy: render web-probe sentinel fd7b031cf463e1c978b333ad08e758bba8307abf 2026-07-10 02:41:57 +00:00
UniDesk Web Probe Sentinel 4fb35914a1 deploy: render web-probe sentinel 01ff35d0f8e54cc7756b09eecb65ce4ef89458a3 2026-07-10 02:33:27 +00:00
UniDesk Web Probe Sentinel b6b87deed6 deploy: render web-probe sentinel d31ab27300a47eedf1496a4bac7672a841f4dfdc 2026-07-10 02:29:27 +00:00
UniDesk Web Probe Sentinel 1527309830 deploy: render web-probe sentinel 9f5e9fd5a6699d25623f0aa455e903ebeef36f41 2026-07-10 02:16:12 +00:00
UniDesk Web Probe Sentinel 8a168a6939 deploy: render web-probe sentinel 2521596a520e76780f475e8bfec34fcca802db1b 2026-07-10 02:11:15 +00:00
UniDesk Web Probe Sentinel 3f07739bad deploy: render web-probe sentinel f99aad46a5034a9b4e6396886c22752eafaa7465 2026-07-10 02:05:36 +00:00
UniDesk Web Probe Sentinel 950c42ecb8 deploy: render web-probe sentinel 250dc37182a97559e665c1cf3fbc47f0c78ab96c 2026-07-10 02:01:47 +00:00
UniDesk Web Probe Sentinel 8527543f9b deploy: render web-probe sentinel 4891f377ea73eac9fbf85d36fc84e9f60a4b4653 2026-07-10 01:53:05 +00:00
UniDesk Web Probe Sentinel 50827e68c6 deploy: render web-probe sentinel b198185375c3317118600f1714fafd024df662d5 2026-07-10 01:51:39 +00:00
UniDesk Web Probe Sentinel d58aba45d1 deploy: render web-probe sentinel ef67a8d56c5cafd9d88a119e271ca4c94a8bb0db 2026-07-10 01:17:47 +00:00
UniDesk Web Probe Sentinel 849cf0aa60 deploy: render web-probe sentinel 7d2de738c4d8535735c84cc327482da81fcf5c6d 2026-07-10 00:33:22 +00:00
UniDesk Web Probe Sentinel 0e58e8bd47 deploy: render web-probe sentinel 9551337ec0df0851a95726eddbb66237788fc930 2026-07-10 00:07:25 +00:00
UniDesk Web Probe Sentinel 907d18d10e deploy: render web-probe sentinel ed58c8e1133720351be0af406d2e880c7a450ac6 2026-07-09 23:57:24 +00:00
UniDesk Web Probe Sentinel 7ef281902b deploy: render web-probe sentinel 02672e07c68927c745e148027883433e2ec4afb8 2026-07-09 23:38:10 +00:00
UniDesk Web Probe Sentinel 76b0f9ca57 deploy: render web-probe sentinel 6ca7bd60f16583d946a6838509ba7f7c38431740 2026-07-09 23:37:10 +00:00
UniDesk Web Probe Sentinel a34c1f8db6 deploy: render web-probe sentinel 446a770980d478abaf4de40d4594bdf5b0156be5 2026-07-09 23:12:07 +00:00
UniDesk Web Probe Sentinel 860d53ea6f deploy: render web-probe sentinel 8983657fe3c7cc34b20fbdcab3685af5d700c3e0 2026-07-09 23:03:36 +00:00
UniDesk Web Probe Sentinel 794868cba6 deploy: render web-probe sentinel 493a6ce2dd7c8c067022ff87b53aa26845b9f77c 2026-07-09 22:49:17 +00:00
UniDesk Web Probe Sentinel 1949b53608 deploy: render web-probe sentinel 423753b4b3f836e804ff1ec27341dea7907483a8 2026-07-09 20:44:58 +00:00
HWLAB node GitOps Bot e62d5890c2 chore: promote node GitOps source 4185fef 2026-07-09 20:39:22 +00:00
HWLAB node GitOps Bot 230d083ba2 chore: promote node GitOps source ac3ebd7 2026-07-09 20:26:54 +00:00
HWLAB node GitOps Bot fdf50d1579 chore: promote node GitOps source b26eb6a 2026-07-09 20:17:56 +00:00
HWLAB node GitOps Bot 56029d84b0 chore: promote node GitOps source d7afe47 2026-07-09 19:46:03 +00:00
HWLAB node GitOps Bot 8e23f6b69f chore: promote node GitOps source dc31184 2026-07-09 19:33:02 +00:00
UniDesk Web Probe Sentinel 91db5c64ea deploy: render web-probe sentinel ac509e9dde2eddf86168dfc562873400b7779b35 2026-07-09 19:20:19 +00:00
HWLAB node GitOps Bot 785adf3328 chore: promote node GitOps source 307db9f 2026-07-09 19:08:54 +00:00
HWLAB node GitOps Bot 6c463334f2 chore: promote node GitOps source 0a89e57 2026-07-09 18:55:34 +00:00
HWLAB node GitOps Bot 84e7bdd9f7 chore: promote node GitOps source 88e8d1e 2026-07-09 18:44:25 +00:00
HWLAB node GitOps Bot 94c52c4390 chore: promote node GitOps source 557e4c0 2026-07-09 18:37:43 +00:00
UniDesk Web Probe Sentinel 9be91be640 deploy: render web-probe sentinel 3df61369f4b135671b731fc911bed885f8c48d55 2026-07-09 18:26:34 +00:00
UniDesk Web Probe Sentinel a2eb5dbe29 deploy: render web-probe sentinel 2815975c6b56833e189275b600e7b7a2e03468ec 2026-07-09 18:22:49 +00:00
HWLAB node GitOps Bot 0099498834 chore: promote node GitOps source 4a85ec9 2026-07-09 18:21:58 +00:00
UniDesk Web Probe Sentinel 0108b085a8 deploy: render web-probe sentinel c4ee6bcc90c8ab82485bddcfab465cc047243437 2026-07-09 18:14:52 +00:00
HWLAB node GitOps Bot 9b00e182a6 chore: promote node GitOps source cd4a62d 2026-07-09 18:14:11 +00:00
UniDesk Web Probe Sentinel b795f33d0a deploy: render web-probe sentinel c1f0a2ac6b4f7aecbaed7f89310106780ebbdd6b 2026-07-09 18:02:33 +00:00
HWLAB node GitOps Bot 2d2154c76b chore: promote node GitOps source 79f55cd 2026-07-09 18:02:32 +00:00
UniDesk Web Probe Sentinel 2324795630 deploy: render web-probe sentinel 56fa170782a4caebace4568af6dde1aa7fb1d987 2026-07-09 17:46:37 +00:00
UniDesk Web Probe Sentinel 4fd22383f6 deploy: render web-probe sentinel 0fcd82aa9efbd2ed996faded53725a3494d32d95 2026-07-09 17:27:58 +00:00
UniDesk Web Probe Sentinel 15af7b08fc deploy: render web-probe sentinel 9f8bad40a79a0866b8f2edd21966d5428ace3d51 2026-07-09 14:10:28 +00:00
UniDesk Web Probe Sentinel 500be6020a deploy: render web-probe sentinel ed2c6298fd144fc22da2fc74c277a9191812b1e9 2026-07-09 13:52:24 +00:00
HWLAB node GitOps Bot 56fd401d8a chore: promote node GitOps source 99d3f98 2026-07-09 13:50:59 +00:00
UniDesk Web Probe Sentinel 34b0329ac7 deploy: render web-probe sentinel 34b2b119ba36de6a4e2215b89cfabf8962da8b04 2026-07-09 13:43:48 +00:00
UniDesk Web Probe Sentinel 6fae4ec3b7 deploy: render web-probe sentinel 44b716538e68f5c7b88443fe4beea261fc0dddf9 2026-07-09 13:36:12 +00:00
UniDesk Web Probe Sentinel 3535df5972 deploy: render web-probe sentinel 61d05dccf9ee3b366b5591eb946971338090e24b 2026-07-09 13:29:02 +00:00
UniDesk Web Probe Sentinel b43e277b7c deploy: render web-probe sentinel 1e82ca62c0f47fb842704f09263c8f4a2885fb6e 2026-07-09 13:21:15 +00:00
UniDesk Web Probe Sentinel ce57e99844 deploy: render web-probe sentinel 99b394691b16bfb627291cfa39c154abe6c445ae 2026-07-09 13:16:20 +00:00
UniDesk Web Probe Sentinel 2d46ac0b91 deploy: render web-probe sentinel 07b69e7b105128fca4738b6b6458e26f76b1628e 2026-07-09 13:04:46 +00:00
UniDesk Web Probe Sentinel fecd93a463 deploy: render web-probe sentinel bc3264cc1bdaa01e316e80d76ee9d88c20af88db 2026-07-09 13:02:49 +00:00
UniDesk Web Probe Sentinel 542be91e4b deploy: render web-probe sentinel 2bcbc634e0b3b0109cd3444d5a367e240d2df36e 2026-07-09 12:46:03 +00:00
UniDesk Web Probe Sentinel 290b34ed6a deploy: render web-probe sentinel 121a28544ca8a39eea37505514b011493aa4b3d4 2026-07-09 12:41:20 +00:00
UniDesk Web Probe Sentinel 7a116fffd5 deploy: render web-probe sentinel 6860482caffe54e4a26e6ad071007aeb66a2c38c 2026-07-09 12:24:33 +00:00
UniDesk Web Probe Sentinel 9a40d7902e deploy: render web-probe sentinel dae5a15adffedd901da596a97bc2c7829c3fa174 2026-07-09 12:02:56 +00:00
HWLAB node GitOps Bot 6d90394523 chore: promote node GitOps source e0f0747 2026-07-09 12:00:06 +00:00
UniDesk Web Probe Sentinel 73aff2c391 deploy: render web-probe sentinel 3db904e3e15b102d33982293e58690126372a9ef 2026-07-09 11:41:11 +00:00
UniDesk Web Probe Sentinel f01e37e53d deploy: render web-probe sentinel 8347d5ed1b29b7133182c0d293fb2b1f46c8860f 2026-07-09 11:29:00 +00:00
UniDesk Web Probe Sentinel 5ab59ad84e deploy: render web-probe sentinel 21935e731949bc7020a1fe062dd3cbb1f687bdf4 2026-07-09 11:24:55 +00:00
UniDesk Web Probe Sentinel 4490b396ad deploy: render web-probe sentinel 19e0071dbfb19a1b384701800f8b867cc93438de 2026-07-09 11:20:09 +00:00
UniDesk Web Probe Sentinel 1dc59fc4a0 deploy: render web-probe sentinel e72fe8f0c65dba0d98b084a80da737de55624e50 2026-07-09 11:05:31 +00:00
UniDesk Web Probe Sentinel 098b0dab74 deploy: render web-probe sentinel 0415e670c0d2117145711002a62cd2d0c521c5d4 2026-07-09 10:46:19 +00:00
UniDesk Web Probe Sentinel c1c9df7a3a deploy: render web-probe sentinel 258340f84d296b1634f90ed27a8904b9bdaecad1 2026-07-09 10:08:42 +00:00
UniDesk Web Probe Sentinel e5a192b79b deploy: render web-probe sentinel e02d8206788ea470f564ccaed83bab26fcdcd698 2026-07-09 09:52:54 +00:00
UniDesk Web Probe Sentinel e8c3ab472e deploy: render web-probe sentinel df26dc232fc5f79aa3530e1730bdb91fafecf087 2026-07-09 09:52:16 +00:00
UniDesk Web Probe Sentinel b7d1a54f06 deploy: render web-probe sentinel 4c48f8f17d500b53febd1ec137c05555f33e72da 2026-07-09 09:46:49 +00:00
HWLAB node GitOps Bot 2073660f8c chore: promote node GitOps source b4acb18 2026-07-09 09:31:56 +00:00
UniDesk Web Probe Sentinel 659a1aaf96 deploy: render web-probe sentinel 9d8626399216cf3d2c4efe0aaab6e1f4d358b332 2026-07-09 08:58:59 +00:00
HWLAB node GitOps Bot 3758bcbde0 chore: promote node GitOps source 689f61b 2026-07-09 08:48:17 +00:00
HWLAB node GitOps Bot ea95bb8481 chore: promote node GitOps source 76b1c16 2026-07-09 08:31:56 +00:00
HWLAB node GitOps Bot e5a5f7f544 chore: promote node GitOps source 2b4a03e 2026-07-09 08:03:13 +00:00
HWLAB node GitOps Bot 6c8cfaf6c7 chore: promote node GitOps source aa114c1 2026-07-09 07:51:55 +00:00
UniDesk Web Probe Sentinel 0470155894 deploy: render web-probe sentinel d7f9967f68629938f1bf78fe13032c5832045b41 2026-07-09 07:15:17 +00:00
HWLAB node GitOps Bot 59e8700848 chore: promote node GitOps source 37239cc 2026-07-09 06:22:19 +00:00
HWLAB node GitOps Bot 0b61305267 chore: promote node GitOps source 37239cc 2026-07-09 04:09:23 +00:00
HWLAB node GitOps Bot 53ef81ee3d chore: promote node GitOps source 37239cc 2026-07-09 04:07:49 +00:00
UniDesk Web Probe Sentinel ade0fae5cd deploy: render web-probe sentinel 3c9227c1cef1cc94c56dededeece8f9f8dae2c9f 2026-07-09 03:43:07 +00:00
HWLAB node GitOps Bot 1825c6913b chore: promote node GitOps source cd68f02 2026-07-09 01:55:53 +00:00
UniDesk Web Probe Sentinel e3f7b5fd6e deploy: render web-probe sentinel 35b120dd8834a3bebe7ab08e7990636f27d72e95 2026-07-08 19:20:35 +00:00
HWLAB node GitOps Bot b026d92d9b chore: promote node GitOps source 6999c94 2026-07-08 19:11:59 +00:00
UniDesk Web Probe Sentinel a4a63c1b8c deploy: render web-probe sentinel 4bf02772c437793a3f89f650f04d599ec47951be 2026-07-08 19:01:24 +00:00
HWLAB node GitOps Bot 6ac5adb6f3 chore: promote node GitOps source 5b27eb6 2026-07-08 18:55:15 +00:00
HWLAB node GitOps Bot 32a6f67062 chore: promote node GitOps source f1294f6 2026-07-08 18:31:37 +00:00
HWLAB node GitOps Bot 5aec844108 chore: promote node GitOps source 3134747 2026-07-08 17:59:34 +00:00
UniDesk Web Probe Sentinel aacbb01f75 deploy: render web-probe sentinel 9ad3bbb4b4e2049d8dfee4cbe00c9d4a457d8c31 2026-07-08 06:34:00 +00:00
UniDesk Web Probe Sentinel 9fab267234 deploy: render web-probe sentinel 82ae5bdef395f2e779d070258f52b6c388c73b16 2026-07-08 06:31:02 +00:00
UniDesk Web Probe Sentinel a8b8e85a2e deploy: render web-probe sentinel 78eb3a1e20ed1c76af23c2bf5a8ed2349c277fe4 2026-07-08 06:20:18 +00:00
UniDesk Web Probe Sentinel 6d75274487 deploy: render web-probe sentinel 51d909c567007c4859274e471983d02c62581765 2026-07-08 06:16:35 +00:00
UniDesk Web Probe Sentinel 549468c44d deploy: render web-probe sentinel c772a4a351eccadf519771442d47eed14dff3ac1 2026-07-08 06:01:00 +00:00
UniDesk Web Probe Sentinel f4ad9cce60 deploy: render web-probe sentinel 7f8f9307a9ef18e86586f01992254af4a17ffc0e 2026-07-08 05:57:02 +00:00
UniDesk Web Probe Sentinel 49024a6a87 deploy: render web-probe sentinel d500c59255c789054d26f092ba32a9dcc8f47a79 2026-07-08 05:53:14 +00:00
UniDesk Web Probe Sentinel 0ea30c39c6 deploy: render web-probe sentinel defc39bc513370945a229b9047a2f51e3b98819c 2026-07-08 05:48:23 +00:00
UniDesk Web Probe Sentinel 306b7f1634 deploy: render web-probe sentinel 93b6fe3ccee10242e3fbd9a1f9c5276e0548f6dc 2026-07-08 04:40:57 +00:00
UniDesk Web Probe Sentinel 849d72b754 deploy: render web-probe sentinel faa312616ee59a39705aff4c2e46a85b5e639dc0 2026-07-08 03:52:48 +00:00
UniDesk Web Probe Sentinel 1e16b3fa8b deploy: render web-probe sentinel 0f56fcf582c354a1f3510a7741b2798b0bc1e432 2026-07-08 03:38:25 +00:00
UniDesk Web Probe Sentinel ad305fd765 deploy: render web-probe sentinel 4e884fda88dad6e84edb1b26e06b9137036f4d4a 2026-07-08 03:35:11 +00:00
UniDesk Web Probe Sentinel 01db335c03 deploy: render web-probe sentinel 5dfb78f000c69a4776a5a7c12d6218f1830e4152 2026-07-08 03:27:00 +00:00
HWLAB node GitOps Bot 1490b7fa82 chore: promote node GitOps source ccc9503 2026-07-08 03:15:11 +00:00
HWLAB node GitOps Bot cd8a704ae4 chore: promote node GitOps source ccc9503 2026-07-08 02:20:16 +00:00
HWLAB node GitOps Bot 6144cb2287 chore: promote node GitOps source ccc9503 2026-07-08 02:16:22 +00:00
HWLAB node GitOps Bot 7fb7590c03 chore: promote node GitOps source ccc9503 2026-07-08 02:01:12 +00:00
HWLAB node GitOps Bot c74f498b64 chore: promote node GitOps source ccc9503 2026-07-08 01:52:36 +00:00
HWLAB node GitOps Bot d01d8662f5 chore: promote node GitOps source ccc9503 2026-07-08 01:40:00 +00:00
HWLAB node GitOps Bot 4142d87c4d chore: promote node GitOps source ccc9503 2026-07-07 01:12:06 +00:00
UniDesk Web Probe Sentinel 1036cc6c87 deploy: render web-probe sentinel 5dfb78f000c69a4776a5a7c12d6218f1830e4152 2026-07-07 01:06:35 +00:00
HWLAB node GitOps Bot 846c319484 chore: promote node GitOps source 67fa4a4 2026-07-07 01:04:23 +00:00
HWLAB node GitOps Bot b36a6061af chore: promote node GitOps source 24f146a 2026-07-07 00:53:20 +00:00
UniDesk Web Probe Sentinel d18a7fe501 deploy: render web-probe sentinel 15a005776e5ba76a8d04162f5d0bafbd130b0bf2 2026-07-07 00:45:24 +00:00
UniDesk Web Probe Sentinel da0efc8af1 deploy: render web-probe sentinel acc21b191bb1199a377db09a3a0082eb6c9a542b 2026-07-07 00:39:34 +00:00
UniDesk Web Probe Sentinel c0fde5ef5a deploy: render web-probe sentinel 822fa517302be93470ac260ab27bb23c4adf121d 2026-07-07 00:38:58 +00:00
UniDesk Web Probe Sentinel e27f6de248 deploy: render web-probe sentinel e4bafea7dfec1e1380a0d17cfdf79ada8b2bfe07 2026-07-07 00:34:24 +00:00
HWLAB node GitOps Bot 3efe5602fb chore: promote node GitOps source 180b695 2026-07-07 00:32:19 +00:00
HWLAB node GitOps Bot f67ec533e7 chore: promote node GitOps source 0f6895d 2026-07-07 00:22:38 +00:00
HWLAB node GitOps Bot 2ee359a57c chore: promote node GitOps source 221f76a 2026-07-07 00:11:08 +00:00
HWLAB node GitOps Bot 9208e66994 chore: promote node GitOps source cf3a6f7 2026-07-07 00:01:22 +00:00
UniDesk Web Probe Sentinel 0c20ac7cb7 deploy: render web-probe sentinel 46423e046b4021ca53622d9ccc9678b607918efa 2026-07-06 23:51:06 +00:00
HWLAB node GitOps Bot ea341b3b83 chore: promote node GitOps source 1f83c57 2026-07-06 18:14:30 +00:00
UniDesk Web Probe Sentinel c077a62b7e deploy: render web-probe sentinel 51058f4635e1198bc4e312ff1269e3a8b1f1a19c 2026-07-06 17:59:45 +00:00
UniDesk Web Probe Sentinel 4a127e6c06 deploy: render web-probe sentinel 888066ddd827310a0bbf6da921a32b00950775b9 2026-07-06 17:23:54 +00:00
UniDesk Web Probe Sentinel 1d967121cd deploy: render web-probe sentinel bd8e844af6541a5b68e48623e9acffe1be5a66bf 2026-07-06 16:58:59 +00:00
HWLAB node GitOps Bot c83433cf4d chore: promote node GitOps source d591997 2026-07-06 16:49:56 +00:00
HWLAB node GitOps Bot 3d43736542 chore: promote node GitOps source 0373d49 2026-07-06 16:42:36 +00:00
UniDesk Web Probe Sentinel 68b16ce02d deploy: render web-probe sentinel def6a2c7688356a315e3a3ec1e30891a9e756dcb 2026-07-06 16:21:35 +00:00
HWLAB node GitOps Bot 6850f30a51 chore: promote node GitOps source 2738ddf 2026-07-06 15:57:07 +00:00
HWLAB node GitOps Bot 245a0109c5 chore: promote node GitOps source 690b76e 2026-07-06 15:49:17 +00:00
HWLAB node GitOps Bot ca7be31568 chore: promote node GitOps source 6b16897 2026-07-06 15:34:09 +00:00
UniDesk Web Probe Sentinel da2e442014 deploy: render web-probe sentinel 79a35183aa80eff56647aef6da25b644f586012a 2026-07-06 15:34:03 +00:00
HWLAB node GitOps Bot 9320f280ba chore: promote node GitOps source 236702b 2026-07-06 14:14:14 +00:00
HWLAB node GitOps Bot bb61637caf chore: promote node GitOps source d375165 2026-07-06 13:45:02 +00:00
HWLAB node GitOps Bot af45d249e6 chore: promote node GitOps source 44c034e 2026-07-06 10:41:19 +00:00
UniDesk Web Probe Sentinel 5d33b2d804 deploy: render web-probe sentinel a22ea24ded3dd519afed560da7b263e069581552 2026-07-06 09:51:30 +00:00
UniDesk Web Probe Sentinel 22058d5752 deploy: render web-probe sentinel 1a5ce88320c47d0b2d4b9ae48b4ee3e180df491f 2026-07-06 09:18:02 +00:00
HWLAB node GitOps Bot fb97239a97 chore: promote node GitOps source 2df720b 2026-07-06 09:06:09 +00:00
HWLAB node GitOps Bot c4544d094a chore: promote node GitOps source 9da8e74 2026-07-06 08:54:14 +00:00
HWLAB node GitOps Bot 41becc01ff chore: promote node GitOps source 5e476ae 2026-07-06 08:31:29 +00:00
HWLAB node GitOps Bot 5a0977d7e6 chore: promote node GitOps source 9ef1ae0 2026-07-06 08:05:28 +00:00
HWLAB node GitOps Bot bd48c6aae6 chore: promote node GitOps source 11bee7e 2026-07-06 07:44:39 +00:00
HWLAB node GitOps Bot b8cae20e4a chore: promote node GitOps source 2e7c55a 2026-07-06 07:11:44 +00:00
UniDesk Web Probe Sentinel 99def1fc32 deploy: render web-probe sentinel 96655f68aca897cd50ecb047ea7d705f09e3f1ed 2026-07-06 04:05:32 +00:00
HWLAB node GitOps Bot 0d16f5c99d chore: promote node GitOps source fac4b7e 2026-07-06 03:53:40 +00:00
UniDesk Web Probe Sentinel d8a878b4f6 deploy: render web-probe sentinel ddc70419883f1846d57db37b263f549d0b9f3aae 2026-07-06 03:41:06 +00:00
HWLAB node GitOps Bot 1c57102671 chore: promote node GitOps source 0740493 2026-07-06 03:37:56 +00:00
UniDesk Web Probe Sentinel 6c479154dc deploy: render web-probe sentinel 6f2933c70feacf4c1589b77bd3809c733eccfea3 2026-07-06 03:34:51 +00:00
HWLAB node GitOps Bot da84b26dca chore: promote node GitOps source b7db243 2026-07-06 03:29:19 +00:00
UniDesk Web Probe Sentinel c6743ea5eb deploy: render web-probe sentinel c51e92ed7ef8864a0038207b0aee896ec2828b06 2026-07-06 02:58:12 +00:00
HWLAB node GitOps Bot dc8e86a473 chore: promote node GitOps source effbb79 2026-07-05 23:39:45 +00:00
UniDesk Web Probe Sentinel 7c2d0ac252 deploy: render web-probe sentinel c20227b2cf762c6a5d52c0064161d7979f66cc34 2026-07-05 19:57:53 +00:00
UniDesk Web Probe Sentinel efcf415599 deploy: render web-probe sentinel c17954561e7d7ec1f7f16bc68e6e3442ef01946d 2026-07-05 19:53:14 +00:00
HWLAB node GitOps Bot f374850398 chore: promote node GitOps source effbb79 2026-07-05 19:18:47 +00:00
HWLAB node GitOps Bot 78d04430c6 chore: promote node GitOps source effbb79 2026-07-05 19:04:05 +00:00
UniDesk Web Probe Sentinel c9ab2e0911 deploy: render web-probe sentinel 5bd0f3921e0db968655a066b6de4ea69d6931b27 2026-07-05 18:24:54 +00:00
UniDesk Web Probe Sentinel c51caf4c79 deploy: render web-probe sentinel 0bb2183a78c8a74104541145fc7b895374d553da 2026-07-05 17:56:40 +00:00
UniDesk Web Probe Sentinel 2d6f3fea34 deploy: render web-probe sentinel 91bee0832fd0fa5defd39984b82b05a8f76a92a9 2026-07-05 17:52:04 +00:00
UniDesk Web Probe Sentinel 59af52dbaf deploy: render web-probe sentinel 00b7878200baf16adeea88aebc7d25c88dba7c26 2026-07-05 17:33:40 +00:00
UniDesk Web Probe Sentinel 6ba828dc6e deploy: render web-probe sentinel dd825cffa30c81a3b31419cebcecae28b63eda1d 2026-07-05 17:27:39 +00:00
UniDesk Web Probe Sentinel e3d7faf8ef deploy: render web-probe sentinel 22af7a74be364bd573f6a49460d6040461404a99 2026-07-05 17:11:50 +00:00
UniDesk Web Probe Sentinel 7ca8b4edf7 deploy: render web-probe sentinel 41414b8211c31418657a41af7b3010d5de3405a8 2026-07-05 17:04:18 +00:00
UniDesk Web Probe Sentinel c686857781 deploy: render web-probe sentinel f1cf43b42eb12b21ed6ffab50445c58007d83550 2026-07-05 16:39:36 +00:00
UniDesk Web Probe Sentinel 895fc3fa9a deploy: render web-probe sentinel 0370f1459412da80ad54435a53454b9b0d07e87c 2026-07-05 16:33:30 +00:00
UniDesk Web Probe Sentinel 4d3aa773fc deploy: render web-probe sentinel 2195a646b75665b5cf1526d269d7426629fec9c0 2026-07-05 16:15:32 +00:00
UniDesk Web Probe Sentinel c90c91d30c deploy: render web-probe sentinel c628d425a518caa326326ae14560f1b68726ae9d 2026-07-05 16:11:37 +00:00
UniDesk Web Probe Sentinel d4c296d8a8 deploy: render web-probe sentinel 79e9288d5fa40d737e3b2ebab15517cc2fd4d3eb 2026-07-05 12:49:17 +00:00
UniDesk Web Probe Sentinel 63277d533c deploy: render web-probe sentinel 3e2b28e26d6da36c7f19aa35be4b31bf1c5de5f1 2026-07-05 12:12:15 +00:00
UniDesk Web Probe Sentinel 1fc02978c4 deploy: render web-probe sentinel b19c2f8db35f2d6dc8f23eb79a9f65745c835bbd 2026-07-05 11:15:44 +00:00
UniDesk Web Probe Sentinel 13e62bdb89 deploy: render web-probe sentinel 09788a4c3c24e93fdcfc595d1bad1d3e5576b40c 2026-07-05 11:10:07 +00:00
UniDesk Web Probe Sentinel b9751d64ac deploy: render web-probe sentinel 99f5b8bc5b4c08d76b207a77537d7e04ec01cef3 2026-07-05 11:04:18 +00:00
UniDesk Web Probe Sentinel 7d564bd625 deploy: render web-probe sentinel 252525e29cca4bab81aa25910e9e424e5ad33020 2026-07-05 11:01:48 +00:00
UniDesk Web Probe Sentinel 2b6acc3db4 deploy: render web-probe sentinel d32575fff2d3117ce57738f40f11610c6ba38bcb 2026-07-05 10:57:23 +00:00
UniDesk Web Probe Sentinel f52a51d721 deploy: render web-probe sentinel 714a61d2260f06260110dda75054b234a4da785d 2026-07-05 10:56:48 +00:00
UniDesk Web Probe Sentinel 3e8e605f39 deploy: render web-probe sentinel d5a97318a336df14d4aa8555e4b94aa46002cd82 2026-07-05 09:48:03 +00:00
UniDesk Web Probe Sentinel e81b49be6c deploy: render web-probe sentinel 345b1cb7bb9639fd48d7bb2b3f07225cfa5aa1c6 2026-07-05 08:11:37 +00:00
UniDesk Web Probe Sentinel 0e47ceabed deploy: render web-probe sentinel 496b5fc729158b809b7ac6cb4388ecac1c7bc485 2026-07-05 07:07:13 +00:00
UniDesk Web Probe Sentinel d83d75b7ba deploy: render web-probe sentinel 2e00e749a5787dc6f1126a312959cddf153a6ff3 2026-07-05 06:32:01 +00:00
UniDesk Web Probe Sentinel db210bee59 deploy: render web-probe sentinel 3039195c5b3c5ebc3882588295d2c585521786eb 2026-07-05 05:54:40 +00:00
UniDesk Web Probe Sentinel a1f0fe5ce2 deploy: render web-probe sentinel ab3566435ced8780215b48eb7a1160f324c87cf8 2026-07-05 04:22:02 +00:00
HWLAB node GitOps Bot 4b6948da28 chore: promote node GitOps source effbb79 2026-07-05 03:18:10 +00:00
HWLAB node GitOps Bot aa9d1de1a4 chore: promote node GitOps source effbb79 2026-07-04 21:21:49 +00:00
UniDesk Web Probe Sentinel 2ba5ab7d84 deploy: render web-probe sentinel e956a0ec2ab5e77e15f16453da0f871f31c703eb 2026-07-04 20:57:52 +00:00
UniDesk Web Probe Sentinel 4f14245e0c deploy: render web-probe sentinel cea563402268ad57aa6104691ebad9deb727813a 2026-07-04 19:22:54 +00:00
UniDesk Web Probe Sentinel 491b10e336 deploy: render web-probe sentinel 773e8f804560cff24518127e7bb24d82c6941b2c 2026-07-04 17:58:38 +00:00
HWLAB node GitOps Bot 581160ddbd chore: promote node GitOps source effbb79 2026-07-04 17:47:27 +00:00
UniDesk Web Probe Sentinel 3073b3923e deploy: render web-probe sentinel d0e48918aebc2b09cdf196dddaae031b5e589040 2026-07-04 17:09:38 +00:00
HWLAB node GitOps Bot 576b387907 chore: promote node GitOps source effbb79 2026-07-04 16:42:56 +00:00
UniDesk Web Probe Sentinel 4aa58c7130 deploy: render web-probe sentinel e1bebbf2d4855d7e8708b99ac9d41b43c71ab5ad 2026-07-04 16:20:39 +00:00
UniDesk Web Probe Sentinel 8b3e4a9d15 deploy: render web-probe sentinel 1cd7846daf6e034438b52b4bfeeed89302fd69e1 2026-07-04 15:33:40 +00:00
UniDesk Web Probe Sentinel ab89b549d5 deploy: render web-probe sentinel 5c57dd2af25701bd27d63ef7eca1d4be24f9a689 2026-07-04 15:04:10 +00:00
UniDesk Web Probe Sentinel 14d22f608e deploy: render web-probe sentinel 09da24abd2013b6fb01681f09934f64c6f3444e5 2026-07-04 14:46:27 +00:00
UniDesk Web Probe Sentinel f88358d671 deploy: render web-probe sentinel 443602e6f2a00f40f7d88af307ff0fdeaaa5a7ec 2026-07-04 13:45:22 +00:00
UniDesk Web Probe Sentinel 3b215d8095 deploy: render web-probe sentinel 0fde347faefa4988523b03e5f3edbfd018c5533a 2026-07-04 13:09:43 +00:00
UniDesk Web Probe Sentinel bad3794aa0 deploy: render web-probe sentinel 3d52db184cffcc80de9f0cdbb1163d6a07962eba 2026-07-04 12:47:39 +00:00
HWLAB node GitOps Bot 8510777a6f chore: promote node GitOps source a939548 2026-07-04 12:30:26 +00:00
UniDesk Web Probe Sentinel 87e10394da deploy: render web-probe sentinel 79aeca5b3b198d353ac811542cc1cea86306ce43 2026-07-04 11:42:04 +00:00
UniDesk Web Probe Sentinel 205a88d33a deploy: render web-probe sentinel e0fa2258c9b91123cae98fb04a133bb2d05db09f 2026-07-04 11:34:50 +00:00
UniDesk Web Probe Sentinel af615771db deploy: render web-probe sentinel 08d5e91c5e71aabe3af58a5c7aa04e1e9d3eadab 2026-07-04 11:32:42 +00:00
UniDesk Web Probe Sentinel d4d6ef8503 deploy: render web-probe sentinel 09d7633f3d405c4ad55cacf6d805f67ea196c077 2026-07-04 11:15:04 +00:00
UniDesk Web Probe Sentinel e734433add deploy: render web-probe sentinel bdd7fcfc7beef5104d1c69adc543c39a92c1e733 2026-07-04 10:40:45 +00:00
UniDesk Web Probe Sentinel ef341dbc8c deploy: render web-probe sentinel 419ed4519bea315c41e9caf104e72eb58a6b0528 2026-07-04 09:42:13 +00:00
UniDesk Web Probe Sentinel 5804d1b8cc deploy: render web-probe sentinel 813ac9d03f6254373c93319138b4d284b0d66707 2026-07-04 09:27:20 +00:00
UniDesk Web Probe Sentinel b9d7c6f73c deploy: render web-probe sentinel 71c92a468d713188cac863c4dffc6daef62b766f 2026-07-04 09:08:27 +00:00
UniDesk Web Probe Sentinel 5eff12c669 deploy: render web-probe sentinel c1b61c72fa6c16759f078025e092f68289b45683 2026-07-04 08:42:42 +00:00
UniDesk Web Probe Sentinel 8bce0eb9ff deploy: render web-probe sentinel bab4719780dd78d6a6e954b7ac7213429209e0f0 2026-07-04 08:24:15 +00:00
UniDesk Web Probe Sentinel c974361b28 deploy: render web-probe sentinel 111aa222bb4555deb46e6a31be42996b6987ca28 2026-07-04 07:09:15 +00:00
HWLAB node GitOps Bot 90cc08305d chore: promote node GitOps source 37fdcd2 2026-07-04 07:05:09 +00:00
UniDesk Web Probe Sentinel 072fea5159 deploy: render web-probe sentinel 518f12481b899a449bca90a2cdb53c49bd75e745 2026-07-04 06:13:13 +00:00
UniDesk Web Probe Sentinel b5d5756e6f deploy: render web-probe sentinel 01a2fcfd5e763064da59c16a000598868bb2ba00 2026-07-04 05:48:56 +00:00
UniDesk Web Probe Sentinel 149e698f62 deploy: render web-probe sentinel de95cfc5fc96115be6db4db76706cc8b59756744 2026-07-04 05:47:01 +00:00
UniDesk Web Probe Sentinel b1c1c08e32 deploy: render web-probe sentinel 0b0095b7d66866b85244041a8efb507a8a314656 2026-07-04 05:43:20 +00:00
UniDesk Web Probe Sentinel d050335b72 deploy: render web-probe sentinel 49cfe7dd284915dd0fd5c5b25a8c9254450eacb7 2026-07-04 05:39:16 +00:00
UniDesk Web Probe Sentinel a0b2b54a17 deploy: render web-probe sentinel 4e6b4f133dc66ccabd21b53873432e1338c0f4a3 2026-07-04 05:37:13 +00:00
UniDesk Web Probe Sentinel bb731f1efb deploy: render web-probe sentinel 545941d5b8d48e4fdbb44ade176c0237161bc427 2026-07-04 05:33:36 +00:00
UniDesk Web Probe Sentinel ee952b4728 deploy: render web-probe sentinel 48b4116e08606ace79eafd105a271f9136b13a29 2026-07-04 05:23:13 +00:00
UniDesk Web Probe Sentinel 4db0688176 deploy: render web-probe sentinel daecbb1fc3b26a4c7f9d4e21e4025ff7b36ab516 2026-07-04 05:19:33 +00:00
UniDesk Web Probe Sentinel b826bae43f deploy: render web-probe sentinel 94ea900e4aabccfaaf48b921535dd31261b811fe 2026-07-04 04:55:19 +00:00
UniDesk Web Probe Sentinel 0a155069db deploy: render web-probe sentinel 59c0f5f564c799a6918d038a46dd54368e2cfc89 2026-07-04 04:29:07 +00:00
UniDesk Web Probe Sentinel 99845236f5 deploy: render web-probe sentinel 63e20450db1c54f4da4af8ee36a158e99679328a 2026-07-04 04:25:20 +00:00
UniDesk Web Probe Sentinel db4965f00f deploy: render web-probe sentinel b0d769176061885277235d0b5b13e884d447003f 2026-07-04 04:20:36 +00:00
UniDesk Web Probe Sentinel e5b665ef15 deploy: render web-probe sentinel 7e5707e87dbed418cf4a34e27b8bc94bcce126bc 2026-07-04 04:01:49 +00:00
UniDesk Web Probe Sentinel c69df68064 deploy: render web-probe sentinel a65804b609e2711a1c29ff36ba7e982bb053d2ee 2026-07-04 03:51:52 +00:00
UniDesk Web Probe Sentinel 31ed074b52 deploy: render web-probe sentinel 779274b26fad308e319ade9c5bf53998628c55a7 2026-07-04 03:30:16 +00:00
HWLAB node GitOps Bot 2f37aff23d chore: promote node GitOps source 8f93559 2026-07-04 03:18:10 +00:00
UniDesk Web Probe Sentinel bc0a51a658 deploy: render web-probe sentinel 17bb5c035d19a4b3d92984e4285c31406cbe9cb5 2026-07-04 03:12:14 +00:00
UniDesk Web Probe Sentinel 766abc4ec7 deploy: render web-probe sentinel 0047fc4b58ca908d929a395b63ba5539ae77df3b 2026-07-04 02:56:46 +00:00
UniDesk Web Probe Sentinel 6fa179c3d4 deploy: render web-probe sentinel 314387060538168b79474617dcb96f209c4de465 2026-07-04 02:50:02 +00:00
UniDesk Web Probe Sentinel 46fa5cfaa1 deploy: render web-probe sentinel 4af7cbb3fc03b4c16cc376fcb3482ab86bb85834 2026-07-04 02:31:14 +00:00
UniDesk Web Probe Sentinel dd9792a49a deploy: render web-probe sentinel 95c3ca76dbe8ad0ef97d9c6dc72be3ce34574e48 2026-07-04 02:27:49 +00:00
HWLAB node GitOps Bot 378d637ed2 chore: promote node GitOps source 0349460 2026-07-04 02:01:23 +00:00
UniDesk Web Probe Sentinel ccdce8e829 deploy: render web-probe sentinel bc681eddf8a60ecf5fb388e4294dcb694fae3f32 2026-07-04 01:48:10 +00:00
UniDesk Web Probe Sentinel 1c7406f5b5 deploy: render web-probe sentinel ee00a18fe33202295fec4668504041c56eefca12 2026-07-04 01:43:05 +00:00
HWLAB node GitOps Bot d909c4ea86 chore: promote node GitOps source c7cc425 2026-07-04 00:58:57 +00:00
UniDesk Web Probe Sentinel 3dd665ace9 deploy: render web-probe sentinel 4a16a1f5a0982e1affded145847f9911243869d4 2026-07-04 00:52:55 +00:00
HWLAB node GitOps Bot f8c88e3416 chore: promote node GitOps source a3f6a7c 2026-07-04 00:41:35 +00:00
UniDesk Web Probe Sentinel aa5c0e7bba deploy: render web-probe sentinel 6dbee60f0ab96bd210b514e79ffdf159e8002b56 2026-07-04 00:36:13 +00:00
UniDesk Web Probe Sentinel 327231c3cc deploy: render web-probe sentinel 7386ac25c08c5f68114c14d654557e87a9b87dcb 2026-07-04 00:12:41 +00:00
UniDesk Web Probe Sentinel bc645c3499 deploy: render web-probe sentinel 65080a5f8da916dd2d4e2bbbdf08e0ed055b50c7 2026-07-03 23:54:43 +00:00
UniDesk Web Probe Sentinel 58b53dcba6 deploy: render web-probe sentinel 2a5c8644dde6a0ee3800630e541b8a180b9a807b 2026-07-03 23:25:22 +00:00
UniDesk Web Probe Sentinel cdb673055a deploy: render web-probe sentinel 2c9f3a7c492fe84ed946973cad0935a3558bfe40 2026-07-03 23:19:10 +00:00
UniDesk Web Probe Sentinel b50245827a deploy: render web-probe sentinel a6a7326552a53980bbe8d282d65204484ed455c1 2026-07-03 23:17:50 +00:00
UniDesk Web Probe Sentinel a2cc972c5a deploy: render web-probe sentinel a96db84b4a8897b5c94aeee0dafe07c138188283 2026-07-03 21:02:33 +00:00
UniDesk Web Probe Sentinel a62d1552f6 deploy: render web-probe sentinel 61fa9aba6590649866d38b12abbaf48eba9157f0 2026-07-03 20:59:22 +00:00
UniDesk Web Probe Sentinel a5cdf1c52d deploy: render web-probe sentinel d7ff318e8c965b1d9df83265aa891d734097165c 2026-07-03 20:56:17 +00:00
UniDesk Web Probe Sentinel a102125cb9 deploy: render web-probe sentinel 3f937c8446f94ab356535fe649441aed6244f432 2026-07-03 20:54:33 +00:00
UniDesk Web Probe Sentinel adeb4829ce deploy: render web-probe sentinel 197a883ca0b56a0cbfce0bd351ad75d4d3940b73 2026-07-03 20:51:46 +00:00
UniDesk Web Probe Sentinel 4c1bddaadb deploy: render web-probe sentinel b0cb23b0e07cf53a225e409f809d561fc08d5f48 2026-07-03 20:44:22 +00:00
HWLAB node GitOps Bot d58d7ac80d chore: promote node GitOps source 72663d2 2026-07-03 20:43:28 +00:00
UniDesk Web Probe Sentinel dc9dcb8bcb deploy: render web-probe sentinel 19d270b44b2bbdc410452c6e9f54c24f16d4e54b 2026-07-03 20:18:04 +00:00
UniDesk Web Probe Sentinel 8e2d2d5197 deploy: render web-probe sentinel b3c039c8ca5224be07d85e12e8f9514c57950df7 2026-07-03 19:59:14 +00:00
UniDesk Web Probe Sentinel 759cee9845 deploy: render web-probe sentinel 20a61b47e1a662ac699bde2dc054ac74050ea1c1 2026-07-03 19:53:43 +00:00
UniDesk Web Probe Sentinel 5646937384 deploy: render web-probe sentinel ba09dfa8b220522241754ea8c48e09bd3c6ec69e 2026-07-03 19:42:50 +00:00
UniDesk Web Probe Sentinel d76c8dd00b deploy: render web-probe sentinel e9cc4f8ed32bc9cf973c3779bf378f73adf0faf4 2026-07-03 19:34:52 +00:00
UniDesk Web Probe Sentinel 3b66a456ae deploy: render web-probe sentinel 63987a83289ab08a893159bd196b0b1205bc9e9d 2026-07-03 19:24:29 +00:00
UniDesk Web Probe Sentinel eb86f81688 deploy: render web-probe sentinel 419f4502eeb7adc038e2de7b2a10736b6ddf5c6f 2026-07-03 19:19:27 +00:00
UniDesk Web Probe Sentinel 562b4618a4 deploy: render web-probe sentinel e2810d02d7d223bc67288c3e445a738bb73a04e9 2026-07-03 19:13:26 +00:00
UniDesk Web Probe Sentinel 78dfe51e86 deploy: render web-probe sentinel 4d370bd0fbc0dd379c8860e61709931cd8437106 2026-07-03 19:06:59 +00:00
UniDesk Web Probe Sentinel 2aef42109f deploy: render web-probe sentinel 979bd33a721c3a060f7fade9cb97a644cd00fbe8 2026-07-03 19:00:35 +00:00
UniDesk Web Probe Sentinel 83e9724993 deploy: render web-probe sentinel 9b158e25957196b776425eb4a1107542aaedc8e7 2026-07-03 18:56:01 +00:00
UniDesk Web Probe Sentinel b3b7063205 deploy: render web-probe sentinel 4df3d5d8bda156dcbe61ecaf2e41710299f7f0c5 2026-07-03 18:49:19 +00:00
HWLAB node GitOps Bot 9cde620457 chore: promote node GitOps source 8c49eba 2026-07-03 18:48:36 +00:00
UniDesk Web Probe Sentinel 482f7b7984 deploy: render web-probe sentinel 668d8317a3e5239f866f03d7dbe6f935520724e9 2026-07-03 18:43:40 +00:00
UniDesk Web Probe Sentinel 2198423203 deploy: render web-probe sentinel 9c61bf731564c8725862ea74b608934cf9fa3ac9 2026-07-03 18:33:05 +00:00
UniDesk Web Probe Sentinel c6a710c184 deploy: render web-probe sentinel d2213bab59d48eadd96307663ba25b903ee65fd9 2026-07-03 18:27:50 +00:00
UniDesk Web Probe Sentinel 3252e2ec68 deploy: render web-probe sentinel dc488302b822060cbef9c6c89a6cb1146de2b191 2026-07-03 18:21:31 +00:00
UniDesk Web Probe Sentinel df11952d18 deploy: render web-probe sentinel c0062455fd06a10f8b0bf07e92c84c3a0ca673e9 2026-07-03 18:15:09 +00:00
UniDesk Web Probe Sentinel d703707f33 deploy: render web-probe sentinel 530e02a24326024ef9e91f7f9ef6838eb66bb4eb 2026-07-03 18:11:09 +00:00
UniDesk Web Probe Sentinel cbbf9ac741 deploy: render web-probe sentinel d13dea783ee7aa313da982019f84570efb712aa2 2026-07-03 18:08:18 +00:00
UniDesk Web Probe Sentinel de9803b16a deploy: render web-probe sentinel c94f83d3f00a62db0bc1bcd3722f99bd0ea242a5 2026-07-03 18:05:50 +00:00
UniDesk Web Probe Sentinel 82add7293a deploy: render web-probe sentinel 917cba665902eae80c5362b15d3d057a6969f07b 2026-07-03 17:57:43 +00:00
UniDesk Web Probe Sentinel fe4705cbdc deploy: render web-probe sentinel b98b131bb7c26084da325d6a97a67ab8425cf8a1 2026-07-03 17:38:09 +00:00
UniDesk Web Probe Sentinel 44ae32615a deploy: render web-probe sentinel 45026b97a74271048875754172a033bb2672f7a7 2026-07-03 17:35:32 +00:00
UniDesk Web Probe Sentinel 799c2c8fc0 deploy: render web-probe sentinel babcb7b3649e5517021728d4958f78e4dc4267ee 2026-07-03 17:33:02 +00:00
UniDesk Web Probe Sentinel 9cf13583bf deploy: render web-probe sentinel 72f6a7a0e4afeb70c2c090937504e18db973f720 2026-07-03 17:24:56 +00:00
UniDesk Web Probe Sentinel 6fba28af03 deploy: render web-probe sentinel cf9454d274ebd1c0dfea7e1d98cd4a5edbdbc990 2026-07-03 17:22:23 +00:00
UniDesk Web Probe Sentinel 2a3dbe89ce deploy: render web-probe sentinel 2dfc2673694ac6862d0032b1f08d9b2f26f584e5 2026-07-03 17:15:37 +00:00
UniDesk Web Probe Sentinel e7001331d8 deploy: render web-probe sentinel d6de64079653009bc46a27c2b4072082746f0b86 2026-07-03 17:08:40 +00:00
UniDesk Web Probe Sentinel 3b48a5a740 deploy: render web-probe sentinel 424dd5c9ff2894bdb2960a37dd94c10df16add3d 2026-07-03 17:03:10 +00:00
UniDesk Web Probe Sentinel 1d20d72aa3 deploy: render web-probe sentinel 062857c1d3880e1494aba7f743dbf01ab18d02ce 2026-07-03 17:00:22 +00:00
UniDesk Web Probe Sentinel 137cfbb73b deploy: render web-probe sentinel b480ed907b8b1ec214e97c61d61a6d795127e1ac 2026-07-03 16:46:59 +00:00
HWLAB node GitOps Bot 27595e95be chore: promote node GitOps source 70e5e7e 2026-07-03 16:45:20 +00:00
UniDesk Web Probe Sentinel 72c191fe02 deploy: render web-probe sentinel 9d7331230ea8cf84317ff40d0ca81c68a23a869a 2026-07-03 16:33:48 +00:00
UniDesk Web Probe Sentinel cb9d053ebe deploy: render web-probe sentinel 528481ee267e9323c3feef6a47b902b5a7255be7 2026-07-03 16:19:39 +00:00
UniDesk Web Probe Sentinel 1487400126 deploy: render web-probe sentinel 6ccbf2677b617f8d27f0a0e9dd7a45ba2dc916e1 2026-07-03 16:15:14 +00:00
UniDesk Web Probe Sentinel cc26a3a93f deploy: render web-probe sentinel e973b73dbc7df3f8ce16afdd9df30c06d7fd0112 2026-07-03 15:51:58 +00:00
UniDesk Web Probe Sentinel bd5ed242eb deploy: render web-probe sentinel e20739a0f24661c455fc971a785ad1fb5808cf48 2026-07-03 15:27:11 +00:00
UniDesk Web Probe Sentinel b82d40632f deploy: render web-probe sentinel 022501b1b3a001360267f583a33a2f20f4ada427 2026-07-03 14:54:15 +00:00
UniDesk Web Probe Sentinel f1a4ca1eab deploy: render web-probe sentinel fd5f2379f03bb793742fbf6d41a603a32b452452 2026-07-03 14:40:27 +00:00
HWLAB node GitOps Bot ad1755b7f8 chore: promote node GitOps source 71f834c 2026-07-03 14:38:16 +00:00
UniDesk Web Probe Sentinel c1037516eb deploy: render web-probe sentinel 4f13ce9d09f306db110b73cfa2449b66b0dc468c 2026-07-03 14:35:58 +00:00
UniDesk Web Probe Sentinel 60d6f30b07 deploy: render web-probe sentinel 69620e53589455b6dc96a0e86eaffb09402e81f4 2026-07-03 14:33:16 +00:00
UniDesk Web Probe Sentinel 5cde33625e deploy: render web-probe sentinel bae8fcdf9733b0326223447616280e4802bc7a90 2026-07-03 14:29:45 +00:00
UniDesk Web Probe Sentinel a356aa6d0f deploy: render web-probe sentinel 1f1c76941de527ada5ba7349d1306f8af8e5d707 2026-07-03 14:27:36 +00:00
UniDesk Web Probe Sentinel 4d728c9738 deploy: render web-probe sentinel f3fccb8f356c75dab3321dfc9e125e254c19e3c4 2026-07-03 14:23:05 +00:00
UniDesk Web Probe Sentinel f6effe5f35 deploy: render web-probe sentinel 7751cc167b2746c91091e283cd02d9b11f68d4b0 2026-07-03 13:56:19 +00:00
UniDesk Web Probe Sentinel d09507d1c0 deploy: render web-probe sentinel 63040ba28c629e88ce0e0dba1fa1ac327badb5cc 2026-07-03 13:24:12 +00:00
HWLAB node GitOps Bot d7cd769482 chore: promote node GitOps source 8568bb4 2026-07-03 13:06:44 +00:00
UniDesk Web Probe Sentinel b2d1530ec7 deploy: render web-probe sentinel 7c43716b3c8ec560b6f5238d7b4f4de97330637b 2026-07-03 13:01:47 +00:00
UniDesk Web Probe Sentinel ecb07d2c7c deploy: render web-probe sentinel 4b1b173b3fcc11f021b20fc9628e0c16ac85019c 2026-07-03 12:53:50 +00:00
HWLAB node GitOps Bot 7287476f31 chore: promote node GitOps source cd2919a 2026-07-03 12:48:39 +00:00
UniDesk Web Probe Sentinel 9278df26fb deploy: render web-probe sentinel 5e513990dd163a29c7c5b7c1f1954e23c9ed76bd 2026-07-03 12:43:13 +00:00
HWLAB node GitOps Bot dd84bcf1d2 chore: promote node GitOps source b5bb1a8 2026-07-03 12:09:34 +00:00
UniDesk Web Probe Sentinel 0ccdb74865 deploy: render web-probe sentinel 5d6edbdfe4edf1f7ffabc7810d9c915b20b161c7 2026-07-03 12:06:43 +00:00
UniDesk Web Probe Sentinel cc33c777bd deploy: render web-probe sentinel 67008b9f892bf970706e82289a20b29973dbe3ce 2026-07-03 11:58:27 +00:00
UniDesk Web Probe Sentinel 855a989a95 deploy: render web-probe sentinel 8162f2f999b37e06b2166d87273e5e2ee356eea8 2026-07-03 11:49:32 +00:00
UniDesk Web Probe Sentinel a7242ad3a0 deploy: render web-probe sentinel 75f205a53990aae20fefbb6ceed78ac8e156e812 2026-07-03 11:45:10 +00:00
UniDesk Web Probe Sentinel 7f65d74d7a deploy: render web-probe sentinel 76c2a589964470625e0c499eaac26982cc60167c 2026-07-03 11:42:33 +00:00
UniDesk Web Probe Sentinel 88a257c681 deploy: render web-probe sentinel e0d83d1d4a5e717e63aefb9acbf0ec4660e247f6 2026-07-03 11:39:00 +00:00
UniDesk Web Probe Sentinel 9574dedcd3 deploy: render web-probe sentinel c9824a5847655b0702242ff9aee1d9d657618401 2026-07-03 11:36:13 +00:00
UniDesk Web Probe Sentinel ccee1176b2 deploy: render web-probe sentinel 8557ab355379477b9a6c8c6cfd1f60b106e08e61 2026-07-03 11:32:47 +00:00
UniDesk Web Probe Sentinel 4b44b39662 deploy: render web-probe sentinel 63de02e3a2ed522d30ae3b7cc7161822996f186f 2026-07-03 11:27:29 +00:00
UniDesk Web Probe Sentinel ebba30eaa3 deploy: render web-probe sentinel c754549df2f2a83d51f87d79bef210030905c266 2026-07-03 11:07:21 +00:00
UniDesk Web Probe Sentinel 80028663ac deploy: render web-probe sentinel 9a3d665303a368220ef0bce33e8cfd5f8340e462 2026-07-03 11:01:19 +00:00
UniDesk Web Probe Sentinel 8734c84577 deploy: render web-probe sentinel a70bc3e196055b4286de67b284eb55ee938b636d 2026-07-03 10:22:32 +00:00
UniDesk Web Probe Sentinel c483c81894 deploy: render web-probe sentinel b7f16084d36518cb871b5f822680147a4e1c3f09 2026-07-03 09:44:21 +00:00
UniDesk Web Probe Sentinel 354d197b78 deploy: render web-probe sentinel 126133138b88872510dc7b690411f9e20b4d98c4 2026-07-03 09:31:31 +00:00
UniDesk Web Probe Sentinel 6f2d524bd5 deploy: render web-probe sentinel eea8ef9fec654e257c423b2c4142c3f4f7c69da7 2026-07-03 09:26:34 +00:00
HWLAB node GitOps Bot 4b389270b0 chore: promote node GitOps source 209420a 2026-07-03 09:20:19 +00:00
UniDesk Web Probe Sentinel 2bf42d5673 deploy: render web-probe sentinel 0e75edd2c4f584f1c1da8e40fdb3082f14b67271 2026-07-03 09:18:08 +00:00
UniDesk Web Probe Sentinel 01973467f9 deploy: render web-probe sentinel 291e61e63825f5003ad2d5e37024bac5ff9af468 2026-07-03 09:02:45 +00:00
UniDesk Web Probe Sentinel 863167d1ee deploy: render web-probe sentinel af7eadfe9ec0278a6e342ed451ba53e6c65d2073 2026-07-03 08:57:59 +00:00
UniDesk Web Probe Sentinel 1ebba3b26c deploy: render web-probe sentinel 0136b5da7dd7f2f0c8ee42b0914ff2b6789b962b 2026-07-03 08:44:30 +00:00
UniDesk Web Probe Sentinel d3c46befb0 deploy: render web-probe sentinel a571c9e247fc5070e500bd74d19ef85299cbe6a4 2026-07-03 08:28:50 +00:00
UniDesk Web Probe Sentinel 2d38e065a8 deploy: render web-probe sentinel dbe7e92af5ea20214ce77646e8add8bf03999fd8 2026-07-03 08:00:03 +00:00
UniDesk Web Probe Sentinel dd2548bd0c deploy: render web-probe sentinel 901bd606516565d95705c678c270246a66ccf613 2026-07-03 07:53:53 +00:00
UniDesk Web Probe Sentinel a382f4e149 deploy: render web-probe sentinel 227ea2b4fa1c236f51ab63e35afd878bb1b5aef8 2026-07-03 07:48:33 +00:00
UniDesk Web Probe Sentinel 983ee3848d deploy: render web-probe sentinel 37ca877a48ff3385699ac8ec2923e33ea5c0cd37 2026-07-03 07:43:44 +00:00
UniDesk Web Probe Sentinel a68fbeac1e deploy: render web-probe sentinel 5f3a7fd85d070bc40539848238bb8004e714635f 2026-07-03 05:52:12 +00:00
UniDesk Web Probe Sentinel c9ab941cc0 deploy: render web-probe sentinel 09f54c493ce1c7e32b4ad604c51614cd154f962d 2026-07-03 05:48:55 +00:00
UniDesk Web Probe Sentinel 8297d75584 deploy: render web-probe sentinel fb48c624f419ec1f7561b27fa7ca3903232623e2 2026-07-03 05:39:25 +00:00
UniDesk Web Probe Sentinel 9b54a96718 deploy: render web-probe sentinel d45d4b76f1cb7479ab40c2bbd1efaa2b2c404508 2026-07-03 05:34:58 +00:00
HWLAB node GitOps Bot 75706a631d chore: promote node GitOps source b2ae0b2 2026-07-02 22:27:52 +00:00
HWLAB node GitOps Bot 9edef7e56c chore: promote node GitOps source f9e99a7 2026-07-02 21:58:48 +00:00
HWLAB node GitOps Bot 343a3511e7 chore: promote node GitOps source 17cf5fd 2026-07-02 20:58:04 +00:00
HWLAB node GitOps Bot db203d6bdc chore: promote node GitOps source a0b9990 2026-07-02 20:14:18 +00:00
HWLAB node GitOps Bot b91607ca0c chore: promote node GitOps source a1cec08 2026-07-02 19:29:08 +00:00
HWLAB node GitOps Bot 4cb6bd1f64 chore: promote node GitOps source 9ff5045 2026-07-02 18:52:45 +00:00
HWLAB node GitOps Bot 5d198f7e49 chore: promote node GitOps source 9ff5045 2026-07-02 18:41:34 +00:00
HWLAB node GitOps Bot f5b8668257 chore: promote node GitOps source 600e679 2026-07-02 17:36:24 +00:00
HWLAB node GitOps Bot 0daae9ae01 chore: promote node GitOps source 1374adf 2026-07-02 16:26:04 +00:00
HWLAB node GitOps Bot 4b2fca181a chore: promote node GitOps source 144506a 2026-07-02 15:49:19 +00:00
HWLAB node GitOps Bot 00bb508acd chore: promote node GitOps source aadb61d 2026-07-02 14:52:59 +00:00
HWLAB node GitOps Bot e85382c681 chore: promote node GitOps source bc489f8 2026-07-02 13:50:47 +00:00
HWLAB node GitOps Bot 7b5e4b737e chore: promote node GitOps source c2629b7 2026-07-02 13:01:25 +00:00
HWLAB node GitOps Bot 7060ffd519 chore: promote node GitOps source bbd608b 2026-07-02 11:58:29 +00:00
HWLAB node GitOps Bot a017c0f315 chore: promote node GitOps source 2014d82 2026-07-02 11:34:46 +00:00
UniDesk Web Probe Sentinel 18f9b08da3 deploy: render web-probe sentinel a88f6ef3631f9bd7ffc1f8b33d91708730d853bb 2026-07-02 11:16:00 +00:00
UniDesk Web Probe Sentinel d4e89828a7 deploy: render web-probe sentinel acb60dc60d3a4bd0bd0158fce5c6c8b61a5a3eaf 2026-07-02 07:37:15 +00:00
UniDesk Web Probe Sentinel b21237a658 deploy: render web-probe sentinel 9522764d552dccb6c88f4936d2d7d8ca34e5e7e2 2026-07-02 06:09:17 +00:00
UniDesk Web Probe Sentinel f6317b88fa deploy: render web-probe sentinel 4f01a59b7af001e98d86a31691317d4cc4ea1022 2026-07-02 05:49:52 +00:00
UniDesk Web Probe Sentinel faa5586cf1 deploy: render web-probe sentinel c83f4994f5e84433b27d1e44a80a775c1096708f 2026-07-02 05:44:45 +00:00
UniDesk Web Probe Sentinel 715d162c45 deploy: render web-probe sentinel 7a36978daa85083054256ed38113dab31f295096 2026-07-02 05:35:22 +00:00
UniDesk Web Probe Sentinel 4c271b0bdf deploy: render web-probe sentinel df8e1ee5e6fd313b37785c421a0213d2e19ab5ea 2026-07-02 05:12:49 +00:00
UniDesk Web Probe Sentinel 57e6df40fa deploy: render web-probe sentinel d874bf1fe0fd4cd98acff92d1d04a90982ff7557 2026-07-02 04:55:29 +00:00
HWLAB node GitOps Bot 4355359f2c chore: promote node GitOps source a2d5cff 2026-07-02 04:22:35 +00:00
HWLAB node GitOps Bot 2b98310abb chore: promote node GitOps source 0eec187 2026-07-02 03:44:52 +00:00
HWLAB node GitOps Bot ba3da085f2 chore: promote node GitOps source 876acc2 2026-07-02 02:46:15 +00:00
UniDesk Web Probe Sentinel 5129050ba7 deploy: render web-probe sentinel 2750834b23e4990793e5dcd33eaff6c7efcf8962 2026-07-02 00:46:08 +00:00
UniDesk Web Probe Sentinel a3ff17518c deploy: render web-probe sentinel 7056dd6040791d5e5b6a761a6ea1a65ed36dfa06 2026-07-02 00:39:11 +00:00
UniDesk Web Probe Sentinel 4ab2ea2b9a deploy: render web-probe sentinel 47f7482bf5f031f83754351305b2a7542c81514d 2026-07-02 00:35:32 +00:00
UniDesk Web Probe Sentinel f1f9337cfa deploy: render web-probe sentinel 67c943928b8fe41392ef3dbb2575e19e7301f099 2026-07-02 00:31:21 +00:00
UniDesk Web Probe Sentinel 6cf7f4377c deploy: render web-probe sentinel fcf67931203989dd3fb399aa40a160121f64d567 2026-07-01 16:41:17 +00:00
UniDesk Web Probe Sentinel 52d0649a01 deploy: render web-probe sentinel 0dcdf0f5f753c44017f278303c7f9c93b2c529c8 2026-07-01 16:18:30 +00:00
HWLAB node GitOps Bot 4ddaeee846 chore: promote node GitOps source 8b6c2ea 2026-07-01 13:58:34 +00:00
UniDesk Web Probe Sentinel 2eaa08cf16 deploy: render web-probe sentinel ff2697358ee8731ff31eddc0f4ef566cafd15fb7 2026-07-01 12:20:26 +00:00
UniDesk Web Probe Sentinel 8663c51444 deploy: render web-probe sentinel 0ae78ecc8528bd75a393c8d5c9de468998295779 2026-07-01 12:08:18 +00:00
HWLAB node GitOps Bot f8e940f085 chore: promote node GitOps source 5428fff 2026-07-01 12:08:00 +00:00
UniDesk Web Probe Sentinel 59994155ef deploy: render web-probe sentinel da8f990319713e5dbb6f98f83a7b219516acc7e5 2026-07-01 12:00:51 +00:00
UniDesk Web Probe Sentinel f33a174a34 deploy: render web-probe sentinel 58ed8c91e2074975cc81a5a025818dad26b5b32d 2026-07-01 11:52:55 +00:00
UniDesk Web Probe Sentinel 6a3425e06a deploy: render web-probe sentinel cf728cff60528cc0417f545450e0748e7b8e4144 2026-07-01 11:44:48 +00:00
UniDesk Web Probe Sentinel ce4eec50d5 deploy: render web-probe sentinel a071d1e33ed7aa2dfcf62d9ad145d15e450062c4 2026-07-01 11:24:59 +00:00
UniDesk Web Probe Sentinel 3c693710ec deploy: render web-probe sentinel 83f93b54e8d1f147153fb09caa64e50e1609379a 2026-07-01 10:56:34 +00:00
UniDesk Web Probe Sentinel 829a398de8 deploy: render web-probe sentinel 79e419ce98460e8d58f478ff608c088a7a10b8fe 2026-07-01 10:15:13 +00:00
HWLAB node GitOps Bot 32912d1704 chore: promote node GitOps source 9fc4671 2026-07-01 10:09:59 +00:00
UniDesk Web Probe Sentinel 58f19dae5e deploy: render web-probe sentinel efb296c03d08d3c97c1f356b94075069471e054b 2026-07-01 09:47:50 +00:00
UniDesk Web Probe Sentinel 1610a63f03 deploy: render web-probe sentinel ed7225bb9a870fd03d2e34ef84ad2c556c2c8fc0 2026-07-01 09:37:01 +00:00
UniDesk Web Probe Sentinel 07b9b9ad1a deploy: render web-probe sentinel 31b6286017fea2d56512bc6a1b0210d3b9ff4f53 2026-07-01 09:22:03 +00:00
UniDesk Web Probe Sentinel 21e844b144 deploy: render web-probe sentinel b44bbc3a937fb1758bd1549bdc60988c6e6a3f9c 2026-07-01 09:15:25 +00:00
UniDesk Web Probe Sentinel 8562e55612 deploy: render web-probe sentinel 6b73dcd0c151eb1c265c95de9f44f4f2e74b5f88 2026-07-01 08:19:57 +00:00
HWLAB node GitOps Bot 46fec7f830 chore: promote node GitOps source e1caa49 2026-07-01 07:54:40 +00:00
HWLAB node GitOps Bot a03e126ce3 chore: promote node GitOps source 43436b3 2026-07-01 07:28:35 +00:00
UniDesk Web Probe Sentinel 6a08af9265 deploy: render web-probe sentinel 171887fdd4ad70d900c4a2478ff511c6395d4911 2026-07-01 07:26:50 +00:00
UniDesk Web Probe Sentinel 03f404577c deploy: render web-probe sentinel b735b74b8434b727f84ac8bfba0f78361b8e234c 2026-07-01 07:11:32 +00:00
UniDesk Web Probe Sentinel 6cd60bc29a deploy: render web-probe sentinel c7ea34f2532c49d55e414dc4f8244374fcd115d2 2026-07-01 06:45:32 +00:00
HWLAB node GitOps Bot e26980c875 chore: promote node GitOps source 4bff8c7 2026-07-01 06:41:59 +00:00
UniDesk Web Probe Sentinel d0b9a10cd7 deploy: render web-probe sentinel 89fb1131965a24ebd01caf6e4e591216a2978092 2026-07-01 04:01:59 +00:00
UniDesk Web Probe Sentinel b9e568f39c deploy: render web-probe sentinel 051426584301a21bc17c77d3f1ce9dc2902c6d4a 2026-07-01 03:51:14 +00:00
UniDesk Web Probe Sentinel bade17deca deploy: render web-probe sentinel e969e9c49a6ae079d2986cfd40a086e650c2363d 2026-07-01 03:42:06 +00:00
UniDesk Web Probe Sentinel bd8391221c deploy: render web-probe sentinel 09edf61fcf9da2b176e07a2d42e51f49355d899b 2026-07-01 03:40:00 +00:00
UniDesk Web Probe Sentinel dcfa932919 deploy: render web-probe sentinel ccf6adb68e56ffc58c39b3d3dbb4ab310a18828e 2026-07-01 03:31:45 +00:00
UniDesk Web Probe Sentinel 3af9c02f67 deploy: render web-probe sentinel bedf89625c7ef80bb14385bfe1f33bb6bbc442d5 2026-07-01 03:21:00 +00:00
UniDesk Web Probe Sentinel 35c8d73e36 deploy: render web-probe sentinel 6284cf2636876650743eb2740c7fe8be6ea8d77d 2026-07-01 03:06:21 +00:00
HWLAB node GitOps Bot f7cafa6502 chore: promote node GitOps source b9513d1 2026-07-01 03:00:40 +00:00
UniDesk Web Probe Sentinel d8a00a1f01 deploy: render web-probe sentinel a2ed11575d3c19302dd5e8d4d25a32bc2b2a5a10 2026-07-01 02:59:52 +00:00
UniDesk Web Probe Sentinel 3cc0efbf1e deploy: render web-probe sentinel 3a208bd838352a5757e65ee9631a6c6c9cda5a5d 2026-07-01 02:47:26 +00:00
UniDesk Web Probe Sentinel fe92e774db deploy: render web-probe sentinel c61ba69ce7fac58cb8feece8096de930d536d21b 2026-07-01 02:16:21 +00:00
UniDesk Web Probe Sentinel 14caafdc26 deploy: render web-probe sentinel 1f5fddd8b1e4f9e45c941fbeb12e480f3dce2f43 2026-07-01 02:14:17 +00:00
UniDesk Web Probe Sentinel 03cc9212ad deploy: render web-probe sentinel fbcf6c02bfcf902cd9274b81591b2d2c53348a16 2026-07-01 02:01:46 +00:00
UniDesk Web Probe Sentinel 138f8d94c4 deploy: render web-probe sentinel 048a26f49ff6f977d78f7577f15257a71f95fbd8 2026-07-01 01:42:33 +00:00
UniDesk Web Probe Sentinel 4c7269b6be deploy: render web-probe sentinel fdf5b44170ab742a875fca64489e84575385e4a6 2026-07-01 01:35:51 +00:00
UniDesk Web Probe Sentinel 4c6defc773 deploy: render web-probe sentinel b41a261ebbeec6a78a3b109e16f9666b8acc73bd 2026-07-01 01:19:06 +00:00
UniDesk Web Probe Sentinel a238f5d6c3 deploy: render web-probe sentinel b41a261ebbeec6a78a3b109e16f9666b8acc73bd 2026-07-01 01:00:51 +00:00
UniDesk Web Probe Sentinel 34bad0e50a deploy: render web-probe sentinel 0f087898b9a32041bf69d8d155bd30aa7614b239 2026-07-01 00:54:42 +00:00
UniDesk Web Probe Sentinel 1e517ae156 deploy: render web-probe sentinel 845ae246c269e4759c93d2b06b130576796d54f3 2026-07-01 00:40:03 +00:00
UniDesk Web Probe Sentinel b995c68312 deploy: render web-probe sentinel a20442879232369776df2fb90e09a05e3449d3e7 2026-07-01 00:31:11 +00:00
UniDesk Web Probe Sentinel e6796282af deploy: render web-probe sentinel 100a84689950c4fba67e7000cbf30342e70aa09d 2026-06-30 20:47:24 +00:00
UniDesk Web Probe Sentinel 57e658b1be deploy: render web-probe sentinel 844b669e2cba3b344ca21f1b8788a0afce477efd 2026-06-30 20:37:13 +00:00
UniDesk Web Probe Sentinel 5af500c35e deploy: render web-probe sentinel aa5ac9481eab2914023fad06b96bca0530433db6 2026-06-30 19:18:34 +00:00
UniDesk Web Probe Sentinel 53f17588c5 deploy: render web-probe sentinel 280edce231ee1c3eacb9f703116c22e59c0db382 2026-06-30 18:36:06 +00:00
HWLAB node GitOps Bot 0c92728c7b chore: promote node GitOps source d1d30d9 2026-06-30 17:51:52 +00:00
HWLAB node GitOps Bot f737f43991 chore: promote node GitOps source 5cc9152 2026-06-30 17:20:49 +00:00
HWLAB node GitOps Bot 63f4c84d70 chore: promote node GitOps source 303a839 2026-06-30 16:35:22 +00:00
HWLAB node GitOps Bot 15effd33f7 chore: promote node GitOps source 1529543 2026-06-30 14:12:09 +00:00
HWLAB node GitOps Bot 54dba570f6 chore: promote node GitOps source 6568e60 2026-06-30 13:44:36 +00:00
UniDesk Web Probe Sentinel 5d0d8998ef deploy: render web-probe sentinel 65daebf9c11551429525100366a29b65e7421ecf 2026-06-30 13:26:03 +00:00
HWLAB node GitOps Bot 9128d2a097 chore: promote node GitOps source 9a9f6af 2026-06-30 13:20:20 +00:00
HWLAB node GitOps Bot ab0c9f1bfc chore: promote node GitOps source 891809e 2026-06-30 13:12:31 +00:00
HWLAB node GitOps Bot e16fb3b6cf chore: promote node GitOps source 1d3c2ad 2026-06-30 12:49:32 +00:00
HWLAB node GitOps Bot a0138b8b0a chore: promote node GitOps source 0f5219f 2026-06-30 12:26:31 +00:00
UniDesk Web Probe Sentinel fd4426f38e deploy: render web-probe sentinel 7b17b3042b87b049f7a087493050c461e7b3bd07 2026-06-30 12:06:09 +00:00
HWLAB node GitOps Bot b9dbac1248 chore: promote node GitOps source f7839a9 2026-06-30 11:44:57 +00:00
HWLAB node GitOps Bot b0d7c83f73 chore: promote node GitOps source a2c42fa 2026-06-30 11:36:07 +00:00
UniDesk Web Probe Sentinel d98f3f6e16 deploy: render web-probe sentinel 2c6b2bf6aea23acbd46e2a8ae398abf3351eb4ab 2026-06-30 11:15:55 +00:00
HWLAB node GitOps Bot 0c31ab4bca chore: promote node GitOps source ff3d212 2026-06-30 09:09:57 +00:00
UniDesk Web Probe Sentinel 5a55747a4b deploy: render web-probe sentinel b60cd70752a6dab53fd1934350bdc277b38a8dc4 2026-06-30 08:48:12 +00:00
UniDesk Web Probe Sentinel 2084ad87f9 deploy: render web-probe sentinel 5e58a1d7e3f980d3f296a040947c1c78dc318195 2026-06-30 08:28:12 +00:00
HWLAB node GitOps Bot 9593dc1475 chore: promote node GitOps source 797e1ef 2026-06-30 07:07:56 +00:00
HWLAB node GitOps Bot e4da2bdbe6 chore: promote node GitOps source 03c99c3 2026-06-30 06:45:39 +00:00
HWLAB node GitOps Bot 12de685058 chore: promote node GitOps source a1e9a52 2026-06-30 06:21:39 +00:00
HWLAB node GitOps Bot 1835f066d2 chore: promote node GitOps source e0fd032 2026-06-30 06:11:10 +00:00
HWLAB node GitOps Bot c5e630a067 chore: promote node GitOps source ffb5645 2026-06-30 06:02:22 +00:00
UniDesk Web Probe Sentinel 7e2a224dc6 deploy: render web-probe sentinel 6e5e3d26ef8990f5e81b25ec9dcde9830ce4839c 2026-06-30 05:43:37 +00:00
UniDesk Web Probe Sentinel 2e7f45dd5d deploy: render web-probe sentinel 919e22630e2f72ab342a218af728c6549a9152e1 2026-06-30 05:35:40 +00:00
HWLAB node GitOps Bot dc362a58c5 chore: promote node GitOps source 2438c0b 2026-06-30 05:30:18 +00:00
UniDesk Web Probe Sentinel b1ee21fd04 deploy: render web-probe sentinel 800d92f4ffb8cf3f6af8bc0c7323305a02989898 2026-06-30 05:23:11 +00:00
HWLAB node GitOps Bot 4b81593594 chore: promote node GitOps source 30bc1c9 2026-06-30 05:11:44 +00:00
HWLAB node GitOps Bot 1fd667e8bf chore: promote node GitOps source 7104277 2026-06-30 05:04:31 +00:00
UniDesk Web Probe Sentinel 35bafd45f8 deploy: render web-probe sentinel 800d92f4ffb8cf3f6af8bc0c7323305a02989898 2026-06-30 04:58:53 +00:00
HWLAB node GitOps Bot f90340625d chore: promote node GitOps source 30dbd22 2026-06-30 04:58:23 +00:00
HWLAB node GitOps Bot 9681a5e0c2 chore: promote node GitOps source 6b238cc 2026-06-30 04:53:31 +00:00
HWLAB node GitOps Bot 708a3c1bd5 chore: promote node GitOps source c3cb3e4 2026-06-30 04:07:51 +00:00
HWLAB node GitOps Bot 8fcebe9193 chore: promote node GitOps source 669a748 2026-06-30 03:47:58 +00:00
HWLAB node GitOps Bot 0ca5494d44 chore: promote node GitOps source b63efab 2026-06-30 03:37:39 +00:00
HWLAB node GitOps Bot 89aabc1a4b chore: promote node GitOps source cdd782e 2026-06-30 03:25:30 +00:00
UniDesk Web Probe Sentinel 8a84cab141 deploy: render web-probe sentinel dbcbb60d4067005edfb52676ca56c960756b0185 2026-06-30 03:17:12 +00:00
UniDesk Web Probe Sentinel 5858741bb0 deploy: render web-probe sentinel c85a96b3ff58fe70e9993146128f77644fdeed7a 2026-06-30 02:53:14 +00:00
UniDesk Web Probe Sentinel bd17961289 deploy: render web-probe sentinel cee5f9aecc0736ebed2123ec78908c6c31342586 2026-06-30 02:40:07 +00:00
UniDesk Web Probe Sentinel 5cde53e621 deploy: render web-probe sentinel 25b6ca5910d7d43918efe1804a05083090f6a3ed 2026-06-30 01:39:28 +00:00
HWLAB node GitOps Bot 947867844d chore: promote node GitOps source ceab272 2026-06-30 01:35:25 +00:00
UniDesk Web Probe Sentinel 0027c67849 deploy: render web-probe sentinel e5c7bb6689a9c299add89e30f4e0f429783f9982 2026-06-30 01:28:53 +00:00
HWLAB node GitOps Bot a3bd468ef5 chore: promote node GitOps source 8423316 2026-06-29 23:07:54 +00:00
HWLAB node GitOps Bot 2f52d4e81f chore: promote node GitOps source 8423316 2026-06-29 22:47:48 +00:00
HWLAB node GitOps Bot a31dda25bf chore: promote node GitOps source 8423316 2026-06-29 22:46:56 +00:00
HWLAB node GitOps Bot 42a814b26c chore: promote node GitOps source 17777a6 2026-06-29 22:21:38 +00:00
HWLAB node GitOps Bot 86af7fd1eb chore: promote node GitOps source c1665a0 2026-06-29 19:14:37 +00:00
HWLAB node GitOps Bot c9be09b972 chore: promote node GitOps source c1665a0 2026-06-29 18:56:55 +00:00
HWLAB node GitOps Bot 508f4e2d68 chore: promote node GitOps source b706e80 2026-06-29 18:37:33 +00:00
HWLAB node GitOps Bot 4b4e99f9a7 chore: promote node GitOps source bb75ba2 2026-06-29 18:23:34 +00:00
HWLAB node GitOps Bot 2a82db7f93 chore: promote node GitOps source bb75ba2 2026-06-29 18:07:15 +00:00
HWLAB node GitOps Bot 69b24364ed chore: promote node GitOps source 5325fdf 2026-06-29 18:00:37 +00:00
HWLAB node GitOps Bot c492fa03ae chore: promote node GitOps source e02a339 2026-06-29 17:24:56 +00:00
HWLAB node GitOps Bot 0725d2921b chore: promote node GitOps source e02a339 2026-06-29 17:22:41 +00:00
HWLAB node GitOps Bot 28492de35a chore: promote node GitOps source b2d2642 2026-06-29 17:13:28 +00:00
HWLAB node GitOps Bot f91bde4e93 chore: promote node GitOps source b2d2642 2026-06-29 16:54:43 +00:00
HWLAB node GitOps Bot 44bebf5d86 chore: promote node GitOps source b2d2642 2026-06-29 16:53:50 +00:00
HWLAB node GitOps Bot 83df2dbecf chore: promote node GitOps source 98de27d 2026-06-29 16:06:55 +00:00
HWLAB node GitOps Bot 4017db3a48 chore: promote node GitOps source ce9ee52 2026-06-29 15:43:06 +00:00
UniDesk Web Probe Sentinel bac499e1e4 deploy: render web-probe sentinel e6f9ebf2270e8be9884415cc0676da07d0e44c8e 2026-06-29 13:54:33 +00:00
HWLAB node GitOps Bot 56f44e3d7d chore: promote node GitOps source 2e0d1db 2026-06-29 13:13:20 +00:00
UniDesk Web Probe Sentinel 35ecedac41 deploy: render web-probe sentinel 1733572f13967f04df99b1293f94d5517863e561 2026-06-29 13:01:05 +00:00
UniDesk Web Probe Sentinel 83dd409439 deploy: render web-probe sentinel 1733572f13967f04df99b1293f94d5517863e561 2026-06-29 13:00:44 +00:00
UniDesk Web Probe Sentinel b12e0bf459 deploy: render web-probe sentinel e4fed24e43ab3988150c2dcd05609a560a8715d6 2026-06-29 12:49:57 +00:00
UniDesk Web Probe Sentinel bc2584e802 deploy: render web-probe sentinel 50bb9fbfe86fa006f29e60a810d4bee00b1839a6 2026-06-29 12:10:22 +00:00
HWLAB node GitOps Bot 5f3deb5f65 chore: promote node GitOps source e66bd93 2026-06-29 10:52:01 +00:00
HWLAB node GitOps Bot 1173d60ada chore: promote node GitOps source e66bd93 2026-06-29 10:23:29 +00:00
UniDesk Web Probe Sentinel 30a1b97abe deploy: render web-probe sentinel dfb3cfe22fb3d80dff0ae6dcd6ca18ff07c49f4a 2026-06-29 10:08:31 +00:00
UniDesk Web Probe Sentinel b7c7f40dd5 deploy: render web-probe sentinel 53766ac01e5f656e2520ee24510769ed5dbfc097 2026-06-29 08:46:57 +00:00
UniDesk Web Probe Sentinel 8614830a87 deploy: render web-probe sentinel d6b7f70b97d31fd3506411b35cec878f93d9c6c4 2026-06-29 08:42:34 +00:00
HWLAB node GitOps Bot 5945573c81 chore: promote node GitOps source e66bd93 2026-06-29 08:32:29 +00:00
UniDesk Web Probe Sentinel 5760dd185c deploy: render web-probe sentinel aa211209546b5f04ae72686488e5636b1ba17663 2026-06-29 08:20:57 +00:00
HWLAB node GitOps Bot ba5dc3c730 chore: promote node GitOps source 1c448bc 2026-06-29 06:12:02 +00:00
HWLAB node GitOps Bot dfd888583a chore: promote node GitOps source 1c448bc 2026-06-29 05:53:00 +00:00
UniDesk Web Probe Sentinel 62c2ee2ca0 deploy: render web-probe sentinel 83f898b11ff609dc72738b57d0c23da9b9e1e8b3 2026-06-28 11:42:19 +00:00
UniDesk Web Probe Sentinel 87bc1c4c7b deploy: render web-probe sentinel 83f898b11ff609dc72738b57d0c23da9b9e1e8b3 2026-06-28 11:40:41 +00:00
HWLAB node GitOps Bot dccdcb4229 chore: promote node GitOps source 3117990 2026-06-28 11:35:04 +00:00
UniDesk Web Probe Sentinel 4be18da1bc deploy: render web-probe sentinel 0ab0146d3ef34ba362620448a2992033dd8bfd29 2026-06-28 11:30:41 +00:00
UniDesk Web Probe Sentinel fe44e08b51 deploy: render web-probe sentinel 780b5e69935859c3f99b941ad07cca9632342ea3 2026-06-28 11:20:26 +00:00
UniDesk Web Probe Sentinel 0445d23774 deploy: render web-probe sentinel f4d97774cfe5f2fcd7d533192a123515c6f8325a 2026-06-28 11:10:55 +00:00
HWLAB node GitOps Bot 640bb6866e chore: promote node GitOps source 226af8d 2026-06-28 09:50:05 +00:00
UniDesk Web Probe Sentinel a1b83b41e2 deploy: render web-probe sentinel dab32a823ef1cf88d197339c95517e6e5e00aaeb 2026-06-28 09:49:14 +00:00
UniDesk Web Probe Sentinel 9b64af06f0 deploy: render web-probe sentinel dab32a823ef1cf88d197339c95517e6e5e00aaeb 2026-06-28 09:47:25 +00:00
UniDesk Web Probe Sentinel 7d4beed5d0 deploy: render web-probe sentinel 8d8dd7b90f347933055b4cb08e7159095593d0d7 2026-06-28 09:43:50 +00:00
UniDesk Web Probe Sentinel da5e22d551 deploy: render web-probe sentinel 8d8dd7b90f347933055b4cb08e7159095593d0d7 2026-06-28 09:42:04 +00:00
UniDesk Web Probe Sentinel be8770a4f2 deploy: render web-probe sentinel 8d8dd7b90f347933055b4cb08e7159095593d0d7 2026-06-28 09:41:58 +00:00
UniDesk Web Probe Sentinel 77c592a06a deploy: render web-probe sentinel 2a180039d9c88a501096dbe19c9dc5201113dffe 2026-06-28 09:39:50 +00:00
UniDesk Web Probe Sentinel 60d162118c deploy: render web-probe sentinel 2a180039d9c88a501096dbe19c9dc5201113dffe 2026-06-28 09:38:30 +00:00
UniDesk Web Probe Sentinel ab72a90ed5 deploy: render web-probe sentinel 7ab5eb2cab98d7ab102e88e394af4c18f26990ca 2026-06-28 09:37:50 +00:00
UniDesk Web Probe Sentinel 20da1d5c6c deploy: render web-probe sentinel a37e52fe47e9ad4a40e0f036ec7f590997810154 2026-06-28 09:31:51 +00:00
UniDesk Web Probe Sentinel d029c1acc3 deploy: render web-probe sentinel 57d28533da7f219b5bc196e7941970ec52f17e10 2026-06-28 09:30:44 +00:00
UniDesk Web Probe Sentinel fef0ee5350 deploy: render web-probe sentinel 0eb700f07ed5b62bfe48ab19ed960eaf4e0c8000 2026-06-28 09:22:46 +00:00
UniDesk Web Probe Sentinel c1e00ca029 deploy: render web-probe sentinel 0eb700f07ed5b62bfe48ab19ed960eaf4e0c8000 2026-06-28 09:18:34 +00:00
UniDesk Web Probe Sentinel 7ca51e3de4 deploy: render web-probe sentinel 0eb700f07ed5b62bfe48ab19ed960eaf4e0c8000 2026-06-28 09:16:46 +00:00
UniDesk Web Probe Sentinel d7741dceff deploy: render web-probe sentinel 0eb700f07ed5b62bfe48ab19ed960eaf4e0c8000 2026-06-28 09:16:21 +00:00
UniDesk Web Probe Sentinel 5ff6884ca8 deploy: render web-probe sentinel a0c200acfbd65dad758365aad99c21cd30fe2332 2026-06-28 09:14:21 +00:00
HWLAB node GitOps Bot 4ac861352e chore: promote node GitOps source d17dd6f 2026-06-28 09:13:42 +00:00
UniDesk Web Probe Sentinel c96f81dcf9 deploy: render web-probe sentinel b57421560d56ef0d6ed2c66520eab87fe17a9d5e 2026-06-28 09:08:22 +00:00
UniDesk Web Probe Sentinel ae23760f3f deploy: render web-probe sentinel 377e07c5a4277472044b71a2ded179aeaad18f8f 2026-06-28 09:05:46 +00:00
UniDesk Web Probe Sentinel 1a31c66bb6 deploy: render web-probe sentinel 377e07c5a4277472044b71a2ded179aeaad18f8f 2026-06-28 09:03:47 +00:00
HWLAB node GitOps Bot 5bd21f0d27 chore: promote node GitOps source 5cb1a71 2026-06-28 08:56:11 +00:00
UniDesk Web Probe Sentinel 45d7a07817 deploy: render web-probe sentinel b14df0f8a0be9c729ea37c3d5ae8fedca4b31799 2026-06-28 08:54:18 +00:00
UniDesk Web Probe Sentinel 2d421b8b2f deploy: render web-probe sentinel 84a0c27ca26a095f5c5de184bd599d47e397af10 2026-06-28 08:43:43 +00:00
UniDesk Web Probe Sentinel f5e430ae44 deploy: render web-probe sentinel cda1a3b5c9dc6c4a12c03cdb137e1b524054b267 2026-06-28 08:40:42 +00:00
UniDesk Web Probe Sentinel c0ba8d2ed9 deploy: render web-probe sentinel cda1a3b5c9dc6c4a12c03cdb137e1b524054b267 2026-06-28 08:39:02 +00:00
UniDesk Web Probe Sentinel d46646dcf3 deploy: render web-probe sentinel cda1a3b5c9dc6c4a12c03cdb137e1b524054b267 2026-06-28 08:39:01 +00:00
UniDesk Web Probe Sentinel 9531afd5a9 deploy: render web-probe sentinel abf6ceb1769b85fb254045b22a8b16205775e8ea 2026-06-28 08:35:49 +00:00
UniDesk Web Probe Sentinel bf8587ed01 deploy: render web-probe sentinel df71f5f70c5aef2e0731a3baa62fe8016c28d419 2026-06-28 08:31:23 +00:00
UniDesk Web Probe Sentinel 2eacd09fbd deploy: render web-probe sentinel 29ab652ac6cb1db631a49878f3201d7d533ee536 2026-06-28 08:26:39 +00:00
UniDesk Web Probe Sentinel 1e27a47989 deploy: render web-probe sentinel 4c7c103905fd1c9163501ecb33eadd213022170b 2026-06-28 08:06:21 +00:00
UniDesk Web Probe Sentinel 2d1f894c1c deploy: render web-probe sentinel 72cbcc21f295fa8a430cdf9210f5d98c1cfe26d5 2026-06-28 07:36:00 +00:00
UniDesk Web Probe Sentinel a68cff6e04 deploy: render web-probe sentinel 7eedf05a859e684ad5ca43678fe05dc7b3f421e7 2026-06-28 07:29:00 +00:00
HWLAB node GitOps Bot 93b395c46f chore: promote node GitOps source 6978845 2026-06-28 06:48:46 +00:00
HWLAB node GitOps Bot eea98d5821 chore: promote node GitOps source 858f582 2026-06-28 06:35:08 +00:00
UniDesk Web Probe Sentinel 89f73734c3 deploy: render web-probe sentinel 2f0fe399efcbfb06091def4e943cec6689720a62 2026-06-28 06:27:40 +00:00
UniDesk Web Probe Sentinel 4473b713ec deploy: render web-probe sentinel e6b0cfcf0e7196fcc755c398c0d76d9e40ad90a8 2026-06-28 06:22:14 +00:00
UniDesk Web Probe Sentinel dc970cb623 deploy: render web-probe sentinel e2890bac646fc19417e4d9fe96cd6422ce3af3e5 2026-06-28 06:15:28 +00:00
HWLAB node GitOps Bot d88c880502 chore: promote node GitOps source 2f0c45b 2026-06-28 04:56:06 +00:00
UniDesk Web Probe Sentinel 6519c06439 deploy: render web-probe sentinel e1a86f11d19e1e6aa155421a886132f4a92b287a 2026-06-28 04:25:08 +00:00
HWLAB node GitOps Bot 9478fae74d chore: promote node GitOps source 747c0eb 2026-06-28 04:01:57 +00:00
UniDesk Web Probe Sentinel fcb39c618c deploy: render web-probe sentinel c448b1ce0168107a4516123a9efe253941f9d631 2026-06-28 03:29:36 +00:00
HWLAB node GitOps Bot b86036e7dc chore: promote node GitOps source 44f2368 2026-06-28 03:10:56 +00:00
UniDesk Web Probe Sentinel c5d3188748 deploy: render web-probe sentinel 96504d6a7448ef843aeca8d1cd7e7ec0c54047cf 2026-06-28 03:01:41 +00:00
UniDesk Web Probe Sentinel 95fb8fa56a deploy: render web-probe sentinel 96504d6a7448ef843aeca8d1cd7e7ec0c54047cf 2026-06-28 02:53:03 +00:00
UniDesk Web Probe Sentinel 68592596ab deploy: render web-probe sentinel 96504d6a7448ef843aeca8d1cd7e7ec0c54047cf 2026-06-28 02:52:44 +00:00
UniDesk Web Probe Sentinel dc7ee2aad4 deploy: render web-probe sentinel 910fdd19754d8ee72d26a7732928f7f848d4fd86 2026-06-28 02:51:38 +00:00
UniDesk Web Probe Sentinel 278e7c25eb deploy: render web-probe sentinel 5f73bf5648d2a0f1dad6fdfd6c8806b3b2a647d1 2026-06-28 02:47:50 +00:00
HWLAB node GitOps Bot 0a303b4660 chore: promote node GitOps source 44f2368 2026-06-28 02:44:28 +00:00
UniDesk Web Probe Sentinel 01fadad73d deploy: render web-probe sentinel d495b873a55f5a70dc017e2905d1c24ac3f26987 2026-06-28 02:34:51 +00:00
UniDesk Web Probe Sentinel 509c5607f9 deploy: render web-probe sentinel 645709bb62dd1917376ddb1118f528a2c710a806 2026-06-28 02:25:48 +00:00
UniDesk Web Probe Sentinel 1d74cc9a20 deploy: render web-probe sentinel 0111b6a3221d3dea48d7ff1a091e08c2c3f0e465 2026-06-28 02:15:29 +00:00
UniDesk Web Probe Sentinel 54b1945958 deploy: render web-probe sentinel def0ee9eda94707e131324f5c6de50e2ae9e7a41 2026-06-28 02:09:35 +00:00
UniDesk Web Probe Sentinel dff7ab5231 deploy: render web-probe sentinel 31aa687cd451856cc4475975931c14bcefac3d01 2026-06-28 02:04:50 +00:00
UniDesk Web Probe Sentinel c830120891 deploy: render web-probe sentinel dbf3cccf484b22e4b7df5f902585a5dbd23ea077 2026-06-28 02:00:06 +00:00
UniDesk Web Probe Sentinel 25c0957b7c deploy: render web-probe sentinel a18f940703fab53043ebf074428ad28e9bc8513d 2026-06-28 01:52:27 +00:00
UniDesk Web Probe Sentinel 4c68d1039f deploy: render web-probe sentinel ef1e430b646008a5175ad72181c99685469fc798 2026-06-28 01:48:02 +00:00
UniDesk Web Probe Sentinel e0043c73da deploy: render web-probe sentinel 4da0d879b23fa2a8a3fb75b48fd3dc7d9ad15059 2026-06-28 01:37:29 +00:00
UniDesk Web Probe Sentinel ad94164ec4 deploy: render web-probe sentinel ea1b3e9a4aa1ae963488a3e6a52ab08a9e09bab0 2026-06-28 01:35:36 +00:00
UniDesk Web Probe Sentinel 9dcd775d7c deploy: render web-probe sentinel 1ce1b560e6874863470116c2550ee9cbdbfb931f 2026-06-28 01:32:35 +00:00
UniDesk Web Probe Sentinel 1b1d1f67d9 deploy: render web-probe sentinel d66d7c4b88d3db63eb04e2aa0c8db33672ef6e71 2026-06-28 01:28:27 +00:00
UniDesk Web Probe Sentinel f92d214c0e deploy: render web-probe sentinel 290a63bc738cd4788217556a5194bc3917f9b2e5 2026-06-28 01:22:52 +00:00
UniDesk Web Probe Sentinel 4c10709817 deploy: render web-probe sentinel 290a63bc738cd4788217556a5194bc3917f9b2e5 2026-06-28 01:21:17 +00:00
UniDesk Web Probe Sentinel 2cf4bffc95 deploy: render web-probe sentinel a7b238ec0b0924fd85f1168e1a5b730c622bcc5f 2026-06-28 01:05:00 +00:00
UniDesk Web Probe Sentinel 28a57c0eca deploy: render web-probe sentinel 0b926a3332354a47e4e416a0f31d6713f3b23861 2026-06-28 00:56:46 +00:00
UniDesk Web Probe Sentinel 0ec806c770 deploy: render web-probe sentinel 0b926a3332354a47e4e416a0f31d6713f3b23861 2026-06-28 00:55:37 +00:00
UniDesk Web Probe Sentinel 29839424c0 deploy: render web-probe sentinel e7ea14da5f618392203a0234bbb51b254073b7c8 2026-06-28 00:51:24 +00:00
UniDesk Web Probe Sentinel 6497f6cce8 deploy: render web-probe sentinel e5538691f3205ec105f73afae4259d26dccb537c 2026-06-28 00:42:45 +00:00
UniDesk Web Probe Sentinel 56cb103cb9 deploy: render web-probe sentinel e5538691f3205ec105f73afae4259d26dccb537c 2026-06-28 00:41:58 +00:00
UniDesk Web Probe Sentinel 31b30eae31 deploy: render web-probe sentinel a22386bfa35d757a9436ef7ac6314124d2c00db2 2026-06-28 00:39:13 +00:00
UniDesk Web Probe Sentinel 10c6caffd4 deploy: render web-probe sentinel a22386bfa35d757a9436ef7ac6314124d2c00db2 2026-06-28 00:35:46 +00:00
UniDesk Web Probe Sentinel 2e23a76e70 deploy: render web-probe sentinel 90ab0d49916b5e238893f1e5717a8b19338680a9 2026-06-27 17:44:27 +00:00
UniDesk Web Probe Sentinel f1c5e687ec deploy: render web-probe sentinel bf9aae273967844524a5e5c64a74e18ddc0c0844 2026-06-27 17:13:36 +00:00
HWLAB node GitOps Bot f8760573b8 chore: promote node GitOps source 44f2368 2026-06-27 14:55:55 +00:00
HWLAB node GitOps Bot a97fcde57d chore: promote node GitOps source 44f2368 2026-06-27 13:35:59 +00:00
HWLAB node GitOps Bot 3d1cc155c7 chore: promote node GitOps source 367affe 2026-06-27 13:20:28 +00:00
HWLAB node GitOps Bot 039547730e chore: promote node GitOps source 367affe 2026-06-27 13:14:08 +00:00
HWLAB node GitOps Bot 39306e30d0 chore: promote node GitOps source 367affe 2026-06-27 13:06:04 +00:00
UniDesk Web Probe Sentinel 0db8e53f75 deploy: render web-probe sentinel b91f6491c42d1ee25c8042ac6102307d151b36ab 2026-06-27 09:29:57 +00:00
UniDesk Web Probe Sentinel d0c27aec08 deploy: render web-probe sentinel 2d6ad1c3b16694a08311cc60f23259e4518a6f67 2026-06-27 09:21:47 +00:00
UniDesk Web Probe Sentinel c17b50ae05 deploy: render web-probe sentinel 3469bab2bb1a113abde810415fbde9ce194e96d8 2026-06-27 09:15:41 +00:00
UniDesk Web Probe Sentinel b5fe436698 deploy: render web-probe sentinel 3469bab2bb1a113abde810415fbde9ce194e96d8 2026-06-27 09:14:50 +00:00
UniDesk Web Probe Sentinel 39947b603e deploy: render web-probe sentinel 3469bab2bb1a113abde810415fbde9ce194e96d8 2026-06-27 09:13:31 +00:00
UniDesk Web Probe Sentinel e6ce1c9cd7 deploy: render web-probe sentinel 188100369632f1276a7c2da4fa530230ecd6d5c0 2026-06-27 09:07:15 +00:00
UniDesk Web Probe Sentinel dcaba4dce5 deploy: render web-probe sentinel 188100369632f1276a7c2da4fa530230ecd6d5c0 2026-06-27 09:06:23 +00:00
UniDesk Web Probe Sentinel 81ed42595f deploy: render web-probe sentinel cb56a1ffa0036f937651a91ebef230d49a3e5470 2026-06-27 09:04:19 +00:00
UniDesk Web Probe Sentinel 18a435bcb4 deploy: render web-probe sentinel cb56a1ffa0036f937651a91ebef230d49a3e5470 2026-06-27 09:03:31 +00:00
UniDesk Web Probe Sentinel 69bd8c4b2a deploy: render web-probe sentinel 66b96980f9163f0a2e766c5a125838be03a1d5a3 2026-06-27 08:55:05 +00:00
UniDesk Web Probe Sentinel 928c258bfb deploy: render web-probe sentinel 66b96980f9163f0a2e766c5a125838be03a1d5a3 2026-06-27 08:54:22 +00:00
UniDesk Web Probe Sentinel 542255d428 deploy: render web-probe sentinel 02acd00dd7ce9a85b1096467c79fd1fa5382fa5e 2026-06-27 08:48:30 +00:00
UniDesk Web Probe Sentinel 6d8e3c4e72 deploy: render web-probe sentinel 9a5cc21393096925b6c72d50213b8e2f08a68f98 2026-06-27 08:39:15 +00:00
UniDesk Web Probe Sentinel 60cb8dddd9 deploy: render web-probe sentinel 9a5cc21393096925b6c72d50213b8e2f08a68f98 2026-06-27 08:38:28 +00:00
UniDesk Web Probe Sentinel e88b8a2a7c deploy: render web-probe sentinel 11e20432de09e09a3b3bc4a71438a23a868c373e 2026-06-27 08:27:10 +00:00
UniDesk Web Probe Sentinel c710675e3b deploy: render web-probe sentinel 11e20432de09e09a3b3bc4a71438a23a868c373e 2026-06-27 08:26:05 +00:00
UniDesk Web Probe Sentinel 1026b2e384 deploy: render web-probe sentinel e3a99cbdbeadef5a3232785c459409b68500d6f4 2026-06-27 08:24:00 +00:00
UniDesk Web Probe Sentinel dbcd0ed91e deploy: render web-probe sentinel e3a99cbdbeadef5a3232785c459409b68500d6f4 2026-06-27 08:23:09 +00:00
HWLAB node GitOps Bot 5f5accbab9 chore: promote node GitOps source 6120f7f 2026-06-27 08:15:28 +00:00
UniDesk Web Probe Sentinel 66b38db1e2 deploy: render web-probe sentinel 35cb49f319981d42e816f8a92e590e0343c31dd3 2026-06-27 08:05:58 +00:00
UniDesk Web Probe Sentinel 7db97c7943 deploy: render web-probe sentinel 35cb49f319981d42e816f8a92e590e0343c31dd3 2026-06-27 08:05:01 +00:00
HWLAB node GitOps Bot a3886962db chore: promote node GitOps source 3fced0b 2026-06-27 08:03:48 +00:00
UniDesk Web Probe Sentinel 27c4d71f51 deploy: render web-probe sentinel 1ef4bf58d6d9f146b19d9f3ba0c4814f5226a83b 2026-06-27 07:52:27 +00:00
UniDesk Web Probe Sentinel 60ce17890f deploy: render web-probe sentinel 1ef4bf58d6d9f146b19d9f3ba0c4814f5226a83b 2026-06-27 07:51:13 +00:00
UniDesk Web Probe Sentinel aab560fb6f deploy: render web-probe sentinel 74afba293b759c990452cd6e63258dacd746c580 2026-06-27 07:38:12 +00:00
UniDesk Web Probe Sentinel b05ffd7ee9 deploy: render web-probe sentinel 74afba293b759c990452cd6e63258dacd746c580 2026-06-27 07:37:09 +00:00
UniDesk Web Probe Sentinel 5848d6f7dc deploy: render web-probe sentinel db631c72ead84f528e339ae4f2971c214f224c76 2026-06-27 07:31:23 +00:00
UniDesk Web Probe Sentinel 6ff48d9eee deploy: render web-probe sentinel db631c72ead84f528e339ae4f2971c214f224c76 2026-06-27 07:30:25 +00:00
HWLAB node GitOps Bot 20ac32c6be chore: promote node GitOps source b74c38d 2026-06-27 07:08:18 +00:00
HWLAB node GitOps Bot f004d8f63e chore: promote node GitOps source 57684ea 2026-06-27 06:58:39 +00:00
UniDesk Web Probe Sentinel 1b38f53ecd deploy: render web-probe sentinel a02fa6f6e55eb39af242bedba123e75903152762 2026-06-27 06:49:07 +00:00
UniDesk Web Probe Sentinel da37d7f2c6 deploy: render web-probe sentinel a02fa6f6e55eb39af242bedba123e75903152762 2026-06-27 06:48:18 +00:00
UniDesk Web Probe Sentinel b6187e6ae5 deploy: render web-probe sentinel a02fa6f6e55eb39af242bedba123e75903152762 2026-06-27 06:47:07 +00:00
UniDesk Web Probe Sentinel e5d1fe03a4 deploy: render web-probe sentinel f5a971b3d71579bebddde5e7ad3b061538523693 2026-06-27 06:41:53 +00:00
UniDesk Web Probe Sentinel 8f9577311b deploy: render web-probe sentinel f5a971b3d71579bebddde5e7ad3b061538523693 2026-06-27 06:40:34 +00:00
UniDesk Web Probe Sentinel 34844faa50 deploy: render web-probe sentinel f5a971b3d71579bebddde5e7ad3b061538523693 2026-06-27 06:40:24 +00:00
UniDesk Web Probe Sentinel 151305e48f deploy: render web-probe sentinel f5a971b3d71579bebddde5e7ad3b061538523693 2026-06-27 06:38:32 +00:00
UniDesk Web Probe Sentinel a6542d94bb deploy: render web-probe sentinel 5dc54ea9505bb84604e92bb9861d54f81e75d4fd 2026-06-27 06:36:05 +00:00
UniDesk Web Probe Sentinel ae7e1d8a7a deploy: render web-probe sentinel adedd51a4b2d5241bd13da1d4f11aab12a459b50 2026-06-27 06:24:10 +00:00
UniDesk Web Probe Sentinel c61b8ed1ab deploy: render web-probe sentinel adedd51a4b2d5241bd13da1d4f11aab12a459b50 2026-06-27 06:22:26 +00:00
UniDesk Web Probe Sentinel 67fcda547f deploy: render web-probe sentinel adedd51a4b2d5241bd13da1d4f11aab12a459b50 2026-06-27 06:22:22 +00:00
UniDesk Web Probe Sentinel b58e0055df deploy: render web-probe sentinel adedd51a4b2d5241bd13da1d4f11aab12a459b50 2026-06-27 06:21:09 +00:00
UniDesk Web Probe Sentinel 37fc2ab303 deploy: render web-probe sentinel c0c392caa675ffb4491a87b2418971c315dfa1b1 2026-06-27 06:18:02 +00:00
UniDesk Web Probe Sentinel 3afe19c3f9 deploy: render web-probe sentinel c0c392caa675ffb4491a87b2418971c315dfa1b1 2026-06-27 06:17:03 +00:00
UniDesk Web Probe Sentinel 0dead080b6 deploy: render web-probe sentinel c0c392caa675ffb4491a87b2418971c315dfa1b1 2026-06-27 06:16:09 +00:00
HWLAB node GitOps Bot b826350b3b chore: promote node GitOps source 1415abb 2026-06-27 06:04:08 +00:00
UniDesk Web Probe Sentinel 00e3a6a1a4 deploy: render web-probe sentinel 05fb46d40a39029677ac93c18579868bd56a7bd9 2026-06-27 05:52:23 +00:00
HWLAB node GitOps Bot b822a734ce chore: promote node GitOps source 5a3e16c 2026-06-27 05:48:28 +00:00
HWLAB node GitOps Bot 3e425b207e chore: promote node GitOps source 96296ce 2026-06-27 05:45:06 +00:00
UniDesk Web Probe Sentinel a3193a4ecd deploy: render web-probe sentinel 8d4565448e046542246ff0ba7dde0f8de2cfe6a5 2026-06-27 05:29:51 +00:00
UniDesk Web Probe Sentinel 5f4bc81aa2 deploy: render web-probe sentinel f4a6d8d7b82460b47d70a845784d682ddf7f097d 2026-06-27 04:43:46 +00:00
UniDesk Web Probe Sentinel 66af9beedb deploy: render web-probe sentinel ee784a29347dfdcff05997a89d305332801587fb 2026-06-27 04:18:14 +00:00
UniDesk Web Probe Sentinel 4c35162971 deploy: render web-probe sentinel de12b3e9bf3504870f133f239d66b4ac22b0bb76 2026-06-27 04:09:19 +00:00
UniDesk Web Probe Sentinel c338c0c733 deploy: render web-probe sentinel 7c8799acb7795ebe254c2f79a0e0047497e6af5d 2026-06-27 04:01:46 +00:00
UniDesk Web Probe Sentinel bdd4e97e48 deploy: render web-probe sentinel f7d917c85a82572578d592a8c8a4102752ff24ce 2026-06-27 03:48:23 +00:00
UniDesk Web Probe Sentinel 72e9f7739a deploy: render web-probe sentinel c3250aeda650548f993135e2f0a8135c7b74b6a2 2026-06-27 03:32:30 +00:00
UniDesk Web Probe Sentinel 00f293c6c8 deploy: render web-probe sentinel b48a224d175003df0fac534531906bd46a840971 2026-06-27 03:10:41 +00:00
UniDesk Web Probe Sentinel 25d4bf6ee4 deploy: render web-probe sentinel 61d9249e50904ad497d900f96e7b49a1948c91f3 2026-06-27 02:48:59 +00:00
UniDesk Web Probe Sentinel 397b8a9f14 deploy: render web-probe sentinel 15006395e6bebe634761d2cf9cb82ced0542ffe1 2026-06-27 02:40:58 +00:00
HWLAB node GitOps Bot dcadfc8024 chore: promote node GitOps source de58ad3 2026-06-27 02:31:58 +00:00
UniDesk Web Probe Sentinel 5ae89ed4f1 deploy: render web-probe sentinel 1114517e98e1b7786f866934f22025478cb37ef2 2026-06-27 02:15:26 +00:00
UniDesk Web Probe Sentinel fad996c4e8 deploy: render web-probe sentinel 1114517e98e1b7786f866934f22025478cb37ef2 2026-06-27 02:13:02 +00:00
UniDesk Web Probe Sentinel 3d06d01be0 deploy: render web-probe sentinel 3b2399c90236c2bc0a0985cca1368f9088ef1161 2026-06-27 02:06:36 +00:00
UniDesk Web Probe Sentinel 5f8df277dd deploy: render web-probe sentinel 4b6f0c745f021d0cc831ae9e448c50ff474d67fb 2026-06-27 01:59:47 +00:00
UniDesk Web Probe Sentinel 69e90d184b deploy: render web-probe sentinel 4b6f0c745f021d0cc831ae9e448c50ff474d67fb 2026-06-27 01:58:32 +00:00
HWLAB node GitOps Bot 1cff01effa chore: promote node GitOps source efb21d7 2026-06-26 21:08:50 +00:00
HWLAB node GitOps Bot 4096cec7ce chore: promote node GitOps source 4383a91 2026-06-26 20:42:34 +00:00
HWLAB node GitOps Bot c0404e9084 chore: promote node GitOps source ba9c310 2026-06-26 20:00:32 +00:00
HWLAB node GitOps Bot cc1f30ecc4 chore: promote node GitOps source ea3c568 2026-06-26 19:41:38 +00:00
UniDesk Web Probe Sentinel 8c431d2eb3 deploy: render web-probe sentinel 5fffa5a3b63786190b99bce5ea4f1343c7bb4de3 2026-06-26 18:36:04 +00:00
UniDesk Web Probe Sentinel 9d96517052 deploy: render web-probe sentinel 5fffa5a3b63786190b99bce5ea4f1343c7bb4de3 2026-06-26 18:35:07 +00:00
UniDesk Web Probe Sentinel 8aa1640f80 deploy: render web-probe sentinel 9a6bdfd128943f57ff273037fd8f31266950b622 2026-06-26 18:31:44 +00:00
UniDesk Web Probe Sentinel 90112dffda deploy: render web-probe sentinel 9a6bdfd128943f57ff273037fd8f31266950b622 2026-06-26 18:30:46 +00:00
UniDesk Web Probe Sentinel 72cb306fc7 deploy: render web-probe sentinel f27e947dc089530ed5c9c474a530c83de46c9df5 2026-06-26 18:25:30 +00:00
UniDesk Web Probe Sentinel 8841472abc deploy: render web-probe sentinel f27e947dc089530ed5c9c474a530c83de46c9df5 2026-06-26 18:24:29 +00:00
UniDesk Web Probe Sentinel f0982b1a96 deploy: render web-probe sentinel f27e947dc089530ed5c9c474a530c83de46c9df5 2026-06-26 18:21:41 +00:00
UniDesk Web Probe Sentinel 3ca05e0a7a deploy: render web-probe sentinel 938a48b6ec82cabc8e725efe817db8d63ff68a7b 2026-06-26 17:59:08 +00:00
UniDesk Web Probe Sentinel b73f25ed68 deploy: render web-probe sentinel 1599367eeb4120739c5d3cb7eae85a1bc8f2a095 2026-06-26 17:53:05 +00:00
HWLAB node GitOps Bot 7740854fad chore: promote node GitOps source 8193fef 2026-06-26 17:26:04 +00:00
HWLAB node GitOps Bot 484f042e2b chore: promote node GitOps source 16dcba7 2026-06-26 17:05:37 +00:00
UniDesk Web Probe Sentinel 8826939c44 deploy: render web-probe sentinel 9bce21b9ef35b15a01b85c944dbcf6a2bdfbaee3 2026-06-26 16:51:32 +00:00
HWLAB node GitOps Bot 87340fc64d chore: promote node GitOps source 99079d3 2026-06-26 16:09:53 +00:00
UniDesk Web Probe Sentinel 4e2ea97317 deploy: render web-probe sentinel 9bce21b9ef35b15a01b85c944dbcf6a2bdfbaee3 2026-06-26 16:08:55 +00:00
UniDesk Web Probe Sentinel 4a39968afc deploy: render web-probe sentinel a173e95c0babed067fabe514cd47edfeeee25854 2026-06-26 16:07:07 +00:00
UniDesk Web Probe Sentinel d6542e2c12 deploy: render web-probe sentinel 2d953cc911f2f74cf9b8f1c9349f0b153e4a7884 2026-06-26 15:46:38 +00:00
UniDesk Web Probe Sentinel 743932acdf deploy: render web-probe sentinel 41e196f94d406c6c0cbabfbff9a24873a528166f 2026-06-26 15:33:13 +00:00
UniDesk Web Probe Sentinel ac601debfc deploy: render web-probe sentinel 95e1bbca14a8756c6651ec84ba54396050c02671 2026-06-26 15:29:26 +00:00
UniDesk Web Probe Sentinel a026354d42 deploy: render web-probe sentinel 4ece1ab200e94b82047f55f051c6392c0e1863a5 2026-06-26 15:22:50 +00:00
UniDesk Web Probe Sentinel 5febf974c7 deploy: render web-probe sentinel 4ece1ab200e94b82047f55f051c6392c0e1863a5 2026-06-26 15:16:29 +00:00
UniDesk Web Probe Sentinel 6d6ca52a80 deploy: render web-probe sentinel 1c32bc1fbf7dd6889f7433151a167c5ce1c23417 2026-06-26 15:08:44 +00:00
UniDesk Web Probe Sentinel a023dc920c deploy: render web-probe sentinel 1c32bc1fbf7dd6889f7433151a167c5ce1c23417 2026-06-26 15:06:30 +00:00
UniDesk Web Probe Sentinel 1e30b85feb deploy: render web-probe sentinel 84f8b39e264f1cb9d766316f9685b3cde104469d 2026-06-26 15:03:19 +00:00
UniDesk Web Probe Sentinel d9a1640160 deploy: render web-probe sentinel 4e5249bb6a0949adac05961f27a485d95f4f49a3 2026-06-26 14:54:28 +00:00
UniDesk Web Probe Sentinel 3a87caca26 deploy: render web-probe sentinel 4e5249bb6a0949adac05961f27a485d95f4f49a3 2026-06-26 14:52:45 +00:00
UniDesk Web Probe Sentinel afcbb9fcd3 deploy: render web-probe sentinel 75a723d9f597961f167731bc33b8f9b957234726 2026-06-26 14:43:06 +00:00
HWLAB node GitOps Bot 8359c2173a chore: promote node GitOps source bc7d025 2026-06-26 14:40:21 +00:00
UniDesk Web Probe Sentinel d7511d8e19 deploy: render web-probe sentinel b1212f2d6dbffc91d5a82df2b00bcde41921b3ae 2026-06-26 14:39:46 +00:00
UniDesk Web Probe Sentinel 9d6c32d7e3 deploy: render web-probe sentinel b1212f2d6dbffc91d5a82df2b00bcde41921b3ae 2026-06-26 14:36:00 +00:00
UniDesk Web Probe Sentinel fc61737ac0 deploy: render web-probe sentinel 1f6482bbe4c3d9e0346ab97bdea6c2f3cefa46c8 2026-06-26 14:34:56 +00:00
UniDesk Web Probe Sentinel dfb6dff9e1 deploy: render web-probe sentinel cce32b41c4ab6d6a2648d5a746d92b33a861e52a 2026-06-26 14:20:02 +00:00
UniDesk Web Probe Sentinel 7df0b8dc7e deploy: render web-probe sentinel cce32b41c4ab6d6a2648d5a746d92b33a861e52a 2026-06-26 14:14:46 +00:00
UniDesk Web Probe Sentinel fdcf5f2519 deploy: render web-probe sentinel abad0706f6f8170f263c3542f9d80a8a891c1b6f 2026-06-26 14:12:06 +00:00
UniDesk Web Probe Sentinel b3271e100e deploy: render web-probe sentinel abad0706f6f8170f263c3542f9d80a8a891c1b6f 2026-06-26 14:10:12 +00:00
UniDesk Web Probe Sentinel 1cfef80628 deploy: render web-probe sentinel 9ab46dfc73c214d8e4382fab3917d8f5eab07e8d 2026-06-26 14:02:01 +00:00
UniDesk Web Probe Sentinel c65c328fcb deploy: render web-probe sentinel 9ab46dfc73c214d8e4382fab3917d8f5eab07e8d 2026-06-26 14:00:23 +00:00
UniDesk Web Probe Sentinel 867feaa318 deploy: render web-probe sentinel 8b55f2028227427ba8fec87908439a4bc6d20e86 2026-06-26 13:53:32 +00:00
UniDesk Web Probe Sentinel ab817c3583 deploy: render web-probe sentinel 997b16345d6ea12791258392b20b93d562c0e51e 2026-06-26 13:45:52 +00:00
UniDesk Web Probe Sentinel b4a083c4ac deploy: render web-probe sentinel 997b16345d6ea12791258392b20b93d562c0e51e 2026-06-26 13:43:15 +00:00
UniDesk Web Probe Sentinel 5cb43dff40 deploy: render web-probe sentinel 997b16345d6ea12791258392b20b93d562c0e51e 2026-06-26 13:41:01 +00:00
UniDesk Web Probe Sentinel d186efcd58 deploy: render web-probe sentinel 0547a6e95d8f6c03fb5a4333936fecd36c3aa7b1 2026-06-26 13:24:13 +00:00
UniDesk Web Probe Sentinel eee350088f deploy: render web-probe sentinel fe9c3a32604c0f26a21975ea18fa86a1a4fcbd1d 2026-06-26 13:18:39 +00:00
UniDesk Web Probe Sentinel f04d081a4d deploy: render web-probe sentinel 09cec4d4fe89b4f76a10643aaefdd83a35f195f2 2026-06-26 13:11:56 +00:00
UniDesk Web Probe Sentinel 6c9225469c deploy: render web-probe sentinel abb5072ac4f76093880ca174fd6074ddc27f21eb 2026-06-26 13:10:07 +00:00
UniDesk Web Probe Sentinel 40dfc765bc deploy: render web-probe sentinel 9730971297ec6efd5c944bfcf2b05c35ba3affac 2026-06-26 13:02:49 +00:00
UniDesk Web Probe Sentinel de948deb6c deploy: render web-probe sentinel e0df385f12b971bbb493848bae1ae7623c2738ed 2026-06-26 12:53:33 +00:00
UniDesk Web Probe Sentinel b643ae9c2c deploy: render web-probe sentinel 25431d8282bddab0e96cdd0f5f411bd1a436cbed 2026-06-26 12:47:55 +00:00
UniDesk Web Probe Sentinel 019f1632e6 deploy: render web-probe sentinel 7b3df965cc64d3bd8ce3514ad1a472bf22d93de1 2026-06-26 12:34:55 +00:00
UniDesk Web Probe Sentinel 2ed9105c2d deploy: render web-probe sentinel 7b3df965cc64d3bd8ce3514ad1a472bf22d93de1 2026-06-26 12:33:35 +00:00
HWLAB node GitOps Bot c3285ebe08 chore: promote node GitOps source 3d34f72 2026-06-26 12:32:15 +00:00
HWLAB node GitOps Bot 52e7abbbae chore: promote node GitOps source 1d636ba 2026-06-26 12:26:17 +00:00
UniDesk Web Probe Sentinel f176ddd8f2 deploy: render web-probe sentinel c304a2b69c1f68bda373763dc71f4328eb7d7bdc 2026-06-26 12:22:11 +00:00
UniDesk Web Probe Sentinel e6c66191a4 deploy: render web-probe sentinel ff9dd29faacf7dfa58710d929f69421e3b612e4e 2026-06-26 12:16:04 +00:00
HWLAB node GitOps Bot 1e60c2c0f1 chore: promote node GitOps source 1d636ba 2026-06-26 11:52:06 +00:00
UniDesk Web Probe Sentinel c6db68fc37 deploy: render web-probe sentinel f471025e091bd88869df7cdab505b494085cb8c1 2026-06-26 11:47:01 +00:00
UniDesk Web Probe Sentinel 31f7bc04db deploy: render web-probe sentinel 4c9343a2263adcde29d94a09b62ab389db68f6ae 2026-06-26 11:31:42 +00:00
UniDesk Web Probe Sentinel 4b231369f1 deploy: render web-probe sentinel 3b62351831ee7bd729bb4be0acc9f868dc516534 2026-06-26 11:21:57 +00:00
HWLAB node GitOps Bot 452b0f23c7 chore: promote node GitOps source f94e2c1 2026-06-26 11:20:03 +00:00
UniDesk Web Probe Sentinel 3a3f5fc955 deploy: render web-probe sentinel b71758f4e833986e21b73c33755b50364229553e 2026-06-26 11:09:00 +00:00
HWLAB node GitOps Bot 79d7136132 chore: promote node GitOps source f94e2c1 2026-06-26 10:53:34 +00:00
UniDesk Web Probe Sentinel 083bdb27d2 deploy: render web-probe sentinel 0bfff97848c3ee78ace1e2da853d12f594a3c24e 2026-06-26 10:24:25 +00:00
HWLAB node GitOps Bot 5cd171deab chore: promote node GitOps source f685692 2026-06-26 10:09:41 +00:00
UniDesk Web Probe Sentinel 64dc94212f deploy: render web-probe sentinel b5625007d6215f72f170c647199f93f1e655672a 2026-06-26 09:57:42 +00:00
UniDesk Web Probe Sentinel ae34a9b25c deploy: render web-probe sentinel 1179184c05de015ffe95be3b2a72fc8ecd45b591 2026-06-26 09:49:23 +00:00
HWLAB node GitOps Bot f730dbbb34 chore: promote node GitOps source 9a36758 2026-06-26 09:07:27 +00:00
HWLAB node GitOps Bot dd828cc040 chore: promote node GitOps source bd5d838 2026-06-26 08:56:20 +00:00
HWLAB node GitOps Bot 3ec15e0489 chore: promote node GitOps source 53b58d8 2026-06-26 08:44:30 +00:00
HWLAB node GitOps Bot a0217f5637 chore: promote node GitOps source 6bf5622 2026-06-26 08:30:18 +00:00
HWLAB node GitOps Bot 860a77292b chore: promote node GitOps source 25c57c1 2026-06-26 08:16:17 +00:00
HWLAB node GitOps Bot 80f19eb5ea chore: promote node GitOps source 701bbbd 2026-06-26 07:54:57 +00:00
UniDesk Web Probe Sentinel cc49f2da4e deploy: render web-probe sentinel 6b689d93955a84ccfbde5d191870edcb305e456c 2026-06-26 07:52:20 +00:00
UniDesk Web Probe Sentinel 75a489e9e6 deploy: render web-probe sentinel 08470168f8163dc8607c4433af1e248ff2b23c50 2026-06-26 07:40:56 +00:00
HWLAB node GitOps Bot 688faba017 chore: promote node GitOps source 607e060 2026-06-26 07:30:35 +00:00
UniDesk Web Probe Sentinel 5c3297f8e2 deploy: render web-probe sentinel 5fa5708fe11bb7e085b6b162976e696de692240f 2026-06-26 07:07:07 +00:00
HWLAB node GitOps Bot 8ff3438c97 chore: promote node GitOps source 8a7e17c 2026-06-26 06:50:36 +00:00
UniDesk Web Probe Sentinel 4ecd31572e deploy: render web-probe sentinel 7b8425c0bb0a1c01d2cca9e38651c202445a3867 2026-06-26 06:29:26 +00:00
UniDesk Web Probe Sentinel 3fb32f2d65 deploy: render web-probe sentinel 5dd0cc2d7d17feef5d820b828bd2c652c1678045 2026-06-26 06:22:49 +00:00
HWLAB node GitOps Bot 385a2377e8 chore: promote node GitOps source d11b5d7 2026-06-26 06:13:02 +00:00
UniDesk Web Probe Sentinel 8042a1925c deploy: render web-probe sentinel bdec05729dd017d0ca03b19f8ba90047f51773bf 2026-06-26 06:07:02 +00:00
HWLAB node GitOps Bot 9be8db1a9e chore: promote node GitOps source ed9d408 2026-06-26 05:25:04 +00:00
HWLAB node GitOps Bot 06a586f371 chore: promote node GitOps source 38b7d7b 2026-06-26 04:26:29 +00:00
UniDesk Web Probe Sentinel e33b3b8666 deploy: render web-probe sentinel cf5de04b2f447f8a0f2e1c7209b93a6d211da4cd 2026-06-26 04:00:15 +00:00
HWLAB node GitOps Bot f89eef09dc chore: promote node GitOps source 11afa1a 2026-06-26 03:56:12 +00:00
UniDesk Web Probe Sentinel 4becf723fc deploy: render web-probe sentinel c417c988b175be06c77f3c4a31ecda4cdd3a421d 2026-06-26 03:53:46 +00:00
HWLAB node GitOps Bot d1617ca5dc chore: promote node GitOps source 11afa1a 2026-06-26 03:29:19 +00:00
HWLAB node GitOps Bot 5f13c73e23 chore: promote node GitOps source 11afa1a 2026-06-26 02:57:21 +00:00
HWLAB node GitOps Bot a7d09704b6 chore: promote node GitOps source 95bcf0e 2026-06-26 02:42:21 +00:00
HWLAB node GitOps Bot ba6611bcf0 chore: promote node GitOps source 6cfb3b4 2026-06-26 01:00:37 +00:00
HWLAB node GitOps Bot e2abe84e3b chore: promote node GitOps source ff15725 2026-06-26 00:14:07 +00:00
HWLAB node GitOps Bot e586ece2cb chore: promote node GitOps source 4ba7b6a 2026-06-25 23:04:44 +00:00
HWLAB node GitOps Bot fa15ca79b8 chore: promote node GitOps source 85918f1 2026-06-25 22:16:54 +00:00
HWLAB node GitOps Bot e25e50398d chore: promote node GitOps source a587493 2026-06-25 21:37:43 +00:00
HWLAB node GitOps Bot 25f90eb825 chore: promote node GitOps source 2e9e4bd 2026-06-25 19:38:02 +00:00
HWLAB node GitOps Bot 7a2f515d6f chore: promote node GitOps source fc09614 2026-06-25 18:48:56 +00:00
UniDesk Web Probe Sentinel 1dad2e1d20 deploy: render web-probe sentinel 01c39627457d234da25e256afb44fe004d070800 2026-06-25 18:12:14 +00:00
UniDesk Web Probe Sentinel 6e5b25e118 deploy: render web-probe sentinel 14e548e0ce200a6c0e7413d9a98cd84e13b89891 2026-06-25 17:57:36 +00:00
UniDesk Web Probe Sentinel 289b641de5 deploy: render web-probe sentinel 8080c810b9dc3ae11e025984e425422595d403da 2026-06-25 17:49:43 +00:00
UniDesk Web Probe Sentinel 7834b56a8c deploy: render web-probe sentinel 3777577df47e5e0ee8cfa71cdab5f8aeab55f5e2 2026-06-25 17:14:41 +00:00
UniDesk Web Probe Sentinel a3fcd9e692 deploy: render web-probe sentinel bc069affff836fda663d2467cf6ea89ac0efa571 2026-06-25 17:07:07 +00:00
UniDesk Web Probe Sentinel 8637a8f291 deploy: render web-probe sentinel 29f80935bf69960d637392089aeb94010b5a1ae9 2026-06-25 16:58:01 +00:00
UniDesk Web Probe Sentinel 2f05211b18 deploy: render web-probe sentinel db3fed012e28b43430a515722535140dd492768f 2026-06-25 16:50:31 +00:00
UniDesk Web Probe Sentinel 27d6857431 deploy: render web-probe sentinel 058148903adab103ffa65c6f5fc7e5a365f9a8df 2026-06-25 16:08:52 +00:00
UniDesk Web Probe Sentinel 7fa5e83a37 deploy: render web-probe sentinel 049833b3b0edca5766bd3a146fc6832b4aa0b283 2026-06-25 16:04:49 +00:00
HWLAB node GitOps Bot 7f583863cb chore: promote node GitOps source 3596c5c 2026-06-25 16:01:09 +00:00
UniDesk Web Probe Sentinel 2fb2119248 deploy: render web-probe sentinel 049833b3b0edca5766bd3a146fc6832b4aa0b283 2026-06-25 15:58:21 +00:00
UniDesk Web Probe Sentinel 790a0bcb8d deploy: render web-probe sentinel 9a30427b2b0cd0c2895108db8bc743ce8cbde40e 2026-06-25 15:54:35 +00:00
HWLAB node GitOps Bot 5fad018b46 chore: promote node GitOps source 67f4491 2026-06-25 15:46:46 +00:00
UniDesk Web Probe Sentinel 5fc805533d deploy: render web-probe sentinel 296398625112bd7ea1a441c3cfc6f5ae3accc988 2026-06-25 15:42:04 +00:00
HWLAB node GitOps Bot 0d0cb16a54 chore: promote node GitOps source 1a6dd66 2026-06-25 15:36:44 +00:00
UniDesk Web Probe Sentinel d0cb738634 deploy: render web-probe sentinel 08149396bd9fafb52e802a34e864c230b6be5003 2026-06-25 15:33:07 +00:00
UniDesk Web Probe Sentinel 5d66428ea3 deploy: render web-probe sentinel 1b168bccbf48eb2c16e490fa155fe6d68a34a425 2026-06-25 15:26:03 +00:00
HWLAB node GitOps Bot 92719e21d1 chore: promote node GitOps source 56033bc 2026-06-25 15:02:25 +00:00
HWLAB node GitOps Bot 73b4c1b76e chore: promote node GitOps source 590b662 2026-06-25 11:44:43 +00:00
HWLAB node GitOps Bot 7f470921aa chore: promote node GitOps source 5f3b9f7 2026-06-25 11:32:25 +00:00
HWLAB node GitOps Bot 907c6c930a chore: promote node GitOps source f137f68 2026-06-25 11:05:35 +00:00
HWLAB node GitOps Bot 848bc88d75 chore: promote node GitOps source 50a99fc 2026-06-25 10:51:37 +00:00
HWLAB node GitOps Bot 1c10ad7b81 chore: promote node GitOps source 60a7caf 2026-06-25 10:41:40 +00:00
HWLAB node GitOps Bot fec112ace1 chore: promote node GitOps source 46200e3 2026-06-25 10:36:39 +00:00
HWLAB node GitOps Bot 9b7ef04210 chore: promote node GitOps source b611225 2026-06-25 10:05:56 +00:00
HWLAB node GitOps Bot 1a4f4329c8 chore: promote node GitOps source cc6561e 2026-06-25 09:29:51 +00:00
HWLAB node GitOps Bot 62d8b9cb20 chore: promote node GitOps source c0996f8 2026-06-25 09:00:26 +00:00
HWLAB node GitOps Bot 95d6fe88b1 chore: promote node GitOps source c474a19 2026-06-25 05:35:12 +00:00
HWLAB node GitOps Bot 1db066e9e3 chore: promote node GitOps source f70be64 2026-06-25 05:15:48 +00:00
HWLAB node GitOps Bot 98b0dda193 chore: promote node GitOps source 7797902 2026-06-25 05:03:06 +00:00
HWLAB node GitOps Bot f75fea6b70 chore: promote node GitOps source d35e594 2026-06-25 04:30:04 +00:00
HWLAB node GitOps Bot f279912bd7 chore: promote node GitOps source d35e594 2026-06-25 04:24:29 +00:00
HWLAB node GitOps Bot 4786491717 chore: promote node GitOps source 270cc8f 2026-06-25 04:09:16 +00:00
HWLAB node GitOps Bot faec02e52d chore: promote node GitOps source 7a88ce4 2026-06-25 03:06:27 +00:00
HWLAB node GitOps Bot c75d5df856 chore: promote node GitOps source 796de83 2026-06-25 02:54:16 +00:00
HWLAB node GitOps Bot 9401ad78c0 chore: promote node GitOps source 796de83 2026-06-25 02:48:40 +00:00
HWLAB node GitOps Bot cedf43636f chore: promote node GitOps source 8bf7aa9 2026-06-25 02:27:31 +00:00
HWLAB node GitOps Bot 688ce99855 chore: promote node GitOps source 097d991 2026-06-25 02:01:41 +00:00
HWLAB node GitOps Bot 0b327b537c chore: promote node GitOps source 097d991 2026-06-25 01:52:54 +00:00
HWLAB node GitOps Bot bbe44a4a4b chore: promote node GitOps source fb20175 2026-06-25 01:38:03 +00:00
HWLAB node GitOps Bot d24afb0e25 chore: promote node GitOps source 49d42fd 2026-06-25 00:40:00 +00:00
HWLAB node GitOps Bot 92cb17aa3e chore: promote node GitOps source 41555af 2026-06-25 00:08:52 +00:00
HWLAB node GitOps Bot c51c413ef9 chore: promote node GitOps source e31af52 2026-06-24 23:47:33 +00:00
HWLAB node GitOps Bot 39830ffd75 chore: promote node GitOps source 5bcffeb 2026-06-24 23:30:37 +00:00
HWLAB node GitOps Bot ac0121787a chore: promote node GitOps source ec41a06 2026-06-24 22:56:11 +00:00
HWLAB node GitOps Bot 7a3abb3d2f chore: promote node GitOps source 9de6042 2026-06-24 22:48:25 +00:00
HWLAB node GitOps Bot 7d502ed082 chore: promote node GitOps source a693e40 2026-06-24 22:32:02 +00:00
HWLAB node GitOps Bot b27a03aec3 chore: promote node GitOps source 2d7c638 2026-06-24 22:24:09 +00:00
HWLAB node GitOps Bot aeddbeac62 chore: promote node GitOps source d818aad 2026-06-24 22:15:36 +00:00
HWLAB node GitOps Bot 72cab07ab3 chore: promote node GitOps source 6728229 2026-06-24 21:51:27 +00:00
HWLAB node GitOps Bot 738238223d chore: promote node GitOps source fe2ed4e 2026-06-24 21:20:16 +00:00
HWLAB node GitOps Bot a9c0601cbf chore: promote node GitOps source 19eee3b 2026-06-24 20:50:17 +00:00
HWLAB node GitOps Bot e384135b26 chore: promote node GitOps source abfd742 2026-06-24 18:59:42 +00:00
HWLAB node GitOps Bot 72fc45af13 chore: promote node GitOps source ee3a357 2026-06-24 16:37:08 +00:00
HWLAB node GitOps Bot 075b6d913e chore: promote node GitOps source 2651a6e 2026-06-24 15:23:40 +00:00
HWLAB node GitOps Bot 703ce286e0 chore: promote node GitOps source 51f2f2c 2026-06-24 15:06:08 +00:00
HWLAB node GitOps Bot 28038b7e3d chore: promote node GitOps source c604dd2 2026-06-24 14:47:56 +00:00
HWLAB node GitOps Bot 2486c8be0b chore: promote node GitOps source 66cdf0b 2026-06-24 14:13:53 +00:00
HWLAB node GitOps Bot 7a59611285 chore: promote node GitOps source e98b3e2 2026-06-24 13:04:33 +00:00
HWLAB node GitOps Bot 9bd1720231 chore: promote node GitOps source d877380 2026-06-24 11:38:41 +00:00
HWLAB node GitOps Bot 27288348e4 chore: promote node GitOps source 83b562e 2026-06-24 11:26:50 +00:00
HWLAB node GitOps Bot 2a2d0531eb chore: promote node GitOps source e390bec 2026-06-24 09:50:49 +00:00
HWLAB node GitOps Bot 28feb08a0b chore: promote node GitOps source 6c253b9 2026-06-24 09:37:33 +00:00
HWLAB node GitOps Bot 28833d8a96 chore: promote node GitOps source b49f2a5 2026-06-24 09:12:02 +00:00
HWLAB node GitOps Bot 6f93696c8b chore: promote node GitOps source 5ff705c 2026-06-24 08:46:48 +00:00
HWLAB node GitOps Bot a1c01288a1 chore: promote node GitOps source d1bb34c 2026-06-24 07:56:13 +00:00
HWLAB node GitOps Bot 53a2aefbc2 chore: promote node GitOps source e0ad20e 2026-06-24 07:31:27 +00:00
HWLAB node GitOps Bot 02eabf3004 chore: promote node GitOps source fbc23d2 2026-06-24 07:04:05 +00:00
HWLAB node GitOps Bot e87bfda2ec chore: promote node GitOps source 8bdab4a 2026-06-24 06:37:36 +00:00
HWLAB node GitOps Bot 66133908c5 chore: promote node GitOps source 10e892c 2026-06-24 06:24:02 +00:00
HWLAB node GitOps Bot 012a9f0e7c chore: promote node GitOps source 3e33eb5 2026-06-24 06:08:35 +00:00
HWLAB node GitOps Bot 90c34263de chore: promote node GitOps source 50734e5 2026-06-24 05:29:58 +00:00
HWLAB node GitOps Bot a536e9bfb3 chore: promote node GitOps source 50734e5 2026-06-24 05:10:56 +00:00
HWLAB node GitOps Bot f118ad35a1 chore: promote node GitOps source 20bc506 2026-06-24 04:49:47 +00:00
HWLAB node GitOps Bot 3c7be63189 chore: promote node GitOps source 808fddb 2026-06-24 02:09:23 +00:00
HWLAB node GitOps Bot f9b226b9bb chore: promote node GitOps source 0ef13fb 2026-06-24 02:04:38 +00:00
HWLAB node GitOps Bot 7f28c26f4b chore: promote node GitOps source 7d80770 2026-06-24 01:49:29 +00:00
HWLAB node GitOps Bot 3b9435538f chore: promote node GitOps source 6e3d6f8 2026-06-24 01:05:57 +00:00
HWLAB node GitOps Bot da4284d43b chore: promote node GitOps source df8249e 2026-06-24 00:53:36 +00:00
HWLAB node GitOps Bot c353d1502f chore: promote node GitOps source 21aceda 2026-06-24 00:45:30 +00:00
HWLAB node GitOps Bot 15b4703fc3 chore: promote node GitOps source 9958993 2026-06-24 00:34:36 +00:00
HWLAB node GitOps Bot 1114a63e29 chore: promote node GitOps source 024ecf3 2026-06-24 00:27:02 +00:00
HWLAB node GitOps Bot 3563861c4b chore: promote node GitOps source b22fd72 2026-06-24 00:21:06 +00:00
HWLAB node GitOps Bot ba97c844c6 chore: promote node GitOps source 1018f1e 2026-06-23 22:49:27 +00:00
HWLAB node GitOps Bot 2ef690cb21 chore: promote node GitOps source 9e094a6 2026-06-23 22:39:42 +00:00
HWLAB node GitOps Bot 649c9ada31 chore: promote node GitOps source 1cfb09c 2026-06-23 22:06:57 +00:00
HWLAB node GitOps Bot ccbde9b9de chore: promote node GitOps source a7e4de6 2026-06-23 21:55:50 +00:00
HWLAB node GitOps Bot eda000c0cf chore: promote node GitOps source 0b4cec3 2026-06-23 21:40:21 +00:00
HWLAB node GitOps Bot fe29ddbd0b chore: promote node GitOps source 6f02aa0 2026-06-23 21:22:31 +00:00
HWLAB node GitOps Bot dae7ee13ca chore: promote node GitOps source 7ad24b5 2026-06-23 21:16:35 +00:00
HWLAB node GitOps Bot 3427491989 chore: promote node GitOps source d0a00ab 2026-06-23 21:03:47 +00:00
HWLAB node GitOps Bot 214006abbf chore: promote node GitOps source db6e889 2026-06-23 20:40:15 +00:00
HWLAB node GitOps Bot 6036952d7b chore: promote node GitOps source da86d56 2026-06-23 19:13:07 +00:00
HWLAB node GitOps Bot 2d562fbac7 chore: promote node GitOps source b61fb4e 2026-06-23 18:42:12 +00:00
HWLAB node GitOps Bot d9914668a5 chore: promote node GitOps source 6dcf833 2026-06-23 18:24:47 +00:00
HWLAB node GitOps Bot 4b9edcd44e chore: promote node GitOps source d4bcf7d 2026-06-23 18:17:34 +00:00
HWLAB node GitOps Bot 2bf8faed75 chore: promote node GitOps source e2813e8 2026-06-23 18:01:01 +00:00
HWLAB node GitOps Bot ea4abe429b chore: promote node GitOps source ebb9580 2026-06-23 17:56:38 +00:00
HWLAB node GitOps Bot f8980003ed chore: promote node GitOps source 8a382d4 2026-06-23 17:45:52 +00:00
HWLAB node GitOps Bot 0fd82a8aed chore: promote node GitOps source f7db5e7 2026-06-23 17:36:26 +00:00
HWLAB node GitOps Bot 048548ff29 chore: promote node GitOps source 0a8da60 2026-06-23 17:24:03 +00:00
HWLAB node GitOps Bot e502fc93ea chore: promote node GitOps source b2b6d20 2026-06-23 17:09:40 +00:00
HWLAB node GitOps Bot d8ddf89025 chore: promote node GitOps source 0faea26 2026-06-23 16:57:25 +00:00
HWLAB node GitOps Bot 7227766b06 chore: promote node GitOps source 21f349f 2026-06-23 15:58:15 +00:00
HWLAB node GitOps Bot a1b77a6b1c chore: promote node GitOps source aed4e9b 2026-06-23 15:31:28 +00:00
HWLAB node GitOps Bot 10a8843d44 chore: promote node GitOps source 6d359bf 2026-06-23 15:18:22 +00:00
HWLAB node GitOps Bot e924891137 chore: promote node GitOps source 0b6fc63 2026-06-23 14:13:29 +00:00
HWLAB node GitOps Bot d7e20a041b chore: promote node GitOps source 79e71db 2026-06-23 13:59:46 +00:00
HWLAB node GitOps Bot eb34e381e6 chore: promote node GitOps source f5cf250 2026-06-23 13:43:44 +00:00
HWLAB node GitOps Bot c8f4078622 chore: promote node GitOps source f9b9402 2026-06-23 13:30:05 +00:00
HWLAB node GitOps Bot f129c9004e chore: promote node GitOps source d63b08c 2026-06-23 12:58:31 +00:00
HWLAB node GitOps Bot 2857179edc chore: promote node GitOps source 839b85d 2026-06-23 12:40:26 +00:00
HWLAB node GitOps Bot a85b84062c chore: promote node GitOps source e3a8c20 2026-06-23 12:17:34 +00:00
HWLAB node GitOps Bot 10b595532a chore: promote node GitOps source 4f7b53f 2026-06-23 11:46:12 +00:00
HWLAB node GitOps Bot 6b0b44cdbe chore: promote node GitOps source 7ef77d8 2026-06-23 11:37:45 +00:00
HWLAB node GitOps Bot 45e3d02f67 chore: promote node GitOps source 7d7fd82 2026-06-23 11:30:44 +00:00
HWLAB node GitOps Bot 70a99e40be chore: promote node GitOps source bf030c3 2026-06-23 11:24:59 +00:00
HWLAB node GitOps Bot bd8c6e28c4 chore: promote node GitOps source 64bee6e 2026-06-23 11:02:06 +00:00
HWLAB node GitOps Bot 1cba08471d chore: promote node GitOps source 1693947 2026-06-23 10:44:13 +00:00
HWLAB node GitOps Bot 46a2d3d86b chore: promote node GitOps source c323fbd 2026-06-23 08:37:53 +00:00
HWLAB node GitOps Bot de9c91fc99 chore: promote node GitOps source 2a313e1 2026-06-23 07:45:43 +00:00
HWLAB node GitOps Bot d4a0dc83d4 chore: promote node GitOps source 4759afa 2026-06-23 06:33:07 +00:00
HWLAB node GitOps Bot 7bb4f7104d chore: promote node GitOps source 9fc6f65 2026-06-23 06:18:12 +00:00
HWLAB node GitOps Bot 7f2ca737ba chore: promote node GitOps source 730c1a7 2026-06-23 06:10:29 +00:00
HWLAB node GitOps Bot 4f939ed7f1 chore: promote node GitOps source 949b11d 2026-06-23 06:00:07 +00:00
HWLAB node GitOps Bot 958ad22d0f chore: promote node GitOps source 0411e7e 2026-06-23 05:52:31 +00:00
HWLAB node GitOps Bot 3875dc28a5 chore: promote node GitOps source 4e0e52a 2026-06-23 05:29:17 +00:00
HWLAB node GitOps Bot bad1631855 chore: promote node GitOps source 4c276a7 2026-06-23 05:08:56 +00:00
HWLAB node GitOps Bot d5e7b67c8a chore: promote node GitOps source befd0f0 2026-06-23 04:52:37 +00:00
HWLAB node GitOps Bot 22b2407940 chore: promote node GitOps source ce4b333 2026-06-23 02:58:57 +00:00
HWLAB node GitOps Bot 3f9fd7d4e1 chore: promote node GitOps source 8aa8a9c 2026-06-23 02:35:36 +00:00
HWLAB node GitOps Bot 11698618f2 chore: promote node GitOps source ee8181f 2026-06-23 02:22:56 +00:00
HWLAB node GitOps Bot 674fb81f20 chore: promote node GitOps source 78a57dc 2026-06-23 02:07:55 +00:00
HWLAB node GitOps Bot d26f13020d chore: promote node GitOps source 56acbf7 2026-06-23 00:53:48 +00:00
HWLAB node GitOps Bot b9efe5e199 chore: promote node GitOps source f672255 2026-06-23 00:43:06 +00:00
HWLAB node GitOps Bot 5967748771 chore: promote node GitOps source f672255 2026-06-23 00:22:14 +00:00
HWLAB node GitOps Bot e027830344 chore: promote node GitOps source 65f75da 2026-06-22 23:55:07 +00:00
HWLAB node GitOps Bot 3f444ad6da chore: promote node GitOps source 84cb8bb 2026-06-22 23:17:30 +00:00
HWLAB node GitOps Bot 51f902d85c chore: promote node GitOps source 0d0fdd0 2026-06-22 22:50:57 +00:00
HWLAB node GitOps Bot 9b05328148 chore: promote node GitOps source bcb3a4d 2026-06-22 22:35:16 +00:00
HWLAB node GitOps Bot 6b582f2081 chore: promote node GitOps source 6e68cac 2026-06-22 22:00:08 +00:00
HWLAB node GitOps Bot 204afe9edc chore: promote node GitOps source 5e1cc8a 2026-06-22 21:33:10 +00:00
HWLAB node GitOps Bot 7d8db17f1a chore: promote node GitOps source 4cab31c 2026-06-22 21:06:27 +00:00
HWLAB node GitOps Bot 44ec1c493d chore: promote node GitOps source a5da983 2026-06-22 20:55:17 +00:00
HWLAB node GitOps Bot f3986cdf6f chore: promote node GitOps source 5000842 2026-06-22 20:38:08 +00:00
HWLAB node GitOps Bot f0fc26c34c chore: promote node GitOps source 7562dc3 2026-06-22 20:10:18 +00:00
HWLAB node GitOps Bot 5bcbedaf0a chore: promote node GitOps source cf717a5 2026-06-22 19:59:31 +00:00
HWLAB node GitOps Bot dfd3292138 chore: promote node GitOps source 2d3edda 2026-06-22 19:48:15 +00:00
HWLAB node GitOps Bot 5000be0abd chore: promote node GitOps source 83fb750 2026-06-22 19:39:32 +00:00
HWLAB node GitOps Bot 628ee8c922 chore: promote node GitOps source 5c1f620 2026-06-22 19:25:56 +00:00
HWLAB node GitOps Bot c93d9ee31e chore: promote node GitOps source 10deb6b 2026-06-22 19:13:07 +00:00
HWLAB node GitOps Bot a2a82408fa chore: promote node GitOps source 62fa3af 2026-06-22 19:03:20 +00:00
HWLAB node GitOps Bot 2fd2399057 chore: promote node GitOps source b095423 2026-06-22 18:52:34 +00:00
HWLAB node GitOps Bot 7acb5a7f62 chore: promote node GitOps source cf8d691 2026-06-22 18:13:20 +00:00
HWLAB node GitOps Bot ed572004c7 chore: promote node GitOps source 2b915dd 2026-06-22 17:53:58 +00:00
HWLAB node GitOps Bot f684f29824 chore: promote node GitOps source 87c153a 2026-06-22 17:44:17 +00:00
HWLAB node GitOps Bot b0784c98fd chore: promote node GitOps source 6a0b59e 2026-06-22 17:25:16 +00:00
HWLAB node GitOps Bot de208377c4 chore: promote node GitOps source d427564 2026-06-22 16:45:40 +00:00
HWLAB node GitOps Bot 2b8561c431 chore: promote node GitOps source a09e3cc 2026-06-22 16:02:09 +00:00
HWLAB node GitOps Bot c317c14051 chore: promote node GitOps source 7e26cf8 2026-06-22 14:41:04 +00:00
HWLAB node GitOps Bot 50c42b4071 chore: promote node GitOps source 0292ed2 2026-06-22 13:15:47 +00:00
HWLAB node GitOps Bot b20a344c9f chore: promote node GitOps source ce42689 2026-06-22 12:59:04 +00:00
HWLAB node GitOps Bot 7fece601ed chore: promote node GitOps source a0b3d31 2026-06-22 12:37:33 +00:00
HWLAB node GitOps Bot 5e48ae9e25 chore: promote node GitOps source bdca364 2026-06-22 12:17:04 +00:00
HWLAB node GitOps Bot 46b3b1a7b3 chore: promote node GitOps source 7b96397 2026-06-22 12:09:27 +00:00
HWLAB node GitOps Bot 19490dc425 chore: promote node GitOps source 356a35e 2026-06-22 11:55:34 +00:00
HWLAB node GitOps Bot f3bc9b7c2b chore: promote node GitOps source ca1fdb2 2026-06-22 11:44:28 +00:00
HWLAB node GitOps Bot d2ffa87211 chore: promote node GitOps source d871ccd 2026-06-22 11:32:31 +00:00
HWLAB node GitOps Bot 2d65eb4f11 chore: promote node GitOps source 6d05f20 2026-06-22 11:18:13 +00:00
HWLAB node GitOps Bot 09835fde0c chore: promote node GitOps source df487ec 2026-06-22 11:00:13 +00:00
HWLAB node GitOps Bot c0b63187be chore: promote node GitOps source 5c98660 2026-06-22 10:30:32 +00:00
HWLAB node GitOps Bot d2677b59cd chore: promote node GitOps source f330901 2026-06-22 10:03:30 +00:00
HWLAB node GitOps Bot fb617f2dac chore: promote node GitOps source 6ec00c6 2026-06-22 09:36:45 +00:00
HWLAB node GitOps Bot e97a372bf2 chore: promote node GitOps source 9deb7eb 2026-06-22 09:17:19 +00:00
HWLAB node GitOps Bot e77b6bedc4 chore: promote node GitOps source 69f451b 2026-06-22 09:08:25 +00:00
HWLAB node GitOps Bot 73f531136d chore: promote node GitOps source 0da4d42 2026-06-22 09:01:37 +00:00
HWLAB node GitOps Bot 1fc764c294 chore: promote node GitOps source b5376a0 2026-06-22 08:44:44 +00:00
HWLAB node GitOps Bot bae1ddb674 chore: promote node GitOps source 98d3b55 2026-06-22 08:29:01 +00:00
HWLAB node GitOps Bot 6417ac9c18 chore: promote node GitOps source 153727d 2026-06-22 08:07:18 +00:00
HWLAB node GitOps Bot 64287610de chore: promote node GitOps source f4d961a 2026-06-22 07:53:51 +00:00
HWLAB node GitOps Bot 2b4dbcb90b chore: promote node GitOps source 1ff6668 2026-06-22 07:36:53 +00:00
HWLAB node GitOps Bot 3f4ba21b75 chore: promote node GitOps source b86e660 2026-06-22 07:14:13 +00:00
HWLAB node GitOps Bot 120ae7be3a chore: promote node GitOps source 19b6db4 2026-06-22 06:21:08 +00:00
HWLAB node GitOps Bot f9cc15b186 chore: promote node GitOps source 0347aa6 2026-06-22 06:00:26 +00:00
HWLAB node GitOps Bot 94029020d9 chore: promote node GitOps source 0a54b32 2026-06-22 05:51:10 +00:00
HWLAB node GitOps Bot 06660e84da chore: promote node GitOps source 33c8c18 2026-06-22 05:42:12 +00:00
HWLAB node GitOps Bot 82cb5cad3a chore: promote node GitOps source 553f676 2026-06-22 05:31:54 +00:00
HWLAB node GitOps Bot 28b5313064 chore: promote node GitOps source ad2883f 2026-06-22 05:23:45 +00:00
HWLAB node GitOps Bot b0c39a4742 chore: promote node GitOps source d43e45d 2026-06-22 05:13:37 +00:00
HWLAB node GitOps Bot 6835fa69d7 chore: promote node GitOps source 167dd28 2026-06-22 05:04:23 +00:00
HWLAB node GitOps Bot 33f6d1bcc4 chore: promote node GitOps source a1277c9 2026-06-22 04:48:41 +00:00
HWLAB node GitOps Bot 0a8f9f03ba chore: promote node GitOps source d60e6df 2026-06-22 04:40:15 +00:00
HWLAB node GitOps Bot 4603db42ba chore: promote node GitOps source d70b663 2026-06-22 04:17:52 +00:00
HWLAB node GitOps Bot 25f4ef3cf1 chore: promote node GitOps source 152a6b2 2026-06-22 03:57:32 +00:00
HWLAB node GitOps Bot 5d821d0aa2 chore: promote node GitOps source 0be7db0 2026-06-22 02:59:37 +00:00
HWLAB node GitOps Bot ae501e4708 chore: promote node GitOps source 14db08d 2026-06-22 02:47:57 +00:00
HWLAB node GitOps Bot d8db7ffbad chore: promote node GitOps source 2e61c91 2026-06-22 02:27:17 +00:00
HWLAB node GitOps Bot 0c33415428 chore: promote node GitOps source 5ef0a22 2026-06-22 01:55:10 +00:00
HWLAB node GitOps Bot 2c02dc8c3a chore: promote node GitOps source 85c135d 2026-06-22 01:21:31 +00:00
HWLAB node GitOps Bot 9583247df6 chore: promote node GitOps source d32ea3b 2026-06-22 00:37:00 +00:00
HWLAB node GitOps Bot 5997c2621b chore: promote node GitOps source e657193 2026-06-22 00:24:54 +00:00
HWLAB node GitOps Bot 6e740be604 chore: promote node GitOps source f1a1a7f 2026-06-21 23:02:31 +00:00
HWLAB node GitOps Bot 1ecd1712c0 chore: promote node GitOps source 33bfbc5 2026-06-21 22:15:48 +00:00
HWLAB node GitOps Bot 525c4f7adb chore: promote node GitOps source d55161a 2026-06-21 22:07:47 +00:00
HWLAB node GitOps Bot f394f110c7 chore: promote node GitOps source 6c732f7 2026-06-21 21:58:56 +00:00
HWLAB node GitOps Bot f03561274a chore: promote node GitOps source 0db06ca 2026-06-21 21:31:30 +00:00
HWLAB node GitOps Bot cae1bbb79f chore: promote node GitOps source e7b6fb9 2026-06-21 21:22:34 +00:00
HWLAB node GitOps Bot d97e024d58 chore: promote node GitOps source 643732b 2026-06-21 20:34:25 +00:00
HWLAB node GitOps Bot b0aa2b7ed1 chore: promote node GitOps source 8c35223 2026-06-21 17:26:16 +00:00
HWLAB node GitOps Bot 02d6feb09c chore: promote node GitOps source 2d8e437 2026-06-21 17:09:15 +00:00
HWLAB node GitOps Bot fa1fbc2ee4 chore: promote node GitOps source 286322b 2026-06-21 15:10:13 +00:00
HWLAB node GitOps Bot 6597adcf02 chore: promote node GitOps source 2b94f0d 2026-06-21 15:00:45 +00:00
HWLAB node GitOps Bot dded831e85 chore: promote node GitOps source 4b7a06e 2026-06-21 14:13:16 +00:00
HWLAB node GitOps Bot 90b1fd6bc5 chore: promote node GitOps source e568e32 2026-06-21 13:58:36 +00:00
HWLAB node GitOps Bot 2a52f904c0 chore: promote node GitOps source 52abd33 2026-06-21 13:41:09 +00:00
HWLAB node GitOps Bot 125cfd2add chore: promote node GitOps source db41f6b 2026-06-21 13:27:40 +00:00
HWLAB node GitOps Bot ea7cd2a24c chore: promote node GitOps source e3ab677 2026-06-21 13:13:22 +00:00
HWLAB node GitOps Bot 1f13a04e85 chore: promote node GitOps source 350bfed 2026-06-21 12:38:23 +00:00
HWLAB node GitOps Bot 1ec5805c35 chore: promote node GitOps source e23e952 2026-06-21 11:25:07 +00:00
HWLAB node GitOps Bot 59da037497 chore: promote node GitOps source f9bf623 2026-06-21 11:09:09 +00:00
HWLAB node GitOps Bot 562e576418 chore: promote node GitOps source 0833e11 2026-06-21 10:47:16 +00:00
HWLAB node GitOps Bot ca94b2130b chore: promote node GitOps source 5078505 2026-06-21 10:25:07 +00:00
HWLAB node GitOps Bot 2e66958a0d chore: promote node GitOps source 8efdbbd 2026-06-21 08:24:23 +00:00
HWLAB node GitOps Bot f592bc88c1 chore: promote node GitOps source 3c27608 2026-06-21 07:49:19 +00:00
HWLAB node GitOps Bot e932369edc chore: promote node GitOps source 60af78a 2026-06-21 06:50:14 +00:00
HWLAB node GitOps Bot 2a88f9e864 chore: promote node GitOps source a5b47d5 2026-06-21 05:47:12 +00:00
HWLAB node GitOps Bot a48537d2dc chore: promote node GitOps source 426048b 2026-06-21 05:23:07 +00:00
HWLAB node GitOps Bot 022c514f49 chore: promote node GitOps source 70d90e8 2026-06-21 04:22:32 +00:00
HWLAB node GitOps Bot f00faaf8eb chore: promote node GitOps source 0f3bc3f 2026-06-21 04:09:33 +00:00
HWLAB node GitOps Bot fecfc28e00 chore: promote node GitOps source 2c660ed 2026-06-21 03:59:15 +00:00
HWLAB node GitOps Bot a807353f3d chore: promote node GitOps source fb43019 2026-06-21 03:06:08 +00:00
HWLAB node GitOps Bot 6cc1671cc2 chore: promote node GitOps source 4c562e7 2026-06-21 02:52:59 +00:00
HWLAB node GitOps Bot b5b94c45f8 chore: promote node GitOps source 6cafd49 2026-06-21 02:30:57 +00:00
HWLAB node GitOps Bot f5ea10203c chore: promote node GitOps source a0c5493 2026-06-21 01:59:06 +00:00
HWLAB node GitOps Bot 0182949e9d chore: promote node GitOps source 0c25d44 2026-06-21 01:52:52 +00:00
HWLAB node GitOps Bot 69cb09aa67 chore: promote node GitOps source bc8805b 2026-06-21 01:46:58 +00:00
HWLAB node GitOps Bot 6e2159a072 chore: promote node GitOps source 5b66e9d 2026-06-21 01:40:48 +00:00
HWLAB node GitOps Bot 8e599eda4f chore: promote node GitOps source 8b529c3 2026-06-21 01:18:57 +00:00
HWLAB node GitOps Bot 9254625513 chore: promote node GitOps source 8016849 2026-06-21 00:52:36 +00:00
HWLAB node GitOps Bot 10f9dafdaa chore: promote node GitOps source b976417 2026-06-21 00:30:35 +00:00
HWLAB node GitOps Bot fe6bbb0c39 chore: promote node GitOps source b976417 2026-06-20 23:55:43 +00:00
HWLAB node GitOps Bot 8243fdd0fe chore: promote node GitOps source a00907c 2026-06-20 23:35:20 +00:00
HWLAB node GitOps Bot 0d2b2731e8 chore: promote node GitOps source a00907c 2026-06-20 23:28:43 +00:00
HWLAB node GitOps Bot 6787816172 chore: promote node GitOps source 7b5b14c 2026-06-20 23:15:26 +00:00
HWLAB node GitOps Bot b8b9afa3ba chore: promote node GitOps source 4dc6e24 2026-06-20 22:59:57 +00:00
HWLAB node GitOps Bot 41b9cdd35d chore: promote node GitOps source f979919 2026-06-20 21:39:42 +00:00
HWLAB node GitOps Bot 186cefccd2 chore: promote node GitOps source d5c0914 2026-06-20 21:17:48 +00:00
HWLAB node GitOps Bot fa4a8a23cf chore: promote node GitOps source 85fbf6d 2026-06-20 21:10:09 +00:00
HWLAB node GitOps Bot d4001c7ef1 chore: promote node GitOps source 1e328d0 2026-06-20 20:56:23 +00:00
HWLAB node GitOps Bot f5737041f8 chore: promote node GitOps source ddcc135 2026-06-20 20:44:36 +00:00
HWLAB node GitOps Bot b12f93e13e chore: promote node GitOps source 4c21800 2026-06-20 20:33:09 +00:00
HWLAB node GitOps Bot f0948bb3cf chore: promote node GitOps source db6599c 2026-06-20 20:16:58 +00:00
HWLAB node GitOps Bot 4544012cbc chore: promote node GitOps source ed3547c 2026-06-20 20:03:03 +00:00
HWLAB node GitOps Bot 3d99396b12 chore: promote node GitOps source e6d7a9a 2026-06-20 19:48:07 +00:00
HWLAB node GitOps Bot 11224bce6b chore: promote node GitOps source 1703739 2026-06-20 19:31:43 +00:00
HWLAB node GitOps Bot 3794f9f5e9 chore: promote node GitOps source 6abed3f 2026-06-20 19:23:12 +00:00
HWLAB node GitOps Bot e8a8a042fb chore: promote node GitOps source 4ce6b2d 2026-06-20 19:10:17 +00:00
HWLAB node GitOps Bot 39ae475c42 chore: promote node GitOps source 224aac2 2026-06-20 18:58:17 +00:00
HWLAB node GitOps Bot 804af5c7fb chore: promote node GitOps source 2d08134 2026-06-20 18:45:51 +00:00
HWLAB node GitOps Bot 5e0e6666f1 chore: promote node GitOps source 21a812a 2026-06-20 17:58:25 +00:00
HWLAB node GitOps Bot 6fffcec939 chore: promote node GitOps source cd98135 2026-06-20 17:01:05 +00:00
HWLAB node GitOps Bot 4f3c654c24 chore: promote node GitOps source 967969d 2026-06-20 12:48:26 +00:00
HWLAB node GitOps Bot a0d13ec542 chore: promote node GitOps source 971922b 2026-06-20 12:37:10 +00:00
HWLAB node GitOps Bot b6c49c4df9 chore: promote node GitOps source fb1fe8d 2026-06-20 12:34:00 +00:00
HWLAB node GitOps Bot 44f7f8e14a chore: promote node GitOps source 9488df3 2026-06-20 12:27:54 +00:00
HWLAB node GitOps Bot dd814b4e6e chore: promote node GitOps source 4bd7ef5 2026-06-20 12:18:28 +00:00
HWLAB node GitOps Bot 1b5d98cfb4 chore: promote node GitOps source c4e44e1 2026-06-20 12:08:35 +00:00
HWLAB node GitOps Bot 72a706589c chore: promote node GitOps source 49c6fad 2026-06-20 11:48:47 +00:00
HWLAB node GitOps Bot e1aba6de43 chore: promote node GitOps source 1aea44d 2026-06-20 09:15:51 +00:00
HWLAB node GitOps Bot 67c9455caa chore: promote node GitOps source 1aea44d 2026-06-20 09:03:05 +00:00
HWLAB node GitOps Bot fb7a9ffcba chore: promote node GitOps source eaacdaf 2026-06-20 08:43:41 +00:00
HWLAB node GitOps Bot 8e758a4c82 chore: promote node GitOps source eaacdaf 2026-06-20 08:31:14 +00:00
HWLAB node GitOps Bot 93c4919fcf chore: promote node GitOps source c5f51f2 2026-06-20 08:18:02 +00:00
HWLAB node GitOps Bot c2adbedf26 chore: promote node GitOps source 6d014f1 2026-06-20 08:07:27 +00:00
HWLAB node GitOps Bot 5a1f36a548 chore: promote node GitOps source cf21982 2026-06-20 07:42:56 +00:00
HWLAB node GitOps Bot 86f522b8d8 chore: promote node GitOps source ef87658 2026-06-20 07:12:20 +00:00
HWLAB node GitOps Bot b5af976f23 chore: promote node GitOps source 199ee18 2026-06-20 06:57:17 +00:00
HWLAB node GitOps Bot 0dfad62fc7 chore: promote node GitOps source 0d91fe1 2026-06-20 06:29:55 +00:00
HWLAB node GitOps Bot cc5c24ca2c chore: promote node GitOps source bcd90da 2026-06-20 06:12:46 +00:00
HWLAB node GitOps Bot efae90eabb chore: promote node GitOps source 5124713 2026-06-20 06:00:17 +00:00
HWLAB node GitOps Bot fa9d4ed057 chore: promote node GitOps source d2e147c 2026-06-20 05:51:13 +00:00
HWLAB node GitOps Bot 3d01879460 chore: promote node GitOps source bd4bc1f 2026-06-20 05:48:26 +00:00
HWLAB node GitOps Bot 2b0d99c1b9 chore: promote node GitOps source 028df20 2026-06-20 05:34:25 +00:00
HWLAB node GitOps Bot a6c1d64dca chore: promote node GitOps source 0346295 2026-06-20 05:30:18 +00:00
HWLAB node GitOps Bot d52ee2df80 chore: promote node GitOps source 96704ea 2026-06-20 04:49:33 +00:00
HWLAB node GitOps Bot ac8c2c6e2b chore: promote node GitOps source c12e488 2026-06-20 04:35:56 +00:00
HWLAB node GitOps Bot e2d24da13f chore: promote node GitOps source dc127a9 2026-06-20 04:20:56 +00:00
HWLAB node GitOps Bot 3f313c425f chore: promote node GitOps source f41db95 2026-06-20 04:05:47 +00:00
HWLAB node GitOps Bot f5291b23fa chore: promote node GitOps source ecbb13c 2026-06-20 03:34:16 +00:00
HWLAB node GitOps Bot 29bb56e931 chore: promote node GitOps source c410a71 2026-06-20 03:20:31 +00:00
HWLAB node GitOps Bot 4c3be4407f chore: promote node GitOps source 747ab0b 2026-06-20 02:59:25 +00:00
HWLAB node GitOps Bot 645595b03a chore: promote node GitOps source 001a430 2026-06-20 02:43:32 +00:00
HWLAB node GitOps Bot 7725581ed1 chore: promote node GitOps source f637f32 2026-06-20 02:31:59 +00:00
HWLAB node GitOps Bot ab6cb789d9 chore: promote node GitOps source 322ba24 2026-06-20 02:29:23 +00:00
HWLAB node GitOps Bot 733b0b5376 chore: promote node GitOps source 809f3a2 2026-06-20 02:22:21 +00:00
HWLAB node GitOps Bot f820d4bb07 chore: promote node GitOps source f07d834 2026-06-20 02:14:17 +00:00
HWLAB node GitOps Bot f5afc659e9 chore: promote node GitOps source 57ba729 2026-06-20 02:04:56 +00:00
HWLAB node GitOps Bot 7f2e4473de chore: promote node GitOps source 4adbfd3 2026-06-20 01:54:46 +00:00
HWLAB node GitOps Bot afe582867b chore: promote node GitOps source 40a54ee 2026-06-20 01:37:25 +00:00
HWLAB node GitOps Bot 56d5d87db9 chore: promote node GitOps source 9096fcb 2026-06-20 01:20:16 +00:00
HWLAB node GitOps Bot bedc8b5486 chore: promote node GitOps source e0127f1 2026-06-20 01:05:14 +00:00
HWLAB node GitOps Bot d9d2db5fa6 chore: promote node GitOps source 77836d4 2026-06-20 00:42:29 +00:00
HWLAB node GitOps Bot 672d74a480 chore: promote node GitOps source 7acbc03 2026-06-20 00:04:29 +00:00
HWLAB node GitOps Bot fac6b7adc9 chore: promote node GitOps source 037043b 2026-06-19 18:28:37 +00:00
HWLAB node GitOps Bot c92ad0b1b8 chore: promote node GitOps source 9493d85 2026-06-19 18:06:13 +00:00
HWLAB node GitOps Bot a90870d2e3 chore: promote node GitOps source ed7d187 2026-06-19 17:51:20 +00:00
HWLAB node GitOps Bot e9d35332c1 chore: promote node GitOps source 5d8b9ff 2026-06-19 17:37:10 +00:00
HWLAB node GitOps Bot 67be11247b chore: promote node GitOps source 2463334 2026-06-19 17:22:46 +00:00
HWLAB node GitOps Bot ff2520fec6 chore: promote node GitOps source faca69e 2026-06-19 16:51:04 +00:00
HWLAB node GitOps Bot 92ea55c45d chore: promote node GitOps source 41e5d62 2026-06-19 16:33:14 +00:00
HWLAB node GitOps Bot 8c857dbc73 chore: promote node GitOps source 78113de 2026-06-19 16:15:16 +00:00
HWLAB node GitOps Bot aa68391f11 chore: promote node GitOps source d46d221 2026-06-19 16:12:29 +00:00
HWLAB node GitOps Bot f3df52a09f chore: promote node GitOps source fa72524 2026-06-19 15:46:05 +00:00
HWLAB node GitOps Bot e437f345e6 chore: promote node GitOps source 1e5c7c5 2026-06-19 15:09:12 +00:00
HWLAB node GitOps Bot c06d951110 chore: promote node GitOps source bfceaca 2026-06-19 14:14:50 +00:00
HWLAB node GitOps Bot 1edfb19068 chore: promote node GitOps source 95797da 2026-06-19 13:28:01 +00:00
HWLAB node GitOps Bot 3dc68040ef chore: promote node GitOps source 00852f6 2026-06-19 09:07:58 +00:00
HWLAB node GitOps Bot 682d2e5afe chore: promote node GitOps source 1db6016 2026-06-19 08:58:07 +00:00
HWLAB node GitOps Bot e82e216de5 chore: promote node GitOps source 2e52043 2026-06-19 08:54:39 +00:00
HWLAB node GitOps Bot a3566e2cea chore: promote node GitOps source 80dc11f 2026-06-19 07:44:36 +00:00
HWLAB node GitOps Bot 27c92abe3c chore: promote node GitOps source 8dc4ae2 2026-06-19 07:35:19 +00:00
HWLAB node GitOps Bot b879ba4569 chore: promote node GitOps source 87da6ac 2026-06-19 07:21:35 +00:00
HWLAB node GitOps Bot 828890f7b4 chore: promote node GitOps source a2dd8a8 2026-06-19 07:03:50 +00:00
HWLAB node GitOps Bot e998d56fd7 chore: promote node GitOps source db518fe 2026-06-19 06:40:09 +00:00
HWLAB node GitOps Bot 757bee271f chore: promote node GitOps source 0650884 2026-06-19 05:09:50 +00:00
HWLAB node GitOps Bot 91e8d0fe06 chore: promote node GitOps source d318179 2026-06-19 05:04:51 +00:00
HWLAB node GitOps Bot 9ad04f936e chore: promote node GitOps source 8f22923 2026-06-19 04:50:26 +00:00
HWLAB node GitOps Bot 51a6087c90 chore: promote node GitOps source 037ecd5 2026-06-19 04:46:54 +00:00
HWLAB node GitOps Bot d75317489d chore: promote node GitOps source 005c3a2 2026-06-19 04:34:56 +00:00
HWLAB node GitOps Bot ebc10eae1f chore: promote node GitOps source b780503 2026-06-19 04:11:45 +00:00
HWLAB node GitOps Bot 8ede14a6b6 chore: promote node GitOps source 0169125 2026-06-19 03:16:17 +00:00
HWLAB node GitOps Bot 9cf42248c1 chore: promote node GitOps source 034b9b5 2026-06-19 03:10:38 +00:00
HWLAB node GitOps Bot a853c8cf16 chore: promote node GitOps source 3eb0225 2026-06-19 02:52:27 +00:00
HWLAB node GitOps Bot 2eed673179 chore: promote node GitOps source d32a4f6 2026-06-19 02:37:13 +00:00
HWLAB node GitOps Bot 823a1c01ad chore: promote node GitOps source acbcca7 2026-06-19 01:18:13 +00:00
HWLAB node GitOps Bot 6919083134 chore: promote node GitOps source 3c60b9a 2026-06-18 21:02:45 +00:00
HWLAB node GitOps Bot 0d0eeb66e2 chore: promote node GitOps source cd7fc6e 2026-06-18 20:59:53 +00:00
HWLAB node GitOps Bot 2a85ceb5b4 chore: promote node GitOps source 928277d 2026-06-18 20:51:37 +00:00
HWLAB node GitOps Bot a23fecf05e chore: promote node GitOps source 77818eb 2026-06-18 20:23:04 +00:00
HWLAB node GitOps Bot b38fed4459 chore: promote node GitOps source 6f13f5d 2026-06-18 20:20:40 +00:00
HWLAB node GitOps Bot c50c17f377 chore: promote node GitOps source d7f047e 2026-06-18 18:51:09 +00:00
HWLAB node GitOps Bot d3bef37344 chore: promote node GitOps source 9403104 2026-06-18 17:52:24 +00:00
HWLAB node GitOps Bot 8428c276aa chore: promote node GitOps source 587396e 2026-06-18 17:40:31 +00:00
HWLAB node GitOps Bot e6a421a2c4 chore: promote node GitOps source 23a946a 2026-06-18 17:34:38 +00:00
HWLAB node GitOps Bot 513d78020d chore: promote node GitOps source 3a211ec 2026-06-18 17:22:26 +00:00
HWLAB node GitOps Bot 55f7d4d62c chore: promote node GitOps source 244844e 2026-06-18 17:18:57 +00:00
HWLAB node GitOps Bot c37c9a92e0 chore: promote node GitOps source 9798713 2026-06-18 17:12:59 +00:00
HWLAB node GitOps Bot 2c7e813930 chore: promote node GitOps source f1e605b 2026-06-18 16:37:08 +00:00
HWLAB node GitOps Bot a50ff9e183 chore: promote node GitOps source 72245c9 2026-06-18 16:30:32 +00:00
HWLAB node GitOps Bot d9e14bf97f chore: promote node GitOps source 1d90f10 2026-06-18 16:22:55 +00:00
HWLAB node GitOps Bot fd14156eda chore: promote node GitOps source 8f11fef 2026-06-18 16:14:12 +00:00
HWLAB node GitOps Bot c32eac079e chore: promote node GitOps source 62308c8 2026-06-18 15:50:37 +00:00
HWLAB node GitOps Bot fae0bf0c94 chore: promote node GitOps source d7372aa 2026-06-18 15:21:26 +00:00
HWLAB node GitOps Bot d187a091dc chore: promote node GitOps source 5b05981 2026-06-18 14:39:44 +00:00
HWLAB node GitOps Bot 58f3c4895f chore: promote node GitOps source 522605e 2026-06-18 13:52:30 +00:00
HWLAB node GitOps Bot dea362b6a0 chore: promote node GitOps source 95931fe 2026-06-18 12:18:37 +00:00
HWLAB node GitOps Bot 5796c9793c chore: promote node GitOps source 73cf366 2026-06-18 11:39:20 +00:00
HWLAB node GitOps Bot 3d2e3f95cd chore: promote node GitOps source 6bc2301 2026-06-18 11:20:21 +00:00
HWLAB node GitOps Bot 8536352403 chore: promote node GitOps source b12a74e 2026-06-18 10:43:00 +00:00
HWLAB node GitOps Bot 4cbcdd2c39 chore: promote node GitOps source 3e34cce 2026-06-18 10:18:07 +00:00
HWLAB node GitOps Bot 467af6f7c2 chore: promote node GitOps source ac0d5db 2026-06-18 10:12:48 +00:00
HWLAB node GitOps Bot 4214040394 chore: promote node GitOps source 5604cd0 2026-06-18 10:05:34 +00:00
HWLAB node GitOps Bot 02da764034 chore: promote node GitOps source 67f79f2 2026-06-18 09:45:58 +00:00
HWLAB node GitOps Bot d4d362ec20 chore: promote node GitOps source 85fc4e6 2026-06-18 09:42:36 +00:00
HWLAB node GitOps Bot d7cddcefb0 chore: promote node GitOps source 9849f7d 2026-06-18 09:21:38 +00:00
HWLAB node GitOps Bot 519bfb19e2 chore: promote node GitOps source 1cdf262 2026-06-18 08:26:06 +00:00
HWLAB node GitOps Bot 2ff64d669d chore: promote node GitOps source 53e51cd 2026-06-18 08:01:17 +00:00
HWLAB node GitOps Bot a98d0354c8 chore: promote node GitOps source b625ae2 2026-06-18 07:27:38 +00:00
HWLAB node GitOps Bot d31cb6e389 chore: promote node GitOps source dc4cac0 2026-06-18 05:44:20 +00:00
HWLAB node GitOps Bot 71edc8a514 chore: promote node GitOps source 5150f79 2026-06-18 05:39:44 +00:00
HWLAB node GitOps Bot 886f8b9e1e chore: promote node GitOps source a8aec11 2026-06-18 05:21:19 +00:00
HWLAB node GitOps Bot 0047a7df81 chore: promote node GitOps source 9db2116 2026-06-18 05:08:00 +00:00
HWLAB node GitOps Bot 29a8b8fb63 chore: promote node GitOps source 01e41c0 2026-06-18 04:44:17 +00:00
HWLAB node GitOps Bot 269c731996 chore: promote node GitOps source b5c29b8 2026-06-18 04:31:41 +00:00
HWLAB node GitOps Bot 73ad0d909e chore: promote node GitOps source 57b81ea 2026-06-18 04:17:44 +00:00
HWLAB node GitOps Bot f5e3b9d20b chore: promote node GitOps source c24f0d8 2026-06-18 03:49:48 +00:00
HWLAB node GitOps Bot 5474697ca6 chore: promote node GitOps source 14df63a 2026-06-18 03:43:22 +00:00
HWLAB node GitOps Bot 0ccf3ca1f2 chore: promote node GitOps source 3abf7e2 2026-06-18 02:39:18 +00:00
HWLAB node GitOps Bot 53a40f3e4a chore: promote node GitOps source acbbdfa 2026-06-18 00:54:13 +00:00
HWLAB node GitOps Bot e064bb7d02 chore: promote node GitOps source e9f09d0 2026-06-17 17:48:48 +00:00
HWLAB node GitOps Bot 4023b30a2f chore: promote node GitOps source 7f5b4f5 2026-06-17 17:28:35 +00:00
HWLAB node GitOps Bot a5c724f715 chore: promote node GitOps source 69507e7 2026-06-17 17:17:20 +00:00
HWLAB node GitOps Bot 7a5d238245 chore: promote node GitOps source 04109a0 2026-06-17 16:56:35 +00:00
HWLAB node GitOps Bot 22fc28ebfb chore: promote node GitOps source c614689 2026-06-17 16:24:08 +00:00
HWLAB node GitOps Bot 2aee1f7dde chore: promote node GitOps source 0ee3d2a 2026-06-17 15:23:56 +00:00
HWLAB node GitOps Bot e3405e272a chore: promote node GitOps source ea09705 2026-06-17 14:54:01 +00:00
HWLAB node GitOps Bot 73b23f29b7 chore: promote node GitOps source 77339d9 2026-06-17 14:46:31 +00:00
HWLAB node GitOps Bot 427ca08aa0 chore: promote node GitOps source c5aee42 2026-06-17 14:41:10 +00:00
HWLAB node GitOps Bot e302c18d06 chore: promote node GitOps source 3704051 2026-06-17 14:34:57 +00:00
HWLAB node GitOps Bot 400116df92 chore: promote node GitOps source 854241e 2026-06-17 14:19:51 +00:00
HWLAB node GitOps Bot fbaec55938 chore: promote node GitOps source b74fc22 2026-06-17 13:23:10 +00:00
HWLAB node GitOps Bot 2e50261f33 chore: promote node GitOps source 9611d12 2026-06-17 12:59:28 +00:00
HWLAB node GitOps Bot 23c4539fd4 chore: promote node GitOps source 88d0842 2026-06-17 12:52:30 +00:00
HWLAB node GitOps Bot 2a80787db8 chore: promote node GitOps source 1e7b680 2026-06-17 12:13:58 +00:00
HWLAB node GitOps Bot ad3c3cafbd chore: promote node GitOps source 450ac16 2026-06-17 12:04:16 +00:00
HWLAB node GitOps Bot 0d3685e31c chore: promote node GitOps source 2821566 2026-06-17 11:42:41 +00:00
HWLAB node GitOps Bot afbe5a2ad2 chore: promote node GitOps source 4fb199d 2026-06-17 11:12:07 +00:00
HWLAB node GitOps Bot 39a94b7a4f chore: promote node GitOps source 5ef8f4f 2026-06-17 11:05:40 +00:00
HWLAB node GitOps Bot d1e37e03be chore: promote node GitOps source cc71beb 2026-06-17 10:48:23 +00:00
HWLAB node GitOps Bot d01e6014bc chore: promote node GitOps source bdd031f 2026-06-17 10:27:17 +00:00
HWLAB node GitOps Bot 2a2b88bcd8 chore: promote node GitOps source f5e8bb8 2026-06-17 10:11:44 +00:00
HWLAB node GitOps Bot fc9b19ccf4 chore: promote node GitOps source 537d537 2026-06-17 09:53:45 +00:00
HWLAB node GitOps Bot 3a99bedbf4 chore: promote node GitOps source ecce63a 2026-06-17 09:35:43 +00:00
HWLAB node GitOps Bot 1083a3890a chore: promote node GitOps source 08e17aa 2026-06-17 08:47:27 +00:00
HWLAB node GitOps Bot d7d5ef1b07 chore: promote node GitOps source 36dfceb 2026-06-17 07:25:38 +00:00
HWLAB node GitOps Bot ade010f922 chore: promote node GitOps source b769e25 2026-06-17 06:17:16 +00:00
HWLAB node GitOps Bot 4bd4a42a3c chore: promote node GitOps source e62bcc5 2026-06-17 05:34:13 +00:00
HWLAB node GitOps Bot a3ebd1c063 chore: promote node GitOps source 16df553 2026-06-17 04:55:27 +00:00
HWLAB node GitOps Bot 0381ee1c84 chore: promote node GitOps source 5bce620 2026-06-17 04:40:12 +00:00
HWLAB node GitOps Bot 50296a5d9e chore: promote node GitOps source 9e46034 2026-06-17 04:01:40 +00:00
HWLAB node GitOps Bot 69e24f676d chore: promote node GitOps source e0559f3 2026-06-17 03:15:11 +00:00
HWLAB node GitOps Bot 3e49593862 chore: promote node GitOps source a3132be 2026-06-17 01:43:43 +00:00
HWLAB node GitOps Bot a50cebc855 chore: promote node GitOps source b2fb1e0 2026-06-17 01:29:28 +00:00
HWLAB node GitOps Bot 6016d5b0a0 chore: promote node GitOps source 2064629 2026-06-17 01:15:57 +00:00
HWLAB node GitOps Bot 3ac7aa6798 chore: promote node GitOps source abb53e2 2026-06-17 00:29:41 +00:00
HWLAB node GitOps Bot 2b74d85d05 chore: promote node GitOps source 55946aa 2026-06-17 00:17:29 +00:00
HWLAB node GitOps Bot a4450d24a2 chore: promote node GitOps source 0147987 2026-06-16 23:55:00 +00:00
HWLAB node GitOps Bot af4e588ef4 chore: promote node GitOps source f038119 2026-06-16 23:25:06 +00:00
HWLAB node GitOps Bot bcf0aa6cbf chore: promote node GitOps source 09971a1 2026-06-16 23:09:36 +00:00
HWLAB node GitOps Bot dc89d16a27 chore: promote node GitOps source 834d882 2026-06-16 17:10:57 +00:00
HWLAB node GitOps Bot e4151377ec chore: promote node GitOps source 2b19081 2026-06-16 17:07:44 +00:00
HWLAB node GitOps Bot 1a8f7929de chore: promote node GitOps source e09d34d 2026-06-16 16:49:55 +00:00
HWLAB node GitOps Bot 9e89848e6a chore: promote node GitOps source 084445b 2026-06-16 16:37:27 +00:00
HWLAB node GitOps Bot a23dc25133 chore: promote node GitOps source 91272be 2026-06-16 16:20:15 +00:00
HWLAB node GitOps Bot 343aad1d1b chore: promote node GitOps source 576ce64 2026-06-16 15:58:36 +00:00
HWLAB node GitOps Bot 6277a6be06 chore: promote node GitOps source 101b8e5 2026-06-16 15:44:21 +00:00
HWLAB node GitOps Bot b813f09cd3 chore: promote node GitOps source 7078657 2026-06-16 15:32:41 +00:00
HWLAB node GitOps Bot 0ea755f85d chore: promote node GitOps source 0cd238c 2026-06-16 14:52:40 +00:00
HWLAB node GitOps Bot ddf012b068 chore: promote node GitOps source 32a2e2d 2026-06-16 14:30:09 +00:00
HWLAB node GitOps Bot 7bb243e7d3 chore: promote node GitOps source 32fec9a 2026-06-16 14:02:19 +00:00
HWLAB node GitOps Bot 03cbaeb625 chore: promote node GitOps source 70687cc 2026-06-16 11:45:59 +00:00
HWLAB node GitOps Bot 64c9491ffa chore: promote node GitOps source 32d16d4 2026-06-16 11:25:04 +00:00
HWLAB node GitOps Bot d7bdb370c8 chore: promote node GitOps source ccc2cac 2026-06-16 10:34:39 +00:00
HWLAB node GitOps Bot 5ce7516c6d chore: promote node GitOps source d7202b8 2026-06-16 09:30:29 +00:00
HWLAB node GitOps Bot 0b8bff6451 chore: promote node GitOps source 24a0add 2026-06-16 07:44:48 +00:00
HWLAB node GitOps Bot 0926ec6844 chore: promote node GitOps source 917097c 2026-06-16 07:03:30 +00:00
HWLAB node GitOps Bot c4a10e9633 chore: promote node GitOps source 1fea791 2026-06-16 06:47:44 +00:00
HWLAB node GitOps Bot 33fb9fb939 chore: promote node GitOps source c80ba97 2026-06-16 05:50:55 +00:00
HWLAB node GitOps Bot d13ebd797b chore: promote node GitOps source 8ecf592 2026-06-16 02:54:53 +00:00
HWLAB node GitOps Bot cce918052e chore: promote node GitOps source e3af11f 2026-06-16 02:27:16 +00:00
HWLAB node GitOps Bot 636ea9cd0f chore: promote node GitOps source 424a2ce 2026-06-16 02:17:17 +00:00
HWLAB node GitOps Bot 0e95c045a9 chore: promote node GitOps source fdb11c2 2026-06-16 01:47:00 +00:00
HWLAB node GitOps Bot 9b482adaed chore: promote node GitOps source 40067e0 2026-06-16 01:36:22 +00:00
HWLAB node GitOps Bot 11d2887bbd chore: promote node GitOps source ad15005 2026-06-16 01:25:17 +00:00
HWLAB node GitOps Bot 8c0e6ac6cf chore: promote node GitOps source c71da8a 2026-06-16 01:05:37 +00:00
HWLAB node GitOps Bot dcf04da7ef chore: promote node GitOps source 126ccf7 2026-06-16 00:53:08 +00:00
HWLAB node GitOps Bot 7ecd7cd8b0 chore: promote node GitOps source 006c525 2026-06-16 00:05:32 +00:00
HWLAB node GitOps Bot ab7f66f4f1 chore: promote node GitOps source e8c4c95 2026-06-15 23:56:45 +00:00
HWLAB node GitOps Bot 267a6ae2f9 chore: promote node GitOps source acd3411 2026-06-15 23:06:12 +00:00
HWLAB node GitOps Bot d39de23af1 chore: promote node GitOps source f6e5c3d 2026-06-15 22:21:15 +00:00
HWLAB node GitOps Bot cf85241bfd chore: promote node GitOps source dfea4e7 2026-06-15 21:56:15 +00:00
HWLAB node GitOps Bot 6cc5e4dde8 chore: promote node GitOps source 8a767a3 2026-06-15 21:27:01 +00:00
HWLAB node GitOps Bot 475855cfff chore: promote node GitOps source 601e0df 2026-06-15 20:33:48 +00:00
HWLAB node GitOps Bot 731bb0727a chore: promote node GitOps source 4fd3e2f 2026-06-15 20:14:02 +00:00
HWLAB node GitOps Bot 3f6dc06f76 chore: promote node GitOps source e1d48f3 2026-06-15 19:49:11 +00:00
HWLAB node GitOps Bot 6d303c6426 chore: promote node GitOps source 36db34b 2026-06-15 19:29:44 +00:00
HWLAB node GitOps Bot b25e1f18f0 chore: promote node GitOps source 18da045 2026-06-15 18:35:44 +00:00
HWLAB node GitOps Bot 51732ca48e chore: promote node GitOps source f07bcdf 2026-06-15 17:11:59 +00:00
HWLAB node GitOps Bot 208814c7b6 chore: promote node GitOps source 8f4fb1b 2026-06-15 16:35:46 +00:00
HWLAB node GitOps Bot 74bcc91dc3 chore: promote node GitOps source c30cc4e 2026-06-15 16:20:17 +00:00
HWLAB node GitOps Bot 571162dc05 chore: promote node GitOps source 56bb02b 2026-06-15 15:07:18 +00:00
HWLAB node GitOps Bot 4306de73be chore: promote node GitOps source b9b312f 2026-06-15 14:32:19 +00:00
HWLAB node GitOps Bot 2661226d71 chore: promote node GitOps source 05aa30b 2026-06-15 14:13:14 +00:00
HWLAB node GitOps Bot 06cddd9721 chore: promote node GitOps source b41bae1 2026-06-15 13:39:12 +00:00
HWLAB node GitOps Bot 291a9aadc5 chore: promote node GitOps source ce7c265 2026-06-15 13:31:43 +00:00
HWLAB node GitOps Bot 533f7d858d chore: promote node GitOps source 0cbe2bc 2026-06-15 12:53:56 +00:00
HWLAB node GitOps Bot 6e43a21366 chore: promote node GitOps source 5094936 2026-06-15 12:24:11 +00:00
HWLAB node GitOps Bot a5d7636471 chore: promote node GitOps source af73701 2026-06-15 11:52:06 +00:00
HWLAB node GitOps Bot 02d05fb0e0 chore: promote node GitOps source ee8bb81 2026-06-15 11:15:08 +00:00
HWLAB node GitOps Bot 05e84c3b9b chore: promote node GitOps source 9c56d3f 2026-06-15 10:51:00 +00:00
HWLAB node GitOps Bot e028a1d448 chore: promote node GitOps source 9146e1d 2026-06-15 10:27:11 +00:00
HWLAB node GitOps Bot ae65137504 chore: promote node GitOps source 9da9307 2026-06-15 09:50:01 +00:00
HWLAB node GitOps Bot 3d1967b37c chore: promote node GitOps source 4fd1410 2026-06-15 08:50:52 +00:00
HWLAB node GitOps Bot 3368bc0fe3 chore: promote node GitOps source 6cf061c 2026-06-15 08:37:51 +00:00
HWLAB node GitOps Bot 6be8022772 chore: promote node GitOps source b592e19 2026-06-15 07:48:41 +00:00
HWLAB node GitOps Bot fb3647fa44 chore: promote node GitOps source f50f3c4 2026-06-15 06:48:54 +00:00
HWLAB node GitOps Bot bbf5ddefe3 chore: promote node GitOps source 6221634 2026-06-15 02:29:51 +00:00
HWLAB node GitOps Bot 7189fbe606 chore: promote node GitOps source 1ba3596 2026-06-15 02:02:32 +00:00
HWLAB node GitOps Bot f0794e9977 chore: promote node GitOps source 0fa6696 2026-06-14 18:08:14 +00:00
HWLAB node GitOps Bot a2817b806b chore: promote node GitOps source cba6b8d 2026-06-14 17:51:51 +00:00
HWLAB node GitOps Bot f7567a1a32 chore: promote node GitOps source 4ee3d48 2026-06-14 17:38:43 +00:00
HWLAB node GitOps Bot a7f74acac6 chore: promote node GitOps source 21c5cf3 2026-06-14 17:23:05 +00:00
HWLAB node GitOps Bot 2872ed2621 chore: promote node GitOps source f717401 2026-06-14 16:57:45 +00:00
HWLAB node GitOps Bot b24edad21e chore: promote node GitOps source c28235c 2026-06-14 13:25:42 +00:00
HWLAB node GitOps Bot 2d25842a21 chore: promote node GitOps source acd15ed 2026-06-14 12:59:31 +00:00
HWLAB node GitOps Bot 6373f403c0 chore: promote node GitOps source a35d862 2026-06-14 08:00:46 +00:00
HWLAB node GitOps Bot f2812fdf08 chore: promote node GitOps source 42d63ad 2026-06-14 07:43:28 +00:00
HWLAB node GitOps Bot f4a7cc9116 chore: promote node GitOps source ed80e6d 2026-06-14 07:24:59 +00:00
HWLAB node GitOps Bot e6fb7e7390 chore: promote node GitOps source 2e09962 2026-06-14 05:51:38 +00:00
HWLAB node GitOps Bot c3f2e4be3c chore: promote node GitOps source 3db6fd8 2026-06-14 05:28:21 +00:00
HWLAB node GitOps Bot c539375da7 chore: promote node GitOps source d2ce1a0 2026-06-14 03:59:25 +00:00
HWLAB node GitOps Bot 9915b8c34a chore: promote node GitOps source cb44812 2026-06-14 03:27:49 +00:00
HWLAB node GitOps Bot 4c2184e517 chore: promote node GitOps source 266e711 2026-06-14 03:09:05 +00:00
HWLAB node GitOps Bot 9769ba0663 chore: promote node GitOps source ee78ed9 2026-06-14 02:20:31 +00:00
HWLAB node GitOps Bot a467e46866 chore: promote node GitOps source b9dd25e 2026-06-14 02:05:39 +00:00
HWLAB node GitOps Bot 0c0a5f333a chore: promote node GitOps source 2255731 2026-06-13 21:43:43 +00:00
HWLAB node GitOps Bot 2eaae409c4 chore: promote node GitOps source 6532f4e 2026-06-13 21:21:34 +00:00
HWLAB node GitOps Bot 12f73bb4c6 chore: promote node GitOps source 09d885c 2026-06-13 20:28:47 +00:00
HWLAB node GitOps Bot fc7a77cbcb chore: promote node GitOps source c6b7abd 2026-06-13 19:56:31 +00:00
HWLAB node GitOps Bot fc40a40b65 chore: promote node GitOps source bef836a 2026-06-13 19:45:05 +00:00
HWLAB node GitOps Bot e0f7d1c272 chore: promote node GitOps source 928e2f4 2026-06-13 18:44:15 +00:00
HWLAB node GitOps Bot df7bd2c11f chore: promote node GitOps source 155530d 2026-06-13 18:18:35 +00:00
HWLAB node GitOps Bot 1e8db97c0f chore: promote node GitOps source c0cbdbb 2026-06-13 17:38:19 +00:00
HWLAB node GitOps Bot 3a5ee9b8ec chore: promote node GitOps source 6dcc096 2026-06-13 17:27:41 +00:00
HWLAB node GitOps Bot e57f0cc396 chore: promote node GitOps source a6eae27 2026-06-13 17:17:58 +00:00
HWLAB node GitOps Bot bcbe3a1b1b chore: promote node GitOps source 96eb22a 2026-06-13 16:59:32 +00:00
HWLAB node GitOps Bot 91ea619ee9 chore: promote node GitOps source 1db3396 2026-06-13 16:04:11 +00:00
HWLAB node GitOps Bot 8c61f7740a chore: promote node GitOps source 7bf2421 2026-06-13 15:52:40 +00:00
HWLAB node GitOps Bot 5d52ac5028 chore: promote node GitOps source 5de9978 2026-06-13 14:48:08 +00:00
HWLAB node GitOps Bot d9a22230e4 chore: promote node GitOps source 9279c5f 2026-06-13 13:44:48 +00:00
HWLAB node GitOps Bot 661e07ff50 chore: promote node GitOps source 3f8fc6b 2026-06-13 12:24:09 +00:00
HWLAB node GitOps Bot 0284f67f2f chore: promote node GitOps source 0328573 2026-06-13 11:14:16 +00:00
HWLAB node GitOps Bot 0e0082a362 chore: promote node GitOps source 0328573 2026-06-13 10:21:14 +00:00
HWLAB node GitOps Bot 0f7fc54081 chore: promote node GitOps source b8e92f6 2026-06-13 09:30:42 +00:00
HWLAB node GitOps Bot 4a914ca495 chore: promote node GitOps source 0042357 2026-06-13 00:34:57 +00:00
HWLAB node GitOps Bot 3465c06d4c chore: promote node GitOps source 0042357 2026-06-12 23:56:09 +00:00
HWLAB node GitOps Bot 682ee9a1da chore: promote node GitOps source 0042357 2026-06-12 23:27:04 +00:00
HWLAB node GitOps Bot 745292c1e2 chore: promote node GitOps source 0042357 2026-06-12 23:18:58 +00:00
HWLAB node GitOps Bot e8173bbaa4 chore: promote node GitOps source 0042357 2026-06-12 23:04:55 +00:00
HWLAB node GitOps Bot 95d3444cf6 chore: promote node GitOps source 0042357 2026-06-12 22:56:41 +00:00
HWLAB node GitOps Bot 9f53c16b7d chore: promote node GitOps source 0042357 2026-06-12 22:48:05 +00:00
HWLAB node GitOps Bot 9cef9cad81 chore: promote node GitOps source 0042357 2026-06-12 22:20:29 +00:00
HWLAB node GitOps Bot 5533a909de chore: promote node GitOps source 8969bdd 2026-06-12 21:49:40 +00:00
HWLAB node GitOps Bot 3df60b81cc chore: promote node GitOps source 8969bdd 2026-06-12 21:36:46 +00:00
HWLAB node GitOps Bot d8b2051bd0 chore: promote node GitOps source f3e0ad7 2026-06-12 21:04:12 +00:00
HWLAB node GitOps Bot 8f7bb75552 chore: promote node GitOps source f3e0ad7 2026-06-12 20:31:19 +00:00
HWLAB node GitOps Bot 002e5babaf chore: promote node GitOps source ca9ef72 2026-06-12 19:58:11 +00:00
HWLAB node GitOps Bot 65e869d94a chore: promote node GitOps source da0ca25 2026-06-12 18:56:41 +00:00
HWLAB node GitOps Bot cfc85fac84 chore: promote node GitOps source da0ca25 2026-06-12 18:46:53 +00:00
HWLAB node GitOps Bot d7904f86a6 chore: promote node GitOps source e1566e2 2026-06-12 18:29:30 +00:00
HWLAB node GitOps Bot 806780abc9 chore: promote node GitOps source 25e1125 2026-06-12 16:38:27 +00:00
HWLAB node GitOps Bot 89862d769e chore: promote node GitOps source 25e1125 2026-06-12 16:24:19 +00:00
HWLAB node GitOps Bot 1bca66f207 chore: promote node GitOps source 25e1125 2026-06-12 16:04:35 +00:00
HWLAB node GitOps Bot 1ae2bf53a5 chore: promote node GitOps source 6607ec6 2026-06-11 17:41:17 +00:00
HWLAB node GitOps Bot cf8c2bf7ee chore: promote node GitOps source 0dcadae 2026-06-09 04:29:38 +00:00
HWLAB node GitOps Bot cee4c1e669 chore: promote node GitOps source 1b026d0 2026-06-09 03:03:11 +00:00
HWLAB node GitOps Bot 387846c810 chore: promote node GitOps source f3a8615 2026-06-09 01:35:12 +00:00
HWLAB node GitOps Bot 7e668b226b chore: promote node GitOps source bdc90fb 2026-06-09 00:43:32 +00:00
HWLAB node GitOps Bot 5ce7152d2f chore: promote node GitOps source 1912c32 2026-06-08 16:38:28 +00:00
HWLAB node GitOps Bot 02f8089370 chore: promote node GitOps source 187fb80 2026-06-08 15:42:45 +00:00
HWLAB G14 GitOps Bot b890c524a6 chore: promote G14 GitOps source 1ce1a40 2026-06-08 09:52:38 +00:00
HWLAB G14 GitOps Bot c7085d8908 chore: promote G14 GitOps source 9ce42e8 2026-06-08 08:24:50 +00:00
HWLAB G14 GitOps Bot 4700967b55 chore: promote G14 GitOps source e06f348 2026-06-08 08:05:35 +00:00
HWLAB G14 GitOps Bot 211eefb345 chore: promote G14 GitOps source 34ee947 2026-06-08 05:30:15 +00:00
HWLAB G14 GitOps Bot d89031ed97 chore: promote G14 GitOps source 23c4148 2026-06-08 05:07:40 +00:00
HWLAB G14 GitOps Bot 3231564a01 chore: promote G14 GitOps source d07565c 2026-06-08 04:22:46 +00:00
HWLAB G14 GitOps Bot 148bc2c4e9 chore: promote G14 GitOps source fb09510 2026-06-08 04:04:11 +00:00
HWLAB G14 GitOps Bot 8346239800 chore: promote G14 GitOps source 1160089 2026-06-08 03:31:45 +00:00
HWLAB G14 GitOps Bot 876dca4dd5 chore: promote G14 GitOps source c52ba0d 2026-06-08 03:02:00 +00:00
HWLAB G14 GitOps Bot ee07b447ed chore: promote G14 GitOps source 6d1b1fd 2026-06-08 00:19:45 +00:00
HWLAB G14 GitOps Bot e3802f8e9d chore: promote G14 GitOps source 7408ba9 2026-06-07 21:33:06 +00:00
HWLAB G14 GitOps Bot 0a63a1f315 chore: promote G14 GitOps source 3478870 2026-06-07 19:25:15 +00:00
HWLAB G14 GitOps Bot 457537e5e2 chore: promote G14 GitOps source 97998ff 2026-06-07 15:03:15 +00:00
HWLAB G14 GitOps Bot fe168c23c0 chore: promote G14 GitOps source d3a9f59 2026-06-07 14:30:10 +00:00
HWLAB G14 GitOps Bot 5d60731117 chore: promote G14 GitOps source a592bd9 2026-06-07 14:01:10 +00:00
HWLAB G14 GitOps Bot f965214924 chore: promote G14 GitOps source 18bdaf3 2026-06-07 13:52:19 +00:00
HWLAB G14 GitOps Bot 1489be967d chore: promote G14 GitOps source 1b76fb3 2026-06-07 13:30:43 +00:00
HWLAB G14 GitOps Bot d5666a5162 chore: promote G14 GitOps source 7a7dac5 2026-06-07 12:55:27 +00:00
HWLAB G14 GitOps Bot af7d6f409d chore: promote G14 GitOps source c19b6ef 2026-06-07 12:21:31 +00:00
HWLAB G14 GitOps Bot ba3309ee0a chore: promote G14 GitOps source 28d363f 2026-06-07 10:27:57 +00:00
HWLAB G14 GitOps Bot de12471204 chore: promote G14 GitOps source 4c3a895 2026-06-07 10:20:58 +00:00
HWLAB G14 GitOps Bot 0bfdfbf9c8 chore: promote G14 GitOps source fd23405 2026-06-07 05:41:14 +00:00
HWLAB G14 GitOps Bot c47fb0cb91 chore: promote G14 GitOps source 2a7fc17 2026-06-06 11:46:45 +00:00
HWLAB G14 GitOps Bot eadb1e43c0 chore: promote G14 GitOps source 3580bf7 2026-06-06 10:45:11 +00:00
HWLAB G14 GitOps Bot f4b6e65ee2 chore: promote G14 GitOps source a38fa1a 2026-06-06 10:30:41 +00:00
HWLAB G14 GitOps Bot 482c3d7c97 chore: promote G14 GitOps source e5e8963 2026-06-06 10:14:00 +00:00
HWLAB G14 GitOps Bot 2e0c7f0595 chore: promote G14 GitOps source 1cd4191 2026-06-06 09:33:29 +00:00
HWLAB G14 GitOps Bot a9b49accaf chore: promote G14 GitOps source fc865db 2026-06-06 08:58:47 +00:00
HWLAB G14 GitOps Bot d2da12847c chore: promote G14 GitOps source b0a32e4 2026-06-06 08:55:51 +00:00
HWLAB G14 GitOps Bot 3b0d413a2f chore: promote G14 GitOps source 64b0b3e 2026-06-06 07:59:30 +00:00
HWLAB G14 GitOps Bot 603803813b chore: promote G14 GitOps source 00ddaf6 2026-06-06 06:24:25 +00:00
HWLAB G14 GitOps Bot 6273557921 chore: promote G14 GitOps source d5ed5ce 2026-06-06 06:01:44 +00:00
HWLAB G14 GitOps Bot 8f8b206030 chore: promote G14 GitOps source ec7e24d 2026-06-06 05:53:30 +00:00
HWLAB G14 GitOps Bot dc4895f65d chore: promote G14 GitOps source a79c624 2026-06-06 05:40:10 +00:00
HWLAB G14 GitOps Bot f0639fb235 chore: promote G14 GitOps source e5e376b 2026-06-06 05:30:00 +00:00
HWLAB G14 GitOps Bot de65f1c9e1 chore: promote G14 GitOps source 4eb5811 2026-06-06 05:12:40 +00:00
HWLAB G14 GitOps Bot 8dcdacdfe1 chore: promote G14 GitOps source a97fd6c 2026-06-06 04:57:54 +00:00
HWLAB G14 GitOps Bot ac1b4e52bd chore: promote G14 GitOps source dfdb920 2026-06-06 04:18:08 +00:00
HWLAB G14 GitOps Bot d521bf6b1b chore: promote G14 GitOps source a210728 2026-06-06 04:06:47 +00:00
HWLAB G14 GitOps Bot 5a0c7cbf1e chore: promote G14 GitOps source 3d073fe 2026-06-06 03:43:24 +00:00
HWLAB G14 GitOps Bot 0ee49f3065 chore: promote G14 GitOps source 62aeb94 2026-06-06 03:24:57 +00:00
HWLAB G14 GitOps Bot 230cecbc86 chore: promote G14 GitOps source 8507956 2026-06-06 02:50:45 +00:00
HWLAB G14 GitOps Bot fcd2025600 chore: promote G14 GitOps source 11897b7 2026-06-06 02:37:33 +00:00
HWLAB G14 GitOps Bot 1feb8a0546 chore: promote G14 GitOps source e2c33ae 2026-06-06 02:15:20 +00:00
HWLAB G14 GitOps Bot b376b1623c chore: promote G14 GitOps source 6afdb83 2026-06-06 01:58:55 +00:00
HWLAB G14 GitOps Bot f6098a1ab4 chore: promote G14 GitOps source 3293f90 2026-06-06 01:45:13 +00:00
HWLAB G14 GitOps Bot 8a212cd05b chore: promote G14 GitOps source bfe7c5e 2026-06-05 17:56:56 +00:00
HWLAB G14 GitOps Bot bf2cd7c24e chore: promote G14 GitOps source 459f296 2026-06-05 17:40:40 +00:00
HWLAB G14 GitOps Bot c8402dfb6c chore: promote G14 GitOps source 711a3ec 2026-06-05 17:26:42 +00:00
HWLAB G14 GitOps Bot a5da8b7f7f chore: promote G14 GitOps source eb9267a 2026-06-05 17:07:53 +00:00
HWLAB G14 GitOps Bot 7aa2295566 chore: promote G14 GitOps source 02c55ed 2026-06-05 16:49:32 +00:00
HWLAB G14 GitOps Bot 0386f4a5ff chore: promote G14 GitOps source ee2dae8 2026-06-05 16:30:25 +00:00
HWLAB G14 GitOps Bot 5be350eb0e chore: promote G14 GitOps source 0b2a1be 2026-06-05 16:26:08 +00:00
HWLAB G14 GitOps Bot 65b9e23f5e chore: promote G14 GitOps source 0b6aa9f 2026-06-05 15:31:17 +00:00
HWLAB G14 GitOps Bot 408b3ef73b chore: promote G14 GitOps source 24342fc 2026-06-05 15:27:30 +00:00
HWLAB G14 GitOps Bot 17337b13d6 chore: promote G14 GitOps source d322ed9 2026-06-05 15:21:57 +00:00
HWLAB G14 GitOps Bot 4457ec22c3 chore: promote G14 GitOps source c7122c2 2026-06-05 15:16:18 +00:00
HWLAB G14 GitOps Bot 558f34976f chore: promote G14 GitOps source fa92d6f 2026-06-05 15:06:26 +00:00
HWLAB G14 GitOps Bot cc1b0c981f chore: promote G14 GitOps source 26ca9e5 2026-06-05 15:02:40 +00:00
HWLAB G14 GitOps Bot 77506586b9 chore: promote G14 GitOps source b31c37f 2026-06-05 14:59:12 +00:00
HWLAB G14 GitOps Bot 032d99043e chore: promote G14 GitOps source 3d8a1fd 2026-06-05 14:42:20 +00:00
HWLAB G14 GitOps Bot 9da1b5ec1b chore: promote G14 GitOps source b11cdc0 2026-06-05 14:36:28 +00:00
HWLAB G14 GitOps Bot b08dc7fbc3 chore: promote G14 GitOps source 2f20bba 2026-06-05 14:29:42 +00:00
HWLAB G14 GitOps Bot 5e7c95e87f chore: promote G14 GitOps source 8ae0f55 2026-06-05 14:13:50 +00:00
HWLAB G14 GitOps Bot ceccccff85 chore: promote G14 GitOps source 318df85 2026-06-05 14:03:39 +00:00
HWLAB G14 GitOps Bot f5684fcc0a chore: promote G14 GitOps source 2adc2f6 2026-06-05 13:48:09 +00:00
HWLAB G14 GitOps Bot 98e66631e5 chore: promote G14 GitOps source 660afab 2026-06-05 13:33:38 +00:00
HWLAB G14 GitOps Bot f1a7f7b9f3 chore: promote G14 GitOps source 3045245 2026-06-05 12:08:56 +00:00
HWLAB G14 GitOps Bot 7be156df59 chore: promote G14 GitOps source acb44b5 2026-06-05 11:34:16 +00:00
HWLAB G14 GitOps Bot cbe17e85a8 chore: promote G14 GitOps source 26da97e 2026-06-05 10:05:01 +00:00
HWLAB G14 GitOps Bot 9ea9426fdd chore: promote G14 GitOps source 8a1cd5c 2026-06-05 09:21:07 +00:00
HWLAB G14 GitOps Bot 1059b45893 chore: promote G14 GitOps source 1605014 2026-06-05 09:05:06 +00:00
HWLAB G14 GitOps Bot fa450937fb chore: promote G14 GitOps source 9db919f 2026-06-05 08:28:26 +00:00
HWLAB G14 GitOps Bot 1e7d195da6 chore: promote G14 GitOps source 77f804d 2026-06-05 07:59:45 +00:00
HWLAB G14 GitOps Bot 8624749b74 chore: promote G14 GitOps source 8b3af4f 2026-06-05 07:28:25 +00:00
HWLAB G14 GitOps Bot 7de125ff2c chore: promote G14 GitOps source bea1521 2026-06-05 07:02:52 +00:00
HWLAB G14 GitOps Bot 5b6970c5f7 chore: promote G14 GitOps source 40b518b 2026-06-05 06:27:52 +00:00
HWLAB G14 GitOps Bot 7a15f8711b chore: promote G14 GitOps source 0dae74d 2026-06-05 06:05:38 +00:00
HWLAB G14 GitOps Bot 83823edc7e chore: promote G14 GitOps source f52d4b7 2026-06-05 05:07:18 +00:00
HWLAB G14 GitOps Bot da2d7d80a0 chore: promote G14 GitOps source aec6903 2026-06-05 04:10:06 +00:00
HWLAB G14 GitOps Bot d9661244eb chore: promote G14 GitOps source 41f537f 2026-06-05 04:07:00 +00:00
HWLAB G14 GitOps Bot 559694ef9b chore: promote G14 GitOps source 6938529 2026-06-05 03:58:42 +00:00
HWLAB G14 GitOps Bot bfe9472e65 chore: promote G14 GitOps source 45bd95e 2026-06-05 03:36:37 +00:00
HWLAB G14 GitOps Bot 58101a9f36 chore: promote G14 GitOps source 793d905 2026-06-05 03:31:06 +00:00
HWLAB G14 GitOps Bot 8d94691950 chore: promote G14 GitOps source c5d006b 2026-06-05 03:18:11 +00:00
HWLAB G14 GitOps Bot 8afecc888b chore: promote G14 GitOps source 48e3d24 2026-06-05 03:13:54 +00:00
HWLAB G14 GitOps Bot 5f11ca3530 chore: promote G14 GitOps source 578e429 2026-06-05 01:57:27 +00:00
HWLAB G14 GitOps Bot 26e5d35da8 chore: promote G14 GitOps source 40f798e 2026-06-05 01:44:47 +00:00
HWLAB G14 GitOps Bot b1a053e9e9 chore: promote G14 GitOps source 554269e 2026-06-05 01:16:00 +00:00
HWLAB G14 GitOps Bot 2e72a6b5d9 chore: promote G14 GitOps source 53cac4f 2026-06-05 01:02:49 +00:00
HWLAB G14 GitOps Bot a299172b91 chore: promote G14 GitOps source dd2487c 2026-06-05 00:54:30 +00:00
HWLAB G14 GitOps Bot 5cb77fdd91 chore: promote G14 GitOps source 2949748 2026-06-05 00:41:20 +00:00
HWLAB G14 GitOps Bot 8792b61dbd chore: promote G14 GitOps source 8b24eb8 2026-06-05 00:30:40 +00:00
HWLAB G14 GitOps Bot 4f8c4a1cb7 chore: promote G14 GitOps source 8697463 2026-06-04 18:30:55 +00:00
HWLAB G14 GitOps Bot 30373a61b9 chore: promote G14 GitOps source 8a48ed2 2026-06-04 18:10:15 +00:00
HWLAB G14 GitOps Bot 02702d7ffc chore: promote G14 GitOps source 4baea16 2026-06-04 17:52:44 +00:00
HWLAB G14 GitOps Bot 17b9ca9358 chore: promote G14 GitOps source 6422487 2026-06-04 17:10:54 +00:00
HWLAB G14 GitOps Bot 99d07510ba chore: promote G14 GitOps source 0c10056 2026-06-04 16:43:20 +00:00
HWLAB G14 GitOps Bot e155bf6eae chore: promote G14 GitOps source f7347dc 2026-06-04 16:25:52 +00:00
HWLAB G14 GitOps Bot 55d6b835d3 chore: promote G14 GitOps source b6615c2 2026-06-04 16:02:49 +00:00
HWLAB G14 GitOps Bot fc20447f4a chore: promote G14 GitOps source 0fdd659 2026-06-04 15:34:07 +00:00
HWLAB G14 GitOps Bot 5ee77eed8b chore: promote G14 GitOps source 8ab9d0c 2026-06-04 15:12:59 +00:00
HWLAB G14 GitOps Bot 380dce3961 chore: promote G14 GitOps source 99d0604 2026-06-04 14:56:06 +00:00
HWLAB G14 GitOps Bot edda82727d chore: promote G14 GitOps source de0f79c 2026-06-04 14:34:15 +00:00
HWLAB G14 GitOps Bot 1fb80d3b46 chore: promote G14 GitOps source ffae1c1 2026-06-04 14:20:16 +00:00
HWLAB G14 GitOps Bot 94118d24ea chore: promote G14 GitOps source 03f604d 2026-06-04 14:08:30 +00:00
HWLAB G14 GitOps Bot e2d42079cb chore: promote G14 GitOps source 7652b39 2026-06-04 13:48:03 +00:00
HWLAB G14 GitOps Bot ca380acf24 chore: promote G14 GitOps source 412f95f 2026-06-04 13:36:56 +00:00
HWLAB G14 GitOps Bot 9bdaac2a06 chore: promote G14 GitOps source 84e649c 2026-06-04 13:14:07 +00:00
HWLAB G14 GitOps Bot affed7ddc1 chore: promote G14 GitOps source 1e08569 2026-06-04 13:02:32 +00:00
HWLAB G14 GitOps Bot 93a21b2ccb chore: promote G14 GitOps source 2129ceb 2026-06-04 12:59:45 +00:00
HWLAB G14 GitOps Bot df382b7a9d chore: promote G14 GitOps source eca9dba 2026-06-04 12:43:41 +00:00
HWLAB G14 GitOps Bot 024a40727f chore: promote G14 GitOps source 6a79bc8 2026-06-04 10:20:31 +00:00
HWLAB G14 GitOps Bot de56a6b48b chore: promote G14 GitOps source 3f26ec0 2026-06-04 09:53:05 +00:00
HWLAB G14 GitOps Bot 82a2eea9bb chore: promote G14 GitOps source 2fc3972 2026-06-04 09:50:08 +00:00
HWLAB G14 GitOps Bot aa2f13ad45 chore: promote G14 GitOps source be557c0 2026-06-04 09:48:11 +00:00
HWLAB G14 GitOps Bot 2adf2403b3 chore: promote G14 GitOps source 62a9908 2026-06-04 09:32:46 +00:00
HWLAB G14 GitOps Bot 5c5aee7c78 chore: promote G14 GitOps source 20199b8 2026-06-04 09:03:06 +00:00
HWLAB G14 GitOps Bot 5b216a4abf chore: promote G14 GitOps source 7b2f4fa 2026-06-04 08:26:35 +00:00
HWLAB G14 GitOps Bot 96f090200e chore: promote G14 GitOps source 8e8f651 2026-06-04 08:22:08 +00:00
HWLAB G14 GitOps Bot b7be77cc41 chore: promote G14 GitOps source 9928954 2026-06-04 08:14:25 +00:00
HWLAB G14 GitOps Bot ef84106e8c chore: promote G14 GitOps source c1960f1 2026-06-04 08:01:12 +00:00
HWLAB G14 GitOps Bot 000e8191ca chore: promote G14 GitOps source ff7f074 2026-06-04 07:57:19 +00:00
HWLAB G14 GitOps Bot 2d607a037d chore: promote G14 GitOps source 53f76e8 2026-06-04 07:48:21 +00:00
HWLAB G14 GitOps Bot 2c3892c9bb chore: promote G14 GitOps source 1427ded 2026-06-04 07:37:48 +00:00
HWLAB G14 GitOps Bot 55fe689d5b chore: promote G14 GitOps source f1ade3d 2026-06-04 07:26:51 +00:00
HWLAB G14 GitOps Bot e415fa32f9 chore: promote G14 GitOps source 63b6891 2026-06-04 06:01:35 +00:00
HWLAB G14 GitOps Bot a4452dd8d3 chore: promote G14 GitOps source 4dea7c6 2026-06-04 05:08:46 +00:00
HWLAB G14 GitOps Bot e89e173607 chore: promote G14 GitOps source f7e4c37 2026-06-04 04:20:25 +00:00
HWLAB G14 GitOps Bot af6658a830 chore: promote G14 GitOps source d5690ce 2026-06-04 04:02:30 +00:00
HWLAB G14 GitOps Bot 81c3ca67f1 chore: promote G14 GitOps source fb267d2 2026-06-04 03:23:49 +00:00
HWLAB G14 GitOps Bot 15c0459184 chore: promote G14 GitOps source 10c03e6 2026-06-04 03:10:54 +00:00
HWLAB G14 GitOps Bot 49da61f8d0 chore: promote G14 GitOps source 0884147 2026-06-04 03:05:02 +00:00
HWLAB G14 GitOps Bot 9fadce80c8 chore: promote G14 GitOps source f2d4181 2026-06-04 02:45:07 +00:00
HWLAB G14 GitOps Bot 65c79152c2 chore: promote G14 GitOps source f7731d1 2026-06-04 01:38:38 +00:00
HWLAB G14 GitOps Bot 2415e3cc27 chore: promote G14 GitOps source 909715c 2026-06-04 01:03:40 +00:00
HWLAB G14 GitOps Bot 3823a74e22 chore: promote G14 GitOps source 8d4fea5 2026-06-03 18:24:02 +00:00
HWLAB G14 GitOps Bot 577d93e71f chore: promote G14 GitOps source 44dc4f8 2026-06-03 16:33:17 +00:00
HWLAB G14 GitOps Bot 937d0674f5 chore: promote G14 GitOps source 71aff45 2026-06-03 16:07:24 +00:00
HWLAB G14 GitOps Bot 1c16362375 chore: promote G14 GitOps source 3a2f9e3 2026-06-03 15:44:13 +00:00
HWLAB G14 GitOps Bot c825068876 chore: promote G14 GitOps source 527c5b0 2026-06-03 15:28:44 +00:00
HWLAB G14 GitOps Bot b74c6ca3ec chore: promote G14 GitOps source dbd09ad 2026-06-03 15:25:22 +00:00
HWLAB G14 GitOps Bot b35adeac7d chore: promote G14 GitOps source 0740712 2026-06-03 15:03:00 +00:00
HWLAB G14 GitOps Bot b54bf5b008 chore: promote G14 GitOps source dcbd5fe 2026-06-03 14:56:28 +00:00
HWLAB G14 GitOps Bot a8796100ff chore: promote G14 GitOps source 3ac4cf8 2026-06-03 14:24:52 +00:00
HWLAB G14 GitOps Bot e8dd4740db chore: promote G14 GitOps source 5d91828 2026-06-03 14:02:17 +00:00
HWLAB G14 GitOps Bot 9d9425a36d chore: promote G14 GitOps source 867f8dd 2026-06-03 13:52:40 +00:00
HWLAB G14 GitOps Bot 1883a663a8 chore: promote G14 GitOps source f402f8f 2026-06-03 13:48:30 +00:00
HWLAB G14 GitOps Bot 9db61729d6 chore: promote G14 GitOps source 1635b4e 2026-06-03 13:33:38 +00:00
HWLAB G14 GitOps Bot 0916199eac chore: promote G14 GitOps source 3729372 2026-06-03 12:29:38 +00:00
HWLAB G14 GitOps Bot 7d78dbf7f3 chore: promote G14 GitOps source 0cf9a8c 2026-06-03 12:00:21 +00:00
HWLAB G14 GitOps Bot 8e4f502ecc chore: promote G14 GitOps source 429befb 2026-06-03 10:50:23 +00:00
HWLAB G14 GitOps Bot 942b1d78f7 chore: promote G14 GitOps source b556f41 2026-06-03 10:36:13 +00:00
HWLAB G14 GitOps Bot 2700fc2bd0 chore: promote G14 GitOps source 21a64d8 2026-06-03 09:54:46 +00:00
HWLAB G14 GitOps Bot 3409bea590 chore: promote G14 GitOps source 6ecfe01 2026-06-03 09:30:20 +00:00
HWLAB G14 GitOps Bot 8d539c469e chore: promote G14 GitOps source a78a419 2026-06-03 09:19:49 +00:00
HWLAB G14 GitOps Bot 0b88ced05b chore: promote G14 GitOps source 0d06a4c 2026-06-03 08:56:11 +00:00
HWLAB G14 GitOps Bot 2398ae6ff7 chore: promote G14 GitOps source 893f46b 2026-06-03 08:38:09 +00:00
HWLAB G14 GitOps Bot f3a54241e8 chore: promote G14 GitOps source cae2f1e 2026-06-03 08:36:13 +00:00
HWLAB G14 GitOps Bot ce9fd7bdff chore: promote G14 GitOps source ceea621 2026-06-03 08:00:56 +00:00
HWLAB G14 GitOps Bot 61578b255a chore: promote G14 GitOps source 39980be 2026-06-03 07:59:01 +00:00
HWLAB G14 GitOps Bot 76a5a75625 chore: promote G14 GitOps source 10906ec 2026-06-03 07:23:07 +00:00
HWLAB G14 GitOps Bot 0b45bb511b chore: promote G14 GitOps source 9d71bf5 2026-06-03 06:47:43 +00:00
HWLAB G14 GitOps Bot 5555e82772 chore: promote G14 GitOps source 1a85f30 2026-06-03 05:58:59 +00:00
HWLAB G14 GitOps Bot 37169aae0c chore: promote G14 GitOps source 2168ad2 2026-06-03 05:16:31 +00:00
HWLAB G14 GitOps Bot 9071de4d56 chore: promote G14 GitOps source a72f141 2026-06-03 03:46:12 +00:00
HWLAB G14 GitOps Bot a4c756b3ed chore: promote G14 GitOps source ae1866c 2026-06-03 02:49:04 +00:00
HWLAB G14 GitOps Bot 1c1dcf7131 chore: promote G14 GitOps source 32deb72 2026-06-03 02:04:59 +00:00
HWLAB G14 GitOps Bot 213220e529 chore: promote G14 GitOps source 66dd78d 2026-06-03 00:40:14 +00:00
HWLAB G14 GitOps Bot 97a7778d7e chore: promote G14 GitOps source 9d13726 2026-06-03 00:07:17 +00:00
HWLAB G14 GitOps Bot 86f172e399 chore: promote G14 GitOps source 0287300 2026-06-02 23:42:21 +00:00
HWLAB G14 GitOps Bot c061e6ceeb chore: promote G14 GitOps source a17f770 2026-06-02 23:29:18 +00:00
HWLAB G14 GitOps Bot a34a1bde3e chore: promote G14 GitOps source 32dad84 2026-06-02 23:06:05 +00:00
HWLAB G14 GitOps Bot b2935a0991 chore: promote G14 GitOps source f557b5a 2026-06-02 16:34:45 +00:00
HWLAB G14 GitOps Bot 3b206832ec chore: promote G14 GitOps source 4187c1b 2026-06-02 14:49:21 +00:00
HWLAB G14 GitOps Bot 3b027295c3 chore: promote G14 GitOps source c1350bb 2026-06-02 14:00:14 +00:00
HWLAB G14 GitOps Bot f04aff5e5f chore: promote G14 GitOps source 2ca9d44 2026-06-02 13:34:44 +00:00
HWLAB G14 GitOps Bot 4acc4d2213 chore: promote G14 GitOps source 4f0a983 2026-06-02 13:15:01 +00:00
HWLAB G14 GitOps Bot debfb38c80 chore: promote G14 GitOps source d712f51 2026-06-02 13:00:55 +00:00
HWLAB G14 GitOps Bot 0848dc9097 chore: promote G14 GitOps source 7bf34e0 2026-06-02 12:16:05 +00:00
HWLAB G14 GitOps Bot c3b961a072 chore: promote G14 GitOps source 98ad59c 2026-06-02 11:06:23 +00:00
HWLAB G14 GitOps Bot dc611aa5aa chore: promote G14 GitOps source eba547d 2026-06-02 10:53:21 +00:00
HWLAB G14 GitOps Bot f75ebc8784 chore: promote G14 GitOps source 93c6483 2026-06-02 10:27:33 +00:00
HWLAB G14 GitOps Bot 823625aa3f chore: promote G14 GitOps source 332b171 2026-06-02 09:08:26 +00:00
HWLAB G14 GitOps Bot ea5fe10c5a chore: promote G14 GitOps source b41f16a 2026-06-02 08:28:33 +00:00
HWLAB G14 GitOps Bot 071ed4da00 chore: promote G14 GitOps source 08fec46 2026-06-02 07:30:17 +00:00
HWLAB G14 GitOps Bot 9e09ace2b5 chore: promote G14 GitOps source 11dc7df 2026-06-02 07:06:10 +00:00
HWLAB G14 GitOps Bot f55536b2c9 chore: promote G14 GitOps source 10af8aa 2026-06-02 06:56:28 +00:00
HWLAB G14 GitOps Bot 02c501d06a chore: promote G14 GitOps source e01cdf6 2026-06-02 05:01:47 +00:00
HWLAB G14 GitOps Bot 1e031a1688 chore: promote G14 GitOps source 877838a 2026-06-02 04:31:43 +00:00
HWLAB G14 GitOps Bot 1487c458f8 chore: promote G14 GitOps source f9a63af 2026-06-02 04:20:37 +00:00
HWLAB G14 GitOps Bot d676d686bd chore: promote G14 GitOps source 5beff46 2026-06-02 04:14:58 +00:00
HWLAB G14 GitOps Bot 6b65f3b993 chore: promote G14 GitOps source feb52fb 2026-06-02 02:53:04 +00:00
HWLAB G14 GitOps Bot 5bea62926b chore: promote G14 GitOps source 506397b 2026-06-02 02:46:01 +00:00
HWLAB G14 GitOps Bot 49d8ae0fba chore: promote G14 GitOps source 7fe4d99 2026-06-02 02:34:52 +00:00
HWLAB G14 GitOps Bot e948161c86 chore: promote G14 GitOps source da73598 2026-06-02 01:19:51 +00:00
HWLAB G14 GitOps Bot 51cb24e6f7 chore: promote G14 GitOps source 590eb10 2026-06-02 01:00:58 +00:00
HWLAB G14 GitOps Bot 06163e97d2 chore: promote G14 GitOps source e703ded 2026-06-02 00:55:04 +00:00
HWLAB G14 GitOps Bot 181462c9f9 chore: promote G14 GitOps source 55fe541 2026-06-02 00:38:40 +00:00
HWLAB G14 GitOps Bot 148336dd23 chore: promote G14 GitOps source 9ebb736 2026-06-02 00:22:44 +00:00
HWLAB G14 GitOps Bot bd50604406 chore: promote G14 GitOps source 0d33da3 2026-06-01 23:50:02 +00:00
HWLAB G14 GitOps Bot e7eba40a41 chore: promote G14 GitOps source f0ddb63 2026-06-01 23:23:04 +00:00
HWLAB G14 GitOps Bot 06d139f9e0 chore: promote G14 GitOps source 33f74e4 2026-06-01 19:35:55 +00:00
HWLAB G14 GitOps Bot 16ec6272b1 chore: promote G14 GitOps source 775f6af 2026-06-01 19:21:52 +00:00
HWLAB G14 GitOps Bot 7104e8dd9c chore: promote G14 GitOps source 66ffd2e 2026-06-01 18:47:52 +00:00
HWLAB G14 GitOps Bot 47ba2d1c65 chore: promote G14 GitOps source bf2bdee 2026-06-01 18:31:00 +00:00
HWLAB G14 GitOps Bot 4bbaf2b0d2 chore: promote G14 GitOps source 5f7fa31 2026-06-01 18:12:03 +00:00
HWLAB G14 GitOps Bot 3acb941531 chore: promote G14 GitOps source 577622d 2026-06-01 17:58:17 +00:00
HWLAB G14 GitOps Bot f0bdacd71d chore: promote G14 GitOps source 84a49eb 2026-06-01 17:43:19 +00:00
HWLAB G14 GitOps Bot 83558bca40 chore: promote G14 GitOps source 90f030e 2026-06-01 16:53:26 +00:00
HWLAB G14 GitOps Bot 95429ed675 chore: promote G14 GitOps source 3b504cd 2026-06-01 16:36:49 +00:00
HWLAB G14 GitOps Bot 95af1ae052 chore: promote G14 GitOps source 5dc263e 2026-06-01 16:00:20 +00:00
HWLAB G14 GitOps Bot ff125e5e59 chore: promote G14 GitOps source 2406085 2026-06-01 15:22:01 +00:00
HWLAB G14 GitOps Bot 653fe2291e chore: promote G14 GitOps source aeeb8ad 2026-06-01 14:37:44 +00:00
HWLAB G14 GitOps Bot 80a0fc6e5f chore: promote G14 GitOps source 99aeb99 2026-06-01 14:03:17 +00:00
HWLAB G14 GitOps Bot ae93a973df chore: promote G14 GitOps source 4691780 2026-06-01 13:56:29 +00:00
HWLAB G14 GitOps Bot ee9c1e6ca8 chore: promote G14 GitOps source f8a090b 2026-06-01 13:43:58 +00:00
HWLAB G14 GitOps Bot 1d0d965046 chore: promote G14 GitOps source 3db5742 2026-06-01 13:04:52 +00:00
HWLAB G14 GitOps Bot f6d42097f9 chore: promote G14 GitOps source a4459ea 2026-06-01 12:20:55 +00:00
HWLAB G14 GitOps Bot 65b0dab7d8 chore: promote G14 GitOps source c03d22c 2026-06-01 12:06:50 +00:00
HWLAB G14 GitOps Bot 9f275528aa chore: promote G14 GitOps source d9bcfee 2026-06-01 11:17:51 +00:00
HWLAB G14 GitOps Bot bb7873dfb5 chore: promote G14 GitOps source d1ca0bf 2026-06-01 11:02:54 +00:00
HWLAB G14 GitOps Bot f2a846ca50 chore: promote G14 GitOps source 9f19b2a 2026-06-01 10:41:55 +00:00
HWLAB G14 GitOps Bot eb7c711186 chore: promote G14 GitOps source f3563d4 2026-06-01 10:25:37 +00:00
HWLAB G14 GitOps Bot 7de4d0ff7c chore: promote G14 GitOps source c92b0fb 2026-06-01 10:00:39 +00:00
HWLAB G14 GitOps Bot 194e240c3b chore: promote G14 GitOps source 86adcf5 2026-06-01 09:14:54 +00:00
HWLAB G14 GitOps Bot 87d04c8387 chore: promote G14 GitOps source 923fcf6 2026-06-01 00:29:12 +00:00
HWLAB G14 GitOps Bot e94626cab4 chore: promote G14 GitOps source 84c49af 2026-05-31 17:44:17 +00:00
HWLAB G14 GitOps Bot 568e5bd383 chore: promote G14 GitOps source f315cf4 2026-05-31 16:38:40 +00:00
HWLAB G14 GitOps Bot 9006f3b5a7 chore: promote G14 GitOps source 7b64427 2026-05-31 14:59:21 +00:00
HWLAB G14 GitOps Bot 936da12922 chore: promote G14 GitOps source d5baeb4 2026-05-31 14:32:26 +00:00
HWLAB G14 GitOps Bot 449ce39b47 chore: promote G14 GitOps source a234145 2026-05-31 13:39:15 +00:00
HWLAB G14 GitOps Bot 179655fb5b chore: promote G14 GitOps source bfcd672 2026-05-31 13:08:22 +00:00
HWLAB G14 GitOps Bot 163d63b201 chore: promote G14 GitOps source b135388 2026-05-31 12:46:54 +00:00
HWLAB G14 GitOps Bot a2ecc9b0f1 chore: promote G14 GitOps source ca714bf 2026-05-31 11:20:00 +00:00
HWLAB G14 GitOps Bot c391e74a82 chore: promote G14 GitOps source c191ada 2026-05-31 11:07:21 +00:00
HWLAB G14 GitOps Bot 8c07a9746a chore: promote G14 GitOps source 028308e 2026-05-31 10:49:41 +00:00
HWLAB G14 GitOps Bot 0f926b454d chore: promote G14 GitOps source 83f5974 2026-05-31 10:22:46 +00:00
HWLAB G14 GitOps Bot 1a69582c43 chore: promote G14 GitOps source 5d5c171 2026-05-31 09:17:02 +00:00
HWLAB G14 GitOps Bot 81d892ecd0 chore: promote G14 GitOps source 79f2694 2026-05-31 09:13:07 +00:00
HWLAB G14 GitOps Bot 40adfdea6c chore: promote G14 GitOps source 7958987 2026-05-31 08:57:20 +00:00
HWLAB G14 GitOps Bot 939ec2b0c4 chore: promote G14 GitOps source 00b972f 2026-05-31 08:34:22 +00:00
HWLAB G14 GitOps Bot b0d3ea6889 chore: promote G14 GitOps source bede1cf 2026-05-31 08:25:29 +00:00
HWLAB G14 GitOps Bot c76ffdf8d9 chore: promote G14 GitOps source 1531567 2026-05-31 07:58:18 +00:00
HWLAB G14 GitOps Bot 338c2371cf chore: promote G14 GitOps source 677bce1 2026-05-31 07:20:26 +00:00
HWLAB G14 GitOps Bot e338cc756a chore: promote G14 GitOps source fd30fee 2026-05-31 06:04:47 +00:00
HWLAB G14 GitOps Bot 3da2f39329 chore: promote G14 GitOps source 88b1e28 2026-05-31 04:41:22 +00:00
HWLAB G14 GitOps Bot f910499ab3 chore: promote G14 GitOps source 794bea6 2026-05-31 04:31:15 +00:00
HWLAB G14 GitOps Bot 6459d0aca1 chore: promote G14 GitOps source 794bea6 2026-05-31 04:21:13 +00:00
HWLAB G14 GitOps Bot edea920b48 chore: promote G14 GitOps source 53ffdf3 2026-05-31 03:57:16 +00:00
HWLAB G14 GitOps Bot 274d9f7801 chore: promote G14 GitOps source ca2cfe9 2026-05-31 03:51:05 +00:00
HWLAB G14 GitOps Bot 29382dcf27 chore: promote G14 GitOps source b215ff9 2026-05-31 03:02:28 +00:00
HWLAB G14 GitOps Bot 7867a06b05 chore: promote G14 GitOps source 056ba60 2026-05-30 21:35:19 +00:00
HWLAB G14 GitOps Bot 5749f4f7d9 chore: promote G14 GitOps source bca1fcb 2026-05-30 21:18:03 +00:00
HWLAB G14 GitOps Bot 5d18deb389 chore: promote G14 GitOps source 1ebbfe2 2026-05-30 06:43:26 +00:00
HWLAB G14 GitOps Bot c51f1fef83 chore: promote G14 GitOps source 6edce68 2026-05-30 03:15:17 +00:00
HWLAB G14 GitOps Bot 4282465875 chore: promote G14 GitOps source aee03fa 2026-05-30 02:31:44 +00:00
HWLAB G14 GitOps Bot 6f183cf2a1 chore: promote G14 GitOps source 77b4e8a 2026-05-30 01:24:41 +00:00
HWLAB G14 GitOps Bot 4c2c0f61af chore: promote G14 GitOps source df8a345 2026-05-30 01:11:09 +00:00
HWLAB G14 GitOps Bot 063329ae78 chore: promote G14 GitOps source 59883f4 2026-05-30 00:54:34 +00:00
HWLAB G14 GitOps Bot 8c7f99440b chore: promote G14 GitOps source e51ea7c 2026-05-29 19:05:19 +00:00
HWLAB G14 GitOps Bot 38e3d46ea7 chore: promote G14 GitOps source 836bfbe 2026-05-29 19:00:19 +00:00
HWLAB G14 GitOps Bot 5eb4443b74 chore: promote G14 GitOps source b63b8d9 2026-05-29 18:30:14 +00:00
HWLAB G14 GitOps Bot 92ee2d5c3b chore: promote G14 GitOps source d1457bd 2026-05-29 18:08:35 +00:00
HWLAB G14 GitOps Bot f54fea65e2 chore: promote G14 GitOps source cde83ef 2026-05-29 17:54:51 +00:00
HWLAB G14 GitOps Bot 73ff1767e2 chore: promote G14 GitOps source c2a3e66 2026-05-29 17:42:35 +00:00
HWLAB G14 GitOps Bot 59d04e3380 chore: promote G14 GitOps source 69293dc 2026-05-29 17:26:01 +00:00
HWLAB G14 GitOps Bot 63e16a0645 chore: promote G14 GitOps source 3238f01 2026-05-29 16:13:49 +00:00
HWLAB G14 GitOps Bot b3a035e542 chore: promote G14 GitOps source 12c6331 2026-05-29 12:24:45 +00:00
HWLAB G14 GitOps Bot 188e683af1 chore: promote G14 GitOps source 23d2860 2026-05-29 12:07:25 +00:00
HWLAB G14 GitOps Bot def6473a90 chore: promote G14 GitOps source 96871af 2026-05-29 11:46:48 +00:00
HWLAB G14 GitOps Bot dcfdf24e46 chore: promote G14 GitOps source b37f13f 2026-05-29 11:32:43 +00:00
HWLAB G14 GitOps Bot e6c7c9f519 chore: promote G14 GitOps source b6e9477 2026-05-29 11:19:58 +00:00
HWLAB G14 GitOps Bot 98144166ba chore: promote G14 GitOps source 49b4357 2026-05-29 11:01:39 +00:00
HWLAB G14 GitOps Bot 23515a0eae chore: promote G14 GitOps source c106a35 2026-05-29 10:46:22 +00:00
HWLAB G14 GitOps Bot 3debe4ff1a chore: promote G14 GitOps source ff195f5 2026-05-29 10:24:07 +00:00
HWLAB G14 GitOps Bot 8d9b3ab96f chore: promote G14 GitOps source a1e59b3 2026-05-29 09:44:08 +00:00
HWLAB G14 GitOps Bot a69e4e126b chore: promote G14 GitOps source baae127 2026-05-29 09:14:53 +00:00
HWLAB G14 GitOps Bot 710124ddfc chore: promote G14 GitOps source 5fed621 2026-05-29 08:36:01 +00:00
HWLAB G14 GitOps Bot a878061011 chore: promote G14 GitOps source b974372 2026-05-29 08:07:17 +00:00
HWLAB G14 GitOps Bot ca95497be3 chore: promote G14 GitOps source aee2777 2026-05-29 07:51:36 +00:00
HWLAB G14 GitOps Bot 4024f2ffb3 chore: promote G14 GitOps source dc6a0b1 2026-05-29 07:12:09 +00:00
HWLAB G14 GitOps Bot ff99d338b1 chore: promote G14 GitOps source a248e91 2026-05-29 06:28:05 +00:00
HWLAB G14 GitOps Bot 1494d536c6 chore: promote G14 GitOps source 4a773a2 2026-05-29 06:02:17 +00:00
HWLAB G14 GitOps Bot d7fffcdf3a chore: promote G14 GitOps source 138d4a8 2026-05-29 05:39:59 +00:00
HWLAB G14 GitOps Bot 9f7136dc53 chore: promote G14 GitOps source e3b0571 2026-05-29 04:38:14 +00:00
HWLAB G14 GitOps Bot 4e2b1f9adc chore: promote G14 GitOps source 34f04d1 2026-05-29 04:19:37 +00:00
HWLAB G14 GitOps Bot 011fc51982 chore: promote G14 GitOps source 02ef26a 2026-05-29 04:02:17 +00:00
HWLAB G14 GitOps Bot d4bc0dda2d chore: promote G14 GitOps source 9a6a12c 2026-05-29 03:40:42 +00:00
HWLAB G14 GitOps Bot f10121caa5 chore: promote G14 GitOps source 6e1a63d 2026-05-29 02:52:49 +00:00
HWLAB G14 GitOps Bot 442eb0cb74 chore: promote G14 GitOps source dfc1b42 2026-05-29 02:11:12 +00:00
HWLAB G14 GitOps Bot 0d0095fcd9 chore: promote G14 GitOps source e424cae 2026-05-29 01:43:17 +00:00
HWLAB G14 GitOps Bot f4a7416602 chore: promote G14 GitOps source 8e83c4f 2026-05-29 01:00:19 +00:00
HWLAB G14 GitOps Bot 3e67ee8925 chore: promote G14 GitOps source e6e40a0 2026-05-29 00:38:46 +00:00
HWLAB G14 GitOps Bot ad3816a0b5 chore: promote G14 GitOps source 999b9f9 2026-05-29 00:17:49 +00:00
HWLAB G14 GitOps Bot d4980656b8 chore: promote G14 GitOps source bc816ce 2026-05-28 21:44:28 +00:00
HWLAB G14 GitOps Bot e360011973 chore: promote G14 GitOps source bc816ce 2026-05-28 21:19:14 +00:00
HWLAB G14 GitOps Bot 1878f0a689 chore: promote G14 GitOps source 6813e6e 2026-05-28 19:40:47 +00:00
HWLAB G14 GitOps Bot 9a799d62a5 chore: promote G14 GitOps source 44851d8 2026-05-28 13:31:44 +00:00
HWLAB G14 GitOps Bot 5e03c0c7f9 chore: promote G14 GitOps source e7fa3d6 2026-05-28 13:06:12 +00:00
HWLAB G14 GitOps Bot f2c28bb56c chore: promote G14 GitOps source 40d93c7 2026-05-28 12:54:32 +00:00
HWLAB G14 GitOps Bot 223a98e378 chore: promote G14 GitOps source 256866b 2026-05-28 12:14:22 +00:00
HWLAB G14 GitOps Bot d340971941 chore: promote G14 GitOps source 74905f9 2026-05-28 11:19:02 +00:00
HWLAB G14 GitOps Bot 06d016c622 chore: promote G14 GitOps source adaf758 2026-05-28 10:34:53 +00:00
HWLAB G14 GitOps Bot e179f5d326 chore: promote G14 GitOps source adaf758 2026-05-28 10:34:25 +00:00
HWLAB G14 GitOps Bot 0d6f0e592d chore: promote G14 GitOps source c09247f 2026-05-28 10:24:49 +00:00
HWLAB G14 GitOps Bot 19eafcdacf chore: promote G14 GitOps source 5fdfc9f 2026-05-28 10:10:49 +00:00
1029 changed files with 33077 additions and 258527 deletions
-16
View File
@@ -1,16 +0,0 @@
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
[*.go]
indent_style = tab
indent_size = 4
[Makefile]
indent_style = tab
-47
View File
@@ -1,47 +0,0 @@
# OS and editor files
.DS_Store
Thumbs.db
*.swp
*.swo
.idea/
.vscode/
# Logs and local environment
*.log
.env
.env.*
!.env.example
# Build outputs
bin/
!tools/hwlab-cli/bin/
!tools/hwlab-cli/bin/hwlab-cli.mjs
dist/
build/
coverage/
tmp/
# Go
*.test
*.out
vendor/
# Node package managers, for future web work
node_modules/
node_modules
.pnpm-store/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Deploy/runtime state
*.local.json
.state/
.worktree/
.preserved-untracked/
# Generated GitOps desired state is stored on the GitOps branch.
/deploy/gitops/node/
# v0.2 generated artifact catalog is stored only on the v0.2-gitops branch.
/deploy/artifact-catalog.v02.json
-12
View File
@@ -1,12 +0,0 @@
{
"contractVersion": "hwpod-spec-registry-v1",
"source": {
"kind": "preinstalled-verified-spec",
"caseRepo": "pikasTech/hwlab-case-registry",
"caseId": "d601-f103-v2-compile",
"caseSpecPath": "cases/d601-f103-v2-compile/hwpod-spec.yaml",
"verificationIssue": "pikasTech/HWLAB#924",
"verificationPr": "pikasTech/hwlab-case-registry#1",
"verifiedAt": "2026-06-05"
}
}
-29
View File
@@ -1,29 +0,0 @@
apiVersion: hwlab.dev/v0alpha1
kind: Hwpod
metadata:
uid: D601-F103-V2
name: d601-f103-v2
spec:
targetDevice:
board: D601-F103-V2
mcu: STM32F103
workspace:
path: "F:\\Work\\HWLAB-CASE-F103"
toolchain: keil-mdk
keilProject: projects/01_baseline/Projects/MDK-ARM/atk_f103.uvprojx
keilTarget: USART
keilCliPath: "C:\\Users\\liang\\.agents\\skills\\keil\\keil-cli.py"
debugProbe:
type: daplink
adapter: keil
probeUid: 3FD750C63E342E24
probeName: MicroLink CMSIS-DAP
programBackend: keil
ioProbe:
uart:
id: uart/1
port: COM9
baudrate: 115200
nodeBinding:
nodeId: node-d601-f103-v2
nodeType: pc-host
-83
View File
@@ -1,83 +0,0 @@
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: hwlab-jd01-v03-ci-poll-
annotations:
pipelinesascode.tekton.dev/on-event: "[push]"
pipelinesascode.tekton.dev/on-target-branch: "[v0.3]"
pipelinesascode.tekton.dev/on-cel-expression: "event == 'push' && target_branch == 'v0.3' && node == 'JD01'"
pipelinesascode.tekton.dev/max-keep-runs: "8"
pipelinesascode.tekton.dev/pipeline: "ci/pipelines/hwlab-jd01-v03-ci-image-publish.yaml"
hwlab.pikastech.local/ci-contract: tekton-native-primitive-tasks
hwlab.pikastech.local/download-profile: jd01-node-default
hwlab.pikastech.local/gitops-branch: v0.3-gitops
hwlab.pikastech.local/network-profile: jd01-node-ci-egress
hwlab.pikastech.local/node: JD01
hwlab.pikastech.local/policy: native-per-service-taskrun-image-publish
hwlab.pikastech.local/runtime-path: deploy/gitops/node/jd01/runtime-v03
hwlab.pikastech.local/source-branch: v0.3
hwlab.pikastech.local/source-config: .tekton/hwlab-jd01-v03-pac.yaml
labels:
app.kubernetes.io/name: hwlab-jd01-v03-pac
app.kubernetes.io/part-of: hwlab
unidesk.ai/source-commit: "{{revision}}"
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: "{{revision}}"
hwlab.pikastech.local/trigger: pipelines-as-code
spec:
timeouts:
pipeline: 1h0m0s
taskRunTemplate:
serviceAccountName: hwlab-jd01-v03-tekton-runner
podTemplate:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
securityContext:
fsGroup: 1000
pipelineRef:
name: hwlab-jd01-v03-ci-image-publish
workspaces:
- name: source
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
- name: git-ssh
secret:
secretName: hwlab-git-ssh
params:
- name: git-url
value: git@github.com:pikasTech/HWLAB.git
- name: git-read-url
value: http://gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB.git
- name: git-write-url
value: http://git-mirror-write.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git
- name: source-branch
value: v0.3
- name: gitops-branch
value: v0.3-gitops
- name: lane
value: v03
- name: catalog-path
value: deploy/artifact-catalog.jd01-v03.json
- name: image-tag-mode
value: full
- name: runtime-path
value: deploy/gitops/node/jd01/runtime-v03
- name: source-commit
value: "{{revision}}"
- name: revision
value: "{{revision}}"
- name: registry-prefix
value: 127.0.0.1:5000/hwlab
- name: services
value: hwlab-cloud-api,hwlab-workbench-runtime,hwlab-user-billing,hwlab-project-management,hwlab-cloud-web,hwlab-gateway,hwlab-edge-proxy,hwlab-agent-skills
- name: base-image
value: 127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim
- name: build-cache-mode
value: registry
- name: runtime-ready-timeout-ms
value: "60000"
-86
View File
@@ -1,86 +0,0 @@
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: hwlab-nc01-production-ci-poll-
namespace: hwlab-ci
annotations:
pipelinesascode.tekton.dev/on-event: "[push]"
pipelinesascode.tekton.dev/on-target-branch: "[release]"
pipelinesascode.tekton.dev/on-cel-expression: "event == 'push' && target_branch == 'release' && node == 'NC01'"
pipelinesascode.tekton.dev/max-keep-runs: "8"
unidesk.ai/owning-config-ref: "config/hwlab-node-lanes.yaml#lanes.production.targets.NC01"
unidesk.ai/effective-config-sha256: sha256:c01c32df9c12067100035d9416f7b462adde33781e6a568e400b5a33928aab33
unidesk.ai/source-artifact-renderer: hwlab-runtime-lane
unidesk.ai/source-artifact-mode: remote-pipeline-annotation
pipelinesascode.tekton.dev/pipeline: ci/pipelines/hwlab-nc01-production-ci-image-publish.yaml
hwlab.pikastech.local/ci-contract: tekton-native-primitive-tasks
hwlab.pikastech.local/download-profile: jd01-node-default
hwlab.pikastech.local/gitops-branch: release-gitops
hwlab.pikastech.local/network-profile: jd01-node-ci-egress
hwlab.pikastech.local/node: NC01
hwlab.pikastech.local/policy: native-per-service-taskrun-image-publish
hwlab.pikastech.local/runtime-path: deploy/gitops/node/nc01/runtime-production
hwlab.pikastech.local/source-branch: release
hwlab.pikastech.local/source-config: .tekton/hwlab-nc01-production-pac.yaml
labels:
app.kubernetes.io/name: hwlab-nc01-production-pac
app.kubernetes.io/part-of: hwlab
unidesk.ai/source-commit: "{{ revision }}"
hwlab.pikastech.local/gitops-target: production
hwlab.pikastech.local/source-commit: "{{ revision }}"
hwlab.pikastech.local/trigger: pipelines-as-code
spec:
timeouts:
pipeline: 1h0m0s
taskRunTemplate:
serviceAccountName: hwlab-nc01-production-tekton-runner
podTemplate:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
securityContext:
fsGroup: 1000
pipelineRef:
name: hwlab-nc01-production-ci-image-publish
workspaces:
- name: source
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
- name: git-ssh
secret:
secretName: hwlab-git-ssh
params:
- name: git-url
value: "{{ repo_url }}"
- name: git-read-url
value: "{{ git_read_url }}"
- name: git-write-url
value: "{{ git_write_url }}"
- name: source-branch
value: release
- name: gitops-branch
value: release-gitops
- name: lane
value: production
- name: catalog-path
value: deploy/artifact-catalog.nc01-production.json
- name: image-tag-mode
value: full
- name: runtime-path
value: deploy/gitops/node/nc01/runtime-production
- name: revision
value: "{{ revision }}"
- name: registry-prefix
value: 127.0.0.1:5000/hwlab
- name: services
value: "hwlab-cloud-api,hwlab-workbench-runtime,hwlab-user-billing,hwlab-project-management,hwlab-tasktree-api,hwlab-tasktree-worker,hwlab-cloud-web,hwlab-gateway,hwlab-edge-proxy,hwlab-agent-skills"
- name: base-image
value: 127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim
- name: build-cache-mode
value: registry
- name: runtime-ready-timeout-ms
value: "60000"
-86
View File
@@ -1,86 +0,0 @@
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: hwlab-nc01-v03-ci-poll-
namespace: hwlab-ci
annotations:
pipelinesascode.tekton.dev/on-event: "[push]"
pipelinesascode.tekton.dev/on-target-branch: "[v0.3]"
pipelinesascode.tekton.dev/on-cel-expression: "event == 'push' && target_branch == 'v0.3' && node == 'NC01'"
pipelinesascode.tekton.dev/max-keep-runs: "8"
unidesk.ai/owning-config-ref: "config/hwlab-node-lanes.yaml#lanes.v03.targets.NC01"
unidesk.ai/effective-config-sha256: sha256:c1c134280c65060f38a9b404c815caefa5349d73926430360bcb7d49f13a4ef6
unidesk.ai/source-artifact-renderer: hwlab-runtime-lane
unidesk.ai/source-artifact-mode: remote-pipeline-annotation
pipelinesascode.tekton.dev/pipeline: ci/pipelines/hwlab-nc01-v03-ci-image-publish.yaml
hwlab.pikastech.local/ci-contract: tekton-native-primitive-tasks
hwlab.pikastech.local/download-profile: jd01-node-default
hwlab.pikastech.local/gitops-branch: v0.3-gitops
hwlab.pikastech.local/network-profile: jd01-node-ci-egress
hwlab.pikastech.local/node: NC01
hwlab.pikastech.local/policy: native-per-service-taskrun-image-publish
hwlab.pikastech.local/runtime-path: deploy/gitops/node/nc01/runtime-v03
hwlab.pikastech.local/source-branch: v0.3
hwlab.pikastech.local/source-config: .tekton/hwlab-nc01-v03-pac.yaml
labels:
app.kubernetes.io/name: hwlab-nc01-v03-pac
app.kubernetes.io/part-of: hwlab
unidesk.ai/source-commit: "{{ revision }}"
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: "{{ revision }}"
hwlab.pikastech.local/trigger: pipelines-as-code
spec:
timeouts:
pipeline: 1h0m0s
taskRunTemplate:
serviceAccountName: "{{ service_account }}"
podTemplate:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
securityContext:
fsGroup: 1000
pipelineRef:
name: hwlab-nc01-v03-ci-image-publish
workspaces:
- name: source
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
- name: git-ssh
secret:
secretName: hwlab-git-ssh
params:
- name: git-url
value: "{{ repo_url }}"
- name: git-read-url
value: "{{ git_read_url }}"
- name: git-write-url
value: "{{ git_write_url }}"
- name: source-branch
value: "{{ source_branch }}"
- name: gitops-branch
value: "{{ gitops_branch }}"
- name: lane
value: "{{ lane }}"
- name: catalog-path
value: deploy/artifact-catalog.nc01-v03.json
- name: image-tag-mode
value: full
- name: runtime-path
value: deploy/gitops/node/nc01/runtime-v03
- name: revision
value: "{{ revision }}"
- name: registry-prefix
value: 127.0.0.1:5000/hwlab
- name: services
value: "hwlab-cloud-api,hwlab-workbench-runtime,hwlab-user-billing,hwlab-project-management,hwlab-tasktree-api,hwlab-tasktree-worker,hwlab-cloud-web,hwlab-gateway,hwlab-edge-proxy,hwlab-agent-skills"
- name: base-image
value: 127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim
- name: build-cache-mode
value: registry
- name: runtime-ready-timeout-ms
value: "60000"
@@ -0,0 +1,646 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "v03",
"profile": "v03",
"namespace": "hwlab-v03",
"endpoint": "https://hwlab.pikapython.com",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"artifactState": "published",
"publish": {
"ciPublished": true,
"registryVerified": true,
"provenance": "node-ci-artifact:hwlab-v03-ci-bench-1d636ba0d262-mquv8xsp-collect",
"note": "Digest fields were copied from a successful DEV artifact publish report for this source commit."
},
"healthContract": {
"method": "GET",
"path": "/health/live",
"responseFormat": "json",
"requiredFields": [
"serviceId",
"environment",
"status"
]
},
"allowedProfiles": [
"v03"
],
"forbiddenProfiles": [
"dev",
"prod"
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:97c6b7870eb609ff73bf7af6068aec03b21eb0654450724b3283b4d0ffe16337",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:47:49.871Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "69e74bb774a3da0dce420b9facaf9bdf95bfffe2b412b11ada34ae04c5aeb5d0",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-bb377a5d3729",
"environmentDigest": "sha256:97c6b7870eb609ff73bf7af6068aec03b21eb0654450724b3283b4d0ffe16337",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "ec1a74f5047e16df193dc2fa1a7da19b12c27176ec8966b56d41a64606127400",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:97c6b7870eb609ff73bf7af6068aec03b21eb0654450724b3283b4d0ffe16337",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-api.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:97c6b7870eb609ff73bf7af6068aec03b21eb0654450724b3283b4d0ffe16337"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "445d32282d642d5089290ffe5f621ccea3206cf1d9f11b24091f82a4434cbcd5",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-workbench-runtime",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-7b8d6a068b38",
"imageTag": "env-7b8d6a068b38",
"digest": "sha256:8005ca8adbb9e06bd74b1e858e967ed52515e77cce564ab96ba3bb16eedb7655",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:47:51.888Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "ff386925244e1a915da87ee563bdd4e2412cc1705c54afef618ad2f1e6645ecb",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-7b8d6a068b38",
"environmentDigest": "sha256:8005ca8adbb9e06bd74b1e858e967ed52515e77cce564ab96ba3bb16eedb7655",
"environmentInputHash": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"codeInputHash": "5ac3e165aaf2b87a5138c404870feba94da8f7269e566dfa89a180b71d5ff7cb",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:8005ca8adbb9e06bd74b1e858e967ed52515e77cce564ab96ba3bb16eedb7655",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-7b8d6a068b38",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-7b8d6a068b38",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:8005ca8adbb9e06bd74b1e858e967ed52515e77cce564ab96ba3bb16eedb7655"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "4269b9316d150facffb495f7c4900ee56af391c071b86063ae850defa7e64e99",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-user-billing",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-7b8d6a068b38",
"imageTag": "env-7b8d6a068b38",
"digest": "sha256:57db522fdcc90dd32da76445ae6ab930b08516045da9743a066bd688a4956689",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:47:52.690Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "bdeb0aacf71f54d1c2e8486fbf50cd80c7a33949e872bfba45a6812a3145b1dc",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-7b8d6a068b38",
"environmentDigest": "sha256:57db522fdcc90dd32da76445ae6ab930b08516045da9743a066bd688a4956689",
"environmentInputHash": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"codeInputHash": "1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:57db522fdcc90dd32da76445ae6ab930b08516045da9743a066bd688a4956689",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-7b8d6a068b38",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-user-billing.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-7b8d6a068b38",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:57db522fdcc90dd32da76445ae6ab930b08516045da9743a066bd688a4956689"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "490a070de1a6975b4935670478f0e64345d20e1aa9b80096b1318106b25d9310",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-project-management",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:b2a5d2c8edb3adb02b2efbfe4859d2de766f341cb633e7f0d30b0062ec2c2a8c",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:47:51.862Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "9e60d770cbba473b054ba9c25a220d22659051a9bac9248863466892826b2a32",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-bb377a5d3729",
"environmentDigest": "sha256:b2a5d2c8edb3adb02b2efbfe4859d2de766f341cb633e7f0d30b0062ec2c2a8c",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "a6739860349cb74b61680ea9ef8416cd6bb05718b19495d9962211715f279a8b",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b2a5d2c8edb3adb02b2efbfe4859d2de766f341cb633e7f0d30b0062ec2c2a8c",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-project-management.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b2a5d2c8edb3adb02b2efbfe4859d2de766f341cb633e7f0d30b0062ec2c2a8c"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "30d9f35c4d70555725db1ef7a591b9af9cb158e82d924d3c6dc82326fbeffbd4",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:c9dabb0f3f019732fa1be6a1b3bc940930158ea7b71d1153f8e9bcc67f7b44b7",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:47:52.746Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "84563e57072b49fa11f303235a4de1ceb5df0576b6fd14679477f5e110eab5ff",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-bb377a5d3729",
"environmentDigest": "sha256:c9dabb0f3f019732fa1be6a1b3bc940930158ea7b71d1153f8e9bcc67f7b44b7",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "28a715eee2959d877a2f7d62461a3142c6c376f52f725bdf9c5b6da17275bbf6",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:c9dabb0f3f019732fa1be6a1b3bc940930158ea7b71d1153f8e9bcc67f7b44b7",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-web.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:c9dabb0f3f019732fa1be6a1b3bc940930158ea7b71d1153f8e9bcc67f7b44b7"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-gateway",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:b7eb59b5b1472df44b021344f045fef9fd5d709114690ae056406ed8ac57bfb8",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:47:55.968Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "f62bf867c44cb6eb979e255e3f285aaac4dcde143819115662324f198b08db47",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-bb377a5d3729",
"environmentDigest": "sha256:b7eb59b5b1472df44b021344f045fef9fd5d709114690ae056406ed8ac57bfb8",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b7eb59b5b1472df44b021344f045fef9fd5d709114690ae056406ed8ac57bfb8",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-gateway.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b7eb59b5b1472df44b021344f045fef9fd5d709114690ae056406ed8ac57bfb8"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "3fed509f00ba3448138a999f51dad3d38b822bb4a5c152011e3e57526972fd41",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:1047c558cf7b49be44758a9c7bc2fdef4b9624affdd3e0e27c598b79355c2403",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:47:55.147Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "68788f9255479a574bd38c98dbefee762abd3e8bffda8e3ab831e7ec7acff1ab",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-bb377a5d3729",
"environmentDigest": "sha256:1047c558cf7b49be44758a9c7bc2fdef4b9624affdd3e0e27c598b79355c2403",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:1047c558cf7b49be44758a9c7bc2fdef4b9624affdd3e0e27c598b79355c2403",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:1047c558cf7b49be44758a9c7bc2fdef4b9624affdd3e0e27c598b79355c2403"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "68746696603227763e5768f8daf45d31331f4c8425e6d756b21482ad104e6183",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:d0398284e9c20bc7f926ec70d119198664b26b291b247af63a819ad67559d39f",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:47:55.928Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "d9214b7feea7afbe06efd7972749334302322322d62652b1b2d2a85c3ef2c34b",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-bb377a5d3729",
"environmentDigest": "sha256:d0398284e9c20bc7f926ec70d119198664b26b291b247af63a819ad67559d39f",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:d0398284e9c20bc7f926ec70d119198664b26b291b247af63a819ad67559d39f",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-agent-skills.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:d0398284e9c20bc7f926ec70d119198664b26b291b247af63a819ad67559d39f"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 8,
"requiredServiceCount": 8,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-workbench-runtime",
"hwlab-user-billing",
"hwlab-project-management",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-workbench-runtime",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-workbench-runtime/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-user-billing",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-user-billing/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-project-management",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-project-management/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "node-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.mjs",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
@@ -0,0 +1,646 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "v03",
"profile": "v03",
"namespace": "hwlab-v03",
"endpoint": "https://hwlab.pikapython.com",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"artifactState": "published",
"publish": {
"ciPublished": true,
"registryVerified": true,
"provenance": "node-ci-artifact:hwlab-v03-ci-bench-1d636ba0d262-mquwhit6-collect",
"note": "Digest fields were copied from a successful DEV artifact publish report for this source commit."
},
"healthContract": {
"method": "GET",
"path": "/health/live",
"responseFormat": "json",
"requiredFields": [
"serviceId",
"environment",
"status"
]
},
"allowedProfiles": [
"v03"
],
"forbiddenProfiles": [
"dev",
"prod"
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:f0698f08a17e646f438e732d487d8648b080391c04f68e547f337b040bc74702",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:22:32.771Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "69e74bb774a3da0dce420b9facaf9bdf95bfffe2b412b11ada34ae04c5aeb5d0",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-bb377a5d3729",
"environmentDigest": "sha256:f0698f08a17e646f438e732d487d8648b080391c04f68e547f337b040bc74702",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "ec1a74f5047e16df193dc2fa1a7da19b12c27176ec8966b56d41a64606127400",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:f0698f08a17e646f438e732d487d8648b080391c04f68e547f337b040bc74702",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-api.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:f0698f08a17e646f438e732d487d8648b080391c04f68e547f337b040bc74702"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "445d32282d642d5089290ffe5f621ccea3206cf1d9f11b24091f82a4434cbcd5",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-workbench-runtime",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-7b8d6a068b38",
"imageTag": "env-7b8d6a068b38",
"digest": "sha256:bf18711867f31a64bd67348fc3dc824654a76b55a3e4e5868777b596290433f1",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:22:35.035Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "ff386925244e1a915da87ee563bdd4e2412cc1705c54afef618ad2f1e6645ecb",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-7b8d6a068b38",
"environmentDigest": "sha256:bf18711867f31a64bd67348fc3dc824654a76b55a3e4e5868777b596290433f1",
"environmentInputHash": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"codeInputHash": "5ac3e165aaf2b87a5138c404870feba94da8f7269e566dfa89a180b71d5ff7cb",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:bf18711867f31a64bd67348fc3dc824654a76b55a3e4e5868777b596290433f1",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-7b8d6a068b38",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-7b8d6a068b38",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:bf18711867f31a64bd67348fc3dc824654a76b55a3e4e5868777b596290433f1"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "4269b9316d150facffb495f7c4900ee56af391c071b86063ae850defa7e64e99",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-user-billing",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-7b8d6a068b38",
"imageTag": "env-7b8d6a068b38",
"digest": "sha256:ecdd1f6be8b604ceaa18b6cf0575af63e2b25b955e8e41f7b996108d24b4110b",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:22:36.336Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "bdeb0aacf71f54d1c2e8486fbf50cd80c7a33949e872bfba45a6812a3145b1dc",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-7b8d6a068b38",
"environmentDigest": "sha256:ecdd1f6be8b604ceaa18b6cf0575af63e2b25b955e8e41f7b996108d24b4110b",
"environmentInputHash": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"codeInputHash": "1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:ecdd1f6be8b604ceaa18b6cf0575af63e2b25b955e8e41f7b996108d24b4110b",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-7b8d6a068b38",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-user-billing.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-7b8d6a068b38",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:ecdd1f6be8b604ceaa18b6cf0575af63e2b25b955e8e41f7b996108d24b4110b"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "490a070de1a6975b4935670478f0e64345d20e1aa9b80096b1318106b25d9310",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-project-management",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:62ecd978b8ea25a413c0c805605f17cb96cc4c98b13b1cbb074a57b0c33bc525",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:22:35.504Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "9e60d770cbba473b054ba9c25a220d22659051a9bac9248863466892826b2a32",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-bb377a5d3729",
"environmentDigest": "sha256:62ecd978b8ea25a413c0c805605f17cb96cc4c98b13b1cbb074a57b0c33bc525",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "a6739860349cb74b61680ea9ef8416cd6bb05718b19495d9962211715f279a8b",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:62ecd978b8ea25a413c0c805605f17cb96cc4c98b13b1cbb074a57b0c33bc525",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-project-management.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:62ecd978b8ea25a413c0c805605f17cb96cc4c98b13b1cbb074a57b0c33bc525"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "30d9f35c4d70555725db1ef7a591b9af9cb158e82d924d3c6dc82326fbeffbd4",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:992596c03ebbdf2ae055d56c83510d63f883ff753f89461bb28a20a909572e12",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:22:36.214Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "84563e57072b49fa11f303235a4de1ceb5df0576b6fd14679477f5e110eab5ff",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-bb377a5d3729",
"environmentDigest": "sha256:992596c03ebbdf2ae055d56c83510d63f883ff753f89461bb28a20a909572e12",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "28a715eee2959d877a2f7d62461a3142c6c376f52f725bdf9c5b6da17275bbf6",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:992596c03ebbdf2ae055d56c83510d63f883ff753f89461bb28a20a909572e12",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-web.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:992596c03ebbdf2ae055d56c83510d63f883ff753f89461bb28a20a909572e12"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-gateway",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:2cec623eeb3a779f7213bb4dc59e2ea2dd618768767f69e14232bf5b6383467c",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:22:35.701Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "f62bf867c44cb6eb979e255e3f285aaac4dcde143819115662324f198b08db47",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-bb377a5d3729",
"environmentDigest": "sha256:2cec623eeb3a779f7213bb4dc59e2ea2dd618768767f69e14232bf5b6383467c",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:2cec623eeb3a779f7213bb4dc59e2ea2dd618768767f69e14232bf5b6383467c",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-gateway.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:2cec623eeb3a779f7213bb4dc59e2ea2dd618768767f69e14232bf5b6383467c"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "3fed509f00ba3448138a999f51dad3d38b822bb4a5c152011e3e57526972fd41",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:1d2e91909dd14ff7df30b2c19a71df475c9c4b1b224c4ef86c15b4fe9727387f",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:22:39.036Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "68788f9255479a574bd38c98dbefee762abd3e8bffda8e3ab831e7ec7acff1ab",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-bb377a5d3729",
"environmentDigest": "sha256:1d2e91909dd14ff7df30b2c19a71df475c9c4b1b224c4ef86c15b4fe9727387f",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:1d2e91909dd14ff7df30b2c19a71df475c9c4b1b224c4ef86c15b4fe9727387f",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:1d2e91909dd14ff7df30b2c19a71df475c9c4b1b224c4ef86c15b4fe9727387f"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "68746696603227763e5768f8daf45d31331f4c8425e6d756b21482ad104e6183",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"sourceCommitId": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-bb377a5d3729",
"imageTag": "env-bb377a5d3729",
"digest": "sha256:12e784e976fe3779864774cffdcddec64a1d3eff86e9c7997d6f97220ebf9d23",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:22:37.153Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "d9214b7feea7afbe06efd7972749334302322322d62652b1b2d2a85c3ef2c34b",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-bb377a5d3729",
"environmentDigest": "sha256:12e784e976fe3779864774cffdcddec64a1d3eff86e9c7997d6f97220ebf9d23",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:12e784e976fe3779864774cffdcddec64a1d3eff86e9c7997d6f97220ebf9d23",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-bb377a5d3729",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1d636ba0d262033c2a9cb4c9625e32895305e7eb",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-agent-skills.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-bb377a5d3729",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:12e784e976fe3779864774cffdcddec64a1d3eff86e9c7997d6f97220ebf9d23"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"build-system-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 8,
"requiredServiceCount": 8,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-workbench-runtime",
"hwlab-user-billing",
"hwlab-project-management",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-workbench-runtime",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-workbench-runtime/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-user-billing",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-user-billing/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-project-management",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-project-management/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "node-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.mjs",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
@@ -0,0 +1,639 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "v03",
"profile": "v03",
"namespace": "hwlab-v03",
"endpoint": "https://hwlab.pikapython.com",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"artifactState": "published",
"publish": {
"ciPublished": true,
"registryVerified": true,
"provenance": "node-ci-artifact:hwlab-v03-ci-bench-f94e2c13a2e7-mquu8mp9-collect",
"note": "Digest fields were copied from a successful DEV artifact publish report for this source commit."
},
"healthContract": {
"method": "GET",
"path": "/health/live",
"responseFormat": "json",
"requiredFields": [
"serviceId",
"environment",
"status"
]
},
"allowedProfiles": [
"v03"
],
"forbiddenProfiles": [
"dev",
"prod"
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"sourceCommitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3bc70135d1a5",
"imageTag": "env-3bc70135d1a5",
"digest": "sha256:3f99655bdb7ab1d1decccf95948e31da3b31b5fe3293648883ae5410ab82774e",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:19:34.058Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "7d7cd8a8d49830ec0e79bdd10cd52facfa0c1bb8",
"componentInputHash": "02c21646534fa4dac5eb8a88733d75ae3b8f8968cd60547562a0a8bb124ea32d",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3bc70135d1a5",
"environmentDigest": "sha256:3f99655bdb7ab1d1decccf95948e31da3b31b5fe3293648883ae5410ab82774e",
"environmentInputHash": "3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"codeInputHash": "ec1a74f5047e16df193dc2fa1a7da19b12c27176ec8966b56d41a64606127400",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:3f99655bdb7ab1d1decccf95948e31da3b31b5fe3293648883ae5410ab82774e",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3bc70135d1a5",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-api.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3bc70135d1a5",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:3f99655bdb7ab1d1decccf95948e31da3b31b5fe3293648883ae5410ab82774e"
}
},
"dockerfileHash": "e092d20bd1ed224f6e4b96ff64838d4861cdafc1d125c71a1ace4069c2309931",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "445d32282d642d5089290ffe5f621ccea3206cf1d9f11b24091f82a4434cbcd5",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed",
"component-path-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-workbench-runtime",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"sourceCommitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"image": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-63971d02bfec",
"imageTag": "env-63971d02bfec",
"digest": "sha256:28c041649b9a95d18394c5c009dd6a2e69c81128a458e60d8b26e50562bae184",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:19:33.820Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:63971d02bfec98671db1dc364f5767f0782e8d8447d6c5015a3468ac66554191",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "b4113907f07ca942bec11ebdd6c664f04c5103ba",
"componentInputHash": "ee09684182f9ce40b58383191fcc62987a642246bdda634817ab0766f53af1e7",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-63971d02bfec",
"environmentDigest": "sha256:28c041649b9a95d18394c5c009dd6a2e69c81128a458e60d8b26e50562bae184",
"environmentInputHash": "63971d02bfec98671db1dc364f5767f0782e8d8447d6c5015a3468ac66554191",
"codeInputHash": "5ac3e165aaf2b87a5138c404870feba94da8f7269e566dfa89a180b71d5ff7cb",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:28c041649b9a95d18394c5c009dd6a2e69c81128a458e60d8b26e50562bae184",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-63971d02bfec",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-63971d02bfec",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:28c041649b9a95d18394c5c009dd6a2e69c81128a458e60d8b26e50562bae184"
}
},
"dockerfileHash": "b33d627783636c621f4522b584c9245e081b3bd45f94069278e68088ba74bc85",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "4269b9316d150facffb495f7c4900ee56af391c071b86063ae850defa7e64e99",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-user-billing",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"sourceCommitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"image": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-63971d02bfec",
"imageTag": "env-63971d02bfec",
"digest": "sha256:ebe6f936c3d6f4e186e64b51f5ef6510109272f6439b858cd6d61f9035917a72",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:19:36.045Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:63971d02bfec98671db1dc364f5767f0782e8d8447d6c5015a3468ac66554191",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "b4113907f07ca942bec11ebdd6c664f04c5103ba",
"componentInputHash": "e2091f33449ca385f7a0f8eb0b845cb50417f58dbcc44e3cdce06a4a73dc1a88",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-63971d02bfec",
"environmentDigest": "sha256:ebe6f936c3d6f4e186e64b51f5ef6510109272f6439b858cd6d61f9035917a72",
"environmentInputHash": "63971d02bfec98671db1dc364f5767f0782e8d8447d6c5015a3468ac66554191",
"codeInputHash": "1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:ebe6f936c3d6f4e186e64b51f5ef6510109272f6439b858cd6d61f9035917a72",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-63971d02bfec",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-user-billing.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-63971d02bfec",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:ebe6f936c3d6f4e186e64b51f5ef6510109272f6439b858cd6d61f9035917a72"
}
},
"dockerfileHash": "b33d627783636c621f4522b584c9245e081b3bd45f94069278e68088ba74bc85",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "490a070de1a6975b4935670478f0e64345d20e1aa9b80096b1318106b25d9310",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-project-management",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"sourceCommitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"image": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-3bc70135d1a5",
"imageTag": "env-3bc70135d1a5",
"digest": "sha256:d2b01d8cbe0d6bc85468918915f95b9b83e7ce59a9c359385499d07c50c46728",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:19:36.004Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "034b4c8ac129bd5d295e18a7e7d12b74b0c18fcc",
"componentInputHash": "18332e41a7b5774a8a77d8416bc30ec31b5eb84db74b04517bfffaa44ceabe7f",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-3bc70135d1a5",
"environmentDigest": "sha256:d2b01d8cbe0d6bc85468918915f95b9b83e7ce59a9c359385499d07c50c46728",
"environmentInputHash": "3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"codeInputHash": "a6739860349cb74b61680ea9ef8416cd6bb05718b19495d9962211715f279a8b",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:d2b01d8cbe0d6bc85468918915f95b9b83e7ce59a9c359385499d07c50c46728",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-3bc70135d1a5",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-project-management.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-3bc70135d1a5",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:d2b01d8cbe0d6bc85468918915f95b9b83e7ce59a9c359385499d07c50c46728"
}
},
"dockerfileHash": "e092d20bd1ed224f6e4b96ff64838d4861cdafc1d125c71a1ace4069c2309931",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "30d9f35c4d70555725db1ef7a591b9af9cb158e82d924d3c6dc82326fbeffbd4",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"sourceCommitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-3bc70135d1a5",
"imageTag": "env-3bc70135d1a5",
"digest": "sha256:94dacb0df29b7c4dff83ebd68c0ae11460abe80b523695baed7c03da063f96ca",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:19:39.981Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "034b4c8ac129bd5d295e18a7e7d12b74b0c18fcc",
"componentInputHash": "7b821e31e8c2d471c5f1e570f9933b2a3e643220350a6435117f6f74fc19e774",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-3bc70135d1a5",
"environmentDigest": "sha256:94dacb0df29b7c4dff83ebd68c0ae11460abe80b523695baed7c03da063f96ca",
"environmentInputHash": "3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"codeInputHash": "28a715eee2959d877a2f7d62461a3142c6c376f52f725bdf9c5b6da17275bbf6",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:94dacb0df29b7c4dff83ebd68c0ae11460abe80b523695baed7c03da063f96ca",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-3bc70135d1a5",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-web.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-3bc70135d1a5",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:94dacb0df29b7c4dff83ebd68c0ae11460abe80b523695baed7c03da063f96ca"
}
},
"dockerfileHash": "e092d20bd1ed224f6e4b96ff64838d4861cdafc1d125c71a1ace4069c2309931",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-gateway",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"sourceCommitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-3bc70135d1a5",
"imageTag": "env-3bc70135d1a5",
"digest": "sha256:3bf74356610891bc579fa6ee1ea3e432c3bce164ae347d767c34333820d927f5",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:19:35.782Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "b4113907f07ca942bec11ebdd6c664f04c5103ba",
"componentInputHash": "db40ee356064e1e2e864a334ae2ca0f8118b55282bc512a9c37b433f98844f38",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-3bc70135d1a5",
"environmentDigest": "sha256:3bf74356610891bc579fa6ee1ea3e432c3bce164ae347d767c34333820d927f5",
"environmentInputHash": "3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"codeInputHash": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:3bf74356610891bc579fa6ee1ea3e432c3bce164ae347d767c34333820d927f5",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-3bc70135d1a5",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-gateway.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-3bc70135d1a5",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:3bf74356610891bc579fa6ee1ea3e432c3bce164ae347d767c34333820d927f5"
}
},
"dockerfileHash": "e092d20bd1ed224f6e4b96ff64838d4861cdafc1d125c71a1ace4069c2309931",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "3fed509f00ba3448138a999f51dad3d38b822bb4a5c152011e3e57526972fd41",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"sourceCommitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-3bc70135d1a5",
"imageTag": "env-3bc70135d1a5",
"digest": "sha256:786dba2631891266b7a7d1ba7d4ad22b3f2635914e0c55aad4c531811bc91e5a",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:19:35.792Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "b4113907f07ca942bec11ebdd6c664f04c5103ba",
"componentInputHash": "ef7dc2f7e2899f8bf714629c4591a788a5009850860426f6304a28bf5b48f80b",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-3bc70135d1a5",
"environmentDigest": "sha256:786dba2631891266b7a7d1ba7d4ad22b3f2635914e0c55aad4c531811bc91e5a",
"environmentInputHash": "3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"codeInputHash": "c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:786dba2631891266b7a7d1ba7d4ad22b3f2635914e0c55aad4c531811bc91e5a",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-3bc70135d1a5",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-3bc70135d1a5",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:786dba2631891266b7a7d1ba7d4ad22b3f2635914e0c55aad4c531811bc91e5a"
}
},
"dockerfileHash": "e092d20bd1ed224f6e4b96ff64838d4861cdafc1d125c71a1ace4069c2309931",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "68746696603227763e5768f8daf45d31331f4c8425e6d756b21482ad104e6183",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"sourceCommitId": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-3bc70135d1a5",
"imageTag": "env-3bc70135d1a5",
"digest": "sha256:b3b51b90beac0db58993053723ce5baca1033c5c611bf347b19d8062110ac46f",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T11:19:35.950Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "b4113907f07ca942bec11ebdd6c664f04c5103ba",
"componentInputHash": "c5b145523976943071b7778483d87df9a12045de7bed03a6d2a183de48d93908",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-3bc70135d1a5",
"environmentDigest": "sha256:b3b51b90beac0db58993053723ce5baca1033c5c611bf347b19d8062110ac46f",
"environmentInputHash": "3bc70135d1a540e9630144540589d0ee9cd53c773d8db48f884b49bbd98b32a2",
"codeInputHash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b3b51b90beac0db58993053723ce5baca1033c5c611bf347b19d8062110ac46f",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-3bc70135d1a5",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f94e2c13a2e76e442c0fabec60cb43e996936198",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-agent-skills.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-3bc70135d1a5",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b3b51b90beac0db58993053723ce5baca1033c5c611bf347b19d8062110ac46f"
}
},
"dockerfileHash": "e092d20bd1ed224f6e4b96ff64838d4861cdafc1d125c71a1ace4069c2309931",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"code-input-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": null
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 8,
"requiredServiceCount": 8,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-workbench-runtime",
"hwlab-user-billing",
"hwlab-project-management",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-workbench-runtime",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-workbench-runtime/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-user-billing",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-user-billing/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-project-management",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-project-management/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "node-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.mjs",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
-57
View File
@@ -1,57 +0,0 @@
# HWLAB Agent Index
HWLAB 是硬件实验室运行面和控制面项目。本文件只作为低噪声顶级索引,详细规则统一进入 `docs/reference/` 或对应 skill;远端读取 `AGENTS.md` 不应超过 UniDesk CLI 默认输出阈值。
## P0 当前任务定位
- 先按 issue、PR、CLI 参数或受控 lane 配置解析目标 `node + lane`;没有明确目标时才读取受控配置,禁止把 G14、v0.2、D601 legacy 或任意历史路径写成全局默认。
- D601 v0.3 的固定 workspace 是 `/home/ubuntu/workspace/hwlab-v03`,固定跟踪 `origin/v0.3`;它是当前 D601/v03 source truth,不是 legacy 对照面。
- D518 v0.3 的固定主 workspace 是 `D518:/home/ubuntu/workspace/hwlab-v03`,固定跟踪 `github/v0.3`;D518 源码、配置、部署和 issue 修复必须从这里创建 `.worktree/<task>`,不要使用 master server 或 `/root/HWLAB` 作为 D518 source truth。
- k3s 操作必须通过 UniDesk route,例如 `D601:k3s``G14:k3s`;不要使用另一节点 kubeconfig、Docker Desktop Kubernetes、master server 本地构建或旧 JS CD 结果作为当前 lane 证据。
- `hyueapi.com` / `.hyueapi.com` 必须保留在 `NO_PROXY` / `no_proxy`Codex API 通道不得被 HTTP/SOCKS proxy 劫持。
## P0 文档与可见性
- `AGENTS.md` 只保留项目索引、一句话规则和交叉引用;细则写入 `docs/reference/`,通用操作写入对应 skill,避免远端读取触发 dump。
- 如果远端 `AGENTS.md`、CLI help 或默认命令输出超过 UniDesk dump 阈值,先改可见性:拆分文档、改简洁表格输出或补 drill-down,不用长 dump 当常态入口。
- 编辑 `AGENTS.md``docs/reference/*.md` 或过程文档蒸馏时,先遵循 `docs-spec`;单纯文档/CLI/helper 轻量变更可在当前 node/lane 固定主 worktree 直接提交并 push。
- GitHub issue/PR 正式写入走 UniDesk CLI;不要用原生 `gh` 或手写 GitHub API 写长期看板、反馈 issue 或 PR closeout。
## P0 交付边界
- CaseRun、case registry、trace 语义化、harness 诊断和短连接 runner 调试默认是无服务工作流;先单步定位卡点,再决定是否跑完整 CaseRun。
- 业务代码、运行面、发布链路、Secret、权限、数据迁移、PROD 或其他高风险变更走 PR 工作流;PR base 必须匹配当前 node/lane source branch。
- 当前发布只走受控 node/lane Tekton/GitOps/Argo CD 控制面;旧 D601 `ci-publish``dev-cd-apply``dev-deploy-apply``dev-artifact-publish` 不得恢复。
- 用户最新明确要求优先于旧测试、旧门禁、旧预检、旧断言和旧 guard;阻碍最新目标的旧入口直接删除或迁移,不做兼容绕行。
## Skill 路由
- Code Agent session/trace/result/inspect/send:使用 `hwlab-code-agent` skill。
- HWPOD CaseRun:使用 `hwlab-caserun` skill。
- HWPOD node/cloud-api 注册与节点运维:使用 `hwpod-ops` skill。
- DAD 跨节点修复、运行面实测和 PR/rollout 验收:使用 `dad-dev` skill。
- GitHub issue/PR 写入:使用 UniDesk `unidesk-gh` skill 和 `bun scripts/cli.ts gh ...`
- OTel/Tempo 链路追踪:使用 UniDesk `unidesk-otel` skill。
- Node/lane CI/CD、trigger-current、git mirror、Argo/Tekton:使用 UniDesk `unidesk-cicd` skill。
## 长期参考索引
- Agent 入口拆分、输出预算、skill/reference 归属:[docs/reference/agent-entrypoint.md](docs/reference/agent-entrypoint.md)
- 指挥官协作、worktree、PR、自合并和 prompt handoff[docs/reference/commander-collaboration.md](docs/reference/commander-collaboration.md)
- Node GitOps CI/CD、当前受控发布边界:[docs/reference/node-gitops-cicd.md](docs/reference/node-gitops-cicd.md)
- DEV/runtime 边界与禁止误判:[docs/reference/dev-runtime-boundary.md](docs/reference/dev-runtime-boundary.md)
- Cloud Workbench 默认首页与 UX 约束:[docs/reference/cloud-workbench.md](docs/reference/cloud-workbench.md)
- Code Agent 真实回复、provider blocker 与 readiness[docs/reference/code-agent-chat-readiness.md](docs/reference/code-agent-chat-readiness.md)
- OpenCode 独立 UI 接入、iframe 鉴权换票与 OTel 追踪:[docs/reference/opencode-integration.md](docs/reference/opencode-integration.md)
- AgentRun 手动调度与 UniDesk SSH passthrough[docs/reference/agentrun-code-agent-dispatch.md](docs/reference/agentrun-code-agent-dispatch.md)
- Kafka session 源码直连与独立 debug topic 单步调试:[docs/reference/kafka-source-direct-debug.md](docs/reference/kafka-source-direct-debug.md)
- 文档治理与 docs-spec 本地权威:[docs/reference/documentation-governance.md](docs/reference/documentation-governance.md)
- 中文优先规则:[docs/reference/chinese-first-documentation.md](docs/reference/chinese-first-documentation.md)
- 用户反馈分流:[docs/reference/user-feedback-triage.md](docs/reference/user-feedback-triage.md)
## 常用轻量入口
- 当前 node/lane 状态由 UniDesk 受控 CLI 查询,例如 `bun scripts/cli.ts hwlab nodes control-plane status --node D601 --lane v03`
- Web 等价短连接 CLI 在当前 node/lane 固定 workspace 运行 `bun tools/hwlab-cli/bin/hwlab-cli.ts client ... --base-url <target-web-url>`
- Cloud Web 检查需要依赖时先跑 `npm run worktree:deps`;随后按任务需要跑 `npm run web:check``npm run web:build`
- G14/D601 发布和 git mirror 操作以 UniDesk `hwlab nodes ...` / `hwlab g14 ...` 受控入口为准,不使用旧脚本 CD。
-7
View File
@@ -1,7 +0,0 @@
# HWLAB v0.3 Project Management MDTODO
- [x] Implement project management root navigation and MDTODO read page.
- [ ] Launch Workbench from a selected MDTODO task through the public Workbench API.
- [ ] Persist the `ProjectWorkbenchLink` projection for the launched session.
- [ ] Verify the Workbench session detail exposes only stable project/task metadata.
- [-] Track project-management specific web-probe observe/analyze support in the follow-up phase.
-25
View File
@@ -1,25 +0,0 @@
{
"contractVersion": "hwpod-case-v1",
"caseId": "constart-71freq-compile",
"title": "ConStart 71-FREQ Keil compile-only CaseRun",
"mode": "compile-only",
"hwpodSpec": "hwpod-spec.yaml",
"subject": {
"repoLocalPath": "F:\\Work\\ConStart",
"commitId": "d661e089c04f140957a204b2f1bd9b1bd51d98bc",
"subdir": "projects/71-00075-11"
},
"expected": {
"compile": {
"success": true,
"artifactSuffixes": [
"projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW/FREQ_Controller_FW.hex",
"projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW/FREQ_Controller_FW.axf"
]
},
"download": {
"skipped": true,
"reason": "current 2183 acceptance validates compile evidence before download/UART expansion"
}
}
}
@@ -1,34 +0,0 @@
apiVersion: hwlab.dev/v0alpha1
kind: Hwpod
metadata:
uid: CONSTART-71FREQ-C
name: constart-71freq-c
spec:
targetDevice:
board: ConStart 71-FREQ Controller
mcu: STM32H723ZGTx
flashBase: "0x08000000"
workspace:
path: "F:\\Work\\ConStart"
toolchain: keil-mdk
projectRoot: projects/71-00075-11
keilProject: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW.uvprojx
keilTarget: FREQ_Controller_FW
hexPath: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW/FREQ_Controller_FW.hex
mapPath: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW/FREQ_Controller_FW.map
keilCliPath: "C:\\Users\\liang\\.agents\\skills\\keil\\keil-cli.py"
debugProbe:
type: cmsis-dap
adapter: keil
probeUid: 3FD750C63E342E24
probeName: MicroLink CMSIS-DAP
programBackend: keil-headless
autoBindUvoptx: true
ioProbe:
uart:
id: uart/1
port: COM4
baudrate: 921600
nodeBinding:
nodeId: node-d601-f103-v2
nodeType: pc-host
-25
View File
@@ -1,25 +0,0 @@
{
"contractVersion": "hwpod-case-v1",
"caseId": "d601-f103-v2-compile",
"title": "D601-F103-V2 Keil compile-only CaseRun",
"mode": "compile-only",
"hwpodSpec": "hwpod-spec.yaml",
"subject": {
"repoLocalPath": "F:\\Work\\HWLAB-CASE-F103",
"commitId": "df7a4e6e551fa90d64bde5537cc000f89d63dd20",
"subdir": "projects/01_baseline"
},
"expected": {
"compile": {
"success": true,
"artifactSuffixes": [
"projects/01_baseline/Output/atk_f103.hex",
"projects/01_baseline/Output/atk_f103.axf"
]
},
"download": {
"skipped": true,
"reason": "current acceptance line only validates compile evidence"
}
}
}
@@ -1,29 +0,0 @@
apiVersion: hwlab.dev/v0alpha1
kind: Hwpod
metadata:
uid: D601-F103-V2
name: d601-f103-v2
spec:
targetDevice:
board: D601-F103-V2
mcu: STM32F103
workspace:
path: "F:\\Work\\HWLAB-CASE-F103"
toolchain: keil-mdk
keilProject: projects/01_baseline/Projects/MDK-ARM/atk_f103.uvprojx
keilTarget: USART
keilCliPath: "C:\\Users\\liang\\.agents\\skills\\keil\\keil-cli.py"
debugProbe:
type: daplink
adapter: keil
probeUid: 3FD750C63E342E24
probeName: MicroLink CMSIS-DAP
programBackend: keil
ioProbe:
uart:
id: uart/1
port: COM9
baudrate: 115200
nodeBinding:
nodeId: node-d601-f103-v2
nodeType: pc-host
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
-101
View File
@@ -1,101 +0,0 @@
#!/usr/bin/env node
import {
handleBoxInvoke,
operationContext,
readBoxPort,
writeBoxPort
} from "../../internal/sim/l2-runtime.mjs";
import { createHealth, createBoxState, selectInstanceValue } from "../../internal/sim/model.mjs";
import { createJsonServer, listen, parsePort, readJson } from "../../internal/sim/http.mjs";
const boxId = selectInstanceValue(process.env.HWLAB_BOX_ID, "boxsim_alpha", {
requireIndexForMultiple: true,
label: "HWLAB_BOX_ID"
});
const gatewaySessionId = selectInstanceValue(
process.env.HWLAB_GATEWAY_SESSION_ID,
"gws_mvp_simu",
{
requireIndexForMultiple: true,
label: "HWLAB_GATEWAY_SESSION_ID"
}
);
const resourceId = selectInstanceValue(process.env.HWLAB_BOX_RESOURCE_ID, "", {
requireIndexForMultiple: true,
label: "HWLAB_BOX_RESOURCE_ID"
});
const port = parsePort(process.env.PORT, 7201);
const state = createBoxState({ boxId, gatewaySessionId });
if (resourceId) {
state.resource.resourceId = resourceId;
for (const capability of state.capabilities ?? []) {
capability.resourceId = resourceId;
}
}
const routes = new Map();
routes.set("GET /health/live", () => ({
...createHealth({ serviceId: "hwlab-box-simu", name: boxId }),
boxId,
resourceId: state.resource.resourceId
}));
routes.set("GET /status", () => state);
routes.set("GET /capabilities", () => ({
serviceId: "hwlab-box-simu",
boxId,
resourceId: state.resource.resourceId,
capabilities: state.capabilities
}));
routes.set("GET /internal/ports", () => ({
serviceId: "hwlab-box-simu",
boxId,
resourceId: state.resource.resourceId,
ports: state.ports,
internalPortApi: true
}));
routes.set("POST /ports/read", async ({ req }) => {
const body = await readJson(req);
return readBoxPort({
state,
port: body.port,
capabilityId: body.capabilityId,
context: operationContext(body, { serviceId: "hwlab-box-simu" })
});
});
routes.set("POST /ports/write", async ({ req }) => {
const body = await readJson(req);
return writeBoxPort({
state,
port: body.port,
capabilityId: body.capabilityId,
value: body.value,
source: body.source ?? "local",
context: operationContext(body, { serviceId: "hwlab-box-simu" })
});
});
routes.set("POST /internal/ports/write", async ({ req }) => {
const body = await readJson(req);
return writeBoxPort({
state,
port: body.port,
capabilityId: body.capabilityId,
value: body.value,
source: body.source ?? "internal",
sourceResourceId: body.sourceResourceId,
sourcePort: body.sourcePort,
propagatedBy: body.propagatedBy,
internal: true,
context: operationContext(body, { serviceId: "hwlab-box-simu" })
});
});
routes.set("POST /invoke", async ({ req }) => {
const body = await readJson(req);
return handleBoxInvoke({
state,
body,
context: operationContext(body, { serviceId: "hwlab-box-simu" })
});
});
listen(createJsonServer({ routes }), port);
-39
View File
@@ -1,39 +0,0 @@
#!/usr/bin/env bun
import { createCloudApiBunServer } from "../../internal/cloud/bun-server.ts";
import { applyCloudApiImageEnv, parsePort, parseTimeout } from "./runtime-options.ts";
const host = process.env.HWLAB_CLOUD_API_HOST || "0.0.0.0";
const port = parsePort(process.env.HWLAB_CLOUD_API_PORT, parsePort(process.env.PORT, 6667));
const codeAgentTimeoutMs = parseTimeout(process.env.HWLAB_CODE_AGENT_TIMEOUT_MS, 1200000, {
min: 1000,
max: 2400000
});
const codeAgentHardTimeoutMs = parseTimeout(process.env.HWLAB_CODE_AGENT_HARD_TIMEOUT_MS, Math.max(1200000, codeAgentTimeoutMs * 4), {
min: codeAgentTimeoutMs,
max: 3600000
});
applyCloudApiImageEnv(process.env);
const runtime = await createCloudApiBunServer({
host,
port,
codeAgentTimeoutMs,
codeAgentHardTimeoutMs
});
process.stdout.write(
`${JSON.stringify({
serviceId: "hwlab-cloud-api",
status: "listening",
host,
port: runtime.port,
hwpodNodeWs: "/v1/hwpod-node/ws"
})}\n`
);
for (const signal of ["SIGINT", "SIGTERM"]) {
process.on(signal, () => {
runtime.stop();
process.exit(0);
});
}
-12
View File
@@ -1,12 +0,0 @@
#!/usr/bin/env bun
import {
formatDevRuntimeMigrationFailure,
runDevRuntimeMigrationCli
} from "../../scripts/src/dev-runtime-migration.mjs";
try {
process.exitCode = await runDevRuntimeMigrationCli(process.argv.slice(2));
} catch (error) {
process.stdout.write(`${JSON.stringify(formatDevRuntimeMigrationFailure(error), null, 2)}\n`);
process.exitCode = 1;
}
-12
View File
@@ -1,12 +0,0 @@
#!/usr/bin/env bun
import {
formatDevRuntimeProvisioningFailure,
runDevRuntimeProvisioningCli
} from "../../scripts/src/dev-runtime-provisioning.mjs";
try {
process.exitCode = await runDevRuntimeProvisioningCli(process.argv.slice(2));
} catch (error) {
process.stdout.write(`${JSON.stringify(formatDevRuntimeProvisioningFailure(error), null, 2)}\n`);
process.exitCode = 1;
}
@@ -1,38 +0,0 @@
import assert from "node:assert/strict";
import { test } from "bun:test";
import { applyCloudApiImageEnv, parsePort, parseTimeout } from "./runtime-options.ts";
test("parsePort preserves current hwlab-cloud-api port fallback behavior", () => {
assert.equal(parsePort(undefined, 6667), 6667);
assert.equal(parsePort("", 6667), 6667);
assert.equal(parsePort("abc", 6667), 6667);
assert.equal(parsePort("-1", 6667), 6667);
assert.equal(parsePort("65536", 6667), 6667);
assert.equal(parsePort("0", 6667), 0);
assert.equal(parsePort("19667", 6667), 19667);
});
test("parseTimeout clamps parsed integer values to the configured range", () => {
assert.equal(parseTimeout(undefined, 1200000, { min: 1000, max: 2400000 }), 1200000);
assert.equal(parseTimeout("abc", 1200000, { min: 1000, max: 2400000 }), 1200000);
assert.equal(parseTimeout("1", 1200000, { min: 1000, max: 2400000 }), 1000);
assert.equal(parseTimeout("99999999", 1200000, { min: 1000, max: 2400000 }), 2400000);
assert.equal(parseTimeout("1500", 1200000, { min: 1000, max: 2400000 }), 1500);
});
test("applyCloudApiImageEnv derives image identity from commit without overriding explicit values", () => {
const env = { HWLAB_COMMIT_ID: "abcdef1234567890" };
applyCloudApiImageEnv(env);
assert.equal(env.HWLAB_IMAGE, "ghcr.io/pikastech/hwlab-cloud-api:abcdef1");
assert.equal(env.HWLAB_IMAGE_TAG, "abcdef1");
const explicit = {
HWLAB_GIT_SHA: "11111112222222",
HWLAB_IMAGE: "registry.local/custom:tag",
HWLAB_IMAGE_TAG: "custom"
};
applyCloudApiImageEnv(explicit);
assert.equal(explicit.HWLAB_IMAGE, "registry.local/custom:tag");
assert.equal(explicit.HWLAB_IMAGE_TAG, "custom");
});
-22
View File
@@ -1,22 +0,0 @@
export function parseTimeout(value, fallback, { min, max }) {
const parsed = Number.parseInt(value || "", 10);
if (!Number.isInteger(parsed)) return fallback;
return Math.min(Math.max(parsed, min), max);
}
export function parsePort(value, fallback) {
const parsed = Number.parseInt(value || "", 10);
if (!Number.isInteger(parsed) || parsed < 0 || parsed >= 65536) return fallback;
return parsed;
}
export function applyCloudApiImageEnv(env = process.env) {
const commitId = env.HWLAB_COMMIT_ID || env.HWLAB_GIT_SHA;
if (!env.HWLAB_IMAGE && commitId) {
env.HWLAB_IMAGE = `ghcr.io/pikastech/hwlab-cloud-api:${commitId.slice(0, 7)}`;
}
if (!env.HWLAB_IMAGE_TAG && commitId) {
env.HWLAB_IMAGE_TAG = commitId.slice(0, 7);
}
}
@@ -1,120 +0,0 @@
import assert from "node:assert/strict";
import { spawn } from "node:child_process";
import { createServer } from "node:http";
import test from "node:test";
const bunCommand = process.env.HWLAB_TEST_BUN_COMMAND || process.env.HWLAB_BUN_COMMAND || (process.versions.bun ? process.execPath : "bun");
test("Codex API Responses forwarder maps loopback Codex paths to configurable upstream and preserves stream body", async () => {
const upstream = await startUpstream();
const forwarder = await startForwarder(upstream.port, { upstreamPath: "/" });
try {
const response = await fetch(`http://127.0.0.1:${forwarder.port}/v1/responses`, {
method: "POST",
headers: {
"content-type": "application/json",
authorization: "Bearer test-secret"
},
body: JSON.stringify({ model: "gpt-5.5", input: "OK" })
});
assert.equal(response.status, 200);
const payload = await response.json();
assert.equal(payload.ok, true);
assert.equal(upstream.captured.url, "/responses");
assert.equal(upstream.captured.authorization, "Bearer test-secret");
assert.deepEqual(JSON.parse(upstream.captured.body), { model: "gpt-5.5", input: "OK" });
const health = await fetch(`http://127.0.0.1:${forwarder.port}/health/live`).then((item) => item.json());
assert.equal(health.upstream.host, "127.0.0.1");
assert.equal(health.upstream.directNoProxyRequired, true);
} finally {
await forwarder.stop();
await upstream.stop();
}
});
test("Codex API Responses forwarder keeps /v1 prefix when upstream base is /v1", async () => {
const upstream = await startUpstream();
const forwarder = await startForwarder(upstream.port, { upstreamPath: "/v1" });
try {
const response = await fetch(`http://127.0.0.1:${forwarder.port}/responses`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ input: "OK" })
});
assert.equal(response.status, 200);
assert.equal(upstream.captured.url, "/v1/responses");
} finally {
await forwarder.stop();
await upstream.stop();
}
});
async function startUpstream() {
let captured = null;
const server = createServer(async (request, response) => {
const chunks = [];
for await (const chunk of request) chunks.push(chunk);
captured = {
url: request.url,
method: request.method,
authorization: request.headers.authorization || null,
body: Buffer.concat(chunks).toString("utf8")
};
response.writeHead(200, { "content-type": "application/json" });
response.end(JSON.stringify({ ok: true }));
});
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
return {
port: server.address().port,
get captured() {
return captured;
},
stop: () => new Promise((resolve) => server.close(resolve))
};
}
async function startForwarder(upstreamPort, { upstreamPath }) {
const port = await freePort();
const child = spawn(bunCommand, ["run", "cmd/hwlab-codex-api-responses-forwarder/main.ts"], {
cwd: process.cwd(),
env: {
...process.env,
HWLAB_CODE_AGENT_CODEX_API_FORWARDER_PORT: String(port),
HWLAB_CODE_AGENT_CODEX_API_UPSTREAM_BASE_URL: `http://127.0.0.1:${upstreamPort}${upstreamPath}`
},
stdio: ["ignore", "pipe", "pipe"]
});
let stderr = "";
child.stderr.on("data", (chunk) => {
stderr += chunk;
});
await new Promise((resolve, reject) => {
const timer = setTimeout(() => reject(new Error(`forwarder did not start: ${stderr}`)), 5000);
child.stdout.on("data", (chunk) => {
if (chunk.toString().includes("listening")) {
clearTimeout(timer);
resolve();
}
});
child.on("exit", (code) => {
clearTimeout(timer);
reject(new Error(`forwarder exited early code=${code}: ${stderr}`));
});
});
return {
port,
stop: async () => {
child.kill("SIGTERM");
await new Promise((resolve) => child.once("exit", resolve));
}
};
}
async function freePort() {
const server = createServer();
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
const port = server.address().port;
await new Promise((resolve) => server.close(resolve));
return port;
}
@@ -1,236 +0,0 @@
#!/usr/bin/env node
import { createServer, request as httpRequest } from "node:http";
import { request as httpsRequest } from "node:https";
const serviceId = "hwlab-codex-api-responses-forwarder";
const defaultPort = 49280;
const port = parsePositiveInteger(process.env.HWLAB_CODE_AGENT_CODEX_API_FORWARDER_PORT || process.env.PORT, defaultPort);
const host = firstNonEmpty(process.env.HWLAB_CODE_AGENT_CODEX_API_FORWARDER_HOST, "127.0.0.1");
const upstreamBaseUrl = new URL(firstNonEmpty(process.env.HWLAB_CODE_AGENT_CODEX_API_UPSTREAM_BASE_URL, "https://hyueapi.com"));
const upstreamNoProxyEntries = noProxyEntriesForHost(upstreamBaseUrl.hostname);
const maxBodyBytes = parsePositiveInteger(process.env.HWLAB_CODE_AGENT_CODEX_API_FORWARDER_MAX_BODY_BYTES, 64 * 1024 * 1024);
const hopByHopHeaders = new Set([
"connection",
"keep-alive",
"proxy-authenticate",
"proxy-authorization",
"te",
"trailer",
"transfer-encoding",
"upgrade"
]);
ensureNoProxyEntries(upstreamNoProxyEntries);
const server = createServer(async (clientReq, clientRes) => {
try {
const url = new URL(clientReq.url || "/", "http://hwlab-codex-api-forwarder.local");
if (url.pathname === "/health" || url.pathname === "/health/live" || url.pathname === "/health/liveliness") {
sendJson(clientRes, 200, healthPayload("ok"));
return;
}
if (url.pathname === "/health/readiness") {
sendJson(clientRes, 200, healthPayload("ready"));
return;
}
await proxyRequest(clientReq, clientRes, url);
} catch (error) {
sendJson(clientRes, 502, {
error: {
code: "codex_api_forwarder_failed",
message: "Codex API Responses forwarder failed to proxy request",
reason: error.message
}
});
}
});
server.listen(port, host, () => {
process.stdout.write(JSON.stringify({
serviceId,
status: "listening",
host,
port,
upstreamHost: upstreamBaseUrl.hostname,
noProxyRequired: upstreamNoProxyEntries
}) + "\n");
});
async function proxyRequest(clientReq, clientRes, url) {
const startedAt = Date.now();
const targetUrl = targetUrlForRequest(url);
const headers = filterRequestHeaders(clientReq.headers, targetUrl);
const requestImpl = targetUrl.protocol === "https:" ? httpsRequest : httpRequest;
const upstreamReq = requestImpl({
protocol: targetUrl.protocol,
hostname: targetUrl.hostname,
port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80),
method: clientReq.method,
path: `${targetUrl.pathname}${targetUrl.search}`,
headers
}, (upstreamRes) => {
const responseHeaders = filterResponseHeaders(upstreamRes.headers);
clientRes.writeHead(upstreamRes.statusCode || 502, responseHeaders);
let responseBytes = 0;
upstreamRes.on("data", (chunk) => {
responseBytes += chunk.length;
});
upstreamRes.on("end", () => {
process.stderr.write(JSON.stringify({
serviceId,
method: clientReq.method,
path: url.pathname,
upstreamPath: targetUrl.pathname,
status: upstreamRes.statusCode || null,
responseBytes,
elapsedMs: Date.now() - startedAt
}) + "\n");
});
upstreamRes.pipe(clientRes);
});
upstreamReq.on("error", (error) => {
if (!clientRes.headersSent) {
sendJson(clientRes, 502, {
error: {
code: "codex_api_forwarder_upstream_error",
message: "Codex API forwarder upstream request failed",
reason: error.message
}
});
} else {
clientRes.end();
}
});
await pipeRequestBody(clientReq, upstreamReq);
}
async function pipeRequestBody(clientReq, upstreamReq) {
let bytes = 0;
for await (const chunk of clientReq) {
bytes += chunk.length;
if (bytes > maxBodyBytes) {
upstreamReq.destroy(new Error(`request body exceeded ${maxBodyBytes} bytes`));
return;
}
if (!upstreamReq.write(chunk)) {
await new Promise((resolve) => upstreamReq.once("drain", resolve));
}
}
upstreamReq.end();
}
function targetUrlForRequest(url) {
const target = new URL(upstreamBaseUrl.toString());
target.pathname = upstreamPathFor(url.pathname);
target.search = url.search;
target.hash = "";
return target;
}
function upstreamPathFor(inboundPath) {
const basePath = upstreamBaseUrl.pathname.replace(/\/+$/u, "");
const requestPath = normalizeCodexResponsesPath(inboundPath || "/");
if (!basePath) return requestPath;
if (basePath === "/v1" && requestPath.startsWith("/v1/")) return requestPath;
if (basePath === "/v1" && requestPath === "/v1") return requestPath;
if (basePath.endsWith("/responses") && (requestPath === "/responses" || requestPath === "/v1/responses")) return basePath;
if (basePath.endsWith("/models") && (requestPath === "/models" || requestPath === "/v1/models")) return basePath;
if (requestPath.startsWith(`${basePath}/`) || requestPath === basePath) return requestPath;
return `${basePath}${requestPath}`;
}
function normalizeCodexResponsesPath(pathname) {
if (upstreamBaseUrl.pathname.replace(/\/+$/u, "") === "/v1") return pathname;
if (pathname === "/v1/responses") return "/responses";
if (pathname === "/v1/models") return "/models";
return pathname;
}
function filterRequestHeaders(headers, targetUrl) {
const filtered = {};
for (const [name, value] of Object.entries(headers)) {
const lower = name.toLowerCase();
if (hopByHopHeaders.has(lower) || lower === "host") continue;
filtered[name] = value;
}
filtered.host = targetUrl.host;
return filtered;
}
function filterResponseHeaders(headers) {
const filtered = {};
for (const [name, value] of Object.entries(headers)) {
if (hopByHopHeaders.has(name.toLowerCase())) continue;
filtered[name] = value;
}
return filtered;
}
function sendJson(res, status, payload) {
const body = JSON.stringify(payload);
res.writeHead(status, { "content-type": "application/json", "content-length": Buffer.byteLength(body) });
res.end(body);
}
function healthPayload(status) {
return {
serviceId,
status,
listen: { host, port },
upstream: {
origin: upstreamBaseUrl.origin,
host: upstreamBaseUrl.hostname,
directNoProxyRequired: true,
noProxyRequired: upstreamNoProxyEntries
}
};
}
function ensureNoProxyEntries(entries) {
for (const name of ["NO_PROXY", "no_proxy"]) {
process.env[name] = mergeNoProxyEntries(process.env[name], entries);
}
}
function noProxyEntriesForHost(hostname) {
const hostText = String(hostname || "").trim().toLowerCase();
if (!hostText) return ["127.0.0.1", "localhost", "::1"];
const entries = [hostText, "127.0.0.1", "localhost", "::1"];
if (!/^\d+(?:\.\d+){3}$/u.test(hostText) && !hostText.includes(":")) entries.push(`.${hostText}`);
return uniqueStrings(entries);
}
function mergeNoProxyEntries(current, additions = []) {
return uniqueStrings([...String(current ?? "").split(/[,;\s]+/u), ...additions]).join(",");
}
function uniqueStrings(values) {
const seen = new Set();
const result = [];
for (const value of values) {
const text = String(value ?? "").trim();
if (!text) continue;
const key = text.toLowerCase();
if (seen.has(key)) continue;
seen.add(key);
result.push(text);
}
return result;
}
function firstNonEmpty(...values) {
for (const value of values) {
const text = String(value ?? "").trim();
if (text) return text;
}
return "";
}
function parsePositiveInteger(value, fallback) {
const parsed = Number.parseInt(value || "", 10);
return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
}
@@ -1,137 +0,0 @@
import assert from "node:assert/strict";
import { spawn } from "node:child_process";
import { createServer } from "node:http";
import test from "node:test";
const bunCommand = process.env.HWLAB_TEST_BUN_COMMAND || process.env.HWLAB_BUN_COMMAND || (process.versions.bun ? process.execPath : "bun");
const zstdPayload = Buffer.from([
0x28, 0xb5, 0x2f, 0xfd, 0x04, 0x58, 0x75, 0x03, 0x00, 0x32, 0x47, 0x16,
0x18, 0xa0, 0xa7, 0x39, 0x64, 0x06, 0x2d, 0xdf, 0x85, 0x36, 0x31, 0xd8,
0xd4, 0x6c, 0x92, 0xb2, 0x4d, 0x00, 0x06, 0xdd, 0x98, 0xe9, 0x7f, 0x11,
0x02, 0x4d, 0xd0, 0x9a, 0x4d, 0x59, 0xd4, 0xe1, 0x48, 0x55, 0x64, 0x87,
0x85, 0xa7, 0x17, 0xc3, 0x0b, 0x44, 0x87, 0x34, 0x67, 0xde, 0x2c, 0x9f,
0x8f, 0x30, 0x99, 0x38, 0xa9, 0xb3, 0x25, 0x19, 0x03, 0x9f, 0xaf, 0xc7,
0x9a, 0x05, 0xce, 0x2b, 0x95, 0x5a, 0x13, 0xab, 0xcc, 0x1b, 0x9f, 0xd7,
0xd0, 0x74, 0x4c, 0xbc, 0x68, 0x0a, 0x80, 0xf0, 0x2f, 0xfd, 0x09, 0x9f,
0xf3, 0x84, 0x42, 0x66, 0x01, 0x06, 0x00, 0x4e, 0x20, 0xe8, 0x2a, 0x21,
0x04, 0x03, 0x3f, 0x0d, 0x38, 0x75, 0xb3, 0x32, 0x85, 0x32, 0x03, 0xdb,
0x5b, 0xed, 0x15
]);
test("DeepSeek Responses bridge decompresses Codex zstd body and maps models catalog", async () => {
const upstream = await startUpstream();
const bridge = await startBridge(upstream.port);
try {
const response = await fetch(`http://127.0.0.1:${bridge.port}/v1/responses`, {
method: "POST",
headers: {
"content-type": "application/json",
"content-encoding": "zstd"
},
body: zstdPayload
});
assert.equal(response.status, 200);
assert.equal(upstream.captured.url, "/v1/responses");
assert.equal(upstream.captured.encoding, null);
const forwarded = JSON.parse(upstream.captured.body);
assert.equal(forwarded.model, "deepseek-chat");
assert.deepEqual(forwarded.tools.map((tool) => tool.type), ["function", "function"]);
const readinessResponse = await fetch(`http://127.0.0.1:${bridge.port}/health/readiness`);
assert.equal(readinessResponse.status, 200);
const readiness = await readinessResponse.json();
assert.equal(readiness.upstream.source, "/v1/models");
assert.equal(readiness.upstream.payload.modelCount, 1);
const modelsResponse = await fetch(`http://127.0.0.1:${bridge.port}/v1/models?client_version=test`);
assert.equal(modelsResponse.status, 200);
const models = await modelsResponse.json();
assert.equal(Array.isArray(models.models), true);
assert.equal(models.models[0].slug, "deepseek-chat");
} finally {
await bridge.stop();
await upstream.stop();
}
});
async function startUpstream() {
let captured = null;
const server = createServer(async (request, response) => {
if ((request.url || "").startsWith("/health/readiness")) {
response.writeHead(404, { "content-type": "application/json" });
response.end(JSON.stringify({ error: "not implemented" }));
return;
}
if ((request.url || "").startsWith("/v1/models")) {
response.writeHead(200, { "content-type": "application/json" });
response.end(JSON.stringify({ data: [{ id: "deepseek-chat" }] }));
return;
}
const chunks = [];
for await (const chunk of request) chunks.push(chunk);
captured = {
url: request.url,
method: request.method,
encoding: request.headers["content-encoding"] || null,
length: request.headers["content-length"] || null,
body: Buffer.concat(chunks).toString("utf8")
};
response.writeHead(200, { "content-type": "application/json" });
response.end(JSON.stringify({ ok: true }));
});
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
return {
port: server.address().port,
get captured() {
return captured;
},
stop: () => new Promise((resolve) => server.close(resolve))
};
}
async function startBridge(upstreamPort) {
const port = await freePort();
const child = spawn(bunCommand, ["run", "cmd/hwlab-deepseek-responses-bridge/main.ts"], {
cwd: process.cwd(),
env: {
...process.env,
PORT: String(port),
HWLAB_DEEPSEEK_BRIDGE_UPSTREAM: `http://127.0.0.1:${upstreamPort}`,
HWLAB_DEEPSEEK_BRIDGE_MODEL: "deepseek-chat"
},
stdio: ["ignore", "pipe", "pipe"]
});
let stderr = "";
child.stderr.on("data", (chunk) => {
stderr += chunk;
});
await new Promise((resolve, reject) => {
const timer = setTimeout(() => reject(new Error(`bridge did not start: ${stderr}`)), 5000);
child.stdout.on("data", (chunk) => {
if (chunk.toString().includes("listening")) {
clearTimeout(timer);
resolve();
}
});
child.on("exit", (code) => {
clearTimeout(timer);
reject(new Error(`bridge exited early code=${code}: ${stderr}`));
});
});
return {
port,
stop: async () => {
child.kill("SIGTERM");
await new Promise((resolve) => child.once("exit", resolve));
}
};
}
async function freePort() {
const server = createServer();
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
const port = server.address().port;
await new Promise((resolve) => server.close(resolve));
return port;
}
-375
View File
@@ -1,375 +0,0 @@
#!/usr/bin/env node
import { createServer, request as httpRequest } from "node:http";
import { request as httpsRequest } from "node:https";
import { decompress } from "fzstd";
const serviceId = "hwlab-deepseek-responses-bridge";
const port = parsePositiveInteger(process.env.PORT, 4000);
const upstreamBaseUrl = new URL(process.env.HWLAB_DEEPSEEK_BRIDGE_UPSTREAM || "http://127.0.0.1:4001");
const defaultModel = String(process.env.HWLAB_DEEPSEEK_BRIDGE_MODEL || process.env.HWLAB_CODE_AGENT_DEEPSEEK_MODEL || "deepseek-chat").trim() || "deepseek-chat";
const maxBodyBytes = parsePositiveInteger(process.env.HWLAB_DEEPSEEK_BRIDGE_MAX_BODY_BYTES, 64 * 1024 * 1024);
const hopByHopHeaders = new Set([
"connection",
"keep-alive",
"proxy-authenticate",
"proxy-authorization",
"te",
"trailer",
"transfer-encoding",
"upgrade"
]);
const server = createServer(async (clientReq, clientRes) => {
try {
const url = new URL(clientReq.url || "/", "http://hwlab-deepseek-bridge.local");
if (url.pathname === "/health" || url.pathname === "/health/live" || url.pathname === "/health/liveliness") {
sendJson(clientRes, 200, healthPayload());
return;
}
if (url.pathname === "/health/readiness") {
await sendReadiness(clientRes);
return;
}
if (clientReq.method === "GET" && (url.pathname === "/v1/models" || url.pathname === "/models")) {
await sendCodexModels(clientReq, clientRes, url);
return;
}
if (clientReq.method === "POST" && url.pathname === "/v1/responses") {
await proxyResponsesRequest(clientReq, clientRes, url);
return;
}
await proxyRequest(clientReq, clientRes, url);
} catch (error) {
sendJson(clientRes, 502, {
error: {
code: "deepseek_bridge_proxy_failed",
message: "DeepSeek Responses bridge failed to proxy request",
reason: error.message
}
});
}
});
server.listen(port, "0.0.0.0", () => {
process.stdout.write(JSON.stringify({ serviceId, status: "listening", port, upstream: upstreamBaseUrl.origin }) + "\n");
});
async function sendReadiness(res) {
const upstream = await fetchUpstreamReadiness();
sendJson(res, upstream.ok ? 200 : 503, {
...healthPayload(),
status: upstream.ok ? "ready" : "degraded",
upstream: {
ok: upstream.ok,
status: upstream.status,
source: upstream.source,
payload: upstream.payload
}
});
}
async function fetchUpstreamReadiness() {
const health = await fetchUpstreamJson("/health/readiness")
.then((result) => ({ ...result, source: "/health/readiness" }))
.catch((error) => ({ ok: false, status: 502, source: "/health/readiness", payload: { error: error.message } }));
if (health.ok) return health;
const models = await fetchUpstreamJson("/v1/models")
.then((result) => ({ ...result, source: "/v1/models" }))
.catch((error) => ({ ok: false, status: 502, source: "/v1/models", payload: { error: error.message } }));
const modelCount = codexModelsFromUpstream(models.payload).length;
if (models.ok && modelCount > 0) {
return {
...models,
payload: {
modelCount,
fallbackFrom: {
source: health.source,
status: health.status
}
}
};
}
return {
...health,
payload: {
...health.payload,
modelProbe: {
ok: models.ok,
status: models.status,
modelCount
}
}
};
}
async function sendCodexModels(clientReq, clientRes, url) {
const upstream = await fetchUpstreamJson(`${url.pathname}${url.search}`, clientReq.headers).catch((error) => ({ ok: false, status: 502, payload: { error: error.message } }));
const models = codexModelsFromUpstream(upstream.payload);
sendJson(clientRes, 200, {
models: models.length > 0 ? models : [codexModel(defaultModel)],
upstream: {
ok: upstream.ok,
status: upstream.status,
source: upstream.ok ? "upstream" : "fallback"
}
});
}
async function proxyRequest(clientReq, clientRes, url) {
const startedAt = Date.now();
const originalBody = await readRequestBody(clientReq);
const { body, headers, decompressed, sanitizedToolTypes } = decodeRequestBody(originalBody, clientReq.headers, url.pathname);
const targetUrl = new URL(`${url.pathname}${url.search}`, upstreamBaseUrl);
const requestImpl = targetUrl.protocol === "https:" ? httpsRequest : httpRequest;
const upstreamReq = requestImpl({
protocol: targetUrl.protocol,
hostname: targetUrl.hostname,
port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80),
method: clientReq.method,
path: `${targetUrl.pathname}${targetUrl.search}`,
headers
}, (upstreamRes) => {
const responseHeaders = filterResponseHeaders(upstreamRes.headers);
clientRes.writeHead(upstreamRes.statusCode || 502, responseHeaders);
upstreamRes.pipe(clientRes);
upstreamRes.on("end", () => {
process.stderr.write(JSON.stringify({
serviceId,
method: clientReq.method,
path: url.pathname,
status: upstreamRes.statusCode || null,
decompressed,
sanitizedToolTypes,
elapsedMs: Date.now() - startedAt
}) + "\n");
});
});
upstreamReq.on("error", (error) => {
if (!clientRes.headersSent) {
sendJson(clientRes, 502, {
error: {
code: "deepseek_bridge_upstream_error",
message: "DeepSeek bridge upstream request failed",
reason: error.message
}
});
} else {
clientRes.end();
}
});
upstreamReq.end(body);
}
async function proxyResponsesRequest(clientReq, clientRes, url) {
const startedAt = Date.now();
const originalBody = await readRequestBody(clientReq);
const { body, headers, decompressed, sanitizedToolTypes } = decodeRequestBody(originalBody, clientReq.headers, url.pathname);
await proxyPreparedBody({
clientReq,
clientRes,
url,
body,
headers,
startedAt,
logExtra: { decompressed, sanitizedToolTypes }
});
}
async function proxyPreparedBody({ clientReq, clientRes, url, body, headers, startedAt, logExtra = {} }) {
const targetUrl = new URL(`${url.pathname}${url.search}`, upstreamBaseUrl);
const requestImpl = targetUrl.protocol === "https:" ? httpsRequest : httpRequest;
const upstreamReq = requestImpl({
protocol: targetUrl.protocol,
hostname: targetUrl.hostname,
port: targetUrl.port || (targetUrl.protocol === "https:" ? 443 : 80),
method: clientReq.method,
path: `${targetUrl.pathname}${targetUrl.search}`,
headers
}, (upstreamRes) => {
const responseHeaders = filterResponseHeaders(upstreamRes.headers);
clientRes.writeHead(upstreamRes.statusCode || 502, responseHeaders);
upstreamRes.pipe(clientRes);
upstreamRes.on("end", () => {
process.stderr.write(JSON.stringify({
serviceId,
method: clientReq.method,
path: url.pathname,
status: upstreamRes.statusCode || null,
elapsedMs: Date.now() - startedAt,
...logExtra
}) + "\n");
});
});
upstreamReq.on("error", (error) => {
if (!clientRes.headersSent) {
sendJson(clientRes, 502, {
error: {
code: "deepseek_bridge_upstream_error",
message: "DeepSeek bridge upstream request failed",
reason: error.message
}
});
} else {
clientRes.end();
}
});
upstreamReq.end(body);
}
function decodeRequestBody(body, headers, pathname = "") {
const encoding = String(headers["content-encoding"] || "").trim().toLowerCase();
const decoded = encoding === "zstd" ? Buffer.from(decompress(new Uint8Array(body))) : body;
const sanitized = sanitizeResponsesBody(decoded, headers, pathname);
const forwarded = filterRequestHeaders(headers);
if (encoding === "zstd") delete forwarded["content-encoding"];
forwarded["content-length"] = String(sanitized.body.length);
forwarded.host = upstreamBaseUrl.host;
return { body: sanitized.body, headers: forwarded, decompressed: encoding === "zstd", sanitizedToolTypes: sanitized.droppedToolTypes };
}
function sanitizeResponsesBody(body, headers, pathname) {
const contentType = String(headers["content-type"] || "").toLowerCase();
if (pathname !== "/v1/responses" || !contentType.includes("application/json")) {
return { body, droppedToolTypes: [] };
}
let payload = null;
try {
payload = JSON.parse(body.toString("utf8"));
} catch {
return { body, droppedToolTypes: [] };
}
if (!payload || typeof payload !== "object" || !Array.isArray(payload.tools)) {
return { body, droppedToolTypes: [] };
}
const keptTools = [];
const droppedToolTypes = [];
for (const tool of payload.tools) {
const type = String(tool?.type || "").trim();
if (type === "function") {
keptTools.push(tool);
} else {
droppedToolTypes.push(type || "unknown");
}
}
if (droppedToolTypes.length === 0) return { body, droppedToolTypes: [] };
const sanitized = { ...payload, tools: keptTools };
return { body: Buffer.from(JSON.stringify(sanitized), "utf8"), droppedToolTypes };
}
async function readRequestBody(req) {
const chunks = [];
let size = 0;
for await (const chunk of req) {
size += chunk.length;
if (size > maxBodyBytes) throw new Error(`request body exceeds ${maxBodyBytes} bytes`);
chunks.push(chunk);
}
return Buffer.concat(chunks);
}
async function fetchUpstreamJson(pathAndSearch, headers = {}) {
const targetUrl = new URL(pathAndSearch, upstreamBaseUrl);
const response = await fetch(targetUrl, {
headers: {
accept: "application/json",
...filterRequestHeaders(headers, { keepContentHeaders: false }),
host: upstreamBaseUrl.host
}
});
const text = await response.text();
let payload = null;
try {
payload = text ? JSON.parse(text) : null;
} catch {
payload = { text };
}
return { ok: response.ok, status: response.status, payload };
}
function codexModelsFromUpstream(payload) {
if (payload && typeof payload === "object" && Array.isArray(payload.models)) {
return payload.models.map(normalizeCodexModel).filter(Boolean);
}
if (payload && typeof payload === "object" && Array.isArray(payload.data)) {
return payload.data
.map((item) => String(item?.id || item?.model_name || "").trim())
.filter(Boolean)
.map(codexModel);
}
return [];
}
function normalizeCodexModel(model) {
const slug = String(model?.slug || model?.id || "").trim();
return slug ? { ...codexModel(slug), ...model, slug } : null;
}
function codexModel(slug) {
return {
slug,
display_name: slug,
description: `${slug} via HWLAB DeepSeek bridge`,
default_reasoning_level: null,
supported_reasoning_levels: [],
shell_type: "shell_command",
visibility: "list",
supported_in_api: true,
priority: 0
};
}
function filterRequestHeaders(headers, options = {}) {
const keepContentHeaders = options.keepContentHeaders !== false;
const result = {};
for (const [name, value] of Object.entries(headers)) {
const lower = name.toLowerCase();
if (hopByHopHeaders.has(lower)) continue;
if (lower === "host") continue;
if (!keepContentHeaders && (lower === "content-length" || lower === "content-type" || lower === "content-encoding")) continue;
result[lower] = value;
}
return result;
}
function filterResponseHeaders(headers) {
const result = {};
for (const [name, value] of Object.entries(headers)) {
if (!hopByHopHeaders.has(name.toLowerCase())) result[name] = value;
}
return result;
}
function healthPayload() {
return {
serviceId,
status: "ok",
upstream: upstreamBaseUrl.origin,
model: defaultModel,
zstdRequestBody: "decode",
responsesTools: "drop-non-function"
};
}
function sendJson(res, statusCode, payload) {
const body = JSON.stringify(payload, null, 2);
res.writeHead(statusCode, {
"content-type": "application/json; charset=utf-8",
"content-length": Buffer.byteLength(body)
});
res.end(body);
}
function parsePositiveInteger(value, fallback) {
const parsed = Number(value);
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
}
-285
View File
@@ -1,285 +0,0 @@
#!/usr/bin/env node
import http, { request as httpRequest } from "node:http";
import https, { request as httpsRequest } from "node:https";
import { randomBytes } from "node:crypto";
import {
healthPayload,
resolveHostPort,
} from "../../internal/dev-entrypoint/http.mjs";
const serviceId = "hwlab-edge-proxy";
const upstream = process.env.HWLAB_EDGE_UPSTREAM || "http://hwlab-cloud-api.hwlab-dev.svc.cluster.local:6667";
const proxyTimeoutMs = parseTimeout(process.env.HWLAB_EDGE_PROXY_TIMEOUT_MS, 1260000, {
min: 1000,
max: 2400000
});
const idleTimeoutSeconds = parseTimeout(process.env.HWLAB_EDGE_IDLE_TIMEOUT_SECONDS, 120, {
min: 1,
max: 255
});
const { host, port } = resolveHostPort({
listenEnv: "HWLAB_EDGE_LISTEN",
hostEnv: "HWLAB_EDGE_HOST",
portEnv: "HWLAB_EDGE_PORT",
fallbackPort: 6667
});
const server = http.createServer(handleHttpRequest);
server.on("upgrade", handleUpgrade);
server.keepAliveTimeout = idleTimeoutSeconds * 1000;
server.headersTimeout = Math.max(60000, server.keepAliveTimeout + 5000);
server.requestTimeout = 0;
server.listen(port, host, () => {
process.stdout.write(`${JSON.stringify({ serviceId, status: "listening", host, port })}\n`);
});
for (const signal of ["SIGINT", "SIGTERM"]) {
process.on(signal, () => {
server.close(() => process.exit(0));
setTimeout(() => process.exit(0), 5000).unref();
});
}
function handleHttpRequest(request, response) {
const url = incomingUrl(request);
if (request.method === "GET" && url.pathname === "/health/live") {
proxyHttpRequest(request, response, upstream, proxyTimeoutMs);
return;
}
if (request.method === "GET" && (url.pathname === "/health" || url.pathname === "/edge/health")) {
writeJson(response, healthPayload({ serviceId, role: "public-dev-ingress", details: proxyDetails() }));
return;
}
if (request.method === "GET" && (url.pathname === "/status" || url.pathname === "/routes")) {
writeJson(response, {
serviceId,
environment: "dev",
status: "ok",
upstream,
routes: [{ pathPrefix: "/", upstream, mode: "http-proxy" }]
});
return;
}
if (request.method === "GET" && url.pathname === "/help") {
writeJson(response, { serviceId, commands: ["GET /health", "GET /edge/health", "GET /health/live", "GET /status", "GET /routes"] });
return;
}
if (isInternalRoute(url.pathname)) {
writeJson(response, { error: { code: "not_found", message: "Internal HWLAB routes are not exposed through the public edge proxy." } }, 404);
return;
}
proxyHttpRequest(request, response, upstream, proxyTimeoutMs);
}
function handleUpgrade(request, socket, head) {
const url = incomingUrl(request);
if (isInternalRoute(url.pathname)) {
socket.end("HTTP/1.1 404 Not Found\r\ncontent-type: text/plain; charset=utf-8\r\nconnection: close\r\n\r\nnot found");
return;
}
const target = new URL(url.pathname + url.search, upstream);
const transport = target.protocol === "https:" ? httpsRequest : httpRequest;
const edgeTraceId = newTraceId();
let timedOut = false;
const upstreamRequest = transport(target, {
method: request.method || "GET",
headers: websocketRequestHeaders(request.headers, target)
});
const timeout = setTimeout(() => {
timedOut = true;
upstreamRequest.destroy(new Error(`upstream websocket timed out after ${proxyTimeoutMs}ms`));
}, proxyTimeoutMs);
const finish = () => clearTimeout(timeout);
upstreamRequest.on("upgrade", (upstreamResponse, upstreamSocket, upstreamHead) => {
finish();
logProxyEvent("ws.upstream_open", { edgeTraceId, path: url.pathname, upstreamUrl: redactUrlToken(target.toString()), statusCode: upstreamResponse.statusCode ?? 101 });
socket.write(formatUpgradeResponse(upstreamResponse));
if (upstreamHead?.length) socket.write(upstreamHead);
if (head?.length) upstreamSocket.write(head);
upstreamSocket.on("error", (error) => logProxyEvent("ws.upstream_socket_error", { edgeTraceId, path: url.pathname, message: error.message }));
socket.on("error", (error) => logProxyEvent("ws.client_socket_error", { edgeTraceId, path: url.pathname, message: error.message }));
upstreamSocket.pipe(socket);
socket.pipe(upstreamSocket);
});
upstreamRequest.on("response", (upstreamResponse) => {
finish();
socket.write(formatHttpResponse(upstreamResponse));
upstreamResponse.pipe(socket);
});
upstreamRequest.on("error", (error) => {
finish();
logProxyEvent("ws.upstream_error", { edgeTraceId, path: url.pathname, timedOut, message: error.message });
socket.end("HTTP/1.1 502 Bad Gateway\r\ncontent-type: application/json; charset=utf-8\r\nconnection: close\r\n\r\n" + JSON.stringify(proxyFailurePayload({ timedOut, timeoutMs: proxyTimeoutMs, upstreamUrl: upstream, edgeTraceId })) + "\n");
});
socket.on("error", () => upstreamRequest.destroy());
upstreamRequest.end();
}
function proxyHttpRequest(request, response, upstreamUrl, timeoutMs) {
const target = new URL(incomingUrl(request).pathname + incomingUrl(request).search, upstreamUrl);
const transport = target.protocol === "https:" ? httpsRequest : httpRequest;
const edgeTraceId = newTraceId();
let timedOut = false;
let upstreamResponded = false;
const upstreamRequest = transport(target, {
method: request.method || "GET",
headers: nodeRequestHeaders(request.headers, target)
}, (upstreamResponse) => {
upstreamResponded = true;
clearTimeout(timeout);
response.writeHead(upstreamResponse.statusCode ?? 502, responseHeadersFromNode(upstreamResponse.headers));
upstreamResponse.on("error", (error) => response.destroy(error));
upstreamResponse.pipe(response);
});
const timeout = setTimeout(() => {
timedOut = true;
upstreamRequest.destroy(new Error(`upstream timed out after ${timeoutMs}ms`));
}, timeoutMs);
upstreamRequest.on("error", (error) => {
clearTimeout(timeout);
logProxyEvent("http.upstream_error", { edgeTraceId, path: incomingUrl(request).pathname, timedOut, upstreamResponded, message: error.message });
if (response.headersSent) {
response.destroy(error);
return;
}
writeJson(response, proxyFailurePayload({ timedOut, timeoutMs, upstreamUrl, edgeTraceId }), 502);
});
request.on("aborted", () => upstreamRequest.destroy(new Error("client request aborted")));
request.on("error", (error) => upstreamRequest.destroy(error));
request.pipe(upstreamRequest);
}
function proxyDetails() {
return {
upstream,
timeoutMs: proxyTimeoutMs,
idleTimeoutSeconds,
mode: "dev-edge-proxy"
};
}
function parseTimeout(value, fallback, { min, max }) {
const parsed = Number.parseInt(value || "", 10);
if (!Number.isInteger(parsed)) return fallback;
return Math.min(Math.max(parsed, min), max);
}
function incomingUrl(request) {
const authority = request.headers.host || `${host}:${port}`;
return new URL(request.url || "/", `http://${authority}`);
}
function nodeRequestHeaders(headers, target) {
const next = {};
for (const [key, value] of Object.entries(headers)) {
if (value === undefined || isHopByHopHeader(key)) continue;
next[key] = value;
}
next.host = target.host;
return next;
}
function websocketRequestHeaders(headers, target) {
const next = {};
for (const [key, value] of Object.entries(headers)) {
if (value === undefined || key.toLowerCase() === "host") continue;
next[key] = value;
}
next.host = target.host;
return next;
}
function responseHeadersFromNode(headers) {
const next = {};
for (const [key, value] of Object.entries(headers)) {
if (value === undefined || isHopByHopHeader(key)) continue;
next[key] = value;
}
next["cache-control"] ??= "no-store";
return next;
}
function formatUpgradeResponse(response) {
return formatStatusAndHeaders(response.statusCode ?? 101, response.statusMessage || "Switching Protocols", response.rawHeaders);
}
function formatHttpResponse(response) {
return formatStatusAndHeaders(response.statusCode ?? 502, response.statusMessage || http.STATUS_CODES[response.statusCode ?? 502] || "Bad Gateway", response.rawHeaders);
}
function formatStatusAndHeaders(statusCode, statusMessage, rawHeaders) {
const lines = [`HTTP/1.1 ${statusCode} ${statusMessage}`];
for (let index = 0; index < rawHeaders.length; index += 2) {
lines.push(`${rawHeaders[index]}: ${rawHeaders[index + 1]}`);
}
lines.push("", "");
return lines.join("\r\n");
}
function isHopByHopHeader(key) {
return ["connection", "keep-alive", "proxy-authenticate", "proxy-authorization", "te", "trailer", "transfer-encoding", "upgrade"].includes(key.toLowerCase());
}
function isInternalRoute(pathname) {
return pathname === "/v1/internal" || pathname.startsWith("/v1/internal/");
}
function proxyFailurePayload({ timedOut, timeoutMs, upstreamUrl, edgeTraceId }) {
const code = timedOut ? "proxy_timeout" : "upstream_unavailable";
const userMessage = timedOut
? `Workbench 后端请求超过 ${timeoutMs}ms 未返回;请求已保留,可稍后重试。`
: "Workbench 后端暂时不可用;请求已保留,可稍后重试。";
return {
status: "failed",
error: {
code,
layer: "edge-proxy",
category: timedOut ? "timeout" : "proxy",
retryable: true,
userMessage,
message: userMessage,
diagnostic: {
contractVersion: "hwlab-error-diagnostic-v1",
traceId: edgeTraceId,
serviceId,
layer: "edge-proxy",
category: timedOut ? "timeout" : "proxy",
code,
httpStatus: 502,
source: "edge-proxy",
observedAt: new Date().toISOString(),
valuesPrinted: false
},
blocker: { code, layer: "edge-proxy", retryable: true, summary: userMessage }
},
upstream: upstreamUrl,
message: userMessage
};
}
function writeJson(response, body, status = 200) {
response.writeHead(status, { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" });
response.end(`${JSON.stringify(body, null, 2)}\n`);
}
function newTraceId() {
return randomBytes(16).toString("hex");
}
function logProxyEvent(event, fields) {
process.stderr.write(`${JSON.stringify({ event: `hwlab-edge-proxy.${event}`, observedAt: new Date().toISOString(), valuesPrinted: false, ...fields })}\n`);
}
function redactUrlToken(urlValue) {
const parsed = new URL(urlValue);
if (parsed.searchParams.has("token")) parsed.searchParams.set("token", "<redacted>");
return parsed.toString();
}
-214
View File
@@ -1,214 +0,0 @@
import assert from "node:assert/strict";
import { spawn } from "node:child_process";
import { createServer } from "node:http";
import test from "node:test";
const nodeCommand = process.env.HWLAB_TEST_NODE_COMMAND || process.env.HWLAB_NODE_COMMAND || "node";
test("edge proxy reports local health and proxies live health to upstream", async () => {
const upstream = await startUpstream();
const proxy = await startEdgeProxy(upstream.port);
try {
const health = await fetchJson(`http://127.0.0.1:${proxy.port}/health`);
assert.equal(health.serviceId, "hwlab-edge-proxy");
assert.equal(health.status, "ok");
assert.equal(health.service.role, "public-dev-ingress");
assert.equal(health.details.upstream, `http://127.0.0.1:${upstream.port}`);
assert.equal(health.details.idleTimeoutSeconds, 120);
assert.equal(health.details.mode, "dev-edge-proxy");
const routes = await fetchJson(`http://127.0.0.1:${proxy.port}/routes`);
assert.equal(routes.serviceId, "hwlab-edge-proxy");
assert.deepEqual(routes.routes, [{
pathPrefix: "/",
upstream: `http://127.0.0.1:${upstream.port}`,
mode: "http-proxy"
}]);
const live = await fetchJson(`http://127.0.0.1:${proxy.port}/health/live`);
assert.equal(live.serviceId, "hwlab-cloud-api");
assert.equal(live.environment, "v02");
assert.equal(upstream.captured.method, "GET");
assert.equal(upstream.captured.url, "/health/live");
} finally {
await proxy.stop();
await upstream.stop();
}
});
test("edge proxy proxies upstream port 6667 without using fetch bad-port handling", async () => {
const upstream = await startUpstream(6667);
const proxy = await startEdgeProxy(upstream.port);
try {
const live = await fetchJson(`http://127.0.0.1:${proxy.port}/health/live`);
assert.equal(live.serviceId, "hwlab-cloud-api");
assert.equal(upstream.captured.url, "/health/live");
} finally {
await proxy.stop();
await upstream.stop();
}
});
test("edge proxy tunnels websocket upgrade to upstream", async () => {
const upstream = await startWebSocketUpstream();
const proxy = await startEdgeProxy(upstream.port);
try {
const observed = await openWebSocket(`ws://127.0.0.1:${proxy.port}/v1/hwpod-node/ws`, () => ({ proxyStderr: proxy.stderr, upstreamEvents: upstream.events }));
assert.equal(observed.type, "welcome");
assert.equal(observed.path, "/v1/hwpod-node/ws");
} finally {
await proxy.stop();
await upstream.stop();
}
});
async function startUpstream(port = 0) {
let captured = null;
const server = createServer(async (request, response) => {
const chunks = [];
for await (const chunk of request) chunks.push(chunk);
captured = {
method: request.method,
url: request.url,
body: Buffer.concat(chunks).toString("utf8")
};
response.writeHead(200, { "content-type": "application/json" });
response.end(JSON.stringify({
serviceId: "hwlab-cloud-api",
environment: "v02",
status: "live"
}));
});
await new Promise((resolve) => server.listen(port, "127.0.0.1", resolve));
return {
port: server.address().port,
get captured() {
return captured;
},
stop: () => new Promise((resolve) => server.close(resolve))
};
}
async function startWebSocketUpstream() {
const events = [];
const server = Bun.serve({
hostname: "127.0.0.1",
port: 0,
fetch(request, bunServer) {
const url = new URL(request.url);
events.push({ event: "upgrade", url: url.pathname });
const upgraded = bunServer.upgrade(request, { data: { path: url.pathname } });
return upgraded ? undefined : new Response("upgrade required", { status: 426 });
},
websocket: {
open(socket) {
setTimeout(() => {
socket.send(JSON.stringify({ type: "welcome", path: socket.data.path }));
}, 50);
}
}
});
return {
port: server.port,
events,
stop: () => server.stop(true)
};
}
async function openWebSocket(url, debug = () => ({})) {
return await new Promise((resolve, reject) => {
const socket = new WebSocket(url);
let finished = false;
const done = (error, value) => {
if (finished) return;
finished = true;
clearTimeout(timer);
try { socket.close(); } catch {}
if (error) reject(error);
else resolve(value);
};
const timer = setTimeout(() => done(new Error(`websocket did not receive message: ${url}; debug=${JSON.stringify(debug())}`)), 2500);
socket.addEventListener("message", (event) => {
dataToText(event.data)
.then((text) => done(null, JSON.parse(text)))
.catch((error) => done(error));
});
socket.addEventListener("error", () => done(new Error(`websocket error: ${url}`)));
socket.addEventListener("close", (event) => done(new Error(`websocket closed before message: code=${event.code} reason=${event.reason || ""}`)));
});
}
async function dataToText(data) {
if (typeof data === "string") return data;
if (data instanceof ArrayBuffer) return Buffer.from(data).toString("utf8");
if (ArrayBuffer.isView(data)) return Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString("utf8");
if (data && typeof data.text === "function") return await data.text();
return String(data);
}
async function startEdgeProxy(upstreamPort) {
const port = await freePort();
let stderr = "";
const child = spawn(nodeCommand, ["cmd/hwlab-edge-proxy/main.mjs"], {
cwd: process.cwd(),
env: {
...process.env,
HWLAB_EDGE_HOST: "127.0.0.1",
HWLAB_EDGE_PORT: String(port),
HWLAB_EDGE_UPSTREAM: `http://127.0.0.1:${upstreamPort}`
},
stdio: ["ignore", "pipe", "pipe"]
});
child.stderr.on("data", (chunk) => {
stderr += chunk;
});
await waitForListening(child, "edge proxy");
return {
port,
get stderr() {
return stderr;
},
stop: () => stopChild(child)
};
}
async function fetchJson(url, options = {}) {
const response = await fetch(url, options);
assert.equal(response.ok, true, `${url} returned ${response.status}`);
return response.json();
}
async function freePort() {
const server = createServer();
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
const port = server.address().port;
await new Promise((resolve) => server.close(resolve));
return port;
}
async function waitForListening(child, label) {
let stderr = "";
child.stderr.on("data", (chunk) => {
stderr += chunk;
});
await new Promise((resolve, reject) => {
const timer = setTimeout(() => reject(new Error(`${label} did not start: ${stderr}`)), 5000);
child.stdout.on("data", (chunk) => {
if (chunk.toString().includes("listening")) {
clearTimeout(timer);
resolve();
}
});
child.on("exit", (code) => {
clearTimeout(timer);
reject(new Error(`${label} exited early code=${code}: ${stderr}`));
});
});
}
async function stopChild(child) {
if (child.exitCode !== null) return;
child.kill("SIGTERM");
await new Promise((resolve) => child.once("exit", resolve));
}
-388
View File
@@ -1,388 +0,0 @@
#!/usr/bin/env node
import { createAuditEvent, createEvidenceRecord, operationContext } from "../../internal/sim/l2-runtime.mjs";
import {
createGatewayState,
createHealth,
resourceIdForBox,
selectInstanceValue
} from "../../internal/sim/model.mjs";
import { fetchJson, createJsonServer, listen, parsePort, readJson } from "../../internal/sim/http.mjs";
import { createRpcErrorBody, ERROR_CODES } from "../../internal/protocol/index.mjs";
const gatewayId = selectInstanceValue(process.env.HWLAB_GATEWAY_ID, "gateway-a", {
requireIndexForMultiple: true,
label: "HWLAB_GATEWAY_ID"
});
const port = parsePort(process.env.PORT, 7101);
const endpoint = `http://127.0.0.1:${port}`;
const boxUrls = parseBoxUrls(process.env.HWLAB_BOX_URLS);
const boxes = parseBoxes({
resources: process.env.HWLAB_BOX_RESOURCES,
ids: process.env.HWLAB_BOX_IDS,
urls: boxUrls,
instanceScoped: parseList(process.env.HWLAB_GATEWAY_ID).length > 1
});
const state = createGatewayState({
gatewayId,
endpoint,
boxes: boxes.map((box) => box.resourceId)
});
state.registry = {
gatewayId,
gatewaySessionId: state.session.gatewaySessionId,
endpoint,
boxes
};
state.lastHeartbeatAt = state.session.lastSeenAt;
const routes = new Map();
routes.set("GET /health/live", () =>
({
...createHealth({ serviceId: "hwlab-gateway-simu", name: gatewayId }),
gatewayId,
gatewaySessionId: state.session.gatewaySessionId
})
);
routes.set("GET /status", () => state);
routes.set("GET /boxes", () => ({
gatewayId,
gatewaySessionId: state.session.gatewaySessionId,
boxes: state.registry.boxes
}));
routes.set("POST /register", async ({ req }) => {
const body = await readJson(req);
const now = new Date().toISOString();
const registered = normalizeBoxRegistration(body);
upsertBox(registered);
state.boxes = state.registry.boxes.map((box) => box.resourceId);
state.updatedAt = now;
state.session.lastSeenAt = now;
return {
accepted: true,
serviceId: "hwlab-gateway-simu",
gatewayId,
gatewaySessionId: state.session.gatewaySessionId,
registered,
registry: state.registry
};
});
routes.set("POST /heartbeat", async ({ req }) => {
const body = await readJson(req);
const now = new Date().toISOString();
state.lastHeartbeatAt = now;
state.session.lastSeenAt = now;
state.updatedAt = now;
return {
accepted: true,
serviceId: "hwlab-gateway-simu",
gatewayId,
gatewaySessionId: state.session.gatewaySessionId,
heartbeat: {
observedAt: now,
boxCount: state.registry.boxes.length,
reportedBy: body.reportedBy ?? gatewayId
}
};
});
routes.set("GET /capabilities", async () => capabilityReport());
routes.set("POST /capabilities/report", async () => capabilityReport());
routes.set("POST /invoke", async ({ req }) => {
const body = await readJson(req);
return invokeBox(body);
});
function rpcHttpError(statusCode, { code, message, data = {} }) {
return Object.assign(new Error(message), {
statusCode,
body: createRpcErrorBody({
code,
message,
data
})
});
}
function parseBoxUrls(value) {
return String(value ?? "")
.split(",")
.map((item) => item.trim())
.filter(Boolean);
}
function parseList(value) {
return String(value ?? "")
.split(",")
.map((item) => item.trim())
.filter(Boolean);
}
function parseBoxes({ resources, ids, urls, instanceScoped = false }) {
const explicitResources = instanceScoped ? selectScopedList(resources, "HWLAB_BOX_RESOURCES") : parseList(resources);
const explicitIds = instanceScoped ? selectScopedList(ids, "HWLAB_BOX_IDS") : parseList(ids);
const explicitUrls = instanceScoped ? selectScopedList(urls.join(","), "HWLAB_BOX_URLS") : urls;
const count = Math.max(explicitResources.length, explicitIds.length, explicitUrls.length, 1);
const parsed = [];
for (let index = 0; index < count; index += 1) {
const boxId =
explicitIds[index] ??
explicitResources[index]?.replace(/^res_/, "") ??
(count === 1 ? "boxsim_alpha" : `box-${index + 1}`);
const resourceId = explicitResources[index] ?? resourceIdForBox(boxId);
parsed.push({
boxId,
resourceId,
url: explicitUrls[index] ?? null,
state: "registered"
});
}
return parsed;
}
function selectScopedList(value, label = "scoped list") {
const items = parseList(value);
if (items.length <= 1) {
return items;
}
const selected = selectInstanceValue(items.join(","), "", {
requireIndexForMultiple: true,
label
});
return selected ? [selected] : [];
}
function normalizeBoxRegistration(body) {
const boxId = body.boxId ?? body.identity?.boxId;
const resourceId = body.resourceId ?? body.resource?.resourceId ?? (boxId ? resourceIdForBox(boxId) : null);
if (!boxId || !resourceId) {
throw rpcHttpError(400, {
code: ERROR_CODES.invalidParams,
message: "register requires boxId or resourceId",
data: {
reason: "identity_required"
}
});
}
return {
boxId,
resourceId,
url: body.url ?? body.endpoint ?? null,
state: "registered",
capabilities: Array.isArray(body.capabilities) ? body.capabilities : undefined,
registeredAt: new Date().toISOString()
};
}
function upsertBox(box) {
const index = state.registry.boxes.findIndex((item) => item.resourceId === box.resourceId);
if (index >= 0) {
state.registry.boxes[index] = {
...state.registry.boxes[index],
...box
};
return;
}
state.registry.boxes.push(box);
}
async function capabilityReport() {
const reports = [];
for (const box of state.registry.boxes) {
if (box.url) {
try {
const response = await fetchJson(new URL("/capabilities", box.url));
if (response.ok) {
const body = response.body;
const capabilities = body?.capabilities ?? [];
upsertBox({
...box,
boxId: body?.boxId ?? box.boxId,
resourceId: body?.resourceId ?? box.resourceId,
capabilities
});
reports.push({
boxId: body?.boxId ?? box.boxId,
resourceId: body?.resourceId ?? box.resourceId,
url: box.url,
status: "available",
capabilities
});
continue;
}
} catch (error) {
reports.push({
boxId: box.boxId,
resourceId: box.resourceId,
url: box.url,
status: "unreachable",
capabilities: box.capabilities ?? [],
error: error instanceof Error ? error.message : String(error)
});
continue;
}
}
reports.push({
boxId: box.boxId,
resourceId: box.resourceId,
url: box.url,
status: box.capabilities ? "cached" : "unreachable",
capabilities: box.capabilities ?? []
});
}
state.capabilityReport = {
serviceId: "hwlab-gateway-simu",
gatewayId,
gatewaySessionId: state.session.gatewaySessionId,
reportedAt: new Date().toISOString(),
boxes: reports
};
return state.capabilityReport;
}
function findBoxTarget(body) {
const resourceId = body.resourceId;
const boxId = body.boxId;
return state.registry.boxes.find(
(box) => (resourceId && box.resourceId === resourceId) || (boxId && box.boxId === boxId)
);
}
async function invokeBox(body) {
const box = findBoxTarget(body);
if (!box) {
throw rpcHttpError(404, {
code: ERROR_CODES.sessionNotFound,
message: "Target box is not registered with this gateway",
data: {
gatewayId,
gatewaySessionId: state.session.gatewaySessionId,
boxId: body.boxId ?? null,
resourceId: body.resourceId ?? null
}
});
}
if (!box.url) {
throw rpcHttpError(409, {
code: ERROR_CODES.operationRejected,
message: "Target box has no invoke URL",
data: {
gatewayId,
resourceId: box.resourceId,
reason: "box_url_missing"
}
});
}
const context = operationContext(body, {
serviceId: "hwlab-gateway-simu",
actorId: "svc_hwlab-gateway-simu"
});
const forwarded = {
...body,
operationId: context.operationId,
traceId: context.traceId,
actorType: "service",
actorId: "svc_hwlab-gateway-simu",
source: body.source ?? "gateway-simu"
};
const response = await fetchJson(new URL("/invoke", box.url), {
method: "POST",
body: forwarded
});
if (!response.ok) {
throw Object.assign(new Error("box invoke failed"), {
statusCode: response.status,
body:
response.body ??
createRpcErrorBody({
code: ERROR_CODES.hwlabUnknown,
message: "Box invoke failed",
data: {
status: response.status
}
})
});
}
const now = new Date().toISOString();
const audit = createAuditEvent({
serviceId: "hwlab-gateway-simu",
action: "hardware.operation.dispatched",
targetType: "box_resource",
targetId: box.resourceId,
projectId: state.projectId,
gatewaySessionId: state.session.gatewaySessionId,
operationId: context.operationId,
traceId: context.traceId,
actorType: "service",
actorId: "svc_hwlab-gateway-simu",
outcome: "succeeded",
metadata: {
gatewayId,
boxId: box.boxId,
resourceId: box.resourceId,
capabilityId: body.capabilityId ?? null,
port: body.port ?? null,
forwardedTo: box.url
},
occurredAt: now
});
const evidence = createEvidenceRecord({
serviceId: "hwlab-gateway-simu",
projectId: state.projectId,
operationId: context.operationId,
traceId: context.traceId,
kind: "trace",
payload: {
gatewayId,
boxId: box.boxId,
resourceId: box.resourceId,
result: response.body
},
metadata: {
gatewaySessionId: state.session.gatewaySessionId,
forwardedTo: box.url,
producerServiceId: "hwlab-gateway-simu"
},
createdAt: now
});
state.lastDispatch = {
operationId: context.operationId,
traceId: context.traceId,
resourceId: box.resourceId,
observedAt: now,
accepted: true
};
state.updatedAt = now;
return {
accepted: true,
serviceId: "hwlab-gateway-simu",
gatewayId,
gatewaySessionId: state.session.gatewaySessionId,
operationId: context.operationId,
traceId: context.traceId,
target: {
boxId: box.boxId,
resourceId: box.resourceId,
url: box.url
},
result: response.body,
auditId: audit.auditId,
evidenceId: evidence.evidenceId,
audit,
evidence
};
}
listen(createJsonServer({ routes }), port);
-228
View File
@@ -1,228 +0,0 @@
import assert from "node:assert/strict";
import { spawn } from "node:child_process";
import { createServer } from "node:http";
import test from "node:test";
import { setTimeout as delay } from "node:timers/promises";
const bunCommand = process.env.HWLAB_TEST_BUN_COMMAND || process.env.HWLAB_BUN_COMMAND || (process.versions.bun ? process.execPath : "bun");
test("gateway outbound transport registers session and keeps shell execution disabled by default", async () => {
const cloud = await startFakeCloud();
const gateway = await startGateway(cloud.port, {
HWLAB_GATEWAY_SESSION_ID: "gws_gateway_disabled_test",
HWLAB_GATEWAY_CMD_EXEC_ENABLED: ""
});
try {
const registration = await cloud.waitForRegistration((item) => item.gatewaySessionId === "gws_gateway_disabled_test");
assert.equal(registration.serviceId, "hwlab-gateway");
assert.equal(registration.outbound.commandExecutionEnabled, false);
const health = await fetchJson(`http://127.0.0.1:${gateway.port}/health/live`);
assert.equal(health.serviceId, "hwlab-gateway");
assert.equal(health.gatewaySessionId, "gws_gateway_disabled_test");
const status = await fetchJson(`http://127.0.0.1:${gateway.port}/status`);
assert.equal(status.outbound.commandExecutionEnabled, false);
const capabilities = await fetchJson(`http://127.0.0.1:${gateway.port}/capabilities`);
assert.equal(capabilities.capabilities[0].constraints.demoOpen, false);
cloud.enqueue(shellRequest({ id: "req_disabled_shell", traceId: "trc_disabled_shell", command: "echo should-not-run" }));
const result = await cloud.waitForResult("req_disabled_shell");
assert.equal(result.response.error.data.reason, "cmd_exec_disabled");
assert.equal(result.response.meta.environment, "v02");
assert.equal(result.gatewaySessionId, "gws_gateway_disabled_test");
} finally {
await gateway.stop();
await cloud.stop();
}
});
test("gateway outbound transport executes cloud requests without blocking poll loop", async () => {
const cloud = await startFakeCloud();
const gateway = await startGateway(cloud.port, {
HWLAB_GATEWAY_SESSION_ID: "gws_gateway_nonblocking_test",
HWLAB_GATEWAY_CMD_EXEC_ENABLED: "1",
HWLAB_GATEWAY_MAX_INFLIGHT: "2"
});
try {
await cloud.waitForRegistration((item) => item.gatewaySessionId === "gws_gateway_nonblocking_test");
cloud.enqueue(shellRequest({
id: "req_slow_shell",
traceId: "trc_slow_shell",
command: "node -e \"setTimeout(()=>console.log('slow-done'),800)\""
}));
await cloud.waitForRegistration((item) => item.outbound.inflightCount >= 1);
const quickStartedAt = Date.now();
cloud.enqueue(shellRequest({ id: "req_quick_shell", traceId: "trc_quick_shell", command: "echo quick-done" }));
const quick = await cloud.waitForResult("req_quick_shell");
const quickDurationMs = Date.now() - quickStartedAt;
const slow = await cloud.waitForResult("req_slow_shell");
assert.equal(quick.response.result.shellExecuted, true, JSON.stringify(quick.response, null, 2));
assert.equal(quick.response.result.exitCode, 0, JSON.stringify(quick.response, null, 2));
assert.equal(quick.response.meta.environment, "v02");
assert.equal(quick.response.result.environment, "v02");
assert.equal(quick.response.result.audit.environment, "v02");
assert.equal(quick.response.result.evidence.environment, "v02");
assert.match(quick.response.result.stdout, /quick-done/u);
assert.equal(slow.response.result.shellExecuted, true, JSON.stringify(slow.response, null, 2));
assert.equal(slow.response.result.exitCode, 0, JSON.stringify(slow.response, null, 2));
assert.match(slow.response.result.stdout, /slow-done/u);
assert.ok(quick.receivedAt < slow.receivedAt, "quick request should complete before the earlier slow request");
assert.ok(quickDurationMs < 700, `quick request was blocked for ${quickDurationMs}ms`);
assert.ok(cloud.registrations.some((item) => item.outbound.inflightCount >= 1));
} finally {
await gateway.stop();
await cloud.stop();
}
});
async function startGateway(cloudPort: number, env: Record<string, string>) {
const port = await freePort();
const child = spawn(bunCommand, ["run", "cmd/hwlab-gateway/main.ts"], {
cwd: process.cwd(),
env: {
...process.env,
...env,
PORT: String(port),
HWLAB_GATEWAY_ID: env.HWLAB_GATEWAY_ID || "gtw_gateway_test",
HWLAB_GATEWAY_CLOUD_URL: `http://127.0.0.1:${cloudPort}`,
HWLAB_GATEWAY_POLL_INTERVAL_MS: "20",
HWLAB_GATEWAY_CMD_TIMEOUT_MS: "3000",
HWLAB_GATEWAY_CMD_OUTPUT_LIMIT_BYTES: "4096",
NO_PROXY: mergeNoProxy(process.env.NO_PROXY, "127.0.0.1,localhost,::1"),
no_proxy: mergeNoProxy(process.env.no_proxy, "127.0.0.1,localhost,::1")
},
stdio: ["ignore", "pipe", "pipe"]
});
await waitForListening(child, "hwlab-gateway");
return {
port,
stop: () => stopChild(child)
};
}
async function startFakeCloud() {
const requests: any[] = [];
const registrations: any[] = [];
const results: any[] = [];
const server = createServer(async (request, response) => {
try {
const body = await readJson(request);
if (request.method === "POST" && request.url === "/v1/gateway/poll") {
registrations.push({ ...body, receivedAt: Date.now() });
sendJson(response, 200, { ok: true, request: requests.shift() ?? null });
return;
}
if (request.method === "POST" && request.url === "/v1/gateway/result") {
results.push({ ...body, receivedAt: Date.now() });
sendJson(response, 200, { ok: true });
return;
}
sendJson(response, 404, { error: "not_found" });
} catch (error) {
sendJson(response, 500, { error: error instanceof Error ? error.message : String(error) });
}
});
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
return {
port: (server.address() as any).port as number,
registrations,
enqueue: (rpcRequest: any) => requests.push(rpcRequest),
waitForRegistration: (predicate: (item: any) => boolean) => waitFor(() => registrations.find(predicate), "gateway registration"),
waitForResult: (id: string) => waitFor(() => results.find((item) => item.response?.id === id), `gateway result ${id}`),
stop: () => new Promise<void>((resolve, reject) => server.close((error) => error ? reject(error) : resolve()))
};
}
function shellRequest({ id, traceId, command }: { id: string; traceId: string; command: string }) {
return {
jsonrpc: "2.0",
id,
method: "hardware.invoke.shell",
params: {
projectId: "prj_v02_hwpod",
gatewaySessionId: "gws_gateway_test",
resourceId: "res_d601_windows_host",
capabilityId: "cap_d601_windows_cmd_exec",
operationId: `op_${id}`,
input: { command, cwd: process.cwd(), timeoutMs: 3000 }
},
meta: { traceId, actorId: "svc_hwpod-node", serviceId: "hwlab-cloud-api", environment: "v02" }
};
}
async function waitFor<T>(read: () => T | undefined, label: string, timeoutMs = 5000): Promise<T> {
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
const value = read();
if (value) return value;
await delay(20);
}
throw new Error(`timed out waiting for ${label}`);
}
async function fetchJson(url: string) {
const response = await fetch(url, { headers: { accept: "application/json" } });
assert.equal(response.ok, true, `${url} returned ${response.status}`);
return response.json();
}
function readJson(request: any) {
return new Promise<any>((resolve, reject) => {
const chunks: Buffer[] = [];
request.on("data", (chunk: Buffer) => chunks.push(Buffer.from(chunk)));
request.on("end", () => {
const text = Buffer.concat(chunks).toString("utf8").trim();
resolve(text ? JSON.parse(text) : {});
});
request.on("error", reject);
});
}
function sendJson(response: any, statusCode: number, body: any) {
const payload = JSON.stringify(body);
response.writeHead(statusCode, { "content-type": "application/json", "content-length": Buffer.byteLength(payload) });
response.end(payload);
}
async function freePort() {
const server = createServer();
await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
const port = (server.address() as any).port as number;
await new Promise<void>((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
return port;
}
async function waitForListening(child: any, label: string) {
let stderr = "";
child.stderr.on("data", (chunk: Buffer) => { stderr += chunk.toString("utf8"); });
await new Promise<void>((resolve, reject) => {
const timer = setTimeout(() => reject(new Error(`${label} did not start: ${stderr}`)), 5000);
child.stdout.on("data", (chunk: Buffer) => {
if (chunk.toString("utf8").includes("listening")) {
clearTimeout(timer);
resolve();
}
});
child.on("exit", (code: number) => {
clearTimeout(timer);
reject(new Error(`${label} exited early code=${code}: ${stderr}`));
});
});
}
async function stopChild(child: any) {
if (child.exitCode !== null || child.signalCode !== null) return;
child.kill("SIGTERM");
await Promise.race([
new Promise<void>((resolve) => child.on("exit", () => resolve())),
delay(1000).then(() => child.kill("SIGKILL"))
]);
}
function mergeNoProxy(...values: Array<string | undefined>) {
return [...new Set(values.flatMap((value) => String(value ?? "").split(",").map((item) => item.trim()).filter(Boolean)))].join(",");
}
-587
View File
@@ -1,587 +0,0 @@
#!/usr/bin/env bun
import os from "node:os";
import { spawn } from "node:child_process";
import { createAuditEvent, createEvidenceRecord, operationContext } from "../../internal/sim/l2-runtime.mjs";
import { createGatewayState, createHealth } from "../../internal/sim/model.mjs";
import { createJsonServer, fetchJson, listen, parsePort } from "../../internal/sim/http.mjs";
import { ENVIRONMENT_DEV, ERROR_CODES, JSON_RPC_VERSION, createRpcErrorBody, isProtocolEnvironment } from "../../internal/protocol/index.mjs";
const gatewayId = process.env.HWLAB_GATEWAY_ID ?? "gateway_dev_stub";
const gatewaySessionId = process.env.HWLAB_GATEWAY_SESSION_ID ?? `gws_${gatewayId}`;
const port = parsePort(process.env.PORT, 7001);
const cloudUrl = trimUrl(process.env.HWLAB_GATEWAY_CLOUD_URL);
const pollIntervalMs = parsePositiveInteger(process.env.HWLAB_GATEWAY_POLL_INTERVAL_MS, 500);
const commandTimeoutMs = parsePositiveInteger(process.env.HWLAB_GATEWAY_CMD_TIMEOUT_MS, 120000);
const outputLimitBytes = parsePositiveInteger(process.env.HWLAB_GATEWAY_CMD_OUTPUT_LIMIT_BYTES, 65536);
const maxInflightRequests = parsePositiveInteger(process.env.HWLAB_GATEWAY_MAX_INFLIGHT, 3);
// CI probe: touches only the hwlab-gateway code identity for env reuse validation round 2.
const gatewayEnvironment = normalizeEnvironment(process.env.HWLAB_ENVIRONMENT || process.env.HWLAB_GITOPS_PROFILE || ENVIRONMENT_DEV);
const resourceId = process.env.HWLAB_GATEWAY_RESOURCE_ID ?? "res_windows_host";
const boxId = process.env.HWLAB_GATEWAY_BOX_ID ?? "box_windows_host";
const commandExecutionEnabled = truthy(process.env.HWLAB_GATEWAY_CMD_EXEC_ENABLED) || truthy(process.env.HWLAB_GATEWAY_DEMO_OPEN);
const inflightRequests = new Map();
const state = createGatewayState({
gatewayId,
serviceId: "hwlab-gateway",
endpoint: process.env.HWLAB_GATEWAY_ENDPOINT ?? `http://127.0.0.1:${port}`,
boxes: [resourceId]
});
state.session.gatewaySessionId = gatewaySessionId;
state.session.status = "connected";
state.registry = {
gatewayId,
gatewaySessionId,
resourceId,
boxId,
capabilities: shellCapabilities()
};
state.outbound = {
enabled: Boolean(cloudUrl),
cloudUrl,
pollIntervalMs,
commandExecutionEnabled,
maxInflightRequests,
inflightCount: 0,
inflightRequests: [],
lastPollAt: null,
lastPollError: null,
lastResultAt: null,
lastResultError: null,
lastBusyAt: null
};
const routes = new Map();
routes.set("GET /health/live", () => ({
...createHealth({ serviceId: "hwlab-gateway", name: gatewayId }),
gatewayId,
gatewaySessionId,
outboundConnected: Boolean(state.outbound.lastPollAt && !state.outbound.lastPollError)
}));
routes.set("GET /status", () => ({
...state,
note: "Outbound poll demo gateway; cloud dispatches through a gateway-initiated connection."
}));
routes.set("GET /capabilities", () => ({
serviceId: "hwlab-gateway",
gatewayId,
gatewaySessionId,
resourceId,
boxId,
capabilities: shellCapabilities()
}));
listen(createJsonServer({ routes }), port);
if (cloudUrl) {
ensureNoProxyForLocalCloud(cloudUrl);
schedulePoll(0);
}
function schedulePoll(delayMs = pollIntervalMs) {
setTimeout(async () => {
await pollCloudOnce();
schedulePoll();
}, delayMs).unref?.();
}
async function pollCloudOnce() {
try {
const response = await fetchJson(new URL("/v1/gateway/poll", ensureTrailingSlash(cloudUrl)), {
method: "POST",
body: registrationPayload()
});
if (!response.ok) {
throw new Error(`cloud poll failed: HTTP ${response.status}`);
}
state.outbound.lastPollAt = new Date().toISOString();
state.outbound.lastPollError = null;
state.session.lastSeenAt = state.outbound.lastPollAt;
if (response.body?.request) {
startCloudRequest(response.body.request);
}
} catch (error) {
state.outbound.lastPollError = error instanceof Error ? error.message : String(error);
}
}
function startCloudRequest(request) {
const requestId = String(request?.id ?? `req_gateway_${Date.now()}`);
if (inflightRequests.size >= maxInflightRequests) {
state.outbound.lastBusyAt = new Date().toISOString();
postGatewayBusyResult({
...request,
id: requestId
}).catch((error) => {
state.outbound.lastResultError = error instanceof Error ? error.message : String(error);
});
return;
}
const startedAt = new Date().toISOString();
inflightRequests.set(requestId, {
requestId,
method: request?.method ?? null,
operationId: request?.params?.operationId ?? null,
traceId: request?.meta?.traceId ?? null,
startedAt
});
refreshInflightState();
Promise.resolve()
.then(() => handleCloudRequest({
...request,
id: requestId
}))
.catch((error) => {
state.outbound.lastResultError = error instanceof Error ? error.message : String(error);
})
.finally(() => {
inflightRequests.delete(requestId);
refreshInflightState();
});
}
async function handleCloudRequest(request) {
const environment = requestEnvironment(request?.meta);
const context = operationContext({
operationId: request.params?.operationId,
traceId: request.meta?.traceId,
requestId: request.id,
actorId: request.meta?.actorId ?? "svc_hwlab-cloud-api"
}, {
serviceId: "hwlab-gateway",
actorId: "svc_hwlab-gateway"
});
let response;
try {
if (request.method !== "hardware.invoke.shell") {
throw rpcError(ERROR_CODES.methodNotFound, `Gateway method ${request.method ?? "unknown"} is not implemented`, {
method: request.method ?? null
});
}
const result = await invokeShell(request.params ?? {}, context, environment);
response = {
jsonrpc: JSON_RPC_VERSION,
id: request.id,
result,
meta: responseMeta(context.traceId, environment)
};
} catch (error) {
const body = error?.body ?? createRpcErrorBody({
code: error?.code ?? ERROR_CODES.hwlabUnknown,
message: error instanceof Error ? error.message : String(error),
data: error?.data ?? {}
});
response = {
jsonrpc: JSON_RPC_VERSION,
id: request.id,
error: body.error,
meta: responseMeta(context.traceId, environment)
};
}
await postGatewayResult(response);
}
async function postGatewayBusyResult(request) {
const traceId = request?.meta?.traceId ?? `trc_gateway_busy_${Date.now()}`;
const environment = requestEnvironment(request?.meta);
const body = createRpcErrorBody({
code: ERROR_CODES.operationRejected,
message: "Gateway is busy; retry after an in-flight command finishes or increase HWLAB_GATEWAY_MAX_INFLIGHT.",
data: {
reason: "gateway_busy",
operationId: request?.params?.operationId ?? null,
inflightCount: inflightRequests.size,
maxInflightRequests
}
});
await postGatewayResult({
jsonrpc: JSON_RPC_VERSION,
id: request?.id ?? null,
error: body.error,
meta: responseMeta(traceId, environment)
});
}
async function postGatewayResult(response) {
const result = await fetchJson(new URL("/v1/gateway/result", ensureTrailingSlash(cloudUrl)), {
method: "POST",
body: {
gatewayId,
gatewaySessionId,
response
}
});
if (!result.ok) {
throw new Error(`cloud result failed: HTTP ${result.status}`);
}
state.outbound.lastResultAt = new Date().toISOString();
state.outbound.lastResultError = null;
}
async function invokeShell(params, context, environment = gatewayEnvironment) {
if (!commandExecutionEnabled) {
throw rpcError(ERROR_CODES.operationRejected, "Gateway command execution is disabled", {
reason: "cmd_exec_disabled",
requiredEnv: "HWLAB_GATEWAY_CMD_EXEC_ENABLED=1"
});
}
const shellInput = normalizeShellInput(params);
const startedAt = Date.now();
const execution = await executeCommand(shellInput, {
timeoutMs: shellInput.timeoutMs ?? commandTimeoutMs,
outputLimitBytes
});
const durationMs = Date.now() - startedAt;
const now = new Date().toISOString();
const status = execution.timedOut ? "timed_out" : execution.exitCode === 0 ? "succeeded" : "failed";
const audit = createAuditEvent({
serviceId: "hwlab-gateway",
action: "hardware.invoke.shell",
targetType: "box_resource",
targetId: params.resourceId ?? resourceId,
projectId: params.projectId,
gatewaySessionId,
operationId: context.operationId,
traceId: context.traceId,
actorType: "service",
actorId: "svc_hwlab-gateway",
outcome: status === "succeeded" ? "succeeded" : "failed",
environment,
metadata: {
gatewayId,
resourceId: params.resourceId ?? resourceId,
capabilityId: params.capabilityId ?? "cap_windows_cmd_exec",
command: redactCommand(shellInput.command),
cwd: execution.cwd,
exitCode: execution.exitCode,
timedOut: execution.timedOut,
durationMs
},
occurredAt: now
});
const evidence = createEvidenceRecord({
serviceId: "hwlab-gateway",
projectId: params.projectId ?? "prj_mvp_topology",
operationId: context.operationId,
traceId: context.traceId,
kind: "trace",
environment,
payload: {
gatewayId,
gatewaySessionId,
resourceId: params.resourceId ?? resourceId,
capabilityId: params.capabilityId ?? "cap_windows_cmd_exec",
shell: execution
},
metadata: {
gatewaySessionId,
producerServiceId: "hwlab-gateway"
},
createdAt: now
});
state.lastDispatch = {
operationId: context.operationId,
traceId: context.traceId,
resourceId: params.resourceId ?? resourceId,
observedAt: now,
accepted: true,
status
};
state.updatedAt = now;
return {
accepted: true,
status,
serviceId: "hwlab-gateway",
environment,
gatewayId,
gatewaySessionId,
operationId: context.operationId,
traceId: context.traceId,
shellExecuted: true,
dispatchStatus: status,
...execution,
durationMs,
auditId: audit.auditId,
evidenceId: evidence.evidenceId,
audit,
evidence,
gateway: {
gatewayId,
gatewaySessionId
}
};
}
function executeCommand(input, { timeoutMs, outputLimitBytes: limitBytes }) {
return new Promise((resolve) => {
const startedAt = new Date().toISOString();
const shell = shellCommand(input.command);
const child = spawn(shell.command, shell.args, {
cwd: input.cwd,
windowsHide: true,
env: {
...process.env,
PYTHONUTF8: process.env.PYTHONUTF8 ?? "1",
PYTHONIOENCODING: process.env.PYTHONIOENCODING ?? "utf-8",
NO_PROXY: process.env.NO_PROXY,
no_proxy: process.env.no_proxy
},
stdio: ["ignore", "pipe", "pipe"]
});
const stdout = createLimitedCollector(limitBytes);
const stderr = createLimitedCollector(limitBytes);
let timedOut = false;
let settled = false;
const timer = setTimeout(() => {
timedOut = true;
killProcessTree(child);
}, timeoutMs);
child.stdout.on("data", (chunk) => stdout.push(chunk));
child.stderr.on("data", (chunk) => stderr.push(chunk));
child.on("error", (error) => {
if (settled) return;
settled = true;
clearTimeout(timer);
resolve({
shell: shell.command,
command: input.command,
cwd: input.cwd ?? process.cwd(),
startedAt,
completedAt: new Date().toISOString(),
exitCode: null,
signal: null,
timedOut,
stdout: stdout.text(),
stderr: stderr.text() || error.message,
stdoutTruncated: stdout.truncated,
stderrTruncated: stderr.truncated
});
});
child.on("close", (exitCode, signal) => {
if (settled) return;
settled = true;
clearTimeout(timer);
resolve({
shell: shell.command,
command: input.command,
cwd: input.cwd ?? process.cwd(),
startedAt,
completedAt: new Date().toISOString(),
exitCode,
signal,
timedOut,
stdout: stdout.text(),
stderr: stderr.text(),
stdoutTruncated: stdout.truncated,
stderrTruncated: stderr.truncated
});
});
});
}
function shellCommand(command) {
if (process.platform === "win32") {
return {
command: process.env.ComSpec ?? "cmd.exe",
args: ["/d", "/s", "/c", String(command)]
};
}
return {
command: "sh",
args: ["-lc", String(command)]
};
}
function killProcessTree(child) {
if (!child.pid) return;
if (process.platform === "win32") {
spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
windowsHide: true,
stdio: "ignore"
});
return;
}
child.kill("SIGTERM");
}
function createLimitedCollector(limitBytes) {
const chunks = [];
let size = 0;
let truncated = false;
return {
get truncated() {
return truncated;
},
push(chunk) {
if (size >= limitBytes) {
truncated = true;
return;
}
const buffer = Buffer.from(chunk);
const available = limitBytes - size;
if (buffer.byteLength > available) {
chunks.push(buffer.subarray(0, available));
size += available;
truncated = true;
return;
}
chunks.push(buffer);
size += buffer.byteLength;
},
text() {
return Buffer.concat(chunks).toString("utf8");
}
};
}
function registrationPayload() {
refreshInflightState();
return {
serviceId: "hwlab-gateway",
projectId: process.env.HWLAB_PROJECT_ID ?? "prj_mvp_topology",
gatewayId,
gatewaySessionId,
endpoint: state.session.endpoint,
resourceId,
boxId,
capabilities: shellCapabilities(),
outbound: {
pollIntervalMs,
commandExecutionEnabled,
maxInflightRequests,
inflightCount: inflightRequests.size,
inflightRequests: snapshotInflightRequests()
},
system: {
platform: process.platform,
arch: process.arch,
hostname: os.hostname(),
release: os.release()
}
};
}
function shellCapabilities() {
return [
{
capabilityId: process.env.HWLAB_GATEWAY_CMD_CAPABILITY_ID ?? "cap_windows_cmd_exec",
resourceId,
projectId: process.env.HWLAB_PROJECT_ID ?? "prj_mvp_topology",
name: "shell.exec",
description: "Execute a local shell command through an outbound HWLAB gateway demo connection.",
direction: "bidirectional",
valueType: "object",
constraints: {
gatewayOutboundOnly: true,
demoOpen: truthy(process.env.HWLAB_GATEWAY_DEMO_OPEN),
maxInflightRequests
},
mutatesState: true
}
];
}
function refreshInflightState() {
state.outbound.inflightCount = inflightRequests.size;
state.outbound.inflightRequests = snapshotInflightRequests();
}
function snapshotInflightRequests() {
const now = Date.now();
return [...inflightRequests.values()].map((request) => ({
...request,
durationMs: durationSince(request.startedAt, now)
}));
}
function durationSince(value, now = Date.now()) {
const started = Date.parse(value ?? "");
return Number.isFinite(started) ? Math.max(0, now - started) : 0;
}
function normalizeShellInput(params = {}) {
const input = params.input && typeof params.input === "object" && !Array.isArray(params.input) ? params.input : {};
const command = params.command ?? input.command ?? input.shell?.command;
if (!command) {
throw rpcError(ERROR_CODES.invalidParams, "hardware.invoke.shell requires input.command", {
required: ["input.command"]
});
}
return {
command: Array.isArray(command) ? command.map(String).join(" ") : String(command),
cwd: input.cwd ? String(input.cwd) : undefined,
timeoutMs: parsePositiveInteger(input.timeoutMs, commandTimeoutMs)
};
}
function responseMeta(traceId, environment = gatewayEnvironment) {
return {
traceId,
serviceId: "hwlab-gateway",
environment: normalizeEnvironment(environment)
};
}
function requestEnvironment(meta = {}) {
return normalizeEnvironment(meta?.environment || gatewayEnvironment);
}
function normalizeEnvironment(environment) {
return isProtocolEnvironment(environment) ? environment : ENVIRONMENT_DEV;
}
function rpcError(code, message, data = {}) {
const error = new Error(message);
error.code = code;
error.data = data;
error.body = createRpcErrorBody({ code, message, data });
return error;
}
function parsePositiveInteger(value, fallback) {
const parsed = Number.parseInt(value ?? "", 10);
return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
}
function truthy(value) {
return ["1", "true", "yes", "on", "enabled"].includes(String(value ?? "").trim().toLowerCase());
}
function trimUrl(value) {
const text = String(value ?? "").trim();
return text ? text : null;
}
function ensureTrailingSlash(url) {
return url.endsWith("/") ? url : `${url}/`;
}
function redactCommand(command) {
const text = String(command ?? "");
return text.length <= 200 ? text : `${text.slice(0, 200)}...`;
}
function ensureNoProxyForLocalCloud(url) {
let host = "";
try {
host = new URL(url).hostname;
} catch {
return;
}
const additions = new Set(["localhost", "127.0.0.1", "::1", host].filter(Boolean));
for (const key of ["NO_PROXY", "no_proxy"]) {
const current = String(process.env[key] ?? "");
const values = new Set(current.split(",").map((item) => item.trim()).filter(Boolean));
for (const addition of additions) values.add(addition);
process.env[key] = [...values].join(",");
}
}
-63
View File
@@ -1,63 +0,0 @@
#!/usr/bin/env node
import { createM3Topology } from "../../internal/patchpanel/fixture.mjs";
import {
createPatchPanelRuntime,
createPatchPanelRuntimeFromFile
} from "../../internal/patchpanel/runtime.mjs";
import { createHealth } from "../../internal/sim/model.mjs";
import { createJsonServer, listen, parsePort, readJson } from "../../internal/sim/http.mjs";
const port = parsePort(process.env.PORT, 7301);
const wiringConfigPath = process.env.HWLAB_WIRING_CONFIG_PATH;
const topology = createM3Topology();
const endpointMap = parseEndpointMap(process.env.HWLAB_PATCH_PANEL_ENDPOINT_MAP) ?? {
res_boxsimu_2: "http://hwlab-box-simu-2.hwlab-dev.svc.cluster.local:7201"
};
const manifestWiringConfig = parseWiringConfig(process.env.HWLAB_PATCH_PANEL_WIRING_CONFIG);
const runtime = wiringConfigPath
? await createPatchPanelRuntimeFromFile({ path: wiringConfigPath })
: createPatchPanelRuntime({
wiringConfig: manifestWiringConfig ?? topology.wiringConfig,
endpointMap,
configSource: manifestWiringConfig ? "env:HWLAB_PATCH_PANEL_WIRING_CONFIG" : "internal:m3-topology"
});
const routes = new Map();
routes.set("GET /health/live", () =>
createHealth({ serviceId: "hwlab-patch-panel", name: "hwlab-patch-panel" })
);
routes.set("GET /status", () => runtime.status());
routes.set("GET /diagnostics", () => runtime.diagnostics());
routes.set("GET /wiring", () => runtime.wiringConfig);
routes.set("POST /wiring/apply", async ({ req }) => runtime.applyConfig(await readJson(req)));
routes.set("POST /wiring/reload", async ({ req }) => {
const body = await readJson(req);
const path = body.path ?? wiringConfigPath;
if (!path) {
throw new Error("wiring reload requires body.path or HWLAB_WIRING_CONFIG_PATH");
}
return runtime.reloadFromFile(path);
});
routes.set("POST /signals/route", async ({ req }) => runtime.routeSignal(await readJson(req)));
routes.set("POST /sync/tick", async ({ req }) => runtime.tick(await readJson(req)));
listen(createJsonServer({ routes }), port);
function parseEndpointMap(value) {
const source = String(value ?? "").trim();
if (!source) {
return null;
}
return JSON.parse(source);
}
function parseWiringConfig(value) {
const source = String(value ?? "").trim();
if (!source) {
return null;
}
return JSON.parse(source);
}
-54
View File
@@ -1,54 +0,0 @@
#!/usr/bin/env bun
import { createProjectManagementApp } from "../../internal/project-management/server.ts";
import { createProjectManagementStore } from "../../internal/project-management/store.ts";
const host = process.env.HWLAB_PROJECT_MANAGEMENT_HOST || "0.0.0.0";
const port = parsePort(process.env.HWLAB_PROJECT_MANAGEMENT_PORT, parsePort(process.env.PORT, 6672));
const store = createProjectManagementStore({ env: process.env });
const app = createProjectManagementApp({ env: process.env, store });
void app.initialize().catch((error) => {
console.warn(JSON.stringify({
serviceId: "hwlab-project-management",
event: "project-management-startup-initialize-failed",
code: error?.code ?? "project_management_initialize_failed",
message: error?.message ?? String(error)
}));
});
const runtime = Bun.serve({
hostname: host,
port,
fetch: (request) => app.fetch(request)
});
process.stdout.write(`${JSON.stringify({
serviceId: "hwlab-project-management",
status: "listening",
host,
port: runtime.port,
routes: [
"/health/live",
"/health/ready",
"/v1/project-management/navigation",
"/v1/project-management/projects",
"/v1/project-management/mdtodo/sources",
"/v1/project-management/mdtodo/files",
"/v1/project-management/mdtodo/tasks",
"GET /v1/project-management/workbench-links",
"POST /v1/project-management/workbench-links"
]
})}\n`);
for (const signal of ["SIGINT", "SIGTERM"]) {
process.on(signal, async () => {
runtime.stop(true);
await app.close();
process.exit(0);
});
}
function parsePort(value: unknown, fallback: number): number {
const parsed = Number.parseInt(String(value ?? ""), 10);
return Number.isInteger(parsed) && parsed > 0 && parsed < 65536 ? parsed : fallback;
}
-63
View File
@@ -1,63 +0,0 @@
#!/usr/bin/env node
import {
createServiceServer,
listen,
resolveHostPort
} from "../../internal/dev-entrypoint/http.mjs";
const serviceId = "hwlab-router";
const mode = process.env.HWLAB_ROUTER_MODE || "edge-reachability";
const edgeProxyService = process.env.HWLAB_EDGE_PROXY_SERVICE || "hwlab-edge-proxy";
const cloudApiService = process.env.HWLAB_CLOUD_API_SERVICE || "hwlab-cloud-api";
const { host, port } = resolveHostPort({
listenEnv: "HWLAB_ROUTER_LISTEN",
hostEnv: "HWLAB_ROUTER_HOST",
portEnv: "HWLAB_ROUTER_PORT",
fallbackPort: 7401
});
const routeTable = [
{
pathPrefix: "/health",
targetServiceId: cloudApiService,
mode: "local-health"
},
{
pathPrefix: "/",
targetServiceId: cloudApiService,
via: edgeProxyService,
mode: "dev-edge-reachability"
}
];
const routes = new Map();
routes.set("GET /status", () => ({
serviceId,
environment: "dev",
status: "ok",
mode,
edgeProxyService,
cloudApiService,
routeTable
}));
routes.set("GET /routes", () => ({
serviceId,
routeTable
}));
listen(
createServiceServer({
serviceId,
role: "dev-router",
routes,
details: () => ({
mode,
edgeProxyService,
cloudApiService,
routeCount: routeTable.length
})
}),
{ serviceId, host, port }
);
-20
View File
@@ -1,20 +0,0 @@
#!/usr/bin/env bun
import { createTaskTreeDispatcher } from "../../internal/tasktree/dispatcher.ts";
import { createTaskTreeHttpApp } from "../../internal/tasktree/http.ts";
import { taskTreeRuntime } from "../../internal/tasktree/runtime.ts";
const runtime = taskTreeRuntime();
const dispatch = createTaskTreeDispatcher(runtime);
const app = createTaskTreeHttpApp({ dispatch, close: () => runtime.store.close() });
const host = process.env.TASKTREE_API_HOST || "0.0.0.0";
const port = Number.parseInt(process.env.TASKTREE_API_PORT || process.env.PORT || "6673", 10);
const server = Bun.serve({ hostname: host, port, fetch: (request) => app.fetch(request) });
process.stdout.write(`${JSON.stringify({ serviceId: "hwlab-tasktree-api", status: "listening", host, port: server.port })}\n`);
for (const signal of ["SIGINT", "SIGTERM"] as const) {
process.once(signal, async () => {
server.stop(true);
await app.close();
process.exit(0);
});
}
-39
View File
@@ -1,39 +0,0 @@
#!/usr/bin/env bun
import { NativeConnection, Worker } from "@temporalio/worker";
import path from "node:path";
import { createTaskTreeActivities } from "../../internal/tasktree/activities.ts";
import { taskTreeRuntime } from "../../internal/tasktree/runtime.ts";
const runtime = taskTreeRuntime();
if (!runtime.temporalAddress) throw new Error("TASKTREE_TEMPORAL_ADDRESS is required");
await runtime.store.ensureSchema();
const connection = await NativeConnection.connect({ address: runtime.temporalAddress });
const worker = await Worker.create({
connection,
namespace: runtime.temporalNamespace,
taskQueue: runtime.taskQueue,
workflowsPath: path.resolve(import.meta.dir, "../../internal/tasktree/workflows.ts"),
activities: createTaskTreeActivities(runtime.store)
});
const healthPort = Number.parseInt(process.env.TASKTREE_WORKER_HEALTH_PORT || "6674", 10);
const health = Bun.serve({
hostname: process.env.TASKTREE_WORKER_HEALTH_HOST || "0.0.0.0",
port: healthPort,
fetch(request) {
const pathname = new URL(request.url).pathname;
if (pathname !== "/health/live" && pathname !== "/health/ready") return Response.json({ ok: false, error: "not_found" }, { status: 404 });
return Response.json({ ok: true, serviceId: "hwlab-tasktree-worker", namespace: runtime.temporalNamespace, taskQueue: runtime.taskQueue });
}
});
process.stdout.write(`${JSON.stringify({ serviceId: "hwlab-tasktree-worker", status: "started", namespace: runtime.temporalNamespace, taskQueue: runtime.taskQueue })}\n`);
for (const signal of ["SIGINT", "SIGTERM"] as const) process.once(signal, () => worker.shutdown());
try {
await worker.run();
} finally {
health.stop(true);
await connection.close();
await runtime.store.close();
process.stdout.write(`${JSON.stringify({ serviceId: "hwlab-tasktree-worker", status: "stopped" })}\n`);
}
-53
View File
@@ -1,53 +0,0 @@
#!/usr/bin/env node
import {
createServiceServer,
listen,
parsePort,
resolveHostPort
} from "../../internal/dev-entrypoint/http.mjs";
const serviceId = "hwlab-tunnel-client";
const mode = process.env.HWLAB_TUNNEL_MODE || "frp-client";
const serverAddress = process.env.HWLAB_FRP_SERVER_ADDR || "74.48.78.17";
const publicPort = parsePort(process.env.HWLAB_FRP_PUBLIC_PORT, 16667);
const webPublicPort = parsePort(process.env.HWLAB_FRP_WEB_PUBLIC_PORT, 16666);
const localService = process.env.HWLAB_TUNNEL_LOCAL_SERVICE || "hwlab-edge-proxy";
const localPort = parsePort(process.env.HWLAB_TUNNEL_LOCAL_PORT, 6667);
const { host, port } = resolveHostPort({
listenEnv: "HWLAB_TUNNEL_LISTEN",
hostEnv: "HWLAB_TUNNEL_HOST",
portEnv: "HWLAB_TUNNEL_PORT",
fallbackPort: 7402
});
function tunnelState() {
return {
serviceId,
environment: "dev",
status: "configured",
mode,
reverseLink: {
direction: "d601-to-master",
serverAddress,
publicPort,
webPublicPort,
localService,
localPort
},
liveConnection: "not_started_by_entrypoint"
};
}
const routes = new Map();
routes.set("GET /status", () => tunnelState());
routes.set("GET /tunnel", () => tunnelState().reverseLink);
listen(
createServiceServer({
serviceId,
role: "frp-client",
routes,
details: () => tunnelState()
}),
{ serviceId, host, port }
);
-16
View File
@@ -1,16 +0,0 @@
package main
import (
"context"
"fmt"
"os"
"github.com/pikasTech/HWLAB/internal/userbilling"
)
func main() {
if err := userbilling.Run(context.Background()); err != nil {
fmt.Fprintf(os.Stderr, "hwlab-user-billing: %v\n", err)
os.Exit(1)
}
}
-16
View File
@@ -1,16 +0,0 @@
package main
import (
"context"
"fmt"
"os"
"github.com/pikasTech/HWLAB/internal/workbenchruntime"
)
func main() {
if err := workbenchruntime.Run(context.Background()); err != nil {
fmt.Fprintf(os.Stderr, "hwlab-workbench-runtime: %v\n", err)
os.Exit(1)
}
}
-44
View File
@@ -1,44 +0,0 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://github.com/pikasTech/HWLAB/config/feature-config.schema.json",
"title": "HWLAB product feature configuration",
"type": "object",
"additionalProperties": false,
"properties": {
"tracePanel": {
"x-unidesk-feature": "workbench.trace-panel",
"type": "object",
"additionalProperties": false,
"properties": {
"autoExpandRunning": { "type": "boolean" },
"autoCollapseTerminal": { "type": "boolean" }
}
},
"rawEvents": {
"x-unidesk-feature": "workbench.raw-events",
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" },
"maxEntries": { "type": "integer", "minimum": 1 },
"maxRetainedBytes": { "type": "integer", "minimum": 1 }
}
},
"debugReplay": {
"x-unidesk-feature": "workbench.debug-replay",
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": { "type": "boolean" }
}
},
"views": {
"x-unidesk-feature": "workbench.views",
"type": "object",
"additionalProperties": false,
"properties": {
"traceExplorerUrlTemplate": { "type": "string", "minLength": 1 }
}
}
}
}
@@ -1,17 +0,0 @@
apiVersion: hwlab.dev/v0alpha1
kind: HwlabNavProfiles
metadata:
name: d601-v03-nav-profiles
verificationIssue: pikasTech/HWLAB#2187
spec:
profiles:
- id: admin-full
displayName: Admin full access
allowedIds:
- "*"
- id: code-mdtodo-only
displayName: Code and MDTODO only
allowedIds:
- workbench.code
- project.mdtodo
- project.tasktree
@@ -1,26 +0,0 @@
apiVersion: hwlab.dev/v0alpha1
kind: HwlabAccessControlUsers
metadata:
name: d601-v03-users
verificationIssue: pikasTech/HWLAB#2187
spec:
users:
- id: usr_v03_admin
username: admin
displayName: HWLAB v0.3 Admin
role: admin
status: active
navProfile: admin-full
passwordHashRef:
env: HWLAB_BOOTSTRAP_ADMIN_PASSWORD_HASH
secretRef: hwlab-v03-bootstrap-admin/password-hash
- id: usr_v03_huiggao
username: huiggao@163.com
displayName: huiggao@163.com
email: huiggao@163.com
role: user
status: active
navProfile: code-mdtodo-only
passwordHashRef:
env: HWLAB_PRESET_USER_HUIGGAO_PASSWORD_HASH
secretRef: hwlab-v03-preset-users/huiggao-password-hash
-74
View File
@@ -1,74 +0,0 @@
version: 1
kind: hwlab-v03-secret-plane
metadata:
id: hwlab-v03-secret-plane
owner: HWLAB
spec: pikasTech/HWLAB#2277
boundary: JD01/v0.3 read-only active target
secretPlane:
enabled: true
issue: pikasTech/HWLAB#2277
enabledOnNodes:
- JD01
valuesPrinted: false
readModel:
target:
node: JD01
lane: v03
runtimeNamespace: hwlab-v03
infraNamespace: platform-infra
publicUrl: https://hwlab.pikapython.com
source: yaml-active-target
sourceRef: config/hwlab-v03/secrets.yaml#secretPlane.readModel.target
upstreamSourceRef: config/platform-infra/secret-plane.yaml#activeTarget
statusEvidence:
source: pikasTech/unidesk#1282
issue: pikasTech/HWLAB#2277
command: bun scripts/cli.ts platform-infra secret-plane status --target JD01
validatedAt: "2026-06-30T03:21:49Z"
fingerprint: sha256:dbc852e80ed37ccc9d8596eb47976839c9c77e4a5afda972ce62ad29db9132dd
status: Ready
valuesPrinted: false
components:
esoController: Ready
esoWebhook: Ready
esoCertController: Ready
secretStore: Ready
clusterSecretStore: Ready
sync: Ready
consumer: Ready
store:
kind: ClusterSecretStore
name: hwlab-secret-plane-vault-cluster
refreshInterval: 1m
secrets:
- id: hwlab-secret-plane-smoke
externalSecretName: hwlab-secret-plane-smoke
targetSecretName: hwlab-secret-plane-smoke
purpose: Low-risk JD01/v0.3 smoke secret for platform-infra secret-plane integration.
statusEvidence:
status: Ready
reason: JD01 platform-infra secret-plane PoC validated by pikasTech/unidesk#1282.
fingerprint: sha256:dbc852e80ed37ccc9d8596eb47976839c9c77e4a5afda972ce62ad29db9132dd
data:
- targetKey: password
remoteRef: hwlab-secret-plane/poc
property: password
consumers:
- serviceId: hwlab-cloud-api
kind: Deployment
injectAs: env
envName: HWLAB_SECRET_PLANE_SMOKE
- id: test-1
externalSecretName: test-1
targetSecretName: test-1
purpose: User-requested low-risk test ExternalSecret for ESO UI validation.
statusEvidence:
status: Ready
reason: JD01 test ExternalSecret source material was written to Vault KV v2 without printing values.
fingerprint: sha256:64056d77d3a430f947337d73e3002deb5f474e49390f9f88f32156def6be95a7
data:
- targetKey: password
remoteRef: hwlab-secret-plane/test-1
property: password
consumers: []
-114
View File
@@ -1,114 +0,0 @@
# Deploy Contract
`deploy.schema.json` defines the current `deploy/deploy.yaml` manifest shape.
The MVP acceptance environment is DEV only. Public endpoint source fields live in
`deploy/deploy.yaml`: frontend `http://74.48.78.17:16666` and API/edge
`http://74.48.78.17:16667`. PROD profile fields may be represented in schema
for future compatibility, but PROD deployment is not part of MVP acceptance.
## L5 DEV Skeleton
- `deploy/deploy.yaml` is the DEV-only deploy manifest.
- `deploy/deploy.yaml` is the single source for `health.path`,
`publicEndpoints`, `frp.proxies`, and `k3s.serviceMappings`.
- Config parsing and writing must go through `scripts/src/structured-config.mjs`
and `scripts/src/deploy-config.mjs`; do not add direct YAML parser calls in
planners, renderers, smoke scripts, or CLIs.
- `deploy/k8s/base` contains parseable k3s resource skeletons for the frozen
HWLAB service IDs rendered from the manifest contract.
- `deploy/k8s/dev` contains the DEV health contract and endpoint metadata.
- `hwlab-cloud-api` declares the DEV DB env contract with
`HWLAB_CLOUD_DB_URL` from Secret reference
`hwlab-cloud-api-dev-db/database-url` and non-secret
`HWLAB_CLOUD_DB_SSL_MODE=disable`. Runtime DB readiness dials the redacted
host parsed from that Secret URL. `cloud-api-db` is only an optional desired
alias until Service plus Endpoint/EndpointSlice ownership and rollout/apply
contract exist; see
[docs/reference/dev-runtime-boundary.md](../docs/reference/dev-runtime-boundary.md).
The repository records names only, never secret values or a live DB
connection string; runtime health reports redacted env injection and DB
connection result classifiers.
- `hwlab-cloud-api` declares the DEV Code Agent provider contract with
`HWLAB_CODE_AGENT_PROVIDER=codex-stdio`, `OPENAI_API_KEY` from Secret reference
`hwlab-code-agent-provider/openai-api-key`, and
`HWLAB_CODE_AGENT_OPENAI_BASE_URL` through the DEV egress/proxy path. The same
contract declares `/workspace/hwlab` as a writable workspace,
`CODEX_HOME=/codex-home`, `/app/node_modules/.bin/codex` as the Codex command,
and repo-owned `codex app-server --listen stdio://` supervisor mode. Source checks verify the Secret ref,
base-url, workspace, CODEX_HOME, config/auth mounts, NO_PROXY, and CLI contracts without printing API key
material. Controlled apply reports also check that the live
`hwlab-cloud-api` Deployment preserves the same env names and `secretKeyRef`
name/key metadata after apply without reading Kubernetes Secret data.
- `hwlab-cloud-api` also declares `HWLAB_CLOUD_RUNTIME_ADAPTER=postgres` and
`HWLAB_CLOUD_RUNTIME_DURABLE=true` so DEV can use the Postgres-backed runtime
adapter once the schema is applied. `/health/live` must still remain degraded
if DB auth, DB connectivity, or runtime schema readiness is blocked.
- `deploy/k8s/prod` is a disabled placeholder gate only.
- `deploy/frp` describes the D601-to-master reverse link without secrets.
- `deploy/master-edge` describes public edge ownership and health boundaries.
Dry-run source rendering:
```sh
node scripts/deploy-contract-plan.mjs --pretty
node scripts/deploy-contract-plan.mjs --check
```
The deploy contract plan renders and validates only. It does not run frps/frpc,
does not call `kubectl apply`, does not restart services, and does not touch
PROD. Later work can wire the same source fields into `hwlab edge apply` or
`deploy apply`.
Desired-state commit/image convergence review:
```sh
node scripts/deploy-desired-state-plan.mjs --plan --pretty
node scripts/deploy-desired-state-plan.mjs --check
node scripts/deploy-desired-state-plan.mjs --target-ref origin/G14 --pretty
node scripts/deploy-desired-state-plan.mjs --target-tag <tag> --pretty
node scripts/deploy-desired-state-plan.mjs --promotion-commit <sha> --check
```
The desired-state plan reads `deploy/deploy.yaml`,
`deploy/artifact-catalog.dev.json`, `deploy/k8s/base/workloads.yaml`, and the
optional artifact report snapshot. `deploy/deploy.yaml` is the human-authored
runtime config truth source. Published image identity lives in
`G14-gitops:deploy/artifact-catalog.dev.json`; the source branch catalog is only
a seed contract for local checks. GitOps render overlays catalog image fields and
generated env mirrors such as `HWLAB_COMMIT_ID`, `HWLAB_IMAGE`,
`HWLAB_IMAGE_TAG`, and `HWLAB_SKILLS_COMMIT_ID` into runtime manifests.
The plan blocks if generated artifact identity leaks back into `deploy.yaml`,
or if `hwlab-cloud-api` loses the Code Agent provider Secret ref
`hwlab-code-agent-provider/openai-api-key`, the `OPENAI_API_KEY` env name, or
the DEV egress proxy base-url env. Promotion updates must refresh only the
workspace catalog from a publish report before render; Tekton writes that
catalog to `G14-gitops`, not back to the source branch. Human operators should
not run catalog refresh as a source update. Report files are contextual evidence
only and must not override human-authored source truth.
This is source/dry-run support only. It does not prove a registry image exists,
does not build, pull, push, apply, restart, or touch PROD, and must not be used
as M3 DEV-LIVE evidence.
## D601 Native k3s Guard
DEV deploy and smoke commands must target D601 native k3s with
`KUBECONFIG=/etc/rancher/k3s/k3s.yaml`. Do not use the default kubeconfig if it
points at `docker-desktop`, `desktop-control-plane`, or `127.0.0.1:11700`.
Control-plane confusion is tracked in
[pikasTech/unidesk#138](https://github.com/pikasTech/unidesk/issues/138).
Next DEV deploy smoke commands, for a separately authorized deployment task:
```sh
npm run check
node --input-type=module -e "import { readDeployConfig } from './scripts/src/deploy-config.mjs'; await readDeployConfig(process.cwd())"
KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl apply --dry-run=server -k deploy/k8s/dev
curl -fsS http://74.48.78.17:16667/health/live
node scripts/dev-edge-health-smoke.mjs --live --report /tmp/hwlab-dev-gate/report.json
```
Do not run PROD deployment or substitute UniDesk backend, provider-gateway, or
microservice proxy for HWLAB runtime services.
+647
View File
@@ -0,0 +1,647 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "v03",
"profile": "v03",
"namespace": "hwlab-v03",
"endpoint": "https://hwlab.pikapython.com",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"artifactState": "published",
"publish": {
"ciPublished": true,
"registryVerified": true,
"provenance": "node-ci-artifact:hwlab-d518-v03-ci-poll-31179908f208-collect",
"note": "Digest fields were copied from a successful DEV artifact publish report for this source commit."
},
"healthContract": {
"method": "GET",
"path": "/health/live",
"responseFormat": "json",
"requiredFields": [
"serviceId",
"environment",
"status"
]
},
"allowedProfiles": [
"v03"
],
"forbiddenProfiles": [
"dev",
"prod"
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"sourceCommitId": "31179908f208f7cdf6c6280779f0808b42289123",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-27T12:59:25.831Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "a2a8bd634b07ebc433108c1ee26ac8b66c2a19b7",
"componentInputHash": "f8db7dc95a736bd390a4fc75416f84fb0a80b87e4164d074552b143482a692bf",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"environmentDigest": "sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "ca5d1e0d4b61fd8eea7e57100b3f7ee847c1808f651ec1fcb4be496e96eec63e",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "31179908f208f7cdf6c6280779f0808b42289123",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-api.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "445d32282d642d5089290ffe5f621ccea3206cf1d9f11b24091f82a4434cbcd5",
"ciAffected": true,
"ciReason": [
"code-input-changed",
"component-path-changed"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"digest": "sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3",
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
{
"serviceId": "hwlab-workbench-runtime",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"sourceCommitId": "31179908f208f7cdf6c6280779f0808b42289123",
"image": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"imageTag": "env-ff6af05aa162",
"digest": "sha256:a3061773d9acd408d8e7c8979eb7dd54e1a087393046a00923f2b92b36f93cb0",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-27T12:59:24.258Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "ff386925244e1a915da87ee563bdd4e2412cc1705c54afef618ad2f1e6645ecb",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"environmentDigest": "sha256:a3061773d9acd408d8e7c8979eb7dd54e1a087393046a00923f2b92b36f93cb0",
"environmentInputHash": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"codeInputHash": "5ac3e165aaf2b87a5138c404870feba94da8f7269e566dfa89a180b71d5ff7cb",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:a3061773d9acd408d8e7c8979eb7dd54e1a087393046a00923f2b92b36f93cb0",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "31179908f208f7cdf6c6280779f0808b42289123",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:a3061773d9acd408d8e7c8979eb7dd54e1a087393046a00923f2b92b36f93cb0"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "4269b9316d150facffb495f7c4900ee56af391c071b86063ae850defa7e64e99",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"digest": "sha256:a3061773d9acd408d8e7c8979eb7dd54e1a087393046a00923f2b92b36f93cb0",
"reusedFrom": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15"
},
"reusedFrom": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15"
},
{
"serviceId": "hwlab-user-billing",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"sourceCommitId": "31179908f208f7cdf6c6280779f0808b42289123",
"image": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"imageTag": "env-ff6af05aa162",
"digest": "sha256:676e0d302ffd1f5e97013d79be210a874f60b88d10d39d4c9b56aa9af18d3664",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-27T12:59:24.602Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "bdeb0aacf71f54d1c2e8486fbf50cd80c7a33949e872bfba45a6812a3145b1dc",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"environmentDigest": "sha256:676e0d302ffd1f5e97013d79be210a874f60b88d10d39d4c9b56aa9af18d3664",
"environmentInputHash": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"codeInputHash": "1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:676e0d302ffd1f5e97013d79be210a874f60b88d10d39d4c9b56aa9af18d3664",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "31179908f208f7cdf6c6280779f0808b42289123",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-user-billing.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:676e0d302ffd1f5e97013d79be210a874f60b88d10d39d4c9b56aa9af18d3664"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "490a070de1a6975b4935670478f0e64345d20e1aa9b80096b1318106b25d9310",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"digest": "sha256:676e0d302ffd1f5e97013d79be210a874f60b88d10d39d4c9b56aa9af18d3664",
"reusedFrom": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15"
},
"reusedFrom": "7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15"
},
{
"serviceId": "hwlab-project-management",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"sourceCommitId": "31179908f208f7cdf6c6280779f0808b42289123",
"image": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:15f6c379782a5dfdc6de0b3a25ce2e56a90f1c66c0036f6899a8c7824884dce5",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-27T12:59:24.271Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "dc5b06cc6285cbc0c510eb28722fd85556e8945a",
"componentInputHash": "52db7a25f3867376c9b1716feb08623fdf7f59a8d3a46743dc00f9eece784961",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"environmentDigest": "sha256:15f6c379782a5dfdc6de0b3a25ce2e56a90f1c66c0036f6899a8c7824884dce5",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "c194b49c2cb463467e6f661bde2bfa984fd44731c6b280eae9a28b0174ea0207",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:15f6c379782a5dfdc6de0b3a25ce2e56a90f1c66c0036f6899a8c7824884dce5",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "31179908f208f7cdf6c6280779f0808b42289123",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-project-management.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:15f6c379782a5dfdc6de0b3a25ce2e56a90f1c66c0036f6899a8c7824884dce5"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "30d9f35c4d70555725db1ef7a591b9af9cb158e82d924d3c6dc82326fbeffbd4",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"digest": "sha256:15f6c379782a5dfdc6de0b3a25ce2e56a90f1c66c0036f6899a8c7824884dce5",
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"sourceCommitId": "31179908f208f7cdf6c6280779f0808b42289123",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:352765b8ecfab3f0e231fd66ee7ee3247d32b765e0c9d91d55a8d39079b08faf",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-27T12:59:26.276Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "db3bbf01453582dc5ed4130f8d89d2718f4ff275",
"componentInputHash": "f12daa0ba914a2269dfe4d5f1733f1099c3881442b063361b829b1ffb377907b",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"environmentDigest": "sha256:352765b8ecfab3f0e231fd66ee7ee3247d32b765e0c9d91d55a8d39079b08faf",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "2f419dca5d5d7105222c1b087797b7369d6fc93207cd2c87c2eee18d75349e45",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:352765b8ecfab3f0e231fd66ee7ee3247d32b765e0c9d91d55a8d39079b08faf",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "31179908f208f7cdf6c6280779f0808b42289123",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-web.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:352765b8ecfab3f0e231fd66ee7ee3247d32b765e0c9d91d55a8d39079b08faf"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": true,
"ciReason": [
"code-input-changed"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"digest": "sha256:352765b8ecfab3f0e231fd66ee7ee3247d32b765e0c9d91d55a8d39079b08faf",
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
{
"serviceId": "hwlab-gateway",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"sourceCommitId": "31179908f208f7cdf6c6280779f0808b42289123",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:24287e83c8350db356fd17c024ffd30219c554466d56e3165d4d6ad198f5415c",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-27T12:59:26.536Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "f62bf867c44cb6eb979e255e3f285aaac4dcde143819115662324f198b08db47",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"environmentDigest": "sha256:24287e83c8350db356fd17c024ffd30219c554466d56e3165d4d6ad198f5415c",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:24287e83c8350db356fd17c024ffd30219c554466d56e3165d4d6ad198f5415c",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "31179908f208f7cdf6c6280779f0808b42289123",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-gateway.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:24287e83c8350db356fd17c024ffd30219c554466d56e3165d4d6ad198f5415c"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "3fed509f00ba3448138a999f51dad3d38b822bb4a5c152011e3e57526972fd41",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"digest": "sha256:24287e83c8350db356fd17c024ffd30219c554466d56e3165d4d6ad198f5415c",
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"sourceCommitId": "31179908f208f7cdf6c6280779f0808b42289123",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:638470bf27c7a547825b0081b427c11025ba959f5aed732bdcfb3718ee63c944",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-27T12:59:26.468Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "68788f9255479a574bd38c98dbefee762abd3e8bffda8e3ab831e7ec7acff1ab",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"environmentDigest": "sha256:638470bf27c7a547825b0081b427c11025ba959f5aed732bdcfb3718ee63c944",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:638470bf27c7a547825b0081b427c11025ba959f5aed732bdcfb3718ee63c944",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "31179908f208f7cdf6c6280779f0808b42289123",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:638470bf27c7a547825b0081b427c11025ba959f5aed732bdcfb3718ee63c944"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "68746696603227763e5768f8daf45d31331f4c8425e6d756b21482ad104e6183",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"digest": "sha256:638470bf27c7a547825b0081b427c11025ba959f5aed732bdcfb3718ee63c944",
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "31179908f208f7cdf6c6280779f0808b42289123",
"sourceCommitId": "31179908f208f7cdf6c6280779f0808b42289123",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:151c2f0cad10d86e246d85a9bc5cf47f2ba0d2323b209f24654233717dbfd643",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-27T12:59:26.489Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "d9214b7feea7afbe06efd7972749334302322322d62652b1b2d2a85c3ef2c34b",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"environmentDigest": "sha256:151c2f0cad10d86e246d85a9bc5cf47f2ba0d2323b209f24654233717dbfd643",
"environmentInputHash": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"codeInputHash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:151c2f0cad10d86e246d85a9bc5cf47f2ba0d2323b209f24654233717dbfd643",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "31179908f208f7cdf6c6280779f0808b42289123",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "31179908f208f7cdf6c6280779f0808b42289123",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-agent-skills.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:151c2f0cad10d86e246d85a9bc5cf47f2ba0d2323b209f24654233717dbfd643"
}
},
"dockerfileHash": "b522c3c99bb29d49027b6f7a1ea3dd1c650a76854a93b174cdb31d7a959bfa8b",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"digest": "sha256:151c2f0cad10d86e246d85a9bc5cf47f2ba0d2323b209f24654233717dbfd643",
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
},
"reusedFrom": "bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da"
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 8,
"requiredServiceCount": 8,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-workbench-runtime",
"hwlab-user-billing",
"hwlab-project-management",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-workbench-runtime",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-workbench-runtime/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-user-billing",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-user-billing/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-project-management",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-project-management/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "node-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.mjs",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
+647
View File
@@ -0,0 +1,647 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "v03",
"profile": "v03",
"namespace": "hwlab-v03",
"endpoint": "https://hwlab.pikapython.com",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"artifactState": "published",
"publish": {
"ciPublished": true,
"registryVerified": true,
"provenance": "node-ci-artifact:hwlab-v03-ci-poll-6120f7fdfeea-collect",
"note": "Digest fields were copied from a successful DEV artifact publish report for this source commit."
},
"healthContract": {
"method": "GET",
"path": "/health/live",
"responseFormat": "json",
"requiredFields": [
"serviceId",
"environment",
"status"
]
},
"allowedProfiles": [
"v03"
],
"forbiddenProfiles": [
"dev",
"prod"
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"sourceCommitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:75b71b85837c59d179f6c99c8e945f078225f21fc6e2accd8c9a88ee918a1d4b",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:31:43.004Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "86308192fcd19087dd1c52864a2f219947cc865c",
"componentInputHash": "2d1e5ed1c8a047696cd5e3bfb0bddd53d55c0bb88ae2b029ed73e132dbf151f8",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"environmentDigest": "sha256:75b71b85837c59d179f6c99c8e945f078225f21fc6e2accd8c9a88ee918a1d4b",
"environmentInputHash": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4",
"codeInputHash": "a9a2df3c8fd943e1119c7f7225b3ffa4ab32f306b6ce86bc739103a197fbda10",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:75b71b85837c59d179f6c99c8e945f078225f21fc6e2accd8c9a88ee918a1d4b",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-api.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:75b71b85837c59d179f6c99c8e945f078225f21fc6e2accd8c9a88ee918a1d4b"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "445d32282d642d5089290ffe5f621ccea3206cf1d9f11b24091f82a4434cbcd5",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786",
"digest": "sha256:75b71b85837c59d179f6c99c8e945f078225f21fc6e2accd8c9a88ee918a1d4b",
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
{
"serviceId": "hwlab-workbench-runtime",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"sourceCommitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"image": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"imageTag": "env-ff6af05aa162",
"digest": "sha256:ea1349a5c02af415a117739721e0e60eb39c9f1b7bfbd7c2d9b0a956f21c6d19",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:31:41.128Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "ff386925244e1a915da87ee563bdd4e2412cc1705c54afef618ad2f1e6645ecb",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"environmentDigest": "sha256:ea1349a5c02af415a117739721e0e60eb39c9f1b7bfbd7c2d9b0a956f21c6d19",
"environmentInputHash": "ff6af05aa16270b7ab30c1b926e7a40216c7dc57a27c7e86349b62ee3568e092",
"codeInputHash": "5ac3e165aaf2b87a5138c404870feba94da8f7269e566dfa89a180b71d5ff7cb",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:ea1349a5c02af415a117739721e0e60eb39c9f1b7bfbd7c2d9b0a956f21c6d19",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:ea1349a5c02af415a117739721e0e60eb39c9f1b7bfbd7c2d9b0a956f21c6d19"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "4269b9316d150facffb495f7c4900ee56af391c071b86063ae850defa7e64e99",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-workbench-runtime-env:env-ff6af05aa162",
"digest": "sha256:ea1349a5c02af415a117739721e0e60eb39c9f1b7bfbd7c2d9b0a956f21c6d19",
"reusedFrom": "ff6af05aa16270b7ab30c1b926e7a40216c7dc57a27c7e86349b62ee3568e092"
},
"reusedFrom": "ff6af05aa16270b7ab30c1b926e7a40216c7dc57a27c7e86349b62ee3568e092"
},
{
"serviceId": "hwlab-user-billing",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"sourceCommitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"image": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"imageTag": "env-ff6af05aa162",
"digest": "sha256:e30e62e9dc1df309092722697f8ebe2f5c61baf38558368db9f51de1c914d8b9",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:31:41.921Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:7b8d6a068b3811c8585cec0ac4b4d5cfad543a98cf8b824e1f114270e3d1cd15",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "bdeb0aacf71f54d1c2e8486fbf50cd80c7a33949e872bfba45a6812a3145b1dc",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"environmentDigest": "sha256:e30e62e9dc1df309092722697f8ebe2f5c61baf38558368db9f51de1c914d8b9",
"environmentInputHash": "ff6af05aa16270b7ab30c1b926e7a40216c7dc57a27c7e86349b62ee3568e092",
"codeInputHash": "1c7f8090dc17d9a7dfc7cdd0714e7294bb231db899c396b388e4ab3642e5134e",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:e30e62e9dc1df309092722697f8ebe2f5c61baf38558368db9f51de1c914d8b9",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-user-billing.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:e30e62e9dc1df309092722697f8ebe2f5c61baf38558368db9f51de1c914d8b9"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "490a070de1a6975b4935670478f0e64345d20e1aa9b80096b1318106b25d9310",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-user-billing-env:env-ff6af05aa162",
"digest": "sha256:e30e62e9dc1df309092722697f8ebe2f5c61baf38558368db9f51de1c914d8b9",
"reusedFrom": "ff6af05aa16270b7ab30c1b926e7a40216c7dc57a27c7e86349b62ee3568e092"
},
"reusedFrom": "ff6af05aa16270b7ab30c1b926e7a40216c7dc57a27c7e86349b62ee3568e092"
},
{
"serviceId": "hwlab-project-management",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"sourceCommitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"image": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:c491f3d02fcd0959855bf05cf8a147a74a53e51a9a8a7a137090947fb63fa344",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:31:41.934Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "6825e1e2cbf8caf94cdb17ef4f069524252a611b",
"componentInputHash": "1eb54771455eff4ea3404660117b3b5534675461b404eda537c86281fda40466",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"environmentDigest": "sha256:c491f3d02fcd0959855bf05cf8a147a74a53e51a9a8a7a137090947fb63fa344",
"environmentInputHash": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4",
"codeInputHash": "7a8950ddd89462a711e16e439f3f1b68e1b34940e5f5059211bc92c14384e3d7",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:c491f3d02fcd0959855bf05cf8a147a74a53e51a9a8a7a137090947fb63fa344",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-project-management.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:c491f3d02fcd0959855bf05cf8a147a74a53e51a9a8a7a137090947fb63fa344"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "30d9f35c4d70555725db1ef7a591b9af9cb158e82d924d3c6dc82326fbeffbd4",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-project-management-env:env-a730c84fe786",
"digest": "sha256:c491f3d02fcd0959855bf05cf8a147a74a53e51a9a8a7a137090947fb63fa344",
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"sourceCommitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:7c20b9b61bae707dfe10783b39db72195d2cae141b6f90514f7506fa813e19ab",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:31:41.049Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "4b4a7c78baf52e05a3c793f01638e7b88f067c77",
"componentInputHash": "e43f9dc978eb276ad1cbbbf1bac6f3ae77a6ba60d0936b8beef47b70ba0bf560",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"environmentDigest": "sha256:7c20b9b61bae707dfe10783b39db72195d2cae141b6f90514f7506fa813e19ab",
"environmentInputHash": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4",
"codeInputHash": "eabeee3e5d7f0452eb2a289fbae1e9d72ed8c37f733168a24a7c4062ea82b63f",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:7c20b9b61bae707dfe10783b39db72195d2cae141b6f90514f7506fa813e19ab",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-web.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:7c20b9b61bae707dfe10783b39db72195d2cae141b6f90514f7506fa813e19ab"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": true,
"ciReason": [
"code-input-changed",
"component-path-changed"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-a730c84fe786",
"digest": "sha256:7c20b9b61bae707dfe10783b39db72195d2cae141b6f90514f7506fa813e19ab",
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
{
"serviceId": "hwlab-gateway",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"sourceCommitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:7f40e2a56c7d380c3fbfe2817fc69176ede6590811a0bf1fadc9038084b052bc",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:31:43.319Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "f62bf867c44cb6eb979e255e3f285aaac4dcde143819115662324f198b08db47",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"environmentDigest": "sha256:7f40e2a56c7d380c3fbfe2817fc69176ede6590811a0bf1fadc9038084b052bc",
"environmentInputHash": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4",
"codeInputHash": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:7f40e2a56c7d380c3fbfe2817fc69176ede6590811a0bf1fadc9038084b052bc",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-gateway.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:7f40e2a56c7d380c3fbfe2817fc69176ede6590811a0bf1fadc9038084b052bc"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "3fed509f00ba3448138a999f51dad3d38b822bb4a5c152011e3e57526972fd41",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-a730c84fe786",
"digest": "sha256:7f40e2a56c7d380c3fbfe2817fc69176ede6590811a0bf1fadc9038084b052bc",
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"sourceCommitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:73d3da47f126493b11bec3439ba166ccef984f41c8bd5064fd2e60abb47b8c87",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:31:43.215Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "68788f9255479a574bd38c98dbefee762abd3e8bffda8e3ab831e7ec7acff1ab",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"environmentDigest": "sha256:73d3da47f126493b11bec3439ba166ccef984f41c8bd5064fd2e60abb47b8c87",
"environmentInputHash": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4",
"codeInputHash": "c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:73d3da47f126493b11bec3439ba166ccef984f41c8bd5064fd2e60abb47b8c87",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:73d3da47f126493b11bec3439ba166ccef984f41c8bd5064fd2e60abb47b8c87"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "68746696603227763e5768f8daf45d31331f4c8425e6d756b21482ad104e6183",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-a730c84fe786",
"digest": "sha256:73d3da47f126493b11bec3439ba166ccef984f41c8bd5064fd2e60abb47b8c87",
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"sourceCommitId": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"imageTag": "env-a730c84fe786",
"digest": "sha256:973094ff62a67101ec701994dc4fcba19c7c57358f55a36f096a48453387db45",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-26T12:31:43.204Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da",
"buildBackend": "reused-env-catalog",
"componentCommitId": "36e863bd1b2124b1630e5b2735c9fd811502e762",
"componentInputHash": "d9214b7feea7afbe06efd7972749334302322322d62652b1b2d2a85c3ef2c34b",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"environmentDigest": "sha256:973094ff62a67101ec701994dc4fcba19c7c57358f55a36f096a48453387db45",
"environmentInputHash": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4",
"codeInputHash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:973094ff62a67101ec701994dc4fcba19c7c57358f55a36f096a48453387db45",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-agent-skills.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:973094ff62a67101ec701994dc4fcba19c7c57358f55a36f096a48453387db45"
}
},
"dockerfileHash": "790fd77de37268ff2ee9fa2b5e8c5489d58a1e4cb8faa538ffb9e35ba83da688",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-a730c84fe786",
"digest": "sha256:973094ff62a67101ec701994dc4fcba19c7c57358f55a36f096a48453387db45",
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
},
"reusedFrom": "a730c84fe7862e298ebfb44ec505f11f60a2df2acc4cab53d9246042e3ca89e4"
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 8,
"requiredServiceCount": 8,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-workbench-runtime",
"hwlab-user-billing",
"hwlab-project-management",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-workbench-runtime",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-workbench-runtime/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-user-billing",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-user-billing/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-project-management",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-project-management/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "node-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.mjs",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
-316
View File
@@ -1,316 +0,0 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "dev",
"profile": "dev",
"namespace": "hwlab-dev",
"endpoint": "http://74.48.78.17:16667",
"commitId": "278bbe1",
"artifactState": "contract-skeleton",
"publish": {
"ciPublished": false,
"registryVerified": false,
"provenance": "not_available_until_publish",
"note": "Artifact identity was refreshed to this source commit, but no publish report proved registry digests."
},
"healthContract": {
"method": "GET",
"path": "/health/live",
"responseFormat": "json",
"requiredFields": [
"serviceId",
"environment",
"status"
]
},
"allowedProfiles": [
"dev"
],
"forbiddenProfiles": [
"prod"
],
"forbiddenItems": [
{
"id": "prod-deploy",
"reason": "MVP acceptance is DEV-only."
},
{
"id": "prod-profile-enabled",
"reason": "PROD profile may only exist as a disabled placeholder."
},
{
"id": "prod-namespace",
"reason": "The catalog must not target hwlab-prod."
},
{
"id": "real-ci-publish-claim",
"reason": "The skeleton catalog must not claim real image publish or registry verification."
},
{
"id": "real-dev-deploy",
"reason": "This contract does not authorize a real DEV deployment."
},
{
"id": "secret-material",
"reason": "Validation must not read or require secrets or tokens."
},
{
"id": "unidesk-runtime-substitute",
"reason": "UniDesk backend, provider-gateway, and microservice proxy are not HWLAB runtime substitutes."
},
{
"id": "force-push",
"reason": "Mainline updates must not use force push."
}
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "278bbe1",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:278bbe1",
"imageTag": "278bbe1",
"digest": "not_published",
"publishState": "skeleton-only",
"profile": "dev",
"namespace": "hwlab-dev",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": "publish_not_run",
"buildCreatedAt": null,
"buildSource": null,
"componentCommitId": "8d533cb736c3bf30fe97ef0ddf3d24047cad1b78",
"componentInputHash": "7498160c36db86db76d3c1b103e397f2b2304248136d3b79eafe1ab69d4abeff",
"dockerfileHash": "8b2595a09276479b8809e70e99516c1539a6a7cc200e73266d247176b56be962",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "31de87c01b0c617b550b82b7a65780fac56d03a3b8abb9301bf0096766f87237",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api:af46386",
"digest": "sha256:fe724e72e7cea3c93abe17085c4d885c78d34d18eb2a3c01f987d1971e2f4425",
"reusedFrom": "7498160c36db86db76d3c1b103e397f2b2304248136d3b79eafe1ab69d4abeff"
},
"reusedFrom": "7498160c36db86db76d3c1b103e397f2b2304248136d3b79eafe1ab69d4abeff",
"runtimeKind": "bun-command",
"entrypoint": "cmd/hwlab-cloud-api/main.ts"
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "278bbe1",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:278bbe1",
"imageTag": "278bbe1",
"digest": "not_published",
"publishState": "skeleton-only",
"profile": "dev",
"namespace": "hwlab-dev",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": "publish_not_run",
"buildCreatedAt": null,
"buildSource": null,
"componentCommitId": "8d533cb736c3bf30fe97ef0ddf3d24047cad1b78",
"componentInputHash": "fdd27830a0cef173fc07a2cab8cd469d67aaff9da12bb0195f188e323854f93a",
"dockerfileHash": "8b2595a09276479b8809e70e99516c1539a6a7cc200e73266d247176b56be962",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web:af46386",
"digest": "sha256:3f5d4dcd1df4f736293d4223acb8104fd857e847a3a9a0acec4ef031ea333913",
"reusedFrom": "fdd27830a0cef173fc07a2cab8cd469d67aaff9da12bb0195f188e323854f93a"
},
"reusedFrom": "fdd27830a0cef173fc07a2cab8cd469d67aaff9da12bb0195f188e323854f93a"
},
{
"serviceId": "hwlab-gateway",
"commitId": "278bbe1",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:278bbe1",
"imageTag": "278bbe1",
"digest": "not_published",
"publishState": "skeleton-only",
"profile": "dev",
"namespace": "hwlab-dev",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": "publish_not_run",
"buildCreatedAt": null,
"buildSource": null,
"componentCommitId": "a56ea7e33ef67040cc9a8748c3759b4f9c87ca46",
"componentInputHash": "6c97b4f8e49ba46148dde9126a21f475356bfdd4d6826326799d03d68212002e",
"dockerfileHash": "8b2595a09276479b8809e70e99516c1539a6a7cc200e73266d247176b56be962",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "083cc565bccb315303df802dfc1f7fb87738e763afb9662fed7bc7c12719b070",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway:af46386",
"digest": "sha256:1f44666c01f11416fee24b2d671c2ddcea3b5a6c575fe16ad0cf5307315d35e6",
"reusedFrom": "6c97b4f8e49ba46148dde9126a21f475356bfdd4d6826326799d03d68212002e"
},
"reusedFrom": "6c97b4f8e49ba46148dde9126a21f475356bfdd4d6826326799d03d68212002e"
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "278bbe1",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:278bbe1",
"imageTag": "278bbe1",
"digest": "not_published",
"publishState": "skeleton-only",
"profile": "dev",
"namespace": "hwlab-dev",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": "publish_not_run",
"buildCreatedAt": null,
"buildSource": null,
"componentCommitId": "a56ea7e33ef67040cc9a8748c3759b4f9c87ca46",
"componentInputHash": "497d88f5f34075f2ba064cdc10d3a80a236e96e4eab4ca71ae3138a751201315",
"dockerfileHash": "8b2595a09276479b8809e70e99516c1539a6a7cc200e73266d247176b56be962",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "68746696603227763e5768f8daf45d31331f4c8425e6d756b21482ad104e6183",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy:af46386",
"digest": "sha256:b9dbf6f08bfea10ec9ca9c15cd864e96eb37e483fcd8716513dd74533d8b3cf0",
"reusedFrom": "497d88f5f34075f2ba064cdc10d3a80a236e96e4eab4ca71ae3138a751201315"
},
"reusedFrom": "497d88f5f34075f2ba064cdc10d3a80a236e96e4eab4ca71ae3138a751201315"
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "278bbe1",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:278bbe1",
"imageTag": "278bbe1",
"digest": "not_published",
"publishState": "skeleton-only",
"profile": "dev",
"namespace": "hwlab-dev",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": "publish_not_run",
"buildCreatedAt": null,
"buildSource": null,
"componentCommitId": "a56ea7e33ef67040cc9a8748c3759b4f9c87ca46",
"componentInputHash": "33cc71d1216f9f523499c950c445b6d6d4ac604e8048c1a2c3a9561b3bdce9e8",
"dockerfileHash": "8b2595a09276479b8809e70e99516c1539a6a7cc200e73266d247176b56be962",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills:af46386",
"digest": "sha256:8cdf6922fda03703288a796b107f9185c3635f2768bc0bcf9b8272bf33ae7547",
"reusedFrom": "33cc71d1216f9f523499c950c445b6d6d4ac604e8048c1a2c3a9561b3bdce9e8"
},
"reusedFrom": "33cc71d1216f9f523499c950c445b6d6d4ac604e8048c1a2c3a9561b3bdce9e8"
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 5,
"requiredServiceCount": 5,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "node-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.mjs",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
+645
View File
@@ -0,0 +1,645 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "v03",
"profile": "v03",
"namespace": "hwlab-v03",
"endpoint": "https://hwlab.pikapython.com",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"artifactState": "published",
"publish": {
"ciPublished": true,
"registryVerified": true,
"provenance": "node-ci-artifact:hwlab-jd01-v03-ci-poll-m5fm6-collect",
"note": "Digest fields were copied from a successful DEV artifact publish report for this source commit."
},
"healthContract": {
"method": "GET",
"path": "/health/live",
"responseFormat": "json",
"requiredFields": [
"serviceId",
"environment",
"status"
]
},
"allowedProfiles": [
"v03"
],
"forbiddenProfiles": [
"dev",
"prod"
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"sourceCommitId": "ccc9503e9dac8f800c557198558d32367d598126",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"imageTag": "env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-07-06T14:13:53.403Z",
"buildSource": "gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB@env:6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"buildBackend": "reused-env-catalog",
"componentCommitId": "1908c43fef2114cba13df3fc572eeaf7f945ee52",
"componentInputHash": "6bf12ded4bf79aaaa2c2264a697f3f92e2f947b489249706df6cc959811511a2",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentInputHash": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"codeInputHash": "c0574f80f2ea40565176f3ab778a749eb2cba890d3c798a2dc319693dae4b982",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "ccc9503e9dac8f800c557198558d32367d598126",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-api.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d"
}
},
"dockerfileHash": "78a9d92bd6ecea408f22e0d6eabf79fab66008b56429446d4621837f1150904d",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "445d32282d642d5089290ffe5f621ccea3206cf1d9f11b24091f82a4434cbcd5",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
{
"serviceId": "hwlab-workbench-runtime",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"sourceCommitId": "ccc9503e9dac8f800c557198558d32367d598126",
"image": "127.0.0.1:5000/hwlab/hwlab-go-runtime-env:env-6d50571be334",
"imageTag": "env-6d50571be334",
"digest": "sha256:556342f4caf4b8f8f00c382ad3c47e981550580e0a8fead1d8e0c6de73eaefb7",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-07-07T01:10:30.606Z",
"buildSource": "gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB@env:6d50571be334e4558b2a2e229b36d932d57443bb806d409242e5335660c8f445",
"buildBackend": "shared-env-artifact",
"componentCommitId": "4043855bffebc01696a2461ce0479bfac0f470c6",
"componentInputHash": "eff55b1457a52873fee8cc12e9aae947ebc4d7a43ca70aa8b374a3ff64a40750",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-go-runtime-env:env-6d50571be334",
"environmentDigest": "sha256:556342f4caf4b8f8f00c382ad3c47e981550580e0a8fead1d8e0c6de73eaefb7",
"environmentInputHash": "6d50571be334e4558b2a2e229b36d932d57443bb806d409242e5335660c8f445",
"codeInputHash": "e242d6bce649c8422e458fc30b3e3ef00721b15d067c7f55f9898b2771b83838",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:556342f4caf4b8f8f00c382ad3c47e981550580e0a8fead1d8e0c6de73eaefb7",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-go-runtime-env:env-6d50571be334",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "ccc9503e9dac8f800c557198558d32367d598126",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-workbench-runtime.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-go-runtime-env:env-6d50571be334",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:556342f4caf4b8f8f00c382ad3c47e981550580e0a8fead1d8e0c6de73eaefb7"
}
},
"dockerfileHash": "78a9d92bd6ecea408f22e0d6eabf79fab66008b56429446d4621837f1150904d",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "4269b9316d150facffb495f7c4900ee56af391c071b86063ae850defa7e64e99",
"ciAffected": true,
"ciReason": [
"shared-env-artifact-consumer"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": "hwlab-user-billing"
},
{
"serviceId": "hwlab-user-billing",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"sourceCommitId": "ccc9503e9dac8f800c557198558d32367d598126",
"image": "127.0.0.1:5000/hwlab/hwlab-go-runtime-env:env-6d50571be334",
"imageTag": "env-6d50571be334",
"digest": "sha256:556342f4caf4b8f8f00c382ad3c47e981550580e0a8fead1d8e0c6de73eaefb7",
"publishState": "published",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-07-07T01:10:30.606Z",
"buildSource": "gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB@env:6d50571be334e4558b2a2e229b36d932d57443bb806d409242e5335660c8f445",
"buildBackend": "buildkit-env-reuse",
"componentCommitId": "4043855bffebc01696a2461ce0479bfac0f470c6",
"componentInputHash": "0a765cf5eb4695599a0e5960bd81890023d124d683c5def7ccc0067872bd3453",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": true,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-go-runtime-env:env-6d50571be334",
"environmentDigest": "sha256:556342f4caf4b8f8f00c382ad3c47e981550580e0a8fead1d8e0c6de73eaefb7",
"environmentInputHash": "6d50571be334e4558b2a2e229b36d932d57443bb806d409242e5335660c8f445",
"codeInputHash": "09a0983dcc5525d93de6ab636a9de686739625d5549f108f366c44cae7835d69",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:556342f4caf4b8f8f00c382ad3c47e981550580e0a8fead1d8e0c6de73eaefb7",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-go-runtime-env:env-6d50571be334",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-user-billing.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "ccc9503e9dac8f800c557198558d32367d598126",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-user-billing.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-go-runtime-env:env-6d50571be334",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:556342f4caf4b8f8f00c382ad3c47e981550580e0a8fead1d8e0c6de73eaefb7"
}
},
"dockerfileHash": "78a9d92bd6ecea408f22e0d6eabf79fab66008b56429446d4621837f1150904d",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "490a070de1a6975b4935670478f0e64345d20e1aa9b80096b1318106b25d9310",
"ciAffected": true,
"ciReason": [
"environment-input-mismatch",
"reuse-registry-missing",
"code-input-changed",
"component-path-changed"
],
"reuse": {
"status": "not-reused",
"reason": "environment-affected"
},
"reusedFrom": "89f6cae0d05e04a95bf86405abcd92fe9f05e1943b62b511bb1aa2b9d1456583"
},
{
"serviceId": "hwlab-project-management",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"sourceCommitId": "ccc9503e9dac8f800c557198558d32367d598126",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"imageTag": "env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-07-06T14:13:53.403Z",
"buildSource": "gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB@env:6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"buildBackend": "reused-env-catalog",
"componentCommitId": "d4b56a7f7577905a8333c4a353281231814f6356",
"componentInputHash": "3f3e67b45d27fde2b9040c57128f48f737cd42140b61325c2514805b5c53bc37",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentInputHash": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"codeInputHash": "4cbd4e24c3020037d215271ed248ac38d5a1c385855443ffe5c112b1a04118f6",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-project-management.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "ccc9503e9dac8f800c557198558d32367d598126",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-project-management.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d"
}
},
"dockerfileHash": "78a9d92bd6ecea408f22e0d6eabf79fab66008b56429446d4621837f1150904d",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "30d9f35c4d70555725db1ef7a591b9af9cb158e82d924d3c6dc82326fbeffbd4",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"sourceCommitId": "ccc9503e9dac8f800c557198558d32367d598126",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"imageTag": "env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-07-06T14:13:53.403Z",
"buildSource": "gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB@env:6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"buildBackend": "reused-env-catalog",
"componentCommitId": "d4b56a7f7577905a8333c4a353281231814f6356",
"componentInputHash": "7bb2008a4d422215c6aacf74c8db6b0b722c103e410f7258ee30f65f3b5e8369",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentInputHash": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"codeInputHash": "a30d3b6d134dd5e18879523ba0022838e879eb06f3bfb0753eca9d236d7d7780",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "ccc9503e9dac8f800c557198558d32367d598126",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-web.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d"
}
},
"dockerfileHash": "78a9d92bd6ecea408f22e0d6eabf79fab66008b56429446d4621837f1150904d",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
{
"serviceId": "hwlab-gateway",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"sourceCommitId": "ccc9503e9dac8f800c557198558d32367d598126",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"imageTag": "env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-07-06T14:13:53.403Z",
"buildSource": "gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB@env:6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"buildBackend": "reused-env-catalog",
"componentCommitId": "d4b56a7f7577905a8333c4a353281231814f6356",
"componentInputHash": "a51e672d7340b359752eb9529d318904b4e195032dd64e670461dcc102cd7ce4",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentInputHash": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"codeInputHash": "25f753b252593891ed7b03b53a69d266e7a324728cf83fea8654bab4196fa399",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "ccc9503e9dac8f800c557198558d32367d598126",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-gateway.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d"
}
},
"dockerfileHash": "78a9d92bd6ecea408f22e0d6eabf79fab66008b56429446d4621837f1150904d",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "3fed509f00ba3448138a999f51dad3d38b822bb4a5c152011e3e57526972fd41",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"sourceCommitId": "ccc9503e9dac8f800c557198558d32367d598126",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"imageTag": "env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-07-06T14:13:53.403Z",
"buildSource": "gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB@env:6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"buildBackend": "reused-env-catalog",
"componentCommitId": "d4b56a7f7577905a8333c4a353281231814f6356",
"componentInputHash": "9eaa4ccbd907b483e1a7fcd879ff0c5117ed711701e0dab98168d34cd4e11aad",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentInputHash": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"codeInputHash": "c97d19939c872e128a6931bdf73f28a75a684948a76a2b1af37508dd47481544",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "ccc9503e9dac8f800c557198558d32367d598126",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d"
}
},
"dockerfileHash": "78a9d92bd6ecea408f22e0d6eabf79fab66008b56429446d4621837f1150904d",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "68746696603227763e5768f8daf45d31331f4c8425e6d756b21482ad104e6183",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "ccc9503e9dac8f800c557198558d32367d598126",
"sourceCommitId": "ccc9503e9dac8f800c557198558d32367d598126",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"imageTag": "env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-07-06T14:13:53.403Z",
"buildSource": "gitea-http.devops-infra.svc.cluster.local:3000/mirrors/pikasTech-HWLAB@env:6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"buildBackend": "reused-env-catalog",
"componentCommitId": "d4b56a7f7577905a8333c4a353281231814f6356",
"componentInputHash": "8cbebb54f7cddf413bf3cc1c9524f71bad3672936d70fd27f1239095c8a4a65c",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentInputHash": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93",
"codeInputHash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "ccc9503e9dac8f800c557198558d32367d598126",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "ccc9503e9dac8f800c557198558d32367d598126",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-agent-skills.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d"
}
},
"dockerfileHash": "78a9d92bd6ecea408f22e0d6eabf79fab66008b56429446d4621837f1150904d",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-ts-runtime-env:env-6ef8ca3abf22",
"digest": "sha256:b7937056c621f60c80a780fa86fc61365b201323b20c1958be6d70293977a18d",
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
},
"reusedFrom": "6ef8ca3abf22d871599b06333d285bd64f105a7a799b2937bb9c8f037fc0fd93"
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 8,
"requiredServiceCount": 8,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-workbench-runtime",
"hwlab-user-billing",
"hwlab-project-management",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-workbench-runtime",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-workbench-runtime/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-user-billing",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "go-service",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-user-billing/main.go",
"disabledReason": null
},
{
"serviceId": "hwlab-project-management",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-project-management/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "node-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.mjs",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
File diff suppressed because it is too large Load Diff
+405
View File
@@ -0,0 +1,405 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "v02",
"profile": "v02",
"namespace": "hwlab-v02",
"endpoint": "https://hwlab.74-48-78-17.nip.io",
"commitId": "34ee9472857ab43c77d8d302101bfa0580c27867",
"artifactState": "published",
"publish": {
"registryPrefix": "127.0.0.1:5000/hwlab",
"sourceCommitId": "26da97ea8642e019d42b62af6b0d6348ef85cf41",
"imageTag": "26da97ea8642e019d42b62af6b0d6348ef85cf41",
"publishedAt": null,
"ciPublished": true,
"registryVerified": true,
"provenance": "g14-ci-artifact:hwlab-v02-ci-poll-34ee9472857a-collect",
"note": "Digest fields were copied from a successful DEV artifact publish report for this source commit."
},
"allowedProfiles": [
"v02"
],
"forbiddenProfiles": [
"dev",
"prod"
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"profile": "v02",
"namespace": "hwlab-v02",
"commitId": "23c414834f37947642ebcbba99e6ea1296467bfd",
"sourceCommitId": "23c414834f37947642ebcbba99e6ea1296467bfd",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-29eed704413a",
"imageTag": "env-29eed704413a",
"digest": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d",
"buildBackend": "reused-env-catalog",
"buildCreatedAt": "2026-06-07T13:28:35.243Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB@env:29eed704413ab110e86e67b091d23129218f6ae670942da8b89eec4ac38e32b9",
"componentCommitId": "1b87c3d672fcd748159e860521fc903d06c75ba0",
"componentInputHash": "c35f0ead887ae24a477398bbdd6175f80ef4a58e9e1966004a7e78ba8bd0b71d",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-29eed704413a",
"environmentDigest": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d",
"environmentInputHash": "d8b4dc03fbc87a2c842afe490c367f628ee5381a961ab7f66cbd280d3b05eb53",
"codeInputHash": "f63a609ea884a985e3b576af7bfe2eddcfb0e006be023c76450e024a3b1fd737",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-29eed704413a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "23c414834f37947642ebcbba99e6ea1296467bfd",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-api.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-29eed704413a",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d"
}
},
"dockerfileHash": "e032ee4186f4aca3aae491e81af9c9a12ad2d9e3a3bce942c34f52eb22aa5e36",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "445d32282d642d5089290ffe5f621ccea3206cf1d9f11b24091f82a4434cbcd5",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-29eed704413a",
"digest": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d",
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a"
},
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a",
"publishState": "reused",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null
},
{
"serviceId": "hwlab-cloud-web",
"profile": "v02",
"namespace": "hwlab-v02",
"commitId": "34ee9472857ab43c77d8d302101bfa0580c27867",
"sourceCommitId": "34ee9472857ab43c77d8d302101bfa0580c27867",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-cee556b5a633",
"imageTag": "env-cee556b5a633",
"digest": "sha256:0a6832fe93897941ea9c0a95bad4b91b9cf72661abc5567505de115cab98efc5",
"buildBackend": "reused-env-catalog",
"buildCreatedAt": "2026-06-06T02:50:29.998Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB@env:cee556b5a633e85455a5d6e1912a43ebf7c40e04a69457120dd434e3ca024d27",
"componentCommitId": "1b87c3d672fcd748159e860521fc903d06c75ba0",
"componentInputHash": "f90a3b7abd3d07a6fd120fb4e7186f8f88f24c14aa45e0aa9f217eea4fbd6ecb",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": true,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-cee556b5a633",
"environmentDigest": "sha256:0a6832fe93897941ea9c0a95bad4b91b9cf72661abc5567505de115cab98efc5",
"environmentInputHash": "d8b4dc03fbc87a2c842afe490c367f628ee5381a961ab7f66cbd280d3b05eb53",
"codeInputHash": "903c6583459a7d041744a6197f60c296f5cf6c5d7bac0b115df61b4ca1198f1c",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:0a6832fe93897941ea9c0a95bad4b91b9cf72661abc5567505de115cab98efc5",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-cee556b5a633",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "34ee9472857ab43c77d8d302101bfa0580c27867",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-web.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-cee556b5a633",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:0a6832fe93897941ea9c0a95bad4b91b9cf72661abc5567505de115cab98efc5"
}
},
"dockerfileHash": "e032ee4186f4aca3aae491e81af9c9a12ad2d9e3a3bce942c34f52eb22aa5e36",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": true,
"ciReason": [
"code-input-changed"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-cee556b5a633",
"digest": "sha256:0a6832fe93897941ea9c0a95bad4b91b9cf72661abc5567505de115cab98efc5",
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a"
},
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a",
"publishState": "reused",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null
},
{
"serviceId": "hwlab-gateway",
"profile": "v02",
"namespace": "hwlab-v02",
"commitId": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"sourceCommitId": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-29eed704413a",
"imageTag": "env-29eed704413a",
"digest": "sha256:437cb4b429552c812da622cb13910cb891a4293cb6058ff187d99fe8c8b12304",
"buildBackend": "reused-env-catalog",
"buildCreatedAt": "2026-06-07T13:28:35.230Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB@env:29eed704413ab110e86e67b091d23129218f6ae670942da8b89eec4ac38e32b9",
"componentCommitId": "1b87c3d672fcd748159e860521fc903d06c75ba0",
"componentInputHash": "31f097c4d96b10f4fe0fdd7e68ae0fb6bb17adeb2ab019184bc0d8df72ee1917",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-29eed704413a",
"environmentDigest": "sha256:437cb4b429552c812da622cb13910cb891a4293cb6058ff187d99fe8c8b12304",
"environmentInputHash": "d8b4dc03fbc87a2c842afe490c367f628ee5381a961ab7f66cbd280d3b05eb53",
"codeInputHash": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:437cb4b429552c812da622cb13910cb891a4293cb6058ff187d99fe8c8b12304",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-29eed704413a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-gateway.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-29eed704413a",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:437cb4b429552c812da622cb13910cb891a4293cb6058ff187d99fe8c8b12304"
}
},
"dockerfileHash": "e032ee4186f4aca3aae491e81af9c9a12ad2d9e3a3bce942c34f52eb22aa5e36",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "3fed509f00ba3448138a999f51dad3d38b822bb4a5c152011e3e57526972fd41",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-29eed704413a",
"digest": "sha256:437cb4b429552c812da622cb13910cb891a4293cb6058ff187d99fe8c8b12304",
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a"
},
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a",
"publishState": "reused",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"profile": "v02",
"namespace": "hwlab-v02",
"commitId": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"sourceCommitId": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-29eed704413a",
"imageTag": "env-29eed704413a",
"digest": "sha256:5a4c87ca8c4ffa5962675fd17440cbea98f69d87ba585d7c42903c082ebe89cf",
"buildBackend": "reused-env-catalog",
"buildCreatedAt": "2026-06-07T13:28:35.225Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB@env:29eed704413ab110e86e67b091d23129218f6ae670942da8b89eec4ac38e32b9",
"componentCommitId": "1b87c3d672fcd748159e860521fc903d06c75ba0",
"componentInputHash": "26a48e0beb99dcc5bb7f581d64d74daf3a29bf79a4e1c1eecd175a90e98b6bb2",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-29eed704413a",
"environmentDigest": "sha256:5a4c87ca8c4ffa5962675fd17440cbea98f69d87ba585d7c42903c082ebe89cf",
"environmentInputHash": "d8b4dc03fbc87a2c842afe490c367f628ee5381a961ab7f66cbd280d3b05eb53",
"codeInputHash": "feaa7c30c37eb42248165bd2f574362dc91908d531d79f4211733b32929b1fa6",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:5a4c87ca8c4ffa5962675fd17440cbea98f69d87ba585d7c42903c082ebe89cf",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-29eed704413a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "1b76fb37602f2e266a17a6c5f9e2963b4ea85fde",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-29eed704413a",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:5a4c87ca8c4ffa5962675fd17440cbea98f69d87ba585d7c42903c082ebe89cf"
}
},
"dockerfileHash": "e032ee4186f4aca3aae491e81af9c9a12ad2d9e3a3bce942c34f52eb22aa5e36",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "8ff027eecc22049f7a368c9d01ccdcff523b860538d1c284d01068a67395f8e7",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-29eed704413a",
"digest": "sha256:5a4c87ca8c4ffa5962675fd17440cbea98f69d87ba585d7c42903c082ebe89cf",
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a"
},
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a",
"publishState": "reused",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null
},
{
"serviceId": "hwlab-agent-skills",
"profile": "v02",
"namespace": "hwlab-v02",
"commitId": "23c414834f37947642ebcbba99e6ea1296467bfd",
"sourceCommitId": "23c414834f37947642ebcbba99e6ea1296467bfd",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-29eed704413a",
"imageTag": "env-29eed704413a",
"digest": "sha256:c00120b98efc64ddc2f576816212b4b6af3303a4b8ff560a713a3f4627acd89f",
"buildBackend": "reused-env-catalog",
"buildCreatedAt": "2026-06-07T13:28:38.567Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB@env:29eed704413ab110e86e67b091d23129218f6ae670942da8b89eec4ac38e32b9",
"componentCommitId": "1b87c3d672fcd748159e860521fc903d06c75ba0",
"componentInputHash": "40b264f3134045dbfd16cc8d17cd963fa2d14e195875239f42bee932ccb30359",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-29eed704413a",
"environmentDigest": "sha256:c00120b98efc64ddc2f576816212b4b6af3303a4b8ff560a713a3f4627acd89f",
"environmentInputHash": "d8b4dc03fbc87a2c842afe490c367f628ee5381a961ab7f66cbd280d3b05eb53",
"codeInputHash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:c00120b98efc64ddc2f576816212b4b6af3303a4b8ff560a713a3f4627acd89f",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-29eed704413a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "23c414834f37947642ebcbba99e6ea1296467bfd",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-agent-skills.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-29eed704413a",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:c00120b98efc64ddc2f576816212b4b6af3303a4b8ff560a713a3f4627acd89f"
}
},
"dockerfileHash": "e032ee4186f4aca3aae491e81af9c9a12ad2d9e3a3bce942c34f52eb22aa5e36",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": false,
"ciReason": [
"component-inputs-unchanged"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-29eed704413a",
"digest": "sha256:c00120b98efc64ddc2f576816212b4b6af3303a4b8ff560a713a3f4627acd89f",
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a"
},
"reusedFrom": "f66969362589deee5651d0d9bbf17def2fac860cd26667d1c2c552a0324ffe0a",
"publishState": "reused",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 5,
"requiredServiceCount": 5,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
+421
View File
@@ -0,0 +1,421 @@
{
"catalogVersion": "v1",
"kind": "hwlab-artifact-catalog",
"environment": "v03",
"profile": "v03",
"namespace": "hwlab-v03",
"endpoint": "https://hwlab-v03.74-48-78-17.nip.io",
"commitId": "004235736f9168145885f1be57bd3c46fcb6ce6a",
"artifactState": "published",
"publish": {
"ciPublished": true,
"registryVerified": true,
"provenance": "node-ci-artifact:hwlab-v03-ci-poll-004235736f91-r20260612231613-collect",
"note": "Digest fields were copied from a successful DEV artifact publish report for this source commit."
},
"healthContract": {
"method": "GET",
"path": "/health/live",
"responseFormat": "json",
"requiredFields": [
"serviceId",
"environment",
"status"
]
},
"allowedProfiles": [
"v03"
],
"forbiddenProfiles": [
"dev",
"prod"
],
"services": [
{
"serviceId": "hwlab-cloud-api",
"commitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"sourceCommitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-9495896df918",
"imageTag": "env-9495896df918",
"digest": "sha256:bf29c6a72e12f599973c51da86cde12ae501fe7c998d95f1d3fde02e54be5ecb",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-12T20:30:18.880Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"buildBackend": "reused-env-catalog",
"componentCommitId": "56581a4373ef4273583e26e9938112f15fea15d6",
"componentInputHash": "1939c4413344bc1d0c5398d776da55975eb179319ed1b81044ef288b27d1e043",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-9495896df918",
"environmentDigest": "sha256:bf29c6a72e12f599973c51da86cde12ae501fe7c998d95f1d3fde02e54be5ecb",
"environmentInputHash": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"codeInputHash": "e2d48031bdb318a3bf175c7eb33c62963c94aaebe20d15445b3a4690bfb2530e",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:bf29c6a72e12f599973c51da86cde12ae501fe7c998d95f1d3fde02e54be5ecb",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-9495896df918",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-cloud-api.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f3e0ad796126da7a7721b538936c971b824c2486",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-api.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-9495896df918",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:bf29c6a72e12f599973c51da86cde12ae501fe7c998d95f1d3fde02e54be5ecb"
}
},
"dockerfileHash": "8afe1495d940b8cb05311beb02338e593346bc0af39bd97cc752fd5d8345bded",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "445d32282d642d5089290ffe5f621ccea3206cf1d9f11b24091f82a4434cbcd5",
"ciAffected": false,
"ciReason": [
"gitops-only-no-image-build"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-9495896df918",
"digest": "sha256:bf29c6a72e12f599973c51da86cde12ae501fe7c998d95f1d3fde02e54be5ecb",
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
{
"serviceId": "hwlab-cloud-web",
"commitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"sourceCommitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-9495896df918",
"imageTag": "env-9495896df918",
"digest": "sha256:eadedd8ea91fe0ab9d4b29b588a14906e52082c618d326954e7cc83b3da99b77",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-12T20:30:23.693Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"buildBackend": "reused-env-catalog",
"componentCommitId": "56581a4373ef4273583e26e9938112f15fea15d6",
"componentInputHash": "2222ac86ab645ddbf375d46f48b76625914cad5e6d2c3b2d0d51ca2cbc7ac16c",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-9495896df918",
"environmentDigest": "sha256:eadedd8ea91fe0ab9d4b29b588a14906e52082c618d326954e7cc83b3da99b77",
"environmentInputHash": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"codeInputHash": "fc88b16995fd65a887e8840762cfa656058fc4f5a8f099ec7762354b70918985",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:eadedd8ea91fe0ab9d4b29b588a14906e52082c618d326954e7cc83b3da99b77",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-9495896df918",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-cloud-web.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f3e0ad796126da7a7721b538936c971b824c2486",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-cloud-web.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-9495896df918",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:eadedd8ea91fe0ab9d4b29b588a14906e52082c618d326954e7cc83b3da99b77"
}
},
"dockerfileHash": "8afe1495d940b8cb05311beb02338e593346bc0af39bd97cc752fd5d8345bded",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "39effb18af665e5e286cca9f84ef2a30f577ad11c9acca098589b7ee37f6950c",
"ciAffected": false,
"ciReason": [
"gitops-only-no-image-build"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-web-env:env-9495896df918",
"digest": "sha256:eadedd8ea91fe0ab9d4b29b588a14906e52082c618d326954e7cc83b3da99b77",
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
{
"serviceId": "hwlab-gateway",
"commitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"sourceCommitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-9495896df918",
"imageTag": "env-9495896df918",
"digest": "sha256:e9b1dfdf18605498917a34dd0c71c6d5d1b91ef4ae073c5c21e2d5480b63abc8",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-12T20:30:18.928Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"buildBackend": "reused-env-catalog",
"componentCommitId": "56581a4373ef4273583e26e9938112f15fea15d6",
"componentInputHash": "5bce8935993559e2e6516171fe8fab213eb288e4a7de7337473e74fa13b687b9",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-9495896df918",
"environmentDigest": "sha256:e9b1dfdf18605498917a34dd0c71c6d5d1b91ef4ae073c5c21e2d5480b63abc8",
"environmentInputHash": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"codeInputHash": "9693556c71091e3e85d61efc6ef7d62e1064fba145ec83b3b9c196477f0b2870",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:e9b1dfdf18605498917a34dd0c71c6d5d1b91ef4ae073c5c21e2d5480b63abc8",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-9495896df918",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-gateway.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f3e0ad796126da7a7721b538936c971b824c2486",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-gateway.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-9495896df918",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:e9b1dfdf18605498917a34dd0c71c6d5d1b91ef4ae073c5c21e2d5480b63abc8"
}
},
"dockerfileHash": "8afe1495d940b8cb05311beb02338e593346bc0af39bd97cc752fd5d8345bded",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "3fed509f00ba3448138a999f51dad3d38b822bb4a5c152011e3e57526972fd41",
"ciAffected": false,
"ciReason": [
"gitops-only-no-image-build"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-gateway-env:env-9495896df918",
"digest": "sha256:e9b1dfdf18605498917a34dd0c71c6d5d1b91ef4ae073c5c21e2d5480b63abc8",
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
{
"serviceId": "hwlab-edge-proxy",
"commitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"sourceCommitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-9495896df918",
"imageTag": "env-9495896df918",
"digest": "sha256:07e80adfbe753d88fb4037c21623badb7dad0d0c640121d16798ec121af06aa7",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-12T20:30:19.877Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"buildBackend": "reused-env-catalog",
"componentCommitId": "56581a4373ef4273583e26e9938112f15fea15d6",
"componentInputHash": "c0868e6f94cc7ddc1169bfccff149ced4d1db11ae64a58aefc570123e03a4f1d",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-9495896df918",
"environmentDigest": "sha256:07e80adfbe753d88fb4037c21623badb7dad0d0c640121d16798ec121af06aa7",
"environmentInputHash": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"codeInputHash": "feaa7c30c37eb42248165bd2f574362dc91908d531d79f4211733b32929b1fa6",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:07e80adfbe753d88fb4037c21623badb7dad0d0c640121d16798ec121af06aa7",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-9495896df918",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f3e0ad796126da7a7721b538936c971b824c2486",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-edge-proxy.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-9495896df918",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:07e80adfbe753d88fb4037c21623badb7dad0d0c640121d16798ec121af06aa7"
}
},
"dockerfileHash": "8afe1495d940b8cb05311beb02338e593346bc0af39bd97cc752fd5d8345bded",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "8ff027eecc22049f7a368c9d01ccdcff523b860538d1c284d01068a67395f8e7",
"ciAffected": false,
"ciReason": [
"gitops-only-no-image-build"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-edge-proxy-env:env-9495896df918",
"digest": "sha256:07e80adfbe753d88fb4037c21623badb7dad0d0c640121d16798ec121af06aa7",
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
{
"serviceId": "hwlab-agent-skills",
"commitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"sourceCommitId": "f3e0ad796126da7a7721b538936c971b824c2486",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-9495896df918",
"imageTag": "env-9495896df918",
"digest": "sha256:ca8137d03351c8f9fd32a6b73ffec321a168c6af23d4d2503b5129906dd42480",
"publishState": "reused",
"profile": "v03",
"namespace": "hwlab-v03",
"healthPath": "/health/live",
"sourceState": "source-present",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"notPublishedReason": null,
"buildCreatedAt": "2026-06-12T20:30:19.907Z",
"buildSource": "git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB@env:9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"buildBackend": "reused-env-catalog",
"componentCommitId": "56581a4373ef4273583e26e9938112f15fea15d6",
"componentInputHash": "c65de456af26be9fe655c549fbbd2070d8bcc7fcf227d1c6f8b94b10df18c42d",
"runtimeMode": "env-reuse-git-mirror-checkout",
"envReuse": true,
"envChanged": false,
"codeChanged": false,
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-9495896df918",
"environmentDigest": "sha256:ca8137d03351c8f9fd32a6b73ffec321a168c6af23d4d2503b5129906dd42480",
"environmentInputHash": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a",
"codeInputHash": "369ca524ae4010fb5d9adfd30b4290808a035804b4674755bc193fee743f3d5a",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"bootEnvEvidence": {
"runtimeMode": "env-reuse-git-mirror-checkout",
"environmentDigest": "sha256:ca8137d03351c8f9fd32a6b73ffec321a168c6af23d4d2503b5129906dd42480",
"environmentImage": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-9495896df918",
"bootRepo": "git@github.com:pikasTech/HWLAB.git",
"bootCommit": "f3e0ad796126da7a7721b538936c971b824c2486",
"bootSh": "deploy/runtime/boot/hwlab-agent-skills.sh",
"env": {
"HWLAB_BOOT_REPO": "git@github.com:pikasTech/HWLAB.git",
"HWLAB_BOOT_COMMIT": "f3e0ad796126da7a7721b538936c971b824c2486",
"HWLAB_BOOT_SH": "deploy/runtime/boot/hwlab-agent-skills.sh",
"HWLAB_ENVIRONMENT_IMAGE": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-9495896df918",
"HWLAB_ENVIRONMENT_DIGEST": "sha256:ca8137d03351c8f9fd32a6b73ffec321a168c6af23d4d2503b5129906dd42480"
}
},
"dockerfileHash": "8afe1495d940b8cb05311beb02338e593346bc0af39bd97cc752fd5d8345bded",
"baseImageReference": "127.0.0.1:5000/hwlab/hwlab-node20-base:20-bookworm-slim",
"baseImageDigest": null,
"buildArgsHash": "d5e50a18e70c6a8b4896e527fa07b5dd2c85458ed9ef512c1d46775ef4e40a10",
"ciAffected": false,
"ciReason": [
"gitops-only-no-image-build"
],
"reuse": {
"status": "ready",
"image": "127.0.0.1:5000/hwlab/hwlab-agent-skills-env:env-9495896df918",
"digest": "sha256:ca8137d03351c8f9fd32a6b73ffec321a168c6af23d4d2503b5129906dd42480",
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
},
"reusedFrom": "9495896df9181f06492b0a0f8673eb5dd7e951b756e66e35bda0fd101a14e74a"
}
],
"serviceInventory": {
"version": "v2",
"serviceCount": 5,
"requiredServiceCount": 5,
"disabledServiceCount": 0,
"requiredServiceIds": [
"hwlab-cloud-api",
"hwlab-cloud-web",
"hwlab-gateway",
"hwlab-edge-proxy",
"hwlab-agent-skills"
],
"disabledServiceIds": [],
"services": [
{
"serviceId": "hwlab-cloud-api",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-cloud-api/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-cloud-web",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "cloud-web",
"implementationState": "static-web-wrapper",
"sourceState": "source-present",
"entrypoint": "web/hwlab-cloud-web/index.html",
"disabledReason": null
},
{
"serviceId": "hwlab-gateway",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-gateway/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-edge-proxy",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "bun-command",
"implementationState": "repo-entrypoint",
"sourceState": "source-present",
"entrypoint": "cmd/hwlab-edge-proxy/main.ts",
"disabledReason": null
},
{
"serviceId": "hwlab-agent-skills",
"publishEnabled": true,
"artifactRequired": true,
"artifactScope": "required",
"runtimeKind": "skills-bundle",
"implementationState": "repo-bundle",
"sourceState": "source-present",
"entrypoint": "skills/hwlab-agent-runtime/SKILL.md",
"disabledReason": null
}
]
}
}
-16
View File
@@ -1,16 +0,0 @@
ARG CI_TOOLS_BASE_IMAGE=127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-v1
ARG BUN_IMAGE=oven/bun:1.3.13-alpine
FROM ${BUN_IMAGE} AS bun-runtime
FROM ${CI_TOOLS_BASE_IMAGE}
COPY --from=bun-runtime /usr/local/bin/bun /usr/local/bin/bun
COPY --from=bun-runtime /usr/local/bin/bunx /usr/local/bin/bunx
RUN node --version \
&& npm --version \
&& bun --version \
&& git --version \
&& python3 --version \
&& docker --version \
&& ssh -V
File diff suppressed because it is too large Load Diff
-1241
View File
File diff suppressed because it is too large Load Diff
-1
View File
@@ -1 +0,0 @@
-40
View File
@@ -1,40 +0,0 @@
# FRP DEV Contract
The DEV reverse link is D601 to master edge through frp.
- Public API/edge endpoint: `http://74.48.78.17:16667`
- Public browser endpoint: `http://74.48.78.17:16666`
- `hwlab-cloud-web` owns the public browser entry on port `16666`.
- `hwlab-edge-proxy` owns public API/health ingress on port `16667`.
- `frps.dev.toml` reserves D601 `16666` / `16667`, G14 DEV `17666` / `17667`, and G14 PROD `18666` / `18667`
as TCP `remotePort` values; do not also bind them as `vhostHTTPPort`, because that collides with
the DEV TCP proxy.
- `deploy/deploy.yaml` is the source for the public endpoints and FRP proxy
mapping. Run `node scripts/deploy-contract-plan.mjs --check` to detect drift
such as public `6666`/`6667` reuse before any future apply command.
- No secret values are stored in this repository. Operators must provide auth
material out of band before a real deployment.
- UniDesk backend, provider-gateway, and microservice proxy are not HWLAB runtime
substitutes.
## G14 public preview
G14 uses separate preview port ranges and must not reuse D601's `16666` / `16667`:
- G14 DEV browser endpoint: `http://74.48.78.17:17666`
- G14 DEV API/edge endpoint: `http://74.48.78.17:17667`
- G14 DEV frpc proxy names: `hwlab-node-cloud-web` and `hwlab-node-edge-proxy`
- G14 DEV k3s Deployment: `hwlab-dev/hwlab-node-frpc`, generated by `scripts/gitops-render.mjs`
- G14 PROD browser endpoint: `http://74.48.78.17:18666`
- G14 PROD API/edge endpoint: `http://74.48.78.17:18667`
- G14 PROD frpc proxy names: `hwlab-node-prod-cloud-web` and `hwlab-node-prod-edge-proxy`
- G14 PROD k3s Deployment: `hwlab-prod/hwlab-node-prod-frpc`, generated by `scripts/gitops-render.mjs`
- Master frps allow-list template: `deploy/frp/frps.dev.toml`
- G14 DEV frpc local template: `deploy/frp/frpc.node-dev.toml`
- G14 PROD frpc local template: `deploy/frp/frpc.node-prod.toml`
Only `hwlab-cloud-web:8080` and `hwlab-edge-proxy:6667` are exposed through FRP.
Internal services, Tekton, Argo CD, registry, and database stay ClusterIP-only.
The master-side `/opt/hwlab-frp/frps.dev.toml` and active `/etc/frp/frps.toml` may need a manual allow-list update matching `deploy/frp/frps.dev.toml` before
the G14 frpc Deployments can register `17666` / `17667` and `18666` / `18667`; this is an edge operation, not a D601
client change.
-17
View File
@@ -1,17 +0,0 @@
serverAddr = "74.48.78.17"
serverPort = 7000
loginFailExit = true
[[proxies]]
name = "hwlab-dev-cloud-web"
type = "tcp"
localIP = "hwlab-cloud-web.hwlab-dev.svc.cluster.local"
localPort = 8080
remotePort = 16666
[[proxies]]
name = "hwlab-dev-edge-proxy"
type = "tcp"
localIP = "hwlab-edge-proxy.hwlab-dev.svc.cluster.local"
localPort = 6667
remotePort = 16667
-17
View File
@@ -1,17 +0,0 @@
serverAddr = "74.48.78.17"
serverPort = 7000
loginFailExit = true
[[proxies]]
name = "hwlab-node-cloud-web"
type = "tcp"
localIP = "hwlab-cloud-web.hwlab-dev.svc.cluster.local"
localPort = 8080
remotePort = 17666
[[proxies]]
name = "hwlab-node-edge-proxy"
type = "tcp"
localIP = "hwlab-edge-proxy.hwlab-dev.svc.cluster.local"
localPort = 6667
remotePort = 17667
-17
View File
@@ -1,17 +0,0 @@
serverAddr = "74.48.78.17"
serverPort = 7000
loginFailExit = true
[[proxies]]
name = "hwlab-node-prod-cloud-web"
type = "tcp"
localIP = "hwlab-cloud-web.hwlab-prod.svc.cluster.local"
localPort = 8080
remotePort = 18666
[[proxies]]
name = "hwlab-node-prod-edge-proxy"
type = "tcp"
localIP = "hwlab-edge-proxy.hwlab-prod.svc.cluster.local"
localPort = 6667
remotePort = 18667
-41
View File
@@ -1,41 +0,0 @@
bindPort = 7000
[[allowPorts]]
start = 16666
end = 16666
[[allowPorts]]
start = 16667
end = 16667
[[allowPorts]]
start = 17666
end = 17666
[[allowPorts]]
start = 17667
end = 17667
[[allowPorts]]
start = 18666
end = 18666
[[allowPorts]]
start = 18667
end = 18667
[[allowPorts]]
start = 19666
end = 19666
[[allowPorts]]
start = 19667
end = 19667
[[allowPorts]]
start = 20666
end = 20666
[[allowPorts]]
start = 20667
end = 20667
@@ -0,0 +1,403 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-deepseek-proxy-config",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/monitoring": "enabled"
}
},
"data": {
"render-config.sh": "#!/bin/sh\nif [ -z \"${DEEPSEEK_API_KEY:-}\" ] && [ -z \"${OPENCODE_API_KEY:-}\" ]; then\n echo \"at least one of DEEPSEEK_API_KEY or OPENCODE_API_KEY is required\" >&2\n exit 1\nfi\ncat > /config/config.yml <<EOF\nmode: \"Transform\"\nlog:\n level: \"info\"\n format: \"text\"\nserver:\n addr: \"0.0.0.0:4001\"\npersistence:\n active_provider: db_sqlite\nextensions:\n db_sqlite:\n enabled: true\n config:\n path: /data/moonbridge.db\n wal: true\n busy_timeout_ms: 5000\n max_open_conns: 1\n metrics:\n enabled: true\n config:\n default_limit: 100\n max_limit: 1000\n deepseek_v4:\n config:\n reinforce_instructions: true\n reinforce_prompt: \"[System Reminder]: Please pay close attention to the system instructions, AGENTS.md files, and any other context provided. Follow them carefully and completely in your response.\\n[User]:\"\ncache:\n mode: \"explicit\"\n ttl: \"5m\"\n prompt_caching: true\n automatic_prompt_cache: false\n explicit_cache_breakpoints: true\n allow_retention_downgrade: false\n max_breakpoints: 4\n min_cache_tokens: 1024\n expected_reuse: 2\n minimum_value_score: 2048\n min_breakpoint_tokens: 1024\ndefaults:\n model: \"deepseek-chat\"\n max_tokens: 8192\ntrace:\n enabled: false\nmodels:\n deepseek-chat:\n context_window: 128000\n max_output_tokens: 8192\n display_name: \"deepseek-chat\"\n description: \"DeepSeek via Moon Bridge\"\n default_reasoning_level: null\n supported_reasoning_levels: []\n extensions:\n deepseek_v4:\n enabled: true\n deepseek-v4-flash:\n context_window: 1000000\n max_output_tokens: 384000\n display_name: \"DeepSeek V4 Flash via OpenCode Zen Go\"\n description: \"DeepSeek V4 Flash through OpenCode Zen Go Chat Completions via Moon Bridge\"\n default_reasoning_level: \"xhigh\"\n supported_reasoning_levels:\n - effort: \"high\"\n description: \"High reasoning effort\"\n - effort: \"xhigh\"\n description: \"Maximum reasoning effort\"\n supports_reasoning_summaries: true\n default_reasoning_summary: \"auto\"\n extensions:\n deepseek_v4:\n enabled: true\nproviders:\n deepseek:\n base_url: \"https://api.deepseek.com/anthropic\"\n api_key: \"${DEEPSEEK_API_KEY}\"\n version: \"2023-06-01\"\n user_agent: \"moonbridge/1.0\"\n offers:\n - model: deepseek-chat\n opencode:\n base_url: \"https://opencode.ai/zen/go/v1\"\n api_key: \"${OPENCODE_API_KEY:-}\"\n protocol: \"openai-chat\"\n user_agent: \"moonbridge-dsflash-go/1.0\"\n web_search:\n support: \"disabled\"\n offers:\n - model: deepseek-v4-flash\nroutes:\n deepseek-chat:\n model: deepseek-chat\n provider: deepseek\n deepseek-v4-flash:\n model: deepseek-v4-flash\n provider: opencode\nEOF\n"
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "hwlab-deepseek-proxy",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/moonbridge-source-ref": "1b99888d3dae889b79ee602cb875c7907f7e76f2",
"hwlab.pikastech.local/bridge-service-id": "hwlab-cloud-api",
"hwlab.pikastech.local/source-commit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"hwlab.pikastech.local/bridge-source-commit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"hwlab.pikastech.local/bridge-image-tag": "env-29eed704413a",
"hwlab.pikastech.local/bridge-image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d",
"hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4",
"hwlab.pikastech.local/bridge-runtime-mode": "env-reuse-git-mirror-checkout",
"hwlab.pikastech.local/bridge-boot-repo": "git@github.com:pikasTech/HWLAB.git",
"hwlab.pikastech.local/bridge-boot-commit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"hwlab.pikastech.local/bridge-boot-sh": "deploy/runtime/boot/hwlab-deepseek-responses-bridge.sh",
"hwlab.pikastech.local/bridge-environment-digest": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy"
}
},
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy",
"hwlab.pikastech.local/source-commit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"hwlab.pikastech.local/monitoring": "enabled",
"hwlab.pikastech.local/bridge-source-commit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"hwlab.pikastech.local/bridge-runtime-mode": "env-reuse-git-mirror-checkout",
"hwlab.pikastech.local/bridge-boot-commit": "23c414834f37947642ebcbba99e6ea1296467bfd"
},
"annotations": {
"hwlab.pikastech.local/bridge-service-id": "hwlab-cloud-api",
"hwlab.pikastech.local/source-commit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"hwlab.pikastech.local/bridge-source-commit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"hwlab.pikastech.local/bridge-image-tag": "env-29eed704413a",
"hwlab.pikastech.local/bridge-image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d",
"hwlab.pikastech.local/metrics-sidecar-sha256": "782e26256b5a5cddff52a165a0eb5f852973eee1aac1b19acac4a313db7968f4",
"hwlab.pikastech.local/bridge-runtime-mode": "env-reuse-git-mirror-checkout",
"hwlab.pikastech.local/bridge-boot-repo": "git@github.com:pikasTech/HWLAB.git",
"hwlab.pikastech.local/bridge-boot-commit": "23c414834f37947642ebcbba99e6ea1296467bfd",
"hwlab.pikastech.local/bridge-boot-sh": "deploy/runtime/boot/hwlab-deepseek-responses-bridge.sh",
"hwlab.pikastech.local/bridge-environment-digest": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d"
}
},
"spec": {
"initContainers": [
{
"name": "moonbridge-config",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d",
"imagePullPolicy": "IfNotPresent",
"command": [
"/bin/sh",
"-eu",
"/scripts/render-config.sh"
],
"env": [
{
"name": "DEEPSEEK_API_KEY",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v02-code-agent-provider",
"key": "openai-api-key",
"optional": true
}
}
},
{
"name": "OPENCODE_API_KEY",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v02-code-agent-provider",
"key": "opencode-api-key",
"optional": true
}
}
}
],
"volumeMounts": [
{
"name": "moonbridge-scripts",
"mountPath": "/scripts",
"readOnly": true
},
{
"name": "moonbridge-config",
"mountPath": "/config"
}
]
}
],
"containers": [
{
"name": "responses-bridge",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d",
"imagePullPolicy": "IfNotPresent",
"env": [
{
"name": "PORT",
"value": "4000"
},
{
"name": "HWLAB_COMMIT_ID",
"value": "23c414834f37947642ebcbba99e6ea1296467bfd"
},
{
"name": "HWLAB_IMAGE",
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d"
},
{
"name": "HWLAB_IMAGE_TAG",
"value": "env-29eed704413a"
},
{
"name": "HWLAB_DEEPSEEK_BRIDGE_UPSTREAM",
"value": "http://127.0.0.1:4001"
},
{
"name": "HWLAB_DEEPSEEK_BRIDGE_MODEL",
"value": "deepseek-chat"
},
{
"name": "HWLAB_RUNTIME_MODE",
"value": "env-reuse-git-mirror-checkout"
},
{
"name": "HWLAB_BOOT_REPO",
"value": "git@github.com:pikasTech/HWLAB.git"
},
{
"name": "HWLAB_BOOT_COMMIT",
"value": "23c414834f37947642ebcbba99e6ea1296467bfd"
},
{
"name": "HWLAB_BOOT_REF",
"value": "v0.2"
},
{
"name": "HWLAB_BOOT_SH",
"value": "deploy/runtime/boot/hwlab-deepseek-responses-bridge.sh"
},
{
"name": "HWLAB_BOOT_READ_URL",
"value": "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git"
},
{
"name": "HWLAB_ENVIRONMENT_IMAGE",
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-29eed704413a"
},
{
"name": "HWLAB_ENVIRONMENT_DIGEST",
"value": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d"
},
{
"name": "HWLAB_ENVIRONMENT_INPUT_HASH",
"value": "d8b4dc03fbc87a2c842afe490c367f628ee5381a961ab7f66cbd280d3b05eb53"
},
{
"name": "HWLAB_CODE_INPUT_HASH",
"value": "f63a609ea884a985e3b576af7bfe2eddcfb0e006be023c76450e024a3b1fd737"
},
{
"name": "HWLAB_IMAGE_DIGEST",
"value": "sha256:964f9e1ddc74a0a4d5cf6fcdb8f16b6fc59ae229fc6e8f815db514a6a3fb038d"
}
],
"ports": [
{
"name": "http",
"containerPort": 4000
}
],
"readinessProbe": {
"httpGet": {
"path": "/health/readiness",
"port": "http"
},
"initialDelaySeconds": 10,
"periodSeconds": 10
},
"livenessProbe": {
"httpGet": {
"path": "/health/liveliness",
"port": "http"
},
"initialDelaySeconds": 20,
"periodSeconds": 20
}
},
{
"name": "moonbridge",
"image": "127.0.0.1:5000/hwlab/moonbridge:1b99888d3dae",
"imagePullPolicy": "IfNotPresent",
"args": [
"-config",
"/config/config.yml"
],
"ports": [
{
"name": "moonbridge-http",
"containerPort": 4001
}
],
"readinessProbe": {
"httpGet": {
"path": "/v1/models",
"port": "moonbridge-http"
},
"initialDelaySeconds": 10,
"periodSeconds": 10
},
"livenessProbe": {
"httpGet": {
"path": "/v1/models",
"port": "moonbridge-http"
},
"initialDelaySeconds": 20,
"periodSeconds": 20
},
"volumeMounts": [
{
"name": "moonbridge-config",
"mountPath": "/config",
"readOnly": true
},
{
"name": "moonbridge-data",
"mountPath": "/data"
}
]
},
{
"name": "hwlab-metrics",
"image": "127.0.0.1:5000/hwlab/hwlab-ci-node-tools:node22-alpine-bun-v1",
"imagePullPolicy": "IfNotPresent",
"command": [
"node",
"/metrics/metrics-sidecar.mjs"
],
"env": [
{
"name": "HWLAB_METRICS_SERVICE_ID",
"value": "hwlab-deepseek-proxy"
},
{
"name": "HWLAB_METRICS_NAMESPACE",
"value": "hwlab-v02"
},
{
"name": "HWLAB_METRICS_GITOPS_TARGET",
"value": "v02"
},
{
"name": "HWLAB_METRICS_PORT",
"value": "9100"
},
{
"name": "HWLAB_METRICS_TARGET_URL",
"value": "http://127.0.0.1:4000/health/live"
},
{
"name": "HWLAB_METRICS_TARGET_TIMEOUT_MS",
"value": "2000"
}
],
"ports": [
{
"name": "metrics",
"containerPort": 9100
}
],
"readinessProbe": {
"httpGet": {
"path": "/health/live",
"port": "metrics"
},
"initialDelaySeconds": 3,
"periodSeconds": 10
},
"livenessProbe": {
"httpGet": {
"path": "/health/live",
"port": "metrics"
},
"initialDelaySeconds": 10,
"periodSeconds": 20
},
"volumeMounts": [
{
"name": "hwlab-metrics-sidecar",
"mountPath": "/metrics",
"readOnly": true
}
]
}
],
"volumes": [
{
"name": "moonbridge-scripts",
"configMap": {
"name": "hwlab-deepseek-proxy-config"
}
},
{
"name": "moonbridge-config",
"emptyDir": {}
},
{
"name": "moonbridge-data",
"emptyDir": {}
},
{
"name": "hwlab-metrics-sidecar",
"configMap": {
"name": "hwlab-v02-metrics-sidecar"
}
}
]
}
}
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-deepseek-proxy",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/monitoring": "enabled"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy"
},
"ports": [
{
"name": "http",
"port": 4000,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
}
]
}
@@ -0,0 +1,94 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v02-frpc-config",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-v02-frpc",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867"
}
},
"data": {
"frpc.toml": "serverAddr = \"74.48.78.17\"\nserverPort = 7000\nloginFailExit = true\n\n[[proxies]]\nname = \"hwlab-v02-cloud-web\"\ntype = \"tcp\"\nlocalIP = \"hwlab-cloud-web.hwlab-v02.svc.cluster.local\"\nlocalPort = 8080\nremotePort = 19666\n\n[[proxies]]\nname = \"hwlab-v02-edge-proxy\"\ntype = \"tcp\"\nlocalIP = \"hwlab-edge-proxy.hwlab-v02.svc.cluster.local\"\nlocalPort = 6667\nremotePort = 19667\n"
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "hwlab-v02-frpc",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-v02-frpc",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-v02-frpc"
}
},
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-v02-frpc",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/config-sha256": "7e9f9fc98a39da1f"
},
"annotations": {
"hwlab.pikastech.local/config-sha256": "7e9f9fc98a39da1f6b01cefb25138365e1869e8e835a5a9bde1fdf2fd2c990c9"
}
},
"spec": {
"hostNetwork": true,
"dnsPolicy": "ClusterFirstWithHostNet",
"containers": [
{
"name": "frpc",
"image": "fatedier/frpc:v0.68.1",
"imagePullPolicy": "IfNotPresent",
"args": [
"-c",
"/etc/frp/frpc.toml"
],
"volumeMounts": [
{
"name": "config",
"mountPath": "/etc/frp",
"readOnly": true
}
]
}
],
"volumes": [
{
"name": "config",
"configMap": {
"name": "hwlab-v02-frpc-config"
}
}
]
}
}
}
}
]
}
@@ -0,0 +1,27 @@
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v02-health-contract",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-v02-health-contract",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/environment": "v02"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"data": {
"endpoint": "https://hwlab.74-48-78-17.nip.io",
"cloud-api": "GET /health/live through https://hwlab.74-48-78-17.nip.io",
"cloud-api-db": "DEV DB config gate requires HWLAB_CLOUD_DB_URL from Secret hwlab-cloud-api-dev-db/database-url and HWLAB_CLOUD_DB_SSL_MODE=disable. Runtime readiness dials the redacted host parsed from the Secret URL and reports endpointSource=secret-url-host. cloud-api-db is an optional desired alias only until this repo owns Service plus Endpoint or EndpointSlice manifests and rollout/apply contract; health reports env presence, env injection, redacted connection attempt/result, and liveConnected without exposing secret values",
"cloud-web": "GET /health/live on https://hwlab.74-48-78-17.nip.io; consumes cloud-api only",
"agent": "hwlab-cloud-api authorizes Code Agent sessions and dispatches execution to AgentRun v0.1; no HWLAB-owned agent manager/worker service is deployed",
"edge-proxy": "hwlab-edge-proxy:6667 exposes /health/live and proxies DEV endpoint traffic to hwlab-cloud-api",
"runtime-substitute-policy": "Do not replace HWLAB runtime with UniDesk backend, provider-gateway, or microservice proxy"
}
}
@@ -0,0 +1,16 @@
{
"apiVersion": "kustomize.config.k8s.io/v1beta1",
"kind": "Kustomization",
"namespace": "hwlab-v02",
"resources": [
"namespace.yaml",
"services.yaml",
"health-contract.yaml",
"workloads.yaml",
"deepseek-proxy.yaml",
"postgres.yaml",
"openfga.yaml",
"observability.yaml",
"g14-frpc.yaml"
]
}
@@ -0,0 +1,17 @@
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"name": "hwlab-v02",
"labels": {
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/environment": "v02"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
}
}
File diff suppressed because one or more lines are too long
+275
View File
@@ -0,0 +1,275 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "batch/v1",
"kind": "Job",
"metadata": {
"name": "hwlab-openfga-migrate",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs",
"argocd.argoproj.io/hook": "PreSync",
"argocd.argoproj.io/hook-delete-policy": "BeforeHookCreation,HookSucceeded"
}
},
"spec": {
"backoffLimit": 3,
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"restartPolicy": "OnFailure",
"containers": [
{
"name": "openfga-migrate",
"image": "127.0.0.1:5000/hwlab/openfga:v1.17.0",
"imagePullPolicy": "IfNotPresent",
"args": [
"migrate"
],
"env": [
{
"name": "OPENFGA_DATASTORE_ENGINE",
"value": "postgres"
},
{
"name": "OPENFGA_DATASTORE_URI",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v02-openfga",
"key": "datastore-uri"
}
}
},
{
"name": "OPENFGA_AUTHN_METHOD",
"value": "preshared"
},
{
"name": "OPENFGA_AUTHN_PRESHARED_KEYS",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v02-openfga",
"key": "authn-preshared-key"
}
}
},
{
"name": "OPENFGA_PLAYGROUND_ENABLED",
"value": "false"
},
{
"name": "OPENFGA_HTTP_ADDR",
"value": "0.0.0.0:8080"
},
{
"name": "OPENFGA_GRPC_ADDR",
"value": "0.0.0.0:8081"
}
]
}
]
}
}
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "hwlab-openfga",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-openfga"
}
},
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"containers": [
{
"name": "openfga",
"image": "127.0.0.1:5000/hwlab/openfga:v1.17.0",
"imagePullPolicy": "IfNotPresent",
"args": [
"run"
],
"env": [
{
"name": "OPENFGA_DATASTORE_ENGINE",
"value": "postgres"
},
{
"name": "OPENFGA_DATASTORE_URI",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v02-openfga",
"key": "datastore-uri"
}
}
},
{
"name": "OPENFGA_AUTHN_METHOD",
"value": "preshared"
},
{
"name": "OPENFGA_AUTHN_PRESHARED_KEYS",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v02-openfga",
"key": "authn-preshared-key"
}
}
},
{
"name": "OPENFGA_PLAYGROUND_ENABLED",
"value": "false"
},
{
"name": "OPENFGA_HTTP_ADDR",
"value": "0.0.0.0:8080"
},
{
"name": "OPENFGA_GRPC_ADDR",
"value": "0.0.0.0:8081"
}
],
"ports": [
{
"name": "http",
"containerPort": 8080
},
{
"name": "grpc",
"containerPort": 8081
}
],
"readinessProbe": {
"httpGet": {
"path": "/healthz",
"port": "http"
},
"initialDelaySeconds": 3,
"periodSeconds": 10
},
"livenessProbe": {
"httpGet": {
"path": "/healthz",
"port": "http"
},
"initialDelaySeconds": 15,
"periodSeconds": 20
},
"resources": {
"requests": {
"cpu": "50m",
"memory": "128Mi"
},
"limits": {
"cpu": "500m",
"memory": "512Mi"
}
}
}
]
}
}
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-openfga",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-openfga"
},
"ports": [
{
"name": "http",
"port": 8080,
"targetPort": "http"
},
{
"name": "grpc",
"port": 8081,
"targetPort": "grpc"
}
]
}
}
]
}
File diff suppressed because one or more lines are too long
+191
View File
@@ -0,0 +1,191 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-cloud-api",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-cloud-api",
"hwlab.pikastech.local/service-id": "hwlab-cloud-api",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-cloud-api"
},
"ports": [
{
"name": "http",
"port": 6667,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-cloud-web",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-cloud-web",
"hwlab.pikastech.local/service-id": "hwlab-cloud-web",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-cloud-web"
},
"ports": [
{
"name": "http",
"port": 8080,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-gateway",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-gateway",
"hwlab.pikastech.local/service-id": "hwlab-gateway",
"hwlab.pikastech.local/activation": "manual",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/profile": "v02"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-gateway"
},
"ports": [
{
"name": "http",
"port": 7001,
"targetPort": "http"
}
]
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-agent-skills",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-agent-skills",
"hwlab.pikastech.local/service-id": "hwlab-agent-skills",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-agent-skills"
},
"ports": [
{
"name": "http",
"port": 7430,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-edge-proxy",
"namespace": "hwlab-v02",
"labels": {
"app.kubernetes.io/name": "hwlab-edge-proxy",
"hwlab.pikastech.local/service-id": "hwlab-edge-proxy",
"hwlab.pikastech.local/gitops-target": "v02",
"hwlab.pikastech.local/source-commit": "34ee9472857ab43c77d8d302101bfa0580c27867",
"hwlab.pikastech.local/environment": "v02",
"hwlab.pikastech.local/profile": "v02",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-edge-proxy"
},
"ports": [
{
"name": "http",
"port": 6667,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
}
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,271 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-deepseek-proxy-config",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
}
},
"data": {
"render-config.sh": "#!/bin/sh\nif [ -z \"${DEEPSEEK_API_KEY:-}\" ] && [ -z \"${OPENCODE_API_KEY:-}\" ]; then\n echo \"at least one of DEEPSEEK_API_KEY or OPENCODE_API_KEY is required\" >&2\n exit 1\nfi\ncat > /config/config.yml <<EOF\nmode: \"Transform\"\nlog:\n level: \"info\"\n format: \"text\"\nserver:\n addr: \"0.0.0.0:4001\"\npersistence:\n active_provider: db_sqlite\nextensions:\n db_sqlite:\n enabled: true\n config:\n path: /data/moonbridge.db\n wal: true\n busy_timeout_ms: 5000\n max_open_conns: 1\n metrics:\n enabled: true\n config:\n default_limit: 100\n max_limit: 1000\n deepseek_v4:\n config:\n reinforce_instructions: true\n reinforce_prompt: \"[System Reminder]: Please pay close attention to the system instructions, AGENTS.md files, and any other context provided. Follow them carefully and completely in your response.\\n[User]:\"\ncache:\n mode: \"explicit\"\n ttl: \"5m\"\n prompt_caching: true\n automatic_prompt_cache: false\n explicit_cache_breakpoints: true\n allow_retention_downgrade: false\n max_breakpoints: 4\n min_cache_tokens: 1024\n expected_reuse: 2\n minimum_value_score: 2048\n min_breakpoint_tokens: 1024\ndefaults:\n model: \"deepseek-chat\"\n max_tokens: 8192\ntrace:\n enabled: false\nmodels:\n deepseek-chat:\n context_window: 128000\n max_output_tokens: 8192\n display_name: \"deepseek-chat\"\n description: \"DeepSeek via Moon Bridge\"\n default_reasoning_level: null\n supported_reasoning_levels: []\n extensions:\n deepseek_v4:\n enabled: true\n deepseek-v4-flash:\n context_window: 1000000\n max_output_tokens: 384000\n display_name: \"DeepSeek V4 Flash via OpenCode Zen Go\"\n description: \"DeepSeek V4 Flash through OpenCode Zen Go Chat Completions via Moon Bridge\"\n default_reasoning_level: \"xhigh\"\n supported_reasoning_levels:\n - effort: \"high\"\n description: \"High reasoning effort\"\n - effort: \"xhigh\"\n description: \"Maximum reasoning effort\"\n supports_reasoning_summaries: true\n default_reasoning_summary: \"auto\"\n extensions:\n deepseek_v4:\n enabled: true\nproviders:\n deepseek:\n base_url: \"https://api.deepseek.com/anthropic\"\n api_key: \"${DEEPSEEK_API_KEY}\"\n version: \"2023-06-01\"\n user_agent: \"moonbridge/1.0\"\n offers:\n - model: deepseek-chat\n opencode:\n base_url: \"https://opencode.ai/zen/go/v1\"\n api_key: \"${OPENCODE_API_KEY:-}\"\n protocol: \"openai-chat\"\n user_agent: \"moonbridge-dsflash-go/1.0\"\n web_search:\n support: \"disabled\"\n offers:\n - model: deepseek-v4-flash\nroutes:\n deepseek-chat:\n model: deepseek-chat\n provider: deepseek\n deepseek-v4-flash:\n model: deepseek-v4-flash\n provider: opencode\nEOF\n"
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "hwlab-deepseek-proxy",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
},
"annotations": {
"hwlab.pikastech.local/moonbridge-source-ref": "1b99888d3dae889b79ee602cb875c7907f7e76f2",
"hwlab.pikastech.local/bridge-service-id": "hwlab-cloud-api",
"hwlab.pikastech.local/source-commit": "e06f348dcad9f0d8de858e93c713e6bb6db3c59a",
"hwlab.pikastech.local/bridge-source-commit": "e06f348dcad9f0d8de858e93c713e6bb6db3c59a",
"hwlab.pikastech.local/bridge-image-tag": "env-3c30125770a1",
"hwlab.pikastech.local/bridge-image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3c30125770a1"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy"
}
},
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy",
"hwlab.pikastech.local/source-commit": "e06f348dcad9f0d8de858e93c713e6bb6db3c59a",
"hwlab.pikastech.local/bridge-source-commit": "e06f348dcad9f0d8de858e93c713e6bb6db3c59a"
},
"annotations": {
"hwlab.pikastech.local/bridge-service-id": "hwlab-cloud-api",
"hwlab.pikastech.local/source-commit": "e06f348dcad9f0d8de858e93c713e6bb6db3c59a",
"hwlab.pikastech.local/bridge-source-commit": "e06f348dcad9f0d8de858e93c713e6bb6db3c59a",
"hwlab.pikastech.local/bridge-image-tag": "env-3c30125770a1",
"hwlab.pikastech.local/bridge-image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3c30125770a1"
}
},
"spec": {
"initContainers": [
{
"name": "moonbridge-config",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3c30125770a1",
"imagePullPolicy": "IfNotPresent",
"command": [
"/bin/sh",
"-eu",
"/scripts/render-config.sh"
],
"env": [
{
"name": "DEEPSEEK_API_KEY",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-code-agent-provider",
"key": "openai-api-key",
"optional": true
}
}
},
{
"name": "OPENCODE_API_KEY",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-code-agent-provider",
"key": "opencode-api-key",
"optional": true
}
}
}
],
"volumeMounts": [
{
"name": "moonbridge-scripts",
"mountPath": "/scripts",
"readOnly": true
},
{
"name": "moonbridge-config",
"mountPath": "/config"
}
]
}
],
"containers": [
{
"name": "responses-bridge",
"image": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3c30125770a1",
"imagePullPolicy": "IfNotPresent",
"command": [
"/usr/local/bin/bun",
"run",
"/app/cmd/hwlab-deepseek-responses-bridge/main.ts"
],
"env": [
{
"name": "PORT",
"value": "4000"
},
{
"name": "HWLAB_COMMIT_ID",
"value": "e06f348dcad9f0d8de858e93c713e6bb6db3c59a"
},
{
"name": "HWLAB_IMAGE",
"value": "127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-3c30125770a1"
},
{
"name": "HWLAB_IMAGE_TAG",
"value": "env-3c30125770a1"
},
{
"name": "HWLAB_DEEPSEEK_BRIDGE_UPSTREAM",
"value": "http://127.0.0.1:4001"
},
{
"name": "HWLAB_DEEPSEEK_BRIDGE_MODEL",
"value": "deepseek-chat"
}
],
"ports": [
{
"name": "http",
"containerPort": 4000
}
],
"readinessProbe": {
"httpGet": {
"path": "/health/readiness",
"port": "http"
},
"initialDelaySeconds": 10,
"periodSeconds": 10
},
"livenessProbe": {
"httpGet": {
"path": "/health/liveliness",
"port": "http"
},
"initialDelaySeconds": 20,
"periodSeconds": 20
}
},
{
"name": "moonbridge",
"image": "127.0.0.1:5000/hwlab/moonbridge:1b99888d3dae",
"imagePullPolicy": "IfNotPresent",
"args": [
"-config",
"/config/config.yml"
],
"ports": [
{
"name": "moonbridge-http",
"containerPort": 4001
}
],
"readinessProbe": {
"httpGet": {
"path": "/v1/models",
"port": "moonbridge-http"
},
"initialDelaySeconds": 10,
"periodSeconds": 10
},
"livenessProbe": {
"httpGet": {
"path": "/v1/models",
"port": "moonbridge-http"
},
"initialDelaySeconds": 20,
"periodSeconds": 20
},
"volumeMounts": [
{
"name": "moonbridge-config",
"mountPath": "/config",
"readOnly": true
},
{
"name": "moonbridge-data",
"mountPath": "/data"
}
]
}
],
"volumes": [
{
"name": "moonbridge-scripts",
"configMap": {
"name": "hwlab-deepseek-proxy-config"
}
},
{
"name": "moonbridge-config",
"emptyDir": {}
},
{
"name": "moonbridge-data",
"emptyDir": {}
}
]
}
}
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-deepseek-proxy",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/service-id": "hwlab-deepseek-proxy",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-deepseek-proxy"
},
"ports": [
{
"name": "http",
"port": 4000,
"targetPort": "http"
}
]
}
}
]
}
@@ -0,0 +1,94 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v03-frpc-config",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-v03-frpc",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
}
},
"data": {
"frpc.toml": "serverAddr = \"74.48.78.17\"\nserverPort = 7000\nloginFailExit = true\n\n[[proxies]]\nname = \"hwlab-v03-cloud-web\"\ntype = \"tcp\"\nlocalIP = \"hwlab-cloud-web.hwlab-v03.svc.cluster.local\"\nlocalPort = 8080\nremotePort = 19766\n\n[[proxies]]\nname = \"hwlab-v03-edge-proxy\"\ntype = \"tcp\"\nlocalIP = \"hwlab-edge-proxy.hwlab-v03.svc.cluster.local\"\nlocalPort = 6667\nremotePort = 19767\n"
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "hwlab-v03-frpc",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-v03-frpc",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-v03-frpc"
}
},
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-v03-frpc",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/config-sha256": "0db43d7d606fca86"
},
"annotations": {
"hwlab.pikastech.local/config-sha256": "0db43d7d606fca86cdf40231ac90f055c0024cad8fb0242a6c6b3f8295dbd76b"
}
},
"spec": {
"hostNetwork": true,
"dnsPolicy": "ClusterFirstWithHostNet",
"containers": [
{
"name": "frpc",
"image": "fatedier/frpc:v0.68.1",
"imagePullPolicy": "IfNotPresent",
"args": [
"-c",
"/etc/frp/frpc.toml"
],
"volumeMounts": [
{
"name": "config",
"mountPath": "/etc/frp",
"readOnly": true
}
]
}
],
"volumes": [
{
"name": "config",
"configMap": {
"name": "hwlab-v03-frpc-config"
}
}
]
}
}
}
}
]
}
@@ -0,0 +1,27 @@
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v03-health-contract",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-v03-health-contract",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e",
"hwlab.pikastech.local/environment": "v03"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"data": {
"endpoint": "https://hwlab-v03.74-48-78-17.nip.io",
"cloud-api": "GET /health/live through https://hwlab-v03.74-48-78-17.nip.io",
"cloud-api-db": "DEV DB config gate requires HWLAB_CLOUD_DB_URL from Secret hwlab-cloud-api-dev-db/database-url and HWLAB_CLOUD_DB_SSL_MODE=disable. Runtime readiness dials the redacted host parsed from the Secret URL and reports endpointSource=secret-url-host. cloud-api-db is an optional desired alias only until this repo owns Service plus Endpoint or EndpointSlice manifests and rollout/apply contract; health reports env presence, env injection, redacted connection attempt/result, and liveConnected without exposing secret values",
"cloud-web": "GET /health/live on https://hwlab-v03.74-48-78-17.nip.io; consumes cloud-api only",
"agent": "hwlab-cloud-api authorizes Code Agent sessions and dispatches execution to AgentRun v0.1; no HWLAB-owned agent manager/worker service is deployed",
"edge-proxy": "hwlab-edge-proxy:6667 exposes /health/live and proxies DEV endpoint traffic to hwlab-cloud-api",
"runtime-substitute-policy": "Do not replace HWLAB runtime with UniDesk backend, provider-gateway, or microservice proxy"
}
}
@@ -0,0 +1,16 @@
{
"apiVersion": "kustomize.config.k8s.io/v1beta1",
"kind": "Kustomization",
"namespace": "hwlab-v03",
"resources": [
"namespace.yaml",
"services.yaml",
"health-contract.yaml",
"workloads.yaml",
"deepseek-proxy.yaml",
"postgres.yaml",
"openfga.yaml",
"observability.yaml",
"g14-frpc.yaml"
]
}
@@ -0,0 +1,17 @@
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"name": "hwlab-v03",
"labels": {
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e",
"hwlab.pikastech.local/environment": "v03"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
}
}
File diff suppressed because one or more lines are too long
+278
View File
@@ -0,0 +1,278 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "batch/v1",
"kind": "Job",
"metadata": {
"name": "hwlab-openfga-migrate",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs",
"argocd.argoproj.io/hook": "Sync",
"argocd.argoproj.io/sync-wave": "1",
"argocd.argoproj.io/hook-delete-policy": "BeforeHookCreation,HookSucceeded"
}
},
"spec": {
"backoffLimit": 3,
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"restartPolicy": "OnFailure",
"containers": [
{
"name": "openfga-migrate",
"image": "127.0.0.1:5000/hwlab/openfga:v1.17.0",
"imagePullPolicy": "IfNotPresent",
"args": [
"migrate"
],
"env": [
{
"name": "OPENFGA_DATASTORE_ENGINE",
"value": "postgres"
},
{
"name": "OPENFGA_DATASTORE_URI",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v03-openfga",
"key": "datastore-uri"
}
}
},
{
"name": "OPENFGA_AUTHN_METHOD",
"value": "preshared"
},
{
"name": "OPENFGA_AUTHN_PRESHARED_KEYS",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v03-openfga",
"key": "authn-preshared-key"
}
}
},
{
"name": "OPENFGA_PLAYGROUND_ENABLED",
"value": "false"
},
{
"name": "OPENFGA_HTTP_ADDR",
"value": "0.0.0.0:8080"
},
{
"name": "OPENFGA_GRPC_ADDR",
"value": "0.0.0.0:8081"
}
]
}
]
}
}
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "hwlab-openfga",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-openfga"
}
},
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"containers": [
{
"name": "openfga",
"image": "127.0.0.1:5000/hwlab/openfga:v1.17.0",
"imagePullPolicy": "IfNotPresent",
"args": [
"run"
],
"env": [
{
"name": "OPENFGA_DATASTORE_ENGINE",
"value": "postgres"
},
{
"name": "OPENFGA_DATASTORE_URI",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v03-openfga",
"key": "datastore-uri"
}
}
},
{
"name": "OPENFGA_AUTHN_METHOD",
"value": "preshared"
},
{
"name": "OPENFGA_AUTHN_PRESHARED_KEYS",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v03-openfga",
"key": "authn-preshared-key"
}
}
},
{
"name": "OPENFGA_PLAYGROUND_ENABLED",
"value": "false"
},
{
"name": "OPENFGA_HTTP_ADDR",
"value": "0.0.0.0:8080"
},
{
"name": "OPENFGA_GRPC_ADDR",
"value": "0.0.0.0:8081"
}
],
"ports": [
{
"name": "http",
"containerPort": 8080
},
{
"name": "grpc",
"containerPort": 8081
}
],
"readinessProbe": {
"httpGet": {
"path": "/healthz",
"port": "http"
},
"initialDelaySeconds": 3,
"periodSeconds": 10
},
"livenessProbe": {
"httpGet": {
"path": "/healthz",
"port": "http"
},
"initialDelaySeconds": 15,
"periodSeconds": 20
},
"resources": {
"requests": {
"cpu": "50m",
"memory": "128Mi"
},
"limits": {
"cpu": "500m",
"memory": "512Mi"
}
}
}
]
}
}
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-openfga",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-openfga"
},
"ports": [
{
"name": "http",
"port": 8080,
"targetPort": "http"
},
{
"name": "grpc",
"port": 8081,
"targetPort": "grpc"
}
]
}
}
]
}
File diff suppressed because one or more lines are too long
+191
View File
@@ -0,0 +1,191 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-cloud-api",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-cloud-api",
"hwlab.pikastech.local/service-id": "hwlab-cloud-api",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-cloud-api"
},
"ports": [
{
"name": "http",
"port": 6667,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-cloud-web",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-cloud-web",
"hwlab.pikastech.local/service-id": "hwlab-cloud-web",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-cloud-web"
},
"ports": [
{
"name": "http",
"port": 8080,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-gateway",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-gateway",
"hwlab.pikastech.local/service-id": "hwlab-gateway",
"hwlab.pikastech.local/activation": "manual",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-gateway"
},
"ports": [
{
"name": "http",
"port": 7001,
"targetPort": "http"
}
]
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-agent-skills",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-agent-skills",
"hwlab.pikastech.local/service-id": "hwlab-agent-skills",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-agent-skills"
},
"ports": [
{
"name": "http",
"port": 7430,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-edge-proxy",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-edge-proxy",
"hwlab.pikastech.local/service-id": "hwlab-edge-proxy",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "1ce1a40292d456ec0e12984b072d551a8b713b8e",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/monitoring": "enabled"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/g14-gitops-render.mjs"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-edge-proxy"
},
"ports": [
{
"name": "http",
"port": 6667,
"targetPort": "http"
},
{
"name": "metrics",
"port": 9100,
"targetPort": "metrics"
}
]
}
}
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,53 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v03-hwpod-preinstalled-specs",
"namespace": "hwlab-v03",
"labels": {
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/config-kind": "hwpod-preinstalled-specs"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"hwlab.pikastech.local/source-ref": "config/hwlab-hwpod-preinstalls/constart-71freq-c.yaml#hwpodPreinstall",
"hwlab.pikastech.local/verification-issue": "pikasTech/HWLAB#2183"
}
},
"data": {
"constart-71freq-c.yaml": "apiVersion: hwlab.dev/v0alpha1\nkind: Hwpod\nmetadata:\n uid: CONSTART-71FREQ-C\n name: constart-71freq-c\nspec:\n targetDevice:\n board: ConStart 71-FREQ Controller\n mcu: STM32H723ZGTx\n flashBase: \"0x08000000\"\n workspace:\n path: \"F:\\\\Work\\\\ConStart\"\n toolchain: keil-mdk\n projectRoot: projects/71-00075-11\n keilProject: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW.uvprojx\n keilTarget: FREQ_Controller_FW\n hexPath: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW/FREQ_Controller_FW.hex\n mapPath: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW/FREQ_Controller_FW.map\n keilCliPath: \"C:\\\\Users\\\\liang\\\\.agents\\\\skills\\\\keil\\\\keil-cli.py\"\n debugProbe:\n type: cmsis-dap\n adapter: keil\n probeUid: 3FD750C63E342E24\n probeName: MicroLink CMSIS-DAP\n programBackend: keil-headless\n autoBindUvoptx: true\n ioProbe:\n uart:\n id: uart/1\n port: COM4\n baudrate: 921600\n nodeBinding:\n nodeId: node-d601-f103-v2\n nodeType: pc-host",
"constart-71freq-c.meta.json": "{\n \"contractVersion\": \"hwpod-spec-registry-v1\",\n \"source\": {\n \"kind\": \"preinstalled-yaml-first-spec\",\n \"workspaceRoot\": \"F:\\\\Work\\\\ConStart\",\n \"projectRoot\": \"projects/71-00075-11\",\n \"verificationIssue\": \"pikasTech/HWLAB#2183\",\n \"verifiedAt\": \"2026-06-26\"\n }\n}"
}
},
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v03-project-management-bootstrap",
"namespace": "hwlab-v03",
"labels": {
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/config-kind": "project-management-bootstrap-sources"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"hwlab.pikastech.local/source-ref": "config/hwlab-project-management/constart-71freq-mdtodo.yaml#projectManagement.sources[0]",
"hwlab.pikastech.local/verification-issue": "pikasTech/HWLAB#2183"
}
},
"data": {
"sources.json": "[\n {\n \"sourceId\": \"constart-71freq-mdtodo\",\n \"sourceKind\": \"hwpod-workspace\",\n \"displayName\": \"71-FREQ MDTODO\",\n \"projectId\": \"project_constart_71freq\",\n \"hwpodId\": \"constart-71freq-c\",\n \"nodeId\": \"node-d601-f103-v2\",\n \"workspaceRootRef\": \"F:\\\\Work\\\\ConStart\",\n \"mdtodoRootRef\": \"docs/MDTODO\",\n \"maxFiles\": 300,\n \"capabilities\": [\"probe\", \"list\", \"read\", \"write\", \"reindex\"]\n }\n]"
}
}
]
}
@@ -0,0 +1,327 @@
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: ConfigMap
metadata:
name: hwlab-deepseek-proxy-config
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-deepseek-proxy
app.kubernetes.io/part-of: hwlab
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/service-id: hwlab-deepseek-proxy
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/monitoring: disabled
data:
render-config.sh: >
#!/bin/sh
if [ -z "${DEEPSEEK_API_KEY:-}" ] && [ -z "${OPENCODE_API_KEY:-}" ];
then
echo "at least one of DEEPSEEK_API_KEY or OPENCODE_API_KEY is required" >&2
exit 1
fi
cat > /config/config.yml <<EOF
mode: "Transform"
log:
level: "info"
format: "text"
server:
addr: "0.0.0.0:4001"
persistence:
active_provider: db_sqlite
extensions:
db_sqlite:
enabled: true
config:
path: /data/moonbridge.db
wal: true
busy_timeout_ms: 5000
max_open_conns: 1
metrics:
enabled: true
config:
default_limit: 100
max_limit: 1000
deepseek_v4:
config:
reinforce_instructions: true
reinforce_prompt: "[System Reminder]: Please pay close attention to the system instructions, AGENTS.md files, and any other context provided. Follow them carefully and completely in your response.\n[User]:"
cache:
mode: "explicit"
ttl: "5m"
prompt_caching: true
automatic_prompt_cache: false
explicit_cache_breakpoints: true
allow_retention_downgrade: false
max_breakpoints: 4
min_cache_tokens: 1024
expected_reuse: 2
minimum_value_score: 2048
min_breakpoint_tokens: 1024
defaults:
model: "deepseek-chat"
max_tokens: 8192
trace:
enabled: false
models:
deepseek-chat:
context_window: 128000
max_output_tokens: 8192
display_name: "deepseek-chat"
description: "DeepSeek via Moon Bridge"
default_reasoning_level: null
supported_reasoning_levels: []
extensions:
deepseek_v4:
enabled: true
deepseek-v4-flash:
context_window: 1000000
max_output_tokens: 384000
display_name: "DeepSeek V4 Flash via OpenCode Zen Go"
description: "DeepSeek V4 Flash through OpenCode Zen Go Chat Completions via Moon Bridge"
default_reasoning_level: "xhigh"
supported_reasoning_levels:
- effort: "high"
description: "High reasoning effort"
- effort: "xhigh"
description: "Maximum reasoning effort"
supports_reasoning_summaries: true
default_reasoning_summary: "auto"
extensions:
deepseek_v4:
enabled: true
providers:
deepseek:
base_url: "https://api.deepseek.com/anthropic"
api_key: "${DEEPSEEK_API_KEY}"
version: "2023-06-01"
user_agent: "moonbridge/1.0"
offers:
- model: deepseek-chat
opencode:
base_url: "https://opencode.ai/zen/go/v1"
api_key: "${OPENCODE_API_KEY:-}"
protocol: "openai-chat"
user_agent: "moonbridge-dsflash-go/1.0"
web_search:
support: "disabled"
offers:
- model: deepseek-v4-flash
routes:
deepseek-chat:
model: deepseek-chat
provider: deepseek
deepseek-v4-flash:
model: deepseek-v4-flash
provider: opencode
EOF
- apiVersion: apps/v1
kind: Deployment
metadata:
name: hwlab-deepseek-proxy
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-deepseek-proxy
app.kubernetes.io/part-of: hwlab
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/service-id: hwlab-deepseek-proxy
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/monitoring: disabled
annotations:
hwlab.pikastech.local/moonbridge-source-ref: 1b99888d3dae889b79ee602cb875c7907f7e76f2
hwlab.pikastech.local/bridge-service-id: hwlab-cloud-api
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/bridge-source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/bridge-image-tag: env-a730c84fe786
hwlab.pikastech.local/bridge-image: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
hwlab.pikastech.local/bridge-runtime-mode: env-reuse-git-mirror-checkout
hwlab.pikastech.local/bridge-boot-repo: git@github.com:pikasTech/HWLAB.git
hwlab.pikastech.local/bridge-boot-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/bridge-boot-sh: deploy/runtime/boot/hwlab-deepseek-responses-bridge.sh
hwlab.pikastech.local/bridge-environment-digest: sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: hwlab-deepseek-proxy
template:
metadata:
labels:
app.kubernetes.io/name: hwlab-deepseek-proxy
app.kubernetes.io/part-of: hwlab
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/service-id: hwlab-deepseek-proxy
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/monitoring: disabled
hwlab.pikastech.local/bridge-source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/bridge-runtime-mode: env-reuse-git-mirror-checkout
hwlab.pikastech.local/bridge-boot-commit: 31179908f208f7cdf6c6280779f0808b42289123
annotations:
hwlab.pikastech.local/bridge-service-id: hwlab-cloud-api
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/bridge-source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/bridge-image-tag: env-a730c84fe786
hwlab.pikastech.local/bridge-image: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
hwlab.pikastech.local/bridge-runtime-mode: env-reuse-git-mirror-checkout
hwlab.pikastech.local/bridge-boot-repo: git@github.com:pikasTech/HWLAB.git
hwlab.pikastech.local/bridge-boot-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/bridge-boot-sh: deploy/runtime/boot/hwlab-deepseek-responses-bridge.sh
hwlab.pikastech.local/bridge-environment-digest: sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
spec:
initContainers:
- name: moonbridge-config
image: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -eu
- /scripts/render-config.sh
env:
- name: DEEPSEEK_API_KEY
valueFrom:
secretKeyRef:
name: hwlab-v03-code-agent-provider
key: openai-api-key
optional: true
- name: OPENCODE_API_KEY
valueFrom:
secretKeyRef:
name: hwlab-v03-code-agent-provider
key: opencode-api-key
optional: true
volumeMounts:
- name: moonbridge-scripts
mountPath: /scripts
readOnly: true
- name: moonbridge-config
mountPath: /config
containers:
- name: responses-bridge
image: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
imagePullPolicy: IfNotPresent
env:
- name: PORT
value: "4000"
- name: HWLAB_COMMIT_ID
value: 31179908f208f7cdf6c6280779f0808b42289123
- name: HWLAB_IMAGE
value: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env@sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
- name: HWLAB_IMAGE_TAG
value: env-a730c84fe786
- name: HWLAB_DEEPSEEK_BRIDGE_UPSTREAM
value: http://127.0.0.1:4001
- name: HWLAB_DEEPSEEK_BRIDGE_MODEL
value: deepseek-chat
- name: HWLAB_RUNTIME_MODE
value: env-reuse-git-mirror-checkout
- name: HWLAB_BOOT_REPO
value: git@github.com:pikasTech/HWLAB.git
- name: HWLAB_BOOT_COMMIT
value: 31179908f208f7cdf6c6280779f0808b42289123
- name: HWLAB_BOOT_REF
value: v0.3
- name: HWLAB_BOOT_SH
value: deploy/runtime/boot/hwlab-deepseek-responses-bridge.sh
- name: HWLAB_BOOT_READ_URL
value: http://git-mirror-http.devops-infra.svc.cluster.local:8080/pikasTech/HWLAB.git
- name: HWLAB_ENVIRONMENT_IMAGE
value: 127.0.0.1:5000/hwlab/hwlab-cloud-api-env:env-a730c84fe786
- name: HWLAB_ENVIRONMENT_DIGEST
value: sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
- name: HWLAB_ENVIRONMENT_INPUT_HASH
value: bb377a5d37292accab4658f0b2711cfdf914801364787627d2aed6533acdf3da
- name: HWLAB_CODE_INPUT_HASH
value: ca5d1e0d4b61fd8eea7e57100b3f7ee847c1808f651ec1fcb4be496e96eec63e
- name: HWLAB_IMAGE_DIGEST
value: sha256:2d00fa536eee7fa81bcfbd7aa2370fbd1781afa4fc265433cfb8568e82ac21c3
ports:
- name: http
containerPort: 4000
readinessProbe:
httpGet:
path: /health/readiness
port: http
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
httpGet:
path: /health/liveliness
port: http
initialDelaySeconds: 20
periodSeconds: 20
startupProbe:
httpGet:
path: /health/readiness
port: http
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 30
successThreshold: 1
- name: moonbridge
image: 127.0.0.1:5000/hwlab/moonbridge:1b99888d3dae
imagePullPolicy: IfNotPresent
args:
- -config
- /config/config.yml
ports:
- name: moonbridge-http
containerPort: 4001
readinessProbe:
httpGet:
path: /v1/models
port: moonbridge-http
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
httpGet:
path: /v1/models
port: moonbridge-http
initialDelaySeconds: 20
periodSeconds: 20
volumeMounts:
- name: moonbridge-config
mountPath: /config
readOnly: true
- name: moonbridge-data
mountPath: /data
volumes:
- name: moonbridge-scripts
configMap:
name: hwlab-deepseek-proxy-config
- name: moonbridge-config
emptyDir: {}
- name: moonbridge-data
emptyDir: {}
- apiVersion: v1
kind: Service
metadata:
name: hwlab-deepseek-proxy
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-deepseek-proxy
app.kubernetes.io/part-of: hwlab
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/service-id: hwlab-deepseek-proxy
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/monitoring: disabled
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-deepseek-proxy
ports:
- name: http
port: 4000
targetPort: http
- name: metrics
port: 9100
targetPort: metrics
@@ -0,0 +1,49 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "external-secrets.io/v1",
"kind": "ExternalSecret",
"metadata": {
"name": "hwlab-secret-plane-smoke",
"namespace": "hwlab-v03",
"labels": {
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"app.kubernetes.io/name": "hwlab-secret-plane-smoke",
"app.kubernetes.io/component": "external-secret",
"hwlab.pikastech.local/secret-plane": "issue-2234"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"hwlab.pikastech.local/secret-plane-issue": "pikasTech/HWLAB#2234",
"hwlab.pikastech.local/source-ref": "hwlab-secret-plane/poc",
"hwlab.pikastech.local/values-printed": "false"
}
},
"spec": {
"refreshInterval": "1m",
"secretStoreRef": {
"name": "hwlab-secret-plane-vault-cluster",
"kind": "ClusterSecretStore"
},
"target": {
"name": "hwlab-secret-plane-smoke",
"creationPolicy": "Owner"
},
"data": [
{
"secretKey": "password",
"remoteRef": {
"key": "hwlab-secret-plane/poc",
"property": "password"
}
}
]
}
}
]
}
@@ -0,0 +1,27 @@
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v03-health-contract",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-v03-health-contract",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123",
"hwlab.pikastech.local/environment": "v03"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs"
}
},
"data": {
"endpoint": "https://hwlab.pikapython.com",
"cloud-api": "GET /health/live through https://hwlab.pikapython.com",
"cloud-api-db": "DEV DB config gate requires HWLAB_CLOUD_DB_URL from Secret hwlab-cloud-api-dev-db/database-url and HWLAB_CLOUD_DB_SSL_MODE=disable. Runtime readiness dials the redacted host parsed from the Secret URL and reports endpointSource=secret-url-host. cloud-api-db is an optional desired alias only until this repo owns Service plus Endpoint or EndpointSlice manifests and rollout/apply contract; health reports env presence, env injection, redacted connection attempt/result, and liveConnected without exposing secret values",
"cloud-web": "GET /health/live on https://hwlab.pikapython.com; consumes cloud-api only",
"agent": "hwlab-cloud-api authorizes Code Agent sessions and dispatches execution to AgentRun v0.1; no HWLAB-owned agent manager/worker service is deployed",
"edge-proxy": "hwlab-edge-proxy:6667 exposes /health/live and proxies DEV endpoint traffic to hwlab-cloud-api",
"runtime-substitute-policy": "Do not replace HWLAB runtime with UniDesk backend, provider-gateway, or microservice proxy"
}
}
@@ -0,0 +1,15 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: hwlab-v03
resources:
- namespace.yaml
- services.yaml
- health-contract.yaml
- configmaps.yaml
- external-secrets.yaml
- workloads.yaml
- deepseek-proxy.yaml
- postgres.yaml
- workbench-redis.yaml
- openfga.yaml
- node-frpc.yaml
@@ -0,0 +1,17 @@
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"name": "hwlab-v03",
"labels": {
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123",
"hwlab.pikastech.local/environment": "v03"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs"
}
}
}
@@ -0,0 +1,89 @@
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: ConfigMap
metadata:
name: hwlab-v03-frpc-config
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-v03-frpc
app.kubernetes.io/part-of: hwlab
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
data:
frpc.toml: |
serverAddr = "82.156.23.220"
serverPort = 22000
loginFailExit = true
auth.token = "{{ .Envs.HWLAB_FRP_TOKEN }}"
[[proxies]]
name = "hwlab-d518-v03-cloud-web"
type = "tcp"
localIP = "hwlab-cloud-web.hwlab-v03.svc.cluster.local"
localPort = 8080
remotePort = 22092
[[proxies]]
name = "hwlab-d518-v03-edge-proxy"
type = "tcp"
localIP = "hwlab-edge-proxy.hwlab-v03.svc.cluster.local"
localPort = 6667
remotePort = 22091
- apiVersion: apps/v1
kind: Deployment
metadata:
name: hwlab-v03-frpc
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-v03-frpc
app.kubernetes.io/part-of: hwlab
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: hwlab-v03-frpc
template:
metadata:
labels:
app.kubernetes.io/name: hwlab-v03-frpc
app.kubernetes.io/part-of: hwlab
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/config-sha256: ce6c82e15b128572
annotations:
hwlab.pikastech.local/config-sha256: ce6c82e15b12857248f574b624109aae09b0489b990a252c4955d57567dd2ac2
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: frpc
image: 127.0.0.1:5000/hwlab/frpc:v0.68.1
imagePullPolicy: IfNotPresent
args:
- -c
- /etc/frp/frpc.toml
volumeMounts:
- name: config
mountPath: /etc/frp
readOnly: true
env:
- name: HWLAB_FRP_TOKEN
valueFrom:
secretKeyRef:
name: hwlab-v03-frpc-secrets
key: token
volumes:
- name: config
configMap:
name: hwlab-v03-frpc-config
strategy:
type: Recreate
@@ -0,0 +1,278 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "batch/v1",
"kind": "Job",
"metadata": {
"name": "hwlab-openfga-migrate",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"argocd.argoproj.io/hook": "Sync",
"argocd.argoproj.io/sync-wave": "1",
"argocd.argoproj.io/hook-delete-policy": "BeforeHookCreation,HookSucceeded"
}
},
"spec": {
"backoffLimit": 3,
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs"
}
},
"spec": {
"restartPolicy": "OnFailure",
"containers": [
{
"name": "openfga-migrate",
"image": "127.0.0.1:5000/hwlab/openfga:v1.17.0",
"imagePullPolicy": "IfNotPresent",
"args": [
"migrate"
],
"env": [
{
"name": "OPENFGA_DATASTORE_ENGINE",
"value": "postgres"
},
{
"name": "OPENFGA_DATASTORE_URI",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v03-openfga",
"key": "datastore-uri"
}
}
},
{
"name": "OPENFGA_AUTHN_METHOD",
"value": "preshared"
},
{
"name": "OPENFGA_AUTHN_PRESHARED_KEYS",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v03-openfga",
"key": "authn-preshared-key"
}
}
},
{
"name": "OPENFGA_PLAYGROUND_ENABLED",
"value": "false"
},
{
"name": "OPENFGA_HTTP_ADDR",
"value": "0.0.0.0:8080"
},
{
"name": "OPENFGA_GRPC_ADDR",
"value": "0.0.0.0:8081"
}
]
}
]
}
}
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "hwlab-openfga",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-openfga"
}
},
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs"
}
},
"spec": {
"containers": [
{
"name": "openfga",
"image": "127.0.0.1:5000/hwlab/openfga:v1.17.0",
"imagePullPolicy": "IfNotPresent",
"args": [
"run"
],
"env": [
{
"name": "OPENFGA_DATASTORE_ENGINE",
"value": "postgres"
},
{
"name": "OPENFGA_DATASTORE_URI",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v03-openfga",
"key": "datastore-uri"
}
}
},
{
"name": "OPENFGA_AUTHN_METHOD",
"value": "preshared"
},
{
"name": "OPENFGA_AUTHN_PRESHARED_KEYS",
"valueFrom": {
"secretKeyRef": {
"name": "hwlab-v03-openfga",
"key": "authn-preshared-key"
}
}
},
{
"name": "OPENFGA_PLAYGROUND_ENABLED",
"value": "false"
},
{
"name": "OPENFGA_HTTP_ADDR",
"value": "0.0.0.0:8080"
},
{
"name": "OPENFGA_GRPC_ADDR",
"value": "0.0.0.0:8081"
}
],
"ports": [
{
"name": "http",
"containerPort": 8080
},
{
"name": "grpc",
"containerPort": 8081
}
],
"readinessProbe": {
"httpGet": {
"path": "/healthz",
"port": "http"
},
"initialDelaySeconds": 3,
"periodSeconds": 10
},
"livenessProbe": {
"httpGet": {
"path": "/healthz",
"port": "http"
},
"initialDelaySeconds": 15,
"periodSeconds": 20
},
"resources": {
"requests": {
"cpu": "50m",
"memory": "128Mi"
},
"limits": {
"cpu": "500m",
"memory": "512Mi"
}
}
}
]
}
}
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-openfga",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-openfga",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/component": "authorization",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-openfga",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-openfga"
},
"ports": [
{
"name": "http",
"port": 8080,
"targetPort": "http"
},
{
"name": "grpc",
"port": 8081,
"targetPort": "grpc"
}
]
}
}
]
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,208 @@
apiVersion: v1
kind: List
items:
- apiVersion: v1
kind: Service
metadata:
name: hwlab-cloud-api
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-cloud-api
hwlab.pikastech.local/service-id: hwlab-cloud-api
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/monitoring: disabled
annotations:
hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-cloud-api
ports:
- name: http
port: 6667
targetPort: http
- name: metrics
port: 9100
targetPort: metrics
- apiVersion: v1
kind: Service
metadata:
name: hwlab-project-management
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-project-management
hwlab.pikastech.local/service-id: hwlab-project-management
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/monitoring: disabled
annotations:
hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-project-management
ports:
- name: http
port: 6672
targetPort: http
- name: metrics
port: 9100
targetPort: metrics
- apiVersion: v1
kind: Service
metadata:
name: hwlab-workbench-runtime
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-workbench-runtime
hwlab.pikastech.local/service-id: hwlab-workbench-runtime
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/monitoring: disabled
annotations:
hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-workbench-runtime
ports:
- name: http
port: 6671
targetPort: http
- name: metrics
port: 9100
targetPort: metrics
- apiVersion: v1
kind: Service
metadata:
name: hwlab-user-billing
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-user-billing
hwlab.pikastech.local/service-id: hwlab-user-billing
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/monitoring: disabled
annotations:
hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-user-billing
ports:
- name: http
port: 6670
targetPort: http
- name: metrics
port: 9100
targetPort: metrics
- apiVersion: v1
kind: Service
metadata:
name: hwlab-cloud-web
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-cloud-web
hwlab.pikastech.local/service-id: hwlab-cloud-web
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/monitoring: disabled
annotations:
hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-cloud-web
ports:
- name: http
port: 8080
targetPort: http
- name: metrics
port: 9100
targetPort: metrics
- apiVersion: v1
kind: Service
metadata:
name: hwlab-gateway
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-gateway
hwlab.pikastech.local/service-id: hwlab-gateway
hwlab.pikastech.local/activation: manual
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/profile: v03
annotations:
hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-gateway
ports:
- name: http
port: 7001
targetPort: http
- apiVersion: v1
kind: Service
metadata:
name: hwlab-agent-skills
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-agent-skills
hwlab.pikastech.local/service-id: hwlab-agent-skills
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/monitoring: disabled
annotations:
hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-agent-skills
ports:
- name: http
port: 7430
targetPort: http
- name: metrics
port: 9100
targetPort: metrics
- apiVersion: v1
kind: Service
metadata:
name: hwlab-edge-proxy
namespace: hwlab-v03
labels:
app.kubernetes.io/name: hwlab-edge-proxy
hwlab.pikastech.local/service-id: hwlab-edge-proxy
hwlab.pikastech.local/gitops-target: v03
hwlab.pikastech.local/source-commit: 31179908f208f7cdf6c6280779f0808b42289123
hwlab.pikastech.local/environment: v03
hwlab.pikastech.local/profile: v03
hwlab.pikastech.local/monitoring: disabled
annotations:
hwlab.pikastech.local/rendered-by: scripts/gitops-render.mjs
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: hwlab-edge-proxy
ports:
- name: http
port: 6667
targetPort: http
- name: metrics
port: 9100
targetPort: metrics
@@ -0,0 +1,243 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-workbench-redis-config",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-workbench-redis",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/cache-role": "workbench-derived-read",
"hwlab.pikastech.local/component": "workbench-runtime-cache",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-workbench-redis",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"data": {
"redis.conf": "save \"\"\nappendonly no\nmaxmemory 192mb\nmaxmemory-policy allkeys-lru\n"
}
},
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"name": "hwlab-workbench-redis",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-workbench-redis",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/cache-role": "workbench-derived-read",
"hwlab.pikastech.local/component": "workbench-runtime-cache",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-workbench-redis",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"spec": {
"replicas": 1,
"selector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-workbench-redis"
}
},
"template": {
"metadata": {
"labels": {
"app.kubernetes.io/name": "hwlab-workbench-redis",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/cache-role": "workbench-derived-read",
"hwlab.pikastech.local/component": "workbench-runtime-cache",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-workbench-redis",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"spec": {
"containers": [
{
"name": "redis",
"image": "127.0.0.1:5000/hwlab/redis:8.2.3-alpine",
"imagePullPolicy": "IfNotPresent",
"args": [
"redis-server",
"/usr/local/etc/redis/redis.conf"
],
"ports": [
{
"name": "redis",
"containerPort": 6379
}
],
"readinessProbe": {
"exec": {
"command": [
"redis-cli",
"-p",
"6379",
"ping"
]
},
"initialDelaySeconds": 3,
"periodSeconds": 10,
"timeoutSeconds": 2,
"failureThreshold": 3
},
"livenessProbe": {
"exec": {
"command": [
"redis-cli",
"-p",
"6379",
"ping"
]
},
"initialDelaySeconds": 15,
"periodSeconds": 20,
"timeoutSeconds": 3,
"failureThreshold": 3
},
"resources": {
"requests": {
"cpu": "50m",
"memory": "64Mi"
},
"limits": {
"cpu": "250m",
"memory": "256Mi"
}
},
"volumeMounts": [
{
"name": "config",
"mountPath": "/usr/local/etc/redis",
"readOnly": true
}
]
}
],
"volumes": [
{
"name": "config",
"configMap": {
"name": "hwlab-workbench-redis-config"
}
}
]
}
}
}
},
{
"apiVersion": "v1",
"kind": "Service",
"metadata": {
"name": "hwlab-workbench-redis",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-workbench-redis",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/cache-role": "workbench-derived-read",
"hwlab.pikastech.local/component": "workbench-runtime-cache",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-workbench-redis",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"spec": {
"type": "ClusterIP",
"selector": {
"app.kubernetes.io/name": "hwlab-workbench-redis"
},
"ports": [
{
"name": "redis",
"port": 6379,
"targetPort": "redis",
"protocol": "TCP"
}
]
}
},
{
"apiVersion": "networking.k8s.io/v1",
"kind": "NetworkPolicy",
"metadata": {
"name": "hwlab-workbench-redis-ingress",
"namespace": "hwlab-v03",
"labels": {
"app.kubernetes.io/name": "hwlab-workbench-redis",
"app.kubernetes.io/part-of": "hwlab",
"hwlab.pikastech.local/cache-role": "workbench-derived-read",
"hwlab.pikastech.local/component": "workbench-runtime-cache",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/service-id": "hwlab-workbench-redis",
"hwlab.pikastech.local/source-commit": "31179908f208f7cdf6c6280779f0808b42289123"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"argocd.argoproj.io/sync-wave": "2"
}
},
"spec": {
"podSelector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-workbench-redis"
}
},
"policyTypes": [
"Ingress"
],
"ingress": [
{
"from": [
{
"podSelector": {
"matchLabels": {
"app.kubernetes.io/name": "hwlab-workbench-runtime"
}
}
}
],
"ports": [
{
"protocol": "TCP",
"port": 6379
}
]
}
]
}
}
]
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,15 @@
{apiVersion: v1,kind: ServiceAccount,metadata: {name: hwlab-web-probe-sentinel-dsflash,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x}}}
---
{apiVersion: v1,kind: PersistentVolumeClaim,metadata: {name: hwlab-web-probe-sentinel-dsflash-state,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x}},spec: {accessModes: [ReadWriteOnce],resources: {requests: {storage: 10Gi}}}}
---
{apiVersion: v1,kind: ConfigMap,metadata: {name: hwlab-web-probe-sentinel-dsflash-config,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x}},data: {config-summary.json: "{\n \"specRef\": \"PJ2026-01060508 Web哨兵 draft-2026-06-27-p11-monitor-web-observability-dashboard\",\n \"node\": \"D518\",\n \"lane\": \"v03\",\n \"sentinelId\": \"workbench-dsflash-go-tool-call-10x\",\n \"publicBaseUrl\": \"https://monitor.pikapython.com/sentinels/d518-workbench-dsflash-go-tool-call-10x\",\n \"routePrefix\": \"/sentinels/d518-workbench-dsflash-go-tool-call-10x\",\n \"gitopsPath\": \"deploy/gitops/node/d518/web-probe-sentinel-dsflash\",\n \"valuesRedacted\": true\n}"}}
---
{apiVersion: apps/v1,kind: Deployment,metadata: {name: hwlab-web-probe-sentinel-dsflash,namespace: hwlab-v03,labels: &labels {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x}},spec: {replicas: 1,selector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash}},template: {metadata: {labels: *labels},spec: {serviceAccountName: hwlab-web-probe-sentinel-dsflash,containers: [{name: sentinel,image: 127.0.0.1:5000/hwlab/web-probe-sentinel@sha256:c12a2911c8eae2fa7f654bc2ec2d3ae2f6934e8fe604929542b9f18cc4ed5bde,imagePullPolicy: IfNotPresent,args: ["--node",D518,"--lane",v03,"--sentinel",workbench-dsflash-go-tool-call-10x,"--state-root",/var/lib/web-probe-sentinel-dsflash,"--host",0.0.0.0,"--port","8080"],env: [{name: UNIDESK_WEB_PROBE_SENTINEL_ID,value: workbench-dsflash-go-tool-call-10x},{name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-bootstrap,key: bootstrap-admin-password}}},{name: DSFLASH_GO_TOOL_CALL_10X_PROMPTS_JSON,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-prompt-set,key: prompts.json}}}],ports: [{name: http,containerPort: 8080}],readinessProbe: {httpGet: {path: /api/health,port: http}},livenessProbe: {httpGet: {path: /api/health,port: http}},volumeMounts: [{name: state,mountPath: /var/lib/web-probe-sentinel-dsflash}]}],volumes: [{name: state,persistentVolumeClaim: {claimName: hwlab-web-probe-sentinel-dsflash-state}}]}}}}
---
{apiVersion: v1,kind: Service,metadata: {name: hwlab-web-probe-sentinel-dsflash,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x}},spec: {type: ClusterIP,selector: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash},ports: [{name: http,port: 8080,targetPort: http}]}}
---
{apiVersion: batch/v1,kind: CronJob,metadata: {name: hwlab-web-probe-sentinel-dsflash-quick-verify,namespace: hwlab-v03,labels: &labels {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash-quick-verify,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/component: cadence-scheduler,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x},annotations: {unidesk.ai/cadence: 10m,unidesk.ai/target-validation-max-seconds: "300"}},spec: {schedule: "*/10 * * * *",concurrencyPolicy: Forbid,successfulJobsHistoryLimit: 3,failedJobsHistoryLimit: 5,startingDeadlineSeconds: 600,jobTemplate: {spec: {activeDeadlineSeconds: 360,ttlSecondsAfterFinished: 86400,backoffLimit: 0,template: {metadata: {labels: *labels},spec: {restartPolicy: Never,serviceAccountName: hwlab-web-probe-sentinel-dsflash,containers: [{name: quick-verify,image: 127.0.0.1:5000/hwlab/web-probe-sentinel@sha256:c12a2911c8eae2fa7f654bc2ec2d3ae2f6934e8fe604929542b9f18cc4ed5bde,imagePullPolicy: IfNotPresent,command: [bun,scripts/cli.ts],args: [web-probe,sentinel,validate,"--node",D518,"--lane",v03,"--sentinel",workbench-dsflash-go-tool-call-10x,"--quick-verify","--confirm","--wait","--timeout-seconds","300"],env: [{name: UNIDESK_WEB_PROBE_SENTINEL_ID,value: workbench-dsflash-go-tool-call-10x},{name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-bootstrap,key: bootstrap-admin-password}}},{name: DSFLASH_GO_TOOL_CALL_10X_PROMPTS_JSON,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-prompt-set,key: prompts.json}}},{name: UNIDESK_WEB_PROBE_SENTINEL_DIRECT_SERVICE,value: "1"}]}]}}}}}}
---
{apiVersion: apps/v1,kind: Deployment,metadata: {name: hwlab-web-probe-sentinel-dsflash-frpc,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x,app.kubernetes.io/component: tunnel}},spec: {replicas: 1,selector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash-frpc}},template: {metadata: {labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash-frpc,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x,app.kubernetes.io/component: tunnel},annotations: {unidesk.ai/public-base-url: https://monitor.pikapython.com/sentinels/d518-workbench-dsflash-go-tool-call-10x,unidesk.ai/frp-server: 82.156.23.220:22000,unidesk.ai/frp-remote-port: "22089"}},spec: {containers: [{name: frpc,image: 127.0.0.1:5000/hwlab/frpc:v0.68.1,imagePullPolicy: IfNotPresent,args: ["-c",/etc/frp/frpc.toml],volumeMounts: [{name: frpc-config,mountPath: /etc/frp/frpc.toml,subPath: frpc.toml,readOnly: true}]}],volumes: [{name: frpc-config,secret: {secretName: hwlab-web-probe-sentinel-dsflash-frpc}}]}}}}
---
{apiVersion: networking.k8s.io/v1,kind: NetworkPolicy,metadata: {name: hwlab-web-probe-sentinel-dsflash-egress,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-dsflash-go-tool-call-10x}},spec: {podSelector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-dsflash}},policyTypes: [Ingress,Egress],ingress: [{from: [{namespaceSelector: {}}],ports: [{protocol: TCP,port: 8080}]}],egress: [{to: [{namespaceSelector: {}}]}]}}
@@ -0,0 +1,15 @@
{apiVersion: v1,kind: ServiceAccount,metadata: {name: hwlab-web-probe-sentinel-fake-echo,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}}}
---
{apiVersion: v1,kind: PersistentVolumeClaim,metadata: {name: hwlab-web-probe-sentinel-fake-echo-state,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},spec: {accessModes: [ReadWriteOnce],resources: {requests: {storage: 10Gi}}}}
---
{apiVersion: v1,kind: ConfigMap,metadata: {name: hwlab-web-probe-sentinel-fake-echo-config,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},data: {config-summary.json: "{\n \"specRef\": \"PJ2026-01060508 Web哨兵 draft-2026-06-27-p11-monitor-web-observability-dashboard\",\n \"node\": \"D518\",\n \"lane\": \"v03\",\n \"sentinelId\": \"workbench-fake-echo-session-invariance-10x\",\n \"publicBaseUrl\": \"https://monitor.pikapython.com\",\n \"routePrefix\": \"/\",\n \"gitopsPath\": \"deploy/gitops/node/d518/web-probe-sentinel-fake-echo\",\n \"valuesRedacted\": true\n}"}}
---
{apiVersion: apps/v1,kind: Deployment,metadata: {name: hwlab-web-probe-sentinel-fake-echo,namespace: hwlab-v03,labels: &labels {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},spec: {replicas: 1,selector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo}},template: {metadata: {labels: *labels},spec: {serviceAccountName: hwlab-web-probe-sentinel-fake-echo,containers: [{name: sentinel,image: 127.0.0.1:5000/hwlab/web-probe-sentinel@sha256:671858eb95fd97294041b2c870b0fee87cac73213ad4be9cb184a911b2a0da95,imagePullPolicy: IfNotPresent,args: ["--node",D518,"--lane",v03,"--sentinel",workbench-fake-echo-session-invariance-10x,"--state-root",/var/lib/web-probe-sentinel-fake-echo,"--host",0.0.0.0,"--port","8080"],env: [{name: UNIDESK_WEB_PROBE_SENTINEL_ID,value: workbench-fake-echo-session-invariance-10x},{name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-bootstrap,key: bootstrap-admin-password}}},{name: FAKE_ECHO_SENTINEL_PROMPTS_JSON,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-prompt-set,key: prompts.json}}}],ports: [{name: http,containerPort: 8080}],readinessProbe: {httpGet: {path: /api/health,port: http}},livenessProbe: {httpGet: {path: /api/health,port: http}},volumeMounts: [{name: state,mountPath: /var/lib/web-probe-sentinel-fake-echo}]}],volumes: [{name: state,persistentVolumeClaim: {claimName: hwlab-web-probe-sentinel-fake-echo-state}}]}}}}
---
{apiVersion: v1,kind: Service,metadata: {name: hwlab-web-probe-sentinel-fake-echo,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},spec: {type: ClusterIP,selector: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo},ports: [{name: http,port: 8080,targetPort: http}]}}
---
{apiVersion: batch/v1,kind: CronJob,metadata: {name: hwlab-web-probe-sentinel-fake-echo-quick-verify,namespace: hwlab-v03,labels: &labels {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo-quick-verify,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/component: cadence-scheduler,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x},annotations: {unidesk.ai/cadence: 10m,unidesk.ai/target-validation-max-seconds: "300"}},spec: {schedule: "*/10 * * * *",concurrencyPolicy: Forbid,successfulJobsHistoryLimit: 3,failedJobsHistoryLimit: 5,startingDeadlineSeconds: 600,jobTemplate: {spec: {activeDeadlineSeconds: 360,ttlSecondsAfterFinished: 86400,backoffLimit: 0,template: {metadata: {labels: *labels},spec: {restartPolicy: Never,serviceAccountName: hwlab-web-probe-sentinel-fake-echo,containers: [{name: quick-verify,image: 127.0.0.1:5000/hwlab/web-probe-sentinel@sha256:671858eb95fd97294041b2c870b0fee87cac73213ad4be9cb184a911b2a0da95,imagePullPolicy: IfNotPresent,command: [bun,scripts/cli.ts],args: [web-probe,sentinel,validate,"--node",D518,"--lane",v03,"--sentinel",workbench-fake-echo-session-invariance-10x,"--quick-verify","--confirm","--wait","--timeout-seconds","300"],env: [{name: UNIDESK_WEB_PROBE_SENTINEL_ID,value: workbench-fake-echo-session-invariance-10x},{name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-bootstrap,key: bootstrap-admin-password}}},{name: FAKE_ECHO_SENTINEL_PROMPTS_JSON,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-prompt-set,key: prompts.json}}},{name: UNIDESK_WEB_PROBE_SENTINEL_DIRECT_SERVICE,value: "1"}]}]}}}}}}
---
{apiVersion: apps/v1,kind: Deployment,metadata: {name: hwlab-web-probe-sentinel-fake-echo-frpc,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x,app.kubernetes.io/component: tunnel}},spec: {replicas: 1,selector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo-frpc}},template: {metadata: {labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo-frpc,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x,app.kubernetes.io/component: tunnel},annotations: {unidesk.ai/public-base-url: https://monitor.pikapython.com,unidesk.ai/frp-server: 82.156.23.220:22000,unidesk.ai/frp-remote-port: "22093"}},spec: {containers: [{name: frpc,image: 127.0.0.1:5000/hwlab/frpc:v0.68.1,imagePullPolicy: IfNotPresent,args: ["-c",/etc/frp/frpc.toml],volumeMounts: [{name: frpc-config,mountPath: /etc/frp/frpc.toml,subPath: frpc.toml,readOnly: true}]}],volumes: [{name: frpc-config,secret: {secretName: hwlab-web-probe-sentinel-fake-echo-frpc}}]}}}}
---
{apiVersion: networking.k8s.io/v1,kind: NetworkPolicy,metadata: {name: hwlab-web-probe-sentinel-fake-echo-egress,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},spec: {podSelector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-fake-echo}},policyTypes: [Ingress,Egress],ingress: [{from: [{namespaceSelector: {}}],ports: [{protocol: TCP,port: 8080}]}],egress: [{to: [{namespaceSelector: {}}]}]}}
@@ -0,0 +1,15 @@
{apiVersion: v1,kind: ServiceAccount,metadata: {name: hwlab-web-probe-sentinel,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}}}
---
{apiVersion: v1,kind: PersistentVolumeClaim,metadata: {name: hwlab-web-probe-sentinel-state,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},spec: {accessModes: [ReadWriteOnce],resources: {requests: {storage: 10Gi}}}}
---
{apiVersion: v1,kind: ConfigMap,metadata: {name: hwlab-web-probe-sentinel-config,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},data: {config-summary.json: "{\n \"specRef\": \"PJ2026-01060508 Web哨兵 draft-2026-06-27-p11-monitor-web-observability-dashboard\",\n \"node\": \"D518\",\n \"lane\": \"v03\",\n \"sentinelId\": \"workbench-fake-echo-session-invariance-10x\",\n \"publicBaseUrl\": \"https://monitor.pikapython.com\",\n \"routePrefix\": \"/\",\n \"gitopsPath\": \"deploy/gitops/node/d518/web-probe-sentinel\",\n \"valuesRedacted\": true\n}"}}
---
{apiVersion: apps/v1,kind: Deployment,metadata: {name: hwlab-web-probe-sentinel,namespace: hwlab-v03,labels: &labels {app.kubernetes.io/name: hwlab-web-probe-sentinel,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},spec: {replicas: 1,selector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel}},template: {metadata: {labels: *labels},spec: {serviceAccountName: hwlab-web-probe-sentinel,containers: [{name: sentinel,image: 127.0.0.1:5000/hwlab/web-probe-sentinel@sha256:017b23dbc40c79d3d84279fa0643a555139eea744d379e8c0201de1cb7d5d677,imagePullPolicy: IfNotPresent,args: ["--node",D518,"--lane",v03,"--sentinel",workbench-fake-echo-session-invariance-10x,"--state-root",/var/lib/web-probe-sentinel,"--host",0.0.0.0,"--port","8080"],env: [{name: UNIDESK_WEB_PROBE_SENTINEL_ID,value: workbench-fake-echo-session-invariance-10x},{name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-bootstrap,key: bootstrap-admin-password}}},{name: FAKE_ECHO_SENTINEL_PROMPTS_JSON,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-prompt-set,key: prompts.json}}}],ports: [{name: http,containerPort: 8080}],readinessProbe: {httpGet: {path: /api/health,port: http}},livenessProbe: {httpGet: {path: /api/health,port: http}},volumeMounts: [{name: state,mountPath: /var/lib/web-probe-sentinel}]}],volumes: [{name: state,persistentVolumeClaim: {claimName: hwlab-web-probe-sentinel-state}}]}}}}
---
{apiVersion: v1,kind: Service,metadata: {name: hwlab-web-probe-sentinel,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},spec: {type: ClusterIP,selector: {app.kubernetes.io/name: hwlab-web-probe-sentinel},ports: [{name: http,port: 8080,targetPort: http}]}}
---
{apiVersion: batch/v1,kind: CronJob,metadata: {name: hwlab-web-probe-sentinel-quick-verify,namespace: hwlab-v03,labels: &labels {app.kubernetes.io/name: hwlab-web-probe-sentinel-quick-verify,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/component: cadence-scheduler,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x},annotations: {unidesk.ai/cadence: 10m,unidesk.ai/target-validation-max-seconds: "300"}},spec: {schedule: "*/10 * * * *",concurrencyPolicy: Forbid,successfulJobsHistoryLimit: 3,failedJobsHistoryLimit: 5,startingDeadlineSeconds: 600,jobTemplate: {spec: {activeDeadlineSeconds: 360,ttlSecondsAfterFinished: 86400,backoffLimit: 0,template: {metadata: {labels: *labels},spec: {restartPolicy: Never,serviceAccountName: hwlab-web-probe-sentinel,containers: [{name: quick-verify,image: 127.0.0.1:5000/hwlab/web-probe-sentinel@sha256:017b23dbc40c79d3d84279fa0643a555139eea744d379e8c0201de1cb7d5d677,imagePullPolicy: IfNotPresent,command: [bun,scripts/cli.ts],args: [web-probe,sentinel,validate,"--node",D518,"--lane",v03,"--sentinel",workbench-fake-echo-session-invariance-10x,"--quick-verify","--confirm","--wait","--timeout-seconds","300"],env: [{name: UNIDESK_WEB_PROBE_SENTINEL_ID,value: workbench-fake-echo-session-invariance-10x},{name: HWLAB_BOOTSTRAP_ADMIN_PASSWORD,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-bootstrap,key: bootstrap-admin-password}}},{name: FAKE_ECHO_SENTINEL_PROMPTS_JSON,valueFrom: {secretKeyRef: {name: hwlab-web-probe-sentinel-prompt-set,key: prompts.json}}},{name: UNIDESK_WEB_PROBE_SENTINEL_DIRECT_SERVICE,value: "1"}]}]}}}}}}
---
{apiVersion: apps/v1,kind: Deployment,metadata: {name: hwlab-web-probe-sentinel-frpc,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x,app.kubernetes.io/component: tunnel}},spec: {replicas: 1,selector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-frpc}},template: {metadata: {labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel-frpc,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x,app.kubernetes.io/component: tunnel},annotations: {unidesk.ai/public-base-url: https://monitor.pikapython.com,unidesk.ai/frp-server: 82.156.23.220:22000,unidesk.ai/frp-remote-port: "22093"}},spec: {containers: [{name: frpc,image: 127.0.0.1:5000/hwlab/frpc:v0.68.1,imagePullPolicy: IfNotPresent,args: ["-c",/etc/frp/frpc.toml],volumeMounts: [{name: frpc-config,mountPath: /etc/frp/frpc.toml,subPath: frpc.toml,readOnly: true}]}],volumes: [{name: frpc-config,secret: {secretName: hwlab-web-probe-sentinel-frpc}}]}}}}
---
{apiVersion: networking.k8s.io/v1,kind: NetworkPolicy,metadata: {name: hwlab-web-probe-sentinel-egress,namespace: hwlab-v03,labels: {app.kubernetes.io/name: hwlab-web-probe-sentinel,app.kubernetes.io/part-of: hwlab-web-probe-sentinel,app.kubernetes.io/managed-by: unidesk,unidesk.ai/spec-ref: PJ2026-01060508,unidesk.ai/node: D518,unidesk.ai/lane: v03,unidesk.ai/web-probe-sentinel-id: workbench-fake-echo-session-invariance-10x}},spec: {podSelector: {matchLabels: {app.kubernetes.io/name: hwlab-web-probe-sentinel}},policyTypes: [Ingress,Egress],ingress: [{from: [{namespaceSelector: {}}],ports: [{protocol: TCP,port: 8080}]}],egress: [{to: [{namespaceSelector: {}}]}]}}
@@ -0,0 +1,53 @@
{
"apiVersion": "v1",
"kind": "List",
"items": [
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v03-hwpod-preinstalled-specs",
"namespace": "hwlab-v03",
"labels": {
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/config-kind": "hwpod-preinstalled-specs"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"hwlab.pikastech.local/source-ref": "config/hwlab-hwpod-preinstalls/constart-71freq-c.yaml#hwpodPreinstall",
"hwlab.pikastech.local/verification-issue": "pikasTech/HWLAB#2183"
}
},
"data": {
"constart-71freq-c.yaml": "apiVersion: hwlab.dev/v0alpha1\nkind: Hwpod\nmetadata:\n uid: CONSTART-71FREQ-C\n name: constart-71freq-c\nspec:\n targetDevice:\n board: ConStart 71-FREQ Controller\n mcu: STM32H723ZGTx\n flashBase: \"0x08000000\"\n workspace:\n path: \"F:\\\\Work\\\\ConStart\"\n toolchain: keil-mdk\n projectRoot: projects/71-00075-11\n keilProject: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW.uvprojx\n keilTarget: FREQ_Controller_FW\n hexPath: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW/FREQ_Controller_FW.hex\n mapPath: projects/71-00075-11/FirmWare/MDK-ARM/FREQ_Controller_FW/FREQ_Controller_FW.map\n keilCliPath: \"C:\\\\Users\\\\liang\\\\.agents\\\\skills\\\\keil\\\\keil-cli.py\"\n debugProbe:\n type: cmsis-dap\n adapter: keil\n probeUid: 3FD750C63E342E24\n probeName: MicroLink CMSIS-DAP\n programBackend: keil-headless\n autoBindUvoptx: true\n ioProbe:\n uart:\n id: uart/1\n port: COM4\n baudrate: 921600\n nodeBinding:\n nodeId: node-d601-f103-v2\n nodeType: pc-host",
"constart-71freq-c.meta.json": "{\n \"contractVersion\": \"hwpod-spec-registry-v1\",\n \"source\": {\n \"kind\": \"preinstalled-yaml-first-spec\",\n \"workspaceRoot\": \"F:\\\\Work\\\\ConStart\",\n \"projectRoot\": \"projects/71-00075-11\",\n \"verificationIssue\": \"pikasTech/HWLAB#2183\",\n \"verifiedAt\": \"2026-06-26\"\n }\n}"
}
},
{
"apiVersion": "v1",
"kind": "ConfigMap",
"metadata": {
"name": "hwlab-v03-project-management-bootstrap",
"namespace": "hwlab-v03",
"labels": {
"hwlab.pikastech.local/gitops-target": "v03",
"hwlab.pikastech.local/source-commit": "6120f7fdfeea04cd47d69091fe6d4cf4cd076ead",
"hwlab.pikastech.local/environment": "v03",
"hwlab.pikastech.local/profile": "v03",
"hwlab.pikastech.local/config-kind": "project-management-bootstrap-sources"
},
"annotations": {
"hwlab.pikastech.local/rendered-by": "scripts/gitops-render.mjs",
"hwlab.pikastech.local/source-ref": "config/hwlab-project-management/constart-71freq-mdtodo.yaml#projectManagement.sources[0]",
"hwlab.pikastech.local/verification-issue": "pikasTech/HWLAB#2183"
}
},
"data": {
"sources.json": "[\n {\n \"sourceId\": \"constart-71freq-mdtodo\",\n \"sourceKind\": \"hwpod-workspace\",\n \"displayName\": \"71-FREQ MDTODO\",\n \"projectId\": \"project_constart_71freq\",\n \"hwpodId\": \"constart-71freq-c\",\n \"nodeId\": \"node-d601-f103-v2\",\n \"workspaceRootRef\": \"F:\\\\Work\\\\ConStart\",\n \"mdtodoRootRef\": \"docs/MDTODO\",\n \"maxFiles\": 300,\n \"capabilities\": [\"probe\", \"list\", \"read\", \"write\", \"reindex\"]\n }\n]"
}
}
]
}

Some files were not shown because too many files have changed in this diff Show More