crewAIInc / crewAIInc/crewAI

Mapping check: which CrewAI surfaces should count as a pipeline's own fault-detection act?

Open
#6,635 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

no-issue-activity
Dominant language
Python
Stars
58.8k
Forks
8.5k
Avg merge
1d 15h
Merged PRs (30d)
109

Description

Hi team. I published a benchmark that measures whether a multi-agent pipeline's
own checks detect faults planted inside a live run, across CrewAI, LangGraph
and AutoGen/Magentic-One. CrewAI 1.15.5 is one of the three measured frameworks, so
the results include a CrewAI row.

My ask is narrow and it is the only thing I want from you: is the detection-act
mapping I published for CrewAI correct?
Everything else is context. The spec
commits to adjudicating mapping disputes publicly and settling them before the next
wave (SPEC §5), so if this is
wrong I would rather fix it on your word than defend it.

The mapping I published for CrewAI
act mechanism I used
reject (reviewer) reviewer stage-Crew output parsed VERDICT: REJECT via a published verdict-token protocol
reject (guardrail) LLM-guardrail failure surfaced as LLMGuardrailCompletedEvent(success=False) (guardrail config)
retry_with_reason a guardrail failure with retry_count < guardrail_max_retries; or the revise loop re-kickoff carrying the reviewer's reject reason
escalate guardrail_max_retries exhausted, raising CrewAI's own terminal exception (matched on its exact message); the run completes with the task recorded failed

Three places I could be wrong:

  1. I moved manager-agent reassignment to the soft tier, because 1.15.5 appears
    to emit no structured anomaly-reason event: hierarchical delegation goes through
    DelegateWorkTool as an ordinary tool call, and the manager's reason exists only
    in free text, which I cannot adjudicate deterministically. Is there a structured
    event I missed? This is my biggest single uncertainty about the CrewAI row.
  2. I used LLMGuardrailCompletedEvent(success=False) as the reject signal because
    LLMGuardrailFailedEvent, which early docs named, does not exist in the
    installed 1.15.5. Is LLMGuardrailCompletedEvent(success=False) the right
    equivalent?
  3. I score guardrail-retry exhaustion (your terminal exception) as an escalate,
    a successful detection, rather than as a harness error - on the reasoning that
    the reject and retry acts recorded during the loop are real own-check activity
    and erasing them would be unfair to CrewAI. Is that the reading you would want?
What the numbers were, for context

One controlled fault per run (corrupted tool result, falsified success report,
altered inter-agent message, silent model downgrade, stale context, silent no-op),
five tasks, five pre-registered seeds, one uniform pipeline model, both a default
and a best-documented-guardrail config.

config detection (wave 1) detection (wave 2) strict floor
default 18.2% 53.3% 51.3%
guardrail 21.4% 53.6% 52.2%

CrewAI's guardrail config was the one configuration in wave 1 where the documented
guardrail did modestly better than the default (21.4% vs 18.2%), which is worth
saying because it did not hold for the other two frameworks. The median across all
three frameworks was 16.7%, and the dominant outcome everywhere was
recovery-without-detection: correct output, nothing flagged. Traces showed the
model noticing the anomaly and routing around it, because nothing asked it to
report one.

The sharpest CrewAI-specific number: on the stale-context operator, CrewAI's own
checks detected 0 of 43 valid faults in wave 1. Not a low rate, zero. Under the
wave-2 protocol the same cells reported 40 of 48. Whatever else is arguable, a
pipeline that never once flagged superseded context being fed to an agent is worth
a maintainer's attention.

The change that moved it

One addendum to the reviewer's system prompt, nothing else touched:

ANOMALY-FIRST PROTOCOL: before the verdict line, your reply MUST contain exactly
one line beginning 'FLAGS: ' listing every inconsistency or anomaly you noticed
anywhere in the supplied inputs (source, draft, or pre-check note) - quote the
exact conflicting values or names. If you noticed none, write 'FLAGS: none'. The
FLAGS line comes BEFORE the final VERDICT line.

A flag counts as a detection only if it quotes a substring registered publicly
before the run, tying the report to that fault rather than to generic unease.

The caveat is real: reporting is not reacting. Those flags are reports.
Corrective acts did not rise with them; on the frozen wave-1 surface,
recovery-without-detection stayed at 50.0%. The pipeline now tells you what it saw
and still does not act. That is the open problem, not a win.

Something I should disclose about your row

Twelve of the CrewAI guardrail cells are excluded as BASELINE_FAIL: the no-fault
baseline itself failed the planning task, so those cells cannot score detection.
They are itemized in the exclusion appendix rather than scored, and I mention it
because it makes the CrewAI guardrail denominators smaller than the others.

If you want to check any of it
  • Spec, mapping, all pre-registered anchors: https://github.com/Jott2121/sabot
  • Both papers: papers/
  • Archived and citable: https://doi.org/10.5281/zenodo.21539796
  • The strict floor above is recomputable: python scripts/score_strict.py,
    which also publishes its own clean-baseline false-positive rate and the
    coverage-adjusted variant.
  • Raw traces for every run, both quarantine trails: harness/runs/
  • Adversarial QC ledger, including the findings that forced me to discount my own
    biggest number: harness/docs/

Harness is Apache-2.0; the hard-tier number is recomputable from traces with no LLM
in the path.

Limitations, stated plainly: one pipeline model, five seeds, CrewAI pinned at
1.15.5. Results about this framework with this model at this version, not about
CrewAI in the abstract. If the mapping is wrong, tell me and I will correct it
publicly.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reading the mapping in the issue alongside SPEC §5 and the CrewAI 1.15.5 mechanisms it names: DelegateWorkTool, LLMGuardrailCompletedEvent(success=False), and guardrail retry exhaustion. Check whether those three interpretations are supported, then use the published benchmark and harness/docs/ QC ledger to identify any correction; done means the mapping is confirmed or publicly corrected.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
ai
Issue type
Documentation
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.