<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://foobarto.me//feed.xml" rel="self" type="application/atom+xml" /><link href="https://foobarto.me//" rel="alternate" type="text/html" /><updated>2026-04-23T18:48:57+00:00</updated><id>https://foobarto.me//feed.xml</id><title type="html">foobarto.me</title><subtitle>Personal site and tech blog of Bartosz Ptaszyński — notes on security, programming, technology, and the occasional detour through science.</subtitle><author><name>Bartosz Ptaszyński</name><email>bartosz@foobarto.me</email></author><entry><title type="html">AI killed Agile, long live Waterfall</title><link href="https://foobarto.me//blog/2026/ai-killed-agile-long-live-waterfall/" rel="alternate" type="text/html" title="AI killed Agile, long live Waterfall" /><published>2026-04-23T00:00:00+00:00</published><updated>2026-04-23T00:00:00+00:00</updated><id>https://foobarto.me//blog/2026/ai-killed-agile-long-live-waterfall</id><content type="html" xml:base="https://foobarto.me//blog/2026/ai-killed-agile-long-live-waterfall/"><![CDATA[<p>For twenty years, “Agile vs Waterfall” has been a rigged debate. You were either shipping biweekly with story points and retros, or you were a dinosaur writing 80-page requirements docs nobody would read. One was engineering; the other was malpractice. The jokes wrote themselves.</p>

<p>Here’s the thing. The jokes are aging badly.</p>

<p>Not because Agile was wrong — it was right for the problem it was solving. But the problem has quietly changed underneath it, and a lot of teams haven’t noticed. The economics that made Agile inevitable in 2005 don’t hold anymore. What’s coming back in its place looks, from a squint, an awful lot like the thing we all laughed at.</p>

<h2 id="why-agile-won">Why Agile won</h2>

<p>Agile won because predicting software was a disaster. You’d write a spec for a six-month project and by month two you’d discover a whole subsystem you didn’t know existed, a library that didn’t do what the docs claimed, an integration that needed three times the code you estimated. The requirements would shift under you anyway because the business didn’t really know what it wanted until it saw something running.</p>

<p>So we gave up on prediction. Short cycles. Working software over comprehensive documentation. Respond to change over following a plan. The Agile Manifesto wasn’t a methodology, it was a surrender — a graceful one. If you can’t see far, don’t plan far. Take a step, look around, take another step.</p>

<p>This was the correct response to a specific constraint: <strong>writing code was expensive, and figuring out what to write was almost free by comparison.</strong> Planning meetings, specs, design docs — those were cheap. Actually building the thing was the bottleneck. So you optimized by building the smallest useful thing, seeing what you learned, and adjusting.</p>

<p>The ratio mattered. Exploration was cheap, execution was expensive, so you kept execution tight and let exploration wander.</p>

<h2 id="what-ai-changes">What AI changes</h2>

<p>Flip the ratio.</p>

<p>With a competent coding agent, writing the code is no longer the bottleneck. You can describe a feature at breakfast and have a working implementation by lunch. Not always good, not always right, but <em>working</em>. Three implementations if you want to compare them. The “can we even build this” question, which used to eat sprints, now eats afternoons.</p>

<p>What’s expensive now? Knowing what to build. And — this is the part people are still catching up to — <em>specifying it precisely enough that the fast execution produces something coherent.</em></p>

<p>An agent will happily generate 4,000 lines of code from a vague prompt. The code will run. It will also be the wrong abstraction, ignore the three constraints you forgot to mention, and quietly invent APIs that don’t exist. The bottleneck isn’t typing anymore. It’s thinking clearly enough that a fast, literal, tireless collaborator doesn’t faithfully execute your confusion at scale.</p>

<p>This is the reversal. Exploration is now the expensive part. Execution is cheap. And when execution is cheap, the value of getting the plan right <em>before</em> you execute goes way up.</p>

<h2 id="the-return-of-the-design-doc">The return of the design doc</h2>

<p>Watch what the people building seriously with AI actually do. They’re not typing <code class="language-plaintext highlighter-rouge">please build me a web app</code> into an agent and calling it a day. They’re writing specs. Long, carefully-considered specs. <code class="language-plaintext highlighter-rouge">DESIGN.md</code>. <code class="language-plaintext highlighter-rouge">PLAN.md</code>. Architecture decisions written out in prose before a single file is generated. Threat models. Sequencing docs. Capability boundaries spelled out in English because the agent needs them spelled out in English.</p>

<p>The artifact that matters has shifted. It used to be the code — the code was the truth, the spec was a lie people told themselves at the start of a project. Now the spec is where the thinking happens, and the code is a compilation target. A cheap one. Rerunnable.</p>

<p>This is Waterfall, or at least Waterfall’s ghost. Not the cartoon version where a BRD gets thrown over a wall to engineers who throw binaries over another wall to users. The underlying instinct: think carefully, write it down, then build. The reason it failed in the 90s was that the “then build” step took two years and the world moved on. The reason it’s viable now is that the “then build” step takes a weekend.</p>

<h2 id="what-waterfall-looks-like-in-2026">What “Waterfall” looks like in 2026</h2>

<p>It doesn’t look like a Gantt chart.</p>

<p>It looks like a single engineer spending three days on a design doc and four hours on implementation. It looks like spec-driven development where the spec is the repo’s most-edited file. It looks like PRs where the interesting review comment is on the architecture markdown, not on the code. It looks like product work where you iterate on <em>the description of the feature</em> through a dozen revisions before anyone writes a test.</p>

<p>Short feedback loops haven’t gone away — they’ve moved upstream. The loop used to be: ship, measure, learn, adjust the backlog. Now the loop is: spec, generate, read, adjust the spec. You can run that loop five times in an afternoon. You’re still being agile in the lowercase sense. You’re just doing it in the design phase, because the design phase is now where the uncertainty lives.</p>

<h2 id="what-this-means-for-teams">What this means for teams</h2>

<p>The uncomfortable part. A lot of Agile ceremony was scaffolding for the fact that individual engineers couldn’t be trusted to plan the whole thing — not because they were bad, but because planning the whole thing was genuinely impossible. Sprints, standups, and story points were risk-management for a world where humans wrote every line by hand and drifted in predictable ways.</p>

<p>When one person with a clear spec can produce what used to take a team a quarter, the ceremony starts looking expensive. Not useless — expensive. A standup where four people sync on yesterday’s tickets is a fine ritual when everyone’s producing at human speed. It’s a strange ritual when one of them shipped the feature overnight and the other three are still describing theirs.</p>

<p>The teams that seem to be winning right now are doing something that looks almost old-fashioned: small groups, lots of writing, careful sequencing, long thinking phases, fast execution phases. They have strong opinions about architecture before they touch a file. They push the uncertainty into the design, not the sprint.</p>

<h2 id="the-long-live-part">The long live part</h2>

<p>Waterfall isn’t literally coming back. The thing it got wrong — betting a year of work on a spec written before you knew anything — is still wrong. Specs are still usually wrong on the first pass. The difference is that the cost of being wrong has collapsed. You write the spec, generate the system, read it, realize the spec was incomplete, fix the spec, regenerate. The loop that used to take eighteen months takes an afternoon.</p>

<p>What we’re converging on doesn’t have a clean name yet. Spec-driven. Design-first. Intent-oriented. Pick your poison. It borrows Waterfall’s seriousness about thinking before building and Agile’s humility about not knowing the answer up front. It’s less a methodology than a new ratio: planning is expensive again, execution is cheap, and the practices that survive will be the ones that respect that.</p>

<p>Agile won the last war. That war is over. The code is writing itself now. Someone still has to decide what it should say.</p>]]></content><author><name>Bartosz Ptaszyński</name><email>bartosz@foobarto.me</email></author><category term="programming" /><summary type="html"><![CDATA[For twenty years, Agile vs Waterfall has been a rigged debate. You were either shipping biweekly with story points and retros, or you were a dinosaur writing 80-page requirements docs nobody would read. One was engineering; the other was malpractice. The jokes wrote themselves. Here's the thing. The jokes are aging badly.]]></summary></entry><entry><title type="html">You are holding it wrong</title><link href="https://foobarto.me//blog/2026/you-are-holding-it-wrong/" rel="alternate" type="text/html" title="You are holding it wrong" /><published>2026-04-22T00:00:00+00:00</published><updated>2026-04-22T00:00:00+00:00</updated><id>https://foobarto.me//blog/2026/you-are-holding-it-wrong</id><content type="html" xml:base="https://foobarto.me//blog/2026/you-are-holding-it-wrong/"><![CDATA[<p>There’s a growing genre of developer blog post: the AI slop rant. You’ve read them, maybe written one. Pull requests that compile and pass tests and do nothing the ticket asked for. Documentation that the submitter clearly hasn’t read. Open source maintainers burning out under a tide of drive-by contributions from people who can’t answer basic questions about the code they just submitted. Emojis in comments. Invented APIs. Four thousand lines where forty would do.</p>

<p>The rants are not wrong.</p>

<p>A recent qualitative study out of Heidelberg, the University of Melbourne, and Singapore Management University analyzed over a thousand Hacker News and Reddit posts tagged “AI slop” and found a consistent theme: developers describe the phenomenon as a tragedy of the commons, where one person’s velocity gain becomes five reviewers’ cleanup bill. Rémi Verschelde, who maintains the Godot game engine, has publicly described the influx of AI-generated contributions as draining and demoralizing. Mitchell Hashimoto, the HashiCorp founder, has built a vouching system — currently being piloted on his Ghostty project — specifically because AI tools have made it trivial to generate plausible-looking but hollow contributions. The Gentoo Linux distribution is migrating off GitHub to Codeberg. This is not a vibes problem. It is a real, measurable externality being absorbed by the people at the end of the PR queue.</p>

<p>But I want to offer an unfashionable observation. The problem isn’t the tool. It has never been the tool. Look at who’s actually producing the slop — and, more tellingly, look at who isn’t.</p>

<h2 id="the-quiet-other-side">The quiet other side</h2>

<p>Simon Willison, co-creator of the Django web framework, has been publishing his AI-assisted development workflow in public for close to three years. He recently wrote a detailed walkthrough of building a custom colophon page for his tools site: conception to deployed feature in just over seventeen minutes, total Anthropic API cost, sixty-one cents. The code was reviewed. The tests were run. He understood every line, which is why he could step in and finish the last bit by hand when the model got stuck on a GitHub Actions quirk. Nobody in the Datasette community is writing angry blog posts about how Simon’s PRs are destroying their review process.</p>

<p>Kent Beck — <em>the</em> Kent Beck, co-author of the Agile Manifesto, inventor of Extreme Programming, pioneer of test-driven development — spent a chunk of 2025 building a B+ Tree library called BPlusTree3 in Rust and Python using what he calls augmented coding. The result: production-competitive performance, with the Rust implementation matching standard library benchmarks and outperforming them on range scans. He describes the process not as letting the machine run wild but as intervening constantly — watching for warning signs, stopping the agent the moment it starts generating functionality he didn’t ask for, treating unexpected test deletions as red flags. He’s also been explicit that juniors working this way — augmented, not vibe-coding — ramp onto codebases dramatically faster than before, because the AI collapses the search space for “which library should I even use” down from hours to minutes, freeing time for actual learning.</p>

<p>Armin Ronacher, creator of Flask and previously VP of Platform at Sentry, now runs a startup called Earendil with a small team plus what he openly refers to as AI interns. His thirty-seven-minute talk on agentic coding walks through a workflow in which he ships features with Claude Code running with broad permissions inside a Docker container. He’s delegating real work, not supervising every token. His stated philosophy: keep the context system simple, keep the feedback loops observable, avoid tool sprawl, assume the agent will be lazy about whatever friction you introduce. He’s not complaining about slop. He’s also not producing it.</p>

<p>Tobias Lütke, the Shopify CEO, has a publicly visible GitHub contribution graph that spiked last autumn when coding agents crossed a real capability threshold. He’s shipping code again, for the first time in years, because an agent lets him fit real programming work into the cracks of being a CEO — including a recent autoresearch plugin built alongside a collaborator, with the agent maintaining state in a structured JSONL file across sessions.</p>

<p>There’s a developer named Lalit who had been procrastinating on a SQLite parser and linter project for years — four hundred grammar rules of tedious work that every would-be contributor bounces off — and finally shipped the prototype with Claude Code’s help. The reception in the community has been enthusiasm, not complaint.</p>

<p>You could extend this list. Andrej Karpathy. The long tail of indie developers shipping side projects that, five years ago, simply wouldn’t have existed because the cost of getting started was too high. None of these people are villains in the AI slop discourse. None of them are slowing down the people around them. Their names come up in the positive examples, not the complaints.</p>

<h2 id="the-diagnosis">The diagnosis</h2>

<p>So what’s different? It’s not the model. Simon, Kent, Armin, and the people writing angry blog posts are using roughly the same tools — Claude Code, Cursor, Codex, some mix. It’s not even the prompting technique. Most of the patterns are public; Simon has been documenting them for years.</p>

<p>The difference is that the people who ship quality AI-assisted work treat the output as <em>their</em> output. They read it. They test it. They know why every function exists and what happens when it breaks. Simon Willison has made a useful distinction: having an LLM generate every line of your code is not the same thing as vibe coding — provided you actually review, test, and understand what came out. One is using the model as a very fast typist. The other is abdicating. The word he’s landed on for the responsible version, <em>vibe engineering</em>, is ugly on purpose — it refuses the cleanness of pretending there’s a category of serious AI use that doesn’t involve serious human judgment.</p>

<p>The developer who drops four thousand lines of generated code into a PR with a ticket number and a shrug is not losing a fight with their tool. They’re losing a fight with the expectation that engineers understand what they ship. That expectation predates LLMs by about fifty years. It’s not an AI problem. It’s an accountability problem wearing an AI costume.</p>

<h2 id="why-the-backlash-is-correct-anyway">Why the backlash is correct anyway</h2>

<p>None of this is an argument that the slop complaints are wrong to be loud. They are exactly as loud as they need to be. When the cost of producing plausible-looking work collapses, the ratio of serious work to performative work gets harder to read from the outside. Reviewers, maintainers, and teammates end up absorbing the evaluation that the submitter should have done. That’s a real cost, and venting about it is how a community establishes new norms in real time.</p>

<p>But the framing — <em>this tool is ruining our craft</em> — is diagnostically off. The tool is exposing something about the craft that was already there. The person who now submits four thousand lines of generated code is, in most cases, the same person who would have submitted four hundred lines of Stack Overflow copy-paste a decade ago with slightly more friction. What’s changed is the <em>spread</em>. The gap between the best and worst practitioners on any given task has widened, because the tool amplifies whatever judgment the user brings. If you have taste, you ship in a morning what used to take a week. If you don’t, you now generate in a morning what it takes a reviewer a week to unpick.</p>

<p>The quiet pattern in all the positive examples above is the same pattern visible in any good senior engineer’s workflow for the last thirty years: clear intent going in, a short feedback loop, honest reading of the output, willingness to throw it away when it’s wrong. The people who already had those habits got a force multiplier. The people who didn’t, got exposed.</p>

<h2 id="the-boring-conclusion">The boring conclusion</h2>

<p>There’s a comfortable version of this debate where you pick a side — AI good, AI bad — and call anyone on the other one a shill or a Luddite. The actual situation is more annoying. The tool is real. The slop is real. The productivity gains are also real. The people producing high-quality AI-assisted work are not a rhetorical fiction invented by Anthropic’s marketing team; they have names and public output you can go read.</p>

<p>So the next time someone forwards you a rant about how AI is destroying code review, the right response isn’t to defend the tool. It’s to ask who wrote the PR.</p>

<p>Don’t blame the hammer. The hammer does exactly what the hand tells it to do. That’s the entire point of a hammer.</p>]]></content><author><name>Bartosz Ptaszyński</name><email>bartosz@foobarto.me</email></author><category term="ai" /><summary type="html"><![CDATA[There's a growing genre of developer blog post: the AI slop rant. You've read them, maybe written one. Pull requests that compile and pass tests and do nothing the ticket asked for. Documentation that the submitter clearly hasn't read. Open source maintainers burning out under a tide of drive-by contributions from people who can't answer basic questions about the code they just submitted. Emojis in comments. Invented APIs. Four thousand lines where forty would do. The rants are not wrong.]]></summary></entry><entry><title type="html">The threat model nobody reads</title><link href="https://foobarto.me//blog/2026/threat-model-nobody-reads/" rel="alternate" type="text/html" title="The threat model nobody reads" /><published>2026-04-20T00:00:00+00:00</published><updated>2026-04-20T00:00:00+00:00</updated><id>https://foobarto.me//blog/2026/threat-model-nobody-reads</id><content type="html" xml:base="https://foobarto.me//blog/2026/threat-model-nobody-reads/"><![CDATA[<p>Every appsec engineer has a folder. Mine lives in a Confluence space; yours might be in a git repo, a shared drive, or the bottom of someone’s laptop. Inside are threat models. Maybe a dozen of them. Some are good. Some were good once. Most were last edited during the feature’s original design review and haven’t been opened since, unless somebody wanted to reference them in a compliance questionnaire.</p>

<p>This is the dirty secret of threat modeling. It’s universally acknowledged as the highest-leverage security activity a team can do — finding a design flaw on a whiteboard costs roughly a hundredth of what it costs to fix in production — and it’s universally underused. Not because people don’t know about STRIDE. Not because they don’t have Threat Dragon or the Microsoft tool or IriusRisk. They do the exercise once, get something valuable out of it, and then the thing rots.</p>

<p>There are two separate failure modes here, and they’ve been the same two failure modes for fifteen years. It’s worth pulling them apart before talking about what AI actually changes.</p>

<h2 id="problem-one-the-first-draft-is-expensive-and-boring">Problem one: the first draft is expensive and boring</h2>

<p>A proper threat model for a non-trivial service takes somewhere between one and eight days of senior effort. That’s not a vendor statistic; that’s the range I’ve watched teams hit, and it matches the published numbers. You pull the architect, a senior dev, and someone from appsec into a room (or a call) for a few sessions. You draw the DFD. You walk every data flow through six STRIDE lenses. You write down a mitigation for each credible threat. You score them. You end up with a forty-page document.</p>

<p>The output is almost always useful. The process is almost always miserable. Developers tolerate it once, learn the shape of the questions you’ll ask, and quietly route around it the second time. The feedback loop is brutal: you spend two days in workshops, two days writing, and the team gets back a document with one hundred and forty threats in it, of which maybe twenty will ever materially change their design.</p>

<p>Nobody on the product side wakes up excited to threat-model. And — this is the part security people sometimes miss — they shouldn’t have to. The process as traditionally practiced is optimized for completeness, not for the developer’s time. That’s backwards. The scarce resource is the developer’s attention, not the threat catalog.</p>

<h2 id="problem-two-day-two">Problem two: day two</h2>

<p>Assume you solve problem one. You get a beautiful threat model committed on day zero. What happens next?</p>

<p>The service adds a new upstream dependency. Two weeks later, someone swaps the auth library. A month after that, a queue gets introduced between two services that used to talk synchronously. A quarter in, there’s a new admin endpoint that bypasses the main API gateway because someone needed a quick internal tool. Each of these changes, on its own, is a small delta. Together, over six months, they turn the threat model into a document that describes a system that no longer exists.</p>

<p>Stale threat models are worse than no threat model, because they create false confidence. Auditors see the green checkmark. Engineers see a diagram that doesn’t match their mental model of the service and conclude the whole exercise is security theater. The model’s authority collapses the first time a developer catches it being wrong about something they know cold.</p>

<p>The “threat model as code” movement — keeping the model in YAML next to the application code, version-controlling it, regenerating diagrams from the source of truth — was a real and necessary step forward. It made threat models diffable. It put them in PRs. But it didn’t solve the problem. It turns out a YAML file that nobody updates rots exactly as fast as a Confluence page that nobody updates. Putting the model in git was necessary but not sufficient.</p>

<h2 id="where-the-agent-actually-helps">Where the agent actually helps</h2>

<p>Here’s the part where most blog posts on this topic get breathless, so let me be boring about it. AI does not replace the security engineer’s judgment. A model that doesn’t understand your architecture will happily generate fifty plausible-sounding threats that don’t apply to your system, and an appsec engineer who ships that catalog to the dev team has just made everything worse.</p>

<p>But there are three specific places in the threat modeling lifecycle where an agent, used by someone who knows what they’re looking at, closes a gap that tooling has not been able to close before.</p>

<p><strong>The first draft.</strong> Give an agent read access to a repository — the actual code, the IaC, the service dependencies, the existing architecture docs if any — and ask it to produce a STRIDE-ordered first pass. Not the final model. The strawman. What you get is not authoritative, but it’s a lot more grounded than a blank page at the start of a workshop. You walk into the session with a diagram that already matches the code, a list of trust boundaries the agent inferred from how services actually call each other, and forty candidate threats with proposed mitigations. Your job in the workshop shifts from “enumerate everything that could go wrong” to “confirm, correct, and prioritize.” That changes the developer experience completely. It also compresses a week of work into an afternoon. Not because the agent did the thinking — you still do the thinking — but because the mechanical parts of the exercise are no longer yours.</p>

<p><strong>The delta review.</strong> This is the interesting one. Plug an agent into your PR workflow with the threat model checked into the repo and a simple rule: on every PR, compare the diff against the current model. Flag the ones that touch a trust boundary, introduce a new data flow, change an authentication path, or add an external dependency. For everything else, stay quiet. What you get is a bot that behaves the way a senior appsec engineer would if they had infinite time and read every PR in the organization. Ninety-five percent of PRs generate no comment. The five percent that do get a comment that looks like: <em>this PR adds a new endpoint that accepts unauthenticated input from a partner network. The current threat model documents two entry points behind the gateway; this is a third. Relevant threats from the model: T-014 (auth bypass), T-022 (input validation on partner-trusted data). Consider updating §3.2.</em> That is signal. That is what dev teams will actually read.</p>

<p><strong>The drift check.</strong> Run the agent periodically against the live codebase and the threat model, and ask it to identify divergence. Not to generate a new model — to point at specific places where the model and the code disagree. The service talks to a Redis the model doesn’t know about. The gateway the model claims to protect two endpoints now protects five. The auth middleware has been rewritten and the assumptions the model makes about session handling no longer hold. These findings don’t auto-fix the model; they become tickets. The appsec engineer triages them during quarterly model review — which, incidentally, now takes a day instead of a week, because the divergence is pre-catalogued.</p>

<p>None of this is conceptually novel. All three of these things were theoretically possible with rule-based static analysis. The reason they never worked in practice is that the rules didn’t generalize across architectures, and maintaining them was a full-time job of its own. An agent reading code with context handles the generalization problem cheaply enough that the economics finally line up.</p>

<h2 id="skills-as-the-encoding-of-your-specific-knowledge">Skills as the encoding of your specific knowledge</h2>

<p>The piece that makes this actually work in a real organization, rather than in a blog post, is the part where the agent knows <em>your</em> environment. Generic threat modeling advice is a commodity. What’s valuable is your org’s accumulated knowledge: the attack patterns that keep showing up in your sector, the shape of your standard mitigations, the things your compliance team actually cares about, the libraries you’ve blessed, the ones you’ve banned.</p>

<p>This is where the emerging skills pattern — a <code class="language-plaintext highlighter-rouge">SKILL.md</code> or equivalent that tells the agent how to do a specific task in your specific context — becomes genuinely useful for appsec work rather than being another vendor buzzword. Your threat-modeling skill is a living document in the same repo as the application. It encodes: the STRIDE-plus-your-additions checklist the team actually uses, the mitigation library with your approved controls, the threats that are explicitly out of scope because the platform handles them, the format you want the output in, the tone. When you iterate on your threat modeling practice — and you should, constantly — you edit the skill, and every subsequent run benefits. The skill is the place where institutional knowledge stops living in the appsec team’s heads and starts being applied at PR speed.</p>

<p>You can do similar things for pen-test scoping, for SOC2 evidence collection, for triaging SAST findings. The common pattern is the same: write down the thing your team has learned to do well, give it to the agent, and let the agent apply it consistently across surface area you could never cover by hand.</p>

<p>A handful of public examples already exist if you want to see what these look like in practice. <a href="https://github.com/tiffanymwr15/Threat-Model-Skill-for-Claude-Code">tiffanymwr15/Threat-Model-Skill-for-Claude-Code</a> is a small, focused skill that walks through framework selection, asset enumeration, and STRIDE/OWASP threat identification before producing a structured report — a good starting template if you want to see the shape of a single-purpose skill. <a href="https://github.com/fr33d3m0n/threat-modeling">fr33d3m0n/threat-modeling</a> is more ambitious: an eight-phase workflow covering threat modeling, security testing, and compliance, with explicit CI/CD integration hooks. Trail of Bits has published a set of security-focused skills in the community <a href="https://github.com/VoltAgent/awesome-agent-skills">awesome-agent-skills</a> catalog — their <code class="language-plaintext highlighter-rouge">differential-review</code> skill in particular maps cleanly onto the PR-delta pattern I described above. For a broader library, <a href="https://github.com/mukul975/Anthropic-Cybersecurity-Skills">mukul975/Anthropic-Cybersecurity-Skills</a> collects several hundred cybersecurity skills mapped to MITRE ATT&amp;CK, NIST CSF, D3FEND, and the NIST AI RMF — more than any one team will use, but a useful reference for how skills can be tagged and organized against existing security frameworks.</p>

<p>These are community efforts, quality varies, and treating any of them as turnkey is a mistake. Read them like you’d read any third-party security tool — as a starting point to fork and shape to your own environment, not as gospel. The real value shows up once a skill is specific to <em>your</em> codebase, <em>your</em> mitigation library, and <em>your</em> threat patterns. The open-source ones are there to steal patterns from.</p>

<h2 id="where-this-breaks">Where this breaks</h2>

<p>Some honest limits. The agent is not good at business-logic threats — the abuse cases that come from understanding what the product <em>does</em>, not just how it’s built. An agent can notice you’ve added an unauthenticated endpoint; it probably won’t notice that the combination of two authenticated endpoints lets a low-privilege user leak a high-privilege user’s data through a race condition in the feature spec. Those are still your job.</p>

<p>The agent is also, famously, confident when it shouldn’t be. If the model doesn’t understand the architecture, it generates threats that sound like threats. An appsec engineer who doesn’t read the output critically ends up shipping hallucinated risks to the dev team, which is the fastest way to destroy whatever goodwill the practice had built up. Rule of thumb: the threat catalog the agent produces is a draft for <em>you</em>, not for the developers. Developers see what you’ve reviewed and endorsed.</p>

<p>And finally: none of this removes the need for the workshop. The value of getting the architect, the dev, and the security person in a room for an hour is not that they’re collectively drawing a DFD. It’s that they’re arguing about what actually matters. The agent takes the drawing off the table so they can spend the hour on the argument. That’s the point.</p>

<h2 id="the-shape-of-the-change">The shape of the change</h2>

<p>Threat modeling has always had the right idea. Find the design flaws before they become code. The problem was never the concept; it was that the cost of doing it well, and doing it continuously, exceeded what any team was willing to pay. Static DFDs rotted. Threat-model-as-code made them diffable but didn’t make them self-maintaining. Every serious attempt to close the gap ran into the same wall: producing and maintaining a good model is a judgment-heavy, full-time job per product surface, and nobody has that headcount.</p>

<p>What changes with agents is the unit economics of that judgment. The security engineer’s attention is still the scarce input. What’s different is how much surface area one hour of that attention can cover — because the drafting, the diffing, and the drift detection have stopped being the expensive part.</p>

<p>The threat model nobody reads isn’t doomed to stay that way. It just needs to stop being a document and start being a living artifact the system checks itself against. We finally have the tools to build that. The only question is whether the hands holding them know what they’re looking for.</p>]]></content><author><name>Bartosz Ptaszyński</name><email>bartosz@foobarto.me</email></author><category term="threat-modeling" /><summary type="html"><![CDATA[Every appsec engineer has a folder. Mine lives in a Confluence space; yours might be in a git repo, a shared drive, or the bottom of someone's laptop. Inside are threat models. Maybe a dozen of them. Some are good. Some were good once. Most were last edited during the feature's original design review and haven't been opened since, unless somebody wanted to reference them in a compliance questionnaire.]]></summary></entry></feed>