Skip to content

Weighted Decision Matrix (MCDA) discussion method (#25)#41

Merged
hherb merged 14 commits into
mainfrom
claude/handover-instructions-377332
Jul 14, 2026
Merged

Weighted Decision Matrix (MCDA) discussion method (#25)#41
hherb merged 14 commits into
mainfrom
claude/handover-instructions-377332

Conversation

@hherb

@hherb hherb commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Closes #25.

Summary

Adds the Weighted Decision Matrix (decision_matrix) — multi-criteria decision analysis with a structured, machine-readable final artifact. This fills the gap named in the issue: every existing method ends in one big prose synthesis; this one ends in method_state["decision_artifact"], consumable by the storyboard, the MCP server, or a follow-up discussion. It is also now the primary fit for the recommender's "Make a decision between options" answer type (previously served only by Voting).

Phases (five new PhaseHandlers over two shared helper modules, split to respect the ~500-line rule):

  1. Options (enumerate_options.py) — participants enumerate the alternatives (submit_options); zero options after MAX_OPTIONS_ROUNDS aborts the method (the generate_ideas pattern).
  2. Criteria & Weights (weight_criteria.py) — generalises adversarial-collab's define_criteria per the issue: criteria carry integer weights 1–5, merged across participants by name similarity; each participant's latest vote counts and the effective weight is the mean. Zero criteria after MAX_CRITERIA_ROUNDS aborts.
  3. Score (score_options.py) — generalises ACH's evaluate_matrix: every participant scores every option × criterion 1–5 via submit_scores (two-level additionalProperties schema, O/C labels); partial coverage defaults missing cells to the scale midpoint.
  4. Sensitivity (analyse_sensitivity.py) — moderator-only presentational phase. Weighted totals, per-participant divergence (spread of own-score totals), and one-at-a-time sensitivity (each criterion excluded and doubled; winner flips ⇒ pivotal; close-call margin flag) are all computed deterministically in _mcda_analysis.py — the moderator interprets numbers, never produces them.
  5. Decide (decide.py) — moderator records the decision via submit_decision; both the structured and free-text paths assemble the decision artifact (the fallback defaults the recommendation to the top-ranked option with an explanatory caveat), so the artifact always exists.

Four phases force structured output per the #23 pattern (validators with actionable errors, process_response kept as the human/fallback path, degenerate get_output_tool -> None guards), so the existing setup gate automatically requires tool-capable models.

Also: recommender _TAXONOMY line for MCDA, method registered, dev + user-manual docs, CLAUDE.md counts refreshed, HANDOVER updated.

Test plan

Plan: docs/superpowers/plans/2026-07-14-weighted-decision-matrix.md

🤖 Generated with Claude Code

hherb and others added 13 commits July 14, 2026 09:58
…#25)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e-size rule)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- record_scores drops unknown option/criterion labels: a mislabelled
  free-text matrix no longer counts its author as a scorer with every
  cell defaulted to the midpoint, which inflated divergence
- build_decision_artifact appends an explicit caveat when zero
  participants scored — the ranking is contentless and the artifact
  now says so on both the structured and free-text paths
- record_criteria no longer reports the same criterion twice when one
  submission merges two similar names into it
- format_score_table rounds float cells to the artifact's 2-dp
  precision instead of printing raw :g output

Order-dependent word-overlap merging (first-name-wins) is shared by
all merge-by-similarity phases, not MCDA-specific — lodged as #42.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@hherb hherb merged commit ea6d6be into main Jul 14, 2026
3 checks passed
@hherb hherb deleted the claude/handover-instructions-377332 branch July 14, 2026 01:58
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.

New method: Weighted decision matrix (MCDA) with structured final artifact

1 participant