Skip to content

Claude/sleepy brahmagupta vtvqva#23

Merged
billrichards merged 6 commits into
mainfrom
claude/sleepy-brahmagupta-vtvqva
Jun 17, 2026
Merged

Claude/sleepy brahmagupta vtvqva#23
billrichards merged 6 commits into
mainfrom
claude/sleepy-brahmagupta-vtvqva

Conversation

@billrichards

Copy link
Copy Markdown
Owner

No description provided.

claude and others added 6 commits June 16, 2026 19:01
After all testers complete, an optional LLM call (opt-in via --synthesize)
reads the full deduplicated findings list and produces a SynthesisResult:
executive summary, prioritised recommendations, root-cause clusters, and
false-positive candidates.  The synthesis is appended to Markdown and JSON
reports and stored on TestSession.synthesis for downstream consumers.

- qa_agent/synthesizer.py: new module; serialize session → LLM → parse JSON
- qa_agent/models.py: RootCauseCluster + SynthesisResult dataclasses;
  TestSession.synthesis field; to_dict() includes synthesis
- qa_agent/config.py: TestConfig.synthesize_results flag (default False)
- qa_agent/agent.py: _synthesize_results() called post-run when flag set
- qa_agent/reporters/markdown.py: ## AI Analysis section when synthesis present
- qa_agent/reporters/json_reporter.py: synthesis key in JSON output
- qa_agent/cli.py: --synthesize flag
- tests/test_synthesizer.py: 35 unit tests covering serialization, parsing,
  LLM error handling, and reporter integration

https://claude.ai/code/session_019zZ6wHiVa4mYMLi6e8KJcE
Option A implementation: Complete terminology change for clarity.

Breaking changes:
- CLI: --synthesize → --summarize
- Config: synthesize_results → generate_summary
- Models: SynthesisResult → SummaryResult
- Session field: synthesis → summary
- JSON output: 'synthesis' → 'ai_summary'

Files renamed:
- qa_agent/synthesizer.py → qa_agent/summarizer.py
- tests/test_synthesizer.py → tests/test_summarizer.py

All 35 tests passing.

Co-authored-by: openhands <openhands@all-hands.dev>
- Add type: ignore[arg-type] for _make_summary helper to handle **kwargs unpacking
- Change _report_data return type from dict to dict[str, Any]
- Add cast() for json.loads() return value to satisfy mypy type checking
- Import typing.Any and typing.cast for proper type annotations

All 4 mypy errors resolved. Tests still pass (35/35).

Co-authored-by: openhands <openhands@all-hands.dev>
Adds Optional/dict type annotations where mypy's stricter
untyped-def checking surfaced real gaps, plus assert guards in
agent.py matching its existing Optional-narrowing pattern.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
open() without encoding= falls back to the platform default
(cp1252 on Windows), which chokes on the UTF-8 em-dashes in
generated markdown/JSON reports. Pass encoding="utf-8" explicitly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
open()/read_text() without encoding= falls back to the platform
default (cp1252 on Windows), which breaks on non-ASCII bytes.
Fixes the auth-file and cookies-file readers in cli.py (real-world
JSON configs may contain non-ASCII), and the server.py source read
in test_packaging.py (the file contains em dashes/bullets).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@billrichards billrichards merged commit 673f336 into main Jun 17, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants