Return typed insufficient-data outcomes when projected participants cannot form
the requested k-means groups. Candidate batches reuse PCA and preserve feasible
group counts; automatic group search is capped by projected diversity.
run_kmeans_on_pca_projection() now returns AnalysisSuccess or
AnalysisInsufficientData, matching run_pipeline(). On success, access the
clustering payload through .result.
Re-add Agora implementation with statistical improvements over Polis.
Benjamini-Hochberg FDR control for statement selection (replaces heuristic pick_max).
Simes' p-value combination for repness (valid under positive dependence between probability and representativeness tests).
Effective agreement GAC: prod(pa*(1-pd))^(1/n) penalizes divided groups (replaces raw prod(pa)^(1/n)).
Zero-vote filter: excludes statements with no votes from BH hypothesis count.
Shared apply_bh_with_vote_filter() helper for modular BH computation.
Add agora-demo.ipynb notebook as recommended quickstart.
Document Agora implementation in API reference.
Position Agora as the recommended default pipeline in README.
Add select_consensus_statements() function, and wire into Polis implementation.
Allow calculate_comment_statistics() to work without groups/labels.
Generalize format_comment_stats() to work for group and consensus statements.
Add select_representative_statements() to PolisClusteringResult as repness key.
Rename arg pick_n to pick_max in select_consensus_statements(), for clarity and consistency.
Slight change to PolisRepness type, so group IDs now returned as ints.
Add print_selected_statements() presenter for inspecting PolisClusteringResult.
Add print_consensus_statements() presenter for inspecting PolisClusteringResult.
Allow pick_max and confidence interval args to be set in polis.run_clustering().
Allow get_corrected_centroid_guesses() to unflip each axis if correction not needed.
Abstracted reducer and clusterer algorithm support.
Added support for pacmap/localmap beyond PCA.
Added support for HDBSCAN clustering beyond KMeans.
Allow passing of arbitary params into reducer/clusterer.
Remove support for polis_legacy implementation (PolisClient).
Added disagree variant of group-informed-consensus. (group-informed-consensus-disagree)
Brought group-informed-consensus metrics to top-level result object.
Renamed run_clustering function to run_pipeline and created base pipeline implementation.
Add option to generate_figure_polis to configure showing pid labels (show_pids).
Remove deprecated methods from doc website.
Remove deprecated modules from prior import paths.
Avoid using dataframes in a few low level util function, in favour of numpy arrays.
Rename projected_{participants,statements} to {participant,statement}_projections in run_pipeline results. Also coords keyed to ID, instead of dataframes.