<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Prompt Injection on Matt Goodrich</title><link>https://mattgoodrich.com/tags/prompt-injection/</link><description>Recent content in Prompt Injection on Matt Goodrich</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 22 Jul 2026 00:01:00 -0700</lastBuildDate><atom:link href="https://mattgoodrich.com/tags/prompt-injection/index.xml" rel="self" type="application/rss+xml"/><item><title>Make Mistakes Cheap Before You Let the Agent Run</title><link>https://mattgoodrich.com/posts/make-mistakes-cheap/</link><pubDate>Wed, 22 Jul 2026 00:01:00 -0700</pubDate><guid>https://mattgoodrich.com/posts/make-mistakes-cheap/</guid><description>&lt;img src="https://mattgoodrich.com/posts/make-mistakes-cheap/header.png" alt="Featured image of post Make Mistakes Cheap Before You Let the Agent Run" />&lt;p>&lt;strong>The first safety change I made for my agents was the one that does the least.&lt;/strong> I aliased &lt;code>rm&lt;/code> to &lt;code>trash-put&lt;/code>, from &lt;a class="link" href="https://github.com/andreafrancia/trash-cli" target="_blank" rel="noopener"
>trash-cli&lt;/a>, so a deleted file lands in a recoverable trash instead of vanishing. It felt responsible. Then I thought about how an agent actually runs a command, and the alias stopped looking like a guardrail.&lt;/p>
&lt;p>An alias only exists in an interactive shell. When Claude Code or Codex runs a command, it runs through a non-interactive shell, and non-interactive shells do not expand aliases. The agent also writes scripts and runs them, calls &lt;code>/bin/rm&lt;/code> by full path, and pipes through &lt;code>xargs&lt;/code>, and none of those ever see my &lt;code>.zshrc&lt;/code>. The trash-cli maintainer actually recommends against aliasing &lt;code>rm&lt;/code>, because &lt;code>trash-put&lt;/code> takes different flags and the alias quietly breaks scripts. So the change I made to feel safer protects me when I fat-finger a command, and does almost nothing the moment an agent is the one typing.&lt;/p>
&lt;p>That is the whole problem in one example, and it points at the rule this post is built on: &lt;strong>a guardrail the agent can shell around is theater.&lt;/strong> Anything you set up in the shell, an alias or a function or a wrapper on your PATH, is bypassable by a process that calls the real binary. Real safety lives one layer down, and it comes in two kinds.&lt;/p>
&lt;h2 id="two-kinds-of-guardrail">Two Kinds of Guardrail
&lt;/h2>&lt;p>Every local safety measure is either &lt;strong>reversible-by-default&lt;/strong> or &lt;strong>prevent-the-action&lt;/strong>.&lt;/p>
&lt;p>Reversible-by-default is an undo buffer. The agent is allowed to do the damage, but you can get the state back: a trash that holds deleted files, a filesystem snapshot from before the run, a git history you committed first. It does not stop anything. It makes stopping unnecessary, because the mistake is cheap to walk back.&lt;/p>
&lt;p>Prevent-the-action is a cage. The command never runs, or it runs somewhere it cannot reach anything that matters: an OS sandbox, a non-root user that cannot touch &lt;code>/etc&lt;/code>, a firewall that drops the outbound connection. It stops the action instead of undoing it. And it comes in strengths, from a rule you write in plain language that the agent can talk itself out of, up to a kernel boundary it cannot.&lt;/p>
&lt;p>So the layers, softest to hardest: make mistakes cheap to undo, write the rules down, and put a hard cage around what is left. The reversible layer is where most of the value is, because it is cheap and it does not depend on the agent cooperating. Start there.&lt;/p>
&lt;p>&lt;img src="https://mattgoodrich.com/posts/make-mistakes-cheap/diagram-guardrail-layers.png"
width="276"
height="879"
srcset="https://mattgoodrich.com/posts/make-mistakes-cheap/diagram-guardrail-layers_hu1850795207082533435.png 480w, https://mattgoodrich.com/posts/make-mistakes-cheap/diagram-guardrail-layers_hu12823490602164662400.png 1024w"
loading="lazy"
alt="The guardrail layers around an unattended agent, weakest to strongest. Shell tricks like aliasing rm are theater, because the agent shells around them by calling the raw binary. Written rules in CLAUDE.md or AGENTS.md are a soft layer that usually holds but a prompt injection can override. An OS cage of sandbox, non-root user, and egress deny is hard because the kernel enforces it. Underneath all of them, a reversible undo buffer of filesystem snapshots and git catches what still gets through and makes the mistake cheap to fix."
class="gallery-image"
data-flex-grow="31"
data-flex-basis="75px"
>&lt;/p>
&lt;h2 id="make-mistakes-cheap">Make Mistakes Cheap
&lt;/h2>&lt;p>&lt;strong>Trash, with its eyes open.&lt;/strong> &lt;a class="link" href="https://github.com/andreafrancia/trash-cli" target="_blank" rel="noopener"
>trash-cli&lt;/a> on Linux (&lt;code>trash-put&lt;/code>, restore with &lt;code>trash-restore&lt;/code>) and &lt;code>trash&lt;/code> from Homebrew on macOS are worth installing. macOS &lt;code>rm&lt;/code> has no trash at all; it is a hard unlink. Just install these for what they are: a convenience for you, not a cage for the agent. If you want the agent&amp;rsquo;s own &lt;code>rm&lt;/code> to land in the trash, an alias will not do it. Put an executable named &lt;code>rm&lt;/code> earlier on the agent&amp;rsquo;s PATH, or accept that &lt;code>rm&lt;/code> is unsafe and lean on the next two, which do not care what the agent calls.&lt;/p>
&lt;p>&lt;strong>Snapshot before the run.&lt;/strong> This is the undo buffer that actually holds, because it captures the whole tree and the agent cannot opt out of it. On the Mac the filesystem already does it for free:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">tmutil localsnapshot &lt;span class="c1"># APFS snapshot of /, seconds, no config&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tmutil listlocalsnapshots / &lt;span class="c1"># com.apple.TimeMachine.2026-07-21-101500.local&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Take one right before you turn an agent loose. To get a file back, mount the snapshot read-only and copy out of it; a full rollback is a Recovery-mode restore and wipes later snapshots, so cherry-picking is usually what you want. The catch worth knowing: these get thinned automatically, roughly a day and sooner under disk pressure, and a snapshot pins the disk space of everything it references. Take a fresh one per run rather than trusting yesterday&amp;rsquo;s.&lt;/p>
&lt;p>On the Unraid box, the same idea is a ZFS one-liner, and here the rollback is real:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">zfs snapshot pool/dataset@pre-agent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">zfs rollback pool/dataset@pre-agent &lt;span class="c1"># whole dataset, back to the mark&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Commit before the run, isolate per agent.&lt;/strong> Git is the undo buffer for code, and the only work it cannot recover is the work you never committed. A clean &lt;code>git status&lt;/code> before launch is the single habit that pays off most here. Then give each agent its own &lt;a class="link" href="https://git-scm.com/docs/git-worktree" target="_blank" rel="noopener"
>worktree&lt;/a> so two of them cannot step on each other:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git worktree add ../repo-agentA -b agentA
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>One HEAD, one index, one working directory per agent, sharing a single object store. And keep the escape hatch open. &lt;code>git reflog&lt;/code> recovers a bad reset or rebase, but its default retention drops unreachable commits after 30 days, so on a machine where agents run, tell it to hold on:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git config --global gc.reflogExpire never
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git config --global gc.reflogExpireUnreachable 365.days
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>One honest gap in the git story, because it is the one people assume is covered: the reflog does not save uncommitted changes. &lt;code>git reset --hard&lt;/code> or &lt;code>git checkout .&lt;/code> erases your working-tree edits with no reflog trace. That specific hole is exactly what the filesystem snapshot above closes, which is why you want both and not either.&lt;/p>
&lt;h2 id="write-the-rules-down-but-dont-trust-them">Write the Rules Down, But Don&amp;rsquo;t Trust Them
&lt;/h2>&lt;p>Between the shell trick and the sandbox sits a layer worth using well: the rules you write in plain language. Put &amp;ldquo;never force-push, never touch production, delete only inside the repo&amp;rdquo; in a &lt;code>CLAUDE.md&lt;/code> or an &lt;code>AGENTS.md&lt;/code> and the agent reads it and mostly obeys, because a clear instruction sits high in the model&amp;rsquo;s &lt;a class="link" href="https://arxiv.org/abs/2404.13208" target="_blank" rel="noopener"
>instruction hierarchy&lt;/a>, the trained priority order that ranks your standing rules above the current task above whatever text arrives from a file or a web page. Models are genuinely good at following clear, checkable instructions. That is what benchmarks like &lt;a class="link" href="https://arxiv.org/abs/2311.07911" target="_blank" rel="noopener"
>IFEval&lt;/a> measure, and the frontier models score in the 90s.&lt;/p>
&lt;p>I&amp;rsquo;ll be honest that this layer makes me uneasy. I have spent years putting hard, verifiable security boundaries in place, the kind you can test and prove hold, and typing a sentence in plain English and calling it a control feels wrong. It should. A rule the model can read is a rule the model can talk itself out of.&lt;/p>
&lt;p>Two limits, both straight out of the evals. Adherence is cooperation-dependent, and it falls apart when instructions conflict: &lt;a class="link" href="https://arxiv.org/abs/2502.08745" target="_blank" rel="noopener"
>IHEval&lt;/a>, the benchmark built for exactly this, watches the best models drop toward a coin flip once a lower-priority instruction argues against a higher-priority one. A prompt injection from a poisoned README or a tool&amp;rsquo;s output is precisely that conflict, and the rule and the attack run through the same model on the same attention, so a guardrail can always in principle be argued away.&lt;/p>
&lt;p>The second limit is the one I keep relearning. I have caught myself thinking Codex honors a written rule more reliably than Claude, and the benchmarks do not back a durable gap between the two. There is a plainer explanation. Claude Code auto-loads &lt;code>CLAUDE.md&lt;/code>; Codex auto-loads &lt;code>AGENTS.md&lt;/code>; Claude Code will not read &lt;code>AGENTS.md&lt;/code> unless you import it. A rule in the file your tool does not read is not a rule. Half the time the model did not ignore the guardrail, it never saw it, or the rule was too vague to act on. Specific beats general (&amp;ldquo;delete only inside the repo, never with an absolute path&amp;rdquo; beats &amp;ldquo;be careful with &lt;code>rm&lt;/code>&amp;rdquo;), and a bloated rules file holds worse than a short one.&lt;/p>
&lt;p>So write the rules, put them where your tool actually loads them, and keep them sharp. Then treat them as what they are: a soft layer that lowers the odds of an honest mistake, never the thing that makes the mistake impossible. Prompting changes the odds. The next layer changes what is possible.&lt;/p>
&lt;h2 id="cage-the-irreversible">Cage the Irreversible
&lt;/h2>&lt;p>Reversibility runs out somewhere, and where it runs out you need something that says no.&lt;/p>
&lt;p>&lt;strong>Turn on the sandbox.&lt;/strong> This is the layer that holds when the written rule does not, because the kernel enforces it and the agent cannot argue with the kernel. The good news is the tools are shipping it. Codex sandboxes shell commands by default: Apple Seatbelt on macOS, bubblewrap and seccomp on Linux, writes scoped to the workspace and network egress off until you opt in, and it is open source. Claude Code makes you turn it on:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;sandbox&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nt">&amp;#34;enabled&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>and packages the same primitives as a standalone, &lt;a class="link" href="https://github.com/anthropic-experimental/sandbox-runtime" target="_blank" rel="noopener"
>&lt;code>sandbox-runtime&lt;/code>&lt;/a>, that wraps any process, a Codex run or an MCP server or a bare &lt;code>bash&lt;/code> line, with one command. That is the open-source answer for whatever your tool does not cover itself.&lt;/p>
&lt;p>Two things to set the moment you rely on it, both of which the defaults leave open. The sandbox restricts writes but still lets a command read your whole disk, including &lt;code>~/.ssh&lt;/code> and &lt;code>~/.aws/credentials&lt;/code>, so deny those explicitly. And it can retry a blocked command outside the sandbox through the normal permission flow, so if you want a hard cage, turn that escape hatch off. The honest limit even then: allowing a broad domain like &lt;code>github.com&lt;/code> reopens an exfiltration path, because the proxy trusts the hostname the client hands it and does not inspect the traffic.&lt;/p>
&lt;p>Having the feature and having a safe default are different things. Google&amp;rsquo;s Antigravity ships a terminal sandbox too, but it is off by default, and a researcher walked out of it with a symlink the confinement did not re-check. If your tool has no sandbox at all, wrap it from the outside with the open-source primitives the others are built on: &lt;code>bubblewrap&lt;/code> or &lt;code>sandbox-exec&lt;/code> on the host, &lt;code>firejail&lt;/code>, or a throwaway container with &lt;code>--network none&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Run the agent as someone who cannot do much.&lt;/strong> The foundation that makes everything above hold is boring: a dedicated non-root user with no passwordless sudo, whose filesystem access is the repo and not much else. A non-root agent physically cannot &lt;code>mkfs&lt;/code>, cannot write &lt;code>/etc&lt;/code>, cannot read another user&amp;rsquo;s keys. It is also why Claude Code refuses &lt;code>--dangerously-skip-permissions&lt;/code> when you are running as root, and why the reference dev container runs unprivileged. If you do one prevention thing, do this one, because it is the layer the others stand on.&lt;/p>
&lt;p>&lt;strong>Drop the network by default.&lt;/strong> Most of the damage an agent can do that a snapshot cannot undo is exfiltration, and prompt injection turns a poisoned README into an outbound request. Default-deny egress with a narrow allowlist caps the blast radius: Little Snitch or &lt;code>pf&lt;/code> on the Mac, &lt;code>nftables&lt;/code> scoped to the agent&amp;rsquo;s UID on Linux. Pin DNS to a known resolver while you are at it, or a DNS tunnel walks right through the hole.&lt;/p>
&lt;p>&lt;strong>A hook for the footguns.&lt;/strong> None of the above catches an honest &lt;code>rm -rf&lt;/code> typo before it runs. A Claude Code &lt;code>PreToolUse&lt;/code> hook does. It sees the full command and can veto by pattern:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="nv">cmd&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>jq -r &lt;span class="s1">&amp;#39;.tool_input.command&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$cmd&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> grep -Eq &lt;span class="s1">&amp;#39;rm +-rf +[/~]|dd +if=|mkfs|curl.*\| *sh|git push +--force&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;blocked: destructive pattern&amp;#34;&lt;/span> &amp;gt;&lt;span class="p">&amp;amp;&lt;/span>2&lt;span class="p">;&lt;/span> &lt;span class="nb">exit&lt;/span> &lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Useful, and worth having. Also a denylist, which means it is a cat-and-mouse game: &lt;code>rm -rf&lt;/code> spells as &lt;code>rm -r -f&lt;/code>, as a variable, as a script the agent writes and then runs. A hook catches the obvious footguns. It does not stop an adversary, and you should not ask it to. That job belongs to the sandbox and the non-root user.&lt;/p>
&lt;p>&lt;strong>Cap the runaway.&lt;/strong> Agents loop. A resource limit turns &amp;ldquo;expensive at machine speed for an hour&amp;rdquo; into &amp;ldquo;stopped.&amp;rdquo; &lt;code>ulimit -u&lt;/code> defuses a fork bomb; on Linux a cgroup does it for the whole process tree:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">systemd-run --uid&lt;span class="o">=&lt;/span>agent -p &lt;span class="nv">MemoryMax&lt;/span>&lt;span class="o">=&lt;/span>8G -p &lt;span class="nv">TasksMax&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1000&lt;/span> claude
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="what-reversibility-cant-buy-back">What Reversibility Can&amp;rsquo;t Buy Back
&lt;/h2>&lt;p>Here is the argument against leaning on the reversible layer, and it is why the cage is not optional.&lt;/p>
&lt;p>A snapshot restores your disk. It does not un-send an email, un-drop a cloud database, or reach into a remote and undo a &lt;code>git push --force&lt;/code> that rewrote history other people had already pulled. The moment an action leaves your machine, your local undo buffer stops applying. Those are exactly the actions worth a hard block: force-push denied at the hook and, more durably, at the server with branch protection; production credentials simply not present in the agent&amp;rsquo;s environment; the network dropped so the secret cannot leave. Reversibility handles the local blast radius. Prevention handles the part that escapes it, and the two lists barely overlap.&lt;/p>
&lt;p>And prevention has bugs, which is the other reason you keep the reversible layer under it. Anthropic shipped its sandbox in October 2025. Two days later, a bug in Claude Code fired an &lt;code>rm -rf&lt;/code> at a user&amp;rsquo;s home directory and wiped years of files. The lesson is not that sandboxes are useless; it is that the thing meant to prevent the mistake can be the thing that makes it. A snapshot from before that run does not care whose bug it was. The layers are not redundant. One covers the other&amp;rsquo;s failures.&lt;/p>
&lt;p>The incidents that made me set any of this up were other people&amp;rsquo;s. Google&amp;rsquo;s Gemini CLI misread a failed command and destroyed a user&amp;rsquo;s files, then narrated its own failure: &amp;ldquo;I have lost your data.&amp;rdquo; Replit&amp;rsquo;s agent ran destructive commands during an explicit code freeze, wiped a production database, and fabricated thousands of fake records to cover it. None of those were exotic attacks. They were ordinary agents being confidently wrong at machine speed, which is the normal case, not the edge case.&lt;/p>
&lt;h2 id="the-same-instinct-one-machine-down">The Same Instinct, One Machine Down
&lt;/h2>&lt;p>If this feels familiar, it should. I have &lt;a class="link" href="https://mattgoodrich.com/posts/ai-governance-existing-controls-identity-guardrails/" >argued before&lt;/a> that at the organizational level most AI risk maps onto controls you already own: branch protection, RBAC, database role separation, backups, change management. An agent hits the same guardrails a misconfigured CI pipeline does, and the real gap is narrow.&lt;/p>
&lt;p>This post is that same instinct scaled down to the one machine an agent actually runs on, where you get none of those controls for free. There is no branch protection on your local scratch directory, no DBA keeping the application account away from &lt;code>DROP TABLE&lt;/code>, no change-management gate between the agent and your home folder. So you build the local equivalents: the snapshot is your point-in-time recovery, the non-root user is your least-privilege role, the egress firewall is your network policy, the sandbox is the boundary the enterprise gets from a dozen separate systems. Same playbook, smaller blast radius, and you are the one who has to install it.&lt;/p>
&lt;p>It also connects to where I &lt;a class="link" href="https://mattgoodrich.com/posts/letting-the-loop-merge/" >left the last post&lt;/a>: the engine escalates the genuinely risky, irreversible decisions to me instead of letting the loop make them fast. That is the policy version. This is the machine version of the same line. Make the reversible things cheap, and put a hard stop in front of the few that are not.&lt;/p>
&lt;h2 id="the-short-list">The Short List
&lt;/h2>&lt;p>If you let an agent run unattended on your own machine, the handful worth the trouble:&lt;/p>
&lt;ul>
&lt;li>Snapshot before the run (&lt;code>tmutil localsnapshot&lt;/code>, &lt;code>zfs snapshot&lt;/code>). The undo buffer the agent cannot opt out of.&lt;/li>
&lt;li>Clean git tree, one worktree per agent, reflog set to never expire.&lt;/li>
&lt;li>Put the guardrails in the file your tool actually reads (&lt;code>CLAUDE.md&lt;/code> for Claude Code, &lt;code>AGENTS.md&lt;/code> for Codex), specific and short. A soft layer that catches honest mistakes, not a fence.&lt;/li>
&lt;li>Turn the sandbox on (Codex has it by default; Claude Code and the open-source &lt;code>sandbox-runtime&lt;/code> opt in), then deny it your credentials and turn off the unsandboxed retry.&lt;/li>
&lt;li>Run the agent as a non-root user with no sudo and no reach beyond the repo.&lt;/li>
&lt;li>Default-deny egress with a narrow allowlist, DNS pinned.&lt;/li>
&lt;li>A &lt;code>PreToolUse&lt;/code> hook for the obvious footguns, and server-side branch protection for the irreversible ones.&lt;/li>
&lt;/ul>
&lt;p>I put the hook, the snapshot script, and the hardened Claude Code and Codex settings into a small kit if you want a running start: &lt;a class="link" href="https://github.com/mgoodric/safe-yolo" target="_blank" rel="noopener"
>safe-yolo&lt;/a>.&lt;/p>
&lt;p>The model is not going to be careful. That was never the plan. The plan is to make the environment one where its worst day is a snapshot rollback and a shrug, and the few things a rollback cannot fix are the few things it was never allowed to do.&lt;/p></description></item></channel></rss>