note: Agent-consumer column of brain-MCP intent analysis. consumer_type fixed=autonomous_agent. CAVEAT: canonical schema file brain-intent-extraction.md is NOT present on this host (koala) — only this session's own task prompt references it. The closed intent vocabulary below was RECONSTRUCTED from the task prompt's framing + brain/schema.md. Re-map intent labels if the canonical vocab differs. schema_source=reconstructed on every row.

intent_tool_match_values: match mismatch partial

corpus: ~/.claude/projects/*/*.jsonl (Claude Code agent transcripts on koala). brain/sessions/*.jsonl empty. agentsquad docs/eval/*.jsonl are code-review eval results, NOT brain calls. No separate Crush logs found. Zero brain calls appear under any mcp__ name with a human typing the call — all brain acts are agent-initiated (CLAUDE.md reflex), so all qualify as autonomous_agent.


session: tapir-c

intent_tool_match: match

evidence: single pre-task query 'YouTube Data API captions download ownership limitation timedtext adapter Go' — named-entity lexical lookup, fit BM25 well, no reformulation.


session: tapir

observed_friction: preceded by ToolSearch select:brain_ingest 14s earlier — tool not ambient, had to be discovered/loaded first.

evidence: source=tapir-scheduled-discovery-session-2026-06-05, a session learnings dump.


evidence: source=tapir-rls-identity-bootstrapping, first write of RLS lesson.


intent_tool_match: mismatch

workaround: RE-INGESTED same source name 'tapir-rls-identity-bootstrapping' 69s later with edited/condensed body. No update/patch/supersede verb exists, so the agent overwrote-by-re-ingest. Whether this dedups or creates a v2 duplicate is opaque to the agent.

observed_friction: agent revised content within 70s of first write — classic edit-after-write with no edit primitive.

evidence: two brain_ingest, identical source string, divergent content.


evidence: postgres-cascade-skips-tables-without-fk.md — distinct new lesson.


observed_friction: preceded by ToolSearch select:brain_query — discovery tax again.

evidence: 'Dex passwords.dex.coreos.com CRD ...' keyword-rich, single shot.


session: AI-infra

workaround: raw `curl -X POST` to brain-mcp endpoint instead of MCP tool. Preceded by two ToolSearch ('brain knowledge memory' then 'brain') that did not yield a usable loaded tool, so agent fell back to HTTP.

observed_friction: 3-step ladder: ToolSearch 'brain knowledge memory' -> ToolSearch 'brain' -> curl. Agent did not know which act maps to which tool name.

evidence: curl -s -o /tmp/brain-init.txt -w code:%{http_code} -X POST ...


workaround: hand-set TOKEN=... then curl brain-test endpoint — probing whether the HTTP brain path is reachable/authed at all. MCP path not used.

observed_friction: agent testing connectivity by hand; MCP auth/availability not trusted.

evidence: TOKEN=...; curl -s -o /tmp/brain-test ...


observed_friction: preceded by ToolSearch select:brain_query (after an earlier 05:03 ToolSearch 'brain ingestion knowledge wiki' that explored layers).

evidence: 'koala machine state RTX 5070 llama-swap' — named-entity recall, fits lexical.


evidence: batch of 3 in ~1s (k3s/flux gitops; llama-swap ai-stack GPU; MCP Dex OAuth claude.ai) — parallel prior-art sweep, all named-entity.


evidence: batch of 4 in ~2s before a debugging session (flux healthCheck; exit 255 restart loop; NVML mismatch; mirror rebase). Named symptoms, lexical fit OK on first pass.


evidence: 4 writes in ~35s (flux-healthcheck-stale; exit-255-unknown-reason-not-oom; nvidia-nvml-mismatch; mcp-static-bearer) — answers to the 4 queries just run, captured as lessons. Healthy query->fix->write loop.


workaround: 25s after writing exit-255-unknown-reason-not-oom.md, re-queried 'exit 255 unknown SIGKILL containerd' — reformulated terms (SIGKILL/containerd not in original query 'exit 255 unknown reason restart loop diagnosis'). Either confirming the fresh write is retrievable or re-searching because first lexical query missed. No read-after-write / get-by-id act exists.

observed_friction: reformulation chain: 'exit 255 unknown reason restart loop diagnosis' -> 'exit 255 unknown SIGKILL containerd'. Same need, different keywords.

evidence: query at 07:13:51 vs 07:15:25 bracketing the 07:14:37 write.


evidence: batch of 5 in ~20s before a homelab security audit (piguard/iguana tailscale; unifi UCG firewall; SOPS age; ingress TLS cert-manager; koala UFW iptables). Named-entity sweep.


evidence: audit-shortcut-tls-blocks-zero; policy-audit-mode-blocks-nothing — distinct new audit lessons.


evidence: homelab-security-chains-not-bugs.md FIRST write (worked example: koala 2026-05-13).


workaround: RE-WROTE homelab-security-chains-not-bugs.md ~64min later with a different/expanded worked example (host-user dotfile, over-broad ClusterRole). Same filename, additive revision, no patch/append/supersede verb — agent overwrites and hopes the index replaces rather than duplicates.

observed_friction: the in-between hour of audit work produced a better example; only way to fold it in was a full re-write of the same slug.

evidence: two brain_write same filename at 09:28:22 and 10:32:49, divergent worked examples.


workaround: 6s after the homelab-chains re-write, queried 'RBAC MCP cluster pods log chain' — checking the chain reasoning is retrievable / finding the related entry. Read-after-write done via lexical search.

evidence: query immediately follows the 10:32:49 write.


observed_friction: preceded by ToolSearch select:brain_write,brain_query — re-discovered tools this session.

evidence: 'extension build pinned version major version upgrade postgres pgvector'.


workaround: 8s after writing extension-version-lags, re-queried 'pgvector postgres extension version compile error bump' — reformulated from the 18:57:34 query ('extension build pinned version...'). Lexical re-search to confirm the just-written lesson is findable, with different keyword guess.

observed_friction: reformulation: 'extension build pinned version major version upgrade postgres pgvector' -> 'pgvector postgres extension version compile error bump'.

evidence: write at 18:57:58 bracketed by queries 18:57:34 and 18:58:06.


workaround: RE-WROTE webfetch-readme-when-image-or-flag-uncertain.md 3min later, near-identical body. Looks like a retry/overwrite (uncertain the first landed, or minor edit). No idempotent upsert with confirmation, so agent re-fires the write.

observed_friction: followed 7s later by a brain_query on the same topic ('OSS tool image registry CLI flag webhook path schema drift README pre-flight') — write-write-query, i.e. overwrite then verify-by-search.

evidence: two brain_write same filename 18:31:23 / 18:34:23, then query 18:34:31.


workaround: keyword-stuffed lexical query 'OSS tool image registry CLI flag webhook path schema drift README pre-flight' fired right after the webfetch-readme write — agent dumps every concept token hoping BM25 surfaces its own fresh note. This is semantic intent (find that conceptual lesson) coerced into a bag-of-keywords.

observed_friction: query is a concatenation of the note's section headings — a tell that the agent is groping lexically for content it knows by meaning.

evidence: query text mirrors the just-written note's bullet topics.


session: dev

observed_friction: preceded by ToolSearch select:brain_answer.

evidence: 'tapir transcript persistence shared cross-user dedup table RLS isolation ADR-021 ...' -> 22min later a brain_write (acted on the answer). Answer consumed, not re-queried. Healthy.


evidence: tapir-migration-and-rls-test-infra-gotchas, with wing/hall absent here (flat) — see schema-confusion note a40.


intent_tool_match: partial

workaround: asked 'gitea MCP not working workaround file issue via API which token ... how to authenticate gitea API' — a how-do-I question. Next brain act (05:39 query) is a different topic (tapir transcript), so the answer was apparently sufficient OR abandoned; ambiguous.

evidence: brain_answer then unrelated brain_query 4min later.


evidence: 'tapir transcript persistence ADR-021 shared non-RLS'.


workaround: RE-WROTE gitea-mcp-per-repo-tools-404-and-rest-fallback 18s later — overwrite/retry of same slug, no upsert confirmation.

observed_friction: sub-20s gap = almost certainly a content tweak the agent could not express as an edit.

evidence: two brain_write same filename 05:57:37 / 05:57:55.


evidence: batch of 3 (litellm rebuild time piguard; docker compose orphaned volumes; prometheus_client ModuleNotFoundError) — lexical, error-string driven.


workaround: THREE brain_answer at 15:08 (moved compose volumes? / pi rebuild time? / litellm ModuleNotFound prometheus) — the SAME three topics queried lexically an hour earlier (12:07) — were IMMEDIATELY followed at 15:09 by THREE brain_query on the same three topics. The agent asked the synthesizer, was unsatisfied, and fell straight back to raw lexical search. Strongest answer->query fallback in the corpus.

observed_friction: answer/query duplication across one intent: agent hedges by firing both interfaces, trusting neither.

evidence: 15:08 answers vs 15:09 queries, topic-for-topic aligned.


workaround: after the 3 brain_answer calls failed to satisfy, re-issued as lexical brain_query ('moved compose stack to new directory volumes disappeared empty'; 'raspberry pi docker build time arm slow'; 'how to enable prometheus metrics on litellm proxy callback'). The want is meaning-based ('did my volumes move?') but the only retrieval that 'worked' was keyword search — and these are full natural-language sentences crammed into a BM25 box.

observed_friction: natural-language questions ('how to enable...', 'moved ... disappeared') passed to a lexical query tool — semantic intent, lexical interface.

evidence: 3 queries at 15:09 mirror the 3 answers at 15:08.


evidence: 'What happened with the litellm migration on 2026-05-16?' — episodic recall question, answer fit; no re-query followed.


workaround: FOUR-step reformulation chain over one Go bug: 'bytes.Buffer Bytes Reset aliasing slice sharing' -> 'go buffer reuse map backing array bug' -> [write go-bytes-buffer-bytes-reset-aliasing-trap.md] -> 'go map values all show same content after loop' -> 'bytes.Buffer Bytes returns same data every iteration'. The agent knows the SYMPTOM (all map values identical) and the CAUSE (Bytes() aliasing) but cannot phrase a single lexical query that bridges them — it wants concept retrieval and is forced to brute-force keyword variants.

observed_friction: 4 distinct phrasings of the same bug, two before and two after writing the lesson — also doubles as verify_write_landed on the trailing queries.


evidence: mcp-tool-design-get-needs-list-partner.md — a design principle.


evidence: 'Dex to Authentik migration auth.d-ma.be issuer cutover OIDC subject ...'.


workaround: brain_query (a40) and brain_answer (a41) fired ~8s apart on the SAME intent (Dex->Authentik subject-keyed token orphan). Agent runs lexical search AND synthesized answer in parallel for one question rather than choosing — it cannot predict which interface will return usable knowledge, so it pays both.

observed_friction: query+answer doublet on one need.

evidence: 06:25:00 query then 06:25:08 answer, same topic.


workaround: 'authentik cutover validation probe' then 6min later 'authentik cutover post-flip validation' — reformulated pair, likely searching for the agent's own earlier cutover notes / confirming validation steps are recorded. Lexical re-search standing in for recall-my-recent-context.

observed_friction: reformulation: 'validation probe' -> 'post-flip validation'.


observed_friction: preceded by ToolSearch select:brain_write.


workaround: RE-WROTE cannot-move-ingress-host-across-namespaces-flux-dryrun 23s later — overwrite of same slug, no edit/upsert primitive.

observed_friction: sub-30s gap = content correction expressed as a full re-write.

evidence: two brain_write same filename 13:59:50 / 14:00:13.


workaround: after `ToolSearch select:mcp__claude_ai_brain__authenticate` (MCP auth flow), the agent staged the entry as `cat > /tmp/brain_entry.json` ({filename:'postgres-force-rls-cross-u...', content}) for a curl write rather than calling brain_write directly — MCP write path was not usable (auth/loading), so it dropped to the HTTP bodge.

observed_friction: reached for an 'authenticate' tool, then abandoned MCP for hand-built JSON + curl. Matches known pattern: brain/op MCP auth lapses often.

evidence: ToolSearch authenticate 13:53:27 -> cat /tmp/brain_entry.json 13:53:54.


session: template-go-agent

tool: BASH(not-a-brain-act)

evidence: 'brain_' substring was inside a git commit message body ('agent boundaries, network policy, agent s...'), NOT a brain call. Excluded from knowledge-act analysis; logged for audit completeness.