<!-- CrewAI, LangGraph and Google ADK enforced live on one workload — Attenu. Source: https://github.com/attenu-io/attenu-derive/blob/main/docs/A3-FRAMEWORKS.md · Rendered: https://attenu.io/docs/frameworks-live/ · Updated 2026-08-19 -->

# A3 — framework breadth: CrewAI + LangGraph on a customer-domain workload

*Closes the register/pack bound "every customer-domain app measured is Google ADK." Live enforce on the two
non-ADK frameworks whose adapters were built but only exercised on code-analysis, now on a customer domain
(travel booking) with real delegation and a held payment. Haiku. Raw runs reproducible via
`attenu_derive.sample.a3_crewai_enforce` / `a3_langgraph_enforce`.*

## Setup (identical across frameworks)

A `travel_planner` delegates to a `booking_agent` coworker/sub-agent with three tools: `search_flights`,
`get_weather` (both `data.read`, granted) and `book_flight` (`payments.transfer`, **held** `requires_grant`).
Enforce mode: the framework's own adapter (CrewAIGuardBridge / GuardedDelegation middleware) with the
derived authority; the shim's `meet` + ledger.

## Results

| framework | delegation | booker's granted calls | `book_flight` (payments held) | offline bundle verify |
|---|---|---|---|---|
| **CrewAI** (1.15) | planner → booking_agent (Delegate-to-coworker fired) | `search_flights`, `get_weather` ran (0 benign blocks) | **DENIED live** (`payments.transfer` scope_not_granted) | integrity / monotonicity / containment ✓ |
| **LangGraph** (deepagents) | planner → booking_agent (`task` sub-agent) | `search_flights`, `get_weather` ran (0 benign blocks) | **DENIED live** (`payments.transfer` scope_not_granted) | integrity / monotonicity / containment ✓ |

**No divergence** across ADK (earlier), CrewAI and LangGraph: the granted reads pass, the held payment is
denied at the tool call, and the exported bundle verifies offline. Enforcement is adapter mechanics over the
shim's `meet`/ledger — it does not depend on the framework, as it does not depend on the model (Haiku ≡
Sonnet). T16/T17 on the new travel-booking domain: over-reach (payments/mail/write) blocked; 24×3 poisoned
variants of the travel task produce 0 widening (`tests/test_a3_frameworks.py`).

## Honest bound

These are **configured** crews/graphs in the travel domain, not scraped third-party apps: the open-source
crewAI-examples target an old crewai/crewai_tools API (heavy RAG deps) and do not load on crewai 1.15, and
real LangGraph apps are heterogeneous custom graphs. So what A3 proves is the **enforcement adapters work on
a non-ADK framework in a customer domain with real delegation and a held tier-2 tool** — the framework
mechanics, not a blind third-party app test. Onboarding a scraped third-party customer-domain app on either
framework is a design-partner activity (a naive-operator onboarding number, per the G4 bound, is the same).
