Cluster: agent/{curator,curator_backup,background_review,review_engine,
review_idle_queue,insights,learning_graph,learning_graph_render,
learning_mutations,learn_prompt,verification_evidence,verification_stop,
verify_hooks,side_question,title_generator,turn_summary,
manual_compression_feedback,trajectory,moa_trace,trace_upload,verify/*}.
13662 -> 10693 LOC (-2969, -21.7%), behavior-neutral.
- Dead code: 27 private helpers with zero references removed
(_auto_title_session, _resolve_review_model, _parse_make_targets,
_filter_verifiable_paths, _find_subsequence, _is_under_root/_temp_dir,
_merge_runs, learning_graph_render bucket/period/node helpers,
_memories_dir/_memory_local_index/_node_detail, _cron_jobs_file,
_retention_cutoff, _scope_for_args, _clean_token, _count_diff_lines,
_ordered_verbs, _hermes_meta, _iter_skill_files).
- Unified helpers: _read_config_section (curator + curator_backup),
_write_file/_write_json (4 curator report writers), _msg_text
(background_review <- side_question), _report_failure/_notify_title
(title_generator instant/auto paths), _is_under (verification_evidence),
_scoped SQL pair builder + _query (insights), _optional_lock
(background_review), verify.recipes table-driven detection.
- if/elif routing -> dict dispatch: side_question role labels,
curator_backup summary bits, learning_graph_render buckets, insights
section rendering, verify recipe pickers.
- Redundant defensive layers, single-use wrappers and verbose narrative
comments collapsed; every non-obvious WHY/invariant kept in compact form.
Verification: parity.py (all REMOVED symbols zero-ref), import smoke for
every module + cli/run_agent/gateway.run/hermes_cli.main/
agent.conversation_loop/tui_gateway.server, old-vs-new fuzz parity on all
shared pure functions, SQL trace parity for insights and
verification_evidence, cluster tests 1354 passed / 0 failed (46 files).
58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
"""Verification-loop helpers for the ``pre_verify`` round-end gate.
|
|
|
|
After code edits, the loop fires ``pre_verify`` (directives resolved by
|
|
:func:`hermes_cli.plugins.get_pre_verify_continue_message`); a directive keeps the
|
|
agent going one more turn. The shipped coding guidance rides on the evidence-based
|
|
verification-stop nudge (``agent/verification_stop.py``) rather than a second
|
|
default stop gate, so default token cost stays tied to the "missing verification
|
|
evidence" decision while ``pre_verify`` remains free for user/plugin policy.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Optional
|
|
|
|
from utils import is_truthy_value
|
|
|
|
DEFAULT_MAX_VERIFY_NUDGES = 3
|
|
|
|
# Appended to the verification-stop nudge when code lacks fresh evidence. Mirrors
|
|
# the user-facing "clean your work" workflow without adding its own model turn.
|
|
CODING_VERIFY_GUIDANCE = (
|
|
"[Coding] Before you run tests/linters or call this done: if this is "
|
|
"creative UI/visual work, hold off on tests and linters until the user says "
|
|
"they like the result or you're about to commit. And before every commit, "
|
|
"clean your work: keep it KISS/DRY, match the surrounding code style, and be "
|
|
"elitist, shorthand, clever, concise, efficient, and elegant."
|
|
)
|
|
|
|
|
|
def max_verify_nudges(config: Optional[dict[str, Any]] = None) -> int:
|
|
"""Bound on consecutive ``pre_verify`` continue directives per turn (>= 0)."""
|
|
try:
|
|
return max(0, int(_agent_cfg(config).get("max_verify_nudges")))
|
|
except (TypeError, ValueError):
|
|
return DEFAULT_MAX_VERIFY_NUDGES
|
|
|
|
|
|
def coding_verify_guidance(config: Optional[dict[str, Any]] = None) -> Optional[str]:
|
|
"""Return the optional guidance appended to verification-stop nudges."""
|
|
if not is_truthy_value(_agent_cfg(config).get("verify_guidance", True), default=True):
|
|
return None
|
|
return CODING_VERIFY_GUIDANCE
|
|
|
|
|
|
def _agent_cfg(config: Optional[dict[str, Any]]) -> dict[str, Any]:
|
|
if config is None:
|
|
try:
|
|
from hermes_cli.config import load_config
|
|
|
|
config = load_config()
|
|
except Exception:
|
|
config = {}
|
|
agent_cfg = config.get("agent") if isinstance(config, dict) else None
|
|
return agent_cfg if isinstance(agent_cfg, dict) else {}
|
|
|
|
|
|
__all__ = ["CODING_VERIFY_GUIDANCE", "DEFAULT_MAX_VERIFY_NUDGES", "coding_verify_guidance", "max_verify_nudges"]
|