ds-skill-candidates · git:20260725.18f8707 · 2026-07-25 · sha256 b6198270d36b2cde
ds-skill-candidates git:20260725.18f8707A
Immutable. This exact content never changes and is served at /api/v1/blob/b6198270d36b2cde.
---
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).
```markdown
## <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).