---
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).
