{"slug": "i-shipped-my-first-rust-release-and-ci-turned-red-twice-in-20-minutes", "title": "I Shipped My First Rust Release, and CI Turned Red Twice in 20 Minutes", "summary": "A developer shipped the first public release of AgentOS, a Rust runtime layer for AI agents, and encountered two CI failures within 20 minutes. The first was a clippy lint fix, and the second involved a cross-compilation issue with OpenSSL on Linux arm64, which was temporarily resolved by dropping that target from the release matrix.", "body_md": "I shipped the first public release of my Rust project last night. Within about twenty minutes, CI turned red twice. Here's what broke, how I found it, and the two calls I made under a bit of time pressure.\n\n[AgentOS](https://github.com/WAHIB-EL-KHADIRI/AgentOS) is a runtime layer for AI agents — the infrastructure *around* an agent, not the agent logic itself: supervised lifecycle, a gRPC message bus, a health endpoint, an SSE event stream, a secrets vault, and deterministic time-travel replay (every LLM/tool exchange gets journaled, so a run can be replayed offline with no API cost, and forked into alternate timelines from any checkpoint).\n\nIt's a 10-crate Rust workspace, MIT/Apache-2.0. I'd been building it privately for a while. Last night I flipped the repo to public and tagged the first alpha release. That's when things got interesting.\n\nThe repo had been private, so CI hadn't run against a fresh `clippy`\n\nin a while. The moment I pushed a commit after going public, this showed up:\n\n``` php\nerror: you seem to want to iterate on a map's values\n   --> crates/bus/src/grpc.rs:631:37\n    |\n631 |         for (_agent_id, senders) in subs.iter() {\n    |                                     ^^^^^^^^^^^\n    |\n    = help: use the corresponding method\n631 -         for (_agent_id, senders) in subs.iter() {\n631 +         for senders in subs.values() {\n```\n\n`clippy::for_kv_map`\n\n, denied by `-D warnings`\n\nin CI. Fair catch — the code was iterating a `HashMap`\n\nand discarding the key on every iteration, which is exactly what `.values()`\n\nis for. One-line fix:\n\n```\n// before\nfor (_agent_id, senders) in subs.iter() {\n\n// after\nfor senders in subs.values() {\n```\n\nPushed, CI green again. This one was boring, which is the best kind of bug to have.\n\nThe bigger one showed up when I tagged `v0.1.0-alpha`\n\n. The release workflow builds five targets in parallel — Linux x64, Linux arm64, macOS Intel, macOS Apple Silicon, Windows — and packages each into a binary release with checksums.\n\nFour went green. Linux arm64 died with:\n\n```\nerror: failed to run custom build command for `openssl-sys v0.9.116`\n...\nCould not find directory of OpenSSL installation\n$HOST = x86_64-unknown-linux-gnu\n$TARGET = aarch64-unknown-linux-gnu\n```\n\n`openssl-sys`\n\nneeds a real OpenSSL installation (headers + libs) for the *target* architecture to link against, and cross-compiling from an x86_64 GitHub Actions runner to arm64 doesn't have that available without extra setup. Not a code bug — a missing piece of cross-compilation infrastructure.\n\nI had three honest options at that point:\n\nI went with option 3. Four platforms is still a real alpha release that covers the overwhelming majority of contributors trying it out. Blocking on a cross-compilation edge case for a Linux architecture almost nobody in the alpha audience runs felt like optimizing for the wrong thing at midnight. And silently vendoring a rushed fix into a security-relevant dependency (TLS) is exactly the kind of shortcut that comes back to bite you.\n\nSo: pulled the target from the matrix, re-tagged, watched the four remaining builds go green, and [filed the real fix as its own issue](https://github.com/WAHIB-EL-KHADIRI/AgentOS/issues/38) with three candidate approaches laid out (the best one is probably migrating off `openssl-sys`\n\nto `rustls`\n\nentirely, which would remove the system OpenSSL dependency for *every* target, not just arm64 — cross-compilation problems like this are usually a sign the dependency choice needs revisiting, not just the CI config).\n\nBefore any of the above, I'd actually run the README's own quickstart end to end — `cargo build --workspace`\n\n, then run the example agent — specifically to catch the gap between \"the README claims this works\" and \"this actually works.\" It did, and the real terminal output (supervisor spawning the agent, health server on `:8080`\n\n, gRPC bus on `:50051`\n\n, an SSE stream on `:8081`\n\n) is now in the README instead of a hypothetical example. I also downloaded the actual released Windows binary afterward and ran `agentOS.exe --version`\n\nagainst it — small thing, but it's the difference between \"the release workflow exited 0\" and \"a stranger who downloads this file gets a working program.\"\n\nNeither bug was catastrophic. Both were the kind of thing that's mildly stressful in the moment and completely mundane in hindsight — which is most of what real engineering work actually looks like, release-day war stories included.\n\nIf you want to poke at it, the repo's here: ** github.com/WAHIB-EL-KHADIRI/AgentOS**. There are a handful of labeled\n\n`good first issue`\n\ns if anyone wants to dig into a self-contained piece of it — I'm around to answer questions on any of them.", "url": "https://wpnews.pro/news/i-shipped-my-first-rust-release-and-ci-turned-red-twice-in-20-minutes", "canonical_source": "https://dev.to/wahib_el_khadiri_0/i-shipped-my-first-rust-release-and-ci-turned-red-twice-in-20-minutes-31hp", "published_at": "2026-07-21 22:43:39+00:00", "updated_at": "2026-07-21 22:59:07.047796+00:00", "lang": "en", "topics": ["developer-tools", "ai-infrastructure"], "entities": ["AgentOS", "GitHub Actions", "OpenSSL", "rustls"], "alternates": {"html": "https://wpnews.pro/news/i-shipped-my-first-rust-release-and-ci-turned-red-twice-in-20-minutes", "markdown": "https://wpnews.pro/news/i-shipped-my-first-rust-release-and-ci-turned-red-twice-in-20-minutes.md", "text": "https://wpnews.pro/news/i-shipped-my-first-rust-release-and-ci-turned-red-twice-in-20-minutes.txt", "jsonld": "https://wpnews.pro/news/i-shipped-my-first-rust-release-and-ci-turned-red-twice-in-20-minutes.jsonld"}}