{"id":590,"date":"2025-12-18T03:27:10","date_gmt":"2025-12-18T11:27:10","guid":{"rendered":"https:\/\/blog.canutethegreat.com\/?p=590"},"modified":"2026-11-08T01:32:00","modified_gmt":"2026-11-08T09:32:00","slug":"patronus-dev-log-2-kubernetes-a-react-ui-and-a-rust-workspace-that-wouldnt-build","status":"publish","type":"post","link":"https:\/\/blog.canutethegreat.com\/index.php\/2025\/12\/18\/patronus-dev-log-2-kubernetes-a-react-ui-and-a-rust-workspace-that-wouldnt-build\/","title":{"rendered":"Patronus dev log 2: Kubernetes, a React UI, and a Rust workspace that wouldn&#8217;t build"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Part 2 in the Patronus dev log series.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Backdated, written in November 2026 from the git log and CI records. <a href=\"https:\/\/blog.canutethegreat.com\/index.php\/2025\/10\/11\/patronus-dev-log-1-a-firewall-that-claimed-100-feature-parity-on-day-one\/\">Part 1<\/a> covered October 8 to 11.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">October 12 to 14<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The run continues. A Kubernetes operator with a Helm chart and CRD generation (the log calls it Sprint 36 and 37), &#8220;Integration Testing &amp; CI\/CD Pipeline&#8221; as Sprint 39 (October 12), a project status document as Sprint 40, then a topology visualization, LZ4 compression for WAN links, a React dashboard hooked up to the Rust backend, and OpenTelemetry tracing on the 13th. One commit on the 14th, then nothing until December.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In total, 98 commits in October 2025, and all 15 CI runs that month were skipped.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">December<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">December has commits on four days. On the 12th: &#8220;Remove GitHub CI\/CD configuration&#8221;. I moved off GitHub Actions to my own Forgejo, the same week I did it for Horcrux (part 2 of that series). Same reason as there: GitHub likes to block things, and the repo is still mirrored to GitHub.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">December 16: &#8220;fix: Complete Rust workspace compilation and dependency resolution&#8221;, 54 files. Its message lists missing workspace dependencies (uuid, sysinfo, reqwest, chrono), API breaks from base64, axum and sysinfo upgrades, netlink imports, missing nix features, an async recursion that needed <code>Box::pin<\/code>, &#8220;syntax errors in derive macros and missing brackets&#8221; and missing feature flags. The workspace claimed 19 crates and 45,000 lines on day one, and two months later it hadn&#8217;t compiled cleanly. That contradicts the &#8220;Complete Implementation&#8221; commit from part 1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">December 17, &#8220;Comprehensive code review fixes and feature completions&#8221;: unwrap() calls replaced in backup and validation code, NaN-safe float comparisons in the detection modules, and &#8220;wire web handlers to actual sysinfo metrics (CPU, memory, disk, network)&#8221;. So until then the dashboard metrics weren&#8217;t coming from the machine. Also: alert conditions now checked against system metrics, CIDR matching for NetworkPolicy completed, and a hardcoded address removed from HA election.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">December 19 added flow tracking, an installer crate and eBPF\/XDP enhancements. The repo then goes quiet until September 24, 2026, nine months.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I think of this period<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In those weeks the repo&#8217;s documents described a finished product, while the code still needed a compile fix, and then a review pass before the dashboard showed real numbers. The 15 skipped runs in October and 11 more in December mean CI never tested any of it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The commits from this period say what was done and never why, so I have no design decisions to report.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Other parts: <a href=\"https:\/\/blog.canutethegreat.com\/index.php\/2025\/10\/11\/patronus-dev-log-1-a-firewall-that-claimed-100-feature-parity-on-day-one\/\">Part 1<\/a>.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>The rest of the first burst, then December 2025: I dropped GitHub CI, and found that the Rust workspace didn&#8217;t compile and the web handlers weren&#8217;t reading real metrics.<\/p>\n","protected":false},"author":1,"featured_media":614,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,26],"tags":[366,275,373,291,376],"class_list":["post-590","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security","category-software-engineering","tag-ci","tag-kubernetes","tag-patronus-dev-log","tag-rust","tag-sd-wan"],"_links":{"self":[{"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/posts\/590","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/comments?post=590"}],"version-history":[{"count":5,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/posts\/590\/revisions"}],"predecessor-version":[{"id":647,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/posts\/590\/revisions\/647"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/media\/614"}],"wp:attachment":[{"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/media?parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/categories?post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.canutethegreat.com\/index.php\/wp-json\/wp\/v2\/tags?post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}