Context
Produced by plugin-quality:audit after a live ~3-hour, 22-cycle autonomous run of
/source-control:babysit-loop melodic-software/ci-workflows autopilot --drain --merge human-only.
Audited version: 0.32.1 (the version actually exercised). Diffed against current 0.33.0 —
SKILL.md and reference/config-resolution.md are byte-identical, so nothing here is already
fixed upstream.
Findings
F1 (IMPORTANT, medium confidence) — config-resolution cadence undocumented. The skill never
states whether the layered config seam (.claude/source-control.md) is re-read every cycle or
cached from loop start. This matters concretely: a PR that lowers the tracked merge rung mid-run
(observed live this session — PR #268 proposed lowering babysit_loop_merge to c2-mechanical)
has no documented guarantee it takes effect before the loop restarts. The unsafe direction is
staleness toward a more permissive cached value surviving past a safety-relevant edit — worth
stating explicitly either way.
F5 (IMPORTANT, high confidence, doc-grounded) — stop path never calls
ScheduleWakeup({stop:true}). The skill's own stop-mode text describes ending cleanly, but its
documented procedure doesn't include the explicit stop:true call. Per current /loop dynamic-mode
docs, simply not rescheduling still lets one more delayed cycle fire before the loop actually ends —
contradicting the "stop cleanly" language. (Note: in the live session, stop:true was called
explicitly when the operator requested cancellation — that was operator-invoked correction, not
something the skill's own documented procedure produces on its own.)
F2 (SUGGESTION) — no ceiling on repeated grace-window renewals. The idle path has an explicit
backoff_level counter; a PR that keeps getting force-pushed (observed live: one PR renewed its
30-minute grace window 4 times over ~75 minutes) has no equivalent counter or escalating-fallback
guidance. Not a bug — nothing loops forever or breaks — but every cycle required the operator/agent
to manually reason about picking a new fallback delay past the latest push, with zero skill-level
guidance for this shape.
F3 (SUGGESTION) — the "fable model for security-surface work" dispatch rule exists only in the
caller's invocation prompt, not in the skill or its cited work-class classification doc. Not
reproducible across operators or relaunches unless someone remembers to retype it. If this routing
matters (and it plausibly does — it's the difference between a stronger and weaker model reviewing
changes to claude-review.yml/gitleaks/credential-adjacent files), it should live in the skill or a
cited convention doc, not solely in ad-hoc prompt text.
F4 (SUGGESTION) — no in-skill guidance for safely authoring the telemetry comment body. The
live session hit two guardrails:block-hook-bypass blocks (see the companion guardrails issue)
while trying to write the telemetry upsert body via Bash. A one-line hint ("write the body via the
Write tool, never a Bash heredoc/echo-redirect") would likely have avoided both round trips.
F6 (SUGGESTION, informational, cross-plugin) — not an action item for this issue. The inlined
rate-limit-guard floor this skill cites requires the Monitor tool, which official docs list as
absent on Bedrock/GCP-Agent-Platform/Microsoft Foundry and under two telemetry-disable env vars,
with no stated fallback. Ownership belongs to rate-limit-guard, flagging here only because it
surfaced during this audit.
Static QA
skill-quality:check on the installed 0.32.1 skill: PASS, 0 errors, 1 warning (SKILL.md is
499/500 lines against a 200-line soft target — matches F1-F6's own observation that a lot is packed
into one file; consider progressive-disclosure spokes as a low-cost cleanup independent of the
findings above).
Suggested remediation order (cheapest → most ambitious)
- Document config-resolution cadence explicitly (F1) — wording-only.
- Add the explicit
ScheduleWakeup({stop:true}) call to the documented stop procedure (F5) —
small, high-value fix given the doc-grounded contradiction.
- State the dispatch-model-by-work-class convention in the skill itself or a cited doc (F3).
- Add a one-line telemetry-authoring hint (F4).
- Add a grace-window-renewal counter/backoff, mirroring the existing idle
backoff_level (F2).
Context
Produced by
plugin-quality:auditafter a live ~3-hour, 22-cycle autonomous run of/source-control:babysit-loop melodic-software/ci-workflows autopilot --drain --merge human-only.Audited version: 0.32.1 (the version actually exercised). Diffed against current 0.33.0 —
SKILL.mdandreference/config-resolution.mdare byte-identical, so nothing here is alreadyfixed upstream.
Findings
F1 (IMPORTANT, medium confidence) — config-resolution cadence undocumented. The skill never
states whether the layered config seam (
.claude/source-control.md) is re-read every cycle orcached from loop start. This matters concretely: a PR that lowers the tracked merge rung mid-run
(observed live this session — PR #268 proposed lowering
babysit_loop_mergetoc2-mechanical)has no documented guarantee it takes effect before the loop restarts. The unsafe direction is
staleness toward a more permissive cached value surviving past a safety-relevant edit — worth
stating explicitly either way.
F5 (IMPORTANT, high confidence, doc-grounded) — stop path never calls
ScheduleWakeup({stop:true}). The skill's own stop-mode text describes ending cleanly, but itsdocumented procedure doesn't include the explicit
stop:truecall. Per current/loopdynamic-modedocs, simply not rescheduling still lets one more delayed cycle fire before the loop actually ends —
contradicting the "stop cleanly" language. (Note: in the live session,
stop:truewas calledexplicitly when the operator requested cancellation — that was operator-invoked correction, not
something the skill's own documented procedure produces on its own.)
F2 (SUGGESTION) — no ceiling on repeated grace-window renewals. The idle path has an explicit
backoff_levelcounter; a PR that keeps getting force-pushed (observed live: one PR renewed its30-minute grace window 4 times over ~75 minutes) has no equivalent counter or escalating-fallback
guidance. Not a bug — nothing loops forever or breaks — but every cycle required the operator/agent
to manually reason about picking a new fallback delay past the latest push, with zero skill-level
guidance for this shape.
F3 (SUGGESTION) — the "fable model for security-surface work" dispatch rule exists only in the
caller's invocation prompt, not in the skill or its cited work-class classification doc. Not
reproducible across operators or relaunches unless someone remembers to retype it. If this routing
matters (and it plausibly does — it's the difference between a stronger and weaker model reviewing
changes to
claude-review.yml/gitleaks/credential-adjacent files), it should live in the skill or acited convention doc, not solely in ad-hoc prompt text.
F4 (SUGGESTION) — no in-skill guidance for safely authoring the telemetry comment body. The
live session hit two
guardrails:block-hook-bypassblocks (see the companionguardrailsissue)while trying to write the telemetry upsert body via Bash. A one-line hint ("write the body via the
Write tool, never a Bash heredoc/echo-redirect") would likely have avoided both round trips.
F6 (SUGGESTION, informational, cross-plugin) — not an action item for this issue. The inlined
rate-limit-guard floor this skill cites requires the
Monitortool, which official docs list asabsent on Bedrock/GCP-Agent-Platform/Microsoft Foundry and under two telemetry-disable env vars,
with no stated fallback. Ownership belongs to
rate-limit-guard, flagging here only because itsurfaced during this audit.
Static QA
skill-quality:checkon the installed 0.32.1 skill: PASS, 0 errors, 1 warning (SKILL.md is499/500 lines against a 200-line soft target — matches F1-F6's own observation that a lot is packed
into one file; consider progressive-disclosure spokes as a low-cost cleanup independent of the
findings above).
Suggested remediation order (cheapest → most ambitious)
ScheduleWakeup({stop:true})call to the documented stop procedure (F5) —small, high-value fix given the doc-grounded contradiction.
backoff_level(F2).