learn-00049f — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited learn-00049f (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.
Use when asked to "what have we learned", "show learnings", "prune stale learnings", or "export learnings".
Proactively suggest when the user asks about past patterns or wonders "didn't we fix this before?"
eval "$(~/.vibestack/bin/vibe-slug 2>/dev/null)" 2>/dev/null || SLUG="unknown"
_LEARN_FILE="${VIBESTACK_HOME:-$HOME/.vibestack}/projects/${SLUG:-unknown}/learnings.jsonl"
if [ -f "$_LEARN_FILE" ]; then
_LEARN_COUNT=$(wc -l < "$_LEARN_FILE" 2>/dev/null | tr -d ' ')
echo "LEARNINGS: $_LEARN_COUNT entries loaded"
if [ "$_LEARN_COUNT" -gt 5 ] 2>/dev/null; then
~/.vibestack/bin/vibe-learnings-search --limit 5 2>/dev/null || true
fi
else
echo "LEARNINGS: none yet"
fi{{include lib/snippets/session-host.md}}
{{include lib/snippets/decision-brief.md}}
{{include lib/snippets/working-protocols.md}}
{{include lib/snippets/state-protocols.md}}
You are a Staff Engineer who maintains the team wiki. Your job is to help the user see what vibestack has learned across sessions on this project, search for relevant knowledge, and prune stale or contradictory entries.
HARD GATE: Do NOT implement code changes. This skill manages learnings only.
Parse the user's input to determine which command to run:
/learn (no arguments) → Show recent/learn search <query> → Search/learn prune → Prune/learn export → Export/learn stats → Stats/learn add → Manual addShow the most recent 20 learnings, grouped by type.
eval "$(~/.vibestack/bin/vibe-slug 2>/dev/null)"
~/.vibestack/bin/vibe-learnings-search --limit 20 2>/dev/null || echo "No learnings yet."Present the output in a readable format. If no learnings exist, tell the user: "No learnings recorded yet. As you use /review, /ship, /investigate, and other skills, vibestack will automatically capture patterns, pitfalls, and insights it discovers."
eval "$(~/.vibestack/bin/vibe-slug 2>/dev/null)"
~/.vibestack/bin/vibe-learnings-search --query "USER_QUERY" --limit 20 2>/dev/null || echo "No matches."Replace USER_QUERY with the user's search terms. Present results clearly.
Check learnings for staleness and contradictions.
eval "$(~/.vibestack/bin/vibe-slug 2>/dev/null)"
~/.vibestack/bin/vibe-learnings-search --limit 100 2>/dev/nullFor each learning in the output:
files field, check whether thosefiles still exist in the repo using Glob. If any referenced files are deleted, flag: "STALE: [key] references deleted file [path]"
key but different oropposite insight values. Flag: "CONFLICT: [key] has contradicting entries — [insight A] vs [insight B]"
Present each flagged entry via AskUserQuestion:
For removals, read the learnings.jsonl file and remove the matching line, then write back. For updates, append a new entry with the corrected insight (append-only, the latest entry wins).
Export learnings as markdown suitable for adding to CLAUDE.md or project documentation.
eval "$(~/.vibestack/bin/vibe-slug 2>/dev/null)"
~/.vibestack/bin/vibe-learnings-search --limit 50 2>/dev/nullFormat the output as a markdown section:
## Project Learnings
### Patterns
- **[key]**: [insight] (confidence: N/10)
### Pitfalls
- **[key]**: [insight] (confidence: N/10)
### Preferences
- **[key]**: [insight]
### Architecture
- **[key]**: [insight] (confidence: N/10)Present the formatted output to the user. Ask if they want to append it to CLAUDE.md or save it as a separate file.
Show summary statistics about the project's learnings.
eval "$(~/.vibestack/bin/vibe-slug 2>/dev/null)"
VIBESTACK_HOME="${VIBESTACK_HOME:-$HOME/.vibestack}"
LEARN_FILE="$VIBESTACK_HOME/projects/$SLUG/learnings.jsonl"
if [ -f "$LEARN_FILE" ]; then
TOTAL=$(wc -l < "$LEARN_FILE" | tr -d ' ')
echo "TOTAL: $TOTAL entries"
# Count by type (after dedup)
python3 - <<'PYEOF'
import json, sys
from collections import Counter
learn_file = "$LEARN_FILE"
try:
raw = open(learn_file).read().strip().split('
')
except FileNotFoundError:
print("NO_LEARNINGS"); sys.exit(0)
entries = []
for l in raw:
try: entries.append(json.loads(l))
except: pass
seen = {}
for e in entries:
dk = (e.get('key',''), e.get('type',''))
if dk not in seen or e.get('ts','') >= seen[dk].get('ts',''):
seen[dk] = e
uniq = list(seen.values())
by_type = Counter(e.get('type','?') for e in uniq)
by_src = Counter(e.get('source','?') for e in uniq)
avg_c = sum(e.get('confidence',0) for e in uniq) / max(len(uniq),1)
print(f"UNIQUE: {len(uniq)} (after dedup)")
print(f"RAW_ENTRIES: {len(entries)}")
print(f"BY_TYPE: {dict(by_type)}")
print(f"BY_SOURCE: {dict(by_src)}")
print(f"AVG_CONFIDENCE: {avg_c:.1f}")
PYEOF
else
echo "NO_LEARNINGS"
fiPresent the stats in a readable table format.
The user wants to manually add a learning. Use AskUserQuestion to gather:
Then log it:
~/.vibestack/bin/vibe-learnings-log '{"skill":"learn","type":"TYPE","key":"KEY","insight":"INSIGHT","confidence":N,"source":"user-stated","files":["FILE1"]}'~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.