Launch v0.7.0 → main: README rebuild + collateral + eBPF advisory#176
Conversation
…175) * chore(ebpf): scrub machine-specific /home path from uprobe tests Test assertions used a real home-dir prefix (/home/v/...) that trips the infra-leakage CI gate. The tests only check exe basename matching, so the prefix is irrelevant — replace with /home/user/. * docs(launch): rebuild README (GIF-first) + corrected collateral, bump v0.7.0 Reconcile the marketing launch package with the shipped product: - README: adopt the GIF-first, conversion-driven layout (hero demo GIF, 30-second pcap quick start, three-up differentiator table) while keeping the existing technical accuracy — neutral tagline (wire OR on-host TLS boundary, not 'network wire' only), opt-in eBPF (no runtime --ebpf flag), docs/configure.md links, just-based contributor flow, canonical /api/traces. No decorative per-heading emoji. - Add docs/images/hero.gif (pcap-replay demo; marketing re-cuts the eBPF GIF). - launch/: paste-ready PH/HN/Twitter copy corrected to the shipped product (curl installer not npm, eBPF as experimental/opt-in, /api/traces, v0.7.0) plus GitHub Topics/Description/social-preview checklist. - Bump VERSION SSOT 0.6.0 -> 0.7.0 (Cargo.toml + package.json) and add the 0.7.0 CHANGELOG section over the OTel-rename Unreleased entries. * feat(ebpf): surface experimental opt-in advisory in startup log + Settings UI There is no `--ebpf` runtime flag (eBPF is enabled via the `ebpf` cargo feature + a `type = "ebpf"` capture source), so the capability was easy to miss. Add discoverability without a new flag: - main.rs: when no eBPF source is active, log a one-line advisory on Linux (runtime cfg! check, so it stays type-checked on every platform) pointing at the cargo feature + TOML source and docs/design/02-capture.md. - console Settings: tag the existing eBPF capture toggle 'experimental' and note the opt-in requirements in its description. * chore(version): sync Cargo.lock workspace crates to v0.7.0 --------- Co-authored-by: Vader Yang <vader.yang@netis.com>
There was a problem hiding this comment.
The pcaps are in testdata/pcaps/corpus/, not directly in testdata/pcaps/. The README says "The repo ships fixtures in testdata/pcaps/ — replay any of them." This is slightly imprecise (they're in the corpus/ subdir) but not a blocker — a user will find them. Worth a Suggestion.
I have enough to write the review. Let me compile the findings.
The task reminder about TaskCreate isn't applicable — this is a single review pass with a fixed output format, not multi-step tracked work.
Summary
PR #176 is the v0.7.0 launch cut: a README rebuild (GIF-first, conversion-driven), new launch/ collateral (PH/HN/Twitter paste-ready copy), a VERSION/Cargo/package.json bump 0.6.0→0.7.0, a small eBPF discoverability nudge in main.rs (one tracing::info! line on Linux when no eBPF source is active), an "experimental" tag on the console Settings eBPF toggle, and a scrub of a real /home/v/... path from the eBPF uprobe tests to /home/user/... (the approved leakage-gate placeholder). No sensitive-information leakage, no schema/storage/capture-pipeline regressions, no TS↔Rust drift. The change is well-scoped and the code paths verify. Recommendation: APPROVE.
Suggestions
- server/app/heron/src/main.rs:374 — The eBPF advisory
tracing::info!fires on every Linux startup that lacks an eBPF source, including the canonical--pcap-file capture.pcap --no-retentionquick start andheron -i eth0capture that the new README promotes. For a user who has consciously chosen libpcap/pcap replay, this is a recurring one-liner of "you're not using eBPF" on every run. Consider gating it to only fire when no capture source is active at all (i.e. a truly passive run), or downgrading totracing::debug!/ moving it behind a--help-eBPFhint — the discoverability goal is met without implying the chosen mode is incomplete. - README.md:45 — "The repo ships fixtures in
testdata/pcaps/— replay any of them" is slightly imprecise: the.pcapfiles live intestdata/pcaps/corpus/, not directly intestdata/pcaps/(which holdsREADME.md,corpus.toml, and thecorpus/goldensubdirs). A first-time user following the link will land one level above the actual pcaps. Either point attestdata/pcaps/corpus/or add a one-line "incorpus/" clarification. - launch/PH_Submission_Details.md:44–48 — The Maker's First Comment claims "On-host eBPF capture … What's new in v0.7.0", but per
CHANGELOG.mdthe eBPF SSL-uprobe capture shipped as a first-class soak-gated capability in 0.6.0 (and experimental since 0.5.1). What's actually new in 0.7.0 is only the discoverability advisory + the "experimental" UI tag — the capture itself is not new. Rephrase to "v0.7.0 makes eBPF capture discoverable…" or move the eBPF paragraph out of the "What's new" framing to avoid an inaccurate launch claim on Product Hunt. - launch/HN_and_Twitter_Posts.md:18 — "We run Heron … on our inference fleet" + "~73% of Claude Code's opus-model calls in our capture" discloses a specific production-telemetry finding about a third party's CLI behavior. Not a leakage of your infra, but it is a claim that will attract scrutiny on HN ("show us the data"). Make sure the 73% figure and the "security monitor sidecar" characterization are reproducible / defensible before posting; if they're from a private corpus you can't share, expect pushback. (Also: the
<block>mechanism described in line 20 — verify this matches the actual prompt-injection-blocking behavior of the released Claude Code version; it's presented as fact.) - CHANGELOG.md:7–9 —
## [Unreleased]is now immediately followed by## [0.7.0]with no body under Unreleased. That's valid Keep-a-Changelog, but if you intend to accumulate 0.7.1+ entries under Unreleased post-cut, the empty heading is fine; if not, removing the bare## [Unreleased]line until the next change lands is tidier. Minor.
Questions
- launch/PH_Submission_Details.md:15 / launch/README.md:27 —
https://heron-ai.pages.devis listed as the Website URL for the Product Hunt submission, butlaunch/README.md:27notes the landing page is "not in this repo … stand it up separately before launch." Is the pages.dev site actually live / owned by the org, or is this a placeholder that needs resolving before the PH submission goes out? - launch/HN_and_Twitter_Posts.md:39 — The YouTube link
https://youtu.be/yZzEBb-wK58is referenced as an alternative to the hero GIF. Is this video public and owned by the org? If it's an unlisted/private draft, it needs to be made public before the thread goes out. - server/app/heron/src/main.rs:374 — Is the intent for the eBPF advisory to fire on every Linux run without an eBPF source, or only when the user might benefit from the nudge (e.g. when they're capturing live traffic and eBPF would add value)? If the latter, the current unconditional fire is broader than intended.
Verified
- No sensitive-information leakage. Grepped the diff for RFC1918/CGNAT IPs, private-key material, internal hostnames, and machine-specific paths — none present. The
/home/v/...→/home/user/...scrub inserver/h-capture/src/ebpf/source.rs:910,921,925matches the approved placeholder pattern used byscripts/lint/test-check-leakage.shanddocs/configure.md:133. - Schema/storage untouched. No
*-duckdbSQL changes; no body-scan smells; noarg_max/MAX(body)patterns introduced. The OTel rename (traces/spans) was already inUnreleasedand is now correctly placed under[0.7.0]. - Capture pipeline unchanged.
h-protocol/tcp.rs/joiner.rsnot touched. The onlyh-capturechange is the test-path scrub —exe_link_has_basenamebehavior is unchanged (the assertion is on the basename, prefix is irrelevant per the commit message). - Rust type/fn compatibility.
CaptureSourceConfig::Ebpf { .. }variant exists atserver/h-common/src/config.rs:310and is already imported inmain.rs:17. Thematches!pattern atmain.rs:373compiles against the real variant shape (verified struct fields).effective_pipelinesisVec<PipelineDef>with a.sourcesfield (used identically atmain.rs:316), so theflat_map(|def| def.sources.iter())is sound. - Console change is leaf-only.
console/src/pages/settings.tsx:327–342adds a static<span>badge and rewords two description strings — no new route, no new hook, noqueryKeychange, no TS↔Rust type mirror touched. Noapp.tsxregistration needed. - Version SSOT consistency.
VERSION=0.7.0,server/Cargo.tomlworkspace.package.version =0.7.0,console/package.jsonversion =0.7.0, all workspace crates inCargo.lockbumped to0.7.0(the lone0.6.0atCargo.lock:819is the third-partyconvert_casecrate, not a workspace member). - README asset references resolve.
docs/images/hero.gif(70802 bytes, matches diff),docs/images/agent-turn-detail.png,docs/images/services-path.pngall exist.install.shexists at repo root.--exit-after-drainflag exists (main.rs:118,871).testdata/pcaps/exists (though pcaps are incorpus/subdir — see Suggestion). - Commit message ↔ diff alignment. All four commit claims verified: (1) eBPF test path scrub ✓, (2) README rebuild + launch collateral + 0.7.0 bump ✓, (3) eBPF advisory in main.rs + Settings UI tag ✓, (4) Cargo.lock sync ✓.
🤖 Reviewed by the review bot • workflow run
What
Brings the v0.7.0 launch content onto
main: the GIF-first README rebuild, corrected PH/HN/Twitter collateral underlaunch/, the eBPF experimental/opt-in advisory (startup log + Settings toggle tag), and the v0.7.0 version bump.Why a separate PR
The OTel rename was squash-merged to
mainon its own (#174), while the launch work landed onfeat/otel-rename(#175). Because of the squash,mainandfeat/otel-renamediverged, so the launch content never reachedmain—mainis stillVERSION=0.6.0with no README rebuild. Re-mergingfeat/otel-renamewould re-apply the rename that's already onmain.This PR is the launch delta only, cherry-picked cleanly onto
main(the launch changes touch different files than the rename — README,launch/, version files,main.rsadvisory,settings.tsx— so it applies with no conflicts).Verification
cargo check -p heron, consoletsc -b+eslint, version-sync (0.7.0), and the infra-leakage gate all pass on this tree.Release path
Once merged,
mainrunsci → deploy-staging → {staging-soak, ebpf-soak}. After both stamps land, tag that commitv0.7.0to letrelease.ymlcut the release.Still owned elsewhere
--ebpf, bump to v0.7.0), finalize eBPF segment wording.heron-ai.pages.devlanding page.