lorekeeper-search — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited lorekeeper-search (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.
Lorekeeper is a persistent memory store exposed via MCP tools (lore_search, lore_update, lore_insert). It uses hybrid semantic + keyword search to surface relevant knowledge.
Critical rule: Every lore_search MUST be followed by a lore_update feedback call once the task is complete. This feedback loop — including confidence ratings — keeps the knowledge base accurate and self-correcting.
When the task is about news, releases, or anything that must be recent:
See references/news-freshness.md for a compact checklist.
Call lore_search with a specific natural language query.
lore_search({ query: "voucher stacking rules in checkout", limit: 10, min_score: 0.1 })min_score (e.g. 0.3) if results are noisy; lower limit if you need fewer resultscreated_after / updated_after accept ISO 8601 UTC strings (naive = UTC; non-UTC offsets raise an error). Use to scope searches to a time window, e.g. created_after: "2026-06-01T00:00:00".sort_by accepts "relevance" (default, by hybrid score), "recent" (by updated_at DESC), or "frequent" (by usage_count DESC). Composes with timestamp filters and limit.Each result contains memory.id, memory.title, memory.content, relevance.combined_score, and links. Each link has its own id, relation_type, reason, source_memory_id, and target_memory_id.
While using the results:
reason) make sense? Does it correctly connect the two memories?This dual verification informs both memory and link confidence ratings in Step 3.
After completing your task, call lore_update with feedback on every returned memory and every link from those results.
lore_update({
memory_feedback: [
{ id: "<memory-uuid-1>", useful: true, confidence: 9 },
{ id: "<memory-uuid-2>", useful: false, confidence: 4 },
{ id: "<memory-uuid-3>", useful: false, confidence: 1 }
],
link_feedback: [
{ id: "<link-uuid-1>", useful: true, confidence: 8 },
{ id: "<link-uuid-2>", useful: false, confidence: 3 }
]
})How to get link IDs: Each search result has a links array. Each element has an id field — use that as the link feedback id.
Fields (same semantics for both memories and links):
useful — whether the memory/link was relevant to the task (for links: whether following the relationship led you to something useful)confidence (1–10) — how likely the content/relationship is factually correct:Critical: `useful` and `confidence` interact — understand the difference before rating:
useful: false, confidence: 7–9 → ranking penalty only, memory is NOT deleteduseful: false, confidence: 1–2 → memory is soft-deleteduseful: true, confidence: 7–10 → score boosteduseful: false, confidence: 5–6 → slight penalty, kept⚠️ Only use confidence: 1–2 when the content is factually wrong or stale — not simply because it was an irrelevant search result. Using low confidence on a valid-but-off-topic memory will delete it permanently.
Need domain knowledge or facts?
├─ YES → lore_search → use results → verify content → lore_update (always, with confidence)
└─ NO → skip LorekeeperIf search returns zero results, there is nothing to provide feedback on — proceed normally.
lore_search({ query: "Python async patterns in service layer" })aaa-111 (async patterns) — relevant, verified correct. Has link lnk-001 → bbb-222 (references, reason: "retry logic depends on async context"). Relationship is valid.bbb-222 (retry logic) — irrelevant to this task, content looks correct. Has link lnk-002 → ccc-333 (part_of, reason: "old sync API used in retry flow"). Old API was removed — link is stale.ccc-333 (old sync API) — outdated info.lore_update({ memory_feedback: [ { id: "aaa-111", useful: true, confidence: 9 }, { id: "bbb-222", useful: false, confidence: 7 }, { id: "ccc-333", useful: false, confidence: 2 } ], link_feedback: [ { id: "lnk-001", useful: true, confidence: 8 }, { id: "lnk-002", useful: false, confidence: 2 } ] })
Result: `ccc-333` is soft-deleted (confidence ≤ 2, useful=false). `lnk-002` score drops toward removal.
## Rules
- **Never skip feedback** — even if no results were useful, mark them all `useful: false` with a confidence rating
- **Always include confidence** — this is how the knowledge base self-corrects over time
- **Rate links too** — collect all link IDs from `results[].links[].id` and include them in `link_feedback`
- **Link confidence** = whether the stated relationship is factually correct; **link useful** = whether following it led somewhere valuable
- **Verify before rating** — cross-reference memory content against code, docs, or your own knowledge
- **Feedback after task completion** — wait until you have used the results before judging usefulness
- **Batch into one call** — send all feedback in a single `lore_update`, not one per memory
- **Be honest about uncertainty** — if you cannot verify, use confidence 5–6 rather than guessing high
## Related Skills
- **[lorekeeper-protocol]** — The full session protocol orchestrating when to search.
- **[lorekeeper-memorize]** — Companion: search first, then insert new discoveries.
- **[lorekeeper-reconcile]** — When search returns suspected stale data, run reconcile to fact-check.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.