personal-content-resurface — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited personal-content-resurface (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.
Given (a) a corpus of saved personal content, (b) a static user profile, and (c) the user's recent activity, decide which N items to re-surface today and why. Output is a ranked list with one-line reasons. Does NOT define the UX (push notif vs daily digest vs dashboard widget) — that lives in product code.
| Signal | Shape | Source |
|---|---|---|
| Corpus item | {id, source, captured_at, text/embedding, tags, last_surfaced_at, surface_count, useful_score} | Obsidian vault, Pinecone, or Supabase — whatever the store is |
| Static user profile | {interests[], role, current_projects[], stated_priorities[]} | User-authored, lives in Obsidian or app DB |
| Dynamic recent activity | {queries_this_week[], content_consumed_this_week[], current_focus_topic} | Activity log of last 7 days |
[
{ "item_id": "yt_abc123", "score": 0.87, "reason": "topic match with current focus + 14d since last surface" },
{ "item_id": "wa_xyz", "score": 0.81, "reason": "high useful_score + 60d dormant" }
]Rank descending. Cap at N (default 5). Each item carries a one-line reason for transparency.
Decay-only. Each item has interval and ease_factor. When marked useful, interval grows. Re-surface when now > last_surfaced_at + interval. Zero LLM in the loop. Cheapest compute.
Use when: MVP day-1, corpus <100 items, no feedback signal yet.
Three latent variables per item: difficulty, stability, retrievability. Updates via maximum-likelihood estimation. Outperforms SM-2 in benchmarks.
Use when: corpus >500 items AND ≥30 useful/not-useful events accumulated to train the model.
score = 0.5 × time_decay + 0.3 × relevance_to_recent_activity + 0.2 × static_profile_matchtime_decay: forgetting curve, sigmoid over days-since-surfacerelevance_to_recent_activity: cosine sim between item embedding and embedding of last 7d activitystatic_profile_match: cosine sim between item embedding and embedding of user profileUse when: corpus >100 items AND user has authored a meaningful profile. The recommended path for Connecting Dots specifically — pure spaced-rep misses the "this is suddenly relevant" signal that recent activity unlocks.
See references/algorithms.md for exact formulas, half-life tuning, and edge cases.
| Stage | Corpus | Feedback events | Algorithm |
|---|---|---|---|
| MVP day 1 | <100 | 0 | SM-2 |
| MVP weeks 2–4 | 100–500 | <30 | Custom hybrid (no FSRS training data yet) |
| Mature | 500+ | 30+ | FSRS + hybrid signal — ensemble |
ease=2.5, interval=1. Don't attempt FSRS.time_decay term fights this.relevance_to_recent_activity weights too high, the user only sees more-of-the-same. Cap that term at 0.5; force diversity sampling for top-N.min_days_between_surface = 7 regardless of score — same item every day is annoying.useful_score to 0.5 (neutral), update on user signal. Never let it drop below 0.1 — that's bandit-style starvation.baoyu-youtube-transcript, integrate-whatsapp, superpowers-chrome:browsing, etc.obsidian-vault, memory-router, or supabase.ner-content-pipeline.rag-patterns.It only answers: "Given everything you have, what should I look at today?"
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.