brain-conflict — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited brain-conflict (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.
Brain's conflict resolver runs on every record_fact. Most of the time it picks a winner cleanly — the new fact either INSERTED (no overlap), SUPERSEDED (clearly beats the prior), or REJECTED (too unconfident). When it can't pick — when two facts overlap in valid-time, are too semantically close, and score within margin — they BOTH stay alive in COMPETING status. This skill is how you handle those.
The conflict resolver writes status='competing' when:
bitemporal (status, intent, address, …) — single_active predicates always supersede.CONFLICT_SIMILARITY_THRESHOLD (semantically close enough that one might be a rephrase of the other).CONFLICT_MARGIN_SUPERSEDE — neither dominates.The resolver refuses to pick. Both rows stay searchable but are surfaced as a known disagreement. The dreams loop's resolver pass (/v1/dreams/run) periodically wakes up and asks an LLM judge to break ties for pairs older than the min-age gate; multi-way conflicts (3+) escape auto-resolution and stay for human adjudication.
get_competing_facts({
entityId: "knowledge_entity:01HXYZ...",
predicate: undefined, // optional — filter to one predicate
asOf: undefined, // optional — what was competing at this moment
})Returns groups keyed by (entityId, predicate):
{
"entityId": "knowledge_entity:01HXYZ...",
"groups": [
{
"key": "knowledge_entity:01HXYZ...::status",
"predicate": "status",
"facts": [
{ "factId": "...", "object": "active", "recordedAt": "...", "source": ... },
{ "factId": "...", "object": "churned", "recordedAt": "...", "source": ... }
]
}
]
}asOf filters to what was competing at that moment — useful for postmortems ("what was this customer's status disagreement on April 1?").
Before you record_fact on a contentious predicate, ask brain what would happen:
detect_contradiction({
entityRef: { vertical: "rent", id: "cust_42" },
predicate: "status",
object: "active",
validFrom: "2026-05-01T00:00:00Z",
confidence: 0.9,
sourceVertical: "rent",
})Returns:
{
"wouldOutcome": "COMPETING",
"reasoning": "bitemporal predicate, strongest similar prior (cosine 0.91) score 0.612 too close to candidate 0.624 (gap 0.012) within margin; both would remain active in COMPETING status.",
"opposingFacts": [
{ "factId": "...", "object": "churned", ... }
],
"predicatePolicy": { "semantics": "bitemporal", "decayHalfLifeDays": 60, "piiClass": "none" }
}The reasoning string names the rule that fired and the numerical gap. Read it before deciding what to do.
For low-stakes pairs aged past the min-age window, the dreams loop's resolver does this:
status='competing' AND age ≥ DREAMS_RESOLVE_MIN_AGE_DAYS)a_wins | b_wins | unsureunsure, leaves the pairThis is fully automated and writes through retract_fact with reason: "dreams_resolver:a_wins" style. The audit row stays — operators can always see "this was resolved by automated judgement".
For high-stakes pairs or 3+ multi-way groups:
get_competing_facts to find the disagreement.retract_fact({ factId: <loser>, reason: "operator verdict: <text>" })human_declared source — that source class has the highest trust weight and tilts future conflicts the same way.When the user wants to record something new on a predicate that's already in COMPETING, run detect_contradiction first. If the dry-run says the new fact would also land COMPETING, surface that to the user before you write — "this would create a 3-way disagreement; would you rather pick one of the existing values first?"
human_declared and the other is inbox_extraction is almost always resolvable by the user; the disagreement is between a person and an LLM. Surface that.human_declared fact via record_fact.get_competing_facts({ asOf: "2026-04-01..." }) to see the historical state, not the current one.single_active predicate, the resolver is in an unusual state — check predicatePolicy from detect_contradiction to confirm.supersedeChain (retractionReason === 'superseded'). An explicit operator retract is treated as independent; the predecessor stays superseded.record_fact / retract_fact — the write side of adjudication (see brain-write)detect_contradiction — preflight before writeget_entity_timeline — full history including superseded chain (see brain-recall)search_knowledge with includeContested: true — surfaces COMPETING facts in search results (see brain-search)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.