Skip to content

Heron v0.5.0

Choose a tag to compare

@github-actions github-actions released this 04 Jun 06:12
· 55 commits to main since this release
726f07c

[0.5.0] — 2026-06-04

Added — ClickHouse storage backend

  • New h-storage-clickhouse crate: a drop-in StorageBackend implementation
    backed by ClickHouse (HTTP interface, async serde RowBinary via the
    clickhouse crate), selected with storage.backend = "clickhouse". Mirrors
    the DuckDB backend's full read + write surface. Fact tables use MergeTree;
    agent_turns uses ReplacingMergeTree(_version) (FINAL reads; version-bumped
    full-row re-insert for update_turn_metadata). Timestamps are
    DateTime64(6, 'UTC') mapped to i64 micros. Retention runs via lightweight
    DELETE on the shared [storage.retention] schedule.
  • Backend-neutral logic (dimension-filter SQL builders, header/token-estimate
    converters, the serving-software classifier) extracted from
    h-storage-duckdb into h-storage (dialect / convert / classify) and
    shared by both backends — single source of truth.
  • storage_bench binary + scripts/bench-storage.sh (just bench-storage):
    ClickHouse-vs-DuckDB write-throughput + read-latency comparison through the
    identical workload. Findings + methodology in
    docs/design/bench-clickhouse-vs-duckdb.md.
  • ClickHouse query_services optimised 46× (5129 ms → 112 ms at 1M rows): the
    body-sample ROW_NUMBER window (which read every row's ~2 KB body columns)
    became an id IN (… LIMIT N BY …) two-phase fetch; arrayDistinct(groupArray)
    groupUniqArray(N); quantileExactquantileTDigest.

Fixed

  • Agent-sessions agent_kind multi-select returned nothing. Selecting more
    than one agent kind sent a CSV (claude-cli,codex-cli) that the sessions
    query exact-matched as a single literal, so the list went empty; selecting one
    kind worked. Fixed in both the DuckDB and ClickHouse backends. Root-caused
    beyond the symptom: agent_kind is now CSV-parsed once at the API boundary
    into a Vec (like every other multi-select filter), so no storage backend
    ever sees a raw CSV to mis-handle.
  • Agent classifier no longer flags unrecognized tool names as "suspicious".
    Tools from non-Claude-Code agents (e.g. web_search, read_file,
    memory_get) were tagged suspicious purely for being absent from a hardcoded
    registry. Any named tool is now classified as a function-call surface; the
    registry treadmill is gone.

Internal

  • Perf/reliability gate for the release pipeline: a rate_pps-throttled
    pcap-file load-soak (tara --load) and criterion hot-path micro-benchmarks.
  • Deploy pipeline hardening: staging-soak stamps its staging-soaked status via
    the REST API (the runner has no gh), and deploy-prod supersedes older
    waiting approvals instead of letting them pile up and wedge the queue.

What's Changed

  • chore(rebrand): scrub residual TokenScope brand strings → Heron by @vaderyang in #72
  • fix(storage): Phase-5 migration adds agent columns nullable (DuckDB compat) by @vaderyang in #76
  • ci: move runner label tokenscope → heron by @vaderyang in #73
  • pr-review: post_review.py downgrades APPROVE → COMMENT on heading-format drift by @vaderyang in #77
  • check-leakage: also flag machine-specific username paths by @vaderyang in #78
  • heron panics on shutdown: JoinHandle polled after completion (supervisor double-poll, exit 101) by @vaderyang in #80
  • fix(llm): register AgentClassifier{Unknown,Mixed}Count on llm worker — stops silent capture loss (#81) by @vaderyang in #82
  • docs: launch assets — README badges, technical blog, launch posts by @vaderyang in #87
  • docs: warn that a bare cargo build ships a blank console (--features console) by @vaderyang in #83
  • feat(staging): continuous auto-deploy to heron-stage VM (Quality Infra L6) by @vaderyang in #84
  • ci(staging): add workflow_dispatch manual deploy to deploy-staging by @vaderyang in #89
  • ci: bump test-job timeout 25→60m for the on-main artifact build by @vaderyang in #90
  • chore(deps): bump DuckDB 1.5.1 → 1.5.3 (fixes checkpoint/ART bug behind the prod outage) by @vaderyang in #92
  • feat(agent-bot): mara — prod observer that auto-files heron incidents by @vaderyang in #86
  • fix(classifier): expand known-tool registry to current CLI inventory (#85) by @vaderyang in #93
  • feat(h-llm): cap stored request/response bodies for 1M-token contexts (#68) by @vaderyang in #95
  • feat(staging): tara soak runner — replay-invariant gate after deploy (L7) by @vaderyang in #94
  • feat(prod): gated auto-deploy to production (deploy-prod — quality-chain tail) by @vaderyang in #97
  • docs: add issue-filing guide + triage-gate explainer by @vaderyang in #98
  • fix(classifier): unrecognized tool names are function calls, not "suspicious" (#85) by @vaderyang in #101
  • feat(capture): pcap-file loop/duration replay mode (load-soak primitive) by @vaderyang in #99
  • docs: scrub internal deployment specifics from pr-review-agent doc by @vaderyang in #100
  • feat(mara): confirm-debounce — a deploy/restart blip no longer files a phantom incident by @vaderyang in #104
  • chore(ci): run CI on dedicated ci-pool runner, off the agent pool by @vaderyang in #112
  • feat(perf): tara load + memory soak — the pre-deploy perf/reliability gate (PR1) by @vaderyang in #106
  • CI hygiene (§5): scrub internal CI backend model identifier from workflow + script comments (follow-up to #100) by @vaderyang in #109
  • feat(storage): ClickHouse backend (drop-in) + storage benchmark by @vaderyang in #103
  • CLIproxy 混合格式问题:OpenAI 请求 → Anthropic 响应,usage token 解析不到 by @vaderyang in #107
  • feat(agent-bot): wiwi auto-revises on vivi CHANGES_REQUESTED (bounded loop) by @vaderyang in #113
  • feat(perf): criterion hot-path micro-benchmarks + CI bitrot gate (PR2) by @vaderyang in #110
  • chore(agent-bot): move auto-merge allowlists out of committed source by @vaderyang in #102
  • ci(staging): stamp staging-soaked commit status — prod go/no-go signal by @vaderyang in #114
  • agent-sessions: agent-kind 过滤把整段 CSV 当单值精确匹配,选中后列表清空 by @vaderyang in #111
  • fix(staging-soak): stamp staging-soaked status with curl, not gh — unblocks ALL prod deploys by @vaderyang in #115
  • refactor(filters): parse agent_kind CSV at the API layer (Vec), not in storage — root-cause fix by @vaderyang in #116
  • fix(deploy-prod): supersede older waiting runs (cancel-in-progress: true) — kills the pile-up wedge by @vaderyang in #117
  • chore(release): v0.5.0 by @vaderyang in #119

Full Changelog: v0.4.0...v0.5.0