| name | self-healing |
| description | Detect service failures and system anomalies. Diagnose root causes. Auto-remediate using NixOS rollback, service restart, or config repair. Every action logged to the hash-chained audit ledger.
|
| tools | ["system_health","service_status","shell_exec","journal_logs","event_log","memory_store","memory_recall","file_read","teach_context","teach_patterns","teach_optimize_suggest","teach_optimize_apply"] |
| activation | auto |
Self-Healing Skill
You can detect, diagnose, and fix system problems automatically.
Detection
When you detect a service failure or anomaly during a heartbeat check:
-
Check teachd for historical patterns first — teachd observes the system 24/7 between conversations
teach_context({ context: "nginx failure service down" })
teach_patterns({ min_confidence: 0.5 })
This surfaces slow-burn issues (memory leaks, recurring failures, correlated events) that you wouldn't catch in a single conversation.
-
Confirm the failure — don't act on a single check
service_status({ service: "nginx" })
If the service is down, check again after 10 seconds. If still down, proceed.
-
Check journal logs for why it failed
journal_logs({ unit: "nginx", lines: 30, priority: "err" })
-
Recall past incidents — have we seen this before?
memory_recall({ query: "nginx failure", timeframe: "30d" })
Diagnosis
Determine the root cause before acting:
- Service crashed → check logs for segfault, OOM, config error
- Config file missing/corrupted → check if NixOS generation has it
- Dependency failure → another service it depends on is down
- Resource exhaustion → disk full, OOM killer, too many connections
- Bad deploy → most recent nixos-rebuild introduced the issue
Remediation (ordered by safety)
Level 1: Restart the service
shell_exec({ command: "systemctl restart nginx" })
Safe, fast, fixes 80% of issues.
Level 2: NixOS rollback
If restart doesn't fix it, or if config is corrupted:
shell_exec({ command: "nixos-rebuild switch --rollback" })
This atomically reverts to the last known-good NixOS generation.
Level 3: Targeted config fix
If you can identify the exact config issue:
file_read({ path: "/etc/nixos/configuration.nix" })
Fix the config, then rebuild:
shell_exec({ command: "nixos-rebuild switch" })
Level 4: Resource relief
If disk/memory is the problem:
shell_exec({ command: "nix-collect-garbage -d" })
shell_exec({ command: "journalctl --vacuum-size=500M" })
After remediation
ALWAYS do these three things:
-
Verify the fix worked
service_status({ service: "nginx" })
-
Store in memory
memory_store({
summary: "nginx failure: config missing, rolled back to gen 47",
detail: "Full diagnosis and fix details...",
category: "diagnosis",
tags: "self-healing,nginx,rollback"
})
-
Log to audit ledger — this happens automatically through agentd
Notification
After fixing an issue, compose a clear message for the user:
I detected nginx was down at 03:17 UTC.
Cause: The configuration file /etc/nginx/nginx.conf referenced
a missing upstream. This was introduced in NixOS generation 48
(rebuilt 2 hours ago).
Action: Rolled back to generation 47. nginx is running again.
All health checks pass.
Audit entry: #52 (hash: a7f3b2...)
Keep it factual, concise, and include the audit reference.
Critical rules
- NEVER make changes without logging them
- NEVER skip verification after a fix
- If unsure, restart is safer than rollback
- If rollback fails, STOP and alert the user — don't cascade
- Store EVERY incident in memory — patterns build over time