agent-process-dashboard / IMPLEMENTATION_PLAN.md
smlflg's picture
Initial public upload from Projekte/agent-process-dashboard
06357e7 verified
|
Raw History Blame Contribute Delete
4.02 kB

Agent Process Dashboard Original MVP Plan

Note: the original MVP was read-only. The current app keeps read-only scanning but now also supports explicit, confirmed SIGTERM/SIGKILL actions for fresh dry-run candidates only.

Original direction: standalone GTK desktop app. The MVP was read-only plus dry-run candidate reporting only, with no kill execution, no generated kill command, no localhost server, and no network port. /proc is the primary sampler.

Summary

Build a new standalone GTK app in:

/home/smlflg/Projekte/agent-process-dashboard

The app monitors Samuel's current-user Linux process tree, classifies agent/MCP/bridge processes, shows parent/child fanout, flags stale candidates, and reports what a cleanup would target without executing it.

Superseded direction: the previous FastAPI/static web UI plan is replaced. Keep its useful /proc, PID identity, classification, tree/group, and risk ideas; remove localhost server, web frontend, and systemd daemon work from the MVP.

Key Changes

  • Python package: agent_process_dashboard.
  • UI: GTK3/PyGObject desktop window.
  • Core sampler: direct /proc reads, no psutil dependency in the MVP.
  • Process identity: boot_id:pid:start_time_ticks:uid.
  • Safety:
    • No SIGTERM, SIGKILL, renice, restart, or config mutation.
    • No /proc/<pid>/environ reads.
    • No executable cleanup command is printed.
    • Dry-run output is only candidate PIDs, identity keys, reasons, and exclusions.

Implementation Tasks

  1. Scaffold project files:

    • pyproject.toml
    • README.md
    • src/agent_process_dashboard/
    • tests/
  2. Build testable core modules:

    • procfs.py: read /proc, parse stat/status/cmdline/statm/cgroup, handle disappearing PIDs.
    • sanitize.py: mask secrets in argv before display.
    • classifier.py: classify Claude, Codex, Hermes, opencode, Gemini, MCP servers, bridges, wrappers, terminals, editors, browsers, and unknowns.
    • tree.py: build parent/child trees and launch groups.
    • risk.py: compute fanout, bridge, stale, and global warning levels.
    • dryrun.py: generate read-only cleanup candidate reports.
    • snapshot.py: orchestrate sampler, classifier, tree, risk, and dry-run.
  3. Build GTK UI:

    • Header KPIs: agent roots, MCP/bridges, max fanout, stale candidates, CPU hot, last scan.
    • Left: agent/root group list.
    • Center: process tree using Gtk.TreeStore.
    • Right: selected process details.
    • Bottom: dry-run candidate report.
    • Filters: Agent, MCP, Bridge, Stale, High Fanout.
    • Poll active snapshots every 2 seconds, idle snapshots every 5-10 seconds.
  4. Risk defaults:

    • Per group child count >= 20: warn.
    • Per group child count >= 50: critical.
    • Per group bridge count >= 6: warn.
    • Per group bridge count >= 12: critical.
    • Global MCP/bridge count >= 20: warn.
    • Global MCP/bridge count >= 50: critical.
    • Global agent-related count >= 30: warn.
    • Global agent-related count >= 70: critical.
    • Bridge age > 6h: stale candidate.
    • Bridge age > 24h: strong stale candidate.
    • CPU idleness alone never makes a bridge stale.

Test Plan

  • Unit tests:

    • /proc/<pid>/stat parser handles spaces and parentheses.
    • PID reuse produces different process_key.
    • Missing processes during scan do not fail a snapshot.
    • Cmdline masking handles flags, --flag=value, env-style args, URLs, and common token prefixes.
    • Classifier avoids false positives from paths or incidental words.
    • Parent links are rejected when parent identity is absent/unstable.
    • Healthy idle MCP bridge is not marked stale.
    • Dry-run performs no mutation and returns no executable kill command.
  • Integration smoke:

    • Spawn a shell with a child process and verify tree grouping.
    • Verify the app spawns no MCP/bridge children.
    • Verify no port is opened.
    • Verify no /proc/<pid>/environ reads exist in the code.
    • Target RSS budget: below about 300 MB.