Mode d’emploi
- Copiez la commande et examinez le paquet avant de l’installer dans votre environnement agent.
- Consultez le document original pour les outils, identifiants et environnements requis.
- Décrivez les entrées et le livrable souhaité ; comparez la sortie aux sources.
npx skills add https://github.com/jpeetz/agent-skills --skill maintenanceAvant de commencer
- L’installation n’inclut ni abonnement au modèle, ni quota API, ni accès aux fichiers.
- Étoiles et installations reflètent l’activité, pas un test indépendant de qualité ou de sécurité.
Rendu depuis le dépôt source en conservant titres, exemples, code, tableaux, liens et images.
Custodian Maintenance Runbook
Operates a client's self-hosted stack — booking engine (Cal.diy), automation (n8n), chat (Typebot), Postgres, web/TLS, Stripe webhook. **Purpose: availability
- recoverability + currency, at the lowest possible inference cost.**
When to Use This Skill
Use this skill when:
- A customer stack must be monitored, backed up, and updated automatically.
- You need a repeatable, guardrailed maintenance loop (health → backup →
update → rollback) that never breaks a live booking flow.
- Cost matters: the loop should run decisions on a cheap model and only summon
a generation model for genuine language work.
COST DISCIPLINE (first rule)
- Use JEV (
typesafe/jev-1.13, endpoint/api/alpha/decisions) for EVERY decision
(gate an update, classify an incident, pick retention).
- Use a cheap flash model ONLY for unavoidable language work: writing the human
incident text, parsing an error JEV can't classify, composing an escalation, reading a release note for breaking-change judgment.
- A cycle that completes JEV-only is a WIN. Do not summon a generation model for
anything a command, grep, or JEV resolves.
JEV call shape (verified)
POST https://openrouter.ai/api/alpha/decisions Headers: Authorization: Bearer $OPENROUTER_API_KEY, Content-Type: application/json Body:
{"model":"typesafe/jev-1.13",
"state":"<short context>",
"questions":{"q1":{"type":"choice","instructions":"...","criteria":{"A":"...","B":"..."}},
"q2":{"type":"score","instructions":"...","criteria":["0: ...","1: ...","2: ..."]},
"q3":{"type":"noul","instructions":"..."}}}Read answers[qid].choice|score|noul + .confidence. Threshold < 0.6 confidence → escalate. score runs 0..(len(criteria)-1); normalise / (len-1). Use noul, not bool. Batch all questions for a decision into ONE call. try/catch every JEV call → safe neutral default.
1. HEALTH PROBE (every 15 min)
Probe each service; record ok/fail:
systemctl is-active <cal-diy|n8n|typebot|postgres|caddy/nginx> 2>/dev/null
curl -fsS -o /dev/null -w "%{http_code}" http://localhost:PORT/health # per service
curl -fsS -o /dev/null -w "%{http_code}" https://<domain>/ # web + TLS via HTTPS
openssl x509 -noout -enddate -in <crt> 2>/dev/null # TLS expiry
df -h / | tail -1; free -m | awk 'NR==2{print $3"/"$2"MB"}' # disk + RAMIf all ok → emit nothing (quiet). If any fail:
- JEV
noul"Is this an incident requiring action?" (threshold 0.6). - JEV
choiceclassify: transient / service-down / disk-full / tls-expiring / unknown. - If covered by a rule (one known-good service dead, TLS < 7d) → repair per that
service's rollback+restart rule; verify health after.
- If unknown/breaking/ambiguous → do NOT mutate → queue, alert once.
2. WEEKLY BACKUP (Sunday 03:00 UTC)
pg_dumpthe DB to a timestamped file.- Back up config + env (vault labels, docker-compose, Caddyfile).
- Rotate by retention: daily×7 + weekly×4 (from config).
- Copy off-box to the backup destination (S3/syncthing/second VPS).
- VERIFY restorable (
pg_restore --listor load into scratch schema + SELECT count). - Alert:
Backup <ts> OK (n MB, verified restorable)orBACKUP FAILED: <why>.
- Never run a mutation without a fresh verified backup first.
3. WEEKLY UPDATE CHECK (Monday 02:00 UTC)
- Query upstream releases: Cal.diy (
calcom/cal.diy), Typebot (baptisteArno/typebot.io),
n8n (n8n-io/n8n). Note current pinned vs available.
- For each pending update: JEV
noul"Is this a safe non-breaking update?"
(fresh backup + supported path + not a major jump = lower; breaking/major/unknown = higher).
- Non-breaking → apply → verify service health → record.
- Breaking/major/ambiguous → STALL, escalate with the specific release + JEV reasoning.
Do NOT auto-install a breaking change on a live booking system.
- Report briefly: applied / stalled / nothing.
- Core stays upstream-compatible: customisation is additive overlay; never a destructive
rewrite that breaks a clean upstream merge.
4. DISK HEADROOM (daily)
df -h /System/Volumes/Data 2>/dev/null || df -h /— take the DATA volume. If < 15%
free → warn. If < 5% → escalate immediately (a full disk kills cron first).
- Flag transient big-writer patterns from shared hosts if present (WAL/snapshots can
spike a volume and starve unrelated cron).
5. ROLLBACK (always have a story before a mutation)
Keep the previous pinned version/image + its verified backup. To rollback: stop service, restore previous image, restart, verify health. The rollback path exists BEFORE any apply.
6. REPORTING
- Quiet unless it matters. Speak up on: incident fired, update applied, backup
verified/FAILED, escalation needed, disk low.
- Reports are verified on the output side — never claim success without reading back proof.
- Escalation format: what happened · tradeoff · recommendation · exact decision needed.
PITFALLS
- A full disk kills cron first — check disk first, cheaply, often.
scoreneeds normalising; usenoulnotbool; confidence-gate before any action.- Never blind-
lateston a live system; pin and verify. - Never state an update/backup succeeded without output-side verification.
- Secrets by label from the vault; split-headers so keys never verbatim in output.
- DeepSeek/flash is for language work only — don't summon it to "decide".

