| name | ds-skill-candidates |
| description | Read-only view of the skill-candidate backlog. Displays open and dismissed |
| user-invocable | true |
/ds-skill-candidates
Read-only view of the skill-candidate backlog. Displays open and dismissed
candidates detected from recurring workflow friction - each with its domain,
count, suggested artifact type, and example note.
No writes, no agent spawns, no network calls. Always exits 0.
Usage
/ds-skill-candidates
No subcommands, no flags. Reads .agentic/skill-candidates.md from the
current working directory. If the file is absent: "No skill candidates
detected yet."
Entry format (canonical)
Each entry in .agentic/skill-candidates.md has the following structure.
The ## <domain> heading is the unique key. Status is open (written by
the detector on first promotion) or dismissed (set by a human to suppress).
## <domain>
**Count:** <lifetime occurrence count>
**Suggested artifact:** command | named-agent | preset | lint-rule
**First seen:** YYYY-MM-DD
**Last seen:** YYYY-MM-DD
**Status:** open
**Example:** "<one sentence from the triggering session>"
What this shows
The backlog is written at wrap time (via /ds-wrap Part D LLM extraction and the
hooks/lib/skill-candidate-deep-cluster.js helper) whenever a domain tag
accumulates >= 3 occurrences across sessions. Each entry carries:
- Domain - the
## <domain> heading (unique key)
- Count - lifetime occurrence count across sessions
- Suggested artifact -
command, named-agent, preset, or lint-rule
(routing taxonomy from the detection signal)
- Status -
open (not yet dismissed) or dismissed (operator suppressed)
- First seen / Last seen - ISO date range of the friction signal
- Example - a concrete note from the triggering session (illustrative only)
The wrap-time path is the active detection mechanism. A secondary path via
tool_failure_workaround events in .agentic/events.jsonl exists in the
codebase but is dormant - those events are not emitted in ad-hoc sessions.
Grouping by status
The command groups entries by **Status:** value:
- OPEN - entries with
**Status:** open whose domain is NOT present in
.agentic/.skill-candidates-surfaced. These are the primary action items.
- OPEN (already surfaced) - entries with
**Status:** open whose domain IS
in .agentic/.skill-candidates-surfaced. Conductor has already nudged once.
- DISMISSED - entries with
**Status:** dismissed.
The command reads .agentic/.skill-candidates-surfaced (one domain per line)
to determine which open entries have already been surfaced at session start.
It never writes to this file.
Output example
Skill candidates (.agentic/skill-candidates.md)
OPEN
adapter-interface count: 5 suggested: command
first seen: 2026-05-01 last seen: 2026-05-12
example: "adapter build.sh signatures diverged; had to reconcile manually"
deploy-verification count: 3 suggested: named-agent
first seen: 2026-05-10 last seen: 2026-05-12
example: "ran manual Vercel rollout check; no automated verify step"
OPEN (already surfaced)
worktree-cleanup count: 4 suggested: command
first seen: 2026-05-05 last seen: 2026-05-11
example: "forgot to remove worktree after merge"
DISMISSED
(none)
To create a skill for an open item: create a skill for the domain manually,
or use your usual skill-authoring flow
To dismiss a candidate: edit .agentic/skill-candidates.md and change
**Status:** open to **Status:** dismissed
When .agentic/skill-candidates.md is absent:
No skill candidates detected yet.
The detector runs at the end of each /ds-wrap call and writes candidates here
when a domain tag accumulates >= 3 occurrences. Check back after a few
more sessions, or verify that skill_candidate_detection is true in
.agentic/config.json.
Gating
This command is a no-op (displays the absent-file message) when
skill_candidate_detection: false in .agentic/config.json. The file is
the single source of truth; the command never calls the detector itself.
Intent layer note
.agentic/skill-candidates.md is committed in consumer projects (via a
!.agentic/skill-candidates.md carve-out in project-scaffolding.yml) so
the backlog travels with the repo and is visible to all team members. It is
NOT committed in the DinoStack methodology source repo itself (the blanket
.agentic/* ignore governs there - intended; DinoStack is the source, not
a consumer).