brain-search — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited brain-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.
Search the company's bitemporal knowledge graph for entities and their facts. Brain's search_knowledge MCP tool runs a hybrid pipeline (vector + BM25 + listwise LLM rerank) over per-tenant data and returns ranked entities each with their matched facts.
Do not use for:
record_fact insteadbrain-recall (it combines profile + timeline + connections)search_knowledge)null when grounding is thin, lenient returns the verdict). answer: null always comes with a reason: on a server in harness mode (reason: "harness_mode") brain spends no model of its own, so read the evidence lines it returns and answer from them yourself. synthesize and search_multi_hop default to detail: "answer" (the answer, its citations and compact evidence); detail: "full" adds every hit, id and scoreuserIdWhen you act for a particular person, pass their id as userId on every read and write. Brain keeps each person's memory apart from the shared, tenant-wide memory:
userId return the shared facts plus that person's own; reads without it return shared facts only;userId land in that person's memory; without it they are shared with the whole tenant;get_entity_profile and the belief lines of the focus view.The Claude Code plugin's hooks capture under the user_id you configured; pass the same id, or your calls will not see what the hooks remembered. A user-bound token is pinned to its own user whether or not you pass one.
search_knowledge({
query: "tenants who complained about maintenance",
limit: 10, // 1..100, default 10
predicates: ["complained_about"], // optional filter
asOf: "2026-04-01T00:00:00Z", // optional bitemporal cutoff
minConfidence: 0.6, // optional 0..1 floor on fact confidence
userId: "u_42", // the person you act for (see above)
})["phone"]). When unsure, omit and let the router decide.asOf for historical investigations ("what did we know on April 1?"). See brain-bitemporal for full semantics.By default (detail: "focus") the answer is a few lines — only what the query is about, each piece of evidence as the facts or as the turn they were read from, whichever is shorter:
Sasha: lives_in = Porto (2026-10-01)
Diego: lives_in = Braga (2026-10-08)
links: Ana sibling_of Sasha; Diego colleague_of Ana
[2026-10-05] sasha: "Update: I sold the Ninja last week, I don't own a motorcycle anymore."
(+11 more: detail "compact")Entity: predicate = value (since…until) [status]; a status shows only when the value is not the current one.links: are the relations connecting the entities shown — the hop a two-step question needs.(+N more …) is what was left out. Ask for it only if the lines above do not answer the question.detail: "compact" returns JSON: every fact of the matched entities with since/until, relations, and entityId (what get_entity_timeline and get_entity_profile take).detail: "full" adds fact and edge ids, the fused score with its per-leg breakdown, trust keys and external refs (the bridge back to the originating vertical). Ask for it only when you need one of those.User: "Anyone complain about late maintenance last month?"
→ search_knowledge({ query: "complained about late maintenance",
predicates: ["complained_about"],
asOf: "<last month end>" })User: "What was Acme's status on March 15?"
→ search_knowledge({ query: "Acme status",
asOf: "2026-03-15T00:00:00Z",
limit: 5 })If the search needs email, phone, dob, or address, the caller must hold the brain:read_pii scope. Brain returns the predicate but the object field is null when the scope is missing — that's a permission signal, not "the data doesn't exist".
find_related_entities from a known anchor, or check you passed the right userId (a personal fact is invisible without it). For a code anchor use why.graph_retrieve — graph-first retrieval when the entities are already known by name; predicateHints narrow the neighbour factssearch_multi_hop — for chained reasoning over multiple entities ("tenants who complained in April AND upgraded after"); set synthesize: true to fold the answer insynthesize — when the user wants a direct natural-language answer with citations rather than raw search hits; pair with synthesisGuardrails: 'strict' when hallucinated answers cost more than nullmemory_diff — for "what changed between two cursors" questions (see brain-bitemporal)summarize_entity — one-line briefing when full profile is overkill (see brain-recall)get_entity_profile — when you already have a specific entity in mindget_entity_timeline — when you need every fact ever recorded for one entityget_fact / get_fact_provenance — the full trust record and grounding turns behind one factId a search surfaced (FACTS_API_ENABLED servers)get_competing_facts / detect_contradiction — adjudication and preflight (see brain-conflict)get_source_reputation — how much to trust a hit's source verticalfind_related_entities — graph walk from a known nodewhy / recall_decisions — code-memory recall: the recorded "why" behind a code anchor / semantic search over recorded decisionsrecord_fact / link_entities / retract_fact — write surface (see brain-write)forget_entity — GDPR-grade hard cascade; admin scope only~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.