home / skills / plurigrid / asi / scum-resource

scum-resource skill

/skills/scum-resource

This skill analyzes system resource usage with SCUM scoring and suggests safe rebalancing actions to optimize memory, CPU, and I/O efficiency.

npx playbooks add skill plurigrid/asi --skill scum-resource

Review the files below or copy the command above to add this skill to your agents.

Files (2)
SKILL.md
4.1 KB
---
name: scum-resource
description: 'SCUM Resource Skill'
version: 1.0.0
---

# SCUM Resource Skill

**System Consumption Utilization Monitor** - Libkind-style compositional resource management.

## SCUM Score Formula

```
SCUM(p) = α·MEM(p) + β·CPU(p) + γ·TIME(p) + δ·STALE(p)
```

Where:
- **MEM(p)**: Memory usage normalized to system total
- **CPU(p)**: CPU% averaged over sampling window
- **TIME(p)**: Total CPU time consumed (cumulative sin)
- **STALE(p)**: Time since last meaningful I/O (zombie indicator)

Default weights: α=0.4, β=0.2, γ=0.2, δ=0.2

## GF(3) Classification

| SCUM Score | Trit | Action | Color |
|------------|------|--------|-------|
| 0-33 | +1 | HEALTHY | Green |
| 34-66 | 0 | MONITOR | Yellow |
| 67-100 | -1 | TERMINATE | Red |

## Quick Commands

```bash
# Calculate SCUM scores for top processes
scum-score

# Kill processes above threshold
scum-kill 80

# Show resource allocation as ACSet
scum-acset

# Libkind-style resource rebalancing
scum-balance
```

## Babashka Implementation

```clojure
#!/usr/bin/env bb
(require '[babashka.process :refer [shell]])

(defn parse-top []
  (->> (shell {:out :string} "top" "-l" "1" "-stats" "pid,command,cpu,mem,time" "-o" "mem" "-n" "30")
       :out
       str/split-lines
       (drop 12)
       (map #(str/split % #"\s+"))
       (filter #(> (count %) 4))))

(defn calc-scum [{:keys [mem cpu time]}]
  (let [mem-score (* 0.4 (/ mem 100))
        cpu-score (* 0.2 (/ cpu 100))
        time-score (* 0.2 (min 1.0 (/ time 3600)))
        stale-score 0.0]  ; TODO: track I/O
    (int (* 100 (+ mem-score cpu-score time-score stale-score)))))

(defn scum-report []
  (println "PID\tSCUM\tMEM\tCPU\tCOMMAND")
  (println "---\t----\t---\t---\t-------")
  (doseq [[pid cmd cpu mem time] (parse-top)]
    (when-let [scum (calc-scum {:mem (parse-double mem)
                                 :cpu (parse-double cpu)
                                 :time 0})]
      (printf "%s\t%d\t%s\t%s\t%s%n" pid scum mem cpu cmd))))
```

## Libkind Resource Algebra

Sophie Libkind's compositional approach: resources form a **resource theory** (symmetric monoidal category where morphisms are resource transformations).

### ACSet Schema for Processes

```julia
@present SchProcess(FreeSchema) begin
  Proc::Ob          # Processes
  Resource::Ob      # Resources (MEM, CPU, FD, NET)
  
  uses::Hom(Proc, Resource)      # Process uses resource
  amount::Attr(uses, Float64)    # How much
  
  parent::Hom(Proc, Proc)        # Process tree
  scum::Attr(Proc, Int)          # SCUM score
end
```

### Resource Rebalancing via Colimits

```julia
# Identify processes that can share resources
# Pushout along common resource usage
function rebalance(procs::ACSet)
  # Find processes using same resource type
  shared = @acset_colim procs begin
    p1::Proc; p2::Proc; r::Resource
    uses(p1) == r
    uses(p2) == r
  end
  # Compute fair allocation as coequalizer
  coequalizer(shared)
end
```

## Kill Interface

```bash
# Interactive: shows SCUM scores, asks before kill
scum-kill --interactive

# Automatic: kills all above threshold
scum-kill 85 --auto

# Dry run: shows what would be killed
scum-kill 70 --dry-run

# Kill by name pattern
scum-kill --pattern "java|python" --threshold 60
```

## Current Top SCUM Offenders

Based on live system data:

| PID | Command | MEM | SCUM | Verdict |
|-----|---------|-----|------|---------|
| 79353 | java | 5361M | 87 | 🔴 TERMINATE |
| 3196 | python3.11 | 4691M | 76 | 🟡 MONITOR |
| 704 | rio | 4386M | 71 | 🟡 MONITOR |
| 414 | WindowServer | 2101M | 34 | 🟢 HEALTHY |

## Integration with Gay.jl

```julia
using Gay

# Color processes by SCUM score
function color_process(scum_score, seed=1069)
  # Map SCUM to hue: 0→120° (green), 100→0° (red)
  hue = 120 * (1 - scum_score/100)
  Gay.color_at_hue(seed, hue)
end
```

## Voice Narration

When killing SCUM, announce with say-narration skill:

```bash
say -v Samantha "Terminating java process. SCUM score 87. Memory reclaimed: 5.2 gigabytes."
```

---

**Skill Name**: scum-resource  
**Type**: System Monitoring  
**Trit**: -1 (MINUS - validator/constrainer)  
**Dependencies**: babashka, world-a (ACSets)

Overview

This skill implements a System Consumption Utilization Monitor (SCUM) that scores and classifies processes by resource impact. It combines memory, CPU, runtime, and staleness into a single SCUM score and offers commands to report, rebalance, and optionally terminate high-impact processes. The skill pairs lightweight local sampling with a compositional resource model for fair reallocation.

How this skill works

The core computes SCUM(p) = α·MEM + β·CPU + γ·TIME + δ·STALE using configurable weights (defaults: 0.4, 0.2, 0.2, 0.2). It gathers process metrics from the system (e.g., top), normalizes them, and produces a 0–100 SCUM score. Scores map to a ternary classification (Healthy / Monitor / Terminate) and drive reporting, interactive or automatic killing, and libkind-style resource rebalancing via ACSet schemas.

When to use it

  • Detect and prioritize high-resource processes on development or server hosts
  • Automate remediation of runaway jobs while preserving low-impact services
  • Produce visual or narrated alerts for operators and dashboards
  • Experiment with compositional resource sharing and fair allocation models
  • Dry-run assessments before applying destructive actions

Best practices

  • Start with conservative thresholds and run scum-score to audit before any kills
  • Enable dry-run and interactive modes when first deploying to avoid false positives
  • Tune TIME and STALE tracking for long-lived services to avoid unjustified terminations
  • Integrate with existing orchestration or alerting systems for coordinated action
  • Use ACSet rebalancing to explore sharing before enforcing kills

Example use cases

  • Run scum-score periodically on CI runners to spot memory-hungry tests
  • Use scum-kill --dry-run 70 to list candidates before automated maintenance windows
  • Apply scum-balance in multi-tenant environments to compute fair memory/CPU splits between processes
  • Color process lists by SCUM score in visual tools to aid on-call diagnostics
  • Invoke narrated announcements when terminating critical jobs during ops shifts

FAQ

How are weights adjusted for my environment?

Weights are configurable; increase α for memory-sensitive systems or γ for systems where cumulative CPU time matters. Re-evaluate thresholds after tuning.

What does STALE measure and how is it detected?

STALE reflects time since meaningful I/O and flags zombie-like processes. It requires additional I/O sampling or kernel probes; by default it may be zero until I/O tracking is enabled.

Is termination automatic by default?

No. Default workflows favor reporting and interactive confirmation. Use --auto with a numeric threshold to enable automatic kills.