distill — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited distill (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.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.
<!-- Trigger phrases: distill, capture this, save knowledge, log learnings, /distill [content] -->
Distill captures decisions, architectural insights, and action items from a working session and stores them as knowledge entries in Distillery.
/distill is invoked, optionally with content: /distill "We decided to use DuckDB for local storage"/distill --project <name> targets a specific projectSee CONVENTIONS.md — skip if already confirmed this conversation.
See CONVENTIONS.md for resolution order. Cache for the session.
If explicit content was provided (e.g., /distill "We decided to use DuckDB"), use it directly.
Otherwise, gather from the current session context:
If session context is thin, ask what to capture. Do not proceed without at least one concrete decision, insight, or action item.
Synthesize gathered content into a focused summary:
Show the draft to the user before storing:
## Distilled Summary (preview)
[summary content]
Ready to store? (yes / edit / skip)Accept revisions if the user wants to edit.
Call distillery_find_similar(content="<distilled summary>", dedup_action=true). Handle by action field:
`"create"`: No similar entries. Proceed to Step 6.
`"skip"`: Near-exact duplicate. Show similarity table and offer: (1) Store anyway, (2) Skip. Display table format:
| Entry ID | Similarity | Preview |
|----------|-----------|---------|
| <id> | <score%> | <content_preview> |`"merge"`: Very similar entry exists. Show similarity table and offer: (1) Store anyway, (2) Merge with existing, (3) Skip.
For merge: combine new summary with the most similar entry's content, call distillery_update with the entry ID and merged content, confirm and stop.
`"link"`: Related but distinct. Show similarity table, note new entry will be linked. Ask to proceed or skip. If proceeding, include "related_entries": ["<id1>", ...] in metadata at Step 7.
For skip in any case: confirm "Skipped. No new entry was stored." and stop.
Auto-extract 2-5 keywords from the summary. Prefer hierarchical tags:
project/{repo-name}/sessions as base tag for the current projectproject/{repo-name}/decisions for decision entriesproject/{repo-name}/architecture for architectural insightsdomain/{topic} for domain-specific tags (e.g., domain/storage, domain/api-design)Distillery recognises six top-level namespaces in total — project/, entity/, domain/, tech/, source/, and kind/ (the content-type axis assigned by the classifier; see CONVENTIONS.md). *Do not set `kind/ tags by hand** — the namespace is reserved and the store will reject user-supplied kind/*` from non-internal sources.
Repo name sanitization: lowercase, replace non-[a-z0-9-] chars with hyphens, collapse consecutive hyphens, trim leading/trailing hyphens, prefix with repo- if result doesn't start with [a-z0-9]. Final segment must match [a-z0-9][a-z0-9\-]*.
Merge with any explicit #tag arguments (strip leading #). Tags are lowercase, hyphen-separated within segments.
Call distillery_store with:
distillery_store(
content="<distilled summary>",
entry_type="session",
author="<from Step 2>",
project="<from Step 2>",
tags=["<tag1>", "<tag2>", ...],
metadata={"session_id": "sess-<YYYY-MM-DD>-<short-random-id>"}
)The session_id must be unique per invocation (timestamp + short random suffix).
[session] Stored: <entry-id>
Project: <project> | Author: <author>
Summary: <first 200 chars>...
Tags: tag1, tag2, tag3Preview (before storing):
## Distilled Summary (preview)
<summary text>
Ready to store? (yes / edit / skip)Confirmation (after storing):
[session] Stored: <entry-id>
Project: <project> | Author: <author>
Summary: <first 200 chars>...
Tags: tag1, tag2, tag3Duplicate comparison table:
| Entry ID | Similarity | Preview |
|----------|-----------|---------|
| abc-123 | 92% | We decided to use DuckDB... |distillery_find_similar(dedup_action=true)# from user-provided tagssession_id metadata field must be unique per invocation~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.