0.8.95
Removed
std/agent/prompts: removed the unusedaction_required_feedback,
action_turn_nudge, andprotocol_violation_feedbackprompt entrypoints
(their*_promptfunctions, registry/catalog/override entries, and
.harn.promptexemplar files). They had no in-tree caller — the live tool-
call repair path uses the parametricparse_guidanceprompt — and the
protocol_violation_feedbackexemplar hardcoded a text-format<tool_call> name({...})shape that does not apply to json/native tool-format sessions.
Fixed
harn-vmtool-call parser feedback is now precise about what went wrong and
how to fix it, so cheap coding models stop re-emitting the same broken turn:- Source/test code emitted where a tool call was expected (
it(...),
expect(...),describe(...),assertServiceCount(...), …) no longer
reports a misleadingUnknown tool 'it'. The feedback now names the real
cause — code outside a heredoc/contentenvelope — and tells the model to
wrap it. - The "Unknown tool" available-tools list is no longer capped at 20 names
(which could hide the very tool the model needed). It lists every tool, and
appends an explicit…and N moreonly for a pathologically large registry —
never silently truncating. The highest-frequency misses (read,write,
list,search, …) now carry a canonical alias hint, e.g.read→
look({ intent: "read" }). Genuine close-miss typos still get the
Did you mean '<tool>'?suggestion. Applies to both the bare-TS and
native-JSON tool-call parsers. - A denied/permission-gated tool result now carries an actionable
next_step
("do not retry the same call; make progress with allowed tools, or ask for
permission") instead of a bare{"error":"permission_denied"}. - Object-literal tool-call parse errors now include a short
Raw:preview of
the offending span (mirroring the native-JSON parser), so the model can tell
which of several on-screen calls failed.
- Source/test code emitted where a tool call was expected (
harn-vmobservation-mask compaction no longer shreds structured failure
detail. Masking a large tool output (default_mask_tool_result) used a
weaker, divergent filter than the microcompact path and dropped assertion-
value lines (left:/right:/expected:/actual:/got/want), rustc
continuation lines (-->,= help:, numbered source rows,^carets), and
Lnnn:failing-line markers — so the model re-read a summary with the
actual-vs-expected values removed. There is now ONE shared failure-signal
filter (is_failure_signal_line) used by both the microcompact and
observation-mask paths; the mask preserves those failure lines (bounded)
alongside the first-line preview.- Egress NetPolicy CIDR/IP allow & deny rules now match resolved host IPs,
not just URL literals (#3174). A rule likedeny 203.0.113.0/24or
allow 10.0.0.0/8previously applied only when the request URL contained a
literal IP, so a CIDR denylist could be bypassed with a DNS name and a CIDR
allowlist wrongly rejected hostnames that resolve into the allowed range. The
IP/CIDR rules are now evaluated against the host's resolved addresses in the
off-runtime egress pre-check (clean typedEgressBlocked) and re-enforced at
connect time by theGuardedResolver, which pins the connection to the same
checked address — closing the DNS-rebinding window. Literal-IP, hostname, and
*.suffixrules are unchanged.
Install / Upgrade
cargo install harn-cliFull Changelog: v0.8.94...v0.8.95