An ops briefing should end with a verb — claude-ops, reviewed

claude-ops caught my attention for the least glamorous reason possible: its README opens with a morning briefing. One command, /ops:go, and your terminal agent reports infrastructure health, CI status, an inbox count across Slack, Telegram, Gmail and WhatsApp, open PRs, sprint progress, and a revenue snapshot from Stripe and AWS — then finishes with the line that matters: Next action: merge feat/user-profile · fix my-api CI · reply @alice.

That last line is the whole product. Everything else the project does — and it does a lot, 60-plus skills spanning deploys, monitoring, e-commerce and voice — is downstream of treating your ops information as a briefing that ends with a verb, rather than a dashboard you visit.

Dashboards render; briefings act

Most of us already own too many dashboards. Grafana for the cluster, a CI page per repo, Uptime Kuma for the services, a billing console for the cloud spend. The failure mode isn’t visibility — it’s that dashboards are passive. They wait for you to look, and looking is the thing mornings take away from you first.

A briefing inverts the flow. It comes to you, it’s assembled on a schedule whether or not you ask, and — if it’s built right — it ends with a prioritized next action instead of a wall of green. claude-ops didn’t invent this idea, but it’s the most complete implementation I’ve seen bolted onto a terminal agent: the briefing reads services you already pay for, through credentials you already hold, and the “dashboard” is just the model narrating a deterministic data pull.

The engineering worth stealing

You may never install this plugin. Three of its implementation choices are still worth copying.

Gather before you think

Every skill assembles its data with pre-execution shell blocks — deterministic scripts that run before the model’s context loads. The agent never burns tokens or seconds on asking “what’s the state of the ECS cluster?” and waiting for tool-call ping-pong. A background daemon pre-warms the expensive parts (infra health, git state, unread counts) on a two-minute cadence, so the briefing loads from warm cache in under three seconds instead of ~30 cold.

That’s the read-path/think-path separation that most agent projects still get wrong. Fetching state is a scripting problem; deciding what to do about it is a model problem. Keep them in that order and briefings become cheap enough to actually run daily.

Autonomy with a leash

The flagship autonomy feature is /ops:deploy-fix: after you merge a PR, it polls the deploy workflow, curls /health on success, verifies /version returns the merged SHA, retries transient failures, and only if that fails dispatches a headless fixer agent on a cheap model. The fixer is fenced in by per-repo budget caps (three runs an hour by default), single-flight locks so two agents can’t fix the same repo simultaneously, and content-hash dedup so identical failures don’t burn the budget twice.

That is the correct shape for letting an agent touch production: autonomy triggered by an action you initiated, bounded attempts, one actor at a time, and everything observable. Compare that to the popular alternative — an agent with broad write access and vibes-based restraint — and you can see why this pattern earns trust.

Hooks that don’t ask nicely

Always-on safety hooks do a secret scan on writes, hard-block rm -rf against anchor paths, warn on pushes to main, and route outbound one-to-one messages (Twilio, AI phone calls) through a per-message approval gate. None of these depend on the model remembering to be careful. Good defaults beat good intentions, especially at 6am when nobody is reading the output closely.

The homelab translation

You probably don’t run ECS or RevenueCat. The pattern still maps directly onto a homelab or small-business stack:

  • Cluster health: kubectl get deployments -A filtered for anything not at full replicas, plus Argo/Flux sync status
  • CI: gh run list for the repos that matter
  • Services: Uptime Kuma’s status API for a single up/down rollup
  • Backups: exit status of last night’s jobs, because silent backup failure is the homelab’s original sin

A twenty-line script does the gathering:

#!/bin/sh
# morning-ops.sh — deterministic gather; the agent only narrates
echo "== deployments =="
kubectl get deploy -A --no-headers | awk '$3 != $4 {print}' | grep . || echo "all healthy"
echo "== ci =="
gh run list --limit 5 --json displayTitle,conclusion --jq '.[] | select(.conclusion != "success")'
echo "== kuma =="
curl -fs localhost:3001/api/status-pages/lab | jq '[.summary.monitors[]? | select(.status != 1)] | length'

Point your agent at that output on a schedule and you have the briefing without adopting anyone’s plugin. The discipline to keep is the ending: make it propose the next action, not just report the state.

Where I’d pump the brakes

claude-ops wants to be a business operating system, and the breadth is where judgment comes in. Voice agents, Shopify operations, marketing dashboards and “four parallel C-suite agents” are a lot of surface for a small team, and every integration you wire in widens the blast radius — the AWS probes read everything your IAM allows, so wire up least-privilege credentials first. The multi-account subscription rotator sits in terms-of-service gray territory I wouldn’t touch. And the whole thing is shaped as a Claude Code plugin (with some harness support), so treat it as a source of patterns more than a platform: your briefing should degrade gracefully to plain scripts if the plugin ever goes away.

The takeaway

Ops information wants to be narrated and acted on, not rendered. The recipe claude-ops gets right is boring and portable: deterministic gathering scripts, a warm cache so the habit is cheap, autonomy that’s bounded and budgeted, and safety enforced by hooks rather than politeness. Steal those four things in whatever stack you run — and make sure every briefing you receive ends with a verb.

Leave a Reply

Your email address will not be published. Required fields are marked *

WordPress Appliance - Powered by TurnKey Linux