Conversation
Ports OAI-010 to CrewAI. CrewAI makes it worse than a lost log line: a crew running with verbose=True is already writing its own narration to stdout, so a tool print is interleaved into run commentary from several agents at once with nothing marking which agent, task, or tool call emitted it. What looks like working diagnostics in a terminal is unattributable the moment the crew runs anywhere else.
|
Thanks @bradAGI, this is a clean port. I particularly like that the text is CrewAI's own rather than a copy of the OpenAI framing. The The engine half in trustabl/agent-reliability-analyzer#152 mirrors this file byte for byte and carries the fire and silent cases, so the pair lands together. One item is on us rather than on you: a shipped rule needs a rationale doc in |
Engine half of a coordinated pair with trustabl/agent-reliability-rules#73, on a branch of the same name so the rules-sync job resolves the matching pack rather than main. Neither half should merge alone — check-rules-sync.sh fails if they do. Mirrors crewai/observability.yaml into testdata/rules-fixture and adds cases to policyRuleCases, as TestPolicyRules_AllRulesCovered requires. Three cases: the print, the module-logger remediation the fix text prescribes, and a pprint call that must stay silent. The third pins has_print_call's bare-callee behavior, so the rule cannot regress into substring matching that sweeps in pprint and every other callee whose name contains "print".
Ports OAI-010 to CrewAI — the observability dimension isn't covered in any of the five newer packs.
CrewAI makes this worse than a lost log line, which is what the rule text leads with. A crew running with
verbose=Trueis already writing its own narration to stdout, so a toolprintgets interleaved into run commentary from several agents at once, with nothing marking which agent, task, or tool call emitted it. That's the trap: it looks like working diagnostics in a terminal and becomes unattributable the moment the crew runs anywhere else. The fix names what a module logger buys you here specifically — the record carries its own module and level and lands in the application's log sink rather than the crew's narration stream.Verification — engine built at
main:Fire (
print(f"looking up {order_id}")in the tool body):CREW-012, CREW-201Silent (
logger.info("looking up %s", order_id)):CREW-201has_print_callmatches a bareprintcallee, sopprintand other attribute calls don't false-positive.No new predicates, so no
schema_versionbump.