feat: add council dissent analyzer with auto-deepening research#4
Merged
dobosmarton merged 2 commits intomainfrom Feb 23, 2026
Merged
feat: add council dissent analyzer with auto-deepening research#4dobosmarton merged 2 commits intomainfrom
dobosmarton merged 2 commits intomainfrom
Conversation
When council members disagree on scoring dimensions (spread > threshold) or on the GO/NO_GO decision, the analyzer detects these splits, generates targeted follow-up research queries, collects additional evidence, and triggers a re-scoring round — turning council disagreement into a research signal for more informed decisions.
Replace broad pytest.raises(Exception) with specific pydantic.ValidationError and consolidate threshold/rounds boundary tests into a single parametrized test case.
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.
Summary
When the Agent Council (multi-model scoring panel) votes on an idea, council members sometimes disagree sharply — one model says GO while another says NO_GO, or they diverge on individual scoring dimensions (e.g., Anthropic rates
willingness_to_payat 90 while OpenAI rates it at 50). Previously these splits were silently aggregated via median and majority vote, losing valuable signal.The Council Dissent Analyzer detects these disagreements, triggers targeted follow-up research on the contested dimensions, then re-scores with augmented evidence — turning council splits from noise into a research signal for more informed decisions.
How it works
Changes
verdandi/models/scoring.py):DimensionDissent,DissentResolutionRound,DissentAnalysis— all frozen Pydantic models. Added optionaldissent_analysisfield toPreBuildScore.verdandi/config.py):dissent_enabled,dissent_max_rounds,dissent_dimension_threshold,dissent_decision_split_requiredverdandi/agents/dissent.py): Core class withdetect_dissent(),build_followup_queries(),run_followup_research(),resolve(), and_rescore_with_context(). Maps scoring dimension names to research dimension names for targeted queries.verdandi/agents/scoring.py): Aftercouncil.evaluate(), runs dissent resolution whendissent_enabled=True. Also adds mock dissent data to dry-run output.verdandi reportand in the TUI experiment detail screen, showing contested dimensions, per-provider scores, resolution rounds, and whether the decision flipped.tests/test_dissent.py): Detection, dimension mapping, model validation, resolution flow, and settings integration.Verification
ruff check: 0 errorsruff format: cleanmypy --strict: 0 errors (94 files)pytest: 460 passed (19 new + 441 existing)