<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Falco – Prempti</title><link>https://falco.org/tags/prempti/</link><description>Recent content in Prempti on Falco</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 12 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://falco.org/tags/prempti/feed.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Introducing Prempti: Falco meets AI coding agents</title><link>https://falco.org/blog/introducing-prempti/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://falco.org/blog/introducing-prempti/</guid><description>
&lt;p&gt;Today's developer workflow is increasingly reliant on AI coding agents. Tools like Claude Code sit in your terminal, read your files, run shell commands, make network requests, and write code, all on your behalf. They are fast, capable, and increasingly trusted with real tasks on real machines.&lt;/p&gt;
&lt;p&gt;But with that trust comes a question worth taking seriously: what exactly is your coding agent doing on your machine?&lt;/p&gt;
&lt;p&gt;Today, we're introducing an experimental project that brings Falco to this new frontier: &lt;a href="https://prempti.falco.org"&gt;Prempti&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="agents-are-a-black-box-at-runtime"&gt;Agents are a black box at runtime&lt;/h2&gt;
&lt;p&gt;When a coding agent runs a bash command, writes a file, or reads a configuration, those actions happen inside your user session, with your permissions, in your filesystem, against your credentials. Most developers using these tools have no structured visibility into that activity. You see the agent's chat output, but you don't see what's happening under the hood.&lt;/p&gt;
&lt;p&gt;Here's a simple scenario: you ask your coding agent to refactor a module. It reads your source files. It makes edits. Then, perhaps prompted by a malicious dependency or an unexpected instruction in a file it just parsed, it attempts to read &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt; or write a file to &lt;code&gt;~/.aws/&lt;/code&gt;. Should it be allowed to? Would you even know if it tried?&lt;/p&gt;
&lt;p&gt;The demo below captures exactly this situation:&lt;/p&gt;
&lt;div id="demo3"&gt;&lt;/div&gt;
&lt;script&gt;
AsciinemaPlayer.create("https://asciinema.org/a/857572.json", document.getElementById('demo3'), {
"autoPlay": true ,"loop": true ,"poster": "npt:0:04",
});
&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;p&gt;To run this asciicast without javascript, use &lt;code&gt;asciinema play https://asciinema.org/a/857572.json&lt;/code&gt; with &lt;a href="https://asciinema.org/"&gt;Asciinema&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/noscript&gt;
&lt;p&gt;The agent tried to both read and write to sections it's not allowed to, and both were blocked. The agent itself received a structured message explaining why, and showed that to the user. This is detection and enforcement working together at the tool-call level.&lt;/p&gt;
&lt;h2 id="how-prempti-works"&gt;How Prempti works&lt;/h2&gt;
&lt;p&gt;Prempti runs as a lightweight user-space service alongside your coding agent. It does not require root, kernel modules, or containers. When your agent makes a tool call such as a file write, a shell command, or a file read, Prempti intercepts it &lt;strong&gt;before it executes&lt;/strong&gt;, evaluates it against Falco rules, and delivers a verdict:&lt;/p&gt;
&lt;div class="table-responsive"&gt;
&lt;table class="table table-striped"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Allow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The tool call proceeds normally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deny&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The tool call is blocked and the agent is told why&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ask&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You are prompted to approve or reject interactively&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;The architecture looks like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prempti's hook fires before each tool call&lt;/li&gt;
&lt;li&gt;An interceptor sends the event to Falco via a Unix socket&lt;/li&gt;
&lt;li&gt;Falco's rule engine evaluates the event against your policies&lt;/li&gt;
&lt;li&gt;Matching rules produce verdicts (deny / ask / allow)&lt;/li&gt;
&lt;li&gt;The interceptor delivers the verdict back to the agent&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Prempti uses Falco's plugin system to define a new event source (&lt;code&gt;coding_agent&lt;/code&gt;) with fields purpose-built for this context: &lt;code&gt;tool.name&lt;/code&gt;, &lt;code&gt;tool.input_command&lt;/code&gt;, &lt;code&gt;tool.file_path&lt;/code&gt;, &lt;code&gt;agent.cwd&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;h2 id="two-modes-monitor-and-guardrails"&gt;Two modes: Monitor and Guardrails&lt;/h2&gt;
&lt;p&gt;Prempti is designed to let you both observe what the agent is doing and align it with your security policy:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Monitor mode&lt;/strong&gt; evaluates every tool call against your rules and logs the results, but does not enforce any action. This is what we recommend as a starting point: run it for a few sessions, see what your agent actually touches, and tune your rules before you enable blocking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guardrails mode&lt;/strong&gt; (the default) fully enforces verdicts as explained above — deny blocks, ask prompts you, allow proceeds.&lt;/p&gt;
&lt;p&gt;You can switch between modes at any time:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;premptictl mode monitor &lt;span style="color:#080;font-style:italic"&gt;# observe only&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;premptictl mode guardrails &lt;span style="color:#080;font-style:italic"&gt;# enforce verdicts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;premptictl logs &lt;span style="color:#080;font-style:italic"&gt;# watch live events&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="writing-rules-familiar-territory"&gt;Writing rules: Familiar territory&lt;/h2&gt;
&lt;p&gt;If you've written Falco rules before, agent security policies will feel very familiar. Here's a rule that blocks piping content directly to a shell interpreter, a classic vector for prompt injection attacks:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#008000;font-weight:bold"&gt;rule&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;Deny pipe to shell&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;desc&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;Block piping content to shell interpreters&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;condition&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&amp;gt;&lt;span style="color:#b44;font-style:italic"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44;font-style:italic"&gt; tool.name = &amp;#34;Bash&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44;font-style:italic"&gt; and (tool.input_command contains &amp;#34;| sh&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44;font-style:italic"&gt; or tool.input_command contains &amp;#34;| bash&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44;font-style:italic"&gt; or tool.input_command contains &amp;#34;| zsh&amp;#34;)&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;output&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;&amp;gt;&lt;span style="color:#b44;font-style:italic"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b44;font-style:italic"&gt; Falco blocked piping to a shell interpreter (%tool.input_command)&lt;/span&gt;&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;priority&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;CRITICAL&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;source&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;coding_agent&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bbb"&gt; &lt;/span&gt;&lt;span style="color:#008000;font-weight:bold"&gt;tags&lt;/span&gt;:&lt;span style="color:#bbb"&gt; &lt;/span&gt;[coding_agent_deny]&lt;span style="color:#bbb"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output field is designed to be LLM-friendly, so that the agent receives it as a structured message it can surface directly to the user. Correlation IDs allow you to trace every event across your logs.&lt;/p&gt;
&lt;p&gt;The default ruleset ships with policies covering six areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Working-directory boundary&lt;/strong&gt; — monitor and ask on file access outside the session's project directory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensitive paths&lt;/strong&gt; — deny reads and writes to &lt;code&gt;/etc/&lt;/code&gt;, &lt;code&gt;~/.ssh/&lt;/code&gt;, &lt;code&gt;~/.aws/&lt;/code&gt;, cloud credentials, &lt;code&gt;.env&lt;/code&gt; files, and similar&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sandbox disable&lt;/strong&gt; — detect attempts to disable the agent's own sandbox configuration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Threats&lt;/strong&gt; — credential access, destructive commands, pipe-to-shell, encoded payloads, exfiltration, IMDS access, reverse shells, and supply-chain installs from known-malicious hosts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP and skill content&lt;/strong&gt; — MCP server config poisoning and slash-command file injection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistence vectors&lt;/strong&gt; — hook injection, git hooks, package-registry redirects, AI API base-URL overrides, and API keys leaking into env files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can add your own rules to &lt;code&gt;~/.prempti/rules/user/&lt;/code&gt;; they're preserved across upgrades.&lt;/p&gt;
&lt;h2 id="rule-authoring-with-claude-code"&gt;Rule authoring with Claude Code&lt;/h2&gt;
&lt;p&gt;The project also includes a Claude Code skill for writing Falco rules for Prempti interactively. You can install it directly from the Prempti plugin marketplace:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/plugin marketplace add falcosecurity/prempti
/plugin install prempti-falco-rules@prempti-skills
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then you can ask Claude Code to create rules like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Block the agent from running git push&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Deny any read outside the working directory&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Create a rule that requires confirmation before editing Dockerfiles&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The skill guides you through writing the rule, placing it in the right directory, and validating it with Falco. It's a great example of the kind of human-AI collaboration this project is designed to enable: the agent helps you constrain itself.&lt;/p&gt;
&lt;h2 id="let-s-be-honest-about-limitations"&gt;Let's be honest about limitations&lt;/h2&gt;
&lt;p&gt;We want to be clear about what this project is and isn't.&lt;/p&gt;
&lt;p&gt;Prempti intercepts tool calls as declared by the agent, not the system calls those tool calls produce. If an agent writes a malicious binary and runs it, Falco sees &lt;code&gt;gcc main.c -o main&lt;/code&gt; and &lt;code&gt;./main&lt;/code&gt;, not what &lt;code&gt;./main&lt;/code&gt; does at the OS level. For deep syscall-level visibility on Linux, Falco's kernel instrumentation (eBPF/kmod) remains the right tool.&lt;/p&gt;
&lt;p&gt;Prempti is also not a sandbox. It doesn't prevent a sufficiently determined agent from circumventing the hook mechanism if it can find a path the hook doesn't cover. Think of it as a policy layer at the agent level — a valuable complement to sandboxing and system hardening, not a replacement for them.&lt;/p&gt;
&lt;p&gt;What it does provide is visibility and a programmable policy boundary that lives at the most natural enforcement point: the moment the agent decides to act.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Download the latest release from the GitHub repository: &lt;a href="https://github.com/falcosecurity/prempti/releases"&gt;https://github.com/falcosecurity/prempti/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;installer -pkg prempti-&amp;lt;version&amp;gt;-darwin-universal.pkg &lt;span style="color:#b62;font-weight:bold"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -target CurrentUserHomeDirectory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The installer wizard handles everything. The service starts automatically on login.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar xzf prempti-&amp;lt;version&amp;gt;-linux-x86_64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a2f"&gt;cd&lt;/span&gt; prempti-&amp;lt;version&amp;gt;-linux-x86_64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bash install.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Windows:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;msiexec /i prempti-&amp;lt;version&amp;gt;-windows-&amp;lt;arch&amp;gt;.msi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Verify your setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;premptictl status
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;premptictl hook status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="explore-together-with-us"&gt;Explore together with us&lt;/h2&gt;
&lt;p&gt;Runtime security for AI coding agents is genuinely new territory. The threat models are still being defined. The right default policies are still being discovered. We believe our community of developers, security engineers, and the people running these agents day to day are the ones who will figure out what good looks like here. If you've used Prempti, we'd love to hear what you found:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What rules have you written? What did you catch?&lt;/li&gt;
&lt;li&gt;What agents or platforms do you need support for?&lt;/li&gt;
&lt;li&gt;What didn't work as expected?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Open an &lt;a href="https://github.com/falcosecurity/prempti/issues"&gt;issue&lt;/a&gt;, start a &lt;a href="https://github.com/falcosecurity/prempti/discussions"&gt;discussion&lt;/a&gt;, or come chat with us in the &lt;a href="https://kubernetes.slack.com/archives/CMWH3EH32"&gt;Falco Slack&lt;/a&gt;. Every piece of feedback shapes what this project becomes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Prempti is released under the Apache License 2.0. Currently supports Claude Code on Linux (x86_64, aarch64), macOS (Apple Silicon, Intel), and Windows (x86_64, ARM64). Codex integration is on the roadmap.&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>