skillers — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited skillers (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
extend op-cell. Convert repeated local agent-session behavior into candidate skills, hooks, or agents. Evidence first: sanitize transcripts, extract observations, cluster recurrence, score payoff, reject duplicates, ask the user which specs to scaffold.
Hard invariant: raw transcript bytes never reach parsing, prompting, clustering, state, or recommendation output. Every line is redacted by scripts/sanitize.mjs first.
Apply when the user asks to learn their workflow, suggest skills/hooks/agents, automate repetitive work, mine agent transcripts, or identify what should be automated next.
Do NOT apply when:
.outline/skillers/ only:.outline/skillers/config.json — last compact time and processed sessions..outline/skillers/knowledge/<theme>.json — merged cluster evidence..outline/skillers/recommendations.json — last recommendation envelope.~/.claude/projects/**/*.jsonl~/.codex/sessions/**/*.jsonl and ~/.codex/history.jsonl~/.local/share/opencode/opencode.db, %APPDATA%/opencode/opencode.db, and ~/.local/state/opencode/prompt-history.jsonlCap each run at 20 transcripts. For large JSONL transcripts, read at most 500 lines: first 200 + last 300. Skip sessions already recorded in config unless the user requests a full rescan.
import { redact } from './scripts/sanitize.mjs';
const safeLine = redact(rawLine); // first operation on transcript bytes
const event = JSON.parse(safeLine); // parse sanitized bytes onlyIf this ordering cannot be guaranteed, drop the source. No exception. This is security-critical: transcript mining can otherwise persist API keys, GitHub tokens, AWS keys, Bearer tokens, or unknown high-entropy secrets.
{
"ts": "ISO timestamp",
"type": "pain|repeat|task|wish|workflow",
"value": "five words max",
"ctx": "file or area",
"session": "session-id",
"source": "claude-code|codex|opencode"
}Use pain for frustration/retries/workarounds, repeat for repeated asks, task for recurring task classes, wish for explicit automation desire, and workflow for stable multi-step sequences. Reject one-offs, sensitive content, generic productivity, and malformed or command-like values.
value + ctx; lowercase; split on spaces and path separators. Observations sharing >=2 tokens belong together. Name each cluster with its top 2-3 tokens joined by -, max 40 chars. Merge/prune thin clusters per references/mining.md. freqNorm = min(freq/20, 1.0)
crossNorm = min(crossSession/5, 1.0)
recencyExp = average(exp(-ln2 * ageDays / 30))
painRatio = (painCount + wishCount) / freq
weight = round(min((freqNorm*0.3 + recencyExp*0.3 + crossNorm*0.4) * (1 + painRatio*0.5), 1.0), 2)Evidence threshold: freq >= 5, crossSession >= 3, weight >= 0.2. Below-threshold clusters go to skipped, not recommendations.
typeCounts: workflowRatio = (workflowCount + repeatCount) / totalOccurrences
taskRatio = taskCount / totalOccurrences
painRatio = (painCount + wishCount) / totalOccurrencesClassification rules, in order:
workflowRatio >= 0.5 && uniqueCtxs <= 3 -> hookpainRatio >= 0.4 -> agenttaskRatio >= 0.3 -> skillworkflowRatio >= 0.3 -> hookskillHook = deterministic trigger. Skill = reusable multi-step procedure. Agent = repeated domain context or judgment-heavy help.
.claude-plugin/plugin.jsoncomponents.jsonhooks/hooks.jsonFuzzy-match by title, trigger, domain, matcher, and description. Covered patterns are reported under existing; partial matches suggest configuring/extending the existing component. Do not recommend duplicate automation.
references/mining.md:.outline/skillers/recommendations.json, then present an ask multi-select: one option per recommendation plus a None / archive only option. Selection authorizes later scaffolding only. Skillers never writes hook, skill, or agent files itself.| Gate | Pass criteria | Blocking |
|---|---|---|
| Sanitizer loaded | scripts/sanitize.mjs importable; raw line is redacted before parse | Yes |
| Source safety | Every transcript/row source has sanitize-before-parse path | Yes |
| Observation shape | ts, type, value, ctx, session, source; value <=5 words | Yes |
| Evidence threshold | >=5 occurrences, >=3 sessions, weight >=0.2 | Yes for recommendation |
| Classification | Formula applied in order; primitive rationale recorded | Yes |
| Ecosystem check | plugin/component/hook inventories inspected before output | Yes |
| Quality filter | Max 5, specific context, projected >=1 turn saved/session | Yes |
| Ask boundary | User is asked before any scaffold is created | Yes |
{
"recommendations": [
{
"rank": 1,
"type": "hook|skill|agent",
"title": "short title",
"evidence": {
"occurrences": 8,
"sessions": 4,
"weight": 0.64,
"theme": "ci-pr-workflow"
},
"rationale": "why this pays rent",
"estimatedSavings": "~2 turns/session",
"existingAlternatives": [],
"scaffold": {}
}
],
"existing": [],
"skipped": [],
"meta": {
"themesAnalyzed": 0,
"recommendationsGenerated": 0,
"sourcesRead": []
}
}Certainty grading: HIGH when all gates pass and evidence spans sources/sessions; MEDIUM when thresholds pass but context is narrow; LOW when useful signal exists but any hard threshold fails. LOW never scaffolds.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.