The verbs of the ring

Skills, and when they fire.

Agents are who; skills are what they do. A skill is a named, reusable procedure an agent invokes — sometimes from a human phrase, sometimes on a schedule, sometimes called by another skill. This page lists every delivery skill in the ring: its owner, its trigger, what it writes, and the human gate that stands in front of any irreversible step.

9 ring skills + 5 scouts on-demand today (recurring cadence deferred to Charlie's posture call) Charlie-gated outbound

At a glance

The skill matrix

Skills live in two places on the laptop: the delivery + ops skills that drive this engagement (~/.copilot/m-skills) and the general Clawpilot skills available to any session (~/.copilot/skills). The table below covers the engagement set. An additional utility skill, cowork (Playwright bridge to the M365 Cowork agent), is general-purpose rather than a ring-coordination skill and is listed at the bottom for completeness. Five further folders (signal-scout, backlog-sentinel, pipeline-watcher, reuse-scout, intake-triage) exist under m-skills/ but are empty scaffolding — the scout contracts live in the role briefs under ~/.copilot/m-role-briefs/scouts/ (see Agents → Scouts).

SkillOwnerFires when…ProducesHuman gate
daily-brief CoS Intended cron 07:00 & 17:00 weekdays (not yet enabled — on-demand today via "morning brief" / "EOD brief" / "what's top of mind") A briefs row (5-3-2-1) + a Teams DM — (brief is informational)
decision-capture SA / CoS "log this decision" / "ADR for X"; or a decisions row arrives routing=needs_capture; or a transcript tags decided: adrs row (technical, with DB-backed review_stage) or decisions row (engagement) + cross-links Reviewer + Compliance + Charlie ratification
ado-bulk-triage CoS Intended cron Friday EOD (not yet enabled — on-demand today via "triage the backlog" / "weekly ADO sweep") Triage summary (Friday evening briefs row) + owner nudges + enqueues recommended state changes Charlie sign-off (rows land at pending_approval; approval flips to queued)
ado-scribe CoS "drain the ADO queue" / "/ado-scribe"; or eventually a core-tick step (15-min, when live) Applies queued rows to ADO via wit_*; advances queued → in_flight → committed/failed through CAS-guarded sp_update_ado_writeback Pre-gate: only consumes Charlie-approved queued rows; never touches pending_approval
ring-tick CoS "/ring-tick", "tick the ring" (on-demand only today); intended 15-min core-tick + 2h scout-sweep cadence deferred to Charlie's posture call Bounded core-tick: health-check, ado-scribe drain, cost rollup. Caged scout-sweep: spawns scouts under scout_lease + dual cost breakers + 5-min budget + 1-child ceiling Programmatic 3-greens gate via sp_check_scout_enabled() (cost breaker live + drain proven + scout proven)
outbound-voice CoS · SA (shared) Called by another skill whenever text will be seen by a human (Charlie or external) Recipient-calibrated phrasing of an existing draft Inherits the caller's gate
bootstrap-roles Operator Session start; or "/bootstrap"; or the ring needs re-establishing. Workflow-agnostic — driven by ~/.copilot/m-workflows/<name>/workflow.json Spawned long-lived role sessions per the named workflow + ledger entry (DAB agent_runs for haleon; plan.md for loom)
rotate-role Steward (or Operator for Steward self-rotation) Steward judges a role's context is degrading; or Charlie requests a rotation; or a role self-flags hard rotation Frozen role + snapshot (agent_snapshots) + spawned successor + rotation_log + agent_runs spine (Step 9b detail-row-first) Charlie ack for zombie path (transcript-synthesis or delete:true); Steward self-rotation requires Charlie ack with Operator as rotator-of-record
cowork utility "ask cowork ...", "/cowork" — Playwright bridge to the M365 Cowork agent Cowork's reply, verbatim — (general-purpose, not a ring-coordination skill)
bootstrap-clawpilot-roles / rotate-clawpilot-role deprecated shims Back-compat callers that hardcode the old skill names Forward to bootstrap-roles / rotate-role with workflow-name='loom'

How a skill gets invoked

Three ways a skill starts

1 · Human phrase

Charlie types a trigger phrase ("ADR for the auth approach", "Friday triage"). The owning agent recognises it and runs the skill. Direct, on-demand.

2 · Schedule (intent — not yet live)

Several skills declare cron triggers (the twice-daily brief, the Friday ADO sweep, the 15-min/2h ring-tick). None is enabled today — the recurring schedule is a Charlie posture call, gated on three greens (cost breaker live, drain proven, Signal Scout proven — all earned in evidence terms as of 30 May 2026 but the scout_enable_flags booleans aren't flipped yet). Output is always staged, never auto-sent externally.

3 · Skill-to-skill

decision-capture calls outbound-voice to phrase the ratification ask; it calls a Reviewer and a Compliance Checker as mandatory gates. Skills compose.

Skill by skill

What each one actually does

CoSscheduled-intent + on-demand

daily-brief — the 5-3-2-1

Twice a day the Chief of Staff metabolises the signal backlog into a single compact brief: 5 risks · 3 decisions needed · 2 customer signals · 1 fire, plus a recommended focus block. It writes a briefs row and sends Charlie a Teams DM. (Recurring 07:00 / 17:00 cadence is the declared intent; on-demand today.)

Reads
signals, pod_intel, customer_health, open risks_issues_blockers
Writes
briefs (via the BriefIn write-view), sets delivered_to_loop when posted to Loop
Schedule (intent)
cron 07:00 (slot=morning) & 17:00 (slot=evening), weekdays — evening is a valid brief_slot value (enum is {morning, afternoon, adhoc, evening}; ISS-13 resolved). Live recurring timer not yet enabled.
SACoSgated

decision-capture — the ledger gate

One skill, two branches. Technical decisions become ADRs and must pass an adversarial Reviewer and — if they touch a regulated surface — a Compliance Checker, before Charlie ratifies. Engagement decisions are narrative-only in decisions with no ADR.

draft reviewer reviewed compliance Charlie ack ratified

These stages are now DB-backed on adrs.review_stage (CHECK-constrained {draft, reviewed, compliance-checked, ratified}), advanced through the CAS-guarded sp_advance_adr_stage SP — distinct from adrs.status ({proposed, accepted, superseded, rejected}). Reviewer + Compliance are still enforced by the skill and audited by the Steward (ISS-19 resolved).

Dedup
hash on (normalized_text, class, 7d_window) — re-runs Reviewer only on text change
ADO link
if related_ado_ids set, queues a write-back at pending_approval for Charlie sign-off (never auto-writes)
Fail-safe
Reviewer / Compliance unavailable → block at current state, surface to Charlie, never advance
CoSscheduled-intent + on-demand

ado-bulk-triage — the Friday sweep

A weekly pass over the Azure DevOps backlog. It summarises the state of the board, drafts nudges to work-item owners (phrased through outbound-voice), and enqueues recommended state changes at pending_approval on the write-back queue. Charlie's approval flips a row to queued, and the ado-scribe drainer (built Batch 2) then applies it to ADO. Recurring Friday cadence is the declared intent; on-demand today.

Target
the configured azure_devops MCP project — the single source of truth for org/project/area path (ISS-05, resolved). Pointer is environment config; currently smccormick0886/Haleon-AIAQ.
Enqueue path
writes ado_writeback_queue rows at pending_approval via AdoWritebackIn
Gate
DB-backed: ado-scribe only consumes queued, never pending_approval
CoSbuilt · on-demand

ado-scribe — the lease-guarded drainer

The drain half of the enqueue-then-drain ADO write-back pattern. One tick: acquire drainer_lease (single-holder mutex; renew at TTL/2; abort immediately on lost re-acquire), reconcile stale in_flight against ADO (idempotency-marker check), reclassify failed rows (transient → re-queue capped at MAX_ATTEMPTS=5; permanent → dead-letter; rescue via sp_reset_ado_writeback), select queued with per-target serialisation, claim queued → in_flight → committed/failed via CAS-guarded sp_update_ado_writeback.

Concurrency
CAS predicate on every UPDATE (lost race = no-row = silent skip); the lease + CAS together are the drainer's only concurrency backstop (FOR UPDATE SKIP LOCKED is unreachable through DAB)
Idempotency
invisible <!-- idk:KEY --> marker required on every op (not just add-comment) so the reconciler can prove our identity authored the change
Schedule (intent)
15-min cadence as core-tick step 4; live cadence deferred to Charlie's posture call (ISS-10)
CoSbuilt · on-demand

ring-tick — the recurring cadence (staged)

Two independently-abortable jobs sharing a 15-min timer but holding separate leases and failure domains. core-tick (Job A, 15-min, on tick_lease): bounded and mechanical — health-check, ado-scribe drain, rolling-2-day cost_telemetry rollup, all level-triggered with no catch-up. scout-sweep (Job B, 2h, on scout_lease, fired after core-tick releases — never nested): caged behind the programmatic 3-greens gate, dual cost circuit-breakers (per-UTC-day OR rolling-24h), 1-child spawn ceiling, watermark-bounded scans, 5-min wall-clock budget. Live recurring schedule OFF pending Charlie's posture call.

3-greens gate
Job-B step 0: sp_check_scout_enabled() reads scout_enable_flags; sweep aborts if any of cost_breaker_live / drain_proven / scout_proven is FALSE
Leases
three independent: tick_lease (A), drainer_lease (under A), scout_lease (B) — no shared mutex
Cost breaker
nominal baseline $50/day, band ±20% → $60/day (Charlie, 30 May; starting guess to tune by observation — no hard budget exists for this engagement)
CoSSAsub-skill

outbound-voice — the recipient-aware layer

Not usually triggered directly. Other skills call it whenever a human will read the text — a ratification ask, an ADO comment, a customer reply — and it calibrates formality, directness, warmth and channel to the specific recipient so the draft sounds like Charlie, not like an assistant.

Called by
decision-capture, daily-brief, ado-bulk-triage, ring-tick (cost-breaker alerts)
Privacy
never embeds private M365 detail into outbound text; summarise + cite by id
StewardOperatorgeneric ceremony

bootstrap-roles & rotate-role — keeping the ring alive (workflow-agnostic)

Bootstrap spawns the long-lived roles for any workflow named under ~/.copilot/m-workflows/<name>/workflow.json (haleon: CoS/SA/Steward, DAB-backed audit; loom: Architect/Steward, plan_md_only). Rotate runs the rotation ceremony with the five hardened invariants baked in: rotator spawns the successor (D1/D2/D6), no boot-turn race (D3 — await ## Context health ack before releasing with keepPendingTurn:false), no orphan-turn race (D4 — status-probe re-adopt before the readiness smoke-test), address by sessionId from spawn until close (D8), and a privacy-safe ZOMBIE path (D5 — cold-spawn + archive default; transcript-synthesis or delete:true requires Charlie ack). Step 9b writes the audit chain detail-row-first: rotation_log / agent_snapshots rows first, then the agent_runs spine carries detail_ref at INSERT (HS-4). Old loom-specific bootstrap-clawpilot-roles / rotate-clawpilot-role remain as deprecated forwarding shims.

utility

cowork — Playwright bridge to the M365 Cowork agent

A general-purpose utility skill, not part of the ring-coordination set. Sends a prompt to Charlie's pinned M365 Cowork agent over Playwright and returns Cowork's reply verbatim. First invocation in a session starts a fresh Cowork task; subsequent invocations continue it (pass --new to force a new task).

Honesty note

Scouts live in role briefs, not skill files. The five Job-B scouts spawned by ring-tick (Signal Scout + Backlog Sentinel / Pipeline Watcher / Reuse Scout / Intake Triage) have their contracts in ~/.copilot/m-role-briefs/scouts/ — see Agents → Scouts. The matching folders under m-skills/ are empty scaffolding (no SKILL.md); the brief IS the contract.

Honesty note — still-aspirational helpers. The briefs and the decision-capture procedure name several adversarial / drafting helpers — Reviewer, Compliance Checker, Diagnostician, Comms Draftsperson, Historian, Library Curator. None of these has its own SKILL.md file yet; they are referenced as named procedural steps invoked inline by the owning skill, and remain on the deferred helper tier per the original build plan. (Previously this note also listed "ADO Scribe" — that skill has been built in Batch 2 and is documented above.)

See where every skill's output is recorded →