Heron v0.4.0
[0.4.0] — 2026-05-29
Changed — Rebrand to Heron
- Project renamed TokenScope → Heron. The binary is now
heron
(wastokenscope); the 10 internal library crates moved from the
ts-*prefix toh-*; the GitHub repo is nowNetis/heron(the old
URL redirects). Console title, logo (a new heron mark), and all
install/docs URLs updated.
Added — Quality infrastructure
- Deterministic fault-injection harness for the DuckDB backend
(feature-gated) plus recovery tests that drive the FATAL → reopen →
every-surface-works path without relying on real load pressure. - Schema-migration tests over synthesized legacy DB shapes, locking the
auto-migration paths against silent regression. - CI lint gates: referenced-secret provisioning, secret-value sanity,
validated-constructor scoping, and an infra-leakage gate that fails on
any non-allow-listed private IP or private-key block in tracked files.
Security / privacy
- Removed the demo deploy tooling, which hard-coded a server address, a
jump-host username, and a plaintext password. Demo setup is now an
AI-agent prompt in the docs instead. - Scrubbed internal infrastructure identity (private IPs, hostnames)
from source comments, docs, scripts, and test fixtures; tests now use
RFC5737 documentation ranges.
Added — Agent-era observer (H002)
- Agent traffic classification: every LlmCall carries
is_agent_request,
tool_surface,agent_topology,tool_call_count,tool_names. Every
AgentTurn rolls uptool_surfaces,tool_call_total,agent_topology,
suspicious_skills. Newtool_surfacedimension onllm_metrics. - Console: agent-aware columns and filters on Agent Turns; Agent breakdown
section on turn detail; tool-surface facet on Performance. - Config:
[agent_classifier]block indefault.tomlfor tool taxonomy. - Internal metrics:
agent_classifier.unknown_count,
classifier_mixed_count.
Capture
- Default live-capture configuration now covers common LLM-serving ports,
reducing the need for explicit CLI capture filters in quickstart flows.
LLM wire-API support
- OpenAI Chat streaming now captures
delta.reasoning_contentand
delta.reasoning, with console rendering before normal content. - OpenCode agent profile detection added for clients that expose a stable
x-session-affinityanchor.
Agent turn tracking
- Generic fallback turn grouping now requires a tool/function-call anchor, so
text-only SDK calls stay on the LLM Calls page instead of producing
synthetic one-call Agent Turns.
Metrics
- TTFT handling now distinguishes streaming and non-streaming calls, with
stream-only TTFT charts and backfilled rollups from stored call data. - Dashboard active-resource history added for TCP connections and agent
turns. - Long-range chart axes use date-aware labels for multi-day windows.
Console
- Settings page added for capture sources, including interface discovery,
source editing, grouped source-type controls, and restart flow. - LLM Calls gained stream/non-stream filtering.
- List pages persist the selected item in the URL.
- Agent-kind filter options are derived from observed data in the active
window instead of a fixed list.
API
GET /api/capture/interfaceslists available capture interfaces.PUT /api/capture/sourcesupdates capture-source configuration and
restarts the process when needed.
Documentation
- README reframed around agent observability with refreshed screenshots.
- README quickstart now uses the default live-capture command and no longer
includes an explicit capture-filter example. - Removed the LLM call detail screenshot and its README reference.
- Removed project-origin/company copy from public docs.
Development
- Headless PR review workflow added for CI.
- Repository instructions now require PR text to scrub private environment
details before publication.
What's Changed
- feat(settings): in-app capture configuration + self-restart by @vaderyang in #12
- feat(dashboard): TTFT stream/non-stream split + rollup backfill + filters by @vaderyang in #13
- feat(dashboard): Active TCP Connections + Active Agent Turns charts by @vaderyang in #14
- fix(ts-llm/chat-sse): capture delta.reasoning_content + delta.reasoning by @vaderyang in #15
- feat(filters): dynamic agent_kind dropdown from actual data in window by @vaderyang in #16
- feat(ts-llm/agents): opencode profile keyed off x-session-affinity by @vaderyang in #17
- feat(console/list-pages): persist selected item id in URL by @vaderyang in #18
- feat(ci): headless PR review agent (phase 1) by @vaderyang in #28
- docs(README): reframe as agent observability + Playwright-driven screenshots by @vaderyang in #30
- Clean up README capture docs by @vaderyang in #32
- fix(pr-review): :4000 LiteLLM + auth secret + NO_PROXY + auto-merge trusted PRs by @vaderyang in #31
- fix(pr-review): drop dup no_proxy env key by @vaderyang in #33
- fix(pr-review): override inherited http_proxy so curl reaches LiteLLM by @vaderyang in #34
- fix(pr-review): keep http_proxy; only set no_proxy by @vaderyang in #35
- fix(pr-review): overlay reviewer scripts from default branch by @vaderyang in #36
- fix(pr-review): never APPROVE on agent failure / unstructured body by @vaderyang in #37
- fix(pr-review): feed prompt via stdin to claude --print by @vaderyang in #38
- feat(console): selected_at anchor recovers item window on stale shared link by @vaderyang in #19
- fix(pr-review): brand as "vivi"; never post failures to PR by @vaderyang in #39
- feat(console): TPS instead of TPOT, agent-turns column reorder, sidebar logo by @vaderyang in #20
- ci: opt all JS actions into Node.js 24 runtime by @vaderyang in #40
- feat(console/charts): x-axis tick adapts to time-range duration by @vaderyang in #21
- fix(console/agent-sessions): keep prior data during refetch (no flash) by @vaderyang in #24
- feat(api): lite mode for /calls — unblock mega-turn detail page by @vaderyang in #23
- feat: fold llmproxy duplicate turns by passive pair detection by @vaderyang in #22
- feat(services): Path view + Overview agent charts (deploy roll-up) by @vaderyang in #27
- Fix dynamic agent kind filters by @vaderyang in #29
- Fix generic agent turn grouping by @vaderyang in #41
- Revise unreleased changelog by @vaderyang in #42
- Update repository agent guidance by @vaderyang in #43
- Add local agent workflow skills by @vaderyang in #44
- Add agent-bot: issue triage + wiwi dev agent + auto-merge by @vaderyang in #45
- post_review: use ADMIN_GH_TOKEN for the admin-merge fallback by @vaderyang in #46
- Reject out-of-range time params; clamp SQL timestamp formatter by @vaderyang in #47
- pair_sweeper: CHECKPOINT after each batch + reopen on FATAL by @vaderyang in #48
- agent-bot: use AGENT_GH_TOKEN for the agent:try label fan-out by @vaderyang in #51
- ci: P0 lint gates for secret-ref + validated-constructor classes by @vaderyang in #53
- DuckDB FATAL recovery: rebuild every connection (closes #50) by @vaderyang in #52
- wiwi: drop PAT from actions/checkout; embed in push URL instead by @vaderyang in #54
- wiwi: bump timeout to 120m + stream claude output live by @vaderyang in #55
- wiwi: clear extraheader before push so PAT (workflow scope) wins by @vaderyang in #56
- ci: lint secret VALUES, not just references (catches the '-' bug) by @vaderyang in #57
- wiwi: enforce commit + add auto-commit fallback by @vaderyang in #58
- Rebrand → Heron (Phase 1: rename app binary tokenscope → heron) by @vaderyang in #59
- agent-bot: tolerate transient LiteLLM outages — pre-flight wait + mid-run retry by @vaderyang in #63
- ci: deterministic recovery + schema-migration tests (P1 quality infra) by @vaderyang in #64
- ci(pr-review): bump vivi agent + job timeout to 7200s/120min by @vaderyang in #67
- Rebrand → Heron Phase 2: rename ts-* library crates → h-* by @vaderyang in #66
- chore(rebrand+privacy): repo→heron, scrub infra leakage, leakage gate, heron logo by @vaderyang in #69
- fix(privacy): scrub internal IP left in test fixture (lost in #69 race) by @vaderyang in #70
- chore(release): 0.4.0 — Heron rebrand + quality infra + privacy by @vaderyang in #71
Full Changelog: v0.2.0...v0.4.0