{"id":94,"date":"2026-07-14T18:29:51","date_gmt":"2026-07-14T18:29:51","guid":{"rendered":"https:\/\/oliverng.com\/ai\/?p=94"},"modified":"2026-07-14T18:54:56","modified_gmt":"2026-07-14T18:54:56","slug":"a-day-of-claude-workflows","status":"publish","type":"post","link":"https:\/\/oliverng.com\/ai\/2026\/07\/14\/a-day-of-claude-workflows\/","title":{"rendered":"A day of Claude workflows"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I tried to come up with a scenario to try out <a href=\"https:\/\/code.claude.com\/docs\/en\/workflows\">Claude Dynamic Workflows<\/a>, a deterministic way to manage processes for subagents. Claude recommends you use them for large scale activities that benefit from multiple agents. I wanted to understand how it is different from <a href=\"https:\/\/code.claude.com\/docs\/en\/agent-teams\">Claude Agent Teams<\/a>, which, is easy to forget <em>also<\/em> exists.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One noticeable difference, is that agent teams shares context within the group. Workflow agents do not and act independently on the prompt.  Workflows are also programmatic.  Their sequence of actions are managed through python code + prompts.  This  allows you to deterministically define workflow and results.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I thought it would be fun to take advantage of this knowledge and use it as a way for AI to reason about security risk.   <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A common argument in Cybersecurity, is risk.  You have a vulnerability, we have to quantify the risk.  Not always trivial.  Fights ensue.  People say that it will never happen.  They say the architecture does not allow it.  They say controls exist.  Everyone comes with their independent views.  I took these horrible memories of my career, and built an agent workflow that could <strong>debate risk<\/strong> &#8211; in hopes I would never have to live it again.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kidding aside, it was a fun experiment.  LLMs are great at grounding themselves into a specific viewpoint, taking context, and providing a result.  So I made a roundtable of tech personalities that can repeatedly play out my worst nightmares.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Panel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The roles I chose were a Security Analyst, a Business Owner, and an Architecture Lead.  These three signify typical friction I&#8217;ve seen  where each debate from their own area of accountability. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Security Analyst<\/strong>:  Argues for stronger controls and higher severity where evidence supports it. Accountable for what happens if the risk is realized. They are normalized by ensuring they are not simply debating that all risk is critical risk but to be defensible and grounded.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Business \/ Product Owner<\/strong>: Optimizes for time-to-market, user friction, and opportunity cost. Argues for acceptance, deferrals, or compensating controls.  Accountable for the cost of not shipping, including security costs of users staying on worse legacy systems.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Architecture<\/strong>: What can be built and run, and what each control costs in complexity, blast radius, and operational burden. Often the tie-breaker \u2014 surfaces that a control Security wants may be infeasible as stated but achievable in another form.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">I thought it would be interesting to have additional roles that clean up the debate and tie-break. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Chair<\/strong>: Summarize key debate items. Takes no side.  Translates the risk debate items from technical language into common human language.  This Chair will help summarize the &#8220;agent talk&#8221; so that I can understand what&#8217;s being said and debated.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Skeptic<\/strong>: Acts to be &#8220;that guy&#8221; that only has negative things to say.  Will debate the specific controls, proposals, risks to find counter-points against the role proposing the item.  It reinforces a sanity check to re-think on ideas.  Protects against LLM &#8220;making stuff up and confirming their own behaviour&#8221;.  Adds rigor to analysis.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When running the workflow, the idea is to provide a risk statement to the panel.  As with all LLMs, the more context, the better.  I provide a scenario, describing the system, then provide a security finding and recommendation.  It&#8217;s like an everyday scenario, where a security guy walks into a room with the product team and goes over findings.  I gave it something like below (shortened).<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-medium-font-size\" style=\"padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--40)\">Scenario: a cloud-native multi-tenanted SaaS product, generates customer reports with regulated PII, and store these reports in a cloud storage container.<br><br>Risk Question: A control requiring tenant-wide customer-managed keys (CMK) is not in place.  Should we block the product team from going live with platform-managed keys, or risk-accept it.<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">I like this question because I find the use of CMK contentious. It is one of those items where so many people feel it is over-engineering security, given that we are encrypting encrypted data. But everyone typically agrees that a regulatory bodies will not accept that a &#8220;platform&#8221; holds your encryption key and is a party to the regulated data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The workflow ran and the outcome of the Agent debate was entertaining.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-preformatted has-medium-font-size\" style=\"margin-top:0;margin-bottom:0;padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)\"><br>Security.  Block.  <br><br>Rationale: One key compromise = full tenant exposure in a regulated industry.  At least block until production team  commits to implementation date.<br><br>Trade-off: Understands CMK is ops work, but won't back down due to regulated data.<br><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-preformatted has-medium-font-size\" style=\"padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)\">Business. Accept.<br><br>Rationale: Revenue is blocking on go-live.  Feels this is a LOW risk as platform managed key still encrypts data at rest.  Referenced a compensating control of customer having a contract in place, IP-allowlisting, per-customer tokens and 24h data purge.<br><br>Trade-off: Delayed revenue for a quarter, acknowledged case relies on allow-listing to be implemented per customer as contract states.<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-preformatted has-medium-font-size\" style=\"padding-right:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--60)\">Architecture. Partial. Tie-break.<br><br>Rationale: Agrees with security but agrees with product that while tenant-wide CMK is not feasible in the time period, an alternative of store specific CMK is doable.<br><br>Trade-off: PMK acceptance today will be costly later down the line with full CMK.<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>I love this.  <\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is like playing The Sims, watching agents argue with each other about my typical security life.  Except I have zero stakes in the discussion. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Seeing the arguments reflected in appropriate standpoints shows me how I can use LLMs to help iterate on decisions and be more open minded in my analysis.  There&#8217;s more and this is where the role of the skeptic and chair come in.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-preformatted has-medium-font-size\" style=\"padding-top:0;padding-right:var(--wp--preset--spacing--50);padding-bottom:0;padding-left:var(--wp--preset--spacing--50)\">Skeptic.  Refute the lowering of risk.<br><br>Rationale: States that there is no proof that the allow-list is in place.  The product agent stating that the risk is lowered, as a compensating control, is unproven.  The panel needs to demonstrate the allow-list is in place with configuration evidence.<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-preformatted has-medium-font-size\" style=\"padding-right:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--50)\">Chair.<br><br>Surfaced: the allow-list is a contentious issue and will change the risk between a medium vs high.  It should be confirmed.<br><br>Proposal: Recommend CMK on the storage today, with full CMK later. Architecture's proposal is a good middle ground.<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">I like how the skeptic played its role in calling out a common scenario where teams will say &#8220;Well, we have this in place.&#8221; and then security to say &#8220;Show me.  I didn&#8217;t see that in my data.&#8221;  And the chair also played its role in not providing a stance, but to give that &#8220;management view&#8221; of analyzing the whole debate and saying, well this makes sense, this is the pragmatic recommendation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The table the workflow generated as a summary.  A nice touch was it generated a new security requirement too:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Summary<\/td><td>Do not accept PMK as-is. Take Architecture&#8217;s middle path: enable CMK on the export store now, and defer only per-tenant key isolation. <br><br>The risk is High today because the likelihood-reducing controls Business proposed are unverified.<\/td><\/tr><tr><td>Rating<\/td><td>High \u2013 likelihood Medium x impact High. Would drop to Medium only if the IP allow-list enforcement is confirmed.<\/td><\/tr><tr><td>Recommended decision<\/td><td>Mitigate by compensating control (CMK-on-store + SAS + 24h purge) now; defer per-tenant key isolation to next quarter.<\/td><\/tr><tr><td>REQ-NEW <\/td><td>Export store must enforce IP allow-listing.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I should add that I added a risk rating rubric to ensure that risks were following a standard and deterministic method.  The Agent Workflow is programmed to use this rubric when evaluating risk across all sub-agents.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Closing Thoughts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Long post. I really enjoyed this experiment.  There is a lot more that can be done here too.  We could have additional agents that go out and search for real-world examples of security issues being debated, CVEs, more personas, etc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, I should add that while this was an experiment for Claude Workflows, Agent Teams can also execute the same task.  In fact, my workflow allows for both a &#8220;Quick&#8221; mode using Agent Teams and a &#8220;Full&#8221; mode using Workflows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Agent teams, will use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>shared context <\/li>\n\n\n\n<li>parallel agents<\/li>\n\n\n\n<li>repeatable via best-effort basis <\/li>\n\n\n\n<li>recommended output formats.<\/li>\n\n\n\n<li>cheaper<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Workflows, will use: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>separate agent contexts<\/li>\n\n\n\n<li>structural independence <\/li>\n\n\n\n<li>deterministic, auditable, repeatable <\/li>\n\n\n\n<li>dedicated agent pass by the skeptic <\/li>\n\n\n\n<li>outputs enforced by schema.<\/li>\n\n\n\n<li>expensive, as it will spawn multiple agents + overhead orchestration agents<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The auditable part of Claude Workflows is unique.  Workflows give you a structured run journal, that provides a view of exactly what was done and when, compared to agent teams, that only provides a conversation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Workflows is more costly.  My experimenting on Opus 4.8 has shown about 35% cost overhead but depending on how important having a deterministic, agent orchestrated run is to you, that may be acceptable.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>I tried to come up with a scenario to try out Claude Dynamic Workflows, a deterministic way to manage processes for subagents. Claude recommends you use them for large scale activities that benefit from multiple agents. I wanted to understand how it is different from Claude Agent Teams, which, is easy to forget also exists. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-94","post","type-post","status-publish","format-standard","hentry","category-experimenting"],"_links":{"self":[{"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/posts\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/comments?post=94"}],"version-history":[{"count":27,"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/posts\/94\/revisions"}],"predecessor-version":[{"id":161,"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/posts\/94\/revisions\/161"}],"wp:attachment":[{"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/media?parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/categories?post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/oliverng.com\/ai\/wp-json\/wp\/v2\/tags?post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}