Heron v0.5.0
[0.5.0] — 2026-06-04
Added — ClickHouse storage backend
- New
h-storage-clickhousecrate: a drop-inStorageBackendimplementation
backed by ClickHouse (HTTP interface, async serde RowBinary via the
clickhousecrate), selected withstorage.backend = "clickhouse". Mirrors
the DuckDB backend's full read + write surface. Fact tables useMergeTree;
agent_turnsusesReplacingMergeTree(_version)(FINAL reads; version-bumped
full-row re-insert forupdate_turn_metadata). Timestamps are
DateTime64(6, 'UTC')mapped toi64micros. Retention runs via lightweight
DELETEon the shared[storage.retention]schedule. - Backend-neutral logic (dimension-filter SQL builders, header/token-estimate
converters, the serving-software classifier) extracted from
h-storage-duckdbintoh-storage(dialect/convert/classify) and
shared by both backends — single source of truth. storage_benchbinary +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_servicesoptimised 46× (5129 ms → 112 ms at 1M rows): the
body-sampleROW_NUMBERwindow (which read every row's ~2 KB body columns)
became anid IN (… LIMIT N BY …)two-phase fetch;arrayDistinct(groupArray)
→groupUniqArray(N);quantileExact→quantileTDigest.
Fixed
- Agent-sessions
agent_kindmulti-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_kindis now CSV-parsed once at the API boundary
into aVec(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-soakedstatus via
the REST API (the runner has nogh), anddeploy-prodsupersedes 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-poolrunner, 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-soakedcommit 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