fix(detection): support list-format JSON output from Claude Code CLI … - #134
Merged
barisozbas merged 1 commit intoSep 22, 2026
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What type of PR is this? (check all applicable)
Related issue:
N/A
What changed?
Updated
_invoke_claude_reasoningand_extract_mcp_tool_usageinDetection/guardrail/adr_agent/adr_baseline.pyto handle list/array formatted JSON outputs from Claude Code CLI. When--output-format jsonyields an event array, the parser extracts the entry withtype: result(falling back to the last element if absent).Why?
Modern Claude Code CLI versions (2.1+, e.g. v2.1.274) output a stream of JSON events formatted as an array
[{"type": "system", ...}, ..., {"type": "result", ...}]rather than a single top-level dictionary. Previously,json.loads(stdout)produced alist, triggering an unhandled'list' object has no attribute 'get'exception.How did you test it?
_invoke_claude_reasoningand_extract_mcp_tool_usagesuccessfully parse the event list to extract reasoning verdicts and session IDs.uv run pytest tests/inDetection/— all 165 tests passed (including all 63 intest_adr_baseline.py).uv run pytest tests/inSensor/— all 287 tests passed.Potential risks
None. Single-dict responses bypass the list handler and execute existing behavior unchanged.