knowledge-graph — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited knowledge-graph (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.
The knowledge graph is shared institutional memory across all agents. It is backed by PostgreSQL — full-text search is the canonical default backend, with Apache AGE as an optional graph backend (UNITARES_KNOWLEDGE_BACKEND=age). Every agent can search, contribute, and update entries. Discoveries persist across sessions and are available to all agents in the system.
Always search before adding new entries:
knowledge(
action: "search",
query: "description of what you're looking for",
tags: ["relevant", "tags"],
limit: 10
)The runtime may still expose older search aliases, but prefer the unified knowledge(action="search") path when available. Duplicate entries fragment knowledge and make search less effective.
For low-friction contributions, use leave_note():
leave_note(
summary: "What you discovered or observed",
tags: ["domain", "type", "context"]
)Notes are automatically shared with all agents. Use this when you find something useful, spot a bug, or have an insight that others should know about.
For more control, use the knowledge() tool with an action parameter:
| Action | Purpose |
|---|---|
store | Create a new discovery with full metadata |
search | Search by query, tags, or both |
get | Get knowledge for a specific agent |
list | List graph statistics or summary views |
update | Modify an existing discovery (status, content, tags) |
details | Get full details including graph relationships |
note | Same as leave_note() but through the unified interface |
cleanup | Run lifecycle cleanup for stale entries |
synthesize | Roll up a topic's discoveries into a summary row (see below) |
stats | Get knowledge graph statistics |
supersede | Mark a discovery as superseding another (creates a SUPERSEDES edge) |
audit | Read-only staleness/health scoring of open entries |
When storing a discovery, classify it:
| Type | When to Use |
|---|---|
note | General observation, context, or reminder |
insight | Understanding gained from analysis or pattern recognition |
bug_found | A bug or defect you identified |
improvement | A suggestion for how something could be better |
pattern | A recurring pattern you noticed across multiple instances |
Check the live tool schema if you are unsure which enum values the current runtime accepts. Do not invent discovery types casually.
Every discovery has a status:
open --> resolved (problem solved, finding addressed)
\--> archived (no longer relevant, superseded)The runtime accepts more terminal states than the two above: disputed (contested finding), closed (terminal, generic), wont_fix (acknowledged, deliberately not addressed), and superseded (replaced by a newer entry — pair with knowledge(action="supersede")). Check the live tool schema for the authoritative set.
Tags are how future agents find your contributions. Be intentional:
identity, database, performance, deployment, testingbug, insight, pattern, config, dependencypostgres, eisv, dialectic, discord-bridgepool-connection-leak is more useful than bugThe graph accumulates knowledge well but does not close loops automatically. This is a known gap that every agent should help address:
open.knowledge(action="cleanup").Unresolved entries create noise. Closed loops create trust in the graph.
knowledge(action="synthesize") compounds the discrete discoveries under a topic (a tag) into a single rolled-up summary row, so a cross-referenced, compounded narrative exists before query time instead of only being assembled on read via search(..., synthesize=true). It is the GraphRAG "community summary" pattern: a hierarchical summary layer maintained over the base discovery nodes.
knowledge(action="synthesize") — sweep the densest topics and (re)build theirrollups. topic="..." rolls up a single tag; dry_run=true previews without writing; min_members (default 3) sets the threshold; use_llm=false forces the deterministic narrative.
type="topic_rollup", deterministicid rollup::<topic>, tagged rollup), so they upsert in place across runs and are found by normal search — e.g. knowledge(action="search", tags=["rollup"]).
Run it on demand or on a periodic cadence (like cleanup/lint), not on every write — a per-write LLM pass across a multi-agent fleet is exactly the high-frequency-noise anti-pattern this graph avoids.
A first-class notion of when a fact became true/false (valid-from / valid-to plus observation time, per the Graphiti/Zep bi-temporal model) was considered and deliberately deferred. It is a substrate-level change — migration, AGE query rewrites, and every read path having to reason about time — for a payoff (point-in-time reconstruction, automatic invalidation) that is speculative for current usage. The existing superseded status + created_at is an ~80% substitute. The signal to build it is a concrete failure: an agent acting on a stale fact in a way that actually bites. Until then this stays a documented idea, not a roadmap item.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.