Agent Skills: chiron — autonomy coach

Reads local Claude Code and hive telemetry and prescribes the next action for running agents with less supervision. Eleven deterministic checks over Prometheus, Loki, the DuckDB event archive, hive's activity log and the transcript corpus — permission posture, worktree drift, hook latency, blocked-agent latency, supervision capacity, what starts work, and the round-trip cost of a task. At most three findings per run, each with a scored prediction in a ledger the next run grades. Triggers on "/chiron", "chiron", "how is my agent fleet doing", "why are my agents blocked", "audit my permissions", "am I ready for more autonomy".

UncategorizedID: emiperez95/cc-toolkit/chiron-autonomy-coach

Install this agent skill to your local

pnpm dlx add-skill https://github.com/emiperez95/cc-toolkit/tree/HEAD/skills/chiron-autonomy-coach/skills/chiron-autonomy-coach

Skill Files

Browse the full folder contents for chiron-autonomy-coach.

Download Skill

Loading file tree…

skills/chiron-autonomy-coach/skills/chiron-autonomy-coach/SKILL.md

Skill Metadata

Name
chiron-autonomy-coach
Description
Reads local Claude Code and hive telemetry and prescribes the next action for running agents with less supervision. Eleven deterministic checks over Prometheus, Loki, the DuckDB event archive, hive's activity log and the transcript corpus — permission posture, worktree drift, hook latency, blocked-agent latency, supervision capacity, what starts work, and the round-trip cost of a task. At most three findings per run, each with a scored prediction in a ledger the next run grades. Triggers on "/chiron", "chiron", "how is my agent fleet doing", "why are my agents blocked", "audit my permissions", "am I ready for more autonomy".

chiron — autonomy coach

Reads the telemetry this machine already collects and answers one question: what is the next thing to change so agents need less supervision?

Not a dashboard — Grafana has these numbers already. Not a scorecard — see Anti-goals.

What this does NOT do

Four Claude Code built-ins own territory adjacent to this. Cede it, and say so in the output. One visible disagreement with /usage and every other number here inherits the doubt.

| Built-in | Owns | chiron's stance | |---|---|---| | /usage (/cost) | cost totals, attribution to skills/subagents/MCP | source of record. Never print a competing total. | | /insights | 30-day prompt-friction analysis, task categories | cede entirely. Read its HTML if present. | | /doctor (/checkup) | install health, unused skills, slow hooks, CLAUDE.md dedup | cede. Emit "run /doctor" as a prescription. | | claude agents | background session state, "needs input" | cede. hive already shows this. |

The wedge is what none of them can see: cross-process fleet state. Concurrency, worktree lifecycle, permission posture, and how long agents wait on a human who isn't there.

Running it

SCRIPTS="$(dirname "$0")/scripts"              # or the skill dir
python3 "$SCRIPTS/run.py"                      # everything -> JSON
python3 "$SCRIPTS/run.py" --group fleet        # machine state (weekly)
python3 "$SCRIPTS/run.py" --group latency      # task elapsed-time cost
python3 "$SCRIPTS/run.py" --check hook-tax     # one check
python3 "$SCRIPTS/run.py" --group latency --days 30 --limit 100
python3 "$SCRIPTS/run.py" --list

Takes ~15s. Deterministic — no model in the data path. Requires the OTel stack running (claude-logging/otel-stack, docker compose up -d); checks degrade to SKIP when a source is unavailable, never to a fabricated zero.

The three phases, in this fixed order

1. Score the ledger BEFORE generating anything new.

python3 "$SCRIPTS/ledger.py" score --results out.json

States: NEW (run 1) · NOT-APPLIED (carry forward, do not re-argue) · HIT (retire the check, announce it) · APPLIED-AND-MISSED (the intervention happened, the number didn't move — the causal theory is falsified; retire it, and the next finding on that metric must name what was disproved).

2. Run the checks. Eleven of them, below.

3. Prescribe at most three things. Each as WHEN <situation> THEN <action>. Record a prediction for each via ledger.py record. Write the artifact when the fix is a file (a settings patch, a prune script); when it is a behavioural change there is no artifact to write, and inventing one is worse than naming the change.

When the intervention actually lands, mark it:

python3 "$SCRIPTS/ledger.py" apply --check worktree-drift

This is not optional bookkeeping. score() short-circuits to NOT-APPLIED before it ever compares against the target, so an unflipped prediction can never reach HIT or APPLIED-AND-MISSED — the ledger silently stops being able to falsify anything.

The checks

Two groups, different units of analysis and different cadences.

fleet — state of the machine. What is configured, what is stuck, what has accumulated. Weekly. Reads Prometheus, Loki, DuckDB and config files.

| id | status today | what it detects | |---|---|---| | permission-surface | ACTION | policy that can only say yes | | worktree-drift | ACTION | registry behind git; prunable worktrees | | hook-tax | PASS | hook latency as a tax on autonomous runtime | | blocked-latency | FINDING | how long work waits on a human, and why | | supervision-capacity | REFUSAL | exists to say "do not add agents" | | root-census | REPORT | what starts work (detector incomplete — never prescribes) |

latency — cost of a task in elapsed time. Reads the transcript corpus, so it is opt-in rather than weekly: run.py --group latency.

| id | status today | what it detects | |---|---|---| | roundtrip-cost | FINDING | round-trips per session, by project — and where to run /doctor | | auth-profile-drift | ACTION | sessions that ran under the wrong Claude identity | | stop-reasons | FINDING | why a turn ended; work completed per hand-back | | repeated-steering | ACTION | round-trips carrying no instruction | | interruption-rate | ACTION | work thrown away before it lands |

Why the latency group exists

Measured on this corpus: human wait is 98.1% of elapsed time, agent work 1.9% — a ~52:1 ratio. The agent is never the bottleneck. A task's duration is a function of how many times the agent hands control back, each costing a median ~16.5 min of wall-clock.

So: eliminating one round-trip saves ~16 minutes; making the agent twice as fast saves about a second. Every latency check measures round-trips, and no prescription may target agent speed.

This is not repo quality. An earlier draft checked for CI and test gates; that was wrong. Most of these projects are research, notes and personal tooling, not deployed applications, and "does this repo have CI" answers a software-engineering question nobody asked. The question is how long a task takes.

Each returns status, headline, detail, evidence, provenance, threshold, action, caveats. Read caveats before rendering — several are load-bearing.

Threshold calibration (run 1, 2026-08-02)

The first scored run existed to test the checks as much as the fleet, and two of six ACTIONs were false alarms. Both thresholds were wrong in the same way — they measured a quantity that grows with fleet activity — so both are recorded here against reintroduction.

| Check | Was | Now | Why | |---|---|---|---| | hook-tax | total > 5.0 s/h | mean > 150 ms/event | fired at 10.28 s/h with the slowest hook at 45ms median against a 500ms gate: 8,515 events × 29ms. Seconds-per-hour rises with tool-call volume, so the check punished the fleet for doing more work — and then printed "WHEN a hook exceeds 500ms median", a condition that was not met. Now PASS at 29ms/event. | | interruption-rate | ≥3 sessions | + ≥50 round-trips | reported "concentrated in 01-clear-session at 18%" off 5 interruptions in 28 round-trips, while Eve-online's 38 interruptions over 813 went unmentioned. A session floor is not a sample floor. Now points at main (8.6%, n=139); under-sampled projects are listed but never ranked. |

hook-tax is quiet because the gate moved, not because hook latency improved. Do not read the PASS as an improvement, and do not record a HIT against it.

The general lesson, which applies to every threshold added later: a gate on an extensive quantity (a total, a sum, a count over a window) fires as a function of how busy the fleet is. Gate on intensive quantities — per event, per round-trip, per session.

Renderer rules — enforce these mechanically, not by taste

  • Three findings, hard cap. Everything else goes to CHECKED-AND-QUIET or is dropped.
  • Voice lint. No second-person subject near a metric. "The permission gate on Bash(git push) is the top blocking edge" ships. "You are blocked 33% of the time" does not. (Kluger & DeNisi 1996, 607 effect sizes: >38% of feedback interventions made performance worse; effectiveness falls as attention moves toward the self and away from the task.)
  • One comparator per finding. Never a trend and a threshold on the same number — the reader picks the flattering one.
  • Every claim carries surface and window inline. No exceptions.
  • Silence is a valid run. If nothing clears threshold, print the ledger and stop. Never manufacture a third finding.
  • Retirement is announced. A closed gap must not become a permanent open loop.
  • skip N is permanent. A rejected recommendation never reappears.

Hard constraints

Never prescribe more concurrency. Anthropic's published guidance is 3–5 parallel worktrees. This fleet already runs a median daily peak of 8. supervision-capacity exists to refuse.

The self-continuation Stop hook does not ship in Phase 1. It is the highest-leverage runtime lever and the only artifact here that can cause harm: a hook that keeps agents working, on top of 4,649 allow rules with Bash(rm:*) in 13 files and Bash(git push:*) in 46, is an unattended loop that can push to remotes and delete files. It ships only after the policy patch lands, and that ordering must be enforced in the installer's state file — not in prose the user can skip.

Never auto-suggest deleting a review-bucket permission rule. Bash(git branch:*) also grants git branch -D; Bash(git remote:*) also grants git remote add; Bash(find:*) also grants find -delete. These are read-only in common use but grant more than the built-in allowlist, so deleting them silently revokes a real permission. Only the safe bucket is behaviour-neutral.

Never report a censored total or a p90 that equals the cap. See blocked_latency.py.

Anti-goals

  • Not a dashboard. Grafana has this data. The value is entirely interpretation.
  • Not a scorecard. No FAIL/WARN/PASS headline, no "Step N of 5". A persistent unmoving failure count is the guilt configuration.
  • The self-measurement hazard is real. Etkin 2016 (six experiments): measurement raises output, lowers enjoyment, and when withdrawn leaves subjects doing less than never-measured controls. Mitigations are load-bearing — capability framing, episodic not ambient, no streaks or targets or personal bests, graceful retirement. If running this makes the work feel like work, stop running it.
  • Causal Goodhart. Every prescription prints its causal assumption so it can be rejected ("assumes human wait is a binding constraint, not a life schedule").
  • No baseline exists for blocked-agent rate, worktree mortality, or cost-per-merged-PR. Every finding is self-relative.

Data-access invariants

Each is a silent-wrong-answer trap: the query succeeds and returns a plausible wrong number. Encoded in scripts/lib/; do not bypass those modules.

| Rule | Why | |---|---| | Loki metadata filters with \|, not the stream selector | {event_name="x"} → 0 events; {service_name="claude-code"} \| event_name="x" → 1,247 | | Loki direction=forward when probing oldest entry | default is backward, so limit=1 returns the newest and history reads as 0 | | activity.jsonl needs raw_decode in a loop | hive's append is not atomic; 9 lines hold two concatenated objects | | DuckDB: json_extract_string(data,'$.tool_name') | the tool_name column is empty for all 88,486 rows; column queries return zero rows silently | | DuckDB: snapshot before reading; committed is reserved | source may still be written; the word will not parse as an alias | | Settings via precedence chain + os.walk, never glob('**') | glob skips dotdirs — found 5 files where find found 106 | | Cost from Loki or /usage, never PromQL | claude_code_* counters reset 238× in 2 days and disagree by up to 20× | | Wrap claude_code_* PromQL in last_over_time(...[Nd]) | instant queries return 0 series | | No trend claims from Prometheus/Loki before 2026-08-11 | both started 2026-07-28 | | Detect base branch per repo | 27 origin/main, 2 origin/master, 1 no remote |

Provenance

Design: docs/plan.md (14-agent research workflow), docs/critique.md (adversarial review that corrected five load-bearing numbers), docs/phase1-spec.md (what survived), docs/sources.txt (143 sources). Read the critique before trusting a number in the plan.