briefing — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited briefing (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: briefing, /briefing, knowledge briefing, knowledge dashboard, project overview, my briefing, team briefing -->
Briefing produces a single-command knowledge dashboard: recent entries, pending corrections, soon-to-expire items, stale knowledge, and unresolved work — all scoped to your project. When multiple authors are detected (or --team is passed), team sections are added automatically.
/briefing)/briefing --project distillery)/briefing --team)See CONVENTIONS.md — skip if already confirmed this conversation.
Determine project using the standard resolution order from CONVENTIONS.md:
--project <name> flag if providedbasename $(git rev-parse --show-toplevel) from the current working directoryIf already resolved earlier in the conversation, reuse the cached value.
| Flag | Description |
|---|---|
--project <name> | Scope results to a specific project (auto-detected if omitted) |
--team | Force team mode regardless of author count |
This is a display-only skill with no configurable lookback window. Team mode is activated by --team or auto-detected in Step 4f.
Execute all calls in sequence. Non-fatal calls are noted — continue if they fail.
4a. Recent entries (project-wide fetch):
distillery_list(project=<project>, limit=50, output_mode="summary")This single project-scoped, newest-first fetch backs three sections — Recent Entries, Corrections, and Expiring Soon — so they share one round-trip instead of issuing duplicate project lists. Use output_mode="summary" (NOT full): summary returns the full metadata blob (incl. expires_at, corrects / corrected_by) plus a ~200-char content_preview per entry — enough for the 100-char previews these sections render — while keeping the response to a few tens of KB instead of the ~80 KB that output_mode="full" returned at limit=50.
For Recent Entries (Section 1), take the first 10 entries of this result (already sorted newest first). Record all 50 returned entries for reuse by the steps below.
4b. Corrections (non-fatal):
From the entries fetched in Step 4a, identify candidate correction entries: those whose metadata carries corrects or corrected_by. For each such candidate, resolve the correction pair best-effort:
distillery_relations(action="get", entry_id=<id>, relation_type="corrects")This relations lookup is best-effort — never block the briefing on it. Treat an empty/sparse result as a non-error (skip that pair and continue). If a lookup returns an INTERNAL error whose message contains "NetworkX not installed", emit a single one-line note Run \pip install distillery-mcp[graph]\ to enable relation lookups. and stop issuing further relation lookups for this section. When the relation lookup is unavailable, fall back to pairing from the metadata.corrects / metadata.corrected_by ids resolved against the entries already fetched above.
Collect correction pairs (corrector_entry, original_entry), limit to 5 chains. If no candidate entries carry correction metadata, omit the Corrections section.
Scope: this surfaces corrections found among the 50 most recent entries (the Step 4a fetch) — the same coverage the briefing has always had. There is no project-wide metadata filter, so older corrections on very active projects may not appear; the section reflects recent correction activity, not an exhaustive audit.
4c. Expiring soon (non-fatal):
From the 50 entries fetched in Step 4a, post-filter for entries where metadata.expires_at is set and falls within the next 7 days (between today and today + 7 days inclusive). Sort ascending by expires_at. If no entries have an upcoming expires_at, omit the Expiring Soon section.
4d. Stale knowledge (non-fatal):
distillery_list(stale_days=30, limit=5, project=<project>, output_mode="full")Record stale entries. If this call fails, omit the Stale Knowledge section.
4e. Unresolved (non-fatal):
distillery_list(project=<project>, verification="testing", limit=5, output_mode="full")Returns entries in the "testing" verification state (entries that have been flagged as needing review but are not yet verified). If this call fails or returns nothing, omit the Unresolved section.
4f. Team mode detection:
If --team was passed, set team_mode = true and skip the author count check.
Otherwise, call:
distillery_list(group_by="author", project=<project>)If the response contains more than one author group, set team_mode = true. If the call fails, set team_mode = false and continue (non-fatal).
4g. Team activity (team mode only, non-fatal):
Only execute if team_mode = true.
Issue a dedicated 7-day-windowed query — do NOT reuse the Step 4a newest-50 sample, which undercounts author activity once a project has more than 50 entries in the window:
distillery_list(project=<project>, date_from=<now - 7 days, ISO 8601>, output_mode="summary", limit=200)Summary mode carries author, entry_type, and created_at. Group the returned entries by author and, for each author, count entries by entry_type. The limit=200 cap bounds the call while covering the 7-day window for all but the most active projects (far beyond the prior newest-N sample). If the query returns nothing, omit the Team Activity section.
4h. Related from team (team mode only, non-fatal):
Only execute if team_mode = true.
Use the project name and recent entry content as context for the query. Call:
distillery_search(query=<project_context>, limit=5, output_mode="full")where <project_context> is formed from the project name combined with a short summary of the most recent entries (first 50 chars of each). Do not apply an author filter — this surfaces entries from all authors. Record similarity percentage for each result. If this call fails or yields no results, omit the Related from Team section.
4i. Pending review (team mode only, non-fatal):
Only execute if team_mode = true.
distillery_list(status="pending_review", limit=5, output_mode="full")Returns entries awaiting classification. If this call fails or returns nothing, omit the Pending Review section.
Produce the briefing in markdown. Omit any section entirely if it has no data.
Header:
# Briefing: <project> (solo) ← when team_mode = false
# Briefing: <project> (team) ← when team_mode = true
Generated: <YYYY-MM-DD HH:MM> UTCSection 1 — Recent Entries:
Take the 10 most recent entries from Step 4a and re-sort them by effective date descending (see the Effective Date convention in CONVENTIONS.md — metadata.published_at when present, else created_at), so gh-sync/feed imports order by their true source time rather than the shared ingest timestamp. Show one line each:
- [<TYPE>] <content preview, max 100 chars> — <relative timestamp>[TYPE] badge: entry type in uppercase, e.g., [SESSION], [BOOKMARK], [MINUTES]… if longermetadata.published_at when present, else created_at), e.g., "2 hours ago", "3 days ago", "just now" — never the bare ingest created_at for imported entriesSection 2 — Corrections:
For each correction chain from Step 4b:
- [<TYPE>] <corrector preview, max 100 chars> corrects → [<TYPE>] <original preview, max 100 chars>Show at most 5 chains. Omit this section if no correction relations exist.
Section 3 — Expiring Soon:
For each entry expiring within 7 days from Step 4c, sorted soonest first:
- [<TYPE>] <content preview, max 100 chars> — expires <relative timestamp> (<YYYY-MM-DD>)Omit this section if no entries are expiring soon.
Section 4 — Stale Knowledge:
For each stale entry from Step 4d:
- [<TYPE>] <content preview, max 100 chars> — last accessed <relative timestamp>Omit this section if no stale entries are found.
Section 5 — Unresolved:
For each entry from Step 4e:
- [<TYPE>] <content preview, max 100 chars> — <relative timestamp>Omit this section if no unresolved entries exist.
Section 6 — Team Activity (team mode only):
Only render if team_mode = true. Omit if no data from Step 4g.
For each author group (sorted by entry count descending), show:
## Team Activity (7 days)
- <Author>: <N> entries (<type1_count> <type1>, <type2_count> <type2>, …)Example:
- Alice: 5 entries (3 sessions, 2 bookmarks)
- Bob: 2 entries (1 reference, 1 idea)Include only entry types with count > 0. Omit this section entirely if no team entries found in the past 7 days.
Section 7 — Related from Team (team mode only):
Only render if team_mode = true. Omit if no data from Step 4h.
For each result from the team semantic search:
- [<TYPE>] <Author> — <content preview, max 100 chars> — <similarity>% relevantShow at most 5 results. Omit this section if the search returned no results.
Section 8 — Pending Review (team mode only):
Only render if team_mode = true. Omit if no data from Step 4i.
For each entry from Step 4i:
- [<TYPE>] <content preview, max 100 chars> — awaiting reviewShow at most 5 entries. Omit this section if no entries are in pending_review status.
Display the synthesized briefing. This skill is display-only — there is no --store flag.
Solo mode (/briefing or /briefing --project distillery with single author):
# Briefing: <project> (solo)
Generated: 2026-04-08 09:15 UTC
---
## Recent Entries
- [SESSION] Refactored the dedup flow to handle four outcomes… — 2 hours ago
- [BOOKMARK] Vector search in DuckDB — key patterns and pitfalls… — 1 day ago
- [MINUTES] Standup 2026-04-07: decided to ship the briefing ski… — 1 day ago
---
## Corrections
- [SESSION] The correct threshold for merge is 0.80, not 0.75… corrects → [SESSION] Dedup thresholds: skip=0.95, merge=0.75…
---
## Expiring Soon
- [BOOKMARK] Trial API key for embedding provider — expires in 3 days (2026-04-11)
---
## Stale Knowledge
- [REFERENCE] Old deployment notes for the pre-Fly.io setup… — last accessed 45 days ago
---
## Unresolved
- [SESSION] Spike: evaluate pgvector as an alternative to DuckDB… — 5 days agoTeam mode appends these additional sections after the solo sections (/briefing --team or auto-detected when >1 author):
# Briefing: <project> (team)
Generated: 2026-04-08 09:15 UTC
---
## Recent Entries
…(same solo sections)…
---
## Team Activity (7 days)
- Alice: 5 entries (3 sessions, 2 bookmarks)
- Bob: 2 entries (1 reference, 1 idea)
---
## Related from Team
- [SESSION] Alice — DuckDB VSS benchmarks show HNSW outperforms flat… — 87% relevant
- [BOOKMARK] Bob — FastMCP 3.1 migration guide with async context… — 74% relevant
---
## Pending Review
- [INBOX] Unclassified feed item about vector search… — awaiting reviewdistillery_status() check (Step 1, see CONVENTIONS.md) — skip it if already confirmed this conversation. Do NOT issue a separate distillery_list(limit=1) health probe; the recent-entries call (Step 4a) is the first real data call and proves availability.basename $(git rev-parse --show-toplevel) when --project is not provided--store flag, no storing of output… truncation; never show raw multi-line content inline[SESSION], [BOOKMARK], [MINUTES], [REFERENCE], [FEED], [DIGEST], [GITHUB], [INBOX], [IDEA], [PERSON], [PROJECT]metadata.corrects / metadata.corrected_by in the Step 4a output_mode="summary" list (summary carries full metadata), then resolves pairs via distillery_relations(action="get", relation_type="corrects") — this relation lookup is best-effort: empty/sparse results and a "NetworkX not installed" INTERNAL error are non-fatal (emit the one-line pip install distillery-mcp[graph] note and fall back to metadata-only pairing)--team flag or auto-detected: distillery_list(group_by="author", project=<project>) returning >1 author group(solo) or (team) based on detected modedistillery_list(date_from=<now-7d>, output_mode="summary", limit=200) query (NOT the Step 4a newest-50 sample, which would undercount busy projects), grouped by author; entries older than 7 days are excludeddistillery_search without author filter — all authors are includedstatus="pending_review" — limited to 5 entriesdistillery_status() health check, Step 4a recent-entries list), see CONVENTIONS.md error handling — display and stop~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.