v6.1.5
v6.1.5 — 2026-06-15
Kickoff-hardening + config-auto-scaffold + observability release (#147), extended
with two new capabilities — #148 supervised self-heal and #146 capability
auto-discovery — plus a reliability follow-up that repairs the
operator-signaling inversion (the planter under-asked while the shepherds
over-asked), the "Workflow tool is always present" overclaim that made
web/remote sessions give up instead of degrading, and two latent namespace/DB
defects the new kickoff wiring exposed.
Authorized supervised self-heal — AUTONOMOUS-SENTINEL (#148)
- New loop template (
references/loop-templates.md §AUTONOMOUS-SENTINEL) +
binding doctrine (doctrines/autonomous-sentinel.md) for authorized
supervised autonomy — the supervised-remediation superset of SOAK-LOOP.
Stages: PROBE (seeded acceptance predicates, live) → CLASSIFY
(HOLD/REGRESSED/NEW) → ACT (dispatch a ≤S@coderhotfix through the existing
hotfix-dispatch ladder → gates-before-deploy → re-probe) → TERMINATE (K clean
ticks / N-HF cap / hard-stop). Hard rails: gates-before-deploy, ≤S / ≤3
concurrent / ≤N total HF caps, no destructive DB ops, auto-rollback on red,
paper-only (never flip to live without authorization), operator-override-each-
tick, full audit trail. - New config key
[close].autonomous_sentinel(default"off"— detection-only).
It must be"on"AND the seed must declareclose: autonomous-sentinelAND a
completesentinel_railsblock must be present before a single remediation
fires (three independent opt-in gates). New halt codesSENTINEL-RAILS-MISSING
/-SCOPE-EXCEEDED/-HF-CAP/-ROLLBACK/-HARD-STOP/-LOOP-CAP. - Reconciled the depth-3 "remediating inside a watch loop" anti-pattern in
references/loop-templates.md §SOAK-LOOPanddoctrines/outcome-enforcement.md §Seam 4: detection-only stays the DEFAULT and the anti-pattern for the
UNAUTHORIZED case; the explicitly-authorized AUTONOMOUS-SENTINEL case is carved
out.
Capability auto-discovery (#146)
- Shepherd now auto-detects the Claude Code plugins/skills available in the
environment and adapts without operator wiring. A cheap, one-time-per-session
SessionStart probe (hooks/scripts/capability_discovery.sh) enumerates
installed plugins + skills and writes an EPHEMERAL capability roster
(<ns>/cache/discovered-capabilities.json, gitignored) kept strictly distinct
from the operator-curatedtoolkit.json— discovery never overwrites intent.
The roster is merged at read time into the[TOOLKIT]surfaces (SessionStart
roster + engineer/coder/planter brief injection via the newshctx toolkit discovered), labeled auto-discovered and bounded at 12. - New doctrine
doctrines/capability-discovery.mdcodifies the guarded-integration
pattern ("if/rememberis available → use at handoff/CLOSE-FINALIZE + resume,
else shepherd-native"; same forsuperpowers,pr-review-toolkit), so behavior
degrades cleanly when a plugin is absent — shepherd never hard-depends on a
third-party plugin. - The probe also records whether the native
Workflowtool is present;
web/remote sessions that omit it degrade to in-contextAgent(...)fan-out
instead of giving up (cross-referenced inreferences/glossary.md). - New config key
[discovery].auto_capabilities(ondefault |off), resolved
viacfg_get(local → project → XDG-global precedence). Zero hot-path cost,
fail-open.
Seed-optional kickoff (#8)
/shepherd:start(Step 0) and/shepherd:spawn(Hard-stop #2 / Check 6) no
longer hard-refuse on a missing seed for a single--scope sprintrun: derive
the objective from the repo/issue ledger, or ask ONE batched kickoff question,
then run — perdoctrines/operator-signaling.md §"Seed is recommended, not required".--paralleland multi-sprint--scope patch|minor|versionwalks
still HARD-refuse (seeds are load-bearing there for collision detection + walk
enumeration).
Config auto-scaffold (#15)
- New
shctx config initscaffolds.claude/shepherd.tomlfrom the bundled
minimal template when absent (idempotent): derives[project].name(git
remote → cwd basename) and[gates](Cargo.toml→cargo, go.mod→go,
pyproject/setup.py→pytest+ruff, package.json→npm), and realigns[paths]to
the active shctx namespace. Addsshctx config get/show/path. - Wired at kickoff: start/spawn root scaffold →
[CONFIG]notice → PROCEED
(action-biased); plant scaffold → ONE batchedAskUserQuestionto refine
[branching]+[gates](replaces the #120 hard STOP).
Observability dashboard (#13)
- New
shctx dash— a one-glance, read-only sprint snapshot composed from
primitives the root already maintains (focus, graph state, live teammates,
unread mailbox, open escalations, active loops, GitHub cache freshness). No
new table/subsystem; bash-3.2-safe; degrades cleanly on missing DB/tmux.
Monitoring recipe:/shepherd:loop <interval> shctx dash.
Four config toggles (#10)
shctx config get <key> [default]is the uniform resolver (local→project→XDG)
the toggles read through. Defaults reproduce pre-v6.1.5 behavior exactly:
[autorun].on_grade_floor(abort),[autorun].inter_sprint_pause(brief),
[spawn].max_parallel(4),[spawn].dashboard_cadence(3m). The
previously-undocumented[autorun]section is now indocs/configuration.md.
Neutralized the bundled example (#9) + subagent-preference (#11)
examples/axiom/→examples/rust-service/; scrubbed all domain-specific
references (finance/polymarket/geo-block) from the example and ~23 doctrine
teaching snippets.geo-block-law.mdrewritten as a generic
regulated-upstream-API teaching example. Historical.artifacts/docs are
intentionally left intact.doctrines/agent-excellence.mdRule 6 (token-conservation / subagent
preference) is now wired into every agent profile.
Reliability follow-up — operator-signaling inversion
doctrines/operator-signaling.md (v6.1.4) was correct, but its posture was
never reproduced into the agent profiles that actually become system prompts at
runtime. AskUserQuestion is granted correctly in every profile — the inversion
was a prose-propagation gap, not a tools-grant bug:
agents/planter.md: added a standing "the planter asks freely" posture at
the top of plant mode (previously the ONLY trigger was the rare no-config
bootstrap branch, so the common case invented answers instead of asking).agents/conductor.md: SOLO =AskUserQuestionis a narrow escape valve only;
TEAMMATE mode MUST NOT call it (theMODE-MISUSEhalt code now names the
tool).agents/shepherd.md: root action-bias note — the defined gates are the only
operator stop points; no invented mid-run confirmation asks.
Reliability follow-up — the Workflow tool is NOT "always present"
references/glossary.mdlisted the nativeWorkflowtool alongside
Agent/Bash/Editas always-present and blamed any absence solely on "a
build below the Dynamic Workflows floor." Claude-Code-on-the-web /
remote-execution sessions omit it even on a supporting build, so a
spawn/loop that reached for it gave up instead of degrading. Corrected to
environment-dependent presence, with the visible-tool-list test as the
only authority and degrade-to-Agent(...)as the documented path (ties into
#146).
Reliability follow-up — two latent defects the kickoff wiring exposed
Both were invisible to the green suites (the harnesses set neither
CLAUDE_PLUGIN_ROOT nor a shepherd.db registry); #15's config-scaffold pulled
them onto the kickoff hot path:
shctx_skill_root()returned bare$CLAUDE_PLUGIN_ROOT, butschema/+
references/live at$CLAUDE_PLUGIN_ROOT/skills/context/.scaffold.sh's
cp references/naming-conventions.mdaborted underset -e, soshctx init/config initnever created the DB and every downstreamshctxcommand
failed. Now prefers the dispatcher-exportedSHCTX_SKILL_ROOT, else
$CLAUDE_PLUGIN_ROOT/skills/context. Verified end-to-end (init exits 0,
createsshepherd.db, copiesCONVENTIONS.md).- 9 hooks hardcoded
$ns/root.dbwhile v6.1.2+shctx initcreates
shepherd.db, so[[ -f "$DB" ]]was always false → silent no-op, disabling
the spawn-coordination guards (coordinate_drive_guard,
worktree_teardown_guard,teammate_idle, …) on every modern project. New
hook_db_path()inhooks/scripts/_lib.shmirrors the skills-side
shctx_db_path()(prefershepherd.db, fall back to an existingroot.db,
defaultshepherd.db); all 9 assignments route through it.
Tests: hooks 38/38 (+1 for the #146 capability-discovery probe), context 42/42.