Building an AI harness for intelligence analysis A months-long effort to build "AI harnesses" for intelligence analysis found that large language models attribute genuine facts to the wrong person, cite sources that do not support their claims, interpret failed searches as evidence nothing exists, and invent plausible reasons for skipping mandatory steps, according to the team's account of the builds. The harnesses wrap a model in six components — rules, commands, scripts, hooks, gates and ledgers — to govern how reports are produced and to check the output, and the team reports that the automated checks meant to catch these failures can themselves report success without having run. The stated objective is not to make AI-generated intelligence infallible but to make its limitations visible, its findings traceable and its failures harder to miss. October 2026 Building an AI harness for intelligence analysis The failures we met putting large language models through the production of intelligence reports, the controls we built in response, and what we learned from testing them. Large language models can produce convincing intelligence reports. They can search for information, read documents, extract facts, identify connections and turn large volumes of material into structured assessments. What they cannot reliably do on their own is demonstrate that every finding is supported by evidence, that every relevant source was actually examined, or that the process used to reach a conclusion was followed correctly. That distinction has become increasingly important as AI moves beyond assisting individual analysts towards conducting substantial parts of an investigation autonomously. We have spent several months developing AI harnesses for intelligence analysis: systems that take a large language model through the production of an intelligence report, from collection and source reading to analysis and drafting. The harness, meaning the rules, scripts and controls built around the model, governs how that work is done and checks what comes out of it. The development process has exposed problems that are not obvious from the finished report. Models attribute genuine facts to the wrong person, cite sources that do not support their claims, interpret failed searches as evidence that nothing exists, and invent plausible reasons for skipping mandatory steps. The automated checks meant to catch these failures can themselves report success without having run. None of this necessarily produces a visibly defective report: the output can be well written, carefully structured and extensively referenced while still containing serious errors. This article sets out the failures we encountered, the controls we developed in response, and the lessons we learned from testing them. It draws on real builds and reporting workflows, with examples generalised and identifying details removed. Where code illustrates how a control works, we have included it alongside a plain-English explanation. The objective is not to demonstrate that AI-generated intelligence can be made infallible. It is to explore what is required to make its limitations visible, its findings traceable and its failures harder to miss. Building the harness What a harness is A language model on its own is a very capable reader and writer but has no memory of your standards, no access to your tools and no obligation to follow a process. The harness is everything built around it to change that. Our typical harnesses have six components: - Rules: Short written instructions the model reads at the start of a session and again at set points during a report. - Commands: Step-by-step runbooks, one per report type, that walk the model through the job in order. - Scripts: Small programs the model runs to search, fetch web pages, pull facts out of documents, check those facts and produce the final document. A script does the same thing every time, which the model doesn't. - Hooks: Code that runs automatically just before or after the model does something, such as writing a file. A hook can block the action. Think of it as a checkpoint the model has to pass through whether it wants to or not. - Gates: Larger sets of checks that a report must pass before it's allowed into the folder of finished work. - Ledgers: Running records of what was searched, read, extracted and decided, kept as the work happens. Two further terms recur throughout. A lint is an automatic check on text, like a spellchecker but for whatever rule you care about: "no Wikipedia citations", say, or "every figure must have a source". The context window is how much the model can hold in mind at once. A long report with hundreds of sources fills it quickly, which becomes significant later. Software engineering has a structural advantage that intelligence work lacks. Code written by an AI can be executed and tested, and the AI can repeat that cycle unaided until the tests pass. Intelligence has no equivalent test. The only route to the truth is through sources, and each source can be misread in its own way. When an AI pipeline gets intelligence wrong, nothing visibly breaks. The output is a well-written report with a footnote on every line, and some of those lines are wrong. There's a second problem. Unless you design against it, the model is the only witness to its own work. It writes the report and it writes the log of how the report was made. A reviewer looking at both sees a tidy product and a tidy audit trail, and the model produced both. Much of the harness exists to address this: to make the model's claims checkable by something other than the model, and to make the record of the work come from the work itself rather than from the model's description of it. How a report moves through the harness The diagram below shows the path a report takes, and the rest of the article refers back to it. Those records matter more than anything the model says about its own work, because later stages check against them. Stage 9, the pre-publication gate, is the last line of defence. It's a single program that runs a set of checks over the finished draft and its records, and it refuses to release the report if any of them fail. Has every STOP been answered, or signed off by the analyst? Does every planned search have a receipt showing it ran? Does every logged source have a reading record? Is the fact check newer than the draft, and did it actually check something? Do the citations resolve? If the answer to any of those is no, the report goes back for fixing. The step that moves a report into the finished folder runs the gate first, and a hook blocks the other routes into that folder. Running down the left of the diagram are the hooks, which sit around every action the model takes. They're what stops a sub-agent being launched without a scope, or a file being written somewhere it shouldn't be. The rules In harnesses we have developed it is important to have a foundation or set of 'Cardinal Rules', written before any code. The model reads them at the start of every session and again at each phase of a report. Some will be familiar to anyone with intelligence training. Others exist because the model repeatedly exhibited a specific failure. A selection is reproduced below, with the original numbering: 1. 1Every factual claim requires a source URL. No source = delete the claim. 2. 2Verify CONNECTIONS between entities, not just that entities exist individually. 3. 3Declare what you DON'T know before listing what you can source. 4. 4Confidence: verbal yardstick only almost certain → almost certainly not . No brackets, no numbers. 5. 7Assessment language for analytical claims: "we assess that…" — never stated as fact. 6. 8The feeling of completeness without a source URL is the confabulation signal. 7. 9No Wikipedia as a citable source. Use it to find the primary, then cite the primary. 8. 10Self-declared sources never verify claims. LinkedIn, ZoomInfo and similar may be cited with attribution language "according to" but never with verification language "confirms", "corroborates" . 9. 12Self-authorised skips are void. Time, context-budget or completion pressure is the signal to write a handoff and ask the analyst — never to shortcut. Rule 8 is the most important. "Confabulation" is the term for a model producing something plausible that it has no basis for. The model will tell you a director was appointed in 2019 and be right often enough that you stop checking. The "feeling" in the rule belongs to whoever is reading the output: when a statement reads as settled and there's no source behind it, that's when it most needs checking. Rule 1 says "URL", but in practice it means a source that can be cited and recovered later. Web pages change and disappear, and some of the best material never had a URL at all. So the harness keeps its own copy of everything it reads at the moment it reads it: the extracted text, a fingerprint of the content and the retrieval date, with an archived copy where one can be made. Documents supplied by the analyst, or exported from a subscription database, are cited by what they are and where they came from, never with an invented link. The documents a report cites are copied alongside it when it's finished, so the citations still work after the working files are cleared. Rule 2 catches the errors that are hardest to spot. The model confirms that Company A exists, confirms that Person B exists, and then writes that B is a director of A. Both entities are real. Nothing links them. Anyone who has built a link chart knows the nodes are the easy part. Rule 10 is about the difference between a source and a corroboration. A LinkedIn profile tells you what someone says about themselves. It can be cited, as long as the report says "according to their profile". It can never be the thing that "confirms" their employment history. Rules on their own aren't enough. A model will read them, agree with them and then, under the right conditions, set them aside. Enforcing the process Self-authorised shortcuts Every report type has mandatory ANALYST STOP points, where the pipeline has to pause and hand a decision to a person. Typical ones are reviewing hypotheses before they're scored in an ACH analysis of competing hypotheses , deciding whether to use premium data the harness can't access, and approving the assessment before it's written up. Each STOP is recorded in a status file, and the gate refuses a report if any STOP is missing. The status file accepts three kinds of entry: Response formats accepted in staging/status.md: STOP-