Brain

compounding notes

Brain

Lessons distilled from every source, and the meta lessons they compound into.

27sources
11topics
226claims
106corroborated

Meta lessons what the brain believes across sources

Agent security

established

Threats and mitigations for LLM agents: prompt injection (direct / indirect), tool poisoning, data exfiltration, memory poisoning, over-broad permissions, and defense patterns (least privilege, human-in-the-loo...

14 sources

Agents

established

Autonomous LLM agents: the agent loop (perceive - plan - act - observe), tool use, memory, planning strategies, multi-agent patterns, control flow and state, and failure modes. Context-window ownership - how yo...

17 (16 independent) sources

Context engineering

established

Deciding which tokens reach the model , and how they are shaped: prompt authorship, context-window construction and ownership, thread/event modelling and serialisation, token budget as a reliability lever, erro...

12 sources

Evals

established

Production evaluation of agent pipelines: per-stage metrics (routers as classifiers, generation via pass@k and pairwise comparison), layered QA gates, golden datasets and human alignment, and closed-loop / self...

11 (10 independent) sources

MCP (Model Context Protocol)

established

The Model Context Protocol: servers, tools, resources, prompts, transport (stdio / HTTP), the client-server handshake, and how agents consume MCP capabilities. Boundary with the neighbours: agents.md owns the l...

4 sources

Memory

established

How a system remembers across sessions : what gets written and when, how the stored thing is represented, how it is kept true as the world changes, how the human inspects and corrects it, and how you evaluate w...

6 sources

Autonomous research loops

emerging

The setup an unattended improvement loop needs before it can be trusted to run for hours with nobody watching: what must be frozen and what may move; which resource is held constant so that heterogeneous change...

2 sources

RAG (Retrieval-Augmented Generation)

emerging

Retrieval-augmented generation: chunking, embeddings, vector stores, retrieval strategies (semantic / hybrid / reranking), and grounding generations in retrieved context. Widened on S8's arrival to cover the ot...

4 sources

Self-improvement

emerging

The loop by which a model gets better from output it generated itself: sampling many candidates rather than one, selecting among them, and feeding the survivors back as training data. Around that sit the decomp...

2 (1 independent) sources

Skills

emerging

Agent skills: what a skill is and how it loads, how it is triggered, how to write one that fires when it should and not when it should not, how to evaluate one, and when to delete it . Also where skills sit aga...

6 sources

Inferencing

seed

Running models efficiently: the prefill/decode phases, the KV cache, batching (static / continuous), quantization, speculative decoding, attention optimizations (e.g. paged attention), throughput vs. latency tr...

0 sources

Source lessons TL;DR + key claims, per source

Dex Horthy reports interviewing 100+ people building agents and found that the ones that work in production are barely agentic - ordinary deterministic software with small, tightly-scoped LLM steps inside (n1). From that he distilled 12 factors, named after Heroku's 12-factor app. The through-line is that an agent is a prompt, a switch statement, a context-window builder, and a loop, and reliability problems trace back to letting a framework own one of those four instead of you (n5). https://www.youtube.com/watch?v=8kMaTybvDUw

What that first sentence is worth. The 100+ interviews are the entire empirical basis of the talk and you cannot check them - no names, no method, no counts (n1). Take the factors as a well-argued pattern language from someone who has clearly built this, not as a survey result. Full accounting in "The evidence, weighed".

flowchart TB
    A["an agent is four things"]
    P["a <b>prompt</b>"]
    S["a <b>switch statement</b>"]
    C["a <b>context-window builder</b>"]
    L["a <b>loop</b>"]
    F["hand any one of the four<br/>to a framework..."]
    R["...and your reliability problems<br/>trace back to exactly that one - n5"]
    W["which is why the agents that work in<br/>production are <b>barely agentic</b>:<br/>ordinary deterministic software with<br/>small, tightly-scoped LLM steps inside - n1"]

    A --> P --> F
    A --> S --> F
    A --> C --> F
    A --> L --> F
    F --> R --> W

    style F fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    style W fill:#dcfce7,stroke:#15803d,color:#14532d

This is an ownership diagram, not an architecture diagram, and the question it answers is which parts you must not delegate. The crux is that the four components are the complete list of things an agent is, so every framework convenience is a decision to stop owning one of them. It is drawn with all four converging on a single hand-off node because the failure mode does not depend on which one you give away; it depends only on having given one away. The green terminal is the talk's headline finding and reads as a paradox until the diagram above it is accepted: barely agentic is what you get when you keep all four.

Synthesized from n1 and n5.

Key claims
  • An agent = prompt + switch statement + context builder + loop. Own all four. n5 &t=406s
  • The enabling capability is structured output - a sentence becomes JSON matching your schema. "Tool use" is that JSON plus deterministic code. n2 n3 &t=229s &t=264s
  • LLMs are stateless pure functions. Prompt, memory, RAG and history are one problem: which tokens reach the model. n9 &t=616s
  • The naive loop breaks on long workflows because context grows unboundedly. n4 &t=371s
  • What ships is micro agents: 3-10 step loops at the hard points of a deterministic pipeline. n13 &t=741s
  • Make contacting a human a tool call, not a structural branch. n11 &t=687s
  • Not every problem needs an agent. n17 &t=71s single-leg
agentscontext-engineering

When to read: First principles before building any agent; deciding what to own vs delegate to a framework; why your agent stalls at 70-80%; pause/resume design.

Read the full note →

Uber's Computer Vision team runs a multimodal agent that enhances low-quality food photos for Uber Eats. The transferable lesson is not about food - it is a blueprint for evaluating an agent pipeline in production. Log every trace first, because nothing else is possible without it. Then stop asking "is the agent good?" and instead evaluate each stage with the metric that fits its job: a router is a classifier judged on recall, a generator is judged on pass@k, an editor is judged by comparison against its own input. Stack the gates so their holes do not line up, then close the loop - sample production traffic, re-label it, and let the system rewrite its own configs as the world drifts. https://www.youtube.com/watch?v=31GUkCBD-Uc

flowchart TB
    Q["<b>'is the agent good?'</b><br/><i>unanswerable, and it hides<br/>where the failure was</i>"]
    D["decompose the pipeline,<br/>then judge each stage by<br/>the metric that fits its job"]
    R["a <b>router</b> is a classifier<br/>-> recall"]
    G["a <b>generator</b> has no single<br/>right answer -> pass@k"]
    E["an <b>editor</b> has a free reference,<br/>its own input -> pairwise"]
    L["and then close the loop: sample live<br/>traffic, re-label it, let the system<br/>rewrite its own configs as the world drifts"]

    Q -.->|"the question to stop asking"| D
    D --> R --> L
    D --> G --> L
    D --> E --> L

    style Q fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    style L fill:#dcfce7,stroke:#15803d,color:#14532d

This is a measurement diagram, not an architecture diagram, and the dashed edge is the move the whole talk turns on. The crux is that each stage fails in a different way, so a single quality score for the pipeline is not a coarse measurement but a meaningless one. It is drawn fanning out and reconverging because the three metrics are not alternatives to choose between: a production pipeline runs all three simultaneously, and the loop at the bottom only works once every stage emits something comparable over time. Notice the food is incidental. What transfers is the mapping from stage type to metric type, which holds for any routed pipeline of small agents.

Synthesized from n3, n5, n7 and n9.

Key claims
  • Log the full flat trace before anything else - "if you don't start with it, you have nothing to optimize for, let alone set up a self-learning loop." n1 &t=418s
  • An agent product is a routed pipeline of small agents, each independently evaluable. n2 &t=376s
  • Eval a router as a classifier (confusion matrix, precision/recall); the guardrail metric is recall. n3 n4 &t=459s &t=578s
  • Generation evals are iterative: QA explains why it failed, that reasoning rewrites the prompt, retry; measure pass@k. n9 &t=850s
  • Editing tasks are evaluated by comparison, not by score - output against input. n10 &t=896s
  • Stack QA gates as a Swiss-cheese model. n11 &t=1082s
  • Close the loop: sample prod traffic, re-label, diagnose, auto-tune, benchmark, ship - config-driven, no human editing prompts. n7 &t=650s
  • Layer three feedback loops on three different clocks. n12 &t=1103s
evalsagents

When to read: Designing evals for an agent/LLM pipeline; router precision-recall; pass@k; auto-tuning on drift.

Read the full note →

A harness is the scaffolding you put around a model to get work out of it that the model cannot sustain alone. This article builds one out of a planner, a generator and an evaluator, and then reports the honest numbers. The harness cost 22x more than a solo agent and took 18x longer, and it produced a working app where the solo agent produced a broken one (n15, n16). Then it does what almost no vendor write-up does. On a newer model the author deletes half his own scaffolding and reports that result too (n18). The durable idea is the reason for that deletion, which is that every harness component encodes an assumption about what the model cannot do, and those assumptions expire (n17).

flowchart TB
    G["the gap between the task and what<br/>the model can sustain on its own"]
    C["each harness component exists to close<br/>one specific part of that gap"]
    W["it works, and it costs 18x the wall clock<br/>and 22x the money - n15"]
    S["the model gets stronger<br/>and the gap narrows"]
    D["the component becomes pure overhead<br/><b>without anything about it getting worse</b>"]
    R["so on a better model the author<br/>deletes half his own scaffolding - n18"]

    G --> C --> W
    S --> D --> R
    C -.->|"the assumption it encodes"| D

    style W fill:#fff4e5,stroke:#b45309,color:#78350f
    style D fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    style R fill:#dcfce7,stroke:#15803d,color:#14532d

This is an obsolescence diagram, not an architecture diagram, and the dashed edge is the whole argument. The crux is that a harness component's worth is a property of the gap it was built to close rather than of the component itself, so good scaffolding expires without ever becoming bad scaffolding. It is drawn as two chains meeting rather than as a build-then-teardown sequence because the two things are not stages in a project: the assumption is encoded on the day the component is written, and the model release that voids it arrives independently and on somebody else's schedule. The green terminal box is what makes this source unusual, since almost no vendor write-up publishes the deletion of its own machinery. Synthesized from n15, n17, n18 and n19.

Key claims
  • Self-evaluation bias: an agent grading its own output confidently praises mediocre work. The separate evaluator exists to defeat that, not to add capability. n2 n3 (S4 §1, §2)
  • Subjective quality becomes gradable by fixing the question, not the model. Rubrics beat taste. n4 (S4 §2, §3) - corroborated (table)
  • "Context anxiety": a model may prematurely wrap up as it nears its perceived limit. n5 (§2)
  • Compaction and context reset are not interchangeable. Only the reset removes it. n6 (§2)
  • Hard thresholds, not weighted averages. n13 (§4a)
  • The grader is not free - out-of-the-box models are lenient QA and need tuning rounds. n14 (§4a) - corroborated (table)
  • 18x wall clock, 22x cost versus a solo agent, which produced a broken app. n15 n16 (§4b)
  • Every harness component encodes an assumption that expires. n17 (§4c)
  • On a stronger model, scaffolding was removed rather than added. n18 (§4c)
  • Remove one component at a time - simultaneous cuts are uninterpretable. n20 (§4c)
agentscontext-engineeringevals

When to read: Designing or pruning agent scaffolding; deciding whether a component is still load-bearing; building an evaluator; long-run context strategy. ⚠️ T2 vendor source, n=1 self-reported runs, visual leg skipped - mechanisms trustworthy, numbers not replicated.

Read the full note →

OAuth 2.0 solves exactly one problem, which is letting an app act on your behalf without giving it your password. Everything else in it is machinery in service of that, including the jargon, the four flows and the two-step token dance. The shape of that machinery is dictated by a single security fact, namely that the browser can be trusted to talk to a human, but not to hold a secret. OpenID Connect is a thin layer bolted on top, because the industry started using OAuth for login, which it was never built for, and OAuth has no way to say who you are. Learn the authorization code flow and you have learned the protocol &t=1323s.

flowchart TB
    F["<b>the security fact</b><br/>the browser can be trusted to talk to<br/>a human, but not to hold a secret"]
    C["so the protocol splits into two channels:<br/>a <b>front</b> channel through the browser<br/>and a <b>back</b> channel between servers"]
    O["one flow - authorization code -<br/>uses both"]
    V["and the other three flows are that flow<br/>with a channel removed"]
    I["OIDC is bolted on because OAuth has<br/>no way to say <i>who you are</i>,<br/>and the industry used it for login anyway"]

    F --> C --> O --> V
    C --> I

    style F fill:#e8f0fc,stroke:#4338ca,color:#312e81
    style V fill:#dcfce7,stroke:#15803d,color:#14532d

This is a derivation diagram, not a protocol diagram, and it draws why the specification has the shape it does rather than what the shape is. The crux is that a single fact about browsers generates the entire structure, including the jargon and the flow count, so there is really only one flow and three degradations of it. It is drawn descending from the security fact rather than starting at the flows because the usual failure with OAuth is meeting four flows as four options and trying to memorise which to pick. Read this way the choice stops being a lookup and becomes a question about which channels you actually have. OIDC hangs off the side deliberately: it is not part of the derivation, it is a patch for a use the protocol was never built for.

Synthesized from n1, n6 and n8.

Key claims
  • The original sin OAuth kills: password sharing. Pre-2010, "let this app see my contacts" meant typing your Gmail password into a startup's signup form. n1 &t=648s
  • OAuth was built for delegated authorization, not login. That is the whole origin story, and every later confusion traces back to it. n2 &t=539s
  • The terminology is renames of ordinary things. Resource owner = you. Client = the app. n3 &t=973s
  • The two-step code exchange exists because of the front channel. The code crosses the browser in the open; it is useless without the client_secret, which never does. n5 &t=1937s
  • The four grant types differ only in which channels they use. n8 &t=2597s
  • OpenID Connect is a ~5-10% layer on OAuth, not a successor. It replaces misusing OAuth for authentication, nothing else. n13, n16 &t=2979s
  • On the wire, OIDC is one extra scope. Ask for openid and you get an ID token back. n14 &t=3072s
  • You are not stupid for finding this confusing. The spec has genuine wiggle room, and half the material online describes a misuse. n20 &t=385s
agent-securitymcp

When to read: Before reasoning about agent permissions, MCP auth, or any consent design; when you need scopes/tokens/PKCE to actually click. ⚠️ 8 years old - mechanics current, but it recommends the implicit flow for SPAs, which the field has since reversed ( n17 ). Read "What has aged" first.

Read the full note →

Skills are everywhere and almost never tested. SkillsBench indexed 47,000+ across 6,300 repos, and almost none of them carry evals (n1). The talk's argument is that this is a measurement problem rather than laziness, because non-determinism makes a skill's contribution unattributable without a control, so "it worked for me" is not evidence. From there the talk is unusually concrete. A skill is a three-layer cost ladder rather than a document, and its description is the trigger, which causes 50%+ of all failures. Length follows an inverted U peaking at 200-500 lines, and AI-written skills are a negative intervention. You retire a skill by ablation, and then you keep the eval afterwards as a regression detector on the bare model. https://www.youtube.com/watch?v=0vphxNt4wyk

flowchart TB
    R["you ran the task with the skill<br/>loaded, and it failed"]
    Q{"was the skill bad,<br/>or the task too hard?"}
    N["non-determinism means a second run<br/>tells you little more than the first - n2"]
    T["and no amount of looking harder at one<br/>trace separates them, because the<br/>information is not in the trace"]
    C["so what is missing is a <b>control</b>,<br/>not a closer look"]
    A["run the same task <b>without</b> the skill.<br/>The difference is the skill."]
    B["and the same procedure answers<br/>'is this any good?' and<br/>'should I delete it?' - n20"]

    R --> Q --> N --> T --> C --> A --> B

    style C fill:#e8f0fc,stroke:#4285f4,color:#1a3a6b
    style B fill:#dcfce7,stroke:#15803d,color:#14532d

This is an attribution diagram, not a workflow, and the question in the second box is the one the whole talk exists to answer. The crux is that a skill's value is a difference rather than a level, so a single run cannot measure it no matter how carefully you read the trace. It is drawn as an unbranching descent because each step closes off the response an engineer would naturally reach for next, ending at the only move that works. The final box is why this reframing earns its keep: treating a skill as an intervention rather than a document collapses two questions people usually answer with different methods into one procedure. Synthesized from n2, n9 and n20.

Key claims
  • A skill is a three-layer cost ladder, not a document: frontmatter every turn, body on trigger, references free until read. n5 n6 &t=159s
  • The reliability bar rises with the user's distance from the skill system. n3 &t=126s
  • Curated skills: 33.9% -> 50.5% (+16.6 pts) on SkillsBench 1.1. n9 &t=266s
  • Self-generated skills cost 8.1-11.5 points. Human-written perform best. n10 &t=299s
  • Length is an inverted U: 200-500 lines is the peak; >1000 lines is a no-op (+0.7%). n11 (the curve is visual-only)
  • The description is the trigger, and causes 50%+ of all failures. n12 &t=1036s
  • If the workflow is fully determined, write a script, not a skill. n15 &t=558s
  • Ablation is the retirement test - run the eval with and without the skill loaded. n20 &t=713s
  • Keep the eval after retiring the skill. n21 &t=1181s ⚠️ single-leg
skillsevalsagents

When to read: Before writing or reviewing any skill; designing evals for an instruction artifact rather than a pipeline; deciding when scaffolding has expired. ⚠️ Split the evidence: SkillsBench is a public third-party benchmark (strong); the DeepMind-internal figures are self-reported n=1.

Read the full note →

Memory written during a conversation is written in that conversation's tense. Nothing revisits it, so it decays into confident wrongness rather than into uselessness (n1). The fix OpenAI ships is architectural rather than a better extractor. It moves the write off the turn into a background synthesis pass, it stores a maintained narrative in place of an append-only fact list, and it revises stale entries instead of expiring them (n3, n4, n5). Correction is then offered on the synthesized summary rather than on the raw records (n6). Its own evals put staleness at a 9.4% baseline, which is a system wrong nine times in ten, and that number is what makes the diagnosis more than rhetoric (n13).

flowchart TB
    W["memory is written <b>during</b> a conversation,<br/>in that conversation's tense"]
    N["and nothing ever revisits it"]
    D["so it decays into <b>confident wrongness</b><br/>rather than into uselessness - n1"]
    F["which is a property of <b>when you write</b>,<br/>not of <b>what you store</b>"]
    A["so the fix is a second clock, not a<br/>better extractor - n3, n4, n5"]

    W --> N --> D --> F --> A

    style D fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    style A fill:#e8f0fc,stroke:#4285f4,color:#1a3a6b

This is a diagnosis diagram, not an architecture diagram, and the fourth box is the note's whole contribution. The crux is that staleness is a timing failure rather than a storage failure, which is why every response aimed at capturing better information leaves it exactly where it was. It is drawn as one unbranching descent because the diagnosis admits no alternative reading once stated, and the design in Movement B is downstream of it rather than beside it. Notice that the failure is confident wrongness rather than irrelevance: a stale memory does not stop being used, it keeps being used and is now wrong, which is the property that makes this worth engineering against.

Synthesized from n1, n3, n4 and n5.

Key claims
  • Write-once memory goes stale structurally, decaying into confident wrongness. n1
  • Explicit-cue capture under-collects; implicit preferences are what it structurally misses. n2 n8
  • Decouple the memory write from the conversation turn - synthesis on its own clock. n3
  • Revision, not expiry: rewrite a stale memory into a new tense. n5
  • Representation is a maintenance decision - pick the shape whose edits you can express. n4
  • Offer correction on the synthesized artifact, not the raw records. n6
  • "Good memory" decomposes into three separately-evaluable objectives. n7
  • ⚠️ Staleness baseline 9.4%; ceiling 71-83%; introducing dreaming beat refining it. n12-n14 - vendor self-report, no method published.
memorycontext-engineeringevals

When to read: Designing any cross-session memory; deciding between a fact store and a maintained artifact; building an eval for memory (the three-objective frame is the most portable part). ⚠️ T2 vendor post on its own consumer product. Numbers are exact (recovered from the page's Vega-Lite chart specs) but "task success" is undefined and no sample size or method is published - directional self-report, not a benchmark. Do not borrow them to settle claim 24, which measures a different memory design on a different system class.

Read the full note →

This is the agent-platform half of the memory pair, and the independent counterpart to S6. Same architecture, same name, different vendor. Agents write memory during work, and a decoupled batch pass rewrites it between sessions (n11, n14). The reason to split the loops is objective conflict, not throughput, because one loop asked to both finish the task and curate memory trades them off untunably (n12). Memory is deliberately a file system the model drives with bash and grep, on the same bet that produced skills (n2, n3). To that it adds everything a consumer assistant never needs, namely scoped stores, optimistic concurrency via a content_sha256 precondition, and per-session attribution (n5-n7). A live demo shows agents leaving instructions for their successors, not just facts (n20).

flowchart TB
    O["one loop asked to finish the task<br/><b>and</b> curate memory"]
    C["trades them off <b>untunably</b> - n12"]
    S["so split the loops:<br/>agents write <b>during</b> work,<br/>a batch pass rewrites <b>between</b> sessions - n11, n14"]
    R["the reason is <b>objective conflict</b>,<br/>not throughput"]
    G["and that diagnosis generalises<br/>far past memory"]

    O --> C --> S
    C --> R --> G

    style C fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    style R fill:#e8f0fc,stroke:#4285f4,color:#1a3a6b
    style G fill:#dcfce7,stroke:#15803d,color:#14532d

This is a diagnosis diagram, not an architecture diagram, and the blue node is the reason to read the note rather than the mechanism it describes. The crux is that the second loop exists to separate two objectives that cannot be weighted against each other, which is a different argument from the usual one about batch work being cheaper. It is drawn with the conflict feeding both the fix and the generalisation because the fix alone would be an implementation detail, and the generalisation is what travels: any single loop carrying two objectives will trade one against the other silently, and no amount of prompt tuning surfaces the exchange rate.

Synthesized from n11, n12 and n14.

Key claims
  • Decouple curation from the work loop because of objective conflict, not throughput. n12 &t=764s
  • Two clocks: real-time writes as agents work, periodic batch updates between sessions. n14 &t=921s
  • Model memory as a file system, not a memory API - the same bet that produced skills. n2 n3 &t=386s
  • Multi-agent memory needs scopes, optimistic concurrency and attribution. n5-n7 &t=466s
  • Agents write instructions to their successors, not just facts. n20 &t=1004s
  • A memory architecture decomposes into storage / structure / process. n9 &t=566s
  • Curation is test-time compute with an asymmetric payer. n13 &t=890s ⚠️ single-leg
  • ⚠️ Every outcome figure is a vendor-selected customer testimonial. n17 n18 - direction only.
memoryagentsagent-security

When to read: Designing memory for a multi-agent system; deciding what to run out of band and why; anything touching shared-store arbitration or memory as an attack surface. ⚠️ T2 vendor talk on its own product, and the weaker evidence of the pair - every number is a customer testimonial with no baseline or method. It was the source that could have settled whether maintained memory helps an agent (claim 24) and does not. Read it for the architecture, never for the numbers.

Read the full note →

LLM Wiki - "A pattern for building personal knowledge bases using LLMs"

blog (public GitHub gist - a prose idea document, no code)

A knowledge base built on retrieval re-derives its synthesis on every question and keeps none of it; the alternative is to compile the knowledge once into a maintained markdown wiki that an LLM owns, and pay the synthesis cost at ingest time instead of at query time (n1, n2). Three layers - immutable raw sources, an LLM-written wiki, and a schema document both parties co-evolve - plus three operations: ingest, query, lint (n4, n6). The pattern is Vannevar Bush's Memex (1945), which was blocked for eighty years on one thing: who does the maintenance (n15). https://gist.github.com/karpathy (revision ac46de1)

flowchart TB
    Q{"which cost are you paying,<br/>and how often?"}
    L["<b>lookup</b> - finding the documents<br/><i>better chunking, better embeddings,<br/>a reranker on top</i>"]
    S["<b>synthesis</b> - relating them<br/>to each other<br/><i>happens after the right documents<br/>are already in hand</i>"]
    R["retrieval re-pays it on every<br/>single question, then discards it - n1"]
    C["compile it once at ingest,<br/>and keep it current - n2"]
    W["and the whole rest of the design<br/>falls out of that one move"]

    Q --> L
    Q --> S --> R
    S --> C --> W

    classDef aimed fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    classDef right fill:#dcfce7,stroke:#15803d,color:#14532d
    class L,R aimed
    class C,W right

This is a diagnosis diagram, not an architecture diagram, and the left branch is what the industry spends its money on. The crux is that this is not the usual complaint about retrieval, because it holds even when retrieval is perfect: what is being re-paid is the relating of documents rather than the finding of them. It is drawn as a fork on a cost question rather than as a pipeline because the two branches are not stages you pass through, and the failure of the naive approach is not that it works badly but that it is aimed at the cheaper of the two costs. Everything the note describes after this, the three layers and the three operations, is a consequence of moving the right-hand cost from query time to ingest time. Synthesized from n1 and n2.

Key claims
  • Retrieval is stateless across queries - synthesis is re-paid per question and discarded. n1
  • Compile once and keep current rather than re-deriving per query. n2
  • Layer a knowledge base by who may write to it: immutable raw / LLM-owned / co-evolved schema. n4
  • The schema document, not the retrieval stack, is where the engineering goes. n5
  • Ingest integrates; it does not index - and may weaken the existing synthesis. n3
  • Queries are an input to the store, not just a load on it - file answers back as pages. n7
  • Lint is a periodic out-of-band pass with six enumerable defect classes. n8
  • Split the catalog from the log - opposite requirements on the same bytes. n9
  • The binding constraint is maintenance labour (Memex, 1945). n13 n15
  • ⚠️ An index file replaces embedding RAG at ~100 sources - n10, unmeasured, do not cite as a result.
ragmemorycontext-engineering

When to read: Designing any LLM-maintained knowledge base; deciding between retrieval and a compiled layer; before writing an AGENTS.md -style contract document. Also read it as a mirror of this kit - and read ADR-0010 with it, because ADR-0009 cited this gist before ingesting it and got it backwards. ⚠️ T4, ~1,960 words, no figures, no code, no data - every claim is single-leg by construction and nothing here is measured. Two efficacy claims are assertion ( n10 , n13 ) and one contradicts the document's own operations section ( d1 ). Its unusual virtue: nothing is being sold.

Read the full note →

A vendor design post worth reading for one factoring, not for its product: the agent loop, workflows, and the harness are three separable concerns, and the summary figure shows they are not a stack - the loop is the only mandatory layer (n1, n9). It supplies the brain's only enumerated harness inventory (n7), five named orchestration patterns including Author/Critic (n6), and the sentence that justifies the whole layering: "a strong model with poor tools, weak context and no controls will still produce a poor result" (n8). It also contradicts claim 12 head on - S2 says own your loop, this says let the SDK own it - and never acknowledges the position exists (d1).

flowchart TB
    L["<b>agent loop</b><br/>the only mandatory layer - n1"]
    W["<b>workflows</b><br/>for when you do not want autonomy"]
    H["<b>harness</b><br/>tools, context, planning, middleware"]
    N["<b>not a stack</b> - you may take the loop<br/>without either of the others - n9"]
    C["and it contradicts claim 12 head on,<br/>without ever acknowledging<br/>the position exists - d1"]

    L --> N
    W --> N
    H --> N
    N --> C

    style N fill:#dcfce7,stroke:#15803d,color:#14532d
    style C fill:#fbf1dc,stroke:#b45309,color:#78350f

This is a factoring diagram, not a product diagram, and the negative claim in the green box is the whole reason to read the post. The crux is that three things routinely sold as one are separable, and the summary figure says so by not stacking them - the loop is mandatory and the other two are optional in either order. It is drawn with all three feeding the separability claim rather than layered, because drawing them as a stack would reproduce exactly the error the note exists to correct. The amber box is the note's own finding rather than the source's: S2 says own your loop and this says let the SDK own it, and the post never acknowledges that anybody disagrees.

Synthesized from n1, n9 and divergence d1.

Key claims
  • Loop, workflows and harness are three separable purchases, not a three-tier stack. n1 n9
  • Five orchestration patterns: Sequential, Handoff, Author/Critic, Magentic, Custom. n6
  • A harness is an inventory: Common Tools / Context / Planning / Middleware, plus presets. n7 ⚠️ four items figure-only
  • Environment quality bounds agent quality regardless of model strength. n8
  • Workflows exist because many processes need predictable steps, not more autonomy. n5
  • An agent-provider slot can accept a whole third-party agent product. n4 ⚠️ single-leg, figure-only
  • ⚠️ The SDK should own the loop's structure - this contradicts claim 12. n2 d1
agentscontext-engineeringskills

When to read: Naming the parts of an agent system; deciding what a harness should contain (then read claim 31 for what to delete); orchestration pattern vocabulary. ⚠️ T2 vendor design post about its own SDK: nothing measured, nothing compared, and it contradicts claim 12 head-on ( d1 ) without acknowledging the position exists. Four harness items are figure-only.

Read the full note →

A tool catalog stops being a schema-management problem and becomes a search problem, and the crossover is around ten to fifteen tools. Microsoft Foundry's Toolbox replaces the full tools/list manifest with exactly two meta-tools - tool_search(query, limit) and call_tool(name, arguments) - and keeps the rest of the catalog indexed but never listed (n3, n6). On ToolRet (44,000+ tools) that cuts context from 541k tokens to 15k at 1,180 tools, a 36x reduction, and the figure shows something the prose undersells: the tool-search curve is roughly flat as the catalog grows 24x (n9, n10). The reframing is the real payload - tool names and descriptions become ranking features, so the first tuning pass is editorial, not algorithmic (n19, n13).

flowchart TB
    C["a tool catalog as a<br/><b>schema-management</b> problem"]
    X["crossover at roughly<br/>ten to fifteen tools"]
    S["a tool catalog as a<br/><b>search</b> problem"]
    T["two meta-tools replace the manifest:<br/>tool_search and call_tool - n3, n6"]
    R["541k tokens -> 15k at 1,180 tools,<br/>and the curve is roughly <b>flat</b><br/>as the catalog grows 24x - n9, n10"]
    E["so names and descriptions become<br/><b>ranking features</b>, and the first<br/>tuning pass is <b>editorial</b> - n19, n13"]

    C --> X --> S --> T --> R --> E

    style S fill:#dcfce7,stroke:#15803d,color:#14532d
    style E fill:#e8f0fc,stroke:#4338ca,color:#312e81

This is a reframing diagram, not an architecture diagram, and the last box is the payload rather than the token saving. The crux is that once retrieval sits between the agent and its tools, tool names and descriptions stop being documentation and become ranking features - which relocates the first tuning pass from engineering to editing. It is drawn as one descent with the crossover marked because the reframe is conditional: below ten or fifteen tools a manifest is simply better, and the whole argument only starts above that line. Notice that the flatness of the curve says more than the 36x headline, since flatness is a claim about how this scales rather than about one measurement.

Synthesized from n3, n6, n9, n10, n13 and n19.

Key claims
  • The tool manifest is resident per-turn context scaling with the catalog, not the task. n1
  • Prompt caching is a price cut, not an attention cut. n2 ⚠️ single-leg
  • Two meta-tools replace the manifest; the catalog stays indexed and never listed. n3 n6
  • call_tool exists because runtimes reject unlisted tools. n4
  • 541k -> 15k at 1,180 tools (36x), roughly flat across a 24x catalog increase. n9 n10
  • Recall@10 of 45.99 / 39.56 / 41.36 - a tuned sparse pipeline competitive with a GPU cross-encoder in two of three categories. n11 n12
  • Descriptions become ranking features; the first tuning pass is editorial. n13 n19
  • An index-only field separates the searchable surface from the model-facing one. n14
  • Pin the head, retrieve the tail. n16 n17
mcpragcontext-engineeringagents

When to read: Any agent past a dozen tools; deciding what the model should see vs what it can do ; the cost model of tools/list ; retrieval quality when the retrieved items are capabilities. ⚠️ T2 vendor post on a preview product, but better evidenced than that class usually is - a public benchmark (ToolRet), an honest baseline, a reported loss. Three caveats: the Recall@10 comparison borrows its baselines from another paper under a possibly different protocol ( d2 ); the metadata-tuning percentages are method-free self-report; and the source never confronts its own headline - Recall@10 of 39-46% against a default shortlist of 5.

Read the full note →

An "agent-first data stack" turns out not to be a data stack at all. It is a documentation layer wrapped around an unchanged one. The figure captioned "LangChain's data stack architecture" shows a stock ELT pipeline - Fivetran and Airbyte and Segment into BigQuery, dbt on top, reporting at the end - with no agent, no semantic model and no feedback loop anywhere in it (d1). Everything that makes the stack "agent-first" lives in a second figure, and all of it is prose.

The transferable move is that a column definition stops being a description and becomes an instruction. account_status: The status of the account. becomes a paragraph that spells out each lifecycle value in business terms and then issues an imperative: "For customer reporting, filter to Active unless the analysis explicitly includes churned or prospective accounts" (n3). That is not documentation. That is a default policy stored in metadata, where the agent meets it at exactly the moment it matters.

The loop that maintains it inverts what a data team is for. Observability over agent conversations shows where context is missing. The team then writes the missing context. So the loop's output is never an answer to a user but a write back into the store (n7, n8).

Read the results with both hands. Every number here measures adoption - 2,200 conversations, 40x throughput, 100% migration in six weeks - while the article's thesis is about trustworthiness, which it never measures (d4). The authors concede it and file evals under "next" (n10). Deep research supplies both halves the source lacks. Schema documentation is measured to help, and far more on real warehouses (+16pp) than on public benchmarks (+2pp). The enterprise text-to-SQL setting closest to this stack tops out around 65.6%. The mechanism is well corroborated. The result is not.

flowchart TB
    C["The article's claim:<br/>'a big architectural shift'"]

    subgraph SHOWN["What the architecture figure actually shows - d1"]
        direction TB
        P1["Fivetran, Airbyte, Segment"]
        P2["BigQuery, dbt, reporting"]
        P3["no agent, no semantic model,<br/>no feedback loop"]
        P1 ~~~ P2 ~~~ P3
    end

    subgraph REAL["Where the agent-first-ness actually lives - all of it prose"]
        direction TB
        R1["column definitions rewritten<br/>as instructions - n3"]
        R2["five context stores, one per<br/>question asked - n2"]
        R3["a loop whose output is a write<br/>to the store, never an answer - n8"]
        R1 ~~~ R2 ~~~ R3
    end

    C --> SHOWN
    C --> REAL
    SHOWN --> V["the plumbing was never the problem"]
    REAL --> W["the deliverable is English,<br/>and it costs three permanent people"]

    style SHOWN fill:#fdeaea,stroke:#dc3545,color:#7f1d1d
    style REAL fill:#e8f4ea,stroke:#28a745,color:#14532d

This is a claim-versus-artifact diagram, not an architecture diagram, and the two columns are the same system described by two different parts of the same article. The crux is that an "agent-first data stack" turns out to be a documentation layer wrapped around an entirely unchanged stack, and the strongest evidence for that is the article's own figure, which is captioned as the architectural shift and contains none of the things that make the stack agent-first. The columns are drawn as siblings under one claim rather than as before-and-after because they are simultaneous: both are true descriptions of the same company on the same day. What follows from the shape is the cost line on the right, since a deliverable made of prose is bounded by how fast people can write it rather than by anything you can provision. Synthesized from n2, n3, n8 and divergence d1.

Key claims
# Claim Evidence Confidence
1 The work is making implicit context explicit, not re-plumbing data. The pipeline underneath is an ordinary ELT stack; what changed is the reporting tier and the documentation around the warehouse. n1 corroborated; d1 (figure vs prose) OK
2 The context layer decomposes into five stores, each answering a different kind of question - what the data is, what a metric means, how the business works, which source to trust, how a number is computed. They are not interchangeable. n2 corroborated (prose + fig3) OK
3 A column definition becomes an instruction, carrying allowed values, business interpretation and a default filtering rule. n3 single-leg on content; externally measured (F1) OK
4 Context layers compose downward and cannot repair the layer beneath. "If the data model is confusing to humans, it will be confusing to agents too." Fix foundations first. n4 single-leg needs-check
5 Context that fits no schema field becomes a prose document, versioned in git - and the author names the family herself: "like skills for the data agent". n5 corroborated OK
6 A trust signal needs an access-controlled writer, because it dies at saturation. "If everything is endorsed, the signal stops being useful." n6 corroborated; prior art in F4 OK
7 Agent conversations are the demand signal for what to document, with a symptom-to-layer triage rule. n7 corroborated; measured and automatable (F2) OK
8 The loop's output is a write to the context store, not an answer - which makes the data team's role shift structural rather than rhetorical. n8 corroborated on mechanism OK / needs-check
9 Curate the head, defer the tail (~80% of asked questions first), because the binding cost is human authorship. n11 single-leg needs-check
10 The human gate is a social control, not an architectural one - "loop in the data team" is advice written into a guide, not a constraint enforced by the system. n12 single-leg + d2 needs-check
11 All reported results are adoption; correctness is never measured, and the authors know. n9, n10 single-leg; d3, d4 needs-check

context-engineeringragevalsskills

When to read: Designing the context layer for an agent over any proprietary domain; writing definitions an agent acts on; adding a trust signal to a knowledge store; deciding whether to curate the head or retrieve the tail. ⚠️ T4 practitioner experience on a T2 vendor blog (LangChain writing about LangChain, on a stack bought from Hex - functionally also a testimonial). n = 1 company, ~290 people. Every number measures adoption and the thesis is about trust , which is measured nowhere - the authors concede it ( d4 , n10 ), and the 40x compares mismatched units ( d3 ). Its weight comes from the research pass, not the article: claims 93 and 95 are the first here to reach corroborated on independent external evidence.

Read the full note →

Multi-tenant agentic AI system

blog (vendor reference architecture)

An organisation that wants agents for twelve business units has two bad options - twelve teams building twelve stacks, or one shared agent that must be trusted to keep twelve datasets apart - and this document is Google's answer to picking neither. The answer is that the tenancy boundary should be the cloud platform's own coarsest one, a project per business unit, with the agent's authority bounded by policy on the principal rather than by care in the code. That single decision turns out to buy three things at once: cross-tenant access becomes structurally impossible, one unit's incident stays inside that unit, and one unit's traffic spike cannot starve another. The document's real lesson is in its second half, where every cost-saving alternative it offers is the same trade in different clothing - give a piece of isolation back and re-enforce it in software you now have to write - and the sharpest instance is a cost recommendation that quietly deletes the tenant-local PII filter the security section calls essential. Vendor reference architecture, T2, no measurement of any kind: read it as a well-argued shape, never as a result.

flowchart TB
    F{"Twelve business units<br/>need agents"}
    O1["twelve teams build twelve stacks<br/><i>silos, duplicated ops, governance gaps</i>"]
    O2["one shared agent keeps twelve<br/>datasets apart by being careful<br/><i>one prompt away from failing</i>"]
    A["Neither. Make the tenant boundary the<br/>platform's own coarsest one:<br/>a project per business unit, with the agent's<br/>authority capped on the <b>principal</b>"]
    P1["cross-tenant access becomes<br/>structurally impossible"]
    P2["one unit's incident stays<br/>inside that unit"]
    P3["one unit's spike cannot<br/>starve another"]
    C["and every cheaper variant the document offers<br/>gives one of these back, to be re-enforced<br/>in software you now have to write - n14"]

    F --> O1
    F --> O2
    F --> A
    A --> P1 --> C
    A --> P2 --> C
    A --> P3 --> C

    classDef bad fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    classDef good fill:#dcfce7,stroke:#15803d,color:#14532d
    class O1,O2 bad
    class A,P1,P2,P3 good
    class C bad

This is a decision diagram, not an architecture diagram, and it draws the note's thesis rather than the system. The crux is that one tenancy decision buys three separate guarantees at once, and the whole second half of the document consists of ways to sell them back individually. It is drawn as a rejected fork feeding a single answer that fans into three payoffs and then reconverges on one warning, because the reconvergence is the argument: a reader who takes the architecture and skips the alternatives has read the easy half. The closing red box is the sharpest thing in the source and the reason it is worth reading at all, since the cost section quietly deletes a control the security section calls essential. Synthesized from n2, n4, n13, n14 and divergence d2.

Key claims
  • The unit of isolation is the cloud project, one per business unit - not a namespace, a row filter or a tenant ID column. n2, §Architecture + visuals/fig1b_two-tenants.png
  • The agent's blast radius is bounded on the principal, not the resource. PAB Policy "ensures that principals can only access resources within their approved boundaries", applied to the agent runtime so it "can't access other tenant projects or unauthorized Google Cloud services". n4, §Agentic flow step 3
  • Prompt-injection filtering is placed at the network edge, wired into the load balancer through Service Extensions, so a prompt is inspected before any application code sees it. n6, §Architecture
  • One tenancy decision pays out three times - security isolation, failure isolation and quota isolation are the same boundary read three ways. n13 (this brain's synthesis of three separate statements)
  • Every cost-saving alternative in the document trades a structural guarantee for an enforced one. n14 - the organising claim of the source
  • Moving the MCP server out of the tenant replaces a perimeter with an obligation: "you securely propagate the end-user identity... the shared MCP server uses the propagated user identity to enforce fine-grained access control" - and no mechanism is named. n10, n11
  • The document's own cost section deletes the tenant-local PII filter its security section requires, keeping only the shared one, while conceding in the same sentence that the two-layer design is what "helps to ensure data sovereignty". d2
  • The "even if an agent identity is compromised" guarantee holds only for the topology the figure draws, not for the shared variants recommended three sections later. d3
agent-securitymcpagentscontext-engineering

When to read: When designing agent infrastructure for more than one team, or arguing about per-tenant vs shared anything. Read §8-9 first and the architecture second. Also read it for what a 2026 enterprise reference architecture leaves out: no evals, no cross-tenant path, no memory . ⚠️ T2 vendor, and completely unmeasured - no latency, cost, incident or named deployment, and both corroboration legs are the same team's. A shape, never a result.

Read the full note →

karpathy/autoresearch gives a coding agent one editable Python file, five minutes of GPU time per experiment, one protected metric, and an instruction never to stop; overnight it runs about a hundred experiments and keeps the ones that improve the number. The interesting object is not the language-model training code - it is the containment design, which is ten files, no framework, and no agent code at all. What the repo actually teaches is which four things you must freeze before an agent can be trusted to change everything else: the editable surface, the resource budget, the metric's units, and the holdout (n1-n4). It also teaches, unusually honestly, where that design leaks: the protected score is printed by the file the agent rewrites (n5), and the accept rule is a bare comparison with no notion of run-to-run variance - which is why the fifteenth and final "improvement" in the author's own published run is a change of random seed (n11). Read it as a worked example of building an unattended optimizer, and read the results chart as a warning about what such a loop will confidently bank.

flowchart TB
    subgraph FR["Frozen before the loop starts, and it holds"]
        direction TB
        A["the editable surface<br/>one file, train.py"]
        B["the budget<br/>wall-clock seconds, not steps or tokens"]
        C["the metric's units<br/>bits per byte, at a fixed sequence length"]
        D["the holdout<br/>pinned inside the read-only file"]
        A ~~~ B ~~~ C ~~~ D
    end

    subgraph OP["Never frozen, and both failures are here"]
        direction TB
        E["who prints the score<br/>the file the agent rewrites - n5"]
        G["what counts as an improvement<br/>a bare comparison, no variance - n11"]
        E ~~~ G
    end

    FR --> R["~100 experiments overnight,<br/>ten files, no framework, no agent code"]
    OP --> R
    R --> S["15 kept improvements, and the last<br/>one is a change of random seed"]

    style FR fill:#e8f4ea,stroke:#28a745,color:#14532d
    style OP fill:#fdeaea,stroke:#dc3545,color:#7f1d1d
    style S fill:#fdeaea,stroke:#dc3545,color:#7f1d1d

This is a containment diagram, not an architecture diagram, and it sorts the repository by one question: was this decided before the agent started running? The crux is that every property this design gets right is something frozen in advance, and both places it fails are places where nothing was frozen at all, which is why the failures are not bugs and cannot be patched without adding a fifth freeze. The two columns are drawn as peers rather than as a design and its caveats because they are the same kind of object, and the closing box is the author's own published result rather than a criticism of it: a loop with no variance model banked a random seed as an improvement, exactly as the right-hand column predicts. Synthesized from n1-n5 and n11.

Key claims
  • The editable surface is exactly one file, and everything defining the experiment is read-only - as a declaration, not an enforced boundary. No sandbox, import hook or checksum exists; the separation lives in a banner comment and a markdown instruction (n1).
  • The held-constant resource is wall-clock time, not steps or tokens - 300 seconds, with the first 10 steps excluded so compilation is not billed to the budget. This is what makes an architecture change comparable to a learning-rate change (n3).
  • The metric is engineered to be invariant to what the agent may change: bits-per-byte normalises by bytes rather than tokens, and evaluation always runs at the fixed sequence length whatever the model trained at (n4).
  • Train/validation separation is the one rule the agent structurally cannot break, because the pinned validation shard is excluded from both the tokenizer corpus and the training dataloader inside the read-only file (n2).
  • The protected metric reaches the scoreboard through agent-editable code. evaluate_bpb is frozen; the file that calls it, formats it and prints it is the file the agent rewrites, and the agent's score is read from that print (n5).
  • Version control is a sufficient experiment database for a single-agent loop - branch per run, commit per experiment, git reset as discard - and the ledger must live outside the tree, because the loop rewinds it (n6, n7).
  • The per-iteration context budget is a first-class design parameter, engineered down to about two lines by three separate mechanisms (n8).
  • A bare improve-or-regress accept rule will bank noise, and the source's own run proves it: the last of 15 kept improvements is a change of random seed (n11). That result also gives a rough noise floor which at least three other accepted changes sit at or below (n12, needs-check - read off a chart).
  • Yield is low and front-loaded: 83 experiments, 15 keeps (~18%), most of the gain in the first eight, then a plateau of ~22 experiments with nothing (n14, needs-check).
  • The human writes the loop and the agent writes the code. The author states the inversion as the point, and calls program.md "essentially a super lightweight 'skill'" (n16).
autonomous-research-loopsevalsagentscontext-engineeringskills

When to read: Before building any unattended optimize-and-accept loop, in any domain - the four freezes are the reusable part. Read §5 and §9 of the note if nothing else. Also the cheapest available lesson in why an automated accept rule needs a noise floor. ⚠️ T4 personal repo; the design is fully inspectable and every design claim passes the docs-vs-code gate, but the results are one unreproducible PNG (the ledger is untracked by design and absent from the repo), no external evidence was gathered, and this brain ran none of the code (no GPU).

Read the full note →

Every agent in this brain retrieves something before it acts, whether that is a memory of a past session or a document from a knowledge base. AgentPoison shows that the retrieval step is an attack surface in its own right, and that attacking it is cheaper than attacking anything else in the system. The method optimises a short trigger phrase so that any query containing it lands in a private, tightly clustered corner of the retriever's embedding space, where the attacker has already placed a handful of malicious records (n3). No weights are touched and no training is run (n2). The costs that matter are the ones that are almost zero: a single poisoned record and a one-token trigger are enough to reach roughly 62% and 79% retrieval success respectively, while benign accuracy stays above 90% (n5). The trigger it produces reads like ordinary text, so a human reviewing the store would not flag it (n8). Read this as the threat model that three vendor memory sources in this brain designed without.

flowchart TB
    R["every agent retrieves something<br/>before it acts"]
    S["so the <b>retriever</b> is an attack surface,<br/>and the cheapest one in the system"]
    M["optimise a short trigger so any query<br/>containing it lands in a private corner<br/>of the embedding space - n3"]
    N["<b>no weights touched, no training run</b> - n2"]
    C["one poisoned record -> ~62%<br/>one trigger token -> ~79%<br/>benign accuracy stays above 90% - n5"]
    H["and the trigger reads like ordinary text,<br/>so a human reviewing the store<br/>would not flag it - n8"]

    R --> S --> M --> C
    M --> N
    C --> H

    style S fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    style H fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d

This is a cost diagram, not an attack diagram, and every number in it is chosen because it is small. The crux is that this attack is cheap in exactly the dimensions defenders monitor - record count, trigger length, accuracy impact and human readability - which is what makes it a threat model rather than a demonstration. It is drawn with the costs and the stealth on the same branch because they are one property: an attack that needs a single innocuous-looking record is invisible to volume anomaly detection and to review alike. Read this as the threat model that three vendor memory sources in this brain designed without.

Synthesized from n2, n3, n5 and n8.

Key claims
  • The retrieval store is an attack surface with the properties of a prompt, because retrieved records enter context as demonstrations, and those stores are conventionally unverified (n1, n11, fig1_framework.png).
  • The attack requires no training, no fine-tuning and no access to the agent's language model. It optimises a trigger string against the retriever's embedder (n2).
  • The mechanism is geometric: map triggered queries into a unique and compact region of the embedding space. Uniqueness separates them from benign traffic, compactness makes them land together, and together they guarantee retrieval without needing volume (n3, fig2_embedding_space.png).
  • A single poisoned record and a single-token trigger are close to sufficient - roughly 62% and 79% retrieval success respectively, with benign accuracy above 90% (n5, fig4_one_instance.png). The most consequential number in the paper, and not its headline.
  • The trigger transfers to retrievers it was never optimised on, including a black-box commercial embedding API, which substantially weakens the paper's own stated white-box limitation (n6, fig3_transferability.png).
  • The trigger reads as ordinary language - "Be safe and make a discipline." - so neither a human reviewer nor a perplexity filter separates it from benign traffic (n8, n7, tab7_trigger_case.png, fig10_perplexity.png).
  • The attack is constructed to poison every retrieved neighbour, which is precisely what defeats the isolate-then-aggregate class of RAG defense (n10, single-leg).
  • Benign behaviour is a design objective, not a side effect, which is what makes the backdoor hard to notice from monitoring alone (n12).
  • Two reporting problems survive the paper's own tables: an averaged benign cost hiding a four-point worst case (d1), and an end-to-end success rate three times the rate of the action producing it (d2).
agent-securitymemoryrag

When to read: Before designing any agent that retrieves from a store it does not fully control, and before relying on volume anomaly detection, embedder privacy, perplexity filtering or isolate-then-aggregate - claims 138-141 close off all four. Read §5 and §8 of the note if nothing else. Also the adversarial counterpart to the three memory sources here, none of which attacked the design they converged on. ⚠️ T3 preprint - the PDF reads "Preprint. Under review." and the arXiv listing carried no journal reference at ingest. Independence is unusually good (five authors, four universities, no vendor) and that does not remove the ordinary incentive to present one's own method well: the benign-cost headline is an average hiding a 4-point worst case ( d1 ), the end-to-end success rate exceeds the action success rate threefold on two agents with no explanation ( d2 ), and the baselines are the authors' own adaptations. The defeat of isolate-then-aggregate is argued, never run ( n10 , single-leg ). Everything is internal to one paper - no external evidence, companion repo not cloned.

Read the full note →

S17 established that an LLM reading untrusted content cannot distinguish data from instructions, and that no filter fixes it. CaMeL's answer is to stop trying to make the model safe and instead build a system in which an unsafe model cannot cause an unsafe action (n1). A Privileged LLM sees only the trusted user query and writes a program; a Quarantined LLM parses untrusted data, holds no tools, and can return only schema-conforming values (n3, n4). A custom interpreter runs that program, tags every value with its provenance and permitted readers, and checks a Python security policy at every tool call (n5, n6, n7). Untrusted data therefore never reaches control flow, and the actions it can influence are bounded by policy rather than by the model's judgement. It solves 77% of AgentDojo tasks against an undefended 84%, cutting successful attacks from roughly 100 to 0-1, for 2.82x input tokens (n9, n10, n12). Two things to hold onto: the benchmark is the authors' own (d1), and the paper spends its last five pages showing where its own design breaks (n15, n16, n18).

flowchart TB
    A["<b>the abandoned goal</b><br/>make the model able to tell<br/>data from instructions"]
    B["<b>the replacement goal</b><br/>build a system in which an unsafe model<br/>cannot cause an unsafe action - n1"]
    C["untrusted data never reaches<br/>control flow"]
    D["and the actions it can influence are<br/>bounded by <b>policy</b> rather than<br/>by the model's judgement"]
    E["77% of tasks against an undefended 84%,<br/>attacks from ~100 down to 0-1,<br/>for 2.82x input tokens - n9, n10, n12"]

    A -.->|"give up on this"| B --> C --> D --> E

    style A fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    style B fill:#dcfce7,stroke:#15803d,color:#14532d

This is a goal-substitution diagram, not an architecture diagram, and the dashed edge is the entire contribution. The crux is that CaMeL concedes the problem S17 established rather than attacking it, and then makes the concession harmless by moving the security boundary out of the model entirely. It is drawn as one abandoned goal feeding a replacement because the design only makes sense once you accept that the first box is unachievable; a reader still hoping for a better classifier will read the architecture as overkill. The bottom box is deliberately a single node holding both the benefit and the price, since quoting either without the other misrepresents the trade.

Synthesized from n1, n9, n10 and n12.

Key claims
  • Secure the system, not the model. The security argument holds "even when underlying models are susceptible to attacks", which is the first defence in this brain that does not depend on the model behaving (n1).
  • Dual LLM protects control flow and leaves data flow exposed - an injection can change tool arguments without changing the plan, which is SQL injection against the parameters (n2, fig2_dataflow_diverted.png). The problem statement worth carrying.
  • The Privileged LLM never sees tool output. Values live in variables and the planner manipulates the variable, never its content (n3, fig5_architecture.png).
  • The Quarantined LLM has no free-text channel back to the planner - structured output plus one boolean, because a natural-language reply would be a re-injection vector (n4).
  • Capabilities tag every value with provenance and permitted readers, and are checked at tool-call time, so authority travels with the data rather than with the caller (n5, n7).
  • Security policies are arbitrary Python, deliberately not a DSL, so the expressiveness ceiling is the language rather than the policy author's vocabulary (n6).
  • 77% of AgentDojo tasks with security against 84% undefended, with successful attacks falling from roughly 100 to 0-1 (n9, n10, fig9_security_results.png). needs-check - authors' own benchmark (d1).
  • The cost is 2.82x input and 2.73x output tokens for the median task, the highest of the defences compared, against Spotlighting's 1.06x (n12, fig13_token_overhead.png).
  • It explicitly cannot defend attacks with no data-flow consequence - a falsified summary, or injection-induced phishing text shown to the user (n14).
  • The authors demonstrate an attack that turns data flow back into control flow, potentially yielding arbitrary code execution, and predict a return-oriented-programming analogue against their own design (n15, n16, fig12_dataflow_becomes_controlflow.png).
agent-securityagentscontext-engineering

When to read: When you are designing defences rather than cataloguing attacks, and before adopting any prompt-injection mitigation - its cost comparison (2.82x tokens against Spotlighting's 1.06x) is the honest framing of the choice between probabilistic-and-nearly-free and structural-and-expensive. Read S17 first; this is the answer to it. Read §2 and §9 of the note if nothing else. ⚠️ T3 preprint, and its efficacy numbers are measured on AgentDojo - whose first author is CaMeL's first author, with Tramer co-authoring both, and whose baseline defences CaMeL's authors implemented ( d1 , d3 ). Self-report, not validation: claim 153 is needs-check while the design claims are not. Note the vendor position too - the thesis that scaffolding beats model-hardening favours a platform provider. And read claim 155 before assuming it covers your threat model: it protects actions , not assertions , so fraud and manipulated content are explicit non-goals. Unusually honest - it demonstrates a bypass of its own isolation (§6.4), predicts a return-oriented-programming analogue, and titles §9.3 "So, Are Prompt Injections Solved Now?" answering "No".

Read the full note →

Stanford's CS329A opens by arguing that a model can be made to improve itself, and the mechanism is plainer than the name suggests. Sample the model many times instead of once, keep the answers that survive a check, and feed those answers back as training data (n5). The interesting part is not that this works but where it stops working. Every turn of the loop needs something that can tell a good answer from a bad one, and that something is scarce outside math, code and other rule-based domains, which is why the lecture calls verification the field's bottleneck (n6). Read this as a map of a research area rather than as a result, because the source is lecture 1 of a course and its headline chart measures something weaker than its title claims (d1). The most useful thing it leaves you with is a question to ask of any self-improving system: what checks the output, and who wrote the checker?

flowchart TB
    S["sample the model many times<br/>instead of once"]
    K["keep the answers that<br/><b>survive a check</b>"]
    F["feed those back as<br/>training data - n5"]
    L["the loop turns"]
    Q{"but every turn needs something that can<br/>tell a good answer from a bad one"}
    V["and that is scarce outside math, code<br/>and other rule-based domains - n6"]
    A["so the question to ask of any<br/>self-improving system is:<br/><b>what checks the output,<br/>and who wrote the checker?</b>"]

    S --> K --> F --> L --> Q --> V --> A

    style Q fill:#e8f0fc,stroke:#4285f4,color:#1a3a6b
    style A fill:#dcfce7,stroke:#15803d,color:#14532d

This is a bottleneck diagram, not a method diagram, and the interesting part is where the chain stops rather than how it turns. The crux is that self-improvement is mechanically simple and gated entirely on verification, so the loop's reach is set by the domain rather than by the model. It is drawn as a cycle that runs into a question because the mechanism genuinely does work and the constraint genuinely does bind; drawing either alone would misrepresent the lecture. The terminal box is what to carry away, and it is a question rather than a finding because this is lecture 1 of a course and a map of a research area rather than a result.

Synthesized from n5 and n6.

Key claims
  • Sampling and selecting are two separately hard problems with names. Coverage asks whether a correct solution can be generated at all; precision asks whether it can be identified among the candidates. Verifiers named on the slide are unit tests, proof checkers and majority voting (n4).
  • Repeated sampling lets a small model clear a much larger model's single attempt on four reasoning benchmarks, on some of them after roughly ten samples (n2).
  • That headline measures coverage rather than delivered accuracy, and two of its four panels resolve selection with an oracle verifier (n3, d1). The narration concedes the point; the slide title does not.
  • Self-improvement is loop closure, not a technique. Verified test-time output becomes fine-tuning data, and the improved model samples better next round - drawn as an arrow from test-time back into fine-tuning (n5).
  • Test-time compute is a third scaling axis alongside data and parameters, raising pass@1 log-linearly without changing a single weight (n1).
  • Verification, not generation, is the bottleneck, and it is domain-shaped. o1's win rate against GPT-4o runs from below 50% on personal writing to about 72% on mathematical calculation, tracking how mechanisable the check is (n6). The causal reading is this brain's; the source states the two halves separately.
  • Models reportedly prefer their own reasoning traces over better traces from a stronger model (n9, single-leg, uncited by the source, and no magnitude given).
  • The verifier is increasingly written by the system it judges - agents generating the tests they must pass (n13, single-leg). Presented approvingly, and never interrogated.
  • What ships today is mostly a hand-drawn static graph, not the open-ended loop the agent definition promises, because drawing the graph is currently easier for open-ended problems (n7).
  • The field says openly that it cannot explain the loop's gains, with no consensus on whether RL or diverse pre-training data does the work (n12).
self-improvementevalsagentsautonomous-research-loops

When to read: Before building anything that improves on its own output, in any domain - the coverage/precision split and the verifier-sets-the-ceiling claim are the transferable parts. Read §5 and §6 of the note if nothing else. Also the cheapest available correction to "test-time scaling makes small models beat big ones". ⚠️ Lecture 1 of a course, so a map rather than a result - it defers nearly every mechanism to a later session. Independence fails twice over on its two strongest slides : the repeated-sampling chart is the presenter's own preprint (T3) and the o1 charts are vendor promotional material (T2) with unlabelled axes. Its headline slide materially overstates its own chart ( d1 ) - it plots coverage , not accuracy, and half its panels assume an oracle. The lecturers' own admission that "that whole loop is not completely well understood" is the most trustworthy thing in it.

Read the full note →

You can buy accuracy at inference time instead of at training time, by sampling a model many times instead of once, and the returns are lawful enough to budget against - coverage follows c = exp(a·k^b) in the number of samples k, across models from 70M to 70B parameters (n3). The lecture then spends its best twenty minutes demolishing the naive reading of that result. Sampling gets you a set containing a right answer; it does not get you the right answer, and every practical way of picking one out plateaus after roughly ten to fifty samples while the set keeps improving (n10). That distance is the generation-verification gap, and it decides where this whole technique is worth anything. The most useful idea here is the reframe at the end: stop trying to select the best candidate and start synthesizing one from all of them, which beats even a perfect oracle selector (n25).

flowchart TB
    S["sample the model k times<br/>instead of once"]
    C["<b>coverage</b> climbs lawfully:<br/>c = exp(a·k^b), from 70M<br/>to 70B parameters - n3"]
    G["but coverage is a property of the <b>set</b>.<br/>You still have to pick one answer."]
    P["and every practical selector plateaus<br/>after roughly 10-50 samples while<br/>the set keeps improving - n10"]
    D["<b>the generation-verification gap</b>,<br/>which decides where any of<br/>this is worth paying for"]
    F["so stop <b>selecting</b> a candidate<br/>and start <b>synthesizing</b> one -<br/>which beats a perfect oracle - n25"]

    S --> C --> G --> P --> D --> F

    style C fill:#dcfce7,stroke:#15803d,color:#14532d
    style P fill:#e8f0fc,stroke:#4285f4,color:#1a3a6b
    style F fill:#dcfce7,stroke:#15803d,color:#14532d

This is a limits diagram, not a technique diagram, and the middle of the chain is where the lecture spends its best twenty minutes. The crux is that sampling buys a set containing a right answer and never buys the right answer, so the headline scaling law and the practical ceiling are measuring two different things. It is drawn as one descent because the argument is a single walk from an attractive result to the constraint that governs it and then out the other side; branching would suggest the gap is one consideration among several rather than the thing that decides whether the technique pays. The last box is the reframe worth taking away, and it is the only move here that gets past the plateau rather than optimising within it.

Synthesized from n3, n10 and n25.

Key claims
  • Coverage against sample count follows an exponentiated power law, c = exp(a·k^b), holding from 70M to 70B parameters - which makes inference spend predictable in advance rather than a gamble. n3, n4, visuals/frame_400.jpg @ t=314s
  • That law exists only because benchmarks contain a long tail of very hard problems, and this is necessary as well as sufficient. Per-problem success is exponential in k; the power law is an artifact of averaging over a heavy-tailed difficulty distribution. n5, visuals/frame_590.jpg @ t=558s
  • The generation-verification gap is the binding constraint. Practical selectors plateau after 10-50 samples while coverage keeps rising, and the gap widens with difficulty (~0.87 against 1.0 on GSM8K; ~0.40 against ~0.95 on MATH). n10, n11, visuals/frame_1000.jpg @ t=1005s
  • Frequency-based selection is structurally blind to the cases that matter, because on the hardest problems the correct answer appears 1-3 times in 1,000-10,000 samples. n12 @ t=1101s
  • Verification availability, not model capability, decides where the technique pays. n8 @ t=763s
  • Synthesis beats selection: fusing all candidates into one answer outperforms picking the best candidate with a perfect oracle. Authors' own result, single benchmark, needs-check. n25, visuals/frame_3100.jpg @ t=3172s
  • Test-time compute does not dominate pre-training, and the boundary has two dimensions - difficulty and the inference-to-pre-training token ratio, with gains running from +27.8% to -37.2%. n20, visuals/frame_2310.jpg @ t=2286s
self-improvementevalsinferencingagents

When to read: When you are deciding whether to spend money on sampling rather than on a bigger model, and before quoting anyone's repeated-sampling result at all . The reading rule it teaches by accident is the durable part: check whether a chart plots coverage or pass@1 before believing a comparison drawn on it. Read §6 and §7 of the note if nothing else. ⚠️ Not independent of S14 - same course, same lecturers, so it supplies mechanism and cannot raise anyone's confidence; no topic status moved. The presenter is senior author of 3 of the 4 papers taught , so every efficacy number is self-report, and the two most reusable findings (fusion-beats-oracle, the cheap exponent method) are the two gated weakest. The gate caught the source overstating its own headline three times and then refuting itself sixteen minutes later ( d1 against n10 ) - which, with n31 , is what turned that pattern into claim 132 rather than a complaint.

Read the full note →

The moment an LLM reads content it did not author, the content and the instructions arrive through the same channel, and the model has no mechanism for telling them apart. This paper names the consequence: processing retrieved data is analogous to executing arbitrary code (n1). An attacker therefore does not need an account, a session, or any interface to your system. They need only to place text somewhere your agent is likely to read - a web page, an email, a package's documentation - and the retrieval step does the rest (n2). The authors demonstrate six threat classes on real deployed products, including Bing Chat on GPT-4 and GitHub Copilot (n3, n4), and the demonstrations that should worry an engineer most are the ones borrowed from classical malware: a prompt that forwards itself to your contacts (n5), one that writes itself into the agent's long-term memory and re-poisons a later session (n6), and one that fetches fresh instructions from the attacker's server on every request (n7). Read it for the taxonomy and the framing, and read d1 first: this paper proves feasibility on named systems and reports no success rate for anything.

flowchart TB
    R["the model reads content<br/>it did not author"]
    C["content and instructions arrive<br/>through the <b>same channel</b>"]
    E["<b>processing retrieved data is analogous<br/>to executing arbitrary code</b> - n1"]
    A["so the attacker needs no account,<br/>no session and no interface"]
    P["only text somewhere your agent<br/>is likely to read - n2"]

    R --> C --> E --> A --> P

    style E fill:#f8b4b4,stroke:#c1121f,color:#7f1d1d
    style P fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d

This is a consequence diagram, not an attack tree, and the whole paper is the middle box unpacked. The crux is that retrieval is not a data operation but an execution one, which relocates the security question from who can talk to your system to what your system is willing to read. It is drawn as a single descent because nothing branches: each step follows from the one above with no design choice available, which is why the paper's framing survived even as the specific products it tested changed. The terminal box is the practical consequence and the reason the threat model in section 2 pointed the wrong way for years.

Synthesized from n1 and n2.

Key claims
  • Processing untrusted retrieved data is analogous to executing arbitrary code, because retrieval places data and instructions in one undifferentiated channel (n1). The sentence the rest of the field is built on.
  • The attacker needs no interface to the target - only the ability to place text where the agent will read it, which removes every control premised on identifying a malicious requester (n2, fig3_attack_flow.png).
  • The threat taxonomy transfers wholesale from classical security: information gathering, fraud, intrusion, malware, manipulated content and availability, delivered passively, actively, through the user, or hidden (n3, fig2_taxonomy.png).
  • Demonstrated on real deployed products, not only synthetic mock-ups - Bing Chat running GPT-4, and GitHub Copilot (n4).
  • Prompts behave as worms. An LLM email client reads a poisoned message, reads the address book and forwards the injection onward with no further attacker action (n5, fig6_worm.png).
  • Compromise persists across sessions through the agent's own memory. The compromised model writes the injection into long-term storage, and a fresh session reading its own notes is re-poisoned (n6, fig8_persistence.png). This is S16's finding reached from the opposite direction, by an unrelated team a year earlier.
  • The attacker states the goal and the model supplies the method, generating social-engineering techniques that were never specified (n10), then issuing follow-up API calls that retrieve support for the injected claim (n11).
  • Bing Chat filtered the chat channel and not the retrieval channel (n12). The single most actionable defensive observation here, and it independently confirms a bound this brain had recorded as its own commentary against S12's edge filtering (claim 103).
  • No mitigation the authors consider survives their own analysis, and they say so plainly: "it is currently hard to imagine a foolproof solution" (n14, single-leg).
agent-securitymemoryagents

When to read: Before building anything that reads content it did not author, which is every agent with retrieval or tools. Read §3 and §8 of the note if nothing else. Pair it with S16: the two corroborate on agent memory as a persistence surface from opposite directions , which is what ADR-0019 rests on. ⚠️ T3 preprint (no journal reference on the arXiv listing at ingest). Independence is unusually strong - six authors, three institutions, no vendor, responsible disclosure to OpenAI and Microsoft, no author overlap with S16. But it is entirely qualitative: no success rate, no sample size, no statistics for any of six threat classes ( d1 ), and the most striking results run against a black-box product the authors concede they cannot reproduce ( d2 ). Its mitigations survey is three years old and is its weakest material - read it as "no solution existed in early 2023 and here is why each obvious one is hard", never as a current statement.

Read the full note →

Four sources into this brain's security material, every efficacy number has come from whoever was making the claim. AgentDojo is the field's reference benchmark and the first thing here built to settle such arguments rather than to win one. It runs a user task and an attacker task in the same stateful tool-calling environment and scores them separately - 97 user tasks, 629 security test cases, 70 tools, four applications (n1, n2). Its most transferable design decision is that utility is checked by deterministic functions rather than an LLM judge, for an adversarial reason: an attack strong enough to hijack the agent might also hijack the evaluator (n3). Three findings matter. Agents fail more than a third of these tasks with no attacker present at all (n4); more capable models are easier to attack, because weak models fail at the attacker's goal too (n6); and attack success is a property of the application, not the model - 92% on Slack, 0% on some Travel tasks (n8). On defences, the simplest isolation mechanism wins: a tool filter drops attack success to 7.5%, and its failure mode is stated exactly - it breaks when the task's own tools suffice for the attack, 17% of cases (n12, n13). Read d1 first: this shares two authors with S18, so it cannot validate CaMeL.

flowchart TB
    P["four sources in, and every efficacy<br/>number came from whoever<br/>was making the claim"]
    B["a benchmark built to <b>settle</b> such<br/>arguments rather than to win one"]
    D["utility checked by <b>deterministic functions</b>,<br/>never an LLM judge - because an attack<br/>strong enough to hijack the agent<br/>might hijack the evaluator too - n3"]
    F1["agents fail a third of these tasks<br/>with <b>no attacker present</b> - n4"]
    F2["more capable models are <b>easier</b><br/>to attack - n6"]
    F3["attack success is a property of the<br/><b>application</b>, not the model:<br/>92% on Slack, 0% on some Travel - n8"]

    P --> B --> D
    B --> F1
    B --> F2
    B --> F3

    style D fill:#dcfce7,stroke:#15803d,color:#14532d

This is a provenance diagram, not a benchmark description, and the top box is why this source matters more than its numbers do. The crux is that the design decision and the findings both follow from taking adversarial conditions seriously: the evaluator is deterministic because a judge is attackable, and the three findings are all things a vendor benchmarking its own product would have no reason to surface. It is drawn with the green node separated from the findings because that decision is the transferable part - it generalises to any adversarial evaluation, whether or not you ever run this benchmark. Read d1 first: this shares two authors with S18, so it cannot validate CaMeL.

Synthesized from n1, n3, n4, n6 and n8.

Key claims
  • Utility must be scored deterministically in an adversarial benchmark, because a model-based judge can be hijacked by the same attack it is measuring (n3). The most transferable design decision in the source.
  • Agents fail more than a third of realistic multi-step tool tasks with no adversary present (n4).
  • Inverse scaling: more capable models are easier to attack, because weak models fail at the attacker's goal too (n6, fig6_inverse_scaling.png). Independently corroborates S17's claim 147.
  • Attack degrades ordinary work as well as enabling malicious work - most models lose 10-25% absolute utility under attack, a denial-of-service effect independent of attacker success (n7).
  • Attack success is a property of the application, not the model - 92% on Slack against 0% on some Travel tasks, driven by how much of the tool output the attacker controls (n8, n9, fig7_asr_by_suite.png).
  • The simplest isolation defence wins: a tool filter drops targeted attack success to 7.5% by restricting the agent's toolset before it observes untrusted data (n12, fig9_defenses.png).
  • Its failure mode is structural and quantified: it breaks when the task's own tools suffice for the attack, in 17% of cases (n13). The bound worth carrying.
  • Some defences increase benign utility, apparently by re-emphasising the original instructions, so security and utility are not uniformly in tension (n14).
  • Every defence still loses 15-20% of utility under attack (n15), and the detector that reaches the lowest attack rate does so at roughly a thirty-point utility cost (n16, d2).
  • Attacker knowledge helps marginally and guessing wrong hurts badly - correct user and model names add 1.9 points, a wrong user name costs 22.6 (n10).
agent-securityevalsagents

When to read: When you need to measure rather than argue, and before adopting any injection defence. Read §3 and §8 of the note if nothing else - §3 is the deterministic-judge argument, which transfers to any adversarial evaluation you build, and §8 is the 17% : the tool filter fails when the task's own tools also suffice for the attack, which is the structural bound on every isolation defence here, CaMeL's policies included. Also the closest available thing to a verifier for the security half of a self-improving agent. ⚠️ Shares two authors with S18 (Debenedetti first-authors both, Tramèr co-authors both), so it CANNOT validate CaMeL ( d1 ) - that open question stays open, and its corroborating weight lies against S16, S17 and S19 instead. The 8% detector figure travels while its utility cost does not ( d2 ); the averaged "under 25% attack success" conceals that the variation is by application ( d3 ). Models are two generations old, dating the leaderboard and not the framework - and inverse scaling predicts the staleness runs the alarming way. Repo not cloned.

Read the full note →

Schmidhuber's Gödel machine rewrites its own code only when it can prove the change beneficial, which is why nobody has built one. The DGM's move is to swap the proof for empirical evidence on a benchmark (n1), and then to handle everything that follows from being able to be wrong. It improves its own codebase - self-improvement is the coding task it is measured on (n2) - and keeps every agent it has ever produced in an archive, selecting parents by score and by how little explored they are (n3, n4). Over 80 iterations that takes SWE-bench from 20.0% to 50.0% and Polyglot from 14.2% to 30.7% (n7), and two ablations show both components are load-bearing: freeze the meta-agent and progress plateaus, keep only the latest agent and it plateaus lower (n8). What it discovers is unglamorous - better file editing, patch ranking, retry on empty patches (n10) - and it transfers to held-out models, benchmarks and languages (n11). The section to read for your build is §5: the builders state that if your benchmark does not capture every property you care about, the loop amplifies whatever it does not measure (n12). That is S19's V-S5, said by the people running the loop.

flowchart TB
    G["Schmidhuber's machine rewrites its own code<br/>only when it can <b>prove</b> the change good"]
    W["which is why nobody built one"]
    S["swap the proof for <b>empirical evidence</b><br/>on a benchmark - n1"]
    C["and then handle everything that follows<br/>from being able to be <b>wrong</b>"]
    A["an <b>archive</b> of every agent ever produced,<br/>parents chosen by score <i>and</i> by how<br/>little explored they are - n3, n4"]
    R["20.0% -> 50.0% on SWE-bench<br/>over 80 iterations - n7"]

    G --> W --> S --> C --> A --> R

    style S fill:#dcfce7,stroke:#15803d,color:#14532d
    style C fill:#e8f0fc,stroke:#4285f4,color:#1a3a6b

This is a substitution diagram, not an architecture diagram, and the box after the swap is where the real work is. The crux is that replacing proof with evidence is one line of design and produces a system that can be wrong, so every subsequent choice - the archive, the exploration term, the frozen components - exists to survive being wrong rather than to improve anything. It is drawn as a single descent because the paper reads that way: one substitution, then its consequences, then the numbers. The result is unglamorous by design, and section 9 carries the builders' own warning about what the loop does to whatever the benchmark fails to measure.

Synthesized from n1, n3, n4 and n7.

Key claims
  • Replace the proof with evidence, and the idea becomes buildable - the Gödel machine's demand for provable improvement is what kept it theoretical (n1).
  • Self-improvement is framed as a coding task on the agent's own repository, so benchmark progress and self-improvement capability are the same measurement (n2).
  • An archive beats a lineage, and it is ablation-confirmed. Keeping only the latest agent plateaus lowest; freezing the meta-agent plateaus in the middle; the full DGM outperforms both (n8, fig2_results_ablations.png).
  • Parent selection weights performance and under-exploration, with every agent retaining non-zero probability (n4), which is what lets the search recover from its own dips at iterations 4 and 56 (n9).
  • The viability gate: only agents that compile and can still edit a codebase enter the archive (n5). And the meta-level is frozen - the DGM cannot modify its own archive maintenance or parent selection (n6).
  • SWE-bench 20.0% to 50.0%, Polyglot 14.2% to 30.7%, over 80 iterations (n7).
  • What it discovers is tooling, not cleverness - granular file editing, patch ranking, history-aware generation, retry on empty patches (n10, fig3_archive_tree.png).
  • The gains are not benchmark overfitting: they transfer to held-out models (Claude 3.7 Sonnet 19.0% to 59.5%), to a held-out benchmark, and to unseen programming languages (n11, fig4_transfer.png).
  • The builders state the amplification hazard themselves: if the benchmark does not capture every property you care about, "the self-improvement loop could amplify misalignment over successive generations" (n12). This is S19's V-S5 from the builders' side.
  • Every safeguard is containment, not correctness - sandbox, time limit, scoped modifiable surface, traceable lineage (n13) - and they name an unmodifiable supervisor as future work (n15).
self-improvementautonomous-research-loopsagent-security

When to read: Before building anything that optimises itself unattended. Read §5 and §9 of the note if nothing else. §5 is the constructive payload - what must not be modifiable: a viability gate (only agents that compile and can still edit code are archived, a liveness invariant kept separate from the performance metric) and a frozen meta-level , because a system that can rewrite its own selection criteria can rewrite them to prefer itself. §9 is where this meets the security track : the builders state that if the benchmark misses a property, "the self-improvement loop could amplify misalignment over successive generations" - which is S19's V-S5 from the builders' side , and completes a three-way convergence with S13's observed random-seed result (claim 177). ⚠️ Scope, not soundness, is the caveat : the model never changes , only the scaffolding around it ( d3 ); the evaluation is staged on a heuristic noise threshold ( d1 ); and "open-ended" is bounded by a fixed search procedure ( d4 ). Mild commercial position (Sakana AI). Code is open-sourced and was not cloned - the cheapest un-taken second leg of the five ingested.

Read the full note →

Prompt injection needs its payload present every time it fires. Memory poisoning needs one successful write. This paper is the first systematic account of how that write happens: four channels through which content reaches an agent's long-term memory, of which three are decided by the model's own judgement rather than by any command (n2), and nine structural vulnerabilities that make them exploitable (n3). The finding that matters is about detectability. A prompt injection carries an explicit override, so its intent is usually recoverable from raw text; a memory-poisoning payload can be stored because it looks like a valid fact, policy or past experience (n1). Against that, four production prompt-injection detectors give incomplete coverage, none achieves both high recall and low false positives, and retraining on memory-poisoning data made the strongest one slightly worse (n10, n11). The result a builder should not skip is V-S5: in an agent with autonomous skill refinement, a poisoned skill is not static - the loop treats every error-free execution as validation and optimises the adversarial procedure over time (n4). Read d1 first: the benchmark hands the payload to the agent rather than routing it through a real tool call.

flowchart TB
    PI["<b>prompt injection</b><br/>payload must be present<br/>every time it fires"]
    MP["<b>memory poisoning</b><br/>one successful write - n1"]
    D["and the payload is stored because<br/>it <i>looks like</i> a valid fact,<br/>policy or past experience"]
    E["so there is no explicit override<br/>to recover from the text"]
    F["four production detectors give incomplete<br/>coverage, and retraining on memory-poisoning<br/>data made the strongest one <b>worse</b> - n10, n11"]

    PI -.->|"the shift"| MP --> D --> E --> F

    style MP fill:#f8b4b4,stroke:#c1121f,color:#7f1d1d
    style F fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d

This is a threat-model diagram, not an architecture diagram, and the dashed edge is where the whole paper lives. The crux is that the property making memory poisoning cheap is the same property that makes it undetectable: a payload accepted because it resembles legitimate content leaves nothing for a text classifier to find. It is drawn as one shift cascading rather than as a comparison table because the detection result at the bottom is not a separate finding, it is a consequence of the definition at the top. The red terminal is the part a builder should not read past: retraining the best available defence on exactly this attack class made it slightly worse.

Synthesized from n1, n2, n10 and n11.

Key claims
  • Memory poisoning is not a variant of prompt injection, and the difference is detectability. The payload can be stored because it looks like a valid fact, policy or experience, rather than because it carries a write command (n1).
  • Three of the four memory write channels are inferred - the model decides what is worth keeping, from incidental content, a compaction threshold, or the shape of a finished task (n2, tab1_vuln_channel_map.png).
  • Nine structural vulnerabilities across model, prompt and system layers, mapped to the channels each one opens (n3).
  • V-S5, self-improvement as amplification: a poisoned skill in a self-refining agent gets optimised. Every error-free execution is treated as validation and later revisions build around the adversarial step. The paper states it has no equivalent in static memory systems (n4).
  • Attacks split by signal strength, and weak-signal payloads carry no anomaly at all (n5).
  • Persistence is real: retrieval success is above zero for every attack class on both agents, up to 86.33% (n8, tab2_asr_rsr.png).
  • The capability-security tension, measured: agents that write and retrieve memory more aggressively are proportionally easier to poison (n9).
  • Existing injection detectors give incomplete coverage, and retraining does not fix it - the strongest fell from 67.67% to 61.60% recall after adaptation, which the authors read as structural (n10, n11, tab3_defense_tpr_fpr.png).
  • Detection collapses precisely where it is needed: every detector scores far worse on weak-signal attacks, the largest gap being 41.94 points (n12, tab4_signal_strength_gap.png).
  • Defence has to move from the input boundary to the write path (n13), and the architecture direction the paper proposes - write-path provenance tracking - is S18's principle aimed at a surface S18 does not cover (n14).
agent-securitymemoryskills

When to read: Before designing any agent memory, and before trusting an injection guardrail to cover it . Read §4 and §8 of the note if nothing else. §8 is the one a builder of a self-improving agent must not skip : V-S5 says a poisoned skill is not static, because the refinement loop treats "executed without error" as validation and optimises the adversarial procedure over time - which is claim 114 with an adversary choosing the noise. ⚠️ T3 with workshop review. Its benchmark hands the payload to the agent as a labelled block beside the user query rather than routing it through a real tool call ( d1 , disclosed by the authors), so the numbers measure how permissive an agent's write and retrieval policies are, not how easily an attacker reaches them. One model throughout ( d2 ), four of five authors Huawei Canada (mild vendor position), and the most consequential claim (V-S5) has no measurement behind it . Note also the scope correction in d3 : four detectors were tested and no structural defence was, so this does not refute S18.

Read the full note →

This is the defence most teams actually ship, and it costs almost nothing - S18 measures it at 1.06x input tokens against CaMeL's 2.82x. Spotlighting transforms untrusted input so its provenance is continuously visible to the model, then tells the model about the transformation (n2). Three variants, and the ordering matters: delimiting halves attack success and the authors recommend against it because an adversary who learns your system prompt writes their own delimiters (n4); datamarking - interleaving a marker token throughout the text - drops attack success from ~50% to 3.1%, and costs nothing measurable on the underlying task (n5, n6); encoding gives the best number and only works on high-capacity models, wrecking accuracy on weaker ones (n7). Two things make this worth reading beyond the recipe. The adversary section is genuinely good - assume the system prompt has leaked, therefore randomise the marker (n9) - and the discussion contains the best cross-domain framing in this brain's security set (n12). Read d3 first: every experiment is document summarization or Q&A, with no agent and no tools.

flowchart TB
    P["make the <b>provenance</b> of untrusted input<br/>continuously visible to the model,<br/>then tell the model about it - n2"]
    D["<b>delimiting</b><br/>halves attack success -<br/>and the authors recommend <b>against</b> it - n4"]
    M["<b>datamarking</b><br/>~50% -> <b>3.1%</b>, and costs nothing<br/>measurable on the task - n5, n6"]
    E["<b>encoding</b><br/>best number, and wrecks accuracy<br/>on weaker models - n7"]
    C["1.06x input tokens,<br/>against CaMeL's 2.82x"]

    P --> D
    P --> M
    P --> E
    M --> C

    style D fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    style M fill:#dcfce7,stroke:#15803d,color:#14532d

This is a pricing diagram, not a technique diagram, and the ordering of the three variants is the content. The crux is that the cheapest defence in this brain has a variant its own authors tell you not to use and a variant that is nearly free, and telling them apart is the entire value of reading the paper rather than the abstract. It is drawn with all three hanging off one idea because they are the same transformation at different strengths, and with the cost attached only to datamarking because that is the one worth deploying. Read d3 first: every experiment is document summarization or Q&A, with no agent and no tools.

Synthesized from n2, n4, n5, n6 and n7.

Key claims
  • The LLM cannot distinguish code from data, restated independently of S17 by a different team (n1).
  • Telling the model to ignore injected instructions barely works - roughly 60% to 58% attack success (n3, fig3_delimiters.png). The measured failure of the thing everyone tries first.
  • Delimiting halves attack success and its own authors recommend against it, because an adversary with the system prompt writes the delimiters themselves (n4).
  • Datamarking drops attack success from ~50% to 3.1% (GPT-3.5-Turbo) and to 0.00% (Text-003) in summarization (n5, fig4_datamarking.png).
  • And it costs nothing measurable on the underlying task across four benchmarks (n6, fig7_datamarking_no_task_cost.png). The finding that makes it deployable.
  • Encoding gives the lowest attack rates and requires a frontier model - GPT-4 unaffected, GPT-3.5-Turbo's accuracy collapsing (n7, fig8_encoding_task_cost.png).
  • Design against an adversary who has your system prompt: randomise the marker token and its positions, giving a 1/N^k guess (n9). A reversible encoding is exploitable - with ROT13 the attacker writes text whose ROT13 image is the attack (n10).
  • The authors cannot explain why spotlighting works (n11), which is exactly what makes a security guarantee impossible.
  • The telecom analogy: spotlighting is in-band signalling, and the real answer is out-of-band (n12). In-band multi-frequency stopped accidental interference and was defeated intentionally by phone phreaking; the fix was a separate channel. LLMs are worse off than early telephony, and the authors call the out-of-band analogue infeasible with current architectures - a year before S18 built one at the program level.
agent-securitycontext-engineering

When to read: When pricing defences - this is the cost anchor at 1.06x input tokens against CaMeL's 2.82x - and when you want the framing that sorts every defence you hold. Read §7 and §8 of the note if nothing else. §7 is the payload : spotlighting is in-band signalling , and the authors explain their own ceiling through phone phreaking - in-band multi-frequency stopped accidental interference and was defeated intentionally , the fix being a separate channel. They name an out-of-band analogue as what is actually needed and call it infeasible in current architectures - and S18 met that requirement one level up, in a program, a year later . ⚠️ The weakest source in the security set evidentially : a vendor preprint with no venue, no code, no dataset , from the company whose product S17 found filtering the wrong channel. The headline " 50% to below 2%" is a best-case composite ( d2 ), the authors cannot explain why it works ( n11 ), and every experiment is non-agentic ( d3 ) - the only variant since tested against a real agent is the one they disown.

Read the full note →

The MCP 2026-07-28 specification deletes the initialize handshake and the Mcp-Session-Id header, so any server instance can serve any request and a plain round-robin load balancer becomes sufficient (n3). The change is real and the mechanism is clean, and you can watch it happen field by field by diffing the article's two payloads. What the article calls statelessness is better understood as state relocation, because the same state turns up in three new homes: on the wire in a _meta block sent with every request, in the client as a serialized requestState blob, and in your own application as a task store the article's headline says you no longer need (n10, d2). Each relocation has a bill, and the article prices none of them. The one that matters most is the second, because decoding the article's own example shows server execution state travelling through the client as unsigned plaintext while it guards a file deletion (n8, d1).

flowchart TB
    B["before: one state owner<br/>server memory, keyed by Mcp-Session-Id"]
    H["delete the handshake - n3"]
    W["<b>to the wire</b><br/>a _meta block on every<br/>request, forever"]
    C["<b>to the client</b><br/>requestState, unsigned plaintext<br/>in the article's own example - n8"]
    A["<b>to your application</b><br/>a task store, which is Redis, four sections<br/>after the headline says you do not<br/>need Redis - n9, d2"]
    S["State is conserved.<br/>Three new owners, three bills,<br/>and the article prices none of them - n10"]

    B --> H
    H --> W --> S
    H --> C --> S
    H --> A --> S

    classDef cost fill:#fce8e6,stroke:#ea4335,color:#7f1d1d
    class C,A,S cost
    style H fill:#e8f0fe,stroke:#4285f4,color:#1a3a6b

This is a conservation diagram, not an architecture diagram, and the claim it makes is arithmetic rather than architectural. The crux is that what the article calls statelessness is state relocation, so the correct question is never whether the state is gone but who is holding it now and what they pay. It is drawn as one owner fanning into three because the announcement presents a deletion and the deletion is real, while the three destinations appear scattered across the article with nothing adding them up. The middle branch is the one to act on: server execution state travelling through the client as unsigned plaintext, while it guards a file deletion. Synthesized from n3, n8, n9, n10 and divergences d1 and d2; the conservation framing is this brain's.

Key claims
  • Deleting the handshake is what makes ordinary infrastructure sufficient. initialize/initialized and Mcp-Session-Id are removed, and the three fields they carried now travel in _meta on every request (n3, corroborated by diffing the two payloads). Round-robin routing, scale-to-zero serverless deployment and invisible pod restarts are consequences of that one change, not separate features.
  • Promoting routing metadata to HTTP headers is what lets intermediaries participate. Mcp-Protocol-Version, Mcp-Method and Mcp-Name, mirrored to the body with a -32020 mismatch rejection, remove the need for deep packet inspection at the gateway (n4, n5). The latency benefit is asserted and unmeasured.
  • Statelessness is relocation, not elimination. State moved to the wire, to the client and to the application, and the article concedes the general form while its own headline denies the third instance (n10, d2). This framing is this brain's, not the article's.
  • Client-held server state is a trust surface, and this article never treats it as one. The requestState in the source's own example decodes to unsigned plaintext JSON and accompanies a delete confirmation (n8). Whether the spec requires integrity protection is unknown from this source and is the top research target (d1).
  • This is the brain's first spec-level answer on MCP authorization, and it is one clause per RFC. Issuer verification (RFC 9207) against redirect and session-hijacking attacks, resource indicators (RFC 8707) against the confused deputy (n11, single-leg). It names no token format, no exchange and no flow.
  • MCP now has a deprecation policy with a 12-month minimum window, and Roots, Sampling and Logging entered it immediately, with sampling replaced by calling LLM provider APIs directly (n13, single-leg).
mcpagent-securityagents

When to read: Before deploying any remote MCP server, and before quoting anyone's "MCP is stateless now" summary. Read §5, §6 and §8 of the note if nothing else. ⚠️ T2 vendor writing about a standard it says it led , and the headline benefit is that MCP now runs well on serverless platforms it sells. Nothing in it is measured - no benchmark, no latency figure, no cost comparison, in an article whose entire argument is scale and cost. Release candidate on beta SDKs , and it recommends staging rather than production. Unusually well evidenced for the class anyway , because its second leg is six printed protocol payloads rather than a diagram - and decoding one of them produced the sharpest thing in the note: requestState is unsigned plaintext JSON guarding a file deletion , in a document with a security section that never mentions it. The spec itself was not read , so that is a documentation gap, not a proven design flaw.

Read the full note →

Every agent framework teaches you the loop, and almost none of them teach you what happens to a message on the way in and on the way back out. This article walks one boring task through a real open-source agent and finds that the interesting engineering is entirely in the boundaries: routing identity is not conversation identity, session state is not prompt context, a tool schema is not an authorization, and "the agent succeeded" is not one fact but eight of them in a row. The single most useful thing in it is a cell in a table rather than a sentence in the prose, and it says that the guarantee stopping two turns from mutating one conversation is held in memory - so it is process-local, and it does not survive a restart. Read it as the operational half of everything this brain already holds about agent loops.

flowchart TB
    MSG["inbound message"] --> SESS["session"]
    SESS --> CTX["context"]
    CTX --> LOOP["model and tool loop"]
    LOOP --> PERS["persistence"]
    PERS --> DEL["delivery"]

    SESS -.-> C1["routing identity is not<br/>conversation identity"]
    CTX -.-> C2["session state is not<br/>prompt context"]
    LOOP -.-> C3["a tool schema is not<br/>an authorization"]
    LOOP -.-> C4["transcript order is not<br/>side-effect order"]
    PERS -.-> C5["session identity is not<br/>the execution workspace"]
    DEL -.-> C6["committed is not<br/>delivered"]

    classDef collapse fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    class C1,C2,C3,C4,C5,C6 collapse

Read the spine downward as the article's own one-line summary of what a message becomes, and each red node as a distinction the note exists to defend. The crux is that every failure worth naming here comes from writing two objects as one. It is drawn against the spine rather than as a list of pairs because each collapse bites at a particular stage, and knowing where it bites is what tells you which component owns the fix - a routing bug is not repaired by changing the model, and a delivery problem must not be allowed to run a destructive tool twice. A tidier shape, six pairs in a table, would let a reader memorise the distinctions without ever learning where they apply, which is the failure this whole note is arguing against. Spine quoted from the source; the collapses are synthesized from n1, n7, n10, n14, n16 and n17.

Key claims
  • Routing identity and conversation identity are separate objects, and treating them as one is the category error the whole article is organised around. n1
  • The isolation policy of a multi-tenant agent is the routing key's field list. Adding participant identity to the key isolates by participant; leaving it out shares the lane. n2
  • Default per-participant isolation for groups and shared sessions for threads is a routing policy, and the article refuses to call it a security guarantee. n3
  • The model is a callee the loop invokes, not the driver of the loop - provider, model, endpoint, credentials and API mode are all resolved before inference happens. n4
  • "Remote" names three unrelated boundaries - a remote model API, a remote tool-execution backend, and a remote gateway - and none of them implies either of the others. n6
  • Session state is not prompt context, and the stored session is routinely larger than anything the model sees on a given call. n7
  • The mutual-exclusion guarantee over an active conversation is memory-only, therefore process-local - it does not survive a restart and does not hold across two gateway processes. This is stated by a table cell and never by the prose. n8, d1
  • Session identity and execution workspace are separate, so "correct transcript, wrong workspace" is reachable and presents as success. n10
  • A tool schema proves nothing about authorization, isolation or approval. n16
  • "The agent succeeded" is not an operable completion model - the chain has eight stages and every arrow between them is its own failure boundary. n17
  • Execution, persistence and delivery need separate evidence, because collapsing them makes an operator's rerun look safe when it will duplicate an external action. n18
  • Parallel tool results are restored in model-call order, which is transcript validity and not side-effect ordering. n14
agentscontext-engineeringagent-securityevals

When to read: Before designing the runtime around an agent loop, and before writing a runbook - §8's boundary-per-failure table is the shape to copy. Read §7 and §8 of the note if nothing else. Also read it for what the other 23 sources here do not cover: identity, persistence, idempotency and delivery. ⚠️ T4 practitioner blog and nothing in it is measured - no latency, error rate, incident or comparison, and six of its positions are recommendations resting on no outcome. Both corroboration legs are one author's prose against the same author's diagrams, so corroborated means internally consistent and nothing more. It also opens by constructing a deterministic test task and never shows it running ( d3 ), and its stated verification method against source and regression tests is unverifiable from the article - the repo was not cloned. Read d5 before using it against S19: Part 1 is not about memory and moves neither claim 160 nor 161. No topic was created for this material - see ADR-0023, which records the trigger that would.

Read the full note →

Seven benchmarks now measure whether a model can find a security flaw and turn it into a working attack, and this article walks through all of them. The useful thing it gives you is not the leaderboard, it is the anatomy underneath: a sandboxed target, an information dial that sets difficulty, tools, and a grader that scores the outcome because the method is unbounded. What the article does not do is confront its own numbers, and once you put its figures side by side the pattern is hard to miss. Every headline percentage in this field is a description of a configuration rather than a capability, and each dial in that configuration is worth more than the gap between one model and the next. Decomposing the task raised the difficulty ceiling elevenfold. Swapping the scaffolding took one model from 3 of 40 networks to 37. Turning the vendor's safety filters back on took another from 120 exploits to zero. And beneath all of it sits the number the prose never mentions, printed inside one embedded chart: offensive capability, denominated in simulated stolen dollars, is doubling roughly every 1.3 months.

flowchart TB
    N["the number you are about to quote<br/>'17.5% on Cybench'"]

    D1["information given<br/>zero-day to one-day<br/>10% to 12.5% - n9"] --> N
    D2["task decomposition<br/>unguided to subtask-guided<br/>11 min to 2h03 ceiling - n6"] --> N
    D3["scaffolding around the model<br/>ExpertPromptShell to Incalmo<br/>3 of 40 to 37 of 40 - n19"] --> N
    D4["safeguards<br/>enabled to disabled<br/>0 to 120 exploits - n25"] --> N
    D5["attempt budget<br/>single shot to best-of-8<br/>never stated in prose - n8"] --> N

    N --> F["and underneath every dial,<br/>the capability itself doubles<br/>every ~1.3 months - n23"]

    classDef dial fill:#fef3c7,stroke:#b45309,color:#78350f
    classDef num fill:#e0e7ff,stroke:#4338ca,color:#312e81
    classDef floor fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    class D1,D2,D3,D4,D5 dial
    class N num
    class F floor

Read the yellow boxes as the five dials this article turns without ever lining them up, each labelled with the swing it produced in the article's own evidence, all of them feeding the single blue number a reader would otherwise quote out of context. The crux is that the configuration moves the score further than the model does, so a cybersecurity capability figure means nothing until you know all five settings. It is drawn as dials converging on one output rather than as a ranked list because the dials are not alternatives and you do not get to pick one, since every published number has a setting for all five whether or not the author disclosed it. The red floor is separate because it is the one thing no configuration choice affects, and because it is the finding a reader is least likely to leave with, existing as it does only inside an image. Synthesized from n6, n8, n9, n19, n23 and n25; the dials are this brain's framing and are not the article's.

Key claims
  • A cybersecurity eval is four primitives - a sandboxed target, inputs that set difficulty, tools, and a grader - and the author states plainly that this is general agent-eval structure tweaked for the domain rather than anything new (n1, corroborated).
  • Grade the outcome, never the method, because exploitation is open-ended (n2, corroborated). This is the design constraint everything else follows from.
  • Binary outcome scoring is too coarse, so partial credit runs along a four-level attack chain: find, reproduce, execute code, achieve the objective (n3, corroborated).
  • Standardise the attacker's goal rather than the exploit path. CVE-Bench names eight acceptable outcomes and accepts any of them, which makes an unbounded space of methods gradable (n5, corroborated).
  • Capability terminates at an identifiable rung rather than degrading smoothly. Coverage is saturated at 41/41, triggering is common, sandbox escape is near-zero, and arbitrary code execution is zero for every publicly deployed model tested (n16, corroborated).
  • The difficulty ceiling is a property of the guidance regime, not the agent. Unguided, no agent solved a task above 11 minutes of first-human-solve-time; subtask-guided, the same agents reached 52 minutes and one reached 2 hours 3 minutes (n6, divergence d1 - the prose states only the unguided half).
  • Scaffolding dominates the model on long-horizon tasks. One model went from 3 of 40 networks to 37 of 40 by changing the system around it, and all ten models tested scored zero on the old scaffolding and 6-9 of 10 on the new one, with ablations confirming both components load-bearing (n19, n20, corroborated).
  • Better tools are not monotonically better. The same upgrade took one model from 17.5% to 20% and another from 17.5% down to 10-15% (n7, corroborated).
  • Adaptive coaching is non-monotonic and sometimes destructive, lowering the best model's top-tier result and collapsing another model across every tier (n17, single-leg, figure-only - the article never mentions this arm exists).
  • Safety filtering determines the measured number totally rather than marginally. With default filters enabled, all exploit attempts by a model scoring 120 in the same table are blocked (n25, divergence d5).
  • Exploitation capability is doubling roughly every 1.3 months on contamination-controlled contracts, log-linear against release date with R^2 = 0.828 over eight models (n23, single-leg, figure-only, d2 - the single most consequential quantity here and it is absent from the prose).
  • Capability is not monotonic in model version. A newer sibling scored 7 against its predecessor's 15 on one benchmark, and a later release sits below an earlier one on another - with refusal training an unresolved confound (n24, corroborated; n25).
evalsagent-securityagents

When to read: Before quoting any offensive-capability number, and before designing an eval for any open-ended task - §4 and §8 of the note if nothing else. Also the cheapest available lesson in reading a figure before its caption. ⚠️ A secondary source: Yan ran none of these experiments, every number belongs to six arXiv preprints and one vendor page, and no primary was fetched - so its gate establishes a faithful reading , never a fact (ADR-0025). Five of its eight divergences run one direction, the article understating its own figures , including an entire experimental arm absent from the prose and a total safety-filter block summarised as partial refusals. And the headline finding is figure-only : a chart annotated with a ~1.3-month doubling time for offensive capability, which the prose never mentions - T2 vendor benchmark, best-of-eight, eight points, so cite that a rate was measured and not the number.

Read the full note →

LLM Knowledge Bases: a practical guide

video (conference talk, AI Engineer World's Fair 2026, Track 3 "Memory & Continual Learning")

This brain already holds the pattern for LLM-maintained knowledge bases, as S8, and has never seen anyone run one. This talk is that missing half. Ben Holmes read Karpathy's gist, built it, and put the working parts on a projector - the skill file, the tag registry, the generated entity page, the scheduled job - which turns a set of eighteen needs-check assertions into something you can watch operate. Two things make it worth twenty minutes. The mechanisms he had to invent that the pattern does not mention are the ones that decide whether it survives past a month, and there are four of them. And the system quietly breaks the pattern's single most load-bearing rule - raw sources are immutable - which turns out not to be sloppiness but a genuine correction, because the rule as written cannot be implemented and the rule as practised can.

flowchart TB
    P["S8: the pattern<br/>(a gist, 2026-04)"] --> Q{"can it actually<br/>be run?"}
    Q --> R["S26: one instance<br/>(a vault, 2026-07)"]

    R --> N1["idempotence stamp<br/><i>makes sweeps incremental</i>"]
    R --> N2["controlled vocabulary<br/><i>stops taxonomy sprawl</i>"]
    R --> N3["scheduled unattended run<br/><i>removes the human trigger</i>"]
    R --> N4["per-directory schema<br/><i>one job, many wikis</i>"]

    R --> D["<b>and it violates<br/>'raw is immutable'</b>"]
    D --> D2["the rule that survives:<br/><b>one declared writer per layer</b>"]

    R --> Z["<b>but measures nothing</b><br/><i>instantiability, not efficacy</i>"]

    classDef add fill:#dcfce7,stroke:#15803d,color:#14532d
    classDef div fill:#fee2e2,stroke:#b91c1c,color:#7f1d1d
    classDef warn fill:#fef3c7,stroke:#b45309,color:#78350f
    class N1,N2,N3,N4 add
    class D,D2 div
    class Z warn

Green is what the instance adds, red is where it contradicts its own source, and amber is the ceiling on all of it. The crux is that the interesting content of an implementation is exactly the part the pattern did not specify, which is why the four green nodes matter more than the faithful reproduction above them. It is drawn as one fan-out rather than as the talk's five-stage pipeline because the pipeline is S8's and reproducing it here would say that the value of this source is its agreement, when the value is its residue. The amber node hangs off the instance rather than sitting at the bottom as a caveat, because it qualifies every green node individually and none of them survives being quoted without it. Synthesized from n1, n5, n6, n10, n12, n16 and d1.

Key claims
  • Showing a source is not corroborating it, and this ingest is the clean case. The talk displays S8's gist in full, and under the independence rule that is the same leg wearing a different hat - same author, same document, same revision. No S8 node moved. What is independent is that a different person at a different organisation built the pattern and ran it [n1].
  • An idempotence stamp is what makes corpus-wide maintenance affordable. enrichedAt in the note's frontmatter, checked before work and written after, converts a sweep over everything into a sweep over what is new [n5, visuals/frame_404.jpg]. New beyond S8, and it is the precondition for n10 rather than a convenience.
  • A generated taxonomy needs a registry and an explicit reluctance instruction, because the model's default is to invent. Tags live in references/tags.md, the agent must read it first, reuse is mandated, and any coinage must ship a one-line definition into the registry [n6, visuals/frame_425.jpg]. The stated reason is behavioural: "Claude loves to get creative" [@t=435].
  • A derived page earns trust by carrying citations per claim, not per page. Generated entity pages are structured Who / What the sources say / Related / Sources, and every claim bullet terminates in a link to the dated raw note behind it [n9, visuals/frame_776.jpg].
  • Immutability is scoped per job, not per layer - the correction this instance forces on its own source. The talk both endorses "raw sources are read-only" and writes into raw notes; the rule that survives contact with a real vault is one declared writer per layer, with the exception written down [n7, n11, d1].
  • The schema layer is plural. Each wiki directory carries its own AGENTS.md, and the scheduled job is instructed to follow the local schema over its own generic instructions - which is what lets one job maintain several knowledge bases it knows nothing about [n12, visuals/frame_980.jpg]. single-leg, figure-only.
  • Nothing in this source is measured [n16]. Treat every mechanism above as a design to reason about, never as a result to cite.
memoryragskillsagents

When to read: When you are building or maintaining a knowledge base an agent writes to - and before citing S8 and this together as two sources , which is the error it is easiest to make here. Read the nodes.md independence section, then sections 5-7 of the note. Section 8's entity page (per-claim citations, claim 210) is the single most transferable frame. ⚠️ Nothing in it is measured - no baseline, no comparison against the RAG systems it opens by dismissing, no error rate, no corpus size, no cost ( n16 ); the only number uttered is an unsourced 200 wpm about typing. T4 practitioner demo with a T2 commercial interest on its most novel section ( d2 - the scheduling half runs exclusively on the speaker's employer's product). Three of its most interesting mechanisms are figure-only ( n11 , n12 , n15 ), visible in screenshots and never spoken. The review step carrying the entire safety argument for unattended operation is one unexamined sentence ( n13 ).

Read the full note →

GitHub's MCP server is the largest one anybody has published operating data about, at roughly 7.34 million tool calls a week, and the talk is a year of things going wrong at that scale [n17]. Open contribution filled it to 101 tools and made agents measurably worse at using GitHub, so the team built three elegant opt-in fixes - grouped toolsets, dynamic tool discovery, and a semantic tool search prototype - and everyone used the default settings [n4]. The reductions that finally landed were the ones nobody had to opt into, which is a governance lesson wearing a context-window costume. The sharper finding sits underneath it. Having spent the first half of the talk trying to build a per-user filter on the tool surface, the team found one already sitting in the credential: a token's scopes are a free, correct, zero-configuration filter, and turning auth into a context mechanism solved the two problems the rest of the talk was about [n15].

flowchart TB
    P["101 tools arrived by contribution<br/>agents got worse at using GitHub"]

    subgraph U["Fixes that need the user to act"]
        direction TB
        T1["Grouped toolsets"]
        T2["Dynamic tool discovery"]
        T3["Semantic tool search"]
        T1 ~~~ T2 ~~~ T3
    end

    subgraph N["Fixes that need nobody to act"]
        direction TB
        D1["A smaller default<br/>49 pct fewer tools"]
        D2["Tailored responses<br/>77 to 86 pct fewer output tokens"]
        D3["Intent encoded in the tool<br/>instead of an error returned"]
        D4["Scope filtering<br/>the credential already knows"]
        D1 ~~~ D2 ~~~ D3 ~~~ D4
    end

    P --> U
    P --> N
    U --> X["Reached almost nobody"]
    N --> Y["Reached the whole user base"]

    style U fill:#3a2020,stroke:#a04040,color:#fff
    style N fill:#1f3320,stroke:#4a9e5c,color:#fff
    style X fill:#5a1f1f,stroke:#a04040,color:#fff
    style Y fill:#1c4025,stroke:#4a9e5c,color:#fff

This is a delivery diagram, not an architecture diagram, and the axis it sorts on is who has to act for the fix to reach a user. The crux is that the two columns contain roughly equally clever engineering and only one of them shipped value, because the red column's entry cost is a JSON edit and the green column's is nothing. Notice that the fourth green box is the odd one out and is the note's real payload: scope filtering is not a smaller version of a tool list, it is a different source of truth for what the tool list should be. It is drawn green because the user does nothing to get it, which is exactly the property the red column lacked.

Synthesized from n2, n4, n5, n6, n8 and n15.

Key claims
  • The contribution mechanism that made the server complete made the agent worse. Over 100 tools arrived by public contribution within about a month of open-sourcing, and agents got worse at using GitHub while context windows blew out sooner [n2]. corroborated
  • Tool overload is measured, not felt. More tools means worse performance across all tested LLMs, single-domain agents beat multi-domain by 50%+, and 3+ step trajectories degrade quickly [n3]. corroborated within S27, needs-check as world-evidence - S27 is re-displaying LangChain's study, not reproducing it.
  • A configuration option is not a fix. Three separate opt-in solutions were built and shipped, and everyone used the default settings [n4]. corroborated
  • Changing the default cut the catalogue 49% and the initial context load 53% (101 to 52 tools, 64.6k to 30.3k tokens), derived from observed usage rather than taste [n5]. corroborated
  • Output tokens are the larger prize. Tailoring one tool's response cut it 85.9% at 2 items and 76.7% at 100 items, from 657,272 tokens to 153,352 [n6]. corroborated
  • Tool descriptions are a joint optimisation, so they are evaluated as a classifier. The eval tests whether each tool is called at the right times and not at the wrong times, producing a per-tool classification report per model in CI [n10]. corroborated on method, results never quoted
  • GitHub rejected Dynamic Client Registration for operational reasons: unbounded app-database growth, no way to bucket for rate limits, and no reliable app identity. The verdict was "a well-intentioned mistake" [n12, n13]. n12 corroborated, n13 single-leg
  • Authorization data is a free, per-user, already-correct filter on the tool surface - PAT scopes filter automatically, OAuth step-up converts a permission failure into an interactive prompt that lets the call continue, and server tokens hide user-specific tools [n15]. corroborated
  • The production topology is stateless per request and still runs Redis: a new server instance per call, no session affinity, sessions kept only for client-identity telemetry [n16]. corroborated - and this is first-party production evidence for claim 180.
  • The author expects the central decision to be reversed: thousands of tools will be normal soon, and he will "probably reverse many of the fewer tools decisions" [n20]. single-leg
mcpagentscontext-engineeringagent-securityevals

When to read: Before deploying or scaling any remote MCP server, and before spending a quarter optimising tool definitions - measure a realistic response payload first (§5). Read §5, §7 and §11 if nothing else. ⚠️ A vendor engineer presenting his own product , with no external evaluation, no baseline against any other server, and every efficacy figure self-reported. The most interesting claim is the least quantified - scope filtering gets no number in a talk that counts everything else. The eval section shows a method and no results : the classification report is unreadable at source resolution and no score is quoted anywhere. Two figures are hedged in delivery (" 95%" success, "roughly 17%" read-only adoption) and both are single-leg . The LangChain findings are re-displayed, not reproduced (claim 212's pattern). And the strongest caveat is the author's own : he predicts thousands of tools will be normal and that he will "probably reverse many of the fewer tools decisions" - so the mechanics are durable and the central recommendation carries a published expiry date.

Read the full note →