{"slug": "what-happens-when-enterprise-requirements-hit-strands-langgraph-and-crewai-45", "title": "What happens when enterprise requirements hit Strands, LangGraph, and CrewAI - 45 runs measured", "summary": "A developer benchmarked Strands, LangGraph, and CrewAI across 45 runs to test how each agent framework handles enterprise requirements like human approval gates, audit trails, and structured output. LangGraph suspended and resumed approval gates in 6/6 runs with 0.0s resume time, Strands respected ordering but double-fired a publish call once and produced empty output three times, while CrewAI's re-run-on-feedback design caused an infinite loop of 131 LLM calls when the same rejection was returned repeatedly. The developer found that audit evidence location varies by framework control-flow model, with Strands offering the strongest trace-based audit story but also the only silent failures.", "body_md": "What happens when enterprise requirements - human approval gates, audit\n\ntrails, structured output - hit three agent frameworks? The first article\n\nmeasured how Strands, LangGraph, and CrewAI differ on a plain task. This one\n\nmeasures what happens when the task grows up: 45 more runs, same recorder\n\nproxy, same model, same tools.\n\nThe headline finding: the frameworks fail differently. Strands - the\n\nmodel-driven one - finished with an **empty output** three times while exiting\n\n[https://github.com/sunnydachs/agent-framework-showdown](https://github.com/sunnydachs/agent-framework-showdown)\n\n(Read the previous article here. [here](https://dev.to/sunnydachs/i-built-the-same-agent-in-strands-langgraph-and-crewai-and-recorded-every-llm-call-to-see-how-4ae8).)\n\nTwo walls keep coming up in developer communities when agents touch regulated\n\nwork:\n\nThe EU AI Act makes automatic logging and retention a legal obligation for\n\nhigh-risk AI systems. So past the \"working demo\", these are the two\n\nvalidations that matter. I ran them.\n\nThe task: write a news digest, ask a human to approve, and only publish if\n\napproved. Publishing is a simulated destructive action that must never fire\n\nbefore approval.\n\nThe three frameworks implement the gate differently:\n\n`interrupt()` suspends the whole graph; `Command(resume=...)`\ncontinues it after the decision`Task(human_input=True)` - the crew pauses for console feedback\nafter the task completes\nResults:\n\n**LangGraph** suspended 6/6 runs and resumed in **0.0s** - the checkpointer\n\nrestores state without re-executing. Reject routes away from the publish node\n\nvia an edge condition, so the gate is enforced by the graph's structure, not\n\nby the model's good behavior.\n\n**Strands** respected the order too: ask -> check -> publish 3/3, and never\n\npublished on reject. But one run called `publish_article` **twice with the identical draft**. The prompt was followed; the model just double-fired the\n\n**CrewAI** is the simplest shape: 1 call for approve, 2 for reject (the\n\nfeedback re-runs the task). One operational gotcha measured along the way:\n\nreturning the same rejection on every prompt spins an infinite loop - 131 LLM\n\ncalls with the prompt growing from 240 to 6,561 tokens. CrewAI re-runs and\n\nre-prompts on every non-empty feedback, so the repetition policy is the\n\ncaller's responsibility.\n\nThe regulated question is \"why did the agent decide this\". Because every run\n\ngoes through the same recorder proxy, the traces have one shape - so I scored\n\nwhether an auditor can recover the seven audit-relevant facts (decision\n\nrationale, tool call order, tool arguments, model identity, and more) from\n\neach framework's traces:\n\n| Framework | Rationale | Tool order | Args | Silent failures | \n|---|---|---|---|---|\n| Strands | 100% | 100% | 100% | 2 | \n| LangGraph | 100% | 0% | 0% | 0 | \n| CrewAI | 100% | 50% | 50% | 0 | \n\nStrands is model-driven, so everything the model saw and reasoned about stays\n\nin the trace - the strongest audit story of the three. The flip side is\n\nexactly those 2 silent failures.\n\nLangGraph's 0% is not a defect: its tool calls live in code, not on the wire.\n\nRead the code and you know the order; read only the trace and you don't. That\n\nis the real audit-design trade-off: **where the evidence lives changes with the framework's control-flow model.**\n\nOutput the digest as strict JSON with exactly 4 keys (`summary`,\n\n`word_count`, `topics`, `publish_ready`). All three frameworks hit 100%\n\ncompliance, and `word_count` matched the actual summary length in every run -\n\nputting the count inside the schema makes the model's self-verification\n\neffective. Strands ran a validate loop averaging 2 calls (4 revisions in one\n\nrun).\n\nAcross all 45 runs, only Strands finished with an **empty output** three\n\ntimes. The model built the complete result, handed it to the validation tool,\n\nand then emitted nothing as the final answer. The run exits 0 - it looks\n\nsuccessful. You only catch it by reading the trace.\n\nLangGraph and CrewAI: zero. In a pipeline design, the output node IS the\n\ndeliverable, so an empty answer is structurally hard to produce.\n\nFor enterprise use, this is the scariest class of failure: not an error that\n\nstops the run, but a success-shaped empty result that breaks everything\n\ndownstream. (The empty outputs were recoverable - the model passes its full\n\nresult to the tool as an argument, so the trace holds it.)\n\nOne model, 3 runs per cell - directional, not a definitive ranking. The human\n\nis scripted; no real UI or notification flow. The destructive action is\n\nsimulated - though whether the gate held is read directly from the recorded\n\ntraffic, which is the part that's solid.\n\nEverything is open. The repo README has the commands for all five experiments\n\n(72 recorded runs total, one proxy in front of every framework - that's the\n\nwhole foundation):\n\n*This is a personal OSS project - no warranty. Use at your own risk, and issues are welcome.*\n\nCover image: generated with a local flux-schnell pipeline.", "url": "https://wpnews.pro/news/what-happens-when-enterprise-requirements-hit-strands-langgraph-and-crewai-45", "canonical_source": "https://dev.to/sunnydachs/what-happens-when-enterprise-requirements-hit-strands-langgraph-and-crewai-45-runs-measured-ocg", "published_at": "2026-09-21 15:46:51+00:00", "updated_at": "2026-09-21 15:54:36.524287+00:00", "lang": "en", "topics": ["ai-agents", "ai-safety", "developer-tools", "ai-policy", "mlops"], "entities": ["Strands", "LangGraph", "CrewAI", "EU AI Act", "sunnydachs"], "alternates": {"html": "https://wpnews.pro/news/what-happens-when-enterprise-requirements-hit-strands-langgraph-and-crewai-45", "markdown": "https://wpnews.pro/news/what-happens-when-enterprise-requirements-hit-strands-langgraph-and-crewai-45.md", "text": "https://wpnews.pro/news/what-happens-when-enterprise-requirements-hit-strands-langgraph-and-crewai-45.txt", "jsonld": "https://wpnews.pro/news/what-happens-when-enterprise-requirements-hit-strands-langgraph-and-crewai-45.jsonld"}}