Pulse is a harness-neutral session quality engine with native integrations for Hermes Agent and Pi. It analyzes conversations with evidence-based signals attributed to the user, agent, or system, while preserving each harness's native session and state model.
| Command | Description |
|---|---|
/pulse |
Analyze the current/latest session |
/pulse trends |
Show the latest 20 analyses |
/pulse models |
Compare analyzed models |
/pulse useful / /pulse not-useful |
Rate the latest analysis (idempotent) |
/pulse yes / /pulse no |
Rate whether the session solved the problem |
The CLI supports --file, --session, and --json. pulse analyze is the versioned stdin/stdout JSON protocol used by adapters. --deep is reserved and explicitly not implemented; Pulse currently performs deterministic analysis only.
The Hermes integration is a native /pulse plugin using Hermes's shared session store. It supports trend and model views across analyzed Hermes sessions.
A native TypeScript extension lives in pi/. Run pi -e ./pi/extensions/pulse.ts from a checkout, or install the local package with pi install ./pi. It reads only Pi's public active-branch APIs, invokes the local pulse analyze protocol, and never parses Pi JSONL or Hermes SQLite. It provides the /pulse commands plus the optional pulse_analyze tool. Automatic analysis is opt-in via PULSE_AUTO_ANALYZE=1 and runs after agent_settled.
Both integrations feed the same versioned normalized-message protocol and deterministic Python engine. Pi persists analysis and feedback as branch-local custom entries, so in-place branches do not leak results into sibling branches.
From a checkout:
git clone https://github.com/dark5un/pulse.git ~/workspace/github.com/dark5un/pulse
cd ~/workspace/github.com/dark5un/pulse
PULSE_SOURCE_DIR="$PWD" bash install.sh
hermes plugins enable pulseThe installer places the native Hermes manifest and __init__.py under ${HERMES_HOME:-$HOME/.hermes}/plugins/pulse. It can be rerun safely. uninstall.sh removes the plugin and learned weights but deliberately retains analysis data in state.db.
- Hermes state is profile-safe:
HERMES_HOMEselectsstate.db,plugins/, andpulse_weights.json; otherwise$HOME/.hermesis used. - A session is analyzed only when it has at least 5 total messages and at least 3 user turns.
- Scores are clamped to 0–100. User, agent, and system/other penalties are calculated separately; system/other penalties contribute to
other_blame_pct. - Re-analysis updates analysis columns with an explicit SQLite upsert, preserving
feedback_ratingandoutcome_rating. - Repeating a feedback command reports that the result is already rated and does not add another learned-weight event. Rating changes are rejected to preserve event accounting.
- Malformed session tool-call JSON is ignored safely. Explicit
tool_nameis preserved and used for runtime provenance.
uv sync --extra dev
uv run ruff check src/ tests/
uv run pyright src/pulse/ tests/
uv run pytest tests/ -qTests use an autouse temporary HERMES_HOME; they never write the developer's real Hermes state. The native plugin contract is plugin.yaml plus __init__.py exposing register(ctx), as documented by Hermes Agent.
src/pulse/signals.py— pure deterministic detectorssrc/pulse/task_type.py— precedence-based classificationsrc/pulse/session_store.py— shared defensive SQLite loadersrc/pulse/weights.py— validated atomic learned statesrc/pulse/plugin.py— slash command, persistence, and presentation
MIT
Repository: https://github.com/dark5un/pulse
Every signal is a heuristic and should be treated as provisional.
